int doIt(void) { int i ; cvodeSettings_t *settings, *set2; variableIndex_t *s1, *s2; integratorInstance_t *integratorInstance; odeModel_t *model = ODEModel_createFromFile("basic-model1-forward-l2.xml"); RETURN_ON_ERRORS_WITH(1) s1 = ODEModel_getVariableIndex(model, "S1"); s2 = ODEModel_getVariableIndex(model, "S2"); /* Creating settings with default values */ settings = CvodeSettings_create(); /* Setting end time to .1, number of time steps to 1 and NULL instead of an optional predefined time series (double *); due to Indefinitely == 1, Printstep 5 will be ignored and Time = 0.1 will be used as timestep for infinite integration */ CvodeSettings_setTime(settings, .1, 5); /* Setting Cvode Parameters: absolute tolerance, relative tolerance and maximal internal step, respectively */ CvodeSettings_setErrors(settings, 1e-20, 1e-14, 500); /* Setting Integration Switches */ CvodeSettings_setMethod(settings, 1, 12); CvodeSettings_setJacobian(settings, 1); CvodeSettings_setIndefinitely(settings, 1); CvodeSettings_setHaltOnEvent(settings, 0); CvodeSettings_setSteadyState(settings, 0); CvodeSettings_setStoreResults(settings, 0); CvodeSettings_setSensitivity(settings, 0); /* first integration run */ printf("\nFIRST INTEGRATION RUN WITH:\n"); CvodeSettings_dump(settings); integratorInstance = IntegratorInstance_create(model, settings); RETURN_ON_ERRORS_WITH(1); /* print variable (ODE, assignments) and constant names */ printf("#time "); IntegratorInstance_dumpNames(integratorInstance); /* print initial conditions and parameters */ IntegratorInstance_dumpData(integratorInstance); for (i=0; i != 12; i++) { /* setting the next time step, uncomment the following function call to see its effect */ /* IntegratorInstance_setNextTimeStep(integratorInstance, 0.2*(i+1)); */ IntegratorInstance_integrateOneStep(integratorInstance); RETURN_ON_ERRORS_WITH(1); /* print current data */ IntegratorInstance_dumpData(integratorInstance); } /* now, let's try again, with different settings */ set2 = CvodeSettings_create(); /* as Indefinitely will be set to 0, a finite integration to time 0.24 in 6 steps will be run */ CvodeSettings_setTime(set2, 1.2, 6); CvodeSettings_setErrors(set2, 1e-16, 1e-14, 500); /* switches can be set all together, same order as above */ CvodeSettings_setSwitches(set2, 1, 0, 0, 0, 0, 0, 0); printf("\nNOW, LET'S TRY AGAIN WITH DIFFERENT SETTINGS:\n"); CvodeSettings_dump(set2); IntegratorInstance_set(integratorInstance, set2); IntegratorInstance_dumpData(integratorInstance); while( !IntegratorInstance_timeCourseCompleted(integratorInstance) ) { IntegratorInstance_integrateOneStep(integratorInstance); RETURN_ON_ERRORS_WITH(1); IntegratorInstance_dumpData(integratorInstance); } printf("\n\nFINISHED SUCCESSFULLY!\n"); printf("Please, note the different values e.g. at time 1.2.\n"); printf("The values for the first run a more exact, due to the much\n"); printf("lower error tolerances. The error tolerances have to be\n"); printf("adapted to the ranges of each model!!\n\n"); IntegratorInstance_free(integratorInstance); ODEModel_free(model); VariableIndex_free(s1); VariableIndex_free(s2); CvodeSettings_free(settings); CvodeSettings_free(set2); return 0; }
int main (int argc, char *argv[]) { int neq, nass, nconst; char *x[3]; double x0[3]; char *ode[2]; ASTNode_t *ast[2]; double time, rtol, atol; double printstep; /* SBML model containing events */ Model_t *events; /* SOSlib types */ odeModel_t *om; cvodeSettings_t *set; integratorInstance_t *ii; variableIndex_t *vi; /* parsing input ODEs and settings */ /* time and error settings */ time = 0.5; rtol = atol = 1.0E-9; printstep = 10; /* variables */ neq = 2; x[0] = "C_cy"; x0[0] = 0.0; ode[0] = "((150.0 * (3.8 - (p * D_cy) - (p * C_cy)) * (1.0 - (p * C_cy))) - (9.0 * C_cy))"; x[1] = "D_cy"; x0[1] = 9.0; ode[1] = "(3.8 - (3.0 * D_cy) - (p * D_cy) - (p * C_cy))"; /* parameters */ nconst = 1; x[2] = "p"; x0[2] = 0.2; /* assignments */ nass = 0; /* SBML model containing events */ events = NULL; /* creating ODE ASTs from strings */ ast[0] = SBML_parseFormula(ode[0]); ast[1] = SBML_parseFormula(ode[1]); /* end of input parsing */ /* Setting SBML ODE Solver integration parameters */ set = CvodeSettings_createWithTime(time, printstep); CvodeSettings_setErrors(set, atol, rtol, 1e4); CvodeSettings_setStoreResults(set, 0); /* activating default sensitivity */ CvodeSettings_setSensitivity(set, 1); /* creating odeModel */ /* `events' could be an SBML model containing events */ om = ODEModel_createFromODEs(ast, neq, nass, nconst, x, x0, events); /* creating integrator */ ii = IntegratorInstance_create(om,set); /* integrate */ printf("integrating:\n"); while( !IntegratorInstance_timeCourseCompleted(ii) ) { if ( !IntegratorInstance_integrateOneStep(ii) ) { SolverError_dump(); break; } else IntegratorInstance_dumpData(ii); } /* Specific data interfaces: */ /* names are stored in the odeModel and values are independently stored in the integrator: you can get different values from different integrator instances built from the same model */ vi = ODEModel_getVariableIndex(om, "C_cy"); printf("\nVariable %s has final value of %g at time %g\n\n", ODEModel_getVariableName(om, vi), IntegratorInstance_getVariableValue(ii, vi), IntegratorInstance_getTime(ii)); VariableIndex_free(vi); vi = ODEModel_getVariableIndex(om, "p"); printf("Sensitivies to %s:\n", ODEModel_getVariableName(om, vi)); IntegratorInstance_dumpPSensitivities(ii, vi); printf("\n\n"); VariableIndex_free(vi); /* finished, free stuff */ /* free ASTs */ ASTNode_free(ast[0]); ASTNode_free(ast[1]); /* free solver structures */ IntegratorInstance_free(ii); ODEModel_free(om); CvodeSettings_free(set); return (EXIT_SUCCESS); }