/home/runner/work/amr-wind/amr-wind/amr-wind/utilities/sampling/SamplingContainer.H Source File

AMR-Wind API: /home/runner/work/amr-wind/amr-wind/amr-wind/utilities/sampling/SamplingContainer.H Source File
AMR-Wind API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
SamplingContainer.H
Go to the documentation of this file.
1#ifndef SAMPLINGCONTAINER_H
2#define SAMPLINGCONTAINER_H
3
4#include <memory>
5
6#include "AMReX_AmrParticles.H"
8#include "AMReX_REAL.H"
9
10using namespace amrex::literals;
11
12namespace amr_wind {
13
14class Field;
15
16namespace sampling {
17
18class SamplerBase;
19
20static constexpr int SNStructReal = 0;
21static constexpr int SNStructInt = 3;
22static constexpr int SNArrayReal = 0;
23static constexpr int SNArrayInt = 0;
24
28struct IIx
29{
30 enum Indices {
31 uid = 0,
34 };
35};
36
63 : public amrex::AmrParticleContainer<
64 SNStructReal,
65 SNStructInt,
66 SNArrayReal,
67 SNArrayInt>
68{
69public:
70 explicit SamplingContainer(amrex::AmrCore& mesh)
71 : amrex::AmrParticleContainer<
75 SNArrayInt>(&mesh)
76 , m_mesh(mesh)
77 {}
78
81 void setup_container(
82 const int num_real_components, const int num_int_components = 0);
83
87 const amrex::Vector<std::unique_ptr<SamplerBase>>& /*samplers*/);
88
90 template <typename FType>
91 void interpolate_fields(const amrex::Vector<FType>& fields, const int scomp)
92 {
93 BL_PROFILE("amr-wind::SamplingContainer::interpolate_fields");
94
95 const int nlevels = m_mesh.finestLevel() + 1;
96
97 for (int lev = 0; lev < nlevels; ++lev) {
98 for (ParIterType pti(*this, lev); pti.isValid(); ++pti) {
99 int scomp_curr = scomp;
100 for (const auto* fld : fields) {
101 AMREX_ALWAYS_ASSERT(fld->num_grow() > amrex::IntVect{0});
102 const auto farr = (*fld)(lev).const_array(pti);
104 pti, farr, lev, fld->field_location(), fld->num_comp(),
105 scomp_curr);
106
107 scomp_curr += fld->num_comp();
108 }
109 }
110 }
111 }
112
115 const DerivedQtyMgr& derived_mgr,
116 const FieldRepo& repo,
117 const int scomp);
118
120 void populate_buffer(std::vector<amrex::Real>& buf);
121
123
125
138 template <typename FType>
140 const int np,
141 const int ic,
142 SamplingContainer::ParticleVector& pvec,
143 SamplingContainer::RealVector& pavec,
144 const FType& farr,
145 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& problo,
146 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dxi,
147 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dx,
148 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& offset)
149 {
150 BL_PROFILE("amr-wind::SamplingContainer::sample_impl");
151
152 auto* pstruct = pvec.data();
153 auto* parr = pavec.data();
154
155 amrex::ParallelFor(np, [=] AMREX_GPU_DEVICE(int ip) noexcept {
156 auto& p = pstruct[ip];
157 // Determine offsets within the containing cell
158 const amrex::Real x =
159 (p.pos(0) - problo[0] - offset[0] * dx[0]) * dxi[0];
160 const amrex::Real y =
161 (p.pos(1) - problo[1] - offset[1] * dx[1]) * dxi[1];
162 const amrex::Real z =
163 (p.pos(2) - problo[2] - offset[2] * dx[2]) * dxi[2];
164
165 // Index of the low corner
166 const int i = static_cast<int>(std::floor(x));
167 const int j = static_cast<int>(std::floor(y));
168 const int k = static_cast<int>(std::floor(z));
169
170 // Interpolation weights in each direction (linear basis)
171 const amrex::Real wx_hi = (x - i);
172 const amrex::Real wy_hi = (y - j);
173 const amrex::Real wz_hi = (z - k);
174
175 const amrex::Real wx_lo = 1.0_rt - wx_hi;
176 const amrex::Real wy_lo = 1.0_rt - wy_hi;
177 const amrex::Real wz_lo = 1.0_rt - wz_hi;
178
179 parr[ip] = wx_lo * wy_lo * wz_lo * farr(i, j, k, ic) +
180 wx_lo * wy_lo * wz_hi * farr(i, j, k + 1, ic) +
181 wx_lo * wy_hi * wz_lo * farr(i, j + 1, k, ic) +
182 wx_lo * wy_hi * wz_hi * farr(i, j + 1, k + 1, ic) +
183 wx_hi * wy_lo * wz_lo * farr(i + 1, j, k, ic) +
184 wx_hi * wy_lo * wz_hi * farr(i + 1, j, k + 1, ic) +
185 wx_hi * wy_hi * wz_lo * farr(i + 1, j + 1, k, ic) +
186 wx_hi * wy_hi * wz_hi * farr(i + 1, j + 1, k + 1, ic);
187 });
188 }
189
190private:
192 template <typename FType>
194 const ParIterType& pti,
195 const FType& farr,
196 const int lev,
197 const FieldLoc floc,
198 const int ncomp,
199 const int scomp)
200 {
201 const auto& geom = m_mesh.Geom(lev);
202 const auto dx = geom.CellSizeArray();
203 const auto dxi = geom.InvCellSizeArray();
204 const auto plo = geom.ProbLoArray();
205 const int np = pti.numParticles();
206 auto& pvec = pti.GetArrayOfStructs()();
207 int fidx = scomp;
208 for (int ic = 0; ic < ncomp; ++ic) {
209 auto& parr = pti.GetStructOfArrays().GetRealData(fidx++);
210
211 switch (floc) {
212 case FieldLoc::NODE: {
213 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM> offset{
214 0.0_rt, 0.0_rt, 0.0_rt};
215 sample_field(np, ic, pvec, parr, farr, plo, dxi, dx, offset);
216 break;
217 }
218
219 case FieldLoc::CELL: {
220 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM> offset{
221 0.5_rt, 0.5_rt, 0.5_rt};
222 sample_field(np, ic, pvec, parr, farr, plo, dxi, dx, offset);
223 break;
224 }
225
226 case FieldLoc::XFACE: {
227 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM> offset{
228 0.0_rt, 0.5_rt, 0.5_rt};
229 sample_field(np, ic, pvec, parr, farr, plo, dxi, dx, offset);
230 break;
231 }
232
233 case FieldLoc::YFACE: {
234 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM> offset{
235 0.5_rt, 0.0_rt, 0.5_rt};
236 sample_field(np, ic, pvec, parr, farr, plo, dxi, dx, offset);
237 break;
238 }
239
240 case FieldLoc::ZFACE: {
241 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM> offset{
242 0.5_rt, 0.5_rt, 0.0_rt};
243 sample_field(np, ic, pvec, parr, farr, plo, dxi, dx, offset);
244 break;
245 }
246 }
247 }
248 }
249
250 const amrex::AmrCore& m_mesh;
251
253};
254
255} // namespace sampling
256} // namespace amr_wind
257
258#endif /* SAMPLINGCONTAINER_H */
Definition DerivedQuantity.H:32
Definition Field.H:116
Definition FieldRepo.H:86
Definition SamplerBase.H:59
long m_total_particles
Definition SamplingContainer.H:252
const amrex::AmrCore & m_mesh
Definition SamplingContainer.H:250
void populate_buffer(std::vector< amrex::Real > &buf)
Populate the buffer with data for all the particles.
Definition SamplingContainer.cpp:167
void interpolate(const ParIterType &pti, const FType &farr, const int lev, const FieldLoc floc, const int ncomp, const int scomp)
Interpolate from an array4 onto particles.
Definition SamplingContainer.H:193
void interpolate_fields(const amrex::Vector< FType > &fields, const int scomp)
Perform field interpolation to sampling locations.
Definition SamplingContainer.H:91
SamplingContainer(amrex::AmrCore &mesh)
Definition SamplingContainer.H:70
long & num_sampling_particles()
Definition SamplingContainer.H:124
long num_sampling_particles() const
Definition SamplingContainer.H:122
void initialize_particles(const amrex::Vector< std::unique_ptr< SamplerBase > > &)
Definition SamplingContainer.cpp:34
void setup_container(const int num_real_components, const int num_int_components=0)
Definition SamplingContainer.cpp:11
void interpolate_derived_fields(const DerivedQtyMgr &derived_mgr, const FieldRepo &repo, const int scomp)
Perform derived field interpolation to sampling locations.
Definition SamplingContainer.cpp:147
void sample_field(const int np, const int ic, SamplingContainer::ParticleVector &pvec, SamplingContainer::RealVector &pavec, const FType &farr, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &problo, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxi, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dx, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &offset)
Definition SamplingContainer.H:139
FieldLoc
Definition FieldDescTypes.H:27
@ NODE
Node-centered (e.g., for pressure)
Definition FieldDescTypes.H:29
@ ZFACE
Face-centered in z-direction.
Definition FieldDescTypes.H:32
@ XFACE
Face-centered in x-direction (e.g., face normal velocity)
Definition FieldDescTypes.H:30
@ CELL
Cell-centered (default)
Definition FieldDescTypes.H:28
@ YFACE
Face-centered in y-direction.
Definition FieldDescTypes.H:31
Definition DTUSpinnerSampler.cpp:19
static constexpr int SNArrayReal
Definition SamplingContainer.H:22
static constexpr int SNStructReal
Definition SamplingContainer.H:20
static constexpr int SNArrayInt
Definition SamplingContainer.H:23
static constexpr int SNStructInt
Definition SamplingContainer.H:21
This test case is intended as an evaluation of the momentum advection scheme.
Definition BCInterface.cpp:10
Definition console_io.cpp:30
Definition SamplingContainer.H:29
Indices
Definition SamplingContainer.H:30
@ nid
Index within the set for this particle.
Definition SamplingContainer.H:33
@ uid
Unique identifier for this particle.
Definition SamplingContainer.H:31
@ sid
Identifier of the set this particle belongs to.
Definition SamplingContainer.H:32