From bfca28a1f40a9774790d09c3247b39675986aaae Mon Sep 17 00:00:00 2001 From: PaulMullowney <60452402+PaulMullowney@users.noreply.github.com> Date: Thu, 29 Apr 2021 10:12:41 -0600 Subject: [PATCH] modifying some hypre params and changing defaults. (#1981) --- Src/Extern/HYPRE/AMReX_HypreIJIface.cpp | 47 ++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/Src/Extern/HYPRE/AMReX_HypreIJIface.cpp b/Src/Extern/HYPRE/AMReX_HypreIJIface.cpp index 10ef81bd798..53a19ca6c39 100644 --- a/Src/Extern/HYPRE/AMReX_HypreIJIface.cpp +++ b/Src/Extern/HYPRE/AMReX_HypreIJIface.cpp @@ -39,6 +39,14 @@ struct HypreOptParse func(solver, val); } + template + void operator()(const std::string& key, F&& func, T default_val, int index) + { + T val = default_val; + pp.query(key.c_str(), val); + func(solver, val, index); + } + template void set(const std::string& key, F&& func) { @@ -228,9 +236,24 @@ void HypreIJIface::boomeramg_precond_configure(const std::string& prefix) hpp("bamg_precond_tolerance", HYPRE_BoomerAMGSetTol, 0.0); hpp("bamg_coarsen_type", HYPRE_BoomerAMGSetCoarsenType, 6); hpp("bamg_cycle_type", HYPRE_BoomerAMGSetCycleType, 1); - hpp("bamg_relax_type", HYPRE_BoomerAMGSetRelaxType, 6); hpp("bamg_relax_order", HYPRE_BoomerAMGSetRelaxOrder, 1); - hpp("bamg_num_sweeps", HYPRE_BoomerAMGSetNumSweeps, 2); + + if (hpp.pp.contains("bamg_down_relax_type") && hpp.pp.contains("bamg_up_relax_type") && hpp.pp.contains("bamg_coarse_relax_type")) { + hpp("bamg_down_relax_type", HYPRE_BoomerAMGSetCycleRelaxType, 11, 1); + hpp("bamg_up_relax_type", HYPRE_BoomerAMGSetCycleRelaxType, 11, 2); + hpp("bamg_coarse_relax_type", HYPRE_BoomerAMGSetCycleRelaxType, 11, 3); + } else { + hpp("bamg_relax_type", HYPRE_BoomerAMGSetRelaxType, 11); + } + + if (hpp.pp.contains("bamg_num_down_sweeps") && hpp.pp.contains("bamg_num_up_sweeps") && hpp.pp.contains("bamg_num_coarse_sweeps")) { + hpp("bamg_num_down_sweeps", HYPRE_BoomerAMGSetCycleNumSweeps, 2, 1); + hpp("bamg_num_up_sweeps", HYPRE_BoomerAMGSetCycleNumSweeps, 2, 2); + hpp("bamg_num_coarse_sweeps", HYPRE_BoomerAMGSetCycleNumSweeps, 1, 3); + } else { + hpp("bamg_num_sweeps", HYPRE_BoomerAMGSetNumSweeps, 2); + } + hpp("bamg_max_levels", HYPRE_BoomerAMGSetMaxLevels, 20); hpp("bamg_strong_threshold", HYPRE_BoomerAMGSetStrongThreshold, (AMREX_SPACEDIM == 3) ? 0.57 : 0.25); @@ -332,10 +355,24 @@ void HypreIJIface::boomeramg_solver_configure(const std::string& prefix) HypreOptParse hpp(prefix, m_solver); hpp("verbose", HYPRE_BoomerAMGSetPrintLevel); hpp("logging", HYPRE_BoomerAMGSetLogging); - - hpp("bamg_relax_type", HYPRE_BoomerAMGSetRelaxType, 6); hpp("bamg_relax_order", HYPRE_BoomerAMGSetRelaxOrder, 1); - hpp("bamg_num_sweeps", HYPRE_BoomerAMGSetNumSweeps, 2); + + if (hpp.pp.contains("bamg_down_relax_type") && hpp.pp.contains("bamg_up_relax_type") && hpp.pp.contains("bamg_coarse_relax_type")) { + hpp("bamg_down_relax_type", HYPRE_BoomerAMGSetCycleRelaxType, 11, 1); + hpp("bamg_up_relax_type", HYPRE_BoomerAMGSetCycleRelaxType, 11, 2); + hpp("bamg_coarse_relax_type", HYPRE_BoomerAMGSetCycleRelaxType, 11, 3); + } else { + hpp("bamg_relax_type", HYPRE_BoomerAMGSetRelaxType, 11); + } + + if (hpp.pp.contains("bamg_num_down_sweeps") && hpp.pp.contains("bamg_num_up_sweeps") && hpp.pp.contains("bamg_num_coarse_sweeps")) { + hpp("bamg_num_down_sweeps", HYPRE_BoomerAMGSetCycleNumSweeps, 2, 1); + hpp("bamg_num_up_sweeps", HYPRE_BoomerAMGSetCycleNumSweeps, 2, 2); + hpp("bamg_num_coarse_sweeps", HYPRE_BoomerAMGSetCycleNumSweeps, 1, 3); + } else { + hpp("bamg_num_sweeps", HYPRE_BoomerAMGSetNumSweeps, 2); + } + hpp("bamg_strong_threshold", HYPRE_BoomerAMGSetStrongThreshold, (AMREX_SPACEDIM == 3) ? 0.57 : 0.25); hpp("bamg_coarsen_type", HYPRE_BoomerAMGSetCoarsenType);