/* yS0 in row major order */ void ode_solver_init_sens(ode_solver* solver, double* yS0, int lenP, int lenY){ /* change: lenP may now be shorter than P if you dpn't want to * calculate all sensitivities. This is important for the correct * treatment of input parameters, i.e. experimental conditions u * (since we don't require sensitivities with repsect to them). */ int i,flag; int N = solver->odeModel->N; int P = solver->odeModel->P; if (solver->odeModel->vf_sens == 0) { fprintf(stderr,"ode_solver_init_sens: no sensitivities defined for this model.\n"); return; } solver->yS = N_VCloneVectorArrayEmpty_Serial(lenP, solver->y); /* alloc */ double tmp[N]; if(yS0 !=0 ){ if ( (lenY != N) ) { fprintf(stderr,"ode_solver_init_sens: lenY must be equal to %d the number of parameters and variables in the ode model.\n",solver->odeModel->N); return ; } for(i = 0; i < lenP; i++) NV_DATA_S(solver->yS[i]) = &yS0[i*lenY]; } else{ for (i=0; i < N ; i++) tmp[i] = 0.0; for (i = 0; i < lenP; i++) NV_DATA_S(solver->yS[i]) = tmp; } flag = CVodeSensInit1(solver->cvode_mem, lenP, CV_STAGGERED1, solver->odeModel->vf_sens, solver->yS); flag = CVodeSetSensErrCon(solver->cvode_mem, TRUE); flag = CVodeSensEEtolerances(solver->cvode_mem); /* set parameters scale for error corection */ double scale_p[lenP]; for (i=0; i<lenP; i++) { /* order of magnitude can be found from the actual parameter value */ /* if zero then set to the default relative error */ if (solver->params[i] != 0.0){ scale_p[i] = solver->params[i]; } else { scale_p[i] = ODE_SOLVER_REL_ERR; } } flag = CVodeSetSensParams(solver->cvode_mem, solver->params, scale_p, NULL); }
void FNV_INITS_S(int *code, int *Ns, int *ier) { *ier = 0; switch(*code) { case FCMIX_CVODE: F2C_CVODE_vecS = NULL; F2C_CVODE_vecS = (N_Vector *) N_VCloneVectorArrayEmpty_Serial(*Ns, F2C_CVODE_vec); if (F2C_CVODE_vecS == NULL) *ier = -1; break; case FCMIX_IDA: F2C_IDA_vecS = NULL; F2C_IDA_vecS = (N_Vector *) N_VCloneVectorArrayEmpty_Serial(*Ns, F2C_IDA_vec); if (F2C_IDA_vecS == NULL) *ier = -1; break; default: *ier = -1; } }