void Simulation::initialize(SP::Model m, bool withOSI) { // === Connection with the model === assert(m && "Simulation::initialize(model) - model = NULL."); _T = m->finalT(); _nsds = m->nonSmoothDynamicalSystem(); // === Events manager initialization === _eventsManager->initialize(_T); _tinit = _eventsManager->startingTime(); //=== if (withOSI) { if (numberOfOSI() == 0) RuntimeException::selfThrow("Simulation::initialize No OSI !"); DynamicalSystemsGraph::VIterator dsi, dsend; SP::DynamicalSystemsGraph DSG = _nsds->topology()->dSG(0); for (std11::tie(dsi, dsend) = DSG->vertices(); dsi != dsend; ++dsi) { SP::OneStepIntegrator osi = DSG->properties(*dsi).osi; SP::DynamicalSystem ds = DSG->bundle(*dsi); if (!osi) { // By default, if the user has not set the OSI, we assign the first OSI to all DS _nsds->topology()->setOSI(ds,*_allOSI->begin()); //std::cout << "By default, if the user has not set the OSI, we assign the first OSI to all DS"<<std::endl; } osi = DSG->properties(*dsi).osi; ds->initialize(m->t0(), osi->getSizeMem()); } // === OneStepIntegrators initialization === for (OSIIterator itosi = _allOSI->begin(); itosi != _allOSI->end(); ++itosi) { // for (DSIterator itds = (*itosi)->dynamicalSystems()->begin(); // itds != (*itosi)->dynamicalSystems()->end(); // ++itds) // { // (*itds)->initialize(startingTime(), // (*itosi)->getSizeMem()); // addInOSIMap(*itds, *itosi); // } (*itosi)->setSimulationPtr(shared_from_this()); (*itosi)->initialize(*m); } } // This is the default _levelMinForInput = LEVELMAX; _levelMaxForInput = 0; _levelMinForOutput = LEVELMAX; _levelMaxForOutput = 0; computeLevelsForInputAndOutput(); // Loop over all DS in the graph, to reset NS part of each DS. // Note FP : this was formerly done in inter->initialize call with local levels values // but I think it's ok (better?) to do it with the simulation levels values. DynamicalSystemsGraph::VIterator dsi, dsend; SP::DynamicalSystemsGraph DSG = _nsds->topology()->dSG(0); for (std11::tie(dsi, dsend) = DSG->vertices(); dsi != dsend; ++dsi) { //assert(_levelMinForInput <= _levelMaxForInput); for (unsigned int k = _levelMinForInput ; k < _levelMaxForInput + 1; k++) { DSG->bundle(*dsi)->initializeNonSmoothInput(k); } } InteractionsGraph::VIterator ui, uiend; SP::InteractionsGraph indexSet0 = _nsds->topology()->indexSet0(); for (std11::tie(ui, uiend) = indexSet0->vertices(); ui != uiend; ++ui) { Interaction& inter = *indexSet0->bundle(*ui); inter.initialize(_tinit, indexSet0->properties(*ui)); } // Initialize OneStepNSProblem(s). Depends on the type of simulation. // Warning FP : must be done in any case, even if the interactions set // is empty. initOSNS(); // Process events at time _tinit. Useful to save values in memories // for example. Warning: can not be called during // eventsManager->initialize, because it needs the initialization of // OSI, OSNS ... _eventsManager->preUpdate(*this); _tend = _eventsManager->nextTime(); // End of initialize: // - all OSI and OSNS (ie DS and Interactions) states are computed // - for time _tinit and saved into memories. // - Sensors or related objects are updated for t=_tinit. // - current time of the model is equal to t1, time of the first // - event after _tinit. // - currentEvent of the simu. corresponds to _tinit and nextEvent // - to _tend. // If _printStat is true, open output file. if (_printStat) { statOut.open("simulationStat.dat", std::ios::out | std::ios::trunc); if (!statOut.is_open()) SiconosVectorException::selfThrow("writing error : Fail to open file simulationStat.dat "); statOut << "============================================" <<std::endl; statOut << " Siconos Simulation of type " << Type::name(*this) << "." <<std::endl; statOut <<std::endl; statOut << "The tolerance parameter is equal to: " << _tolerance <<std::endl; statOut <<std::endl <<std::endl; } }