/home/runner/work/kynema-sgf/kynema-sgf/src/boundary_conditions/field_boundary_fill/BoundaryPlane.H Source File

Kynema-SGF API: /home/runner/work/kynema-sgf/kynema-sgf/src/boundary_conditions/field_boundary_fill/BoundaryPlane.H Source File
Kynema-SGF API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
BoundaryPlane.H
Go to the documentation of this file.
1#ifndef BOUNDARYPLANE_H
2#define BOUNDARYPLANE_H
3
4#include <cstdint>
5#include "src/core/Field.H"
6#include "src/core/IntField.H"
7#include "src/CFDSim.H"
11#include "AMReX_Gpu.H"
12#include "AMReX_BndryRegister.H"
13#include "AMReX_REAL.H"
14
15using namespace amrex::literals;
16class MultiBlockContainer;
17namespace kynema_sgf {
18
19enum struct io_mode : std::uint8_t { output, input, undefined };
20
21enum struct phase : std::uint8_t { liquid, gas, both };
22
24{
25 amrex::Gpu::ManagedVector<amrex::Real> data;
26 amrex::Vector<size_t> start{0, 0, 0, 0};
27 amrex::Vector<size_t> count{0, 0, 0, 0};
28};
29
37{
38 using PlaneVector = amrex::Vector<amrex::FArrayBox>;
39
40public:
41 InletData() = default;
42
43 void resize(int /*size*/);
44
45 void define_plane(amrex::Orientation /*ori*/);
46
48 amrex::Orientation /*ori*/, const amrex::Box& /*bx*/, size_t /*nc*/);
49
50#ifdef KYNEMA_SGF_USE_NETCDF
51 void read_data(
52 ncutils::NCGroup& /*grp*/,
53 const amrex::Orientation /*ori*/,
54 const int /*lev*/,
55 const Field* /*fld*/,
56 const amrex::Real /*time*/,
57 const amrex::Vector<amrex::Real>& /*times*/,
58 bool /*is_static_single*/);
59#endif
60
62 amrex::OrientationIter oit,
63 amrex::BndryRegister& bndry_n,
64 amrex::BndryRegister& bndry_np1,
65 int lev,
66 const Field* /*fld*/,
67 amrex::Real time,
68 const amrex::Vector<amrex::Real>& /*times*/);
69
70 void interpolate(amrex::Real /*time*/);
71 [[nodiscard]] bool is_populated(amrex::Orientation /*ori*/) const;
72 [[nodiscard]] const amrex::FArrayBox&
73 interpolate_data(const amrex::Orientation ori, const int lev) const
74 {
75 return (*m_data_interp[ori])[lev];
76 }
77
78 int& component(const int id) { return m_components[id]; }
79
80 [[nodiscard]] int component(const int id) const
81 {
82 return m_components.at(id);
83 }
84
85 [[nodiscard]] int nlevels(const amrex::Orientation ori) const
86 {
87 return static_cast<int>((*m_data_interp[ori]).size());
88 }
89
90 [[nodiscard]] amrex::Real tn() const { return m_tn; }
91 [[nodiscard]] amrex::Real tnp1() const { return m_tnp1; }
92 [[nodiscard]] amrex::Real tinterp() const { return m_tinterp; }
93
94private:
95 amrex::Vector<std::unique_ptr<PlaneVector>> m_data_n;
96 amrex::Vector<std::unique_ptr<PlaneVector>> m_data_np1;
97 amrex::Vector<std::unique_ptr<PlaneVector>> m_data_interp;
98
100 amrex::Real m_tn{-1.0_rt};
101
103 amrex::Real m_tnp1{-1.0_rt};
104
106 amrex::Real m_tinterp{-1.0_rt};
107
109 std::unordered_map<int, int> m_components;
110};
111
120class BoundaryPlane : public kynema_sgf::FieldBoundary::Register<BoundaryPlane>
121{
122 static_assert(AMREX_SPACEDIM == 3, "ABL requires 3 dimensional mesh");
123
124public:
125 static std::string identifier() { return "BoundaryPlane"; }
126
127 explicit BoundaryPlane(CFDSim& /*sim*/);
128
129 void post_init_actions() override;
130
131 void pre_advance_work() override;
132
133 void post_advance_work() override;
134
135 void pre_predictor_work() override;
136
137 void set_velocity(
138 int lev,
139 amrex::Real time,
140 const Field& fld,
141 amrex::MultiFab& mfab,
142 int dcomp = 0,
143 int orig_comp = 0) const override;
144
145 // Non-inherited public methods
146
148
149 void initialize_data();
150
151 void write_header();
152
153 void write_bndry_native_header(const std::string& chkname);
154
155 void write_file();
156
157 void read_header();
158
159 [[nodiscard]] amrex::Vector<amrex::BoxArray> read_bndry_native_boxarrays(
160 const std::string& chkname, const Field& field) const;
161
162 void read_file(bool /* nph_target_time*/);
163
164 void populate_data(
165 int /*lev*/,
166 amrex::Real /*time*/,
167 const Field& /*fld*/,
168 amrex::MultiFab& /*mfab*/,
169 int dcomp = 0,
170 int orig_comp = 0) const;
171
172#ifdef KYNEMA_SGF_USE_NETCDF
173 static void impl_buffer_field(
174 const amrex::Box& /*bx*/,
175 const int /*n1*/,
176 const int /*nc*/,
177 const amrex::GpuArray<int, 2>& /*perp*/,
178 const amrex::IntVect& /*v_offset*/,
179 const amrex::Array4<const amrex::Real>& /*fld*/,
180 amrex::Gpu::ManagedVector<amrex::Real>& /*buffer*/);
181#endif
182
183 [[nodiscard]] bool box_intersects_boundary(
184 const amrex::Box& /*bx*/,
185 int /*lev*/,
186 amrex::Orientation /*ori*/) const;
187
188 [[nodiscard]] bool is_data_newer_than(const amrex::Real time) const
189 {
190 return (
191 m_in_data.tinterp() - time >
192 std::numeric_limits<amrex::Real>::epsilon() * 1.0e4_rt);
193 }
194
195 [[nodiscard]] io_mode mode() const { return m_io_mode; }
196
197 MultiBlockContainer* mbc()
198 {
199 // Make sure that the double pointer m_mbc
200 // does not point to a nullptr
201 // before passing *m_mbc for use
202 if ((*m_mbc) == nullptr) {
203 amrex::Abort("Passing a null pointer for use!");
204 }
205 return *m_mbc;
206 }
207
208private:
209 const CFDSim& m_sim;
212 const amrex::AmrCore& m_mesh;
213
214 // pointer to pointer : when ABL boundary plane gets initialized, kynema-sgf
215 // CFDsim does not yet have the up to date pointer to the mbc or the
216 // read_erf function, hence the use of double pointers
217 MultiBlockContainer** m_mbc;
219
220#ifdef KYNEMA_SGF_USE_NETCDF
221 void write_data(
222 const ncutils::NCGroup& grp,
223 const amrex::Orientation /*ori*/,
224 const int /*lev*/,
225 const Field* /*fld*/);
226#endif
227 [[nodiscard]] int boundary_native_file_levels() const;
228
229 std::string m_title{"ABL boundary planes"};
230
233
235 amrex::Vector<std::string> m_plane_names{"xlo", "ylo", "zlo",
236 "xhi", "yhi", "zhi"};
237
239 amrex::Vector<std::string> m_planes;
240
242 amrex::Real m_out_start_time{0.0_rt};
243
244#ifdef KYNEMA_SGF_USE_NETCDF
246 size_t m_out_counter{0};
247#endif
248
250 std::string m_filename;
251
253 std::string m_time_file;
254
256 amrex::Vector<std::string> m_var_names;
257
259 amrex::Vector<Field*> m_fields;
260
262 amrex::Vector<amrex::Real> m_in_times;
263 amrex::Vector<int> m_in_timesteps;
264
267
270
273
275 std::string m_phase_str{"both"};
276
278 Field* m_vof_ptr{nullptr};
279
282
285
288 bool m_is_static{false};
290
294 bool m_output_init{false};
295
297 const int m_in_rad = 1;
298 const int m_out_rad = 1;
299 const int m_extent_rad = 0;
300
302 std::string m_out_fmt{"native"};
303};
304
305} // namespace kynema_sgf
306
307#endif /* BOUNDARYPLANE_H */
std::function< void( const amrex::Real time, amrex::Vector< amrex::Real > &, kynema_sgf::InletData &, const amrex::Vector< kynema_sgf::Field * > &, MultiBlockContainer *)> ReadERFFunction
Definition ReadERFFunction.H:10
amrex::Vector< Field * > m_fields
List of fields for IO.
Definition BoundaryPlane.H:259
amrex::Vector< std::string > m_plane_names
Plane names.
Definition BoundaryPlane.H:235
void pre_advance_inner_calls()
Definition BoundaryPlane.cpp:487
void pre_advance_work() override
Definition BoundaryPlane.cpp:478
void initialize_data()
Definition BoundaryPlane.cpp:495
void post_init_actions() override
Definition BoundaryPlane.cpp:440
MultiBlockContainer * mbc()
Definition BoundaryPlane.H:197
int m_write_frequency
Normal direction for the boundary plane.
Definition BoundaryPlane.H:232
void write_header()
Definition BoundaryPlane.cpp:515
amrex::Real m_out_start_time
Start outputting after this time.
Definition BoundaryPlane.H:242
bool box_intersects_boundary(const amrex::Box &, int, amrex::Orientation) const
True if box intersects the boundary.
Definition BoundaryPlane.cpp:1780
InletData m_in_data
Inlet data.
Definition BoundaryPlane.H:266
void pre_predictor_work() override
Definition BoundaryPlane.cpp:491
void read_file(bool)
Definition BoundaryPlane.cpp:1288
void write_data(const ncutils::NCGroup &grp, const amrex::Orientation, const int, const Field *)
Definition BoundaryPlane.cpp:1620
const CFDSim & m_sim
Definition BoundaryPlane.H:209
void read_header()
Definition BoundaryPlane.cpp:866
const int m_extent_rad
Definition BoundaryPlane.H:299
size_t m_out_counter
NetCDF time output counter.
Definition BoundaryPlane.H:246
void write_bndry_native_header(const std::string &chkname)
Definition BoundaryPlane.cpp:649
std::string m_time_file
File name for Native time file.
Definition BoundaryPlane.H:253
amrex::Vector< amrex::Real > m_in_times
NetCDF input level time.
Definition BoundaryPlane.H:262
bool m_has_moving_terrain
Flag indicating if terrain can move (i.e. if representing waves)
Definition BoundaryPlane.H:284
std::string m_out_fmt
output format for bndry output
Definition BoundaryPlane.H:302
bool m_is_static
Flag indicating that the inflow is static, i.e., there is only a single boundary plane to read in dur...
Definition BoundaryPlane.H:288
void post_advance_work() override
Definition BoundaryPlane.cpp:493
std::string m_phase_str
Default string for collecting user input for phase condition.
Definition BoundaryPlane.H:275
IntField * m_terrain_blank_ptr
Pointer to terrain_blank field for velocity population based on terrain.
Definition BoundaryPlane.H:281
amrex::Vector< int > m_in_timesteps
Definition BoundaryPlane.H:263
Field * m_vof_ptr
Pointer to vof field for boundary field population based on vof values.
Definition BoundaryPlane.H:278
BoundaryPlane(CFDSim &)
Definition BoundaryPlane.cpp:332
static void impl_buffer_field(const amrex::Box &, const int, const int, const amrex::GpuArray< int, 2 > &, const amrex::IntVect &, const amrex::Array4< const amrex::Real > &, amrex::Gpu::ManagedVector< amrex::Real > &)
Definition BoundaryPlane.cpp:1739
std::string m_filename
File name for IO.
Definition BoundaryPlane.H:250
static std::string identifier()
Definition BoundaryPlane.H:125
int boundary_native_file_levels() const
Definition BoundaryPlane.cpp:1763
void write_file()
Definition BoundaryPlane.cpp:741
const amrex::AmrCore & m_mesh
Definition BoundaryPlane.H:212
const kynema_sgf::SimTime & m_time
Definition BoundaryPlane.H:210
void populate_data(int, amrex::Real, const Field &, amrex::MultiFab &, int dcomp=0, int orig_comp=0) const
Definition BoundaryPlane.cpp:1452
const FieldRepo & m_repo
Definition BoundaryPlane.H:211
const int m_in_rad
controls extents on native bndry output
Definition BoundaryPlane.H:297
amrex::Vector< std::string > m_planes
IO boundary planes.
Definition BoundaryPlane.H:239
void set_velocity(int lev, amrex::Real time, const Field &fld, amrex::MultiFab &mfab, int dcomp=0, int orig_comp=0) const override
Definition BoundaryPlane.cpp:1597
ReadERFFunction * m_read_erf
Definition BoundaryPlane.H:218
io_mode m_io_mode
IO mode.
Definition BoundaryPlane.H:269
bool m_static_plane_is_read
Definition BoundaryPlane.H:289
bool m_output_init
Flag indicating that initial condition should be written out at beginning of simulation to create sta...
Definition BoundaryPlane.H:294
const int m_out_rad
Definition BoundaryPlane.H:298
bool is_data_newer_than(const amrex::Real time) const
Definition BoundaryPlane.H:188
amrex::Vector< std::string > m_var_names
Variables for IO.
Definition BoundaryPlane.H:256
std::string m_title
Definition BoundaryPlane.H:229
amrex::Vector< amrex::BoxArray > read_bndry_native_boxarrays(const std::string &chkname, const Field &field) const
Definition BoundaryPlane.cpp:1092
phase m_phase
User-selected fluid phase gate for boundary field population.
Definition BoundaryPlane.H:272
MultiBlockContainer ** m_mbc
Definition BoundaryPlane.H:217
io_mode mode() const
Definition BoundaryPlane.H:195
Definition CFDSim.H:55
Definition Field.H:112
Definition FieldRepo.H:86
Definition BoundaryPlane.H:37
amrex::Real tinterp() const
Definition BoundaryPlane.H:92
std::unordered_map< int, int > m_components
Map of {variableId : component}
Definition BoundaryPlane.H:109
amrex::Vector< std::unique_ptr< PlaneVector > > m_data_np1
Definition BoundaryPlane.H:96
bool is_populated(amrex::Orientation) const
Definition BoundaryPlane.cpp:327
int & component(const int id)
Definition BoundaryPlane.H:78
amrex::Real tnp1() const
Definition BoundaryPlane.H:91
amrex::Real m_tinterp
Time for plane at interpolation.
Definition BoundaryPlane.H:106
void resize(int)
Definition BoundaryPlane.cpp:87
void read_data_native(amrex::OrientationIter oit, amrex::BndryRegister &bndry_n, amrex::BndryRegister &bndry_np1, int lev, const Field *, amrex::Real time, const amrex::Vector< amrex::Real > &)
Definition BoundaryPlane.cpp:203
void define_plane(amrex::Orientation)
Definition BoundaryPlane.cpp:94
amrex::Vector< std::unique_ptr< PlaneVector > > m_data_n
Definition BoundaryPlane.H:95
amrex::Real tn() const
Definition BoundaryPlane.H:90
amrex::Vector< std::unique_ptr< PlaneVector > > m_data_interp
Definition BoundaryPlane.H:97
int nlevels(const amrex::Orientation ori) const
Definition BoundaryPlane.H:85
void define_level_data(amrex::Orientation, const amrex::Box &, size_t)
Definition BoundaryPlane.cpp:101
int component(const int id) const
Definition BoundaryPlane.H:80
amrex::Real m_tn
Time for plane at n.
Definition BoundaryPlane.H:100
amrex::Real m_tnp1
Time for plane at n + 1.
Definition BoundaryPlane.H:103
const amrex::FArrayBox & interpolate_data(const amrex::Orientation ori, const int lev) const
Definition BoundaryPlane.H:73
void read_data(ncutils::NCGroup &, const amrex::Orientation, const int, const Field *, const amrex::Real, const amrex::Vector< amrex::Real > &, bool)
Definition BoundaryPlane.cpp:113
void interpolate(amrex::Real)
Definition BoundaryPlane.cpp:305
amrex::Vector< amrex::FArrayBox > PlaneVector
Definition BoundaryPlane.H:38
Definition IntField.H:20
Definition SimTime.H:33
Representation of a NetCDF group.
Definition nc_interface.H:162
This test case is intended as an evaluation of the momentum advection scheme.
Definition BCInterface.cpp:10
io_mode
Definition BoundaryPlane.H:19
@ undefined
Definition BoundaryPlane.H:19
@ output
Definition BoundaryPlane.H:19
@ input
Definition BoundaryPlane.H:19
phase
Definition BoundaryPlane.H:21
@ both
Definition BoundaryPlane.H:21
@ liquid
Definition BoundaryPlane.H:21
@ gas
Definition BoundaryPlane.H:21
Definition BoundaryPlane.H:24
amrex::Gpu::ManagedVector< amrex::Real > data
Definition BoundaryPlane.H:25
amrex::Vector< size_t > count
Definition BoundaryPlane.H:27
amrex::Vector< size_t > start
Definition BoundaryPlane.H:26