diff --git a/docs/usrman-src/input_file_structure.rst b/docs/usrman-src/input_file_structure.rst index faa81ba..22ffab3 100644 --- a/docs/usrman-src/input_file_structure.rst +++ b/docs/usrman-src/input_file_structure.rst @@ -425,7 +425,13 @@ following optional keywords: are any non-negative integer. Default value is `25`. - ``num_functions`` - size of the system of PDEs, when using the systems - version. Available values are any positive integer. Default value is `1`. + version. Available values are any positive integer. Default value is `off`. + + - ``filter_functions`` - turn on/off filtering based on inter-variable couplings for + systems of equations. For more information, see + `HYPRE_BoomerAMGSetFilterFunctions + `_. + Default value is `off`. - ``rap2`` - whether or not to use two matrix products to compute coarse level matrices. Available values are any non-negative integer. Default value is `0`. diff --git a/include/amg.h b/include/amg.h index 6697d2f..c035033 100644 --- a/include/amg.h +++ b/include/amg.h @@ -69,6 +69,7 @@ typedef struct AMGcsn_args_struct { HYPRE_Int mod_rap2; HYPRE_Int keep_transpose; HYPRE_Int num_functions; + HYPRE_Int filter_functions; HYPRE_Int seq_amg_th; HYPRE_Int min_coarse_size; HYPRE_Int max_coarse_size; diff --git a/include/utils.h b/include/utils.h index c8bcf85..7482731 100644 --- a/include/utils.h +++ b/include/utils.h @@ -35,25 +35,25 @@ void CombineFilename(const char*, const char*, char**); #define HYPRE_DEVELOP_NUMBER_EXISTS 0 #endif -/* Check if HYPRE_DEVELOP_NUMBER is greater than a given value */ -#define HYPRE_DEVELOP_NUMBER_GT(develop) \ - (HYPRE_DEVELOP_NUMBER > (develop)) +/* Check if HYPRE_DEVELOP_NUMBER is greater or equal than a given value */ +#define HYPRE_DEVELOP_NUMBER_GE(develop) \ + (HYPRE_DEVELOP_NUMBER >= (develop)) /* Check if HYPRE_RELEASE_NUMBER is greater than a given value */ #define HYPRE_RELEASE_NUMBER_GT(release) \ (HYPRE_RELEASE_NUMBER > (release)) /* Check for a specific hypre release number and whether - HYPRE_DEVELOP_NUMBER is defined and greater than a given value */ -#define HYPRE_RELEASE_NUMBER_EQ_AND_DEVELOP_NUMBER_GT(release, develop) \ + HYPRE_DEVELOP_NUMBER is defined and greater or equal than a given value */ +#define HYPRE_RELEASE_NUMBER_EQ_AND_DEVELOP_NUMBER_GE(release, develop) \ (HYPRE_RELEASE_NUMBER == (release) &&\ HYPRE_DEVELOP_NUMBER_EXISTS &&\ - HYPRE_DEVELOP_NUMBER_GT(develop)) + HYPRE_DEVELOP_NUMBER_GE(develop)) /* Check for minimum HYPRE version in order to allow certain features */ #define HYPRE_CHECK_MIN_VERSION(release, develop) \ (HYPRE_RELEASE_NUMBER_GT(release) ||\ - HYPRE_RELEASE_NUMBER_EQ_AND_DEVELOP_NUMBER_GT(release, develop)) + HYPRE_RELEASE_NUMBER_EQ_AND_DEVELOP_NUMBER_GE(release, develop)) #define GB_TO_BYTES (1 << 30) #define MAX_DIVISOR_LENGTH 84 diff --git a/src/HYPREDRV.c b/src/HYPREDRV.c index 9b7662b..c7f59e0 100644 --- a/src/HYPREDRV.c +++ b/src/HYPREDRV.c @@ -50,6 +50,15 @@ HYPREDRV_Initialize() HYPRE_Initialize(); HYPRE_DeviceInitialize(); +#if HYPRE_CHECK_MIN_VERSION(23100, 16) + /* Check for environment variables */ + const char* env_log_level = getenv("HYPRE_LOG_LEVEL"); + HYPRE_Int log_level = (env_log_level) ? (HYPRE_Int) atoi(env_log_level) : 0; + + HYPRE_SetLogLevel(log_level); +#endif + + /* Set library state to initialized */ is_initialized = true; } } diff --git a/src/amg.c b/src/amg.c index a6e7ac5..2e7d0f7 100644 --- a/src/amg.c +++ b/src/amg.c @@ -26,6 +26,7 @@ ADD_FIELD_OFFSET_ENTRY(_prefix, mod_rap2, FieldTypeIntSet) \ ADD_FIELD_OFFSET_ENTRY(_prefix, keep_transpose, FieldTypeIntSet) \ ADD_FIELD_OFFSET_ENTRY(_prefix, num_functions, FieldTypeIntSet) \ + ADD_FIELD_OFFSET_ENTRY(_prefix, filter_functions, FieldTypeIntSet) \ ADD_FIELD_OFFSET_ENTRY(_prefix, seq_amg_th, FieldTypeIntSet) \ ADD_FIELD_OFFSET_ENTRY(_prefix, min_coarse_size, FieldTypeIntSet) \ ADD_FIELD_OFFSET_ENTRY(_prefix, max_coarse_size, FieldTypeIntSet) \ @@ -118,25 +119,26 @@ AMGintSetDefaultArgs(AMGint_args *args) void AMGcsnSetDefaultArgs(AMGcsn_args *args) { - args->rap2 = 0; + args->rap2 = 0; #if defined (HYPRE_USING_GPU) - args->type = 8; - args->mod_rap2 = 1; - args->keep_transpose = 1; - args->type = 8; + args->type = 8; + args->mod_rap2 = 1; + args->keep_transpose = 1; + args->type = 8; #else - args->type = 10; - args->mod_rap2 = 0; - args->keep_transpose = 0; - args->type = 10; + args->type = 10; + args->mod_rap2 = 0; + args->keep_transpose = 0; + args->type = 10; #endif - args->num_functions = 1; - args->seq_amg_th = 0; - args->min_coarse_size = 0; - args->max_coarse_size = 64; - args->max_levels = 25; - args->max_row_sum = 0.9; - args->strong_th = 0.25; + args->num_functions = 1; + args->filter_functions = 0; + args->seq_amg_th = 0; + args->min_coarse_size = 0; + args->max_coarse_size = 64; + args->max_levels = 25; + args->max_row_sum = 0.9; + args->strong_th = 0.25; } /*----------------------------------------------------------------------------- @@ -280,7 +282,8 @@ AMGcsnGetValidValues(const char* key) return STR_INT_MAP_ARRAY_CREATE(map); } - else if (!strcmp(key, "rap2") || + else if (!strcmp(key, "filter_functions") || + !strcmp(key, "rap2") || !strcmp(key, "mod_rap2") || !strcmp(key, "keep_transpose")) { @@ -506,5 +509,9 @@ AMGCreate(AMG_args *args, HYPRE_Solver *precon_ptr) HYPRE_BoomerAMGSetCycleNumSweeps(precon, args->relaxation.num_sweeps, 3); } +#if HYPRE_CHECK_MIN_VERSION(23100, 16) + HYPRE_BoomerAMGSetFilterFunctions(precon, args->coarsening.filter_functions); +#endif + *precon_ptr = precon; } diff --git a/src/mgr.c b/src/mgr.c index 3635348..e8cfb60 100644 --- a/src/mgr.c +++ b/src/mgr.c @@ -493,7 +493,7 @@ MGRCreate(MGR_args *args, HYPRE_Solver *precon_ptr, HYPRE_Solver *csolver_ptr) if (args->level[i].f_relaxation.type == 2) { AMGCreate(&args->level[i].f_relaxation.amg, &frelax); -#if HYPRE_CHECK_MIN_VERSION(23100, 8) +#if HYPRE_CHECK_MIN_VERSION(23100, 9) HYPRE_MGRSetFSolverAtLevel(precon, frelax, i); #else HYPRE_MGRSetFSolverAtLevel(i, precon, frelax); @@ -502,7 +502,7 @@ MGRCreate(MGR_args *args, HYPRE_Solver *precon_ptr, HYPRE_Solver *csolver_ptr) } /* Config global relaxation at level >= 0 */ -#if HYPRE_CHECK_MIN_VERSION(23100, 8) +#if HYPRE_CHECK_MIN_VERSION(23100, 9) for (i = 0; i < num_levels; i++) { if (args->level[i].g_relaxation.type == 16)