/* 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; }