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(std::move(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;
310 std::optional<amrex::Real const> initial_value = std::nullopt,
312 bool redistribute_on_remake =
true,
313 bool checkpoint_restart =
false
317 getExtractedName(std::move(name)),
325 redistribute_on_remake,
358 std::optional<amrex::Real const> initial_value = std::nullopt,
360 bool redistribute_on_remake =
true,
361 bool checkpoint_restart =
false
365 getExtractedName(std::move(name)),
374 redistribute_on_remake,
390 template<
typename N,
typename A>
396 std::optional<amrex::Real const> initial_value = std::nullopt
400 getExtractedName(new_name),
401 getExtractedName(alias_name),
419 template<
typename N,
typename A>
426 std::optional<amrex::Real const> initial_value = std::nullopt
430 getExtractedName(new_name),
431 getExtractedName(alias_name),
452 getExtractedName(std::move(name)),
473 getExtractedName(std::move(name)),
493 getExtractedName(std::move(name)),
514 getExtractedName(std::move(name)),
537 getExtractedName(std::move(name)),
559 getExtractedName(std::move(name)),
582 getExtractedName(std::move(name)),
603 bool skip_level_0=
false
607 getExtractedName(std::move(name)),
617 bool skip_level_0=
false
621 getExtractedName(std::move(name)),
645 getExtractedName(std::move(name)),
657 getExtractedName(std::move(name)),
679 bool skip_level_0=
false
683 getExtractedName(std::move(name)),
693 bool skip_level_0=
false
697 getExtractedName(std::move(name)),
708 [[nodiscard]] std::vector<std::string>
775 std::string
const & dir
786 std::string
const & dir
795 [[nodiscard]] std::string
808 [[nodiscard]] std::string
818 std::string
const & internal_name
822 std::string
const & internal_name
829 std::string
const & internal_name
834 std::string
const & name,
840 std::optional<amrex::Real const> initial_value = std::nullopt,
842 bool redistribute_on_remake =
true,
843 bool checkpoint_restart =
false
847 std::string
const & name,
854 std::optional<amrex::Real const> initial_value = std::nullopt,
856 bool redistribute_on_remake =
true,
857 bool checkpoint_restart =
false
862 std::string
const & new_name,
863 std::string
const & alias_name,
865 std::optional<amrex::Real const> initial_value = std::nullopt
869 std::string
const & new_name,
870 std::string
const & alias_name,
873 std::optional<amrex::Real const> initial_value = std::nullopt
878 std::string
const & name,
883 std::string
const & name,
889 std::string
const & name,
895 std::string
const & name,
900 std::string
const & name,
905 std::string
const & name,
911 std::string
const & name,
917 std::string
const & name,
923 std::string
const & name,
929 std::string
const & name,
934 std::string
const & name,
939 std::string
const & name,
945 std::string
const & name,
952 std::string
const & name,
957 std::string
const & name,
978#if defined(WARPX_DIM_3D) || defined(WARPX_DIM_XZ) || defined(WARPX_DIM_1D_Z)
980#elif defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
982#elif defined(WARPX_DIM_RSPHERE)
993 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
std::string getEnumNameString(T const &v)
Definition EffectivePotentialPoissonSolver.H:63
VectorField a2m(std::array< std::unique_ptr< amrex::MultiFab >, 3 > const &old_vectorfield)
Definition MultiFabRegister.cpp:692
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
Definition MultiFabRegister.H:231
amrex::MultiFab m_mf
Definition MultiFabRegister.H:235
AMREX_INLINE bool is_alias() const
Definition MultiFabRegister.H:266
int m_level
Definition MultiFabRegister.H:241
bool m_checkpoint_restart
Definition MultiFabRegister.H:250
std::optional< Direction > m_dir
Definition MultiFabRegister.H:238
AMREX_INLINE bool is_vector() const
Definition MultiFabRegister.H:258
bool m_redistribute_on_remake
Definition MultiFabRegister.H:247
std::string m_owner
Definition MultiFabRegister.H:253
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:392
void write_checkpoints(int level, std::string const &dir)
Definition MultiFabRegister.cpp:310
void read_restarts(int level, std::string const &dir)
Definition MultiFabRegister.cpp:330
~MultiFabRegister()=default
bool internal_has(std::string const &internal_name)
Definition MultiFabRegister.cpp:389
ConstMultiLevelScalarField get_mr_levels(T name, int finest_level, bool skip_level_0=false) const
Definition MultiFabRegister.H:614
MultiFabRegister & operator=(MultiFabRegister &&)=delete
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, bool checkpoint_restart=false)
Definition MultiFabRegister.H:303
MultiLevelScalarField get_mr_levels(T name, int finest_level, bool skip_level_0=false)
Definition MultiFabRegister.H:600
amrex::MultiFab const * get(T name, Direction dir, int level) const
Definition MultiFabRegister.H:575
std::vector< std::string > list() const
Definition MultiFabRegister.cpp:607
MultiFabRegister()=default
std::string mf_name(std::string name, int level) const
Definition MultiFabRegister.cpp:662
MultiFabRegister(MultiFabRegister &&)=delete
VectorField get_alldirs(T name, int level)
Definition MultiFabRegister.H:639
ConstVectorField get_alldirs(T name, int level) const
Definition MultiFabRegister.H:651
bool internal_has_vector(std::string const &name, int level) const
Definition MultiFabRegister.cpp:373
void remake_level(int other_level, amrex::DistributionMapping const &new_dm)
Definition MultiFabRegister.cpp:254
void clear_level(int level)
Definition MultiFabRegister.cpp:646
void internal_erase(std::string const &name, int level)
Definition MultiFabRegister.cpp:617
static std::vector< Direction > m_all_dirs
Definition MultiFabRegister.H:977
MultiLevelScalarField internal_get_mr_levels(std::string const &name, int finest_level, bool skip_level_0)
Definition MultiFabRegister.cpp:465
std::map< std::string, MultiFabOwner > m_mf_register
Definition MultiFabRegister.H:966
amrex::MultiFab * get(T name, Direction dir, int level)
Definition MultiFabRegister.H:530
amrex::MultiFab * internal_get(std::string const &internal_name)
Definition MultiFabRegister.cpp:397
amrex::MultiFab * get(T name, int level)
Definition MultiFabRegister.H:508
MultiLevelVectorField internal_get_mr_levels_alldirs(std::string const &name, int finest_level, bool skip_level_0)
Definition MultiFabRegister.cpp:545
ConstMultiLevelVectorField get_mr_levels_alldirs(T name, int finest_level, bool skip_level_0=false) const
Definition MultiFabRegister.H:690
bool has_vector(T name, int level) const
Definition MultiFabRegister.H:487
MultiLevelVectorField get_mr_levels_alldirs(T name, int finest_level, bool skip_level_0=false)
Definition MultiFabRegister.H:676
amrex::MultiFab const * get(T name, int level) const
Definition MultiFabRegister.H:553
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, bool checkpoint_restart=false)
Definition MultiFabRegister.H:350
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, bool checkpoint_restart=false)
Definition MultiFabRegister.cpp:27
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:421
MultiFabRegister & operator=(MultiFabRegister const &)=delete
bool has(T name, int level) const
Definition MultiFabRegister.H:446
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:134
void erase(T name, int level)
Definition MultiFabRegister.H:718
VectorField internal_get_alldirs(std::string const &name, int level)
Definition MultiFabRegister.cpp:511
bool has(T name, Direction dir, int level) const
Definition MultiFabRegister.H:466
void erase(T name, Direction dir, int level)
Definition MultiFabRegister.H:734
MultiFabRegister(MultiFabRegister const &)=delete