WarpX
Loading...
Searching...
No Matches
WarpXSolverVec.H
Go to the documentation of this file.
1/* Copyright 2024 Justin Angus
2 *
3 * This file is part of WarpX.
4 *
5 * License: BSD-3-Clause-LBNL
6 */
7#ifndef WarpXSolverVec_H_
8#define WarpXSolverVec_H_
9
10#include "Utils/TextMsg.H"
12#include "Fields.H"
13
17
18#include <AMReX.H>
19#include <AMReX_Array.H>
20#include <AMReX_BLassert.H>
21#include <AMReX_IntVect.H>
22#include <AMReX_LayoutData.H>
23#include <AMReX_MultiFab.H>
24#include <AMReX_iMultiFab.H>
25#include <AMReX_ParmParse.H>
26#include <AMReX_Print.H>
27#include <AMReX_REAL.H>
28#include <AMReX_Utility.H>
29#include <AMReX_Vector.H>
30
31#include <algorithm>
32#include <array>
33#include <memory>
34#include <ostream>
35#include <vector>
36
37// forward declaration
38class WarpX;
39
56{
57public:
58
59 WarpXSolverVec() = default;
60
62
64
66 using RT = value_type;
67
68 [[nodiscard]] inline bool IsDefined () const { return m_is_defined; }
69
70 void Define ( WarpX* a_WarpX,
71 const std::string& a_vector_type_name,
72 const std::string& a_scalar_type_name = "none" );
73
74 inline
75 void Define ( const WarpXSolverVec& a_solver_vec )
76 {
77 assertIsDefined( a_solver_vec );
80 a_solver_vec.getVectorType(),
81 a_solver_vec.getScalarType() );
82 }
83
84 [[nodiscard]] RT dotProduct( const WarpXSolverVec& a_X ) const;
85
86 void Copy ( warpx::fields::FieldType a_array_type,
88 bool allow_type_mismatch = false);
89
90 inline
91 void Copy ( const WarpXSolverVec& a_solver_vec )
92 {
93 assertIsDefined( a_solver_vec );
94 if (IsDefined()) { assertSameType( a_solver_vec ); }
95 else { Define(a_solver_vec); }
96
97 for (int lev = 0; lev < m_num_amr_levels; ++lev) {
99 for (int n = 0; n < 3; ++n) {
100 const amrex::MultiFab* this_field = a_solver_vec.getArrayVec()[lev][n];
101 amrex::MultiFab::Copy( *m_array_vec[lev][n], *this_field, 0, 0, m_ncomp,
103 }
104 }
106 const amrex::MultiFab* this_scalar = a_solver_vec.getScalarVec()[lev];
107 amrex::MultiFab::Copy( *m_scalar_vec[lev], *this_scalar, 0, 0, m_ncomp,
109 }
110 }
111 }
112
113 // Prohibit Copy assignment operator
114 WarpXSolverVec& operator= ( const WarpXSolverVec& a_solver_vec ) = delete;
115
116 // Move assignment operator
117 WarpXSolverVec(WarpXSolverVec&&) noexcept = default;
118 WarpXSolverVec& operator= ( WarpXSolverVec&& a_solver_vec ) noexcept
119 {
120 if (this != &a_solver_vec) {
121 m_array_vec = std::move(a_solver_vec.m_array_vec);
122 m_scalar_vec = std::move(a_solver_vec.m_scalar_vec);
123 m_array_type = a_solver_vec.m_array_type;
124 m_scalar_type = a_solver_vec.m_scalar_type;
125 m_is_defined = true;
126 }
127 return *this;
128 }
129
130 inline
131 void operator+= ( const WarpXSolverVec& a_solver_vec )
132 {
133 assertIsDefined( a_solver_vec );
134 assertSameType( a_solver_vec );
135 for (int lev = 0; lev < m_num_amr_levels; ++lev) {
137 m_array_vec[lev][0]->plus(*(a_solver_vec.getArrayVec()[lev][0]), 0, 1, 0);
138 m_array_vec[lev][1]->plus(*(a_solver_vec.getArrayVec()[lev][1]), 0, 1, 0);
139 m_array_vec[lev][2]->plus(*(a_solver_vec.getArrayVec()[lev][2]), 0, 1, 0);
140 }
142 m_scalar_vec[lev]->plus(*(a_solver_vec.getScalarVec()[lev]), 0, 1, 0);
143 }
144 }
145 }
146
147 inline
148 void operator-= (const WarpXSolverVec& a_solver_vec)
149 {
150 assertIsDefined( a_solver_vec );
151 assertSameType( a_solver_vec );
152 for (int lev = 0; lev < m_num_amr_levels; ++lev) {
154 m_array_vec[lev][0]->minus(*(a_solver_vec.getArrayVec()[lev][0]), 0, 1, 0);
155 m_array_vec[lev][1]->minus(*(a_solver_vec.getArrayVec()[lev][1]), 0, 1, 0);
156 m_array_vec[lev][2]->minus(*(a_solver_vec.getArrayVec()[lev][2]), 0, 1, 0);
157 }
159 m_scalar_vec[lev]->minus(*(a_solver_vec.getScalarVec()[lev]), 0, 1, 0);
160 }
161 }
162 }
163
167 inline
168 void linComb (const RT a, const WarpXSolverVec& X, const RT b, const WarpXSolverVec& Y)
169 {
170 assertIsDefined( X );
171 assertIsDefined( Y );
172 assertSameType( X );
173 assertSameType( Y );
174 for (int lev = 0; lev < m_num_amr_levels; ++lev) {
176 for (int n = 0; n < 3; n++) {
177 amrex::MultiFab::LinComb(*m_array_vec[lev][n], a, *X.getArrayVec()[lev][n], 0,
178 b, *Y.getArrayVec()[lev][n], 0,
179 0, 1, 0);
180 }
181 }
184 b, *Y.getScalarVec()[lev], 0,
185 0, 1, 0);
186 }
187 }
188 }
189
193 void increment (const WarpXSolverVec& X, const RT a)
194 {
195 assertIsDefined( X );
196 assertSameType( X );
197 for (int lev = 0; lev < m_num_amr_levels; ++lev) {
199 for (int n = 0; n < 3; n++) {
200 amrex::MultiFab::Saxpy( *m_array_vec[lev][n], a, *X.getArrayVec()[lev][n],
202 }
203 }
207 }
208 }
209 }
210
214 inline
215 void scale (RT a_a)
216 {
218 IsDefined(),
219 "WarpXSolverVec::scale() called on undefined WarpXSolverVec");
220 for (int lev = 0; lev < m_num_amr_levels; ++lev) {
222 m_array_vec[lev][0]->mult(a_a, 0, 1);
223 m_array_vec[lev][1]->mult(a_a, 0, 1);
224 m_array_vec[lev][2]->mult(a_a, 0, 1);
225 }
227 m_scalar_vec[lev]->mult(a_a, 0, 1);
228 }
229 }
230 }
231
232 inline
233 void zero () { setVal(0.0); }
234
235 inline
236 void setVal ( const RT a_val )
237 {
239 IsDefined(),
240 "WarpXSolverVec::setVal() called on undefined WarpXSolverVec");
241 for (int lev = 0; lev < m_num_amr_levels; ++lev) {
243 m_array_vec[lev][0]->setVal(a_val);
244 m_array_vec[lev][1]->setVal(a_val);
245 m_array_vec[lev][2]->setVal(a_val);
246 }
248 m_scalar_vec[lev]->setVal(a_val);
249 }
250 }
251 }
252
253 inline
254 void assertIsDefined( const WarpXSolverVec& a_solver_vec ) const
255 {
257 a_solver_vec.IsDefined(),
258 "WarpXSolverVec::function(X) called with undefined WarpXSolverVec X");
259 }
260
261 inline
262 void assertSameType( const WarpXSolverVec& a_solver_vec ) const
263 {
265 a_solver_vec.getArrayVecType()==m_array_type &&
266 a_solver_vec.getScalarVecType()==m_scalar_type,
267 "WarpXSolverVec::function(X) called with WarpXSolverVec X of different type");
268 }
269
270 [[nodiscard]] inline RT norm2 () const
271 {
272 auto const norm = dotProduct(*this);
273 return std::sqrt(norm);
274 }
275
278
281
282 // solver vector types are type warpx::fields::FieldType
283 [[nodiscard]] warpx::fields::FieldType getArrayVecType () const { return m_array_type; }
284 [[nodiscard]] warpx::fields::FieldType getScalarVecType () const { return m_scalar_type; }
285
286 // solver vector type names
287 [[nodiscard]] std::string getVectorType () const { return m_vector_type_name; }
288 [[nodiscard]] std::string getScalarType () const { return m_scalar_type_name; }
289
290 // vector sizes
291 [[nodiscard]] amrex::Long nDOF_local () const
292 {
294 (m_dofs != nullptr),
295 "WarpXSolverVec::nDOF_local() DOF object is a nullptr");
296 return m_dofs->m_nDoFs_l;
297 }
298 [[nodiscard]] amrex::Long nDOF_global () const
299 {
301 (m_dofs != nullptr),
302 "WarpXSolverVec::nDOF_global() DOF object is a nullptr");
303 return m_dofs->m_nDoFs_g;
304 }
305
306 // copy to/from Real-type arrays
307 void copyFrom (const amrex::Real*);
308 void copyTo (amrex::Real*) const;
309
310 // return WarpX pointer
311 [[nodiscard]] auto getWarpX () const { return m_WarpX; }
312
313 // return the number of AMR levels
314 [[nodiscard]] auto numAMRLevels () const { return m_num_amr_levels; }
315
316 // return DOFs object pointer
317 [[nodiscard]] inline const auto& getDOFsObject () const { return m_dofs; }
318
319private:
320
321 bool m_is_defined = false;
322
325
328
329 std::string m_vector_type_name = "none";
330 std::string m_scalar_type_name = "none";
331
332 static constexpr int m_ncomp = 1;
334
335 inline static bool m_warpx_ptr_defined = false;
336 inline static WarpX* m_WarpX = nullptr;
337
338 static std::unique_ptr<WarpXSolverDOF> m_dofs;
339};
340
341#endif
#define WARPX_ALWAYS_ASSERT_WITH_MESSAGE(EX, MSG)
Definition TextMsg.H:13
Definition WarpX.H:86
This is a wrapper class around a Vector of pointers to MultiFabs that contains basic math operators a...
Definition WarpXSolverVec.H:56
void assertSameType(const WarpXSolverVec &a_solver_vec) const
Definition WarpXSolverVec.H:262
void operator-=(const WarpXSolverVec &a_solver_vec)
Definition WarpXSolverVec.H:148
amrex::Long nDOF_global() const
Definition WarpXSolverVec.H:298
std::string m_scalar_type_name
Definition WarpXSolverVec.H:330
WarpXSolverVec(WarpXSolverVec &&) noexcept=default
bool m_is_defined
Definition WarpXSolverVec.H:321
WarpXSolverVec()=default
void Copy(const WarpXSolverVec &a_solver_vec)
Definition WarpXSolverVec.H:91
auto numAMRLevels() const
Definition WarpXSolverVec.H:314
std::string getVectorType() const
Definition WarpXSolverVec.H:287
std::string m_vector_type_name
Definition WarpXSolverVec.H:329
warpx::fields::FieldType m_array_type
Definition WarpXSolverVec.H:326
const auto & getDOFsObject() const
Definition WarpXSolverVec.H:317
static constexpr int m_ncomp
Definition WarpXSolverVec.H:332
void assertIsDefined(const WarpXSolverVec &a_solver_vec) const
Definition WarpXSolverVec.H:254
static bool m_warpx_ptr_defined
Definition WarpXSolverVec.H:335
value_type RT
Definition WarpXSolverVec.H:66
static std::unique_ptr< WarpXSolverDOF > m_dofs
Definition WarpXSolverVec.H:338
void linComb(const RT a, const WarpXSolverVec &X, const RT b, const WarpXSolverVec &Y)
Y = a*X + b*Y.
Definition WarpXSolverVec.H:168
void operator+=(const WarpXSolverVec &a_solver_vec)
Definition WarpXSolverVec.H:131
void Define(WarpX *a_WarpX, const std::string &a_vector_type_name, const std::string &a_scalar_type_name="none")
Definition WarpXSolverVec.cpp:24
static WarpX * m_WarpX
Definition WarpXSolverVec.H:336
ablastr::fields::MultiLevelScalarField m_scalar_vec
Definition WarpXSolverVec.H:324
ablastr::fields::MultiLevelVectorField m_array_vec
Definition WarpXSolverVec.H:323
void Define(const WarpXSolverVec &a_solver_vec)
Definition WarpXSolverVec.H:75
amrex::Long nDOF_local() const
Definition WarpXSolverVec.H:291
warpx::fields::FieldType getArrayVecType() const
Definition WarpXSolverVec.H:283
void scale(RT a_a)
Scale Y by a (Y *= a)
Definition WarpXSolverVec.H:215
int m_num_amr_levels
Definition WarpXSolverVec.H:333
bool IsDefined() const
Definition WarpXSolverVec.H:68
void zero()
Definition WarpXSolverVec.H:233
~WarpXSolverVec()
Definition WarpXSolverVec.cpp:13
warpx::fields::FieldType m_scalar_type
Definition WarpXSolverVec.H:327
ablastr::fields::MultiLevelVectorField & getArrayVec()
Definition WarpXSolverVec.H:277
RT dotProduct(const WarpXSolverVec &a_X) const
Definition WarpXSolverVec.cpp:242
auto getWarpX() const
Definition WarpXSolverVec.H:311
void copyTo(amrex::Real *) const
Definition WarpXSolverVec.cpp:193
void copyFrom(const amrex::Real *)
Definition WarpXSolverVec.cpp:142
amrex::Real value_type
Definition WarpXSolverVec.H:65
warpx::fields::FieldType getScalarVecType() const
Definition WarpXSolverVec.H:284
const ablastr::fields::MultiLevelScalarField & getScalarVec() const
Definition WarpXSolverVec.H:279
void setVal(const RT a_val)
Definition WarpXSolverVec.H:236
void Copy(warpx::fields::FieldType a_array_type, warpx::fields::FieldType a_scalar_type=warpx::fields::FieldType::None, bool allow_type_mismatch=false)
Definition WarpXSolverVec.cpp:114
ablastr::fields::MultiLevelScalarField & getScalarVec()
Definition WarpXSolverVec.H:280
std::string getScalarType() const
Definition WarpXSolverVec.H:288
const ablastr::fields::MultiLevelVectorField & getArrayVec() const
Definition WarpXSolverVec.H:276
void increment(const WarpXSolverVec &X, const RT a)
Increment Y by a*X (Y += a*X)
Definition WarpXSolverVec.H:193
RT norm2() const
Definition WarpXSolverVec.H:270
WarpXSolverVec & operator=(const WarpXSolverVec &a_solver_vec)=delete
WarpXSolverVec(const WarpXSolverVec &)=delete
__host__ static __device__ constexpr IntVectND< dim > TheZeroVector() noexcept
static void LinComb(MultiFab &dst, Real a, const MultiFab &x, int xcomp, Real b, const MultiFab &y, int ycomp, int dstcomp, int numcomp, int nghost)
static void Saxpy(MultiFab &dst, Real a, const MultiFab &src, int srccomp, int dstcomp, int numcomp, int nghost)
static void Copy(MultiFab &dst, const MultiFab &src, int srccomp, int dstcomp, int numcomp, int nghost)
amrex_real Real
amrex_long Long
amrex::Vector< ScalarField > MultiLevelScalarField
Definition MultiFabRegister.H:210
amrex::Vector< VectorField > MultiLevelVectorField
Definition MultiFabRegister.H:218
FieldType
Definition Fields.H:97
@ None
Definition Fields.H:97