CTrajectoryMethod::Status CStochDirectMethod::step(const double & deltaT) { C_FLOAT64 EndTime = *mpContainerStateTime + deltaT; if (mTargetTime != EndTime) { // We have a new end time and reset the root counter. mTargetTime = EndTime; mSteps = 0; } while (*mpContainerStateTime < EndTime) { // The Container State Time is updated during the reaction firing or root interpolation doSingleStep(*mpContainerStateTime, EndTime); if (mStatus == ROOT || (mNumRoot > 0 && checkRoots())) { return ROOT; } if (mpProblem->getAutomaticStepSize()) { break; } if (++mSteps > mMaxSteps) { CCopasiMessage(CCopasiMessage::EXCEPTION, MCTrajectoryMethod + 12); } } return NORMAL; }
// virtual CTrajectoryMethod::Status CTrajectoryMethodDsaLsodar::step(const double & deltaT, const bool & /* final */) { // do several steps: C_FLOAT64 Time = *mpContainerStateTime; C_FLOAT64 EndTime = Time + deltaT; C_FLOAT64 Tolerance = 100.0 * (fabs(EndTime) * std::numeric_limits< C_FLOAT64 >::epsilon() + std::numeric_limits< C_FLOAT64 >::min()); size_t Steps = 0; while (fabs(Time - EndTime) > Tolerance) { Time += doSingleStep(Time, EndTime); *mpContainerStateTime = Time; if (mStatus != CTrajectoryMethod::NORMAL) { break; } if (++Steps > *mpMaxSteps) { CCopasiMessage(CCopasiMessage::EXCEPTION, MCTrajectoryMethod + 12); } } return mStatus; }
CTrajectoryMethod::Status CHybridMethod::step(const double & deltaT) { // write the current state to the model // mpProblem->getModel()->setState(mpCurrentState); // is that correct? // check for possible overflows size_t i; // do several steps C_FLOAT64 time = *mpContainerStateTime; C_FLOAT64 endTime = time + deltaT; for (i = 0; ((i < mMaxSteps) && (time < endTime)); i++) { time = doSingleStep(time, endTime); } *mpContainerStateTime = time; mpContainer->updateSimulatedValues(false); if ((i >= mMaxSteps) && (!mMaxStepsReached)) { mMaxStepsReached = true; //only report this message once CCopasiMessage(CCopasiMessage::WARNING, "maximum number of reaction events was reached in at least one simulation step.\nThat means time intervals in the output may not be what you requested."); } return NORMAL; }
CTrajectoryMethod::Status CTauLeapMethod::step(const double & deltaT) { // do several steps C_FLOAT64 Time = *mpContainerStateTime; C_FLOAT64 EndTime = Time + deltaT; size_t Steps = 0; while (Time < EndTime) { // We do not need to update the the method state since the only independent state // values are species of type reaction which are all controlled by the method. Time += doSingleStep(EndTime - Time); *mpContainerStateTime = Time; mpContainer->updateSimulatedValues(false); if (++Steps > mMaxSteps) { CCopasiMessage(CCopasiMessage::EXCEPTION, MCTrajectoryMethod + 12); } if (mpProblem->getAutomaticStepSize()) break; } return NORMAL; }
CTrajectoryMethod::Status CTauLeapMethod::step(const double & deltaT) { // do several steps C_FLOAT64 Time = mpCurrentState->getTime(); C_FLOAT64 EndTime = Time + deltaT; size_t Steps = 0; while (Time < EndTime) { mMethodState.setTime(Time); mpModel->setState(mMethodState); mpModel->updateSimulatedValues(false); // We do not need to update the the method state since the only independent state // values are species of type reaction which are all controlled by the method. Time += doSingleStep(EndTime - Time); if (++Steps > mMaxSteps) { CCopasiMessage(CCopasiMessage::EXCEPTION, MCTrajectoryMethod + 12); } } *mpCurrentState = mpProblem->getModel()->getState(); mpCurrentState->setTime(Time); return NORMAL; }
CTrajectoryMethod::Status CStochDirectMethod::step(const double & deltaT) { // do several steps C_FLOAT64 Time = mpCurrentState->getTime(); C_FLOAT64 EndTime = Time + deltaT; size_t Steps = 0; while (Time < EndTime) { mMethodState.setTime(Time); Time += doSingleStep(Time, EndTime); if (++Steps > mMaxSteps) { CCopasiMessage(CCopasiMessage::EXCEPTION, MCTrajectoryMethod + 12); } } *mpCurrentState = mpProblem->getModel()->getState(); mpCurrentState->setTime(Time); return NORMAL; }