/home/runner/work/kynema-sgf/kynema-sgf/src/core/Field.H Source File

Kynema-SGF API: /home/runner/work/kynema-sgf/kynema-sgf/src/core/Field.H Source File
Kynema-SGF API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
Field.H
Go to the documentation of this file.
1#ifndef FIELD_H
2#define FIELD_H
3
4#include <string>
5#include <memory>
6#include <unordered_map>
7#include <algorithm>
8
9#include "AMReX_MultiFab.H"
10#include "AMReX_BCRec.H"
11#include "AMReX_Gpu.H"
12
13#include "src/incflo_enums.H"
15#include "src/core/ViewField.H"
16
17namespace kynema_sgf {
18
19class Field;
20class FieldRepo;
22class FieldBCIface;
23class SimTime;
24
29{
31 static constexpr int max_field_states = 5;
32
34 std::string basename, int ncomp, int ngrow, int nstates, FieldLoc floc);
35
37
39 bool bc_initialized();
40
42 void copy_bc_to_device();
43
45 std::string m_basename;
46
49
51 amrex::IntVect m_ngrow;
52
55
58
61 amrex::GpuArray<BC, AMREX_SPACEDIM * 2> m_bc_type;
62 amrex::Vector<amrex::Vector<amrex::Real>> m_bc_values;
64 amrex::GpuArray<InflowValueSource, AMREX_SPACEDIM * 2>
66 amrex::GpuArray<const amrex::Real*, AMREX_SPACEDIM * 2> m_bc_values_d;
67 amrex::Gpu::DeviceVector<amrex::Real> m_bc_values_dview;
68
69 amrex::Vector<amrex::BCRec> m_bcrec;
70 amrex::Gpu::DeviceVector<amrex::BCRec> m_bcrec_d;
72
74 amrex::Vector<Field*> m_states;
75
77 amrex::Vector<std::unique_ptr<FieldFillPatchOpsBase>> m_fillpatch_ops;
78
80 amrex::Vector<std::unique_ptr<FieldBCIface>> m_bc_func;
81
84};
85
114class Field
115{
116public:
117 friend class FieldRepo;
118
119 Field(const Field&) = delete;
120 Field& operator=(const Field&) = delete;
122
124 [[nodiscard]] const std::string& name() const { return m_name; }
125
127 [[nodiscard]] const std::string& base_name() const
128 {
129 return m_info->m_basename;
130 }
131
133 [[nodiscard]] unsigned id() const { return m_id; }
134
136 [[nodiscard]] int num_comp() const { return m_info->m_ncomp; }
137
139 [[nodiscard]] const amrex::IntVect& num_grow() const
140 {
141 return m_info->m_ngrow;
142 }
143
145 [[nodiscard]] int num_time_states() const { return m_info->m_nstates; }
146
148 [[nodiscard]] int num_states() const
149 {
150 int ns = static_cast<int>(std::count_if(
151 m_info->m_states.begin(), m_info->m_states.end(),
152 [](const Field* ff) { return (ff != nullptr); }));
153 AMREX_ASSERT(num_time_states() <= ns);
154 return ns;
155 }
156
158 [[nodiscard]] FieldLoc field_location() const { return m_info->m_floc; }
159
161 [[nodiscard]] FieldState field_state() const { return m_state; }
162
164 [[nodiscard]] FieldRepo& repo() const { return m_repo; }
165
167 [[nodiscard]] bool fillpatch_on_regrid() const
168 {
170 }
171
173 [[nodiscard]] bool query_state(const FieldState fstate) const
174 {
175 const int fid = static_cast<int>(fstate);
176 return (m_info->m_states[fid] != nullptr);
177 }
178
179 [[nodiscard]] const amrex::GpuArray<BC, AMREX_SPACEDIM * 2>& bc_type() const
180 {
181 return m_info->m_bc_type;
182 }
183
184 amrex::GpuArray<BC, AMREX_SPACEDIM * 2>& bc_type()
185 {
186 return m_info->m_bc_type;
187 }
188
190 amrex::Vector<amrex::Vector<amrex::Real>>& bc_values()
191 {
192 return m_info->m_bc_values;
193 }
194
195 auto& inflow_value_source() { return m_info->m_inflow_value_source; }
196 [[nodiscard]] const auto& inflow_value_source() const
197 {
198 return m_info->m_inflow_value_source;
199 }
200
202 [[nodiscard]] amrex::Vector<amrex::BCRec>& bcrec() const
203 {
204 return m_info->m_bcrec;
205 }
206
207 [[nodiscard]] const amrex::GpuArray<const amrex::Real*, AMREX_SPACEDIM * 2>&
209 {
210 return m_info->m_bc_values_d;
211 }
212
213 [[nodiscard]] const amrex::Gpu::DeviceVector<amrex::BCRec>&
215 {
216 return m_info->m_bcrec_d;
217 }
218
223 void copy_bc_to_device() { m_info->copy_bc_to_device(); }
224
226 [[nodiscard]] bool bc_initialized() const
227 {
228 return m_info->m_bc_copied_to_device;
229 }
230
232 [[nodiscard]] bool has_fillpatch_op() const
233 {
234 return !m_info->m_fillpatch_ops.empty();
235 }
236
245 const SimTime& time,
246 amrex::BCType::mathematicalBndryTypes bctype = amrex::BCType::hoextrap);
247
255 void to_uniform_space();
256
264 void to_stretched_space();
265
267 Field& state(FieldState fstate);
268 [[nodiscard]] const Field& state(FieldState fstate) const;
269
271 amrex::MultiFab& operator()(int lev);
272 const amrex::MultiFab& operator()(int lev) const;
273
275 amrex::Vector<amrex::MultiFab*> vec_ptrs();
276
278 [[nodiscard]] amrex::Vector<const amrex::MultiFab*> vec_const_ptrs() const;
279
281 void advance_states();
282
284 void copy_state(FieldState to_state, FieldState from_state);
285
288
289 // NOTE: We break naming rules for methods here to provide 1-1 mapping with
290 // the underlying MultiFab method names.
291
293 void setVal(amrex::Real value);
294
303 void
304 setVal(amrex::Real value, int start_comp, int num_comp = 1, int nghost = 0);
305
308 void setVal(const amrex::Vector<amrex::Real>& values, int nghost = 0);
309
312 ViewField<Field> subview(const int scomp = 0, const int ncomp = 1)
313 {
314 return {*this, scomp, ncomp};
315 }
316
321 template <typename T, class... Args>
322 void register_fill_patch_op(Args&&... args)
323 {
324 if (m_info->m_fillpatch_ops.empty()) {
325 m_info->m_fillpatch_ops.emplace_back(
326 new T(*this, std::forward<Args>(args)...));
327 } else if (m_info->m_fillpatch_ops.size() == 1) {
328 m_info->m_fillpatch_ops[0].reset(
329 new T(*this, std::forward<Args>(args)...));
330 } else {
331 amrex::Abort(
332 "register_fill_patch_op: More than one fillpatch op already "
333 "registered. register_fill_patch_op cannot be called after "
334 "add_fill_patch_op");
335 }
336 }
337
338 template <typename T, class... Args>
339 void add_fill_patch_op(Args&&... args)
340 {
341 m_info->m_fillpatch_ops.emplace_back(
342 new T(*this, std::forward<Args>(args)...));
343 }
344
347 template <typename T, class... Args>
348 void register_custom_bc(Args&&... args)
349 {
350 m_info->m_bc_func.emplace_back(
351 new T(*this, std::forward<Args>(args)...));
352 }
353
354 void fillpatch(amrex::Real time);
355 void fillpatch(amrex::Real time, amrex::IntVect ng);
357 amrex::Real time,
358 amrex::IntVect ng,
359 amrex::Array<Field*, AMREX_SPACEDIM>& fields) const;
360
361 void fillphysbc(amrex::Real time);
362 void fillphysbc(amrex::Real time, amrex::IntVect ng);
363
364 void fillphysbc_type(
365 amrex::Real time, amrex::BCType::mathematicalBndryTypes bctype);
366
367 void apply_bc_funcs(FieldState rho_state);
368
369 void fillpatch(
370 int lev,
371 amrex::Real time,
372 amrex::MultiFab& mfab,
373 const amrex::IntVect& nghost);
374
376 int lev,
377 amrex::Real time,
378 amrex::MultiFab& mfab,
379 const amrex::IntVect& nghost);
380
381 void fillphysbc(
382 int lev,
383 amrex::Real time,
384 amrex::MultiFab& mfab,
385 const amrex::IntVect& nghost);
386
387 void set_inflow(
388 int lev,
389 amrex::Real time,
390 amrex::MultiFab& mfab,
391 const amrex::IntVect& nghost);
392
394 int lev,
395 amrex::Real time,
396 amrex::Array<amrex::MultiFab*, AMREX_SPACEDIM> mfabs);
397
399 const int lev,
400 const amrex::Real time,
401 amrex::MultiFab& mfab,
402 const int nghost)
403 {
404 fillpatch(lev, time, mfab, amrex::IntVect(nghost));
405 }
406
408 const int lev,
409 const amrex::Real time,
410 amrex::MultiFab& mfab,
411 const int nghost)
412 {
413 fillpatch_from_coarse(lev, time, mfab, amrex::IntVect(nghost));
414 }
415
417 const int lev,
418 const amrex::Real time,
419 amrex::MultiFab& mfab,
420 const int nghost)
421 {
422 fillphysbc(lev, time, mfab, amrex::IntVect(nghost));
423 }
424
426 const int lev,
427 const amrex::Real time,
428 amrex::MultiFab& mfab,
429 const int nghost)
430 {
431 set_inflow(lev, time, mfab, amrex::IntVect(nghost));
432 }
433
434 bool& in_uniform_space() { return m_mesh_mapped; }
435 [[nodiscard]] bool in_uniform_space() const { return m_mesh_mapped; }
436
438 [[nodiscard]] bool has_inout_bndry() const;
439
452 int lev,
453 amrex::Real time,
454 amrex::MultiFab& mfab,
455 const amrex::IntVect& nghost);
456
457protected:
458 Field(
460 std::string name,
461 std::shared_ptr<FieldInfo> finfo,
462 unsigned fid,
464
467
469 const std::string m_name;
470
472 std::shared_ptr<FieldInfo> m_info;
473
475 const unsigned m_id;
476
479
483
485 bool m_mesh_mapped{false};
486};
487
488} // namespace kynema_sgf
489
490#endif /* FIELD_H */
Definition FieldBCOps.H:32
Definition FieldFillPatchOps.H:41
Definition Field.H:115
Field & create_state(FieldState fstate)
Create a new time state after the field has been created.
Definition Field.cpp:497
const auto & inflow_value_source() const
Definition Field.H:196
void fillphysbc(const int lev, const amrex::Real time, amrex::MultiFab &mfab, const int nghost)
Definition Field.H:416
const std::string & base_name() const
Base name (without state information)
Definition Field.H:127
bool has_fillpatch_op() const
Return a flag indicating whether a fillpatch Op has been registered.
Definition Field.H:232
const unsigned m_id
Unique ID for this field.
Definition Field.H:475
void set_inflow(int lev, amrex::Real time, amrex::MultiFab &mfab, const amrex::IntVect &nghost)
Definition Field.cpp:439
bool m_fillpatch_on_regrid
Flag indicating whether fill patch operation must be performed for this field during regrid.
Definition Field.H:482
auto & inflow_value_source()
Definition Field.H:195
void fillpatch_sibling_fields(amrex::Real time, amrex::IntVect ng, amrex::Array< Field *, AMREX_SPACEDIM > &fields) const
Definition Field.cpp:218
bool & in_uniform_space()
Definition Field.H:434
std::shared_ptr< FieldInfo > m_info
Common data for all field states.
Definition Field.H:472
amrex::Vector< amrex::Vector< amrex::Real > > & bc_values()
Return reference to the host view of BC values array.
Definition Field.H:190
void set_inflow(const int lev, const amrex::Real time, amrex::MultiFab &mfab, const int nghost)
Definition Field.H:425
ViewField< Field > subview(const int scomp=0, const int ncomp=1)
Definition Field.H:312
void fillphysbc(amrex::Real time)
Definition Field.cpp:276
void copy_state(FieldState to_state, FieldState from_state)
Copy a user-specified "from_state" to "to_state".
Definition Field.cpp:485
Field(const Field &)=delete
const amrex::GpuArray< BC, AMREX_SPACEDIM *2 > & bc_type() const
Definition Field.H:179
Field & operator=(const Field &)=delete
unsigned id() const
Unique integer identifier for this field.
Definition Field.H:133
amrex::Vector< amrex::BCRec > & bcrec() const
Return reference to host view of BCRec array.
Definition Field.H:202
bool has_inout_bndry() const
Check if any of the boundaries is a mass-inflow-outflow.
Definition Field.cpp:297
bool in_uniform_space() const
Definition Field.H:435
amrex::MultiFab & operator()(int lev)
Return MultiFab instance for a given level.
Definition Field.cpp:134
void fillpatch_from_coarse(int lev, amrex::Real time, amrex::MultiFab &mfab, const amrex::IntVect &nghost)
Definition Field.cpp:186
const amrex::IntVect & num_grow() const
Ghost cells.
Definition Field.H:139
FieldRepo & m_repo
Reference to the FieldRepository instance.
Definition Field.H:466
Field & state(FieldState fstate)
Return field at a different time state.
Definition Field.cpp:118
void register_fill_patch_op(Args &&... args)
Definition Field.H:322
amrex::GpuArray< BC, AMREX_SPACEDIM *2 > & bc_type()
Definition Field.H:184
amrex::Vector< amrex::MultiFab * > vec_ptrs()
Return a vector of MultiFab pointers for all levels.
Definition Field.cpp:146
FieldLoc field_location() const
Cell, node, or face centered field.
Definition Field.H:158
int num_states() const
Number of states available for this field.
Definition Field.H:148
int num_comp() const
Number of components for this field.
Definition Field.H:136
friend class FieldRepo
Definition Field.H:117
void fill_inout_outflow(int lev, amrex::Real time, amrex::MultiFab &mfab, const amrex::IntVect &nghost)
Definition Field.cpp:303
bool & fillpatch_on_regrid()
Definition Field.H:166
const std::string m_name
Name of the field.
Definition Field.H:469
FieldState field_state() const
State of this field instance.
Definition Field.H:161
bool m_mesh_mapped
Flag to track mesh mapping (to uniform space) of field.
Definition Field.H:485
void to_uniform_space()
Definition Field.cpp:553
amrex::Vector< const amrex::MultiFab * > vec_const_ptrs() const
Return vector of const MultiFab* for all levels.
Definition Field.cpp:157
void add_fill_patch_op(Args &&... args)
Definition Field.H:339
bool fillpatch_on_regrid() const
Definition Field.H:167
void copy_bc_to_device()
Copy BC data from host to device.
Definition Field.H:223
void set_default_fillpatch_bc(const SimTime &time, amrex::BCType::mathematicalBndryTypes bctype=amrex::BCType::hoextrap)
Definition Field.cpp:539
const amrex::GpuArray< const amrex::Real *, AMREX_SPACEDIM *2 > & bc_values_device() const
Definition Field.H:208
void advance_states()
Advance timestep for fields with multiple states.
Definition Field.cpp:466
void setVal(amrex::Real value)
Set the field to a constant value at all levels.
Definition Field.cpp:507
void fillphysbc_type(amrex::Real time, amrex::BCType::mathematicalBndryTypes bctype)
Definition Field.cpp:278
void fillpatch(const int lev, const amrex::Real time, amrex::MultiFab &mfab, const int nghost)
Definition Field.H:398
int num_time_states() const
Number of exact time states available for this field.
Definition Field.H:145
const std::string & name() const
Name of this field (including state information)
Definition Field.H:124
void register_custom_bc(Args &&... args)
Definition Field.H:348
FieldRepo & repo() const
FieldRepo instance that manages this field.
Definition Field.H:164
bool query_state(const FieldState fstate) const
Return true if the requested state exists for this field.
Definition Field.H:173
void fillpatch(amrex::Real time)
Definition Field.cpp:216
void to_stretched_space()
Definition Field.cpp:583
bool bc_initialized() const
Return flag indicating whether BCs have been initialized.
Definition Field.H:226
const amrex::Gpu::DeviceVector< amrex::BCRec > & bcrec_device() const
Definition Field.H:214
void apply_bc_funcs(FieldState rho_state)
Definition Field.cpp:431
const FieldState m_state
State for this field.
Definition Field.H:478
void fillpatch_from_coarse(const int lev, const amrex::Real time, amrex::MultiFab &mfab, const int nghost)
Definition Field.H:407
void set_inflow_sibling_fields(int lev, amrex::Real time, amrex::Array< amrex::MultiFab *, AMREX_SPACEDIM > mfabs)
Definition Field.cpp:453
Definition FieldRepo.H:86
Definition SimTime.H:34
Definition ViewField.H:24
FieldLoc
Definition FieldDescTypes.H:29
FieldState
Definition FieldDescTypes.H:16
This test case is intended as an evaluation of the momentum advection scheme.
Definition BCInterface.cpp:12
std::string m_basename
Field name without state information.
Definition Field.H:45
bool m_bc_copied_to_device
Flag indicating whether BCs have been initialized and copied to device.
Definition Field.H:83
amrex::Vector< amrex::BCRec > m_bcrec
Definition Field.H:69
int m_ncomp
Number of components (Scalar = 1, Vector = 2, etc.)
Definition Field.H:48
bool bc_initialized()
Check indicating whether BCs are being set to sane values.
Definition Field.cpp:43
amrex::Vector< std::unique_ptr< FieldBCIface > > m_bc_func
Custom boundary condition actions for this field.
Definition Field.H:80
FieldInfo(std::string basename, int ncomp, int ngrow, int nstates, FieldLoc floc)
Definition Field.cpp:16
amrex::Gpu::DeviceVector< amrex::BCRec > m_bcrec_d
Definition Field.H:70
void copy_bc_to_device()
Copy the BC information to device data structures.
Definition Field.cpp:66
amrex::IntVect m_ngrow
Ghost cells.
Definition Field.H:51
amrex::GpuArray< InflowValueSource, AMREX_SPACEDIM *2 > m_inflow_value_source
Parsed policy, including BC specializations that do not support UDFs.
Definition Field.H:65
amrex::Vector< std::unique_ptr< FieldFillPatchOpsBase > > m_fillpatch_ops
Function that handles filling patch and physics BC data for this field.
Definition Field.H:77
amrex::Vector< Field * > m_states
Vector holding references to available states for this field.
Definition Field.H:74
amrex::Gpu::DeviceVector< amrex::Real > m_bc_values_dview
Definition Field.H:67
int m_nstates
Number of states available for this field.
Definition Field.H:54
FieldLoc m_floc
Cell, node, face centered field type.
Definition Field.H:57
static constexpr int max_field_states
Maximum number of states allowed for a field.
Definition Field.H:31
amrex::GpuArray< BC, AMREX_SPACEDIM *2 > m_bc_type
Definition Field.H:61
amrex::Vector< amrex::Vector< amrex::Real > > m_bc_values
Definition Field.H:62
amrex::GpuArray< const amrex::Real *, AMREX_SPACEDIM *2 > m_bc_values_d
Definition Field.H:66