Skip to content

Commit

Permalink
Added function pointer for stepper-specific setfromcommandline functi…
Browse files Browse the repository at this point in the history
…ons (none are implemented yet)
  • Loading branch information
drreynolds committed Feb 27, 2025
1 parent 44abb69 commit d65c219
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 57 deletions.
1 change: 1 addition & 0 deletions src/arkode/arkode.c
Original file line number Diff line number Diff line change
Expand Up @@ -1545,6 +1545,7 @@ ARKodeMem arkCreate(SUNContext sunctx)
ark_mem->step_setstagepredictfn = NULL;
ark_mem->step_getnumrhsevals = NULL;
ark_mem->step_setstepdirection = NULL;
ark_mem->step_setfromcommandline = NULL;
ark_mem->step_getnumlinsolvsetups = NULL;
ark_mem->step_setadaptcontroller = NULL;
ark_mem->step_getestlocalerrors = NULL;
Expand Down
95 changes: 38 additions & 57 deletions src/arkode/arkode_cli.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,44 +23,12 @@
#include "arkode_impl.h"

/*===============================================================
Command-line input utility types and routines
Command-line input utility routines
===============================================================*/

typedef int (*arkIntSetFn)(void*, int);

struct arkKeyIntPair
{
const char* key;
arkIntSetFn set;
};

typedef int (*arkLongSetFn)(void*, long int);

struct arkKeyLongPair
{
const char* key;
arkLongSetFn set;
};

typedef int (*arkRealSetFn)(void*, sunrealtype);

struct arkKeyRealPair
{
const char* key;
arkRealSetFn set;
};

typedef int (*arkActionSetFn)(void*);

struct arkKeyActionPair
{
const char* key;
arkActionSetFn set;
};

static int CheckAndSetIntArg(ARKodeMem ark_mem, int* i, char* argv[],
const size_t offset, const char* argtest,
arkIntSetFn fname, sunbooleantype* arg_used)
int arkCheckAndSetIntArg(ARKodeMem ark_mem, int* i, char* argv[],
const size_t offset, const char* argtest,
arkIntSetFn fname, sunbooleantype* arg_used)
{
*arg_used = SUNFALSE;
if (strcmp(argv[*i] + offset, argtest) == 0)
Expand All @@ -80,9 +48,9 @@ static int CheckAndSetIntArg(ARKodeMem ark_mem, int* i, char* argv[],
return ARK_SUCCESS;
}

static int CheckAndSetLongArg(ARKodeMem ark_mem, int* i, char* argv[],
const size_t offset, const char* argtest,
arkLongSetFn fname, sunbooleantype* arg_used)
int arkCheckAndSetLongArg(ARKodeMem ark_mem, int* i, char* argv[],
const size_t offset, const char* argtest,
arkLongSetFn fname, sunbooleantype* arg_used)
{
*arg_used = SUNFALSE;
if (strcmp(argv[*i] + offset, argtest) == 0)
Expand All @@ -102,9 +70,9 @@ static int CheckAndSetLongArg(ARKodeMem ark_mem, int* i, char* argv[],
return ARK_SUCCESS;
}

static int CheckAndSetRealArg(ARKodeMem ark_mem, int* i, char* argv[],
const size_t offset, const char* argtest,
arkRealSetFn fname, sunbooleantype* arg_used)
int arkCheckAndSetRealArg(ARKodeMem ark_mem, int* i, char* argv[],
const size_t offset, const char* argtest,
arkRealSetFn fname, sunbooleantype* arg_used)
{
*arg_used = SUNFALSE;
if (strcmp(argv[*i] + offset, argtest) == 0)
Expand All @@ -124,9 +92,9 @@ static int CheckAndSetRealArg(ARKodeMem ark_mem, int* i, char* argv[],
return ARK_SUCCESS;
}

static int CheckAndSetActionArg(ARKodeMem ark_mem, int* i, char* argv[],
const size_t offset, const char* argtest,
arkActionSetFn fname, sunbooleantype* arg_used)
int arkCheckAndSetActionArg(ARKodeMem ark_mem, int* i, char* argv[],
const size_t offset, const char* argtest,
arkActionSetFn fname, sunbooleantype* arg_used)
{
*arg_used = SUNFALSE;
if (strcmp(argv[*i] + offset, argtest) == 0)
Expand All @@ -153,7 +121,7 @@ static int CheckAndSetActionArg(ARKodeMem ark_mem, int* i, char* argv[],
---------------------------------------------------------------*/

int ARKodeSetFromCommandLine(void* arkode_mem, const char* arkid, int argc,
char* argv[])
char* argv[])
{
ARKodeMem ark_mem;
if (arkode_mem == NULL)
Expand Down Expand Up @@ -238,8 +206,8 @@ int ARKodeSetFromCommandLine(void* arkode_mem, const char* arkid, int argc,
/* check all "int" command-line options */
for (j = 0; j < num_int_keys; j++)
{
retval = CheckAndSetIntArg(ark_mem, &i, argv, offset, int_pairs[j].key,
int_pairs[j].set, &arg_used);
retval = arkCheckAndSetIntArg(ark_mem, &i, argv, offset, int_pairs[j].key,
int_pairs[j].set, &arg_used);
if (retval != ARK_SUCCESS) { return retval; }
if (arg_used) break;
}
Expand All @@ -248,8 +216,8 @@ int ARKodeSetFromCommandLine(void* arkode_mem, const char* arkid, int argc,
/* check all long int command-line options */
for (j = 0; j < num_long_keys; j++)
{
retval = CheckAndSetLongArg(ark_mem, &i, argv, offset, long_pairs[j].key,
long_pairs[j].set, &arg_used);
retval = arkCheckAndSetLongArg(ark_mem, &i, argv, offset, long_pairs[j].key,
long_pairs[j].set, &arg_used);
if (retval != ARK_SUCCESS) { return retval; }
if (arg_used) break;
}
Expand All @@ -258,8 +226,8 @@ int ARKodeSetFromCommandLine(void* arkode_mem, const char* arkid, int argc,
/* check all real command-line options */
for (j = 0; j < num_real_keys; j++)
{
retval = CheckAndSetRealArg(ark_mem, &i, argv, offset, real_pairs[j].key,
real_pairs[j].set, &arg_used);
retval = arkCheckAndSetRealArg(ark_mem, &i, argv, offset, real_pairs[j].key,
real_pairs[j].set, &arg_used);
if (retval != ARK_SUCCESS) { return retval; }
if (arg_used) break;
}
Expand All @@ -268,9 +236,9 @@ int ARKodeSetFromCommandLine(void* arkode_mem, const char* arkid, int argc,
/* check all action command-line options */
for (j = 0; j < num_action_keys; j++)
{
retval = CheckAndSetActionArg(ark_mem, &i, argv, offset,
action_pairs[j].key, action_pairs[j].set,
&arg_used);
retval = arkCheckAndSetActionArg(ark_mem, &i, argv, offset,
action_pairs[j].key, action_pairs[j].set,
&arg_used);
if (retval != ARK_SUCCESS) { return retval; }
if (arg_used) break;
}
Expand Down Expand Up @@ -379,13 +347,26 @@ int ARKodeSetFromCommandLine(void* arkode_mem, const char* arkid, int argc,
continue;
}

/* Call stepper-specific SetFromCommandLine routine (if supplied) to
process this command-line argument */
if (ark_mem->step_setfromcommandline)
{
retval = ark_mem->step_setfromcommandline(ark_mem, &i, argv,
offset, &arg_used);
if (retval != ARK_SUCCESS)
{
arkProcessError(ark_mem, retval, __LINE__, __func__, __FILE__,
"error setting command-line argument: %s", argv[i]);
return retval;
}
if (arg_used) { continue; }
}

/* warn for uninterpreted arkid.X arguments */
arkProcessError(ark_mem, ARK_WARNING, __LINE__, __func__, __FILE__,
"WARNING: argument %s was not handled\n", argv[i]);
}

/* Call stepper-specific SetFromCommandLine routine (if supplied) */


/* Call ARKodeWriteParameters (if requested) now that all
command-line options have been set -- WARNING: this knows
Expand Down
45 changes: 45 additions & 0 deletions src/arkode/arkode_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,9 @@ typedef int (*ARKTimestepGetNumRhsEvals)(ARKodeMem ark_mem, int partition_index,
long int* num_rhs_evals);
typedef int (*ARKTimestepSetStepDirection)(ARKodeMem ark_mem,
sunrealtype stepdir);
typedef int (*ARKTimestepSetFromCommandLine)(ARKodeMem ark_mem, int* i,
char* argv[], const size_t offset,
sunbooleantype* arg_used);

/* time stepper interface functions -- temporal adaptivity */
typedef int (*ARKTimestepGetEstLocalErrors)(ARKodeMem ark_mem, N_Vector ele);
Expand Down Expand Up @@ -414,6 +417,7 @@ struct ARKodeMemRec
ARKTimestepSetOrder step_setorder;
ARKTimestepGetNumRhsEvals step_getnumrhsevals;
ARKTimestepSetStepDirection step_setstepdirection;
ARKTimestepSetFromCommandLine step_setfromcommandline;

/* Time stepper module -- temporal adaptivity */
sunbooleantype step_supports_adaptive;
Expand Down Expand Up @@ -594,6 +598,47 @@ int arkExpStab(N_Vector y, sunrealtype t, sunrealtype* hstab, void* user_data);
void arkProcessError(ARKodeMem ark_mem, int error_code, int line,
const char* func, const char* file, const char* msgfmt, ...);

/*===============================================================
ARKODE COMMAND-LINE INPUT UTILITY TYPES AND ROUTINES
===============================================================*/

typedef int (*arkIntSetFn)(void*, int);
struct arkKeyIntPair
{
const char* key;
arkIntSetFn set;
};
typedef int (*arkLongSetFn)(void*, long int);
struct arkKeyLongPair
{
const char* key;
arkLongSetFn set;
};
typedef int (*arkRealSetFn)(void*, sunrealtype);
struct arkKeyRealPair
{
const char* key;
arkRealSetFn set;
};
typedef int (*arkActionSetFn)(void*);
struct arkKeyActionPair
{
const char* key;
arkActionSetFn set;
};
int arkCheckAndSetIntArg(ARKodeMem ark_mem, int* i, char* argv[],
const size_t offset, const char* argtest,
arkIntSetFn fname, sunbooleantype* arg_used);
int arkCheckAndSetLongArg(ARKodeMem ark_mem, int* i, char* argv[],
const size_t offset, const char* argtest,
arkLongSetFn fname, sunbooleantype* arg_used);
int arkCheckAndSetRealArg(ARKodeMem ark_mem, int* i, char* argv[],
const size_t offset, const char* argtest,
arkRealSetFn fname, sunbooleantype* arg_used);
int arkCheckAndSetActionArg(ARKodeMem ark_mem, int* i, char* argv[],
const size_t offset, const char* argtest,
arkActionSetFn fname, sunbooleantype* arg_used);

/*===============================================================
ARKODE PRIVATE FUNCTION PROTOTYPES
===============================================================*/
Expand Down

0 comments on commit d65c219

Please sign in to comment.