SUNLinearSolver SUNSPBCGS(N_Vector y, int pretype, int maxl) { return(SUNLinSol_SPBCGS(y, pretype, maxl)); }
int main(void) { realtype abstol, reltol, t, tout; N_Vector u; UserData data; SUNLinearSolver LS; void *cvode_mem; int linsolver, iout, retval; u = NULL; data = NULL; LS = NULL; cvode_mem = NULL; /* Allocate memory, and set problem data, initial values, tolerances */ u = N_VNew_Serial(NEQ); if(check_retval((void *)u, "N_VNew_Serial", 0)) return(1); data = AllocUserData(); if(check_retval((void *)data, "AllocUserData", 2)) return(1); InitUserData(data); SetInitialProfiles(u, data->dx, data->dy); abstol=ATOL; reltol=RTOL; /* Call CVodeCreate to create the solver memory and specify the * Backward Differentiation Formula */ cvode_mem = CVodeCreate(CV_BDF); if(check_retval((void *)cvode_mem, "CVodeCreate", 0)) return(1); /* Set the pointer to user-defined data */ retval = CVodeSetUserData(cvode_mem, data); if(check_retval(&retval, "CVodeSetUserData", 1)) return(1); /* Call CVodeInit to initialize the integrator memory and specify the * user's right hand side function in u'=f(t,u), the inital time T0, and * the initial dependent variable vector u. */ retval = CVodeInit(cvode_mem, f, T0, u); if(check_retval(&retval, "CVodeInit", 1)) return(1); /* Call CVodeSStolerances to specify the scalar relative tolerance * and scalar absolute tolerances */ retval = CVodeSStolerances(cvode_mem, reltol, abstol); if (check_retval(&retval, "CVodeSStolerances", 1)) return(1); /* START: Loop through SPGMR, SPBCG and SPTFQMR linear solver modules */ for (linsolver = 0; linsolver < 3; ++linsolver) { if (linsolver != 0) { /* Re-initialize user data */ InitUserData(data); SetInitialProfiles(u, data->dx, data->dy); /* Re-initialize CVode for the solution of the same problem, but using a different linear solver module */ retval = CVodeReInit(cvode_mem, T0, u); if (check_retval(&retval, "CVodeReInit", 1)) return(1); } /* Free previous linear solver and attach a new linear solver module */ SUNLinSolFree(LS); switch(linsolver) { /* (a) SPGMR */ case(USE_SPGMR): /* Print header */ printf(" -------"); printf(" \n| SPGMR |\n"); printf(" -------\n"); /* Call SUNLinSol_SPGMR to specify the linear solver SPGMR with left preconditioning and the default maximum Krylov dimension */ LS = SUNLinSol_SPGMR(u, PREC_LEFT, 0); if(check_retval((void *)LS, "SUNLinSol_SPGMR", 0)) return(1); retval = CVodeSetLinearSolver(cvode_mem, LS, NULL); if(check_retval(&retval, "CVodeSetLinearSolver", 1)) return 1; break; /* (b) SPBCG */ case(USE_SPBCG): /* Print header */ printf(" -------"); printf(" \n| SPBCGS |\n"); printf(" -------\n"); /* Call SUNLinSol_SPBCGS to specify the linear solver SPBCGS with left preconditioning and the default maximum Krylov dimension */ LS = SUNLinSol_SPBCGS(u, PREC_LEFT, 0); if(check_retval((void *)LS, "SUNLinSol_SPBCGS", 0)) return(1); retval = CVodeSetLinearSolver(cvode_mem, LS, NULL); if(check_retval(&retval, "CVodeSetLinearSolver", 1)) return 1; break; /* (c) SPTFQMR */ case(USE_SPTFQMR): /* Print header */ printf(" ---------"); printf(" \n| SPTFQMR |\n"); printf(" ---------\n"); /* Call SUNLinSol_SPTFQMR to specify the linear solver SPTFQMR with left preconditioning and the default maximum Krylov dimension */ LS = SUNLinSol_SPTFQMR(u, PREC_LEFT, 0); if(check_retval((void *)LS, "SUNLinSol_SPTFQMR", 0)) return(1); retval = CVodeSetLinearSolver(cvode_mem, LS, NULL); if(check_retval(&retval, "CVodeSetLinearSolver", 1)) return 1; break; } /* Set preconditioner setup and solve routines Precond and PSolve, and the pointer to the user-defined block data */ retval = CVodeSetPreconditioner(cvode_mem, Precond, PSolve); if(check_retval(&retval, "CVodeSetPreconditioner", 1)) return(1); /* In loop over output points, call CVode, print results, test for error */ printf(" \n2-species diurnal advection-diffusion problem\n\n"); for (iout=1, tout = TWOHR; iout <= NOUT; iout++, tout += TWOHR) { retval = CVode(cvode_mem, tout, u, &t, CV_NORMAL); PrintOutput(cvode_mem, u, t); if(check_retval(&retval, "CVode", 1)) break; } PrintFinalStats(cvode_mem, linsolver); } /* END: Loop through SPGMR, SPBCG and SPTFQMR linear solver modules */ /* Free memory */ N_VDestroy(u); FreeUserData(data); CVodeFree(&cvode_mem); SUNLinSolFree(LS); return(0); }