/home/runner/work/amr-wind/amr-wind/amr-wind/boundary_conditions/field_boundary_fill/BoundaryPlane.H Source File

AMR-Wind API: /home/runner/work/amr-wind/amr-wind/amr-wind/boundary_conditions/field_boundary_fill/BoundaryPlane.H Source File
AMR-Wind 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>
6#include "amr-wind/CFDSim.H"
10#include "AMReX_Gpu.H"
11#include "AMReX_BndryRegister.H"
12#include "AMReX_REAL.H"
13
14using namespace amrex::literals;
15class MultiBlockContainer;
16namespace amr_wind {
17
18enum struct io_mode : std::uint8_t { output, input, undefined };
19
21{
22 amrex::Gpu::ManagedVector<amrex::Real> data;
23 amrex::Vector<size_t> start{0, 0, 0, 0};
24 amrex::Vector<size_t> count{0, 0, 0, 0};
25};
26
34{
35 using PlaneVector = amrex::Vector<amrex::FArrayBox>;
36
37public:
38 InletData() = default;
39
40 void resize(int /*size*/);
41
42 void define_plane(amrex::Orientation /*ori*/);
43
45 amrex::Orientation /*ori*/, const amrex::Box& /*bx*/, size_t /*nc*/);
46
47#ifdef AMR_WIND_USE_NETCDF
48 void read_data(
49 ncutils::NCGroup& /*grp*/,
50 const amrex::Orientation /*ori*/,
51 const int /*lev*/,
52 const Field* /*fld*/,
53 const amrex::Real /*time*/,
54 const amrex::Vector<amrex::Real>& /*times*/);
55#endif
56
58 amrex::OrientationIter oit,
59 amrex::BndryRegister& bndry_n,
60 amrex::BndryRegister& bndry_np1,
61 int lev,
62 const Field* /*fld*/,
63 amrex::Real time,
64 const amrex::Vector<amrex::Real>& /*times*/);
65
66 void interpolate(amrex::Real /*time*/);
67 [[nodiscard]] bool is_populated(amrex::Orientation /*ori*/) const;
68 [[nodiscard]] const amrex::FArrayBox&
69 interpolate_data(const amrex::Orientation ori, const int lev) const
70 {
71 return (*m_data_interp[ori])[lev];
72 }
73
74 int& component(const int id) { return m_components[id]; }
75
76 [[nodiscard]] int component(const int id) const
77 {
78 return m_components.at(id);
79 }
80
81 [[nodiscard]] int nlevels(const amrex::Orientation ori) const
82 {
83 return static_cast<int>((*m_data_interp[ori]).size());
84 }
85
86 [[nodiscard]] amrex::Real tn() const { return m_tn; }
87 [[nodiscard]] amrex::Real tnp1() const { return m_tnp1; }
88 [[nodiscard]] amrex::Real tinterp() const { return m_tinterp; }
89
90private:
91 amrex::Vector<std::unique_ptr<PlaneVector>> m_data_n;
92 amrex::Vector<std::unique_ptr<PlaneVector>> m_data_np1;
93 amrex::Vector<std::unique_ptr<PlaneVector>> m_data_interp;
94
96 amrex::Real m_tn{-1.0_rt};
97
99 amrex::Real m_tnp1{-1.0_rt};
100
102 amrex::Real m_tinterp{-1.0_rt};
103
105 std::unordered_map<int, int> m_components;
106};
107
116class BoundaryPlane : public amr_wind::FieldBoundary::Register<BoundaryPlane>
117{
118 static_assert(AMREX_SPACEDIM == 3, "ABL requires 3 dimensional mesh");
119
120public:
121 static std::string identifier() { return "BoundaryPlane"; }
122
123 explicit BoundaryPlane(CFDSim& /*sim*/);
124
125 void post_init_actions() override;
126
127 void pre_advance_work() override;
128
129 void post_advance_work() override;
130
131 void pre_predictor_work() override;
132
133 void set_velocity(
134 int lev,
135 amrex::Real time,
136 const Field& fld,
137 amrex::MultiFab& mfab,
138 int dcomp = 0,
139 int orig_comp = 0) const override;
140
141 // Non-inherited public methods
142
144
145 void initialize_data();
146
147 void write_header();
148
149 void write_bndry_native_header(const std::string& chkname);
150
151 void write_file();
152
153 void read_header();
154
155 [[nodiscard]] amrex::Vector<amrex::BoxArray> read_bndry_native_boxarrays(
156 const std::string& chkname, const Field& field) const;
157
158 void read_file(bool /* nph_target_time*/);
159
160 void populate_data(
161 int /*lev*/,
162 amrex::Real /*time*/,
163 const Field& /*fld*/,
164 amrex::MultiFab& /*mfab*/,
165 int dcomp = 0,
166 int orig_comp = 0) const;
167
168#ifdef AMR_WIND_USE_NETCDF
169 static void impl_buffer_field(
170 const amrex::Box& /*bx*/,
171 const int /*n1*/,
172 const int /*nc*/,
173 const amrex::GpuArray<int, 2>& /*perp*/,
174 const amrex::IntVect& /*v_offset*/,
175 const amrex::Array4<const amrex::Real>& /*fld*/,
176 amrex::Gpu::ManagedVector<amrex::Real>& /*buffer*/);
177#endif
178
179 [[nodiscard]] bool box_intersects_boundary(
180 const amrex::Box& /*bx*/,
181 int /*lev*/,
182 amrex::Orientation /*ori*/) const;
183
184 [[nodiscard]] bool is_data_newer_than(const amrex::Real time) const
185 {
186 return (
187 m_in_data.tinterp() - time >
188 std::numeric_limits<amrex::Real>::epsilon() * 1.0e4_rt);
189 }
190
191 [[nodiscard]] io_mode mode() const { return m_io_mode; }
192
193 MultiBlockContainer* mbc()
194 {
195 // Make sure that the double pointer m_mbc
196 // does not point to a nullptr
197 // before passing *m_mbc for use
198 if ((*m_mbc) == nullptr) {
199 amrex::Abort("Passing a null pointer for use!");
200 }
201 return *m_mbc;
202 }
203
204private:
207 const amrex::AmrCore& m_mesh;
208
209 // pointer to pointer : when ABL boundary plane gets initialized, amr-wind
210 // CFDsim does not yet have the up to date pointer to the mbc or the
211 // read_erf function, hence the use of double pointers
212 MultiBlockContainer** m_mbc;
214
215#ifdef AMR_WIND_USE_NETCDF
216 void write_data(
217 const ncutils::NCGroup& grp,
218 const amrex::Orientation /*ori*/,
219 const int /*lev*/,
220 const Field* /*fld*/);
221#endif
222 [[nodiscard]] int boundary_native_file_levels() const;
223
224 std::string m_title{"ABL boundary planes"};
225
228
230 amrex::Vector<std::string> m_plane_names{"xlo", "ylo", "zlo",
231 "xhi", "yhi", "zhi"};
232
234 amrex::Vector<std::string> m_planes;
235
237 amrex::Real m_out_start_time{0.0_rt};
238
239#ifdef AMR_WIND_USE_NETCDF
241 size_t m_out_counter{0};
242#endif
243
245 std::string m_filename;
246
248 std::string m_time_file;
249
251 amrex::Vector<std::string> m_var_names;
252
254 amrex::Vector<Field*> m_fields;
255
257 amrex::Vector<amrex::Real> m_in_times;
258 amrex::Vector<int> m_in_timesteps;
259
262
265
268 bool m_has_overset{false};
269
271 const int m_in_rad = 1;
272 const int m_out_rad = 1;
273 const int m_extent_rad = 0;
274
276 std::string m_out_fmt{"native"};
277};
278
279} // namespace amr_wind
280
281#endif /* BOUNDARYPLANE_H */
std::function< void( const amrex::Real time, amrex::Vector< amrex::Real > &, amr_wind::InletData &, const amrex::Vector< amr_wind::Field * > &, MultiBlockContainer *)> ReadERFFunction
Definition ReadERFFunction.H:10
BoundaryPlane(CFDSim &)
Definition BoundaryPlane.cpp:287
MultiBlockContainer * mbc()
Definition BoundaryPlane.H:193
amrex::Vector< std::string > m_planes
IO boundary planes.
Definition BoundaryPlane.H:234
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:1556
std::string m_filename
File name for IO.
Definition BoundaryPlane.H:245
InletData m_in_data
Inlet data.
Definition BoundaryPlane.H:261
void populate_data(int, amrex::Real, const Field &, amrex::MultiFab &, int dcomp=0, int orig_comp=0) const
Definition BoundaryPlane.cpp:1315
MultiBlockContainer ** m_mbc
Definition BoundaryPlane.H:212
void write_data(const ncutils::NCGroup &grp, const amrex::Orientation, const int, const Field *)
Definition BoundaryPlane.cpp:1437
bool m_has_overset
Flag indicating if the simulation is overset – needed for complicated timing of pre_advance_work.
Definition BoundaryPlane.H:268
void write_bndry_native_header(const std::string &chkname)
Definition BoundaryPlane.cpp:542
void post_init_actions() override
Definition BoundaryPlane.cpp:362
ReadERFFunction * m_read_erf
Definition BoundaryPlane.H:213
void write_file()
Definition BoundaryPlane.cpp:632
amrex::Real m_out_start_time
Start outputting after this time.
Definition BoundaryPlane.H:237
void pre_advance_inner_calls()
Definition BoundaryPlane.cpp:382
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:1414
void initialize_data()
Definition BoundaryPlane.cpp:390
const int m_extent_rad
Definition BoundaryPlane.H:273
void read_header()
Definition BoundaryPlane.cpp:748
void write_header()
Definition BoundaryPlane.cpp:410
void read_file(bool)
Definition BoundaryPlane.cpp:1158
bool is_data_newer_than(const amrex::Real time) const
Definition BoundaryPlane.H:184
const int m_out_rad
Definition BoundaryPlane.H:272
amrex::Vector< amrex::Real > m_in_times
NetCDF input level time.
Definition BoundaryPlane.H:257
std::string m_title
Definition BoundaryPlane.H:224
int boundary_native_file_levels() const
Definition BoundaryPlane.cpp:1580
std::string m_out_fmt
output format for bndry output
Definition BoundaryPlane.H:276
io_mode mode() const
Definition BoundaryPlane.H:191
io_mode m_io_mode
IO mode.
Definition BoundaryPlane.H:264
amrex::Vector< std::string > m_plane_names
Plane names.
Definition BoundaryPlane.H:230
std::string m_time_file
File name for Native time file.
Definition BoundaryPlane.H:248
void pre_predictor_work() override
Definition BoundaryPlane.cpp:386
const int m_in_rad
controls extents on native bndry output
Definition BoundaryPlane.H:271
const FieldRepo & m_repo
Definition BoundaryPlane.H:206
const amrex::AmrCore & m_mesh
Definition BoundaryPlane.H:207
amrex::Vector< amrex::BoxArray > read_bndry_native_boxarrays(const std::string &chkname, const Field &field) const
Definition BoundaryPlane.cpp:962
amrex::Vector< int > m_in_timesteps
Definition BoundaryPlane.H:258
size_t m_out_counter
NetCDF time output counter.
Definition BoundaryPlane.H:241
amrex::Vector< Field * > m_fields
List of fields for IO.
Definition BoundaryPlane.H:254
void pre_advance_work() override
Definition BoundaryPlane.cpp:373
void post_advance_work() override
Definition BoundaryPlane.cpp:388
bool box_intersects_boundary(const amrex::Box &, int, amrex::Orientation) const
True if box intersects the boundary.
Definition BoundaryPlane.cpp:1597
amrex::Vector< std::string > m_var_names
Variables for IO.
Definition BoundaryPlane.H:251
int m_write_frequency
Normal direction for the boundary plane.
Definition BoundaryPlane.H:227
const amr_wind::SimTime & m_time
Definition BoundaryPlane.H:205
static std::string identifier()
Definition BoundaryPlane.H:121
Definition CFDSim.H:55
Definition Field.H:112
Definition FieldRepo.H:86
Definition BoundaryPlane.H:34
void read_data(ncutils::NCGroup &, const amrex::Orientation, const int, const Field *, const amrex::Real, const amrex::Vector< amrex::Real > &)
Definition BoundaryPlane.cpp:74
bool is_populated(amrex::Orientation) const
Definition BoundaryPlane.cpp:282
amrex::Vector< std::unique_ptr< PlaneVector > > m_data_interp
Definition BoundaryPlane.H:93
int & component(const int id)
Definition BoundaryPlane.H:74
amrex::Real tn() const
Definition BoundaryPlane.H:86
amrex::Real m_tnp1
Time for plane at n + 1.
Definition BoundaryPlane.H:99
amrex::Real tnp1() const
Definition BoundaryPlane.H:87
const amrex::FArrayBox & interpolate_data(const amrex::Orientation ori, const int lev) const
Definition BoundaryPlane.H:69
void resize(int)
Definition BoundaryPlane.cpp:48
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:158
amrex::Real m_tinterp
Time for plane at interpolation.
Definition BoundaryPlane.H:102
void define_level_data(amrex::Orientation, const amrex::Box &, size_t)
Definition BoundaryPlane.cpp:62
int component(const int id) const
Definition BoundaryPlane.H:76
amrex::Real tinterp() const
Definition BoundaryPlane.H:88
void interpolate(amrex::Real)
Definition BoundaryPlane.cpp:260
std::unordered_map< int, int > m_components
Map of {variableId : component}
Definition BoundaryPlane.H:105
amrex::Real m_tn
Time for plane at n.
Definition BoundaryPlane.H:96
amrex::Vector< amrex::FArrayBox > PlaneVector
Definition BoundaryPlane.H:35
int nlevels(const amrex::Orientation ori) const
Definition BoundaryPlane.H:81
void define_plane(amrex::Orientation)
Definition BoundaryPlane.cpp:55
amrex::Vector< std::unique_ptr< PlaneVector > > m_data_n
Definition BoundaryPlane.H:91
amrex::Vector< std::unique_ptr< PlaneVector > > m_data_np1
Definition BoundaryPlane.H:92
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:18
@ undefined
Definition BoundaryPlane.H:18
@ output
Definition BoundaryPlane.H:18
@ input
Definition BoundaryPlane.H:18
Definition BoundaryPlane.H:21
amrex::Gpu::ManagedVector< amrex::Real > data
Definition BoundaryPlane.H:22
amrex::Vector< size_t > start
Definition BoundaryPlane.H:23
amrex::Vector< size_t > count
Definition BoundaryPlane.H:24