Skip to content

Commit

Permalink
fixup drive
Browse files Browse the repository at this point in the history
  • Loading branch information
kidder committed Feb 4, 2023
1 parent 8d60744 commit c518a1b
Show file tree
Hide file tree
Showing 3 changed files with 149 additions and 124 deletions.
39 changes: 36 additions & 3 deletions src/ParallelAlgorithms/Amr/Criteria/DriveToTarget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,17 @@
#include <pup_stl.h>

#include "Domain/Amr/Flag.hpp"
#include "Domain/Structure/ElementId.hpp"
#include "NumericalAlgorithms/Spectral/Mesh.hpp"
#include "Utilities/Gsl.hpp"

namespace amr::Criteria {
template <size_t Dim>
DriveToTarget<Dim>::DriveToTarget(
const std::array<size_t, Dim>& target_resolution,
const std::array<size_t, Dim>& target_number_of_grid_points,
const std::array<size_t, Dim>& target_refinement_levels,
const std::array<domain::Flag, Dim>& 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) {}

Expand All @@ -27,11 +30,41 @@ DriveToTarget<Dim>::DriveToTarget(CkMigrateMessage* msg) : Criterion(msg) {}
template <size_t Dim>
void DriveToTarget<Dim>::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 <size_t Dim>
std::array<domain::Flag, Dim> DriveToTarget<Dim>::impl(
const Mesh<Dim>& current_mesh, const ElementId<Dim>& element_id) const {
auto result = make_array<Dim>(domain::Flag::DoNothing);
const std::array<size_t, Dim> 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 <size_t Dim>
PUP::able::PUP_ID DriveToTarget<Dim>::my_PUP_ID = 0; // NOLINT

Expand Down
73 changes: 29 additions & 44 deletions src/ParallelAlgorithms/Amr/Criteria/DriveToTarget.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,21 @@
#include <pup.h>

#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 <size_t>
class ElementId;
template <size_t>
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,
Expand All @@ -32,39 +36,39 @@ namespace amr::Criteria {
template <size_t Dim>
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<size_t, Dim>;
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<size_t, Dim>;
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<domain::Flag, Dim>;
static constexpr Options::String help = {
"The flags returned when at the target."};
};

using options =
tmpl::list<TargetResolution, TargetRefinementLevels, OscillationAtTarget>;
using options = tmpl::list<TargetNumberOfGridPoints, TargetRefinementLevels,
OscillationAtTarget>;

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<size_t, Dim>& target_resolution,
DriveToTarget(const std::array<size_t, Dim>& target_number_of_grid_points,
const std::array<size_t, Dim>& target_refinement_levels,
const std::array<domain::Flag, Dim>& flags_at_target);

Expand All @@ -78,47 +82,28 @@ class DriveToTarget : public Criterion {

using argument_tags = tmpl::list<::domain::Tags::Mesh<Dim>>;

template <typename ArrayIndex, typename Metavariables>
template <typename Metavariables>
auto operator()(const Mesh<Dim>& current_mesh,
Parallel::GlobalCache<Metavariables>& /*cache*/,
const ArrayIndex& array_index) const;
const ElementId<Dim>& element_id) const;

void pup(PUP::er& p) override;

private:
std::array<size_t, Dim> target_resolution_{};
std::array<domain::Flag, Dim> impl(const Mesh<Dim>& current_mesh,
const ElementId<Dim>& element_id) const;

std::array<size_t, Dim> target_number_of_grid_points_{};
std::array<size_t, Dim> target_refinement_levels_{};
std::array<domain::Flag, Dim> flags_at_target_{};
};

template <size_t Dim>
template <typename ArrayIndex, typename Metavariables>
template <typename Metavariables>
auto DriveToTarget<Dim>::operator()(
const Mesh<Dim>& current_mesh,
Parallel::GlobalCache<Metavariables>& /*cache*/,
const ArrayIndex& array_index) const {
auto result = make_array<Dim>(domain::Flag::DoNothing);
const std::array<size_t, Dim> 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<Dim>& element_id) const {
return impl(current_mesh, element_id);
}
} // namespace amr::Criteria
161 changes: 84 additions & 77 deletions tests/Unit/ParallelAlgorithms/Amr/Criteria/Test_DriveToTarget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

0 comments on commit c518a1b

Please sign in to comment.