Skip to content

Commit

Permalink
revert change to bound factor
Browse files Browse the repository at this point in the history
  • Loading branch information
gardner48 committed Jul 12, 2023
1 parent 6f12a96 commit 79f3ea5
Show file tree
Hide file tree
Showing 10 changed files with 187 additions and 73 deletions.
6 changes: 4 additions & 2 deletions include/arkode/arkode_arkstep.h
Original file line number Diff line number Diff line change
Expand Up @@ -478,10 +478,10 @@ SUNDIALS_EXPORT int ARKStepCreateMRIStepInnerStepper(void *arkode_mem,
/* Relaxation functions */
SUNDIALS_EXPORT int ARKStepSetRelaxFn(void* arkode_mem, ARKRelaxFn rfn,
ARKRelaxJacFn rjac);
SUNDIALS_EXPORT int ARKStepSetRelaxBoundFactor(void* arkode_mem,
sunrealtype bound_factor);
SUNDIALS_EXPORT int ARKStepSetRelaxEtaFail(void* arkode_mem,
sunrealtype eta_rf);
SUNDIALS_EXPORT int ARKStepSetRelaxLowerBound(void* arkode_mem,
sunrealtype lower);
SUNDIALS_EXPORT int ARKStepSetRelaxMaxFails(void* arkode_mem, int max_fails);
SUNDIALS_EXPORT int ARKStepSetRelaxMaxIters(void* arkode_mem, int max_iters);
SUNDIALS_EXPORT int ARKStepSetRelaxSolver(void* arkode_mem,
Expand All @@ -490,6 +490,8 @@ SUNDIALS_EXPORT int ARKStepSetRelaxResTol(void* arkode_mem,
sunrealtype res_tol);
SUNDIALS_EXPORT int ARKStepSetRelaxTol(void* arkode_mem, sunrealtype rel_tol,
sunrealtype abs_tol);
SUNDIALS_EXPORT int ARKStepSetRelaxUpperBound(void* arkode_mem,
sunrealtype upper);
SUNDIALS_EXPORT int ARKStepGetNumRelaxFnEvals(void* arkode_mem,
long int* r_evals);
SUNDIALS_EXPORT int ARKStepGetNumRelaxJacEvals(void* arkode_mem,
Expand Down
6 changes: 4 additions & 2 deletions include/arkode/arkode_erkstep.h
Original file line number Diff line number Diff line change
Expand Up @@ -265,10 +265,10 @@ SUNDIALS_EXPORT void ERKStepPrintMem(void* arkode_mem, FILE* outfile);
/* Relaxation functions */
SUNDIALS_EXPORT int ERKStepSetRelaxFn(void* arkode_mem, ARKRelaxFn rfn,
ARKRelaxJacFn rjac);
SUNDIALS_EXPORT int ERKStepSetRelaxBoundFactor(void* arkode_mem,
sunrealtype bound_factor);
SUNDIALS_EXPORT int ERKStepSetRelaxEtaFail(void* arkode_mem,
sunrealtype eta_rf);
SUNDIALS_EXPORT int ERKStepSetRelaxLowerBound(void* arkode_mem,
sunrealtype lower);
SUNDIALS_EXPORT int ERKStepSetRelaxMaxFails(void* arkode_mem, int max_fails);
SUNDIALS_EXPORT int ERKStepSetRelaxMaxIters(void* arkode_mem, int max_iters);
SUNDIALS_EXPORT int ERKStepSetRelaxSolver(void* arkode_mem,
Expand All @@ -277,6 +277,8 @@ SUNDIALS_EXPORT int ERKStepSetRelaxResTol(void* arkode_mem,
sunrealtype res_tol);
SUNDIALS_EXPORT int ERKStepSetRelaxTol(void* arkode_mem, sunrealtype rel_tol,
sunrealtype abs_tol);
SUNDIALS_EXPORT int ERKStepSetRelaxUpperBound(void* arkode_mem,
sunrealtype upper);
SUNDIALS_EXPORT int ERKStepGetNumRelaxFnEvals(void* arkode_mem,
long int* r_evals);
SUNDIALS_EXPORT int ERKStepGetNumRelaxJacEvals(void* arkode_mem,
Expand Down
13 changes: 9 additions & 4 deletions src/arkode/arkode_arkstep_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -272,14 +272,14 @@ int ARKStepSetRelaxFn(void* arkode_mem, ARKRelaxFn rfn, ARKRelaxJacFn rjac)
arkStep_RelaxDeltaE, arkStep_GetOrder);
}

int ARKStepSetRelaxBoundFactor(void* arkode_mem, sunrealtype bound_factor)
int ARKStepSetRelaxEtaFail(void* arkode_mem, sunrealtype eta_rf)
{
return arkRelaxSetBoundFactor(arkode_mem, bound_factor);
return arkRelaxSetEtaFail(arkode_mem, eta_rf);
}

int ARKStepSetRelaxEtaFail(void* arkode_mem, sunrealtype eta_rf)
int ARKStepSetRelaxLowerBound(void* arkode_mem, sunrealtype lower)
{
return arkRelaxSetEtaFail(arkode_mem, eta_rf);
return arkRelaxSetLowerBound(arkode_mem, lower);
}

int ARKStepSetRelaxMaxFails(void* arkode_mem, int max_fails)
Expand Down Expand Up @@ -308,6 +308,11 @@ int ARKStepSetRelaxTol(void* arkode_mem, sunrealtype rel_tol,
return arkRelaxSetTol(arkode_mem, rel_tol, abs_tol);
}

int ARKStepSetRelaxUpperBound(void* arkode_mem, sunrealtype upper)
{
return arkRelaxSetUpperBound(arkode_mem, upper);
}

int ARKStepGetNumRelaxFnEvals(void* arkode_mem, long int* r_evals)
{
return arkRelaxGetNumRelaxFnEvals(arkode_mem, r_evals);
Expand Down
13 changes: 9 additions & 4 deletions src/arkode/arkode_erkstep_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -163,14 +163,14 @@ int ERKStepSetRelaxFn(void* arkode_mem, ARKRelaxFn rfn, ARKRelaxJacFn rjac)
erkStep_RelaxDeltaE, erkStep_GetOrder);
}

int ERKStepSetRelaxBoundFactor(void* arkode_mem, sunrealtype bound_factor)
int ERKStepSetRelaxEtaFail(void* arkode_mem, sunrealtype eta_rf)
{
return arkRelaxSetBoundFactor(arkode_mem, bound_factor);
return arkRelaxSetEtaFail(arkode_mem, eta_rf);
}

int ERKStepSetRelaxEtaFail(void* arkode_mem, sunrealtype eta_rf)
int ERKStepSetRelaxLowerBound(void* arkode_mem, sunrealtype lower)
{
return arkRelaxSetEtaFail(arkode_mem, eta_rf);
return arkRelaxSetLowerBound(arkode_mem, lower);
}

int ERKStepSetRelaxMaxFails(void* arkode_mem, int max_fails)
Expand Down Expand Up @@ -199,6 +199,11 @@ int ERKStepSetRelaxTol(void* arkode_mem, sunrealtype rel_tol,
return arkRelaxSetTol(arkode_mem, rel_tol, abs_tol);
}

int ERKStepSetRelaxUpperBound(void* arkode_mem, sunrealtype upper)
{
return arkRelaxSetUpperBound(arkode_mem, upper);
}

int ERKStepGetNumRelaxFnEvals(void* arkode_mem, long int* r_evals)
{
return arkRelaxGetNumRelaxFnEvals(arkode_mem, r_evals);
Expand Down
53 changes: 35 additions & 18 deletions src/arkode/arkode_relaxation.c
Original file line number Diff line number Diff line change
Expand Up @@ -376,8 +376,8 @@ int arkRelaxSolve(ARKodeMem ark_mem, ARKodeRelaxMem relax_mem,
}

/* Check for bad relaxation value */
if (SUNRabs(relax_mem->relax_param - ONE) >
relax_mem->bound_factor * SUNRabs(ark_mem->h))
if (ark_mem->relax_mem->relax_param < relax_mem->lower_bound ||
ark_mem->relax_mem->relax_param > relax_mem->upper_bound)
{
relax_mem->bound_fails++;
return ARK_RELAX_SOLVE_RECV;
Expand All @@ -400,34 +400,34 @@ int arkRelaxSolve(ARKodeMem ark_mem, ARKodeRelaxMem relax_mem,
* Set functions
* ---------------------------------------------------------------------------*/

int arkRelaxSetBoundFactor(void* arkode_mem, sunrealtype bound_factor)
int arkRelaxSetEtaFail(void* arkode_mem, sunrealtype eta_fail)
{
int retval;
ARKodeMem ark_mem;
ARKodeRelaxMem relax_mem;

retval = arkRelaxAccessMem(arkode_mem, "arkRelaxSetBoundFactor", &ark_mem,
retval = arkRelaxAccessMem(arkode_mem, "arkRelaxSetEtaFail", &ark_mem,
&relax_mem);
if (retval) return retval;

if (bound_factor > ZERO) { relax_mem->bound_factor = bound_factor; }
else { relax_mem->bound_factor = ARK_RELAX_DEFAULT_BOUND_FACTOR; }
if (eta_fail > ZERO && eta_fail < ONE) { relax_mem->eta_fail = eta_fail; }
else { relax_mem->eta_fail = ARK_RELAX_DEFAULT_ETA_FAIL; }

return ARK_SUCCESS;
}

int arkRelaxSetEtaFail(void* arkode_mem, sunrealtype eta_fail)
int arkRelaxSetLowerBound(void* arkode_mem, sunrealtype lower)
{
int retval;
ARKodeMem ark_mem;
ARKodeRelaxMem relax_mem;

retval = arkRelaxAccessMem(arkode_mem, "arkRelaxSetEtaFail", &ark_mem,
retval = arkRelaxAccessMem(arkode_mem, "arkRelaxSetLowerBound", &ark_mem,
&relax_mem);
if (retval) return retval;

if (eta_fail > ZERO && eta_fail < ONE) { relax_mem->eta_fail = eta_fail; }
else { relax_mem->eta_fail = ARK_RELAX_DEFAULT_ETA_FAIL; }
if (lower > ZERO && lower < ONE) { relax_mem->lower_bound = lower; }
else { relax_mem->lower_bound = ARK_RELAX_DEFAULT_LOWER_BOUND; }

return ARK_SUCCESS;
}
Expand Down Expand Up @@ -521,6 +521,22 @@ int arkRelaxSetTol(void* arkode_mem, sunrealtype rel_tol, sunrealtype abs_tol)
return ARK_SUCCESS;
}

int arkRelaxSetUpperBound(void* arkode_mem, sunrealtype upper)
{
int retval;
ARKodeMem ark_mem;
ARKodeRelaxMem relax_mem;

retval = arkRelaxAccessMem(arkode_mem, "arkRelaxSetUpperBound", &ark_mem,
&relax_mem);
if (retval) return retval;

if (upper > ONE) { relax_mem->upper_bound = upper; }
else { relax_mem->upper_bound = ARK_RELAX_DEFAULT_UPPER_BOUND; }

return ARK_SUCCESS;
}

/* -----------------------------------------------------------------------------
* Get functions
* ---------------------------------------------------------------------------*/
Expand Down Expand Up @@ -713,14 +729,15 @@ int arkRelaxCreate(void* arkode_mem, ARKRelaxFn relax_fn,
memset(ark_mem->relax_mem, 0, sizeof(struct ARKodeRelaxMemRec));

/* Set defaults */
ark_mem->relax_mem->max_fails = ARK_RELAX_DEFAULT_MAX_FAILS;
ark_mem->relax_mem->bound_factor = ARK_RELAX_DEFAULT_BOUND_FACTOR;
ark_mem->relax_mem->eta_fail = ARK_RELAX_DEFAULT_ETA_FAIL;
ark_mem->relax_mem->solver = ARK_RELAX_NEWTON;
ark_mem->relax_mem->res_tol = ARK_RELAX_DEFAULT_RES_TOL;
ark_mem->relax_mem->rel_tol = ARK_RELAX_DEFAULT_REL_TOL;
ark_mem->relax_mem->abs_tol = ARK_RELAX_DEFAULT_ABS_TOL;
ark_mem->relax_mem->max_iters = ARK_RELAX_DEFAULT_MAX_ITERS;
ark_mem->relax_mem->max_fails = ARK_RELAX_DEFAULT_MAX_FAILS;
ark_mem->relax_mem->lower_bound = ARK_RELAX_DEFAULT_LOWER_BOUND;
ark_mem->relax_mem->upper_bound = ARK_RELAX_DEFAULT_UPPER_BOUND;
ark_mem->relax_mem->eta_fail = ARK_RELAX_DEFAULT_ETA_FAIL;
ark_mem->relax_mem->solver = ARK_RELAX_NEWTON;
ark_mem->relax_mem->res_tol = ARK_RELAX_DEFAULT_RES_TOL;
ark_mem->relax_mem->rel_tol = ARK_RELAX_DEFAULT_REL_TOL;
ark_mem->relax_mem->abs_tol = ARK_RELAX_DEFAULT_ABS_TOL;
ark_mem->relax_mem->max_iters = ARK_RELAX_DEFAULT_MAX_ITERS;

/* Initialize values */
ark_mem->relax_mem->relax_param_prev = ONE;
Expand Down
21 changes: 12 additions & 9 deletions src/arkode/arkode_relaxation_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,14 @@
* Relaxation Constants
* ---------------------------------------------------------------------------*/

#define ARK_RELAX_DEFAULT_MAX_FAILS 10
#define ARK_RELAX_DEFAULT_RES_TOL (4 * SUN_UNIT_ROUNDOFF)
#define ARK_RELAX_DEFAULT_REL_TOL (4 * SUN_UNIT_ROUNDOFF)
#define ARK_RELAX_DEFAULT_ABS_TOL SUN_RCONST(1.0e-14)
#define ARK_RELAX_DEFAULT_MAX_ITERS 10
#define ARK_RELAX_DEFAULT_BOUND_FACTOR SUN_RCONST(0.5)
#define ARK_RELAX_DEFAULT_ETA_FAIL SUN_RCONST(0.25)
#define ARK_RELAX_DEFAULT_MAX_FAILS 10
#define ARK_RELAX_DEFAULT_RES_TOL (4 * SUN_UNIT_ROUNDOFF)
#define ARK_RELAX_DEFAULT_REL_TOL (4 * SUN_UNIT_ROUNDOFF)
#define ARK_RELAX_DEFAULT_ABS_TOL SUN_RCONST(1.0e-14)
#define ARK_RELAX_DEFAULT_MAX_ITERS 10
#define ARK_RELAX_DEFAULT_LOWER_BOUND SUN_RCONST(0.8)
#define ARK_RELAX_DEFAULT_UPPER_BOUND SUN_RCONST(1.2)
#define ARK_RELAX_DEFAULT_ETA_FAIL SUN_RCONST(0.25)

/* -----------------------------------------------------------------------------
* Relaxation Private Return Values (see arkode/arkode.h for public values)
Expand Down Expand Up @@ -83,7 +84,8 @@ struct ARKodeRelaxMemRec
sunrealtype jac; /* relaxation Jacobian value */
sunrealtype relax_param; /* current relaxation parameter value */
sunrealtype relax_param_prev; /* previous relaxation parameter value */
sunrealtype bound_factor; /* relax param acceptance threshold */
sunrealtype lower_bound; /* smallest allowed relaxation value */
sunrealtype upper_bound; /* largest allowed relaxation value */
sunrealtype eta_fail; /* failed relaxation step size factor */

/* nonlinear solver settings */
Expand Down Expand Up @@ -111,13 +113,14 @@ int arkRelax(ARKodeMem ark_mem, int* relax_fails, sunrealtype* dsm_inout,
int* nflag_out);

/* User Functions */
int arkRelaxSetBoundFactor(void* arkode_mem, sunrealtype bound_factor);
int arkRelaxSetEtaFail(void* arkode_mem, sunrealtype eta_fail);
int arkRelaxSetLowerBound(void* arkode_mem, sunrealtype lower);
int arkRelaxSetMaxFails(void* arkode_mem, int max_fails);
int arkRelaxSetMaxIters(void* arkode_mem, int max_iters);
int arkRelaxSetSolver(void* arkode_mem, ARKRelaxSolver solver);
int arkRelaxSetResTol(void* arkode_mem, sunrealtype res_tol);
int arkRelaxSetTol(void* arkode_mem, sunrealtype rel_tol, sunrealtype abs_tol);
int arkRelaxSetUpperBound(void* arkode_mem, sunrealtype upper);

int arkRelaxGetNumRelaxFnEvals(void* arkode_mem, long int* r_evals);
int arkRelaxGetNumRelaxJacEvals(void* arkode_mem, long int* j_evals);
Expand Down
22 changes: 18 additions & 4 deletions src/arkode/fmod/farkode_arkstep_mod.c
Original file line number Diff line number Diff line change
Expand Up @@ -2475,29 +2475,29 @@ SWIGEXPORT int _wrap_FARKStepSetRelaxFn(void *farg1, ARKRelaxFn farg2, ARKRelaxJ
}


SWIGEXPORT int _wrap_FARKStepSetRelaxBoundFactor(void *farg1, double const *farg2) {
SWIGEXPORT int _wrap_FARKStepSetRelaxEtaFail(void *farg1, double const *farg2) {
int fresult ;
void *arg1 = (void *) 0 ;
sunrealtype arg2 ;
int result;

arg1 = (void *)(farg1);
arg2 = (sunrealtype)(*farg2);
result = (int)ARKStepSetRelaxBoundFactor(arg1,arg2);
result = (int)ARKStepSetRelaxEtaFail(arg1,arg2);
fresult = (int)(result);
return fresult;
}


SWIGEXPORT int _wrap_FARKStepSetRelaxEtaFail(void *farg1, double const *farg2) {
SWIGEXPORT int _wrap_FARKStepSetRelaxLowerBound(void *farg1, double const *farg2) {
int fresult ;
void *arg1 = (void *) 0 ;
sunrealtype arg2 ;
int result;

arg1 = (void *)(farg1);
arg2 = (sunrealtype)(*farg2);
result = (int)ARKStepSetRelaxEtaFail(arg1,arg2);
result = (int)ARKStepSetRelaxLowerBound(arg1,arg2);
fresult = (int)(result);
return fresult;
}
Expand Down Expand Up @@ -2575,6 +2575,20 @@ SWIGEXPORT int _wrap_FARKStepSetRelaxTol(void *farg1, double const *farg2, doubl
}


SWIGEXPORT int _wrap_FARKStepSetRelaxUpperBound(void *farg1, double const *farg2) {
int fresult ;
void *arg1 = (void *) 0 ;
sunrealtype arg2 ;
int result;

arg1 = (void *)(farg1);
arg2 = (sunrealtype)(*farg2);
result = (int)ARKStepSetRelaxUpperBound(arg1,arg2);
fresult = (int)(result);
return fresult;
}


SWIGEXPORT int _wrap_FARKStepGetNumRelaxFnEvals(void *farg1, long *farg2) {
int fresult ;
void *arg1 = (void *) 0 ;
Expand Down
Loading

0 comments on commit 79f3ea5

Please sign in to comment.