int IDABBDSptfqmr(void *ida_mem, int maxl, void *bbd_data) { IDAMem IDA_mem; int flag; flag = IDASptfqmr(ida_mem, maxl); if(flag != IDASPILS_SUCCESS) return(flag); IDA_mem = (IDAMem) ida_mem; if (bbd_data == NULL) { IDAProcessError(IDA_mem, IDABBDPRE_PDATA_NULL, "IDABBDPRE", "IDABBDSptfqmr", MSGBBD_PDATA_NULL); return(IDABBDPRE_PDATA_NULL); } flag = IDASpilsSetPreconditioner(ida_mem, IDABBDPrecSetup, IDABBDPrecSolve, bbd_data); if(flag != IDASPILS_SUCCESS) return(flag); return(IDASPILS_SUCCESS); }
void FIDA_SPTFQMR(int *maxl, realtype *eplifac, realtype *dqincfac, int *ier) { *ier = 0; *ier = IDASptfqmr(IDA_idamem, *maxl); if (*ier != IDASPILS_SUCCESS) return; if (*eplifac != ZERO) { *ier = IDASpilsSetEpsLin(IDA_idamem, *eplifac); if (*ier != IDASPILS_SUCCESS) return; } if (*dqincfac != ZERO) { *ier = IDASpilsSetIncrementFactor(IDA_idamem, *dqincfac); if (*ier != IDASPILS_SUCCESS) return; } IDA_ls = IDA_LS_SPTFQMR; return; }
CAMLprim value sundials_ml_ida_sptfqmr(value ida_solver, value maxl) { CAMLparam2(ida_solver, maxl); const int ret = IDASptfqmr(IDA_MEM(ida_solver), Int_val(maxl)); CAMLreturn(Val_int(ret)); }
int IDASptfqmrB(void *ida_mem, int which, int maxlB) { IDAMem IDA_mem; IDAadjMem IDAADJ_mem; IDABMem IDAB_mem; IDASpilsMemB idaspilsB_mem; void *ida_memB; int flag; /* Check if ida_mem is allright. */ if (ida_mem == NULL) { IDAProcessError(NULL, IDASPILS_MEM_NULL, "IDASPTFQMR", "IDASptfqmrB", MSGS_IDAMEM_NULL); return(IDASPILS_MEM_NULL); } IDA_mem = (IDAMem) ida_mem; /* Is ASA initialized? */ if (IDA_mem->ida_adjMallocDone == FALSE) { IDAProcessError(IDA_mem, IDASPILS_NO_ADJ, "IDASPTFQMR", "IDASptfqmrB", MSGS_NO_ADJ); return(IDASPILS_NO_ADJ); } IDAADJ_mem = IDA_mem->ida_adj_mem; /* Check the value of which */ if ( which >= IDAADJ_mem->ia_nbckpbs ) { IDAProcessError(IDA_mem, IDASPILS_ILL_INPUT, "IDASPTFQMR", "IDASptfqmrB", MSGS_BAD_WHICH); return(IDASPILS_ILL_INPUT); } /* Find the IDABMem entry in the linked list corresponding to 'which'. */ IDAB_mem = IDAADJ_mem->IDAB_mem; while (IDAB_mem != NULL) { if( which == IDAB_mem->ida_index ) break; /* advance */ IDAB_mem = IDAB_mem->ida_next; } /* ida_mem corresponding to 'which' problem. */ ida_memB = (void *) IDAB_mem->IDA_mem; /* Get memory for IDASpilsMemRecB */ idaspilsB_mem = NULL; idaspilsB_mem = (IDASpilsMemB) malloc(sizeof(struct IDASpilsMemRecB)); if (idaspilsB_mem == NULL) { IDAProcessError(IDA_mem, IDASPILS_MEM_FAIL, "IDASPTFQMR", "IDASptfqmrB", MSGS_MEM_FAIL); return(IDASPILS_MEM_FAIL); } idaspilsB_mem->s_psetB = NULL; idaspilsB_mem->s_psolveB = NULL; idaspilsB_mem->s_P_dataB = NULL; /* initialize Jacobian function */ idaspilsB_mem->s_jtimesB = NULL; /* attach lmem and lfree */ IDAB_mem->ida_lmem = idaspilsB_mem; IDAB_mem->ida_lfree = IDASptfqmrFreeB; flag = IDASptfqmr(IDAB_mem->IDA_mem, maxlB); if (flag != IDASPILS_SUCCESS) { free(idaspilsB_mem); idaspilsB_mem = NULL; } return(flag); }