void FCV_CVODE(realtype *tout, realtype *t, realtype *y, int *itask, int *ier) { realtype h0u; int qu, qcur; /* tout is the t value where output is desired F2C_vec is the N_Vector containing the solution on return t is the returned independent variable value itask is the task indicator (1 = CV_NORMAL, 2 = CV_ONE_STEP, 3 = CV_NORMAL_TSTOP, 4 = CV_ONE_STEP_TSTOP) */ *ier = CVode(CV_cvodemem, *tout, F2C_vec, t, *itask); y = N_VGetArrayPointer(F2C_vec); /* Load optional outputs in iopt & ropt */ if ( (CV_iopt != NULL) && (CV_ropt != NULL) ) { CVodeGetIntegratorStats(CV_cvodemem, &CV_iopt[3], /* NST */ &CV_iopt[4], /* NFE */ &CV_iopt[5], /* NSETUPS */ &CV_iopt[8], /* NETF */ &qu, &qcur, &h0u, &CV_ropt[3], /* HU */ &CV_ropt[4], /* HCUR */ &CV_ropt[5]); /* TCUR */ CV_iopt[9] = (long int)qu; /* QU */ CV_iopt[10] = (long int)qcur; /* QCUR */ CVodeGetTolScaleFactor(CV_cvodemem, &CV_ropt[6]); CVodeGetNonlinSolvStats(CV_cvodemem, &CV_iopt[6], /* NNI */ &CV_iopt[7]); /* NCFN */ CVodeGetWorkSpace(CV_cvodemem, &CV_iopt[11], /* LENRW */ &CV_iopt[12]); /* LENIW */ if (CV_optin && (CV_iopt[13] > 0)) CVodeGetNumStabLimOrderReds(CV_cvodemem, &CV_iopt[14]); /* NOR */ /* Root finding is on */ if (CV_nrtfn != 0) CVodeGetNumGEvals(CV_cvodemem, &CV_iopt[24]); switch(CV_ls) { case 1: CVDenseGetWorkSpace(CV_cvodemem, &CV_iopt[15], &CV_iopt[16]); /* LRW and LIW */ CVDenseGetNumJacEvals(CV_cvodemem, &CV_iopt[17]); /* NJE */ CVDenseGetLastFlag(CV_cvodemem, (int *) &CV_iopt[25]); /* last linear solver flag */ break; case 2: CVBandGetWorkSpace(CV_cvodemem, &CV_iopt[15], &CV_iopt[16]); /* LRW and LIW */ CVBandGetNumJacEvals(CV_cvodemem, &CV_iopt[17]); /* NJE */ CVBandGetLastFlag(CV_cvodemem, (int *) &CV_iopt[25]); /* last linear solver flag */ break; case 3: CVDiagGetWorkSpace(CV_cvodemem, &CV_iopt[15], &CV_iopt[16]); /* LRW and LIW */ CVDiagGetLastFlag(CV_cvodemem, (int *) &CV_iopt[25]); /* last linear solver flag */ break; case 4: CVSpgmrGetWorkSpace(CV_cvodemem, &CV_iopt[15], &CV_iopt[16]); /* LRW and LIW */ CVSpgmrGetNumPrecEvals(CV_cvodemem, &CV_iopt[17]); /* NPE */ CVSpgmrGetNumLinIters(CV_cvodemem, &CV_iopt[18]); /* NLI */ CVSpgmrGetNumPrecSolves(CV_cvodemem, &CV_iopt[19]); /* NPS */ CVSpgmrGetNumConvFails(CV_cvodemem, &CV_iopt[20]); /* NCFL */ CVSpgmrGetLastFlag(CV_cvodemem, (int *) &CV_iopt[25]); /* last linear solver flag */ break; } } }
void FCV_CVODE(realtype *tout, realtype *t, realtype *y, int *itask, int *ier) { /* tout is the t value where output is desired F2C_CVODE_vec is the N_Vector containing the solution on return t is the returned independent variable value itask is the task indicator (1 = CV_NORMAL, 2 = CV_ONE_STEP, 3 = CV_NORMAL_TSTOP, 4 = CV_ONE_STEP_TSTOP) */ int qu, qcur; N_VSetArrayPointer(y, F2C_CVODE_vec); *ier = CVode(CV_cvodemem, *tout, F2C_CVODE_vec, t, *itask); N_VSetArrayPointer(NULL, F2C_CVODE_vec); /* Load optional outputs in iout & rout */ CVodeGetWorkSpace(CV_cvodemem, &CV_iout[0], /* LENRW */ &CV_iout[1]); /* LENIW */ CVodeGetIntegratorStats(CV_cvodemem, &CV_iout[2], /* NST */ &CV_iout[3], /* NFE */ &CV_iout[7], /* NSETUPS */ &CV_iout[4], /* NETF */ &qu, /* QU */ &qcur, /* QCUR */ &CV_rout[0], /* H0U */ &CV_rout[1], /* HU */ &CV_rout[2], /* HCUR */ &CV_rout[3]); /* TCUR */ CV_iout[8] = (long int) qu; CV_iout[9] = (long int) qcur; CVodeGetTolScaleFactor(CV_cvodemem, &CV_rout[4]); /* TOLSFAC */ CVodeGetNonlinSolvStats(CV_cvodemem, &CV_iout[6], /* NNI */ &CV_iout[5]); /* NCFN */ CVodeGetNumStabLimOrderReds(CV_cvodemem, &CV_iout[10]); /* NOR */ /* Root finding is on */ if (CV_nrtfn != 0) CVodeGetNumGEvals(CV_cvodemem, &CV_iout[11]); /* NGE */ switch(CV_ls) { case CV_LS_STD: CVodeGetLinWorkSpace(CV_cvodemem, &CV_iout[12], &CV_iout[13]); /* LENRWLS,LENIWLS */ CVodeGetLastLinFlag(CV_cvodemem, &CV_iout[14]); /* LSTF */ CVodeGetNumLinRhsEvals(CV_cvodemem, &CV_iout[15]); /* NFELS */ CVodeGetNumJacEvals(CV_cvodemem, &CV_iout[16]); /* NJE */ CVodeGetNumJTSetupEvals(CV_cvodemem, &CV_iout[17]); /* NJTS */ CVodeGetNumJtimesEvals(CV_cvodemem, &CV_iout[18]); /* NJTV */ CVodeGetNumPrecEvals(CV_cvodemem, &CV_iout[19]); /* NPE */ CVodeGetNumPrecSolves(CV_cvodemem, &CV_iout[20]); /* NPS */ CVodeGetNumLinIters(CV_cvodemem, &CV_iout[21]); /* NLI */ CVodeGetNumLinConvFails(CV_cvodemem, &CV_iout[22]); /* NCFL */ break; case CV_LS_DIAG: CVDiagGetWorkSpace(CV_cvodemem, &CV_iout[12], &CV_iout[13]); /* LENRWLS,LENIWLS */ CVDiagGetLastFlag(CV_cvodemem, &CV_iout[14]); /* LSTF */ CVDiagGetNumRhsEvals(CV_cvodemem, &CV_iout[15]); /* NFELS */ } }