From c518a1b0e03b256036153523f36352f0aeacd9cb Mon Sep 17 00:00:00 2001 From: Lawrence Kidder Date: Sat, 4 Feb 2023 12:14:25 -0500 Subject: [PATCH] fixup drive --- .../Amr/Criteria/DriveToTarget.cpp | 39 ++++- .../Amr/Criteria/DriveToTarget.hpp | 73 ++++---- .../Amr/Criteria/Test_DriveToTarget.cpp | 161 +++++++++--------- 3 files changed, 149 insertions(+), 124 deletions(-) diff --git a/src/ParallelAlgorithms/Amr/Criteria/DriveToTarget.cpp b/src/ParallelAlgorithms/Amr/Criteria/DriveToTarget.cpp index 386a6a6e1dcf6..a7224893501e8 100644 --- a/src/ParallelAlgorithms/Amr/Criteria/DriveToTarget.cpp +++ b/src/ParallelAlgorithms/Amr/Criteria/DriveToTarget.cpp @@ -9,14 +9,17 @@ #include #include "Domain/Amr/Flag.hpp" +#include "Domain/Structure/ElementId.hpp" +#include "NumericalAlgorithms/Spectral/Mesh.hpp" +#include "Utilities/Gsl.hpp" namespace amr::Criteria { template DriveToTarget::DriveToTarget( - const std::array& target_resolution, + const std::array& target_number_of_grid_points, const std::array& target_refinement_levels, const std::array& flags_at_target) - : target_resolution_(target_resolution), + : target_number_of_grid_points_(target_number_of_grid_points), target_refinement_levels_(target_refinement_levels), flags_at_target_(flags_at_target) {} @@ -27,11 +30,41 @@ DriveToTarget::DriveToTarget(CkMigrateMessage* msg) : Criterion(msg) {} template void DriveToTarget::pup(PUP::er& p) { Criterion::pup(p); - p | target_resolution_; + p | target_number_of_grid_points_; p | target_refinement_levels_; p | flags_at_target_; } +template +std::array DriveToTarget::impl( + const Mesh& current_mesh, const ElementId& element_id) const { + auto result = make_array(domain::Flag::DoNothing); + const std::array levels = element_id.refinement_levels(); + bool is_at_target = true; + for (size_t d = 0; d < Dim; ++d) { + if (gsl::at(levels, d) < gsl::at(target_refinement_levels_, d)) { + gsl::at(result, d) = domain::Flag::Split; + is_at_target = false; + } else if (current_mesh.extents(d) < + gsl::at(target_number_of_grid_points_, d)) { + gsl::at(result, d) = domain::Flag::IncreaseResolution; + is_at_target = false; + } else if (current_mesh.extents(d) > + gsl::at(target_number_of_grid_points_, d)) { + gsl::at(result, d) = domain::Flag::DecreaseResolution; + is_at_target = false; + } else if (gsl::at(levels, d) > gsl::at(target_refinement_levels_, d)) { + gsl::at(result, d) = domain::Flag::Join; + is_at_target = false; + } + } + if (is_at_target) { + return flags_at_target_; + } + + return result; +} + template PUP::able::PUP_ID DriveToTarget::my_PUP_ID = 0; // NOLINT diff --git a/src/ParallelAlgorithms/Amr/Criteria/DriveToTarget.hpp b/src/ParallelAlgorithms/Amr/Criteria/DriveToTarget.hpp index c4be3072cc975..86367d768f79c 100644 --- a/src/ParallelAlgorithms/Amr/Criteria/DriveToTarget.hpp +++ b/src/ParallelAlgorithms/Amr/Criteria/DriveToTarget.hpp @@ -8,17 +8,21 @@ #include #include "Domain/Amr/Flag.hpp" -#include "Domain/Structure/ElementId.hpp" #include "Domain/Tags.hpp" -#include "NumericalAlgorithms/Spectral/Mesh.hpp" #include "ParallelAlgorithms/Amr/Criteria/Criterion.hpp" -#include "Utilities/Gsl.hpp" #include "Utilities/TMPL.hpp" +/// \cond +template +class ElementId; +template +class Mesh; +/// \endcond + namespace amr::Criteria { /*! - * \brief Refine the grid towards the target resolution and refinement levels in - * each dimension and then oscillate about the target. + * \brief Refine the grid towards the target number of grid points and + * refinement levels in each dimension and then oscillate about the target. * * \details If the grid is at neither target in a given dimension, the * flag chosen will be in the priority order Split, @@ -32,39 +36,39 @@ namespace amr::Criteria { template class DriveToTarget : public Criterion { public: - /// The target resolution - struct TargetResolution { + /// The target number of grid point in each dimension + struct TargetNumberOfGridPoints { using type = std::array; static constexpr Options::String help = { - "The target resolution in each dimension."}; + "The target number of grid points in each dimension."}; }; - /// The target resolution + /// The target refinement level in each dimension struct TargetRefinementLevels { using type = std::array; static constexpr Options::String help = { - "The target refinement levels in each dimension."}; + "The target refinement level in each dimension."}; }; - /// The AMR flags chosen when the target resolution and refinement levels are - /// reached + /// The AMR flags chosen when the target number of grid points and refinement + /// levels are reached struct OscillationAtTarget { using type = std::array; static constexpr Options::String help = { "The flags returned when at the target."}; }; - using options = - tmpl::list; + using options = tmpl::list; static constexpr Options::String help = { - "Refine the grid towards the TargetResolution and " + "Refine the grid towards the TargetNumberOfGridPoints and " "TargetRefinementLevels, and then oscillate about them by applying " "OscillationAtTarget."}; DriveToTarget() = default; - DriveToTarget(const std::array& target_resolution, + DriveToTarget(const std::array& target_number_of_grid_points, const std::array& target_refinement_levels, const std::array& flags_at_target); @@ -78,47 +82,28 @@ class DriveToTarget : public Criterion { using argument_tags = tmpl::list<::domain::Tags::Mesh>; - template + template auto operator()(const Mesh& current_mesh, Parallel::GlobalCache& /*cache*/, - const ArrayIndex& array_index) const; + const ElementId& element_id) const; void pup(PUP::er& p) override; private: - std::array target_resolution_{}; + std::array impl(const Mesh& current_mesh, + const ElementId& element_id) const; + + std::array target_number_of_grid_points_{}; std::array target_refinement_levels_{}; std::array flags_at_target_{}; }; template -template +template auto DriveToTarget::operator()( const Mesh& current_mesh, Parallel::GlobalCache& /*cache*/, - const ArrayIndex& array_index) const { - auto result = make_array(domain::Flag::DoNothing); - const std::array levels = array_index.refinement_levels(); - bool is_at_target = true; - for (size_t d = 0; d < Dim; ++d) { - if (gsl::at(levels, d) < gsl::at(target_refinement_levels_, d)) { - gsl::at(result, d) = domain::Flag::Split; - is_at_target = false; - } else if (current_mesh.extents(d) < gsl::at(target_resolution_, d)) { - gsl::at(result, d) = domain::Flag::IncreaseResolution; - is_at_target = false; - } else if (current_mesh.extents(d) > gsl::at(target_resolution_, d)) { - gsl::at(result, d) = domain::Flag::DecreaseResolution; - is_at_target = false; - } else if (gsl::at(levels, d) > gsl::at(target_refinement_levels_, d)) { - gsl::at(result, d) = domain::Flag::Join; - is_at_target = false; - } - } - if (is_at_target) { - return flags_at_target_; - } - - return result; + const ElementId& element_id) const { + return impl(current_mesh, element_id); } } // namespace amr::Criteria diff --git a/tests/Unit/ParallelAlgorithms/Amr/Criteria/Test_DriveToTarget.cpp b/tests/Unit/ParallelAlgorithms/Amr/Criteria/Test_DriveToTarget.cpp index 74582a3a08802..0c9f7be6d21fb 100644 --- a/tests/Unit/ParallelAlgorithms/Amr/Criteria/Test_DriveToTarget.cpp +++ b/tests/Unit/ParallelAlgorithms/Amr/Criteria/Test_DriveToTarget.cpp @@ -89,81 +89,88 @@ void test( SPECTRE_TEST_CASE("Unit.Amr.Criteria.DriveToTarget", "[Unit][ParallelAlgorithms]") { - const std::array target_extents_1d{4_st}; - const std::array target_levels_1d{3_st}; - const std::array flags_at_target_1d{amr::domain::Flag::Join}; - const auto test_cases_1d = std::vector{ - std::tuple{std::array{4_st}, std::array{3_st}, - std::array{amr::domain::Flag::Join}}, - std::tuple{std::array{3_st}, std::array{3_st}, - std::array{amr::domain::Flag::IncreaseResolution}}, - std::tuple{std::array{5_st}, std::array{3_st}, - std::array{amr::domain::Flag::DecreaseResolution}}, - std::tuple{std::array{4_st}, std::array{2_st}, - std::array{amr::domain::Flag::Split}}, - std::tuple{std::array{3_st}, std::array{2_st}, - std::array{amr::domain::Flag::Split}}, - std::tuple{std::array{5_st}, std::array{2_st}, - std::array{amr::domain::Flag::Split}}, - std::tuple{std::array{4_st}, std::array{4_st}, - std::array{amr::domain::Flag::Join}}, - std::tuple{std::array{3_st}, std::array{4_st}, - std::array{amr::domain::Flag::IncreaseResolution}}, - std::tuple{std::array{5_st}, std::array{4_st}, - std::array{amr::domain::Flag::DecreaseResolution}}}; - const std::string option_1d = - "DriveToTarget:\n" - " TargetResolution: [4]\n" - " TargetRefinementLevels: [3]\n" - " OscillationAtTarget: [Join]\n"; - test(target_extents_1d, target_levels_1d, flags_at_target_1d, test_cases_1d, - option_1d); - const std::array target_extents_2d{4_st, 6_st}; - const std::array target_levels_2d{8_st, 3_st}; - const std::array flags_at_target_2d{amr::domain::Flag::IncreaseResolution, - amr::domain::Flag::Split}; - const auto test_cases_2d = std::vector{ - std::tuple{std::array{4_st, 6_st}, std::array{8_st, 3_st}, - std::array{amr::domain::Flag::IncreaseResolution, - amr::domain::Flag::Split}}, - std::tuple{std::array{5_st, 6_st}, std::array{8_st, 3_st}, - std::array{amr::domain::Flag::DecreaseResolution, - amr::domain::Flag::DoNothing}}, - std::tuple{std::array{3_st, 6_st}, std::array{7_st, 4_st}, - std::array{amr::domain::Flag::Split, amr::domain::Flag::Join}}, - std::tuple{ - std::array{4_st, 6_st}, std::array{8_st, 2_st}, - std::array{amr::domain::Flag::DoNothing, amr::domain::Flag::Split}}}; - const std::string option_2d = - "DriveToTarget:\n" - " TargetResolution: [4, 6]\n" - " TargetRefinementLevels: [8, 3]\n" - " OscillationAtTarget: [IncreaseResolution, Split]\n"; - test(target_extents_2d, target_levels_2d, flags_at_target_2d, test_cases_2d, - option_2d); - const std::array target_extents_3d{3_st, 9_st, 5_st}; - const std::array target_levels_3d{5_st, 2_st, 4_st}; - const std::array flags_at_target_3d{amr::domain::Flag::Split, - amr::domain::Flag::DecreaseResolution, - amr::domain::Flag::DoNothing}; - const auto test_cases_3d = std::vector{ - std::tuple{std::array{3_st, 9_st, 5_st}, std::array{5_st, 2_st, 4_st}, - std::array{amr::domain::Flag::Split, - amr::domain::Flag::DecreaseResolution, - amr::domain::Flag::DoNothing}}, - std::tuple{ - std::array{3_st, 9_st, 5_st}, std::array{5_st, 5_st, 4_st}, - std::array{amr::domain::Flag::DoNothing, amr::domain::Flag::Join, - amr::domain::Flag::DoNothing}}, - std::tuple{ - std::array{3_st, 9_st, 3_st}, std::array{5_st, 2_st, 4_st}, - std::array{amr::domain::Flag::DoNothing, amr::domain::Flag::DoNothing, - amr::domain::Flag::IncreaseResolution}}}; - const std::string option_3d = - "DriveToTarget:\n" - " TargetResolution: [3, 9, 5]\n" - " TargetRefinementLevels: [5, 2, 4]\n" - " OscillationAtTarget: [Split, DecreaseResolution, DoNothing]\n"; - test(target_extents_3d, target_levels_3d, flags_at_target_3d, test_cases_3d, - option_3d); + { + INFO("1D") + const std::array target_extents{4_st}; + const std::array target_levels{3_st}; + const std::array flags_at_target{amr::domain::Flag::Join}; + const auto test_cases = std::vector{ + std::tuple{std::array{4_st}, std::array{3_st}, + std::array{amr::domain::Flag::Join}}, + std::tuple{std::array{3_st}, std::array{3_st}, + std::array{amr::domain::Flag::IncreaseResolution}}, + std::tuple{std::array{5_st}, std::array{3_st}, + std::array{amr::domain::Flag::DecreaseResolution}}, + std::tuple{std::array{4_st}, std::array{2_st}, + std::array{amr::domain::Flag::Split}}, + std::tuple{std::array{3_st}, std::array{2_st}, + std::array{amr::domain::Flag::Split}}, + std::tuple{std::array{5_st}, std::array{2_st}, + std::array{amr::domain::Flag::Split}}, + std::tuple{std::array{4_st}, std::array{4_st}, + std::array{amr::domain::Flag::Join}}, + std::tuple{std::array{3_st}, std::array{4_st}, + std::array{amr::domain::Flag::IncreaseResolution}}, + std::tuple{std::array{5_st}, std::array{4_st}, + std::array{amr::domain::Flag::DecreaseResolution}}}; + const std::string option = + "DriveToTarget:\n" + " TargetNumberOfGridPoints: [4]\n" + " TargetRefinementLevels: [3]\n" + " OscillationAtTarget: [Join]\n"; + test(target_extents, target_levels, flags_at_target, test_cases, option); + } + { + INFO("2D"); + const std::array target_extents{4_st, 6_st}; + const std::array target_levels{8_st, 3_st}; + const std::array flags_at_target{amr::domain::Flag::IncreaseResolution, + amr::domain::Flag::Split}; + const auto test_cases = std::vector{ + std::tuple{std::array{4_st, 6_st}, std::array{8_st, 3_st}, + std::array{amr::domain::Flag::IncreaseResolution, + amr::domain::Flag::Split}}, + std::tuple{std::array{5_st, 6_st}, std::array{8_st, 3_st}, + std::array{amr::domain::Flag::DecreaseResolution, + amr::domain::Flag::DoNothing}}, + std::tuple{ + std::array{3_st, 6_st}, std::array{7_st, 4_st}, + std::array{amr::domain::Flag::Split, amr::domain::Flag::Join}}, + std::tuple{std::array{4_st, 6_st}, std::array{8_st, 2_st}, + std::array{amr::domain::Flag::DoNothing, + amr::domain::Flag::Split}}}; + const std::string option = + "DriveToTarget:\n" + " TargetNumberOfGridPoints: [4, 6]\n" + " TargetRefinementLevels: [8, 3]\n" + " OscillationAtTarget: [IncreaseResolution, Split]\n"; + test(target_extents, target_levels, flags_at_target, test_cases, option); + } + { + INFO("3D"); + const std::array target_extents{3_st, 9_st, 5_st}; + const std::array target_levels{5_st, 2_st, 4_st}; + const std::array flags_at_target{amr::domain::Flag::Split, + amr::domain::Flag::DecreaseResolution, + amr::domain::Flag::DoNothing}; + const auto test_cases = std::vector{ + std::tuple{std::array{3_st, 9_st, 5_st}, std::array{5_st, 2_st, 4_st}, + std::array{amr::domain::Flag::Split, + amr::domain::Flag::DecreaseResolution, + amr::domain::Flag::DoNothing}}, + std::tuple{ + std::array{3_st, 9_st, 5_st}, std::array{5_st, 5_st, 4_st}, + std::array{amr::domain::Flag::DoNothing, amr::domain::Flag::Join, + amr::domain::Flag::DoNothing}}, + std::tuple{std::array{3_st, 9_st, 3_st}, std::array{5_st, 2_st, 4_st}, + std::array{amr::domain::Flag::DoNothing, + amr::domain::Flag::DoNothing, + amr::domain::Flag::IncreaseResolution}}}; + const std::string option = + "DriveToTarget:\n" + " TargetNumberOfGridPoints: [3, 9, 5]\n" + " TargetRefinementLevels: [5, 2, 4]\n" + " OscillationAtTarget: [Split, DecreaseResolution, DoNothing]\n"; + test(target_extents, target_levels, flags_at_target, test_cases, option); + } }