static int CVBBDPrecSetup(realtype t, N_Vector y, N_Vector fy, booleantype jok, booleantype *jcurPtr, realtype gamma, void *bbd_data, N_Vector tmp1, N_Vector tmp2, N_Vector tmp3) { long int ier; CVBBDPrecData pdata; pdata = (CVBBDPrecData) bbd_data; if (jok) { /* If jok = TRUE, use saved copy of J */ *jcurPtr = FALSE; BandCopy(savedJ, savedP, mukeep, mlkeep); } else { /* Otherwise call CVBBDDQJac for new J value */ *jcurPtr = TRUE; BandZero(savedJ); CVBBDDQJac(pdata, t, y, tmp1, tmp2, tmp3); nge += 1 + MIN(mldq + mudq + 1, Nlocal); BandCopy(savedJ, savedP, mukeep, mlkeep); } /* Scale and add I to get P = I - gamma*J */ BandScale(-gamma, savedP); BandAddI(savedP); /* Do LU factorization of P in place */ ier = BandFactor(savedP, pivots); /* Return 0 if the LU was complete; otherwise return 1 */ if (ier > 0) return(1); return(0); }
static int CVBandPrecSetup(realtype t, N_Vector y, N_Vector fy, booleantype jok, booleantype *jcurPtr, realtype gamma, void *bp_data, N_Vector tmp1, N_Vector tmp2, N_Vector tmp3) { long int ier; CVBandPrecData pdata; /* Assume matrix and pivots have already been allocated. */ pdata = (CVBandPrecData) bp_data; if (jok) { /* If jok = TRUE, use saved copy of J. */ *jcurPtr = FALSE; BandCopy(savedJ, savedP, mu, ml); } else { /* If jok = FALSE, call CVBandPDQJac for new J value. */ *jcurPtr = TRUE; BandZero(savedJ); CVBandPDQJac(pdata, t, y, fy, tmp1, tmp2); BandCopy(savedJ, savedP, mu, ml); } /* Scale and add I to get savedP = I - gamma*J. */ BandScale(-gamma, savedP); BandAddI(savedP); /* Do LU factorization of matrix. */ ier = BandFactor(savedP, pivots); /* Return 0 if the LU was complete; otherwise return 1. */ if (ier > 0) return(1); return(0); }
static int IDABandSetup(IDAMem IDA_mem, N_Vector yyp, N_Vector ypp, N_Vector rrp, N_Vector tmp1, N_Vector tmp2, N_Vector tmp3) { int retval; long int retfac; IDABandMem idaband_mem; idaband_mem = (IDABandMem) lmem; /* Increment nje counter. */ nje++; /* Zero out JJ; call Jacobian routine jac; return if it failed. */ BandZero(JJ); retval = jac(neq, mu, ml, tn, yyp, ypp, rrp, cj, jacdata, JJ, tmp1, tmp2, tmp3); last_flag = retval; if (retval < 0) return(-1); if (retval > 0) return(+1); /* Do LU factorization of JJ; return success or fail flag. */ retfac = BandFactor(JJ, pivots); if (retfac != 0) { last_flag = 1; return(+1); } last_flag = 0; return(0); }
static int CVBandPrecSetup(realtype t, N_Vector y, N_Vector fy, booleantype jok, booleantype *jcurPtr, realtype gamma, void *bp_data, N_Vector tmp1, N_Vector tmp2, N_Vector tmp3) { long int ier; CVBandPrecData pdata; CVodeMem cv_mem; int retval; /* Assume matrix and pivots have already been allocated. */ pdata = (CVBandPrecData) bp_data; cv_mem = (CVodeMem) pdata->cvode_mem; if (jok) { /* If jok = TRUE, use saved copy of J. */ *jcurPtr = FALSE; BandCopy(savedJ, savedP, mu, ml); } else { /* If jok = FALSE, call CVBandPDQJac for new J value. */ *jcurPtr = TRUE; BandZero(savedJ); retval = CVBandPDQJac(pdata, t, y, fy, tmp1, tmp2); if (retval < 0) { CVProcessError(cv_mem, CVBANDPRE_RHSFUNC_UNRECVR, "CVBANDPRE", "CVBandPrecSetup", MSGBP_RHSFUNC_FAILED); return(-1); } if (retval > 0) { return(1); } BandCopy(savedJ, savedP, mu, ml); } /* Scale and add I to get savedP = I - gamma*J. */ BandScale(-gamma, savedP); BandAddI(savedP); /* Do LU factorization of matrix. */ ier = BandFactor(savedP, pivots); /* Return 0 if the LU was complete; otherwise return 1. */ if (ier > 0) return(1); return(0); }
static int CVBandSetup(CVodeMem cv_mem, int convfail, N_Vector ypred, N_Vector fpred, booleantype *jcurPtr, N_Vector vtemp1, N_Vector vtemp2, N_Vector vtemp3) { booleantype jbad, jok; realtype dgamma; long int ier; CVBandMem cvband_mem; cvband_mem = (CVBandMem) lmem; /* Use nst, gamma/gammap, and convfail to set J eval. flag jok */ dgamma = ABS((gamma/gammap) - ONE); jbad = (nst == 0) || (nst > nstlj + CVB_MSBJ) || ((convfail == CV_FAIL_BAD_J) && (dgamma < CVB_DGMAX)) || (convfail == CV_FAIL_OTHER); jok = !jbad; if (jok) { /* If jok = TRUE, use saved copy of J */ *jcurPtr = FALSE; BandCopy(savedJ, M, mu, ml); } else { /* If jok = FALSE, call jac routine for new J value */ nje++; nstlj = nst; *jcurPtr = TRUE; BandZero(M); jac(n, mu, ml, M, tn, ypred, fpred, J_data, vtemp1, vtemp2, vtemp3); BandCopy(M, savedJ, mu, ml); } /* Scale and add I to get M = I - gamma*J */ BandScale(-gamma, M); BandAddI(M); /* Do LU factorization of M */ ier = BandFactor(M, pivots); /* Return 0 if the LU was complete; otherwise return 1 */ if (ier > 0) { last_flag = ier; return(1); } last_flag = CVBAND_SUCCESS; return(0); }
int PVBBDPrecon(integer N, real t, N_Vector y, N_Vector fy, boole jok, boole *jcurPtr, real gamma, N_Vector ewt, real h, real uround, long int *nfePtr, void *P_data, N_Vector vtemp1, N_Vector vtemp2, N_Vector vtemp3) { integer Nlocal, ier; real rely, srur; PVBBDData pdata; pdata = (PVBBDData)P_data; Nlocal = N_VLOCLENGTH(y); if (jok) { /* If jok = TRUE, use saved copy of J */ *jcurPtr = FALSE; BandCopy(savedJ, savedP, mukeep, mlkeep); } else { /* Otherwise call PVBBDDQJac for new J value */ *jcurPtr = TRUE; BandZero(savedJ); /* Set relative increment for y via dqrely and uround */ srur = RSqrt(uround); rely = (dqrely == ZERO) ? srur : dqrely; PVBBDDQJac(Nlocal, mudq, mldq, mukeep, mlkeep, rely, gloc, cfn, savedJ, f_data, t, y, ewt, h, uround, vtemp1, vtemp2, vtemp3); nge += 1 + MIN(mldq + mudq + 1, Nlocal); BandCopy(savedJ, savedP, mukeep, mlkeep); } /* Scale and add I to get P = I - gamma*J */ BandScale(-gamma, savedP); BandAddI(savedP); /* Do LU factorization of P in place */ ier = BandFactor(savedP, pivots); /* Return 0 if the LU was complete; otherwise return 1 */ if (ier > 0) return(1); return(0); }