WarpX
Loading...
Searching...
No Matches
MultiFabRegister.H
Go to the documentation of this file.
1/* Copyright 2024 The ABLASTR Community
2 *
3 * This file is part of ABLASTR.
4 *
5 * License: BSD-3-Clause-LBNL
6 * Authors: Axel Huebl
7 */
8#ifndef ABLASTR_FIELDS_MF_REGISTER_H
9#define ABLASTR_FIELDS_MF_REGISTER_H
10
11#include <AMReX_BaseFwd.H>
12#include <AMReX_Enum.H>
13#include <AMReX_Extension.H>
14#include <AMReX_IntVect.H>
15#include <AMReX_MultiFab.H>
16#include <AMReX_REAL.H>
17#include <AMReX_Vector.H>
18
19#include <array>
20#include <map>
21#include <memory>
22#include <optional>
23#include <stdexcept>
24#include <string>
25#include <type_traits>
26#include <utility>
27#include <vector>
28
29
30namespace
31{
32 // type trait helpers in lieu of an amrex::is_amrex_enum
33 template <typename, typename = std::void_t<>>
34 struct is_castable_to_string : std::false_type {};
35
36 template <typename T>
37 struct is_castable_to_string<T, std::void_t<decltype(static_cast<std::string>(std::declval<T>()))>> : std::true_type {};
38
40 template<typename T>
41 std::string getExtractedName (T name)
42 {
43 if constexpr(is_castable_to_string<T>())
44 {
45 // already a unique string key
46 return std::string(std::move(name));
47 } else
48 {
49 // user-defined AMREX_ENUM or compile error
50 return amrex::getEnumNameString(name);
51 }
52 }
53}
54
55namespace ablastr::fields
56{
71 {
72 int dir = 0;
73
74 public:
75 constexpr explicit Direction (int d) : dir(d) {}
76
77#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
78 static const Direction r;
79 static const Direction theta;
80
81 inline static const std::string r_string = "r";
82 inline static const std::string theta_string = "theta";
83#endif
84#if defined(WARPX_DIM_RSPHERE)
85 static const Direction phi;
86
87 inline static const std::string phi_string = "phi";
88#endif
89#if defined(WARPX_DIM_3D) || defined(WARPX_DIM_XZ) || defined(WARPX_DIM_1D_Z)
90 static const Direction x;
91 static const Direction y;
92
93 inline static const std::string x_string = "x";
94 inline static const std::string y_string = "y";
95#endif
96#if !defined(WARPX_DIM_RSPHERE)
97 static const Direction z;
98
99 inline static const std::string z_string = "z";
100#endif
101
102 bool operator<(const Direction& other) const
103 {
104 return other.dir < this->dir;
105 }
106
107 operator std::string() const // NOLINT(google-explicit-constructor)
108 {
109#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
110 if (dir == r) { return r_string; }
111 if (dir == theta) { return theta_string; }
112#endif
113#if defined(WARPX_DIM_RSPHERE)
114 if (dir == phi) { return phi_string; }
115#endif
116#if defined(WARPX_DIM_3D) || defined(WARPX_DIM_XZ) || defined(WARPX_DIM_1D_Z)
117 if (dir == x) { return x_string; }
118 if (dir == y) { return y_string; }
119#endif
120#if !defined(WARPX_DIM_RSPHERE)
121 if (dir == z) { return z_string; }
122#endif
123 throw std::runtime_error("invalid direction: " + std::to_string(dir));
124 return std::to_string(dir);
125 }
126
127 Direction (std::string const & s) : // NOLINT(google-explicit-constructor)
128 dir{-1}
129 {
130#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
131 if (s == r_string) { dir = r; }
132 if (s == theta_string) { dir = theta; }
133#endif
134#if defined(WARPX_DIM_RSPHERE)
135 if (s == phi_string) { dir = phi; }
136#endif
137#if defined(WARPX_DIM_3D) || defined(WARPX_DIM_XZ) || defined(WARPX_DIM_1D_Z)
138 if (s == x_string) { dir = x; }
139 if (s == y_string) { dir = y; }
140#endif
141#if !defined(WARPX_DIM_RSPHERE)
142 if (s == z_string) { dir = z; }
143#endif
144
145 if (dir == -1) {
146 throw std::runtime_error("invalid direction: " + s);
147 }
148 }
149
150 // e.g., "x"
151 Direction (char const * c) : dir{Direction{c}} {} // NOLINT(google-explicit-constructor)
152
153 // e.g., 'x'
154 Direction (char const c) : dir{Direction{c}} {} // NOLINT(google-explicit-constructor)
155
156 // rule of five: define default constructors and the destructor
157 // because we defined a special one above for char
158 ~Direction () = default;
159 Direction (const Direction&) = default;
160 Direction& operator= (const Direction&) = default;
161 Direction (Direction&&) = default;
163
164 /* TODO: just temporary int compatibility */
165 operator int() const { return dir; } // NOLINT(google-explicit-constructor)
166
167 };
168
169#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
170 inline constexpr Direction Direction::r = Direction{0};
171 inline constexpr Direction Direction::theta = Direction{1};
172#endif
173#if defined(WARPX_DIM_RSPHERE)
174 inline constexpr Direction Direction::phi = Direction{2};
175#endif
176
177#if defined(WARPX_DIM_3D) || defined(WARPX_DIM_XZ) || defined(WARPX_DIM_1D_Z)
178 inline constexpr Direction Direction::x = Direction{0};
179 inline constexpr Direction Direction::y = Direction{1};
180#endif
181
182#if defined(WARPX_DIM_3D) || defined(WARPX_DIM_XZ) || defined(WARPX_DIM_1D_Z) || defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
183 inline constexpr Direction Direction::z = Direction{2};
184#endif
185
191
197
200 //using VectorField = ablastr::utils::ConstMap<Direction, amrex::MultiFab *>;
201 using VectorField = std::array<amrex::MultiFab *, 3>;
202
205 //using VectorField = ablastr::utils::ConstMap<Direction, amrex::MultiFab const *>;
206 using ConstVectorField = std::array<amrex::MultiFab const *, 3>;
207
211
215
219
223
231 {
232 // TODO: also add iMultiFab via std::variant
233
236
238 std::optional<Direction> m_dir = std::nullopt;
239
241 int m_level = 0;
242
244 bool m_remake = true;
245
248
251
253 std::string m_owner;
254
257 bool
258 is_vector () const { return m_dir.has_value(); }
259
265 bool
266 is_alias () const { return !m_owner.empty(); }
267 };
268
275 {
276 // Avoid accidental copies when passing to member functions
277 MultiFabRegister() = default;
282 ~MultiFabRegister() = default;
283
301 template<typename T>
304 T name,
305 int level,
306 amrex::BoxArray const & ba,
308 int ncomp,
309 amrex::IntVect const & ngrow,
310 std::optional<amrex::Real const> initial_value = std::nullopt,
311 bool remake = true,
312 bool redistribute_on_remake = true,
313 bool checkpoint_restart = false
314 )
315 {
316 return internal_alloc_init(
317 getExtractedName(std::move(name)),
318 level,
319 ba,
320 dm,
321 ncomp,
322 ngrow,
323 initial_value,
324 remake,
325 redistribute_on_remake,
326 checkpoint_restart
327 );
328 }
329
348 template<typename T>
351 T name,
352 Direction dir,
353 int level,
354 amrex::BoxArray const & ba,
356 int ncomp,
357 amrex::IntVect const & ngrow,
358 std::optional<amrex::Real const> initial_value = std::nullopt,
359 bool remake = true,
360 bool redistribute_on_remake = true,
361 bool checkpoint_restart = false
362 )
363 {
364 return internal_alloc_init(
365 getExtractedName(std::move(name)),
366 dir,
367 level,
368 ba,
369 dm,
370 ncomp,
371 ngrow,
372 initial_value,
373 remake,
374 redistribute_on_remake,
375 checkpoint_restart
376 );
377 }
378
390 template<typename N, typename A>
393 N new_name,
394 A alias_name,
395 int level,
396 std::optional<amrex::Real const> initial_value = std::nullopt
397 )
398 {
399 return internal_alias_init(
400 getExtractedName(new_name),
401 getExtractedName(alias_name),
402 level,
403 initial_value
404 );
405 }
406
419 template<typename N, typename A>
422 N new_name,
423 A alias_name,
424 Direction dir,
425 int level,
426 std::optional<amrex::Real const> initial_value = std::nullopt
427 )
428 {
429 return internal_alias_init(
430 getExtractedName(new_name),
431 getExtractedName(alias_name),
432 dir,
433 level,
434 initial_value
435 );
436 }
437
444 template<typename T>
445 [[nodiscard]] bool
447 T name,
448 int level
449 ) const
450 {
451 return internal_has(
452 getExtractedName(std::move(name)),
453 level
454 );
455 }
456
464 template<typename T>
465 [[nodiscard]] bool
467 T name,
468 Direction dir,
469 int level
470 ) const
471 {
472 return internal_has(
473 getExtractedName(std::move(name)),
474 dir,
475 level
476 );
477 }
478
485 template<typename T>
486 [[nodiscard]] bool
488 T name,
489 int level
490 ) const
491 {
492 return internal_has_vector(
493 getExtractedName(std::move(name)),
494 level
495 );
496 }
497
506 template<typename T>
507 [[nodiscard]] amrex::MultiFab*
509 T name,
510 int level
511 )
512 {
513 return internal_get(
514 getExtractedName(std::move(name)),
515 level
516 );
517 }
518
528 template<typename T>
529 [[nodiscard]] amrex::MultiFab*
531 T name,
532 Direction dir,
533 int level
534 )
535 {
536 return internal_get(
537 getExtractedName(std::move(name)),
538 dir,
539 level
540 );
541 }
542
551 template<typename T>
552 [[nodiscard]] amrex::MultiFab const *
554 T name,
555 int level
556 ) const
557 {
558 return internal_get(
559 getExtractedName(std::move(name)),
560 level
561 );
562 }
563
573 template<typename T>
574 [[nodiscard]] amrex::MultiFab const *
576 T name,
577 Direction dir,
578 int level
579 ) const
580 {
581 return internal_get(
582 getExtractedName(std::move(name)),
583 dir,
584 level
585 );
586 }
587
598 template<typename T>
599 [[nodiscard]] MultiLevelScalarField
601 T name,
602 int finest_level,
603 bool skip_level_0=false
604 )
605 {
607 getExtractedName(std::move(name)),
608 finest_level,
609 skip_level_0
610 );
611 }
612 template<typename T>
613 [[nodiscard]] ConstMultiLevelScalarField
615 T name,
616 int finest_level,
617 bool skip_level_0=false
618 ) const
619 {
621 getExtractedName(std::move(name)),
622 finest_level,
623 skip_level_0
624 );
625 }
626
627
637 template<typename T>
638 [[nodiscard]] VectorField
640 T name,
641 int level
642 )
643 {
645 getExtractedName(std::move(name)),
646 level
647 );
648 }
649 template<typename T>
650 [[nodiscard]] ConstVectorField
652 T name,
653 int level
654 ) const
655 {
657 getExtractedName(std::move(name)),
658 level
659 );
660 }
661
662
674 template<typename T>
675 [[nodiscard]] MultiLevelVectorField
677 T name,
678 int finest_level,
679 bool skip_level_0=false
680 )
681 {
683 getExtractedName(std::move(name)),
684 finest_level,
685 skip_level_0
686 );
687 }
688 template<typename T>
689 [[nodiscard]] ConstMultiLevelVectorField
691 T name,
692 int finest_level,
693 bool skip_level_0=false
694 ) const
695 {
697 getExtractedName(std::move(name)),
698 finest_level,
699 skip_level_0
700 );
701 }
702
703
708 [[nodiscard]] std::vector<std::string>
709 list () const;
710
716 template<typename T>
717 void
719 T name,
720 int level
721 )
722 {
723 internal_erase(getExtractedName(std::move(name)), level);
724 }
725
732 template<typename T>
733 void
735 T name,
736 Direction dir,
737 int level
738 )
739 {
740 internal_erase(getExtractedName(name), dir, level);
741 }
742
749 void
751 int level
752 );
753
761 void
763 int other_level,
764 amrex::DistributionMapping const & new_dm
765 );
766
772 void
774 int level,
775 std::string const & dir
776 );
777
783 void
785 int level,
786 std::string const & dir
787 );
788
795 [[nodiscard]] std::string
796 mf_name (
797 std::string name,
798 int level
799 ) const;
800
808 [[nodiscard]] std::string
809 mf_name (
810 std::string name,
811 Direction dir,
812 int level
813 ) const;
814
816 [[nodiscard]] bool
818 std::string const & internal_name
819 );
820 [[nodiscard]] amrex::MultiFab *
822 std::string const & internal_name
823 );
824
825 private:
826
827 [[nodiscard]] amrex::MultiFab const *
829 std::string const & internal_name
830 ) const;
831
834 std::string const & name,
835 int level,
836 amrex::BoxArray const & ba,
838 int ncomp,
839 amrex::IntVect const & ngrow,
840 std::optional<amrex::Real const> initial_value = std::nullopt,
841 bool remake = true,
842 bool redistribute_on_remake = true,
843 bool checkpoint_restart = false
844 );
847 std::string const & name,
848 Direction dir,
849 int level,
850 amrex::BoxArray const & ba,
852 int ncomp,
853 amrex::IntVect const & ngrow,
854 std::optional<amrex::Real const> initial_value = std::nullopt,
855 bool remake = true,
856 bool redistribute_on_remake = true,
857 bool checkpoint_restart = false
858 );
859
862 std::string const & new_name,
863 std::string const & alias_name,
864 int level,
865 std::optional<amrex::Real const> initial_value = std::nullopt
866 );
869 std::string const & new_name,
870 std::string const & alias_name,
871 Direction dir,
872 int level,
873 std::optional<amrex::Real const> initial_value = std::nullopt
874 );
875
876 [[nodiscard]] bool
878 std::string const & name,
879 int level
880 ) const;
881 [[nodiscard]] bool
883 std::string const & name,
884 Direction dir,
885 int level
886 ) const;
887 [[nodiscard]] bool
889 std::string const & name,
890 int level
891 ) const;
892
893 [[nodiscard]] amrex::MultiFab *
895 std::string const & name,
896 int level
897 );
898 [[nodiscard]] amrex::MultiFab const *
900 std::string const & name,
901 int level
902 ) const;
903 [[nodiscard]] amrex::MultiFab *
905 std::string const & name,
906 Direction dir,
907 int level
908 );
909 [[nodiscard]] amrex::MultiFab const *
911 std::string const & name,
912 Direction dir,
913 int level
914 ) const;
915 [[nodiscard]] MultiLevelScalarField
917 std::string const & name,
918 int finest_level,
919 bool skip_level_0
920 );
921 [[nodiscard]] ConstMultiLevelScalarField
923 std::string const & name,
924 int finest_level,
925 bool skip_level_0
926 ) const;
927 [[nodiscard]] VectorField
929 std::string const & name,
930 int level
931 );
932 [[nodiscard]] ConstVectorField
934 std::string const & name,
935 int level
936 ) const;
937 [[nodiscard]] MultiLevelVectorField
939 std::string const & name,
940 int finest_level,
941 bool skip_level_0
942 );
943 [[nodiscard]] ConstMultiLevelVectorField
945 std::string const & name,
946 int finest_level,
947 bool skip_level_0
948 ) const;
949
950 void
952 std::string const & name,
953 int level
954 );
955 void
957 std::string const & name,
958 Direction dir,
959 int level
960 );
961
963 std::map<
964 std::string,
967
968 public:
977 static inline std::vector<Direction> m_all_dirs =
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)
983 {Direction::r, Direction::theta, Direction::phi};
984#endif
985 };
986
992 a2m (
993 std::array< std::unique_ptr<amrex::MultiFab>, 3 > const & old_vectorfield
994 );
995
996} // namespace ablastr::fields
997
998#endif // ABLASTR_FIELDS_MF_REGISTER_H
#define AMREX_INLINE
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
IntVectND< 3 > IntVect
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
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
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