////////////////////////////////////////////////////////////////////////////
// Model MICEK2.CPP               SIMLIB/C++
//
// Skákající míček (kombinovaný model, varianta 2)
//

#include "simlib.h"

const unsigned MaxBang = 10;    // maximální počet odrazů

// popis modelu:
//Problem!!! Constant g = 9.81;              // gravitační zrychlení
Constant g(9.81);               // gravitační zrychlení

struct Ball {                   // popis modelu míčku
  unsigned count;               // počet odrazů
  // detektor stavových událostí:
  class LimitY : ConditionDown {
    Ball *b;
    void Action() { b->Bang(); }  // stavová událost: poslání zprávy
   public:
    LimitY(Ball *ball) :
      ConditionDown(ball->y),     // podmínka: (y>=0)  TRUE --> FALSE
      b(ball) {}
  } ylim;
  Integrator v,y;               // stav míčku

  Ball(double initialposition) :
    count(0),
    ylim(this),                 // podmínka dopadu
    v(-g - v*0.1),              // popis volného pádu:
    y(v, initialposition)  {}

  void Bang()  {                // stavová událost - odraz míčku
    Out();                      // tisk stavu při dopadu
    Print("\n# Odraz %u\n", ++count);
    v = -0.9 * v.Value();       // ztráta energie
    y = 0;                      // toto je nutné z hlediska přesnosti!
    if(count>=MaxBang)          // maximální počet odrazů
      Stop();                   //   konec simulace
    Out();                      // tisk nového stavu
  }
  void Out() {
    Print("%g  %g  %g\n", T.Value(), y.Value(), v.Value());
  }
};

Ball b1(10);                    // vytvoření modelu míčku

void Sample() { b1.Out(); }     // vzorkování stavu míčku
Sampler S(Sample, 0.05);

int main() {                    // experiment
  // DebugON();
  SetOutput("micek2.dat");
  _Print("# MICEK2 - model skákajícího míčku\n");
  Print("# Time y v \n");
  Init(0);                      // od času 0
  SetStep(1e-10, 0.5);
  SetAccuracy(1e-5, 0.001);
  Run();                        // simulace
  return 0;
}

// konec


syntax highlighted by Code2HTML, v. 0.9.1