static WebData AllocUserData(void) { int i, ngrp = NGRP, ns = NS; WebData wdata; wdata = (WebData) malloc(sizeof *wdata); for(i=0; i < ngrp; i++) { (wdata->P)[i] = newDenseMat(ns, ns); (wdata->pivot)[i] = newLintArray(ns); } wdata->rewt = N_VNew_Serial(NEQ+1); return(wdata); }
static UserData AllocUserData(void) { int jx, jy; UserData data; data = (UserData) malloc(sizeof *data); for (jx=0; jx < MX; jx++) { for (jy=0; jy < MY; jy++) { (data->P)[jx][jy] = newDenseMat(NUM_SPECIES, NUM_SPECIES); (data->Jbd)[jx][jy] = newDenseMat(NUM_SPECIES, NUM_SPECIES); (data->pivot)[jx][jy] = newLintArray(NUM_SPECIES); } } return(data); }
static UserData AllocUserData(void) { int jx, jz; UserData data; data = (UserData) malloc(sizeof *data); for (jx=0; jx < MX; jx++) { for (jz=0; jz < MZ; jz++) { (data->P)[jx][jz] = newDenseMat(NUM_SPECIES, NUM_SPECIES); (data->Jbd)[jx][jz] = newDenseMat(NUM_SPECIES, NUM_SPECIES); (data->pivot)[jx][jz] = newLintArray(NUM_SPECIES); } } data->p = (realtype *) malloc(NP*sizeof(realtype)); return(data); }
static UserData AllocUserData(void) { int jx, jy; UserData data; data = (UserData) malloc(sizeof *data); for (jx=0; jx < MX; jx++) { for (jy=0; jy < MY; jy++) { (data->P)[jx][jy] = newDenseMat(NUM_SPECIES, NUM_SPECIES); (data->pivot)[jx][jy] = newLintArray(NUM_SPECIES); } } acoef = newDenseMat(NUM_SPECIES, NUM_SPECIES); bcoef = (realtype *)malloc(NUM_SPECIES * sizeof(realtype)); cox = (realtype *)malloc(NUM_SPECIES * sizeof(realtype)); coy = (realtype *)malloc(NUM_SPECIES * sizeof(realtype)); return(data); }
static UserData AllocUserData(MPI_Comm comm, long int local_N, long int SystemSize) { int ix, jy; UserData webdata; webdata = (UserData) malloc(sizeof *webdata); webdata->rates = N_VNew_Parallel(comm, local_N, SystemSize); for (ix = 0; ix < MXSUB; ix++) { for (jy = 0; jy < MYSUB; jy++) { (webdata->PP)[ix][jy] = newDenseMat(NUM_SPECIES, NUM_SPECIES); (webdata->pivot)[ix][jy] = newLintArray(NUM_SPECIES); } } webdata->acoef = newDenseMat(NUM_SPECIES, NUM_SPECIES); webdata->ewt = N_VNew_Parallel(comm, local_N, SystemSize); return(webdata); }
/* Load constants in data */ static void InitUserData(int my_pe, MPI_Comm comm, UserData data) { int isubx, isuby; int lx, ly; /* Set problem constants */ data->om = PI/HALFDAY; data->dx = (XMAX-XMIN)/((realtype)(MX-1)); data->dy = (YMAX-YMIN)/((realtype)(MY-1)); data->hdco = KH/SUNSQR(data->dx); data->haco = VEL/(RCONST(2.0)*data->dx); data->vdco = (RCONST(1.0)/SUNSQR(data->dy))*KV0; /* Set machine-related constants */ data->comm = comm; data->my_pe = my_pe; /* isubx and isuby are the PE grid indices corresponding to my_pe */ isuby = my_pe/NPEX; isubx = my_pe - isuby*NPEX; data->isubx = isubx; data->isuby = isuby; /* Set the sizes of a boundary x-line in u and uext */ data->nvmxsub = NVARS*MXSUB; data->nvmxsub2 = NVARS*(MXSUB+2); /* Preconditioner-related fields */ for (lx = 0; lx < MXSUB; lx++) { for (ly = 0; ly < MYSUB; ly++) { (data->P)[lx][ly] = newDenseMat(NVARS, NVARS); (data->Jbd)[lx][ly] = newDenseMat(NVARS, NVARS); (data->pivot)[lx][ly] = newLintArray(NVARS); } } }
int main() { void *mem; UserData webdata; N_Vector cc, cp, id; int iout, jx, jy, flag; long int maxl; realtype rtol, atol, t0, tout, tret; mem = NULL; webdata = NULL; cc = cp = id = NULL; /* Allocate and initialize user data block webdata. */ webdata = (UserData) malloc(sizeof *webdata); webdata->rates = N_VNew_Serial(NEQ); webdata->acoef = newDenseMat(NUM_SPECIES, NUM_SPECIES); webdata->ewt = N_VNew_Serial(NEQ); for (jx = 0; jx < MX; jx++) { for (jy = 0; jy < MY; jy++) { (webdata->pivot)[jx][jy] = newLintArray(NUM_SPECIES); (webdata->PP)[jx][jy] = newDenseMat(NUM_SPECIES, NUM_SPECIES); } } InitUserData(webdata); /* Allocate N-vectors and initialize cc, cp, and id. */ cc = N_VNew_Serial(NEQ); if(check_flag((void *)cc, "N_VNew_Serial", 0)) return(1); cp = N_VNew_Serial(NEQ); if(check_flag((void *)cp, "N_VNew_Serial", 0)) return(1); id = N_VNew_Serial(NEQ); if(check_flag((void *)id, "N_VNew_Serial", 0)) return(1); SetInitialProfiles(cc, cp, id, webdata); /* Set remaining inputs to IDAMalloc. */ t0 = ZERO; rtol = RTOL; atol = ATOL; /* Call IDACreate and IDAMalloc to initialize IDA. */ mem = IDACreate(); if(check_flag((void *)mem, "IDACreate", 0)) return(1); flag = IDASetUserData(mem, webdata); if(check_flag(&flag, "IDASetUserData", 1)) return(1); flag = IDASetId(mem, id); if(check_flag(&flag, "IDASetId", 1)) return(1); flag = IDAInit(mem, resweb, t0, cc, cp); if(check_flag(&flag, "IDAInit", 1)) return(1); flag = IDASStolerances(mem, rtol, atol); if(check_flag(&flag, "IDASStolerances", 1)) return(1); webdata->ida_mem = mem; /* Call IDASpgmr to specify the IDA linear solver. */ maxl = 16; /* max dimension of the Krylov subspace */ flag = IDASpgmr(mem, maxl); if(check_flag(&flag, "IDASpgmr", 1)) return(1); flag = IDASpilsSetPreconditioner(mem, Precond, PSolve); if(check_flag(&flag, "IDASpilsSetPreconditioner", 1)) return(1); /* Call IDACalcIC (with default options) to correct the initial values. */ tout = RCONST(0.001); flag = IDACalcIC(mem, IDA_YA_YDP_INIT, tout); if(check_flag(&flag, "IDACalcIC", 1)) return(1); /* Print heading, basic parameters, and initial values. */ PrintHeader(maxl, rtol, atol); PrintOutput(mem, cc, ZERO); /* Loop over iout, call IDASolve (normal mode), print selected output. */ for (iout = 1; iout <= NOUT; iout++) { flag = IDASolve(mem, tout, &tret, cc, cp, IDA_NORMAL); if(check_flag(&flag, "IDASolve", 1)) return(flag); PrintOutput(mem, cc, tret); if (iout < 3) tout *= TMULT; else tout += TADD; } /* Print final statistics and free memory. */ PrintFinalStats(mem); /* Free memory */ IDAFree(&mem); N_VDestroy_Serial(cc); N_VDestroy_Serial(cp); N_VDestroy_Serial(id); destroyMat(webdata->acoef); N_VDestroy_Serial(webdata->rates); N_VDestroy_Serial(webdata->ewt); for (jx = 0; jx < MX; jx++) { for (jy = 0; jy < MY; jy ++) { destroyArray((webdata->pivot)[jx][jy]); destroyMat((webdata->PP)[jx][jy]); } } free(webdata); return(0); }