Esempio n. 1
0
/* initialize sensitivity initial values at time 0 */
int CvodeData_initializeSensitivities(cvodeData_t *data,
				      cvodeSettings_t *opt,
				      odeModel_t *om, odeSense_t *os)
{
  int i, j, nsens;

  /* 0. catch default case, no parameters/variables selected */
  if ( opt->sensIDs == NULL ) nsens = om->nconst;
  else nsens = opt->nsens;
  
  /* 1: free former sens. results, if different number is requested */
  if ( data->nsens != nsens &&  data->sensitivity != NULL ) 
    CvodeData_freeSensitivities(data);
  
  /* 2: create cvodeData and odeModel structures */
  if ( data->sensitivity == NULL )
  {
    CvodeData_allocateSens(data, om->neq, nsens); /* why not data->neq ? */
    if ( data->sensitivity == NULL ) return 0;
  }

  /* do FIM stuff */
  if ( opt->doFIM )
  {
    if ( data->FIM == NULL )
    {
      ASSIGN_NEW_MEMORY_BLOCK(data->FIM, nsens, double *, 0);
      for ( i=0; i<nsens; i++ )
	ASSIGN_NEW_MEMORY_BLOCK(data->FIM[i], nsens, double, 0);
    }
    else
    {
      for ( i=0; i<nsens; i++ )
/* initialize cvodeData from cvodeSettings and odeModel (could be
   separated in to functions to further support modularity and
   independence of data structures */
int
CvodeData_initialize(cvodeData_t *data, cvodeSettings_t *opt, odeModel_t *om)
{

  int i, j;

  /* data now also depends on cvodeSettings */
  data->opt = opt;
  
  /* initialize values */
  CvodeData_initializeValues(data);
     
  /* set current time */
  data->currenttime = opt->TimePoints[0];

  /* update assigned parameters, in case they depend on new time */
  for ( i=0; i<om->nass; i++ ) 
    data->value[om->neq+i] = evaluateAST(om->assignment[i],data);

  /*
    Then, check if formulas can be evaluated, and cvodeData_t *
    contains all necessary variables:
    evaluateAST(ASTNode_t *f, ,data) will
    ask the user for a value, if a a variable is unknown
  */
  for ( i=0; i<om->neq; i++ ) 
    evaluateAST(om->ode[i], data);

  
  /* create structures for sensitivity analysis */
  if ( opt->Sensitivity ) {
    /* the following can later be called with numbers from
       sensitivity Settings inputs */
    if ( data->sensitivity == NULL ) {
      CvodeData_allocateSens(data, om->neq, om->nconst);
      RETURN_ON_FATALS_WITH(0);
    }
    /* (re)set to 0.0 initial value */
    for ( i=0; i<om->neq; i++ ) {
      for ( j=0; j<om->nsens; j++ ) {
	data->sensitivity[i][j] = 0.0;
      }
    }
  }

  /* Now we should have all variables, and can allocate the
     results structure, where the time series will be stored ...  */
  /* allow results only for finite integrations */
  opt->StoreResults = !opt->Indefinitely && opt->StoreResults;
  /* free former results */
  if ( data->results != NULL )
      CvodeResults_free(data->results);
  /* create new results if required */
  if ( opt->StoreResults ) {
    data->results = CvodeResults_create(data, opt->PrintStep);
    RETURN_ON_FATALS_WITH(0);
    if  ( opt->Sensitivity ) {
      CvodeResults_allocateSens(data->results, om->neq, om->nconst,
				opt->PrintStep);
      /* write initial values for sensitivity */
      for ( i=0; i<data->results->neq; i++ )
	for ( j=0; j<data->results->nsens; ++j )
	  data->results->sensitivity[i][j][0] = data->sensitivity[i][j];
    }
    RETURN_ON_FATALS_WITH(0);
  }

  
  return 1;
}