static void PrintFinalStats(void *cvode_mem, void *bpdata) { long int lenrw, leniw ; long int lenrwSPGMR, leniwSPGMR; long int lenrwBP, leniwBP; long int nst, nfe, nsetups, nni, ncfn, netf; long int nli, npe, nps, ncfl, nfeSPGMR; long int nfeBP; int flag; flag = CVodeGetWorkSpace(cvode_mem, &lenrw, &leniw); check_flag(&flag, "CVodeGetWorkSpace", 1); flag = CVodeGetNumSteps(cvode_mem, &nst); check_flag(&flag, "CVodeGetNumSteps", 1); flag = CVodeGetNumRhsEvals(cvode_mem, &nfe); check_flag(&flag, "CVodeGetNumRhsEvals", 1); flag = CVodeGetNumLinSolvSetups(cvode_mem, &nsetups); check_flag(&flag, "CVodeGetNumLinSolvSetups", 1); flag = CVodeGetNumErrTestFails(cvode_mem, &netf); check_flag(&flag, "CVodeGetNumErrTestFails", 1); flag = CVodeGetNumNonlinSolvIters(cvode_mem, &nni); check_flag(&flag, "CVodeGetNumNonlinSolvIters", 1); flag = CVodeGetNumNonlinSolvConvFails(cvode_mem, &ncfn); check_flag(&flag, "CVodeGetNumNonlinSolvConvFails", 1); flag = CVSpgmrGetWorkSpace(cvode_mem, &lenrwSPGMR, &leniwSPGMR); check_flag(&flag, "CVSpgmrGetWorkSpace", 1); flag = CVSpgmrGetNumLinIters(cvode_mem, &nli); check_flag(&flag, "CVSpgmrGetNumLinIters", 1); flag = CVSpgmrGetNumPrecEvals(cvode_mem, &npe); check_flag(&flag, "CVSpgmrGetNumPrecEvals", 1); flag = CVSpgmrGetNumPrecSolves(cvode_mem, &nps); check_flag(&flag, "CVSpgmrGetNumPrecSolves", 1); flag = CVSpgmrGetNumConvFails(cvode_mem, &ncfl); check_flag(&flag, "CVSpgmrGetNumConvFails", 1); flag = CVSpgmrGetNumRhsEvals(cvode_mem, &nfeSPGMR); check_flag(&flag, "CVSpgmrGetNumRhsEvals", 1); flag = CVBandPrecGetWorkSpace(bpdata, &lenrwBP, &leniwBP); check_flag(&flag, "CVBandPrecGetWorkSpace", 1); flag = CVBandPrecGetNumRhsEvals(bpdata, &nfeBP); check_flag(&flag, "CVBandPrecGetNumRhsEvals", 1); printf("\nFinal Statistics.. \n\n"); printf("lenrw = %5ld leniw = %5ld\n", lenrw, leniw); printf("llrw = %5ld lliw = %5ld\n", lenrwSPGMR, leniwSPGMR); printf("llrw = %5ld lliw = %5ld\n", lenrwBP, leniwBP); printf("nst = %5ld\n" , nst); printf("nfe = %5ld nfetot = %5ld\n" , nfe, nfe+nfeSPGMR+nfeBP); printf("nfeSPGMR= %5ld nfeBP = %5ld\n" , nfeSPGMR, nfeBP); printf("nni = %5ld nli = %5ld\n" , nni, nli); printf("nsetups = %5ld netf = %5ld\n" , nsetups, netf); printf("npe = %5ld nps = %5ld\n" , npe, nps); printf("ncfn = %5ld ncfl = %5ld\n\n", ncfn, ncfl); }
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; } } }