/home/runner/work/amr-wind/amr-wind/amr-wind/wind_energy/ABLBoundaryPlane.H Source File

AMR-Wind API: /home/runner/work/amr-wind/amr-wind/amr-wind/wind_energy/ABLBoundaryPlane.H Source File
AMR-Wind API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
ABLBoundaryPlane.H
Go to the documentation of this file.
1#ifndef ABLBOUNDARYPLANE_H
2#define ABLBOUNDARYPLANE_H
3
5#include "amr-wind/CFDSim.H"
6#include "AMReX_Gpu.H"
9#include <AMReX_BndryRegister.H>
10
12#include "AMReX_REAL.H"
13
14using namespace amrex::literals;
15class MultiBlockContainer;
16namespace amr_wind {
17
18enum struct io_mode { 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(const int /*size*/);
41
42 void define_plane(const amrex::Orientation /*ori*/);
43
45 const amrex::Orientation /*ori*/,
46 const amrex::Box& /*bx*/,
47 const size_t /*nc*/);
48
49#ifdef AMR_WIND_USE_NETCDF
50 void read_data(
51 ncutils::NCGroup& /*grp*/,
52 const amrex::Orientation /*ori*/,
53 const int /*lev*/,
54 const Field* /*fld*/,
55 const amrex::Real /*time*/,
56 const amrex::Vector<amrex::Real>& /*times*/);
57#endif
58
60 const amrex::OrientationIter oit,
61 amrex::BndryRegister& bndry_n,
62 amrex::BndryRegister& bndry_np1,
63 const int lev,
64 const Field* /*fld*/,
65 const amrex::Real time,
66 const amrex::Vector<amrex::Real>& /*times*/);
67
68 void interpolate(const amrex::Real /*time*/);
69 bool is_populated(amrex::Orientation /*ori*/) const;
70 const amrex::FArrayBox&
71 interpolate_data(const amrex::Orientation ori, const int lev) const
72 {
73 return (*m_data_interp[ori])[lev];
74 }
75
76 int& component(const int id) { return m_components[id]; }
77
78 int component(const int id) const { return m_components.at(id); }
79
80 int nlevels(const amrex::Orientation ori) const
81 {
82 return static_cast<int>((*m_data_interp[ori]).size());
83 }
84
85 amrex::Real tn() const { return m_tn; }
86 amrex::Real tnp1() const { return m_tnp1; }
87 amrex::Real tinterp() const { return m_tinterp; }
88
89private:
90 amrex::Vector<std::unique_ptr<PlaneVector>> m_data_n;
91 amrex::Vector<std::unique_ptr<PlaneVector>> m_data_np1;
92 amrex::Vector<std::unique_ptr<PlaneVector>> m_data_interp;
93
95 amrex::Real m_tn{-1.0_rt};
96
98 amrex::Real m_tnp1{-1.0_rt};
99
101 amrex::Real m_tinterp{-1.0_rt};
102
104 std::unordered_map<int, int> m_components;
105};
106
116{
117 static_assert(AMREX_SPACEDIM == 3, "ABL requires 3 dimensional mesh");
118
119public:
120 explicit ABLBoundaryPlane(CFDSim& /*sim*/);
121
123 void post_init_actions();
124
125 void pre_advance_work();
126
127 void pre_predictor_work();
128
129 void post_advance_work();
130
131 void initialize_data();
132
133 void write_header();
134
135 void write_bndry_native_header(const std::string& chkname);
136
137 void write_file();
138
139 void read_header();
140
141 amrex::Vector<amrex::BoxArray> read_bndry_native_boxarrays(
142 const std::string& chkname, const Field& field) const;
143
144 void read_file(const bool /* nph_target_time*/);
145
146 void populate_data(
147 const int /*lev*/,
148 const amrex::Real /*time*/,
149 Field& /*fld*/,
150 amrex::MultiFab& /*mfab*/,
151 const int dcomp = 0,
152 const int orig_comp = 0) const;
153
154#ifdef AMR_WIND_USE_NETCDF
155 static void impl_buffer_field(
156 const amrex::Box& /*bx*/,
157 const int /*n1*/,
158 const int /*nc*/,
159 const amrex::GpuArray<int, 2>& /*perp*/,
160 const amrex::IntVect& /*v_offset*/,
161 const amrex::Array4<const amrex::Real>& /*fld*/,
162 amrex::Gpu::ManagedVector<amrex::Real>& /*buffer*/);
163#endif
164
165 bool is_initialized() const { return m_is_initialized; }
166
168 const amrex::Box& /*bx*/,
169 const int /*lev*/,
170 const amrex::Orientation /*ori*/) const;
171
172 bool is_data_newer_than(const amrex::Real time) const
173 {
174 return (
175 m_in_data.tinterp() - time >
176 std::numeric_limits<amrex::Real>::epsilon() * 1.0e4_rt);
177 }
178
179 io_mode mode() const { return m_io_mode; }
180
181 MultiBlockContainer* mbc()
182 {
183 // Make sure that the double pointer m_mbc
184 // does not point to a nullptr
185 // before passing *m_mbc for use
186 if ((*m_mbc) == nullptr) {
187 amrex::Abort("Passing a null pointer for use!");
188 }
189 return *m_mbc;
190 }
191
192private:
195 const amrex::AmrCore& m_mesh;
196
197 // pointer to pointer : when ABL boundary plane gets initialized, amr-wind
198 // CFDsim does not yet have the up to date pointer to the mbc or the
199 // read_erf function, hence the use of double pointers
200 MultiBlockContainer** m_mbc;
202
203#ifdef AMR_WIND_USE_NETCDF
204 void write_data(
205 const ncutils::NCGroup& grp,
206 const amrex::Orientation /*ori*/,
207 const int /*lev*/,
208 const Field* /*fld*/);
209#endif
210 int boundary_native_file_levels() const;
211
212 std::string m_title{"ABL boundary planes"};
213
216
218 amrex::Vector<std::string> m_plane_names{"xlo", "ylo", "zlo",
219 "xhi", "yhi", "zhi"};
220
222 amrex::Vector<std::string> m_planes;
223
225 amrex::Real m_out_start_time{0.0_rt};
226
227#ifdef AMR_WIND_USE_NETCDF
229 size_t m_out_counter{0};
230#endif
231
233 std::string m_filename;
234
236 std::string m_time_file;
237
239 amrex::Vector<std::string> m_var_names;
240
242 amrex::Vector<Field*> m_fields;
243
245 amrex::Vector<amrex::Real> m_in_times;
246 amrex::Vector<int> m_in_timesteps;
247
250
253
255 bool m_is_initialized{false};
256
258 const int m_in_rad = 1;
259 const int m_out_rad = 1;
260 const int m_extent_rad = 0;
261
263 std::string m_out_fmt{"native"};
264};
265
266} // namespace amr_wind
267
268#endif /* ABLBOUNDARYPLANE_H */
std::function< void( const amrex::Real time, amrex::Vector< amrex::Real > &, amr_wind::InletData &, const amrex::Vector< amr_wind::Field * > &, MultiBlockContainer *)> ReadERFFunction
Definition ABLReadERFFunction.H:10
bool box_intersects_boundary(const amrex::Box &, const int, const amrex::Orientation) const
True if box intersects the boundary.
Definition ABLBoundaryPlane.cpp:1570
const int m_extent_rad
Definition ABLBoundaryPlane.H:260
void read_header()
Definition ABLBoundaryPlane.cpp:740
void write_bndry_native_header(const std::string &chkname)
Definition ABLBoundaryPlane.cpp:534
io_mode mode() const
Definition ABLBoundaryPlane.H:179
amrex::Vector< std::string > m_var_names
Variables for IO.
Definition ABLBoundaryPlane.H:239
std::string m_time_file
File name for Native time file.
Definition ABLBoundaryPlane.H:236
const int m_in_rad
controls extents on native bndry output
Definition ABLBoundaryPlane.H:258
void post_init_actions()
Execute initialization actions after mesh has been fully generated.
Definition ABLBoundaryPlane.cpp:344
std::string m_out_fmt
output format for bndry output
Definition ABLBoundaryPlane.H:263
InletData m_in_data
Inlet data.
Definition ABLBoundaryPlane.H:249
MultiBlockContainer ** m_mbc
Definition ABLBoundaryPlane.H:200
void pre_advance_work()
Definition ABLBoundaryPlane.cpp:356
size_t m_out_counter
NetCDF time output counter.
Definition ABLBoundaryPlane.H:229
amrex::Vector< Field * > m_fields
List of fields for IO.
Definition ABLBoundaryPlane.H:242
int m_write_frequency
Normal direction for the boundary plane.
Definition ABLBoundaryPlane.H:215
void post_advance_work()
Definition ABLBoundaryPlane.cpp:372
bool is_initialized() const
Definition ABLBoundaryPlane.H:165
io_mode m_io_mode
IO mode.
Definition ABLBoundaryPlane.H:252
const int m_out_rad
Definition ABLBoundaryPlane.H:259
amrex::Vector< std::string > m_planes
IO boundary planes.
Definition ABLBoundaryPlane.H:222
void populate_data(const int, const amrex::Real, Field &, amrex::MultiFab &, const int dcomp=0, const int orig_comp=0) const
Definition ABLBoundaryPlane.cpp:1309
void write_data(const ncutils::NCGroup &grp, const amrex::Orientation, const int, const Field *)
Definition ABLBoundaryPlane.cpp:1410
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 ABLBoundaryPlane.cpp:1529
int boundary_native_file_levels() const
Definition ABLBoundaryPlane.cpp:1553
ABLBoundaryPlane(CFDSim &)
Definition ABLBoundaryPlane.cpp:290
void pre_predictor_work()
Definition ABLBoundaryPlane.cpp:364
amrex::Vector< int > m_in_timesteps
Definition ABLBoundaryPlane.H:246
amrex::Vector< amrex::Real > m_in_times
NetCDF input level time.
Definition ABLBoundaryPlane.H:245
amrex::Vector< amrex::BoxArray > read_bndry_native_boxarrays(const std::string &chkname, const Field &field) const
Definition ABLBoundaryPlane.cpp:956
ReadERFFunction * m_read_erf
Definition ABLBoundaryPlane.H:201
const amrex::AmrCore & m_mesh
Definition ABLBoundaryPlane.H:195
const FieldRepo & m_repo
Definition ABLBoundaryPlane.H:194
void write_file()
Definition ABLBoundaryPlane.cpp:623
const amr_wind::SimTime & m_time
Definition ABLBoundaryPlane.H:193
std::string m_filename
File name for IO.
Definition ABLBoundaryPlane.H:233
void write_header()
Definition ABLBoundaryPlane.cpp:402
MultiBlockContainer * mbc()
Definition ABLBoundaryPlane.H:181
void initialize_data()
Definition ABLBoundaryPlane.cpp:380
amrex::Real m_out_start_time
Start outputting after this time.
Definition ABLBoundaryPlane.H:225
amrex::Vector< std::string > m_plane_names
Plane names.
Definition ABLBoundaryPlane.H:218
std::string m_title
Definition ABLBoundaryPlane.H:212
bool m_is_initialized
Flag indicating if this capability is available.
Definition ABLBoundaryPlane.H:255
bool is_data_newer_than(const amrex::Real time) const
Definition ABLBoundaryPlane.H:172
void read_file(const bool)
Definition ABLBoundaryPlane.cpp:1152
Definition CFDSim.H:54
Definition Field.H:116
Definition FieldRepo.H:86
Definition ABLBoundaryPlane.H:34
void read_data(ncutils::NCGroup &, const amrex::Orientation, const int, const Field *, const amrex::Real, const amrex::Vector< amrex::Real > &)
Definition ABLBoundaryPlane.cpp:73
void read_data_native(const amrex::OrientationIter oit, amrex::BndryRegister &bndry_n, amrex::BndryRegister &bndry_np1, const int lev, const Field *, const amrex::Real time, const amrex::Vector< amrex::Real > &)
Definition ABLBoundaryPlane.cpp:161
bool is_populated(amrex::Orientation) const
Definition ABLBoundaryPlane.cpp:285
amrex::Vector< std::unique_ptr< PlaneVector > > m_data_interp
Definition ABLBoundaryPlane.H:92
void interpolate(const amrex::Real)
Definition ABLBoundaryPlane.cpp:263
int & component(const int id)
Definition ABLBoundaryPlane.H:76
amrex::Real tn() const
Definition ABLBoundaryPlane.H:85
amrex::Real m_tnp1
Time for plane at n + 1.
Definition ABLBoundaryPlane.H:98
amrex::Real tnp1() const
Definition ABLBoundaryPlane.H:86
const amrex::FArrayBox & interpolate_data(const amrex::Orientation ori, const int lev) const
Definition ABLBoundaryPlane.H:71
amrex::Real m_tinterp
Time for plane at interpolation.
Definition ABLBoundaryPlane.H:101
int component(const int id) const
Definition ABLBoundaryPlane.H:78
void resize(const int)
Definition ABLBoundaryPlane.cpp:47
amrex::Real tinterp() const
Definition ABLBoundaryPlane.H:87
void define_level_data(const amrex::Orientation, const amrex::Box &, const size_t)
Definition ABLBoundaryPlane.cpp:61
std::unordered_map< int, int > m_components
Map of {variableId : component}
Definition ABLBoundaryPlane.H:104
amrex::Real m_tn
Time for plane at n.
Definition ABLBoundaryPlane.H:95
amrex::Vector< amrex::FArrayBox > PlaneVector
Definition ABLBoundaryPlane.H:35
int nlevels(const amrex::Orientation ori) const
Definition ABLBoundaryPlane.H:80
void define_plane(const amrex::Orientation)
Definition ABLBoundaryPlane.cpp:54
amrex::Vector< std::unique_ptr< PlaneVector > > m_data_n
Definition ABLBoundaryPlane.H:90
amrex::Vector< std::unique_ptr< PlaneVector > > m_data_np1
Definition ABLBoundaryPlane.H:91
Definition SimTime.H:33
Representation of a NetCDF group.
Definition nc_interface.H:170
This test case is intended as an evaluation of the momentum advection scheme.
Definition BCInterface.cpp:10
io_mode
Definition ABLBoundaryPlane.H:18
@ undefined
Definition ABLBoundaryPlane.H:18
@ output
Definition ABLBoundaryPlane.H:18
@ input
Definition ABLBoundaryPlane.H:18
Definition ABLBoundaryPlane.H:21
amrex::Gpu::ManagedVector< amrex::Real > data
Definition ABLBoundaryPlane.H:22
amrex::Vector< size_t > start
Definition ABLBoundaryPlane.H:23
amrex::Vector< size_t > count
Definition ABLBoundaryPlane.H:24