8#ifndef ABLASTR_FIELDS_MF_REGISTER_H
9#define ABLASTR_FIELDS_MF_REGISTER_H
33 template <
typename,
typename = std::
void_t<>>
34 struct is_castable_to_string : std::false_type {};
37 struct is_castable_to_string<T, std::void_t<decltype(static_cast<std::string>(std::declval<T>()))>> : std::true_type {};
41 std::string getExtractedName (T name)
43 if constexpr(is_castable_to_string<T>())
46 return std::string(name);
77#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
81#if defined(WARPX_DIM_RSPHERE)
84#if defined(WARPX_DIM_3D) || defined(WARPX_DIM_XZ) || defined(WARPX_DIM_1D_Z)
88#if !defined(WARPX_DIM_RSPHERE)
94 return other.
dir < this->dir;
97 operator std::string()
const
99#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
100 if (
dir ==
r) {
return "r"; }
101 if (
dir ==
theta) {
return "theta"; }
103#if defined(WARPX_DIM_RSPHERE)
104 if (
dir == phi) {
return "phi"; }
106#if defined(WARPX_DIM_3D) || defined(WARPX_DIM_XZ) || defined(WARPX_DIM_1D_Z)
107 if (
dir ==
x) {
return "x"; }
108 if (
dir ==
y) {
return "y"; }
110#if !defined(WARPX_DIM_RSPHERE)
111 if (
dir ==
z) {
return "z"; }
113 throw std::runtime_error(
"invalid direction: " + std::to_string(
dir));
114 return std::to_string(
dir);
120#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
121 if (s.compare(
r) == 0) {
dir =
r; }
124#if defined(WARPX_DIM_RSPHERE)
125 if (s.compare(phi) == 0) {
dir = phi; }
127#if defined(WARPX_DIM_3D) || defined(WARPX_DIM_XZ) || defined(WARPX_DIM_1D_Z)
128 if (s.compare(
x) == 0) {
dir =
x; }
129 if (s.compare(
y) == 0) {
dir =
y; }
131#if !defined(WARPX_DIM_RSPHERE)
132 if (s.compare(
z) == 0) {
dir =
z; }
136 throw std::runtime_error(
"invalid direction: " + s);
155 operator int()
const {
return dir; }
159#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
163#if defined(WARPX_DIM_RSPHERE)
167#if defined(WARPX_DIM_3D) || defined(WARPX_DIM_XZ) || defined(WARPX_DIM_1D_Z)
172#if defined(WARPX_DIM_3D) || defined(WARPX_DIM_XZ) || defined(WARPX_DIM_1D_Z) || defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
228 std::optional<Direction>
m_dir = std::nullopt;
296 std::optional<amrex::Real const> initial_value = std::nullopt,
298 bool redistribute_on_remake =
true
302 getExtractedName(name),
310 redistribute_on_remake
341 std::optional<amrex::Real const> initial_value = std::nullopt,
343 bool redistribute_on_remake =
true
347 getExtractedName(name),
356 redistribute_on_remake
371 template<
typename N,
typename A>
377 std::optional<amrex::Real const> initial_value = std::nullopt
381 getExtractedName(new_name),
382 getExtractedName(alias_name),
400 template<
typename N,
typename A>
407 std::optional<amrex::Real const> initial_value = std::nullopt
411 getExtractedName(new_name),
412 getExtractedName(alias_name),
433 getExtractedName(name),
454 getExtractedName(name),
474 getExtractedName(name),
495 getExtractedName(name),
518 getExtractedName(name),
540 getExtractedName(name),
563 getExtractedName(name),
584 bool skip_level_0=
false
588 getExtractedName(name),
598 bool skip_level_0=
false
602 getExtractedName(name),
626 getExtractedName(name),
638 getExtractedName(name),
660 bool skip_level_0=
false
664 getExtractedName(name),
674 bool skip_level_0=
false
678 getExtractedName(name),
689 [[nodiscard]] std::vector<std::string>
754 [[nodiscard]] std::string
767 [[nodiscard]] std::string
777 std::string
const & internal_name
781 std::string
const & internal_name
788 std::string
const & internal_name
793 std::string
const & name,
799 std::optional<amrex::Real const> initial_value = std::nullopt,
801 bool redistribute_on_remake =
true
805 std::string
const & name,
812 std::optional<amrex::Real const> initial_value = std::nullopt,
814 bool redistribute_on_remake =
true
819 std::string
const & new_name,
820 std::string
const & alias_name,
822 std::optional<amrex::Real const> initial_value = std::nullopt
826 std::string
const & new_name,
827 std::string
const & alias_name,
830 std::optional<amrex::Real const> initial_value = std::nullopt
835 std::string
const & name,
840 std::string
const & name,
846 std::string
const & name,
852 std::string
const & name,
857 std::string
const & name,
862 std::string
const & name,
868 std::string
const & name,
874 std::string
const & name,
880 std::string
const & name,
886 std::string
const & name,
891 std::string
const & name,
896 std::string
const & name,
902 std::string
const & name,
909 std::string
const & name,
914 std::string
const & name,
935#if defined(WARPX_DIM_3D) || defined(WARPX_DIM_XZ) || defined(WARPX_DIM_1D_Z)
937#elif defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
939#elif defined(WARPX_DIM_RSPHERE)
950 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const & old_vectorfield
Definition MultiFabRegister.H:71
static const Direction r
Definition MultiFabRegister.H:160
static const Direction z
Definition MultiFabRegister.H:173
static const Direction y
Definition MultiFabRegister.H:169
constexpr Direction(int d)
Definition MultiFabRegister.H:75
static const Direction x
Definition MultiFabRegister.H:168
static const Direction theta
Definition MultiFabRegister.H:161
Definition MultiFabRegister.H:71
static const Direction r
Definition MultiFabRegister.H:78
int dir
Definition MultiFabRegister.H:72
Direction(Direction &&)=default
static const Direction z
Definition MultiFabRegister.H:89
Direction & operator=(const Direction &)=default
Direction(std::string const &s)
Definition MultiFabRegister.H:117
static const Direction y
Definition MultiFabRegister.H:86
constexpr Direction(int d)
Definition MultiFabRegister.H:75
static const Direction x
Definition MultiFabRegister.H:85
Direction(char const c)
Definition MultiFabRegister.H:144
bool operator<(const Direction &other) const
Definition MultiFabRegister.H:92
Direction(char const *c)
Definition MultiFabRegister.H:141
Direction(const Direction &)=default
static const Direction theta
Definition MultiFabRegister.H:79
Definition EffectivePotentialPoissonSolver.H:63
VectorField a2m(std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &old_vectorfield)
Definition MultiFabRegister.cpp:645
amrex::Vector< ConstVectorField > ConstMultiLevelVectorField
Definition MultiFabRegister.H:212
std::array< amrex::MultiFab const *, 3 > ConstVectorField
Definition MultiFabRegister.H:196
std::array< amrex::MultiFab *, 3 > VectorField
Definition MultiFabRegister.H:191
amrex::Vector< ScalarField > MultiLevelScalarField
Definition MultiFabRegister.H:200
amrex::MultiFab * ScalarField
Definition MultiFabRegister.H:180
amrex::Vector< ConstScalarField > ConstMultiLevelScalarField
Definition MultiFabRegister.H:204
amrex::MultiFab const * ConstScalarField
Definition MultiFabRegister.H:186
amrex::Vector< VectorField > MultiLevelVectorField
Definition MultiFabRegister.H:208
std::string getEnumNameString(T const &v)
Definition MultiFabRegister.H:221
amrex::MultiFab m_mf
Definition MultiFabRegister.H:225
AMREX_INLINE bool is_alias() const
Definition MultiFabRegister.H:253
int m_level
Definition MultiFabRegister.H:231
std::optional< Direction > m_dir
Definition MultiFabRegister.H:228
AMREX_INLINE bool is_vector() const
Definition MultiFabRegister.H:245
bool m_redistribute_on_remake
Definition MultiFabRegister.H:237
std::string m_owner
Definition MultiFabRegister.H:240
bool m_remake
Definition MultiFabRegister.H:234
amrex::MultiFab * alias_init(N new_name, A alias_name, int level, std::optional< amrex::Real const > initial_value=std::nullopt)
Definition MultiFabRegister.H:373
~MultiFabRegister()=default
bool internal_has(std::string const &internal_name)
Definition MultiFabRegister.cpp:342
ConstMultiLevelScalarField get_mr_levels(T name, int finest_level, bool skip_level_0=false) const
Definition MultiFabRegister.H:595
MultiFabRegister & operator=(MultiFabRegister &&)=delete
MultiLevelScalarField get_mr_levels(T name, int finest_level, bool skip_level_0=false)
Definition MultiFabRegister.H:581
amrex::MultiFab const * get(T name, Direction dir, int level) const
Definition MultiFabRegister.H:556
amrex::MultiFab * alloc_init(T name, int level, amrex::BoxArray const &ba, amrex::DistributionMapping const &dm, int ncomp, amrex::IntVect const &ngrow, std::optional< amrex::Real const > initial_value=std::nullopt, bool remake=true, bool redistribute_on_remake=true)
Definition MultiFabRegister.H:289
std::vector< std::string > list() const
Definition MultiFabRegister.cpp:560
MultiFabRegister()=default
std::string mf_name(std::string name, int level) const
Definition MultiFabRegister.cpp:615
MultiFabRegister(MultiFabRegister &&)=delete
VectorField get_alldirs(T name, int level)
Definition MultiFabRegister.H:620
ConstVectorField get_alldirs(T name, int level) const
Definition MultiFabRegister.H:632
bool internal_has_vector(std::string const &name, int level) const
Definition MultiFabRegister.cpp:326
void remake_level(int other_level, amrex::DistributionMapping const &new_dm)
Definition MultiFabRegister.cpp:247
void clear_level(int level)
Definition MultiFabRegister.cpp:599
void internal_erase(std::string const &name, int level)
Definition MultiFabRegister.cpp:570
static std::vector< Direction > m_all_dirs
Definition MultiFabRegister.H:934
MultiLevelScalarField internal_get_mr_levels(std::string const &name, int finest_level, bool skip_level_0)
Definition MultiFabRegister.cpp:418
amrex::MultiFab * alloc_init(T name, Direction dir, int level, amrex::BoxArray const &ba, amrex::DistributionMapping const &dm, int ncomp, amrex::IntVect const &ngrow, std::optional< amrex::Real const > initial_value=std::nullopt, bool remake=true, bool redistribute_on_remake=true)
Definition MultiFabRegister.H:333
std::map< std::string, MultiFabOwner > m_mf_register
Definition MultiFabRegister.H:923
amrex::MultiFab * get(T name, Direction dir, int level)
Definition MultiFabRegister.H:511
amrex::MultiFab * internal_get(std::string const &internal_name)
Definition MultiFabRegister.cpp:350
amrex::MultiFab * get(T name, int level)
Definition MultiFabRegister.H:489
MultiLevelVectorField internal_get_mr_levels_alldirs(std::string const &name, int finest_level, bool skip_level_0)
Definition MultiFabRegister.cpp:498
ConstMultiLevelVectorField get_mr_levels_alldirs(T name, int finest_level, bool skip_level_0=false) const
Definition MultiFabRegister.H:671
bool has_vector(T name, int level) const
Definition MultiFabRegister.H:468
MultiLevelVectorField get_mr_levels_alldirs(T name, int finest_level, bool skip_level_0=false)
Definition MultiFabRegister.H:657
amrex::MultiFab const * get(T name, int level) const
Definition MultiFabRegister.H:534
amrex::MultiFab * alias_init(N new_name, A alias_name, Direction dir, int level, std::optional< amrex::Real const > initial_value=std::nullopt)
Definition MultiFabRegister.H:402
amrex::MultiFab * internal_alloc_init(std::string const &name, int level, amrex::BoxArray const &ba, amrex::DistributionMapping const &dm, int ncomp, amrex::IntVect const &ngrow, std::optional< amrex::Real const > initial_value=std::nullopt, bool remake=true, bool redistribute_on_remake=true)
Definition MultiFabRegister.cpp:26
MultiFabRegister & operator=(MultiFabRegister const &)=delete
bool has(T name, int level) const
Definition MultiFabRegister.H:427
amrex::MultiFab * internal_alias_init(std::string const &new_name, std::string const &alias_name, int level, std::optional< amrex::Real const > initial_value=std::nullopt)
Definition MultiFabRegister.cpp:129
void erase(T name, int level)
Definition MultiFabRegister.H:699
VectorField internal_get_alldirs(std::string const &name, int level)
Definition MultiFabRegister.cpp:464
bool has(T name, Direction dir, int level) const
Definition MultiFabRegister.H:447
void erase(T name, Direction dir, int level)
Definition MultiFabRegister.H:715
MultiFabRegister(MultiFabRegister const &)=delete