コード例 #1
0
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]);
      }
    }
  }
}	
コード例 #2
0
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);

}
コード例 #3
0
ファイル: daeSolver.c プロジェクト: raim/SBML_odeSolver
/* 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);
}