SBML_ODESOLVER_API void IntegratorInstance_setVariableValue(integratorInstance_t *engine, variableIndex_t *vi, double value) { int i, j; ASTNode_t *tmp; odeModel_t *om; cvodeData_t *data; cvodeSettings_t *opt; cvodeSolver_t *solver; om = engine->om; opt = engine->opt; data = engine->data; solver = engine->solver; data->value[vi->index] = value; if ( vi->index < om->neq ) { /* if (om->algebraic) ?? */ IntegratorInstance_freeCVODESolverStructures(engine); solver->t0 = solver->t; IntegratorInstance_createCVODESolverStructures(engine); } else if ( vi->index >= om->neq+om->nass ) { /* optimize ODEs for evaluation */ /*!!! will need adaptation to selected sens.analysis !!!*/ for ( i=0; i<om->neq; i++ ) { if ( !opt->Sensitivity || om->sensitivity ) { /* optimize each ODE: replace nconst and simplifyAST */ tmp = copyAST(om->ode[i]); for ( j=0; j<om->nconst; j++ ) { AST_replaceNameByValue(tmp, om->names[om->neq+om->nass+j], data->value[om->neq+om->nass+j]); } if ( data->ode[i] != NULL ) ASTNode_free(data->ode[i]); data->ode[i] = simplifyAST(tmp); ASTNode_free(tmp); } else { if ( data->ode[i] != NULL ) ASTNode_free(data->ode[i]); data->ode[i] = copyAST(om->ode[i]); } } } }
SBML_ODESOLVER_API void IntegratorInstance_free(integratorInstance_t *engine) { /* solver specific switches */ if (engine->om->neq) { /* the same for CVODES and CVODE */ IntegratorInstance_freeCVODESolverStructures(engine); } /* if (om->algebraic) ?? */ /* if (opt->Sensitivity) ?? */ CvodeData_free(engine->data); free(engine->solver); free(engine); }
/* frees N_V vector structures, and the cvode_mem solver */ void IntegratorInstance_freeIDASolverStructures(integratorInstance_t *engine) { /* Free CVODE structures: the same for both */ IntegratorInstance_freeCVODESolverStructures(engine); }