示例#1
0
/* Fortran interface to C routine ARKSptfqmr and it's associated 
   "set" routines; see farkode.h for further details */
void FARK_SPTFQMR(int *pretype, int *maxl, realtype *delt, int *ier) {

  *ier = ARKSptfqmr(ARK_arkodemem, *pretype, *maxl);
  if (*ier != ARKSPILS_SUCCESS) return;

  *ier = ARKSpilsSetEpsLin(ARK_arkodemem, *delt);
  if (*ier != ARKSPILS_SUCCESS) return;

  ARK_ls = ARK_LS_SPTFQMR;
  return;
}
示例#2
0
/* Fortran interface to C routine ARKPcg and it's associated 
   "set" routines; see farkode.h for further details */
void FARK_PCG(int *pretype, int *maxl, realtype *delt, int *ier) {

  *ier = ARKPcg(ARK_arkodemem, *pretype, *maxl);
  if (*ier != ARKSPILS_SUCCESS) return;

  *ier = ARKSpilsSetEpsLin(ARK_arkodemem, *delt);
  if (*ier != ARKSPILS_SUCCESS) return;

  ARK_ls = ARK_LS_PCG;
  return;
}
示例#3
0
/* Fortran interface to C "set" routines for the ARKSpfgmr solver; 
   see farkode.h for further details */
void FARK_SPFGMRREINIT(int *pretype, int *gstype, 
		       realtype *delt, int *ier) {

  *ier = ARKSpilsSetPrecType(ARK_arkodemem, *pretype);
  if (*ier != ARKSPILS_SUCCESS) return;

  *ier = ARKSpilsSetGSType(ARK_arkodemem, *gstype);
  if (*ier != ARKSPILS_SUCCESS) return;

  *ier = ARKSpilsSetEpsLin(ARK_arkodemem, *delt);
  if (*ier != ARKSPILS_SUCCESS) return;

  ARK_ls = ARK_LS_SPFGMR;
  return;
}
示例#4
0
/* Fortran interface to C "set" routines for the ARKSpbcg solver; 
   see farkode.h for further details */
void FARK_SPBCGREINIT(int *pretype, int *maxl, 
		      realtype *delt, int *ier) {

  *ier = ARKSpilsSetPrecType(ARK_arkodemem, *pretype);
  if (*ier != ARKSPILS_SUCCESS) return;

  *ier = ARKSpilsSetMaxl(ARK_arkodemem, *maxl);
  if (*ier != ARKSPILS_SUCCESS) return;

  *ier = ARKSpilsSetEpsLin(ARK_arkodemem, *delt);
  if (*ier != ARKSPILS_SUCCESS) return;

  ARK_ls = ARK_LS_SPBCG;
  return;
}
示例#5
0
int main()
{
  realtype abstol=ATOL, reltol=RTOL, t, tout;
  N_Vector c;
  WebData wdata;
  void *arkode_mem;
  booleantype firstrun;
  int jpre, gstype, flag;
  int ns, mxns, iout;

  c = NULL;
  wdata = NULL;
  arkode_mem = NULL;

  /* Initializations */
  c = N_VNew_Serial(NEQ);
  if(check_flag((void *)c, "N_VNew_Serial", 0)) return(1);
  wdata = AllocUserData();
  if(check_flag((void *)wdata, "AllocUserData", 2)) return(1);
  InitUserData(wdata);
  ns = wdata->ns;
  mxns = wdata->mxns;

  /* Print problem description */
  PrintIntro();

  /* Loop over jpre and gstype (four cases) */
  for (jpre = PREC_LEFT; jpre <= PREC_RIGHT; jpre++) {
    for (gstype = MODIFIED_GS; gstype <= CLASSICAL_GS; gstype++) {
      
      /* Initialize c and print heading */
      CInit(c, wdata);
      PrintHeader(jpre, gstype);

      /* Call ARKodeInit or ARKodeReInit, then ARKSpgmr to set up problem */
      
      firstrun = (jpre == PREC_LEFT) && (gstype == MODIFIED_GS);
      if (firstrun) {
        arkode_mem = ARKodeCreate();
        if(check_flag((void *)arkode_mem, "ARKodeCreate", 0)) return(1);

        wdata->arkode_mem = arkode_mem;

        flag = ARKodeSetUserData(arkode_mem, wdata);
        if(check_flag(&flag, "ARKodeSetUserData", 1)) return(1);

        flag = ARKodeInit(arkode_mem, NULL, f, T0, c);
        if(check_flag(&flag, "ARKodeInit", 1)) return(1);

        flag = ARKodeSStolerances(arkode_mem, reltol, abstol);
        if (check_flag(&flag, "ARKodeSStolerances", 1)) return(1);

	flag = ARKodeSetMaxNumSteps(arkode_mem, 1000);
	if (check_flag(&flag, "ARKodeSetMaxNumSteps", 1)) return(1);

	flag = ARKodeSetNonlinConvCoef(arkode_mem, 1.e-3);
	if (check_flag(&flag, "ARKodeSetNonlinConvCoef", 1)) return(1);

        flag = ARKSpgmr(arkode_mem, jpre, MAXL);
        if(check_flag(&flag, "ARKSpgmr", 1)) return(1);

        flag = ARKSpilsSetGSType(arkode_mem, gstype);
        if(check_flag(&flag, "ARKSpilsSetGSType", 1)) return(1);

        flag = ARKSpilsSetEpsLin(arkode_mem, DELT);
        if(check_flag(&flag, "ARKSpilsSetEpsLin", 1)) return(1);

        flag = ARKSpilsSetPreconditioner(arkode_mem, Precond, PSolve);
        if(check_flag(&flag, "ARKSpilsSetPreconditioner", 1)) return(1);

      } else {

        flag = ARKodeReInit(arkode_mem, NULL, f, T0, c);
        if(check_flag(&flag, "ARKodeReInit", 1)) return(1);

        flag = ARKSpilsSetPrecType(arkode_mem, jpre);
        check_flag(&flag, "ARKSpilsSetPrecType", 1);
        flag = ARKSpilsSetGSType(arkode_mem, gstype);
        if(check_flag(&flag, "ARKSpilsSetGSType", 1)) return(1);

      }
      
      /* Print initial values */
      if (firstrun) PrintAllSpecies(c, ns, mxns, T0);
      
      /* Loop over output points, call ARKode, print sample solution values. */
      tout = T1;
      for (iout = 1; iout <= NOUT; iout++) {
        flag = ARKode(arkode_mem, tout, c, &t, ARK_NORMAL);
        PrintOutput(arkode_mem, t);
        if (firstrun && (iout % 3 == 0)) PrintAllSpecies(c, ns, mxns, t);
        if(check_flag(&flag, "ARKode", 1)) break;
        if (tout > RCONST(0.9)) tout += DTOUT; else tout *= TOUT_MULT; 
      }
      
      /* Print final statistics, and loop for next case */
      PrintFinalStats(arkode_mem);
      
    }
  }

  /* Free all memory */
  ARKodeFree(&arkode_mem);
  N_VDestroy_Serial(c);
  FreeUserData(wdata);

  return(0);
}