int KINSptfqmr(void *kinmem, int maxl) { KINMem kin_mem; KINSpilsMem kinspils_mem; SptfqmrMem sptfqmr_mem; int maxl1; if (kinmem == NULL){ KINProcessError(NULL, KINSPILS_MEM_NULL, "KINSPILS", "KINSptfqmr", MSGS_KINMEM_NULL); return(KINSPILS_MEM_NULL); } kin_mem = (KINMem) kinmem; /* check for required vector operations */ /* Note: do NOT need to check for N_VLinearSum, N_VProd, N_VScale, N_VDiv, or N_VWL2Norm because they are required by KINSOL */ if ((vec_tmpl->ops->nvconst == NULL) || (vec_tmpl->ops->nvdotprod == NULL) || (vec_tmpl->ops->nvl1norm == NULL)) { KINProcessError(NULL, KINSPILS_ILL_INPUT, "KINSPILS", "KINSptfqmr", MSGS_BAD_NVECTOR); return(KINSPILS_ILL_INPUT); } if (lfree != NULL) lfree(kin_mem); /* set four main function fields in kin_mem */ linit = KINSptfqmrInit; lsetup = KINSptfqmrSetup; lsolve = KINSptfqmrSolve; lfree = KINSptfqmrFree; /* get memory for KINSpilsMemRec */ kinspils_mem = NULL; kinspils_mem = (KINSpilsMem) malloc(sizeof(struct KINSpilsMemRec)); if (kinspils_mem == NULL){ KINProcessError(NULL, KINSPILS_MEM_FAIL, "KINSPILS", "KINSptfqmr", MSGS_MEM_FAIL); return(KINSPILS_MEM_FAIL); } /* Set ILS type */ kinspils_mem->s_type = SPILS_SPTFQMR; /* set SPTFQMR parameters that were passed in call sequence */ maxl1 = (maxl <= 0) ? KINSPILS_MAXL : maxl; kinspils_mem->s_maxl = maxl1; /* Set defaults for Jacobian-related fileds */ jtimesDQ = TRUE; jtimes = NULL; J_data = NULL; /* Set defaults for preconditioner-related fields */ kinspils_mem->s_pset = NULL; kinspils_mem->s_psolve = NULL; kinspils_mem->s_pfree = NULL; kinspils_mem->s_P_data = kin_mem->kin_user_data; /* Set default values for the rest of the SPTFQMR parameters */ kinspils_mem->s_pretype = PREC_NONE; kinspils_mem->s_last_flag = KINSPILS_SUCCESS; /* Call SptfqmrMalloc to allocate workspace for SPTFQMR */ /* vec_tmpl passed as template vector */ sptfqmr_mem = NULL; sptfqmr_mem = SptfqmrMalloc(maxl1, vec_tmpl); if (sptfqmr_mem == NULL) { KINProcessError(NULL, KINSPILS_MEM_FAIL, "KINSPILS", "KINSptfqmr", MSGS_MEM_FAIL); free(kinspils_mem); kinspils_mem = NULL; return(KINSPILS_MEM_FAIL); } /* this is an iterative linear solver */ inexact_ls = TRUE; /* Attach SPTFQMR memory to spils memory structure */ spils_mem = (void *) sptfqmr_mem; /* attach linear solver memory to KINSOL memory */ lmem = kinspils_mem; return(KINSPILS_SUCCESS); }
int CVSptfqmr(void *cvode_mem, int pretype, int maxl) { CVodeMem cv_mem; CVSpilsMem cvspils_mem; SptfqmrMem sptfqmr_mem; int mxl; /* Return immediately if cvode_mem is NULL */ if (cvode_mem == NULL) { CVProcessError(NULL, CVSPILS_MEM_NULL, "CVSPTFQMR", "CVSptfqmr", MSGS_CVMEM_NULL); return(CVSPILS_MEM_NULL); } cv_mem = (CVodeMem) cvode_mem; /* Check if N_VDotProd is present */ if (vec_tmpl->ops->nvdotprod == NULL) { CVProcessError(cv_mem, CVSPILS_ILL_INPUT, "CVSPTFQMR", "CVSptfqmr", MSGS_BAD_NVECTOR); return(CVSPILS_ILL_INPUT); } if (lfree != NULL) lfree(cv_mem); /* Set four main function fields in cv_mem */ linit = CVSptfqmrInit; lsetup = CVSptfqmrSetup; lsolve = CVSptfqmrSolve; lfree = CVSptfqmrFree; /* Get memory for CVSpilsMemRec */ cvspils_mem = NULL; cvspils_mem = (CVSpilsMem) malloc(sizeof(struct CVSpilsMemRec)); if (cvspils_mem == NULL) { CVProcessError(cv_mem, CVSPILS_MEM_FAIL, "CVSPTFQMR", "CVSptfqmr", MSGS_MEM_FAIL); return(CVSPILS_MEM_FAIL); } /* Set ILS type */ cvspils_mem->s_type = SPILS_SPTFQMR; /* Set Sptfqmr parameters that have been passed in call sequence */ cvspils_mem->s_pretype = pretype; mxl = cvspils_mem->s_maxl = (maxl <= 0) ? CVSPILS_MAXL : maxl; /* Set defaults for Jacobian-related fileds */ jtimesDQ = TRUE; jtimes = NULL; j_data = NULL; /* Set defaults for preconditioner-related fields */ cvspils_mem->s_pset = NULL; cvspils_mem->s_psolve = NULL; cvspils_mem->s_pfree = NULL; cvspils_mem->s_P_data = cv_mem->cv_user_data; /* Set default values for the rest of the Sptfqmr parameters */ cvspils_mem->s_eplifac = CVSPILS_EPLIN; cvspils_mem->s_last_flag = CVSPILS_SUCCESS; setupNonNull = FALSE; /* Check for legal pretype */ if ((pretype != PREC_NONE) && (pretype != PREC_LEFT) && (pretype != PREC_RIGHT) && (pretype != PREC_BOTH)) { CVProcessError(cv_mem, CVSPILS_ILL_INPUT, "CVSPTFQMR", "CVSptfqmr", MSGS_BAD_PRETYPE); free(cvspils_mem); cvspils_mem = NULL; return(CVSPILS_ILL_INPUT); } /* Allocate memory for ytemp and x */ ytemp = N_VClone(vec_tmpl); if (ytemp == NULL) { CVProcessError(cv_mem, CVSPILS_MEM_FAIL, "CVSPTFQMR", "CVSptfqmr", MSGS_MEM_FAIL); free(cvspils_mem); cvspils_mem = NULL; return(CVSPILS_MEM_FAIL); } x = N_VClone(vec_tmpl); if (x == NULL) { CVProcessError(cv_mem, CVSPILS_MEM_FAIL, "CVSPTFQMR", "CVSptfqmr", MSGS_MEM_FAIL); N_VDestroy(ytemp); free(cvspils_mem); cvspils_mem = NULL; return(CVSPILS_MEM_FAIL); } /* Compute sqrtN from a dot product */ N_VConst(ONE, ytemp); sqrtN = RSqrt(N_VDotProd(ytemp, ytemp)); /* Call SptfqmrMalloc to allocate workspace for Sptfqmr */ sptfqmr_mem = NULL; sptfqmr_mem = SptfqmrMalloc(mxl, vec_tmpl); if (sptfqmr_mem == NULL) { CVProcessError(cv_mem, CVSPILS_MEM_FAIL, "CVSPTFQMR", "CVSptfqmr", MSGS_MEM_FAIL); N_VDestroy(ytemp); N_VDestroy(x); free(cvspils_mem); cvspils_mem = NULL; return(CVSPILS_MEM_FAIL); } /* Attach SPTFQMR memory to spils memory structure */ spils_mem = (void *) sptfqmr_mem; /* Attach linear solver memory to integrator memory */ lmem = cvspils_mem; return(CVSPILS_SUCCESS); }
int CPSptfqmr(void *cpode_mem, int pretype, int maxl) { CPodeMem cp_mem; CPSpilsMem cpspils_mem; SptfqmrMem sptfqmr_mem; int mxl; /* Return immediately if cpode_mem is NULL */ if (cpode_mem == NULL) { cpProcessError(NULL, CPSPILS_MEM_NULL, "CPSPTFQMR", "CPSptfqmr", MSGS_CPMEM_NULL); return(CPSPILS_MEM_NULL); } cp_mem = (CPodeMem) cpode_mem; /* Check if N_VDotProd is present */ if (vec_tmpl->ops->nvdotprod == NULL) { cpProcessError(cp_mem, CPSPILS_ILL_INPUT, "CPSPTFQMR", "CPSptfqmr", MSGS_BAD_NVECTOR); return(CPSPILS_ILL_INPUT); } if (lfree != NULL) lfree(cp_mem); /* Set four main function fields in cp_mem */ linit = cpSptfqmrInit; lsetup = cpSptfqmrSetup; lsolve = cpSptfqmrSolve; lfree = cpSptfqmrFree; /* Get memory for CPSpilsMemRec */ cpspils_mem = NULL; cpspils_mem = (CPSpilsMem) malloc(sizeof(CPSpilsMemRec)); if (cpspils_mem == NULL) { cpProcessError(cp_mem, CPSPILS_MEM_FAIL, "CPSPTFQMR", "CPSptfqmr", MSGS_MEM_FAIL); return(CPSPILS_MEM_FAIL); } /* Set ILS type */ cpspils_mem->s_type = SPILS_SPTFQMR; /* Set Sptfqmr parameters that have been passed in call sequence */ cpspils_mem->s_pretype = pretype; mxl = cpspils_mem->s_maxl = (maxl <= 0) ? CPSPILS_MAXL : maxl; /* Set default values for the rest of the Sptfqmr parameters */ cpspils_mem->s_delt = CPSPILS_DELT; cpspils_mem->s_psetE = NULL; cpspils_mem->s_psetI = NULL; cpspils_mem->s_pslvE = NULL; cpspils_mem->s_pslvI = NULL; cpspils_mem->s_jtvE = NULL; cpspils_mem->s_jtvI = NULL; cpspils_mem->s_P_data = NULL; cpspils_mem->s_j_data = NULL; cpspils_mem->s_last_flag = CPSPILS_SUCCESS; lsetup_exists = FALSE; /* Check for legal pretype */ if ((pretype != PREC_NONE) && (pretype != PREC_LEFT) && (pretype != PREC_RIGHT) && (pretype != PREC_BOTH)) { cpProcessError(cp_mem, CPSPILS_ILL_INPUT, "CPSPTFQMR", "CPSptfqmr", MSGS_BAD_PRETYPE); free(cpspils_mem); return(CPSPILS_ILL_INPUT); } /* Alocate memory */ sptfqmr_mem = NULL; ytemp = NULL; yptemp = NULL; x = NULL; /* Call SptfqmrMalloc to allocate workspace for Sptfqmr */ sptfqmr_mem = SptfqmrMalloc(mxl, vec_tmpl); if (sptfqmr_mem == NULL) { cpProcessError(cp_mem, CPSPILS_MEM_FAIL, "CPSPTFQMR", "CPSptfqmr", MSGS_MEM_FAIL); free(cpspils_mem); return(CPSPILS_MEM_FAIL); } /* Allocate memory for x, ytemp and (if needed) yptemp */ x = N_VClone(vec_tmpl); if (x == NULL) { cpProcessError(cp_mem, CPSPILS_MEM_FAIL, "CPSPTFQMR", "CPSptfqmr", MSGS_MEM_FAIL); SptfqmrFree(sptfqmr_mem); free(cpspils_mem); return(CPSPILS_MEM_FAIL); } ytemp = N_VClone(vec_tmpl); if (ytemp == NULL) { cpProcessError(cp_mem, CPSPILS_MEM_FAIL, "CPSPTFQMR", "CPSptfqmr", MSGS_MEM_FAIL); SptfqmrFree(sptfqmr_mem); N_VDestroy(x); free(cpspils_mem); return(CPSPILS_MEM_FAIL); } if (ode_type == CP_IMPL) { yptemp = N_VClone(vec_tmpl); if (yptemp == NULL) { cpProcessError(cp_mem, CPSPILS_MEM_FAIL, "CPSPTFQMR", "CPSptfqmr", MSGS_MEM_FAIL); SptfqmrFree(sptfqmr_mem); N_VDestroy(x); N_VDestroy(ytemp); free(cpspils_mem); return(CPSPILS_MEM_FAIL); } } /* Compute sqrtN from a dot product */ N_VConst(ONE, ytemp); sqrtN = RSqrt(N_VDotProd(ytemp, ytemp)); /* Attach SPTFQMR memory to spils memory structure */ spils_mem = (void *) sptfqmr_mem; /* Attach linear solver memory to integrator memory */ lmem = cpspils_mem; return(CPSPILS_SUCCESS); }
int IDASptfqmr(void *ida_mem, int maxl) { IDAMem IDA_mem; IDASpilsMem idaspils_mem; SptfqmrMem sptfqmr_mem; int flag, maxl1; /* Return immediately if ida_mem is NULL */ if (ida_mem == NULL) { IDAProcessError(NULL, IDASPILS_MEM_NULL, "IDASPTFQMR", "IDASptfqmr", MSGS_IDAMEM_NULL); return(IDASPILS_MEM_NULL); } IDA_mem = (IDAMem) ida_mem; /* Check if N_VDotProd is present */ if (vec_tmpl->ops->nvdotprod == NULL) { IDAProcessError(NULL, IDASPILS_ILL_INPUT, "IDASPTFQMR", "IDASptfqmr", MSGS_BAD_NVECTOR); return(IDASPILS_ILL_INPUT); } if (lfree != NULL) flag = lfree((IDAMem) ida_mem); /* Set five main function fields in ida_mem */ linit = IDASptfqmrInit; lsetup = IDASptfqmrSetup; lsolve = IDASptfqmrSolve; lperf = IDASptfqmrPerf; lfree = IDASptfqmrFree; /* Get memory for IDASpilsMemRec */ idaspils_mem = NULL; idaspils_mem = (IDASpilsMem) malloc(sizeof(struct IDASpilsMemRec)); if (idaspils_mem == NULL) { IDAProcessError(NULL, IDASPILS_MEM_FAIL, "IDASPTFQMR", "IDASptfqmr", MSGS_MEM_FAIL); return(IDASPILS_MEM_FAIL); } /* Set ILS type */ idaspils_mem->s_type = SPILS_SPTFQMR; /* Set SPTFQMR parameters that were passed in call sequence */ maxl1 = (maxl <= 0) ? IDA_SPILS_MAXL : maxl; idaspils_mem->s_maxl = maxl1; /* Set defaults for Jacobian-related fileds */ jtimesDQ = TRUE; jtimes = NULL; jdata = NULL; /* Set defaults for preconditioner-related fields */ idaspils_mem->s_pset = NULL; idaspils_mem->s_psolve = NULL; idaspils_mem->s_pfree = NULL; idaspils_mem->s_pdata = IDA_mem->ida_user_data; /* Set default values for the rest of the Sptfqmr parameters */ idaspils_mem->s_eplifac = PT05; idaspils_mem->s_dqincfac = ONE; idaspils_mem->s_last_flag = IDASPILS_SUCCESS; /* Set setupNonNull to FALSE */ setupNonNull = FALSE; /* Allocate memory for ytemp, yptemp, and xx */ ytemp = N_VClone(vec_tmpl); if (ytemp == NULL) { IDAProcessError(NULL, IDASPILS_MEM_FAIL, "IDASPTFQMR", "IDASptfqmr", MSGS_MEM_FAIL); free(idaspils_mem); idaspils_mem = NULL; return(IDASPILS_MEM_FAIL); } yptemp = N_VClone(vec_tmpl); if (yptemp == NULL) { IDAProcessError(NULL, IDASPILS_MEM_FAIL, "IDASPTFQMR", "IDASptfqmr", MSGS_MEM_FAIL); N_VDestroy(ytemp); free(idaspils_mem); idaspils_mem = NULL; return(IDASPILS_MEM_FAIL); } xx = N_VClone(vec_tmpl); if (xx == NULL) { IDAProcessError(NULL, IDASPILS_MEM_FAIL, "IDASPTFQMR", "IDASptfqmr", MSGS_MEM_FAIL); N_VDestroy(ytemp); N_VDestroy(yptemp); free(idaspils_mem); idaspils_mem = NULL; return(IDASPILS_MEM_FAIL); } /* Compute sqrtN from a dot product */ N_VConst(ONE, ytemp); sqrtN = RSqrt(N_VDotProd(ytemp, ytemp)); /* Call SptfqmrMalloc to allocate workspace for Sptfqmr */ sptfqmr_mem = NULL; sptfqmr_mem = SptfqmrMalloc(maxl1, vec_tmpl); if (sptfqmr_mem == NULL) { IDAProcessError(NULL, IDASPILS_MEM_FAIL, "IDASPTFQMR", "IDASptfqmr", MSGS_MEM_FAIL); N_VDestroy(ytemp); N_VDestroy(yptemp); N_VDestroy(xx); free(idaspils_mem); idaspils_mem = NULL; return(IDASPILS_MEM_FAIL); } /* Attach SPTFQMR memory to spils memory structure */ spils_mem = (void *)sptfqmr_mem; /* Attach linear solver memory to the integrator memory */ lmem = idaspils_mem; return(IDASPILS_SUCCESS); }