/** * This function is called periodically (as specified by the control frequency). * The useful functions that you can call used in doloop() are listed below. * * frequency() returns frequency of simulation. * period() returns period of simulation. * duration() returns duration of simulation. * simTicks() returns elapsed simulation ticks. * simTimeInNano() returns elapsed simulation time in nano seconds. * simTimeInMiliSec() returns elapsed simulation time in miliseconds. * simTimeInSec() returns elapsed simulation time in seconds. * overruns() returns the count of overruns. * * @return If you return 0, the control will continue to execute. If you return * nonzero, the control will abort and stop() function will be called. */ int ZenomMatlab::doloop() { tnext = rt_SimGetNextSampleHit(); rtsiSetSolverStopTime(rtmGetRTWSolverInfo(rtM),tnext); OUTPUTS(rtM, 0); //rtExtModeSingleTaskUpload(rtM); UPDATED(rtM, 0); rt_SimUpdateDiscreteTaskSampleHits(rtmGetNumSampleTimes(rtM), rtmGetTimingData(rtM), rtmGetSampleHitPtr(rtM), rtmGetTPtr(rtM)); if (rtmGetSampleTime(rtM, 0) == CONTINUOUS_SAMPLE_TIME) { rt_UpdateContinuousStates(rtM); } mmi = &(rtmGetDataMapInfo(rtM).mmi); Xrt_SetParameterInfo(mmi); return 0; }
int main (int argc, char **argv) { FILE *f = fopen("/tmp/testfile.out","w"); OUTPUT(f); OUTPUTS(f); fclose(f); }
void rt_ODEUpdateContinuousStates(RTWSolverInfo *si) { time_T t = rtsiGetT(si); time_T tnew = rtsiGetSolverStopTime(si); time_T h = rtsiGetStepSize(si); real_T *x = rtsiGetContStates(si); IntgData *id = rtsiGetSolverData(si); real_T *y = id->y; real_T *f0 = id->f[0]; real_T *f1 = id->f[1]; real_T *f2 = id->f[2]; real_T hB[3]; int_T i; #ifdef NCSTATES int_T nXc = NCSTATES; #else int_T nXc = rtsiGetNumContStates(si); #endif rtsiSetSimTimeStep(si,MINOR_TIME_STEP); /* Save the state values at time t in y, we'll use x as ynew. */ (void)memcpy(y, x, nXc*sizeof(real_T)); /* Assumes that rtsiSetT and ModelOutputs are up-to-date */ /* f0 = f(t,y) */ rtsiSetdX(si, f0); DERIVATIVES(si); /* f(:,2) = feval(odefile, t + hA(1), y + f*hB(:,1), args(:)(*)); */ hB[0] = h * rt_ODE3_B[0][0]; for (i = 0; i < nXc; i++) { x[i] = y[i] + (f0[i]*hB[0]); } rtsiSetT(si, t + h*rt_ODE3_A[0]); rtsiSetdX(si, f1); OUTPUTS(si,0); DERIVATIVES(si); /* f(:,3) = feval(odefile, t + hA(2), y + f*hB(:,2), args(:)(*)); */ for (i = 0; i <= 1; i++) hB[i] = h * rt_ODE3_B[1][i]; for (i = 0; i < nXc; i++) { x[i] = y[i] + (f0[i]*hB[0] + f1[i]*hB[1]); } rtsiSetT(si, t + h*rt_ODE3_A[1]); rtsiSetdX(si, f2); OUTPUTS(si,0); DERIVATIVES(si); /* tnew = t + hA(3); ynew = y + f*hB(:,3); */ for (i = 0; i <= 2; i++) hB[i] = h * rt_ODE3_B[2][i]; for (i = 0; i < nXc; i++) { x[i] = y[i] + (f0[i]*hB[0] + f1[i]*hB[1] + f2[i]*hB[2]); } rtsiSetT(si, tnew); PROJECTION(si); rtsiSetSimTimeStep(si,MAJOR_TIME_STEP); }