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 inline static const std::string
r_string =
"r";
84#if defined(WARPX_DIM_RSPHERE)
87 inline static const std::string phi_string =
"phi";
89#if defined(WARPX_DIM_3D) || defined(WARPX_DIM_XZ) || defined(WARPX_DIM_1D_Z)
93 inline static const std::string
x_string =
"x";
94 inline static const std::string
y_string =
"y";
96#if !defined(WARPX_DIM_RSPHERE)
99 inline static const std::string
z_string =
"z";
104 return other.
dir < this->dir;
107 operator std::string() const
109#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
113#if defined(WARPX_DIM_RSPHERE)
114 if (
dir == phi) {
return phi_string; }
116#if defined(WARPX_DIM_3D) || defined(WARPX_DIM_XZ) || defined(WARPX_DIM_1D_Z)
120#if !defined(WARPX_DIM_RSPHERE)
123 throw std::runtime_error(
"invalid direction: " + std::to_string(
dir));
124 return std::to_string(
dir);
130#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
134#if defined(WARPX_DIM_RSPHERE)
135 if (s == phi_string) {
dir = phi; }
137#if defined(WARPX_DIM_3D) || defined(WARPX_DIM_XZ) || defined(WARPX_DIM_1D_Z)
141#if !defined(WARPX_DIM_RSPHERE)
146 throw std::runtime_error(
"invalid direction: " + s);
165 operator int()
const {
return dir; }
169#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
173#if defined(WARPX_DIM_RSPHERE)
177#if defined(WARPX_DIM_3D) || defined(WARPX_DIM_XZ) || defined(WARPX_DIM_1D_Z)
182#if defined(WARPX_DIM_3D) || defined(WARPX_DIM_XZ) || defined(WARPX_DIM_1D_Z) || defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
238 std::optional<Direction>
m_dir = std::nullopt;
306 std::optional<amrex::Real const> initial_value = std::nullopt,
308 bool redistribute_on_remake =
true
312 getExtractedName(name),
320 redistribute_on_remake
351 std::optional<amrex::Real const> initial_value = std::nullopt,
353 bool redistribute_on_remake =
true
357 getExtractedName(name),
366 redistribute_on_remake
381 template<
typename N,
typename A>
387 std::optional<amrex::Real const> initial_value = std::nullopt
391 getExtractedName(new_name),
392 getExtractedName(alias_name),
410 template<
typename N,
typename A>
417 std::optional<amrex::Real const> initial_value = std::nullopt
421 getExtractedName(new_name),
422 getExtractedName(alias_name),
443 getExtractedName(name),
464 getExtractedName(name),
484 getExtractedName(name),
505 getExtractedName(name),
528 getExtractedName(name),
550 getExtractedName(name),
573 getExtractedName(name),
594 bool skip_level_0=
false
598 getExtractedName(name),
608 bool skip_level_0=
false
612 getExtractedName(name),
636 getExtractedName(name),
648 getExtractedName(name),
670 bool skip_level_0=
false
674 getExtractedName(name),
684 bool skip_level_0=
false
688 getExtractedName(name),
699 [[nodiscard]] std::vector<std::string>
764 [[nodiscard]] std::string
777 [[nodiscard]] std::string
787 std::string
const & internal_name
791 std::string
const & internal_name
798 std::string
const & internal_name
803 std::string
const & name,
809 std::optional<amrex::Real const> initial_value = std::nullopt,
811 bool redistribute_on_remake =
true
815 std::string
const & name,
822 std::optional<amrex::Real const> initial_value = std::nullopt,
824 bool redistribute_on_remake =
true
829 std::string
const & new_name,
830 std::string
const & alias_name,
832 std::optional<amrex::Real const> initial_value = std::nullopt
836 std::string
const & new_name,
837 std::string
const & alias_name,
840 std::optional<amrex::Real const> initial_value = std::nullopt
845 std::string
const & name,
850 std::string
const & name,
856 std::string
const & name,
862 std::string
const & name,
867 std::string
const & name,
872 std::string
const & name,
878 std::string
const & name,
884 std::string
const & name,
890 std::string
const & name,
896 std::string
const & name,
901 std::string
const & name,
906 std::string
const & name,
912 std::string
const & name,
919 std::string
const & name,
924 std::string
const & name,
945#if defined(WARPX_DIM_3D) || defined(WARPX_DIM_XZ) || defined(WARPX_DIM_1D_Z)
947#elif defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
949#elif defined(WARPX_DIM_RSPHERE)
960 std::array< std::unique_ptr<amrex::MultiFab>, 3 >
const & old_vectorfield
Definition MultiFabRegister.H:71
static const Direction r
Definition MultiFabRegister.H:170
static const Direction z
Definition MultiFabRegister.H:183
static const Direction y
Definition MultiFabRegister.H:179
constexpr Direction(int d)
Definition MultiFabRegister.H:75
static const Direction x
Definition MultiFabRegister.H:178
static const Direction theta
Definition MultiFabRegister.H:171
Definition MultiFabRegister.H:71
static const Direction r
Definition MultiFabRegister.H:78
int dir
Definition MultiFabRegister.H:72
static const std::string z_string
Definition MultiFabRegister.H:99
Direction(Direction &&)=default
static const Direction z
Definition MultiFabRegister.H:97
Direction & operator=(const Direction &)=default
static const std::string y_string
Definition MultiFabRegister.H:94
Direction(std::string const &s)
Definition MultiFabRegister.H:127
static const Direction y
Definition MultiFabRegister.H:91
constexpr Direction(int d)
Definition MultiFabRegister.H:75
static const std::string r_string
Definition MultiFabRegister.H:81
static const Direction x
Definition MultiFabRegister.H:90
Direction(char const c)
Definition MultiFabRegister.H:154
bool operator<(const Direction &other) const
Definition MultiFabRegister.H:102
static const std::string x_string
Definition MultiFabRegister.H:93
static const std::string theta_string
Definition MultiFabRegister.H:82
Direction(char const *c)
Definition MultiFabRegister.H:151
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:222
std::array< amrex::MultiFab const *, 3 > ConstVectorField
Definition MultiFabRegister.H:206
std::array< amrex::MultiFab *, 3 > VectorField
Definition MultiFabRegister.H:201
amrex::Vector< ScalarField > MultiLevelScalarField
Definition MultiFabRegister.H:210
amrex::MultiFab * ScalarField
Definition MultiFabRegister.H:190
amrex::Vector< ConstScalarField > ConstMultiLevelScalarField
Definition MultiFabRegister.H:214
amrex::MultiFab const * ConstScalarField
Definition MultiFabRegister.H:196
amrex::Vector< VectorField > MultiLevelVectorField
Definition MultiFabRegister.H:218
std::string getEnumNameString(T const &v)
Definition MultiFabRegister.H:231
amrex::MultiFab m_mf
Definition MultiFabRegister.H:235
AMREX_INLINE bool is_alias() const
Definition MultiFabRegister.H:263
int m_level
Definition MultiFabRegister.H:241
std::optional< Direction > m_dir
Definition MultiFabRegister.H:238
AMREX_INLINE bool is_vector() const
Definition MultiFabRegister.H:255
bool m_redistribute_on_remake
Definition MultiFabRegister.H:247
std::string m_owner
Definition MultiFabRegister.H:250
bool m_remake
Definition MultiFabRegister.H:244
amrex::MultiFab * alias_init(N new_name, A alias_name, int level, std::optional< amrex::Real const > initial_value=std::nullopt)
Definition MultiFabRegister.H:383
~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:605
MultiFabRegister & operator=(MultiFabRegister &&)=delete
MultiLevelScalarField get_mr_levels(T name, int finest_level, bool skip_level_0=false)
Definition MultiFabRegister.H:591
amrex::MultiFab const * get(T name, Direction dir, int level) const
Definition MultiFabRegister.H:566
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:299
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:630
ConstVectorField get_alldirs(T name, int level) const
Definition MultiFabRegister.H:642
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:944
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:343
std::map< std::string, MultiFabOwner > m_mf_register
Definition MultiFabRegister.H:933
amrex::MultiFab * get(T name, Direction dir, int level)
Definition MultiFabRegister.H:521
amrex::MultiFab * internal_get(std::string const &internal_name)
Definition MultiFabRegister.cpp:350
amrex::MultiFab * get(T name, int level)
Definition MultiFabRegister.H:499
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:681
bool has_vector(T name, int level) const
Definition MultiFabRegister.H:478
MultiLevelVectorField get_mr_levels_alldirs(T name, int finest_level, bool skip_level_0=false)
Definition MultiFabRegister.H:667
amrex::MultiFab const * get(T name, int level) const
Definition MultiFabRegister.H:544
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:412
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:437
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:709
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:457
void erase(T name, Direction dir, int level)
Definition MultiFabRegister.H:725
MultiFabRegister(MultiFabRegister const &)=delete