void FIDA_BBDREINIT(long int *Nloc, long int *mudq, long int *mldq, realtype *dqrely, int *ier) { *ier = 0; *ier = IDABBDPrecReInit(IDA_idamem, *mudq, *mldq, *dqrely); return; }
/*-------------------------------------------------------------*/ int IDABBDPrecReInitB(void *ida_mem, int which, sunindextype mudqB, sunindextype mldqB, realtype dq_rel_yyB) { IDAMem IDA_mem; IDAadjMem IDAADJ_mem; IDABMem IDAB_mem; void *ida_memB; int flag; /* Check if ida_mem is allright. */ if (ida_mem == NULL) { IDAProcessError(NULL, IDALS_MEM_NULL, "IDASBBDPRE", "IDABBDPrecReInitB", MSG_LS_IDAMEM_NULL); return(IDALS_MEM_NULL); } IDA_mem = (IDAMem) ida_mem; /* Is ASA initialized? */ if (IDA_mem->ida_adjMallocDone == SUNFALSE) { IDAProcessError(IDA_mem, IDALS_NO_ADJ, "IDASBBDPRE", "IDABBDPrecReInitB", MSG_LS_NO_ADJ); return(IDALS_NO_ADJ); } IDAADJ_mem = IDA_mem->ida_adj_mem; /* Check the value of which */ if ( which >= IDAADJ_mem->ia_nbckpbs ) { IDAProcessError(IDA_mem, IDALS_ILL_INPUT, "IDASBBDPRE", "IDABBDPrecReInitB", MSG_LS_BAD_WHICH); return(IDALS_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' backward problem. */ ida_memB = (void *) IDAB_mem->IDA_mem; /* ReInitialize the BBD preconditioner for this backward problem. */ flag = IDABBDPrecReInit(ida_memB, mudqB, mldqB, dq_rel_yyB); return(flag); }
int main(int argc, char *argv[]) { MPI_Comm comm; void *mem; UserData data; int thispe, iout, ier, npes; long int Neq, local_N, mudq, mldq, mukeep, mlkeep; realtype rtol, atol, t0, t1, tout, tret; N_Vector uu, up, constraints, id, res; mem = NULL; data = NULL; uu = up = constraints = id = res = NULL; /* Get processor number and total number of pe's. */ MPI_Init(&argc, &argv); comm = MPI_COMM_WORLD; MPI_Comm_size(comm, &npes); MPI_Comm_rank(comm, &thispe); if (npes != NPEX*NPEY) { if (thispe == 0) fprintf(stderr, "\nMPI_ERROR(0): npes = %d is not equal to NPEX*NPEY = %d\n", npes,NPEX*NPEY); MPI_Finalize(); return(1); } /* Set local length local_N and global length Neq. */ local_N = MXSUB*MYSUB; Neq = MX * MY; /* Allocate N-vectors. */ uu = N_VNew_Parallel(comm, local_N, Neq); if(check_flag((void *)uu, "N_VNew_Parallel", 0, thispe)) MPI_Abort(comm, 1); up = N_VNew_Parallel(comm, local_N, Neq); if(check_flag((void *)up, "N_VNew_Parallel", 0, thispe)) MPI_Abort(comm, 1); res = N_VNew_Parallel(comm, local_N, Neq); if(check_flag((void *)res, "N_VNew_Parallel", 0, thispe)) MPI_Abort(comm, 1); constraints = N_VNew_Parallel(comm, local_N, Neq); if(check_flag((void *)constraints, "N_VNew_Parallel", 0, thispe)) MPI_Abort(comm, 1); id = N_VNew_Parallel(comm, local_N, Neq); if(check_flag((void *)id, "N_VNew_Parallel", 0, thispe)) MPI_Abort(comm, 1); /* Allocate and initialize the data structure. */ data = (UserData) malloc(sizeof *data); if(check_flag((void *)data, "malloc", 2, thispe)) MPI_Abort(comm, 1); InitUserData(thispe, comm, data); /* Initialize the uu, up, id, and constraints profiles. */ SetInitialProfile(uu, up, id, res, data); N_VConst(ONE, constraints); t0 = ZERO; t1 = RCONST(0.01); /* Scalar relative and absolute tolerance. */ rtol = ZERO; atol = RCONST(1.0e-3); /* Call IDACreate and IDAMalloc to initialize solution */ mem = IDACreate(); if(check_flag((void *)mem, "IDACreate", 0, thispe)) MPI_Abort(comm, 1); ier = IDASetUserData(mem, data); if(check_flag(&ier, "IDASetUserData", 1, thispe)) MPI_Abort(comm, 1); ier = IDASetSuppressAlg(mem, TRUE); if(check_flag(&ier, "IDASetSuppressAlg", 1, thispe)) MPI_Abort(comm, 1); ier = IDASetId(mem, id); if(check_flag(&ier, "IDASetId", 1, thispe)) MPI_Abort(comm, 1); ier = IDASetConstraints(mem, constraints); if(check_flag(&ier, "IDASetConstraints", 1, thispe)) MPI_Abort(comm, 1); N_VDestroy_Parallel(constraints); ier = IDAInit(mem, heatres, t0, uu, up); if(check_flag(&ier, "IDAInit", 1, thispe)) MPI_Abort(comm, 1); ier = IDASStolerances(mem, rtol, atol); if(check_flag(&ier, "IDASStolerances", 1, thispe)) MPI_Abort(comm, 1); mudq = MXSUB; mldq = MXSUB; mukeep = 1; mlkeep = 1; /* Print problem description */ if (thispe == 0 ) PrintHeader(Neq, rtol, atol); /* * ----------------------------- * Case 1 -- mldq = mudq = MXSUB * ----------------------------- */ /* Call IDASpgmr to specify the linear solver. */ ier = IDASpgmr(mem, 0); if(check_flag(&ier, "IDASpgmr", 1, thispe)) MPI_Abort(comm, 1); /* Call IDABBDPrecInit to initialize BBD preconditioner. */ ier = IDABBDPrecInit(mem, local_N, mudq, mldq, mukeep, mlkeep, ZERO, reslocal, NULL); if(check_flag(&ier, "IDABBDPrecAlloc", 1, thispe)) MPI_Abort(comm, 1); /* Print output heading (on processor 0 only) and initial solution. */ if (thispe == 0) PrintCase(1, mudq, mukeep); /* Loop over tout, call IDASolve, print output. */ for (tout = t1, iout = 1; iout <= NOUT; iout++, tout *= TWO) { ier = IDASolve(mem, tout, &tret, uu, up, IDA_NORMAL); if(check_flag(&ier, "IDASolve", 1, thispe)) MPI_Abort(comm, 1); PrintOutput(thispe, mem, tret, uu); } /* Print final statistics */ if (thispe == 0) PrintFinalStats(mem); /* * ----------------------------- * Case 2 -- mldq = mudq = 1 * ----------------------------- */ mudq = 1; mldq = 1; /* Re-initialize the uu and up profiles. */ SetInitialProfile(uu, up, id, res, data); /* Call IDAReInit to re-initialize IDA. */ ier = IDAReInit(mem, t0, uu, up); if(check_flag(&ier, "IDAReInit", 1, thispe)) MPI_Abort(comm, 1); /* Call IDABBDPrecReInit to re-initialize BBD preconditioner. */ ier = IDABBDPrecReInit(mem, mudq, mldq, ZERO); if(check_flag(&ier, "IDABBDPrecReInit", 1, thispe)) MPI_Abort(comm, 1); /* Print output heading (on processor 0 only). */ if (thispe == 0) PrintCase(2, mudq, mukeep); /* Loop over tout, call IDASolve, print output. */ for (tout = t1, iout = 1; iout <= NOUT; iout++, tout *= TWO) { ier = IDASolve(mem, tout, &tret, uu, up, IDA_NORMAL); if(check_flag(&ier, "IDASolve", 1, thispe)) MPI_Abort(comm, 1); PrintOutput(thispe, mem, tret, uu); } /* Print final statistics */ if (thispe == 0) PrintFinalStats(mem); /* Free Memory */ IDAFree(&mem); free(data); N_VDestroy_Parallel(id); N_VDestroy_Parallel(res); N_VDestroy_Parallel(up); N_VDestroy_Parallel(uu); MPI_Finalize(); return(0); }