From 51ba9bdc9a6dcccb40e55657b1a0d3f2690d479d Mon Sep 17 00:00:00 2001 From: Max Katz Date: Mon, 28 Sep 2020 20:53:13 -0700 Subject: [PATCH 1/3] Implement new AMReX tagging format --- .../tests/wdmerger_3D/inputs_test_wdmerger_3D | 6 ++ .../tests/wdmerger_3D/probin_test_wdmerger_3D | 2 - Source/driver/Castro.H | 5 ++ Source/driver/Castro.cpp | 60 +++++++++++++++++++ 4 files changed, 71 insertions(+), 2 deletions(-) diff --git a/Exec/science/wdmerger/tests/wdmerger_3D/inputs_test_wdmerger_3D b/Exec/science/wdmerger/tests/wdmerger_3D/inputs_test_wdmerger_3D index cae027952f..92ac5ad250 100644 --- a/Exec/science/wdmerger/tests/wdmerger_3D/inputs_test_wdmerger_3D +++ b/Exec/science/wdmerger/tests/wdmerger_3D/inputs_test_wdmerger_3D @@ -45,6 +45,12 @@ amr.n_cell = 96 96 96 # Number of cells on the coar amr.max_level = 1 # Maximum level number allowed amr.ref_ratio = 2 +amr.refinement_indicators = temperature + +amr.refine.temperature.max_level = 4 +amr.refine.temperature.value_greater = 2.e8 +amr.refine.temperature.field_name = Temp + amr.max_grid_size = 32 # Maximum grid size at each level amr.blocking_factor = 16 # Grid sizes must be a multiple of this diff --git a/Exec/science/wdmerger/tests/wdmerger_3D/probin_test_wdmerger_3D b/Exec/science/wdmerger/tests/wdmerger_3D/probin_test_wdmerger_3D index 5a92467655..6841bad9f7 100644 --- a/Exec/science/wdmerger/tests/wdmerger_3D/probin_test_wdmerger_3D +++ b/Exec/science/wdmerger/tests/wdmerger_3D/probin_test_wdmerger_3D @@ -28,8 +28,6 @@ / &tagging - max_temperr_lev = 4 - temperr = 2.d8 / &sponge diff --git a/Source/driver/Castro.H b/Source/driver/Castro.H index e2533d03ed..3c9a889c85 100644 --- a/Source/driver/Castro.H +++ b/Source/driver/Castro.H @@ -1180,6 +1180,11 @@ public: static amrex::Vector upass_map; static amrex::Vector qpass_map; +/// +/// Vector storing list of custom error tags. +/// + static amrex::Vector custom_error_tags; + /// /// This MultiFab is on the coarser level. This is useful for the coarser level /// to mask out the finer level. We only build this when it is needed. diff --git a/Source/driver/Castro.cpp b/Source/driver/Castro.cpp index fd35e5eac7..760f12ae0d 100644 --- a/Source/driver/Castro.cpp +++ b/Source/driver/Castro.cpp @@ -74,6 +74,8 @@ Vector Castro::source_names; Vector Castro::upass_map; Vector Castro::qpass_map; +Vector Castro::custom_error_tags; + #ifdef TRUE_SDC int Castro::SDC_NODES; Vector Castro::dt_sdc; @@ -469,6 +471,54 @@ Castro::read_params () compute_new_dt_on_regrid = 1; + // Read in custom refinement scheme. + + Vector refinement_indicators; + ppa.queryarr("refinement_indicators", refinement_indicators, 0, ppa.countval("refinement_indicators")); + + for (int i = 0; i < refinement_indicators.size(); ++i) + { + std::string ref_prefix = "amr.refine." + refinement_indicators[i]; + + ParmParse ppr(ref_prefix); + + AMRErrorTagInfo info; + + if (ppr.countval("start_time") > 0) { + Real min_time; + ppr.get("start_time", min_time); + info.SetMinTime(min_time); + } + if (ppr.countval("end_time") > 0) { + Real max_time; + ppr.get("end_time", max_time); + info.SetMaxTime(max_time); + } + if (ppr.countval("max_level") > 0) { + int max_level; + ppr.get("max_level", max_level); + info.SetMaxLevel(max_level); + } + + if (ppr.countval("value_greater") > 0) { + Real value; + ppr.get("value_greater", value); + std::string field; + ppr.get("field_name", field); + custom_error_tags.push_back(AMRErrorTag(value, AMRErrorTag::GREATER, field, info)); + } + else if (ppr.countval("value_less") > 0) { + Real value; + ppr.get("value_less", value); + std::string field; + ppr.get("field_name", field); + custom_error_tags.push_back(AMRErrorTag(value, AMRErrorTag::LESS, field, info)); + } + else { + amrex::Abort("Unrecognized refinement indicator for " + refinement_indicators[i]); + } + } + } Castro::Castro () @@ -3176,6 +3226,16 @@ Castro::errorEst (TagBoxArray& tags, apply_tagging_func(tags, ltime, j); } + // Apply each of the custom tagging criteria. + + for (int j = 0; j < custom_error_tags.size(); j++) { + std::unique_ptr mf; + if (custom_error_tags[j].Field() != std::string()) { + mf = derive(custom_error_tags[j].Field(), time, custom_error_tags[j].NGrow()); + } + custom_error_tags[j](tags, mf.get(), TagBox::CLEAR, TagBox::SET, time, level, geom); + } + // Now we'll tag any user-specified zones using the full state array. apply_problem_tags(tags, ltime); From 8cf16d1cbf4a0b60262cddcdeb16c28dd3408be2 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Mon, 28 Sep 2020 21:08:06 -0700 Subject: [PATCH 2/3] Docs --- CHANGES.md | 25 +++++++++++++++++++++++++ Docs/source/AMR.rst | 24 ++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 8264e3ad99..17ecb27dd5 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,30 @@ # 20.10 + * A new refinement scheme using the inputs file rather than the Fortran + tagging namelist has been added. (#1243). The scheme looks like: + + ``` + amr.refinement_indicators = dens temp + + amr.refine.dens.max_level = 1 + amr.refine.dens.value_greater = 2.0 + amr.refine.dens.field_name = Density + + amr.refine.temp.max_level = 2 + amr.refine.temp.value_less = 1.0 + amr.refine.temp.field_name = Temp + ``` + + `amr.refinement_indicators` is a list of user-defined names for refinement + schemes. For each defined name, amr.refine. accepts predefined fields + describing when to tag. In the current implementation, these are `max_level` + (maximum level to refine to), `start_time` (when to start tagging), `end_time` + (when to stop tagging), `value_greater` (value above which we refine), and + `value_less` (value below which to refine), and `field_name` (name of the + string defining the field in the code). If a refinement indicator is added, + either `value_greater` or `value_less` must be provided. (In the future we + will support other refinement schemes such as gradients.) + * Automatic problem parameter configuration is now available to every problem by placing a _prob_params file in your problem directory. Examples can be found in most of the problems in Castro/Exec, and you diff --git a/Docs/source/AMR.rst b/Docs/source/AMR.rst index 1ea8329f44..2f3988cb27 100644 --- a/Docs/source/AMR.rst +++ b/Docs/source/AMR.rst @@ -179,6 +179,30 @@ problem_tagging_3d.f90 to our work directory and set it up as follows: end subroutine set_problem_tags +We also provide a mechanism for defining a limited set of refinement +schemes from the inputs file; for example, + +:: + + amr.refinement_indicators = dens temp + + amr.refine.dens.max_level = 1 + amr.refine.dens.value_greater = 2.0 + amr.refine.dens.field_name = Density + + amr.refine.temp.max_level = 2 + amr.refine.temp.value_less = 1.0 + amr.refine.temp.field_name = Temp + +``amr.refinement_indicators`` is a list of user-defined names for refinement +schemes. For each defined name, ``amr.refine.`` accepts predefined fields +describing when to tag. These are ``max_level`` (maximum level to refine to), +``start_time`` (when to start tagging), ``end_time`` (when to stop tagging), +``value_greater`` (value above which we refine), ``value_less`` (value below +which to refine), and ``field_name`` (name of the string defining the field +in the code). If a refinement indicator is added, either ``value_greater`` or +``value_less`` must be provided. + .. _sec:amr_synchronization: Synchronization Algorithm From 14c1e2c7af48dc10611be898fb7d293ba3c2b592 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Mon, 28 Sep 2020 21:09:33 -0700 Subject: [PATCH 3/3] Grammar --- CHANGES.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 17ecb27dd5..cab016d055 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,7 +1,7 @@ # 20.10 * A new refinement scheme using the inputs file rather than the Fortran - tagging namelist has been added. (#1243). The scheme looks like: + tagging namelist has been added. (#1243) As an example, consider: ``` amr.refinement_indicators = dens temp @@ -19,7 +19,7 @@ schemes. For each defined name, amr.refine. accepts predefined fields describing when to tag. In the current implementation, these are `max_level` (maximum level to refine to), `start_time` (when to start tagging), `end_time` - (when to stop tagging), `value_greater` (value above which we refine), and + (when to stop tagging), `value_greater` (value above which we refine), `value_less` (value below which to refine), and `field_name` (name of the string defining the field in the code). If a refinement indicator is added, either `value_greater` or `value_less` must be provided. (In the future we