1#ifndef SAMPLINGCONTAINER_H
2#define SAMPLINGCONTAINER_H
7#include "AMReX_AmrParticles.H"
11using namespace amrex::literals;
64 :
public amrex::AmrParticleContainer<
72 :
amrex::AmrParticleContainer<
82 void setup_container(
int num_real_components,
int num_int_components = 0);
87 const amrex::Vector<std::unique_ptr<SamplerBase>>& );
90 template <
typename FType>
93 BL_PROFILE(
"amr-wind::SamplingContainer::interpolate_fields");
95 const int nlevels =
m_mesh.finestLevel() + 1;
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(),
107 scomp_curr += fld->num_comp();
136 template <
typename FType>
140 SamplingContainer::ParticleVector& pvec,
141 SamplingContainer::RealVector& pavec,
143 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& problo,
144 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dxi,
145 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dx,
146 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& offset)
148 BL_PROFILE(
"amr-wind::SamplingContainer::sample_impl");
150 auto* pstruct = pvec.data();
151 auto* parr = pavec.data();
153 amrex::ParallelFor(np, [=] AMREX_GPU_DEVICE(
int ip) {
154 auto& p = pstruct[ip];
156 const amrex::Real x =
157 (p.pos(0) - problo[0] - offset[0] * dx[0]) * dxi[0];
158 const amrex::Real y =
159 (p.pos(1) - problo[1] - offset[1] * dx[1]) * dxi[1];
160 const amrex::Real z =
161 (p.pos(2) - problo[2] - offset[2] * dx[2]) * dxi[2];
164 const int i =
static_cast<int>(std::floor(x));
165 const int j =
static_cast<int>(std::floor(y));
166 const int k =
static_cast<int>(std::floor(z));
169 const amrex::Real wx_hi = (x - i);
170 const amrex::Real wy_hi = (y - j);
171 const amrex::Real wz_hi = (z - k);
173 const amrex::Real wx_lo = 1.0_rt - wx_hi;
174 const amrex::Real wy_lo = 1.0_rt - wy_hi;
175 const amrex::Real wz_lo = 1.0_rt - wz_hi;
177 parr[ip] = (wx_lo * wy_lo * wz_lo * farr(i, j, k, ic)) +
178 (wx_lo * wy_lo * wz_hi * farr(i, j, k + 1, ic)) +
179 (wx_lo * wy_hi * wz_lo * farr(i, j + 1, k, ic)) +
180 (wx_lo * wy_hi * wz_hi * farr(i, j + 1, k + 1, ic)) +
181 (wx_hi * wy_lo * wz_lo * farr(i + 1, j, k, ic)) +
182 (wx_hi * wy_lo * wz_hi * farr(i + 1, j, k + 1, ic)) +
183 (wx_hi * wy_hi * wz_lo * farr(i + 1, j + 1, k, ic)) +
184 (wx_hi * wy_hi * wz_hi * farr(i + 1, j + 1, k + 1, ic));
190 template <
typename FType>
192 const ParIterType& pti,
199 const auto& geom =
m_mesh.Geom(lev);
200 const auto dx = geom.CellSizeArray();
201 const auto dxi = geom.InvCellSizeArray();
202 const auto plo = geom.ProbLoArray();
203 const int np = pti.numParticles();
204 auto& pvec = pti.GetArrayOfStructs()();
206 for (
int ic = 0; ic < ncomp; ++ic) {
207 auto& parr = pti.GetStructOfArrays().GetRealData(fidx++);
211 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM> offset{
212 0.0_rt, 0.0_rt, 0.0_rt};
213 sample_field(np, ic, pvec, parr, farr, plo, dxi, dx, offset);
218 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM> offset{
219 0.5_rt, 0.5_rt, 0.5_rt};
220 sample_field(np, ic, pvec, parr, farr, plo, dxi, dx, offset);
225 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM> offset{
226 0.0_rt, 0.5_rt, 0.5_rt};
227 sample_field(np, ic, pvec, parr, farr, plo, dxi, dx, offset);
232 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM> offset{
233 0.5_rt, 0.0_rt, 0.5_rt};
234 sample_field(np, ic, pvec, parr, farr, plo, dxi, dx, offset);
239 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM> offset{
240 0.5_rt, 0.5_rt, 0.0_rt};
241 sample_field(np, ic, pvec, parr, farr, plo, dxi, dx, offset);
Definition DerivedQuantity.H:32
Definition FieldRepo.H:86
Definition SamplerBase.H:59
long m_total_particles
Definition SamplingContainer.H:250
void setup_container(int num_real_components, int num_int_components=0)
Definition SamplingContainer.cpp:13
const amrex::AmrCore & m_mesh
Definition SamplingContainer.H:248
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:191
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:71
long & num_sampling_particles()
Definition SamplingContainer.H:122
long num_sampling_particles() const
Definition SamplingContainer.H:120
void interpolate_derived_fields(const DerivedQtyMgr &derived_mgr, const FieldRepo &repo, int scomp)
Perform derived field interpolation to sampling locations.
Definition SamplingContainer.cpp:147
void initialize_particles(const amrex::Vector< std::unique_ptr< SamplerBase > > &)
Definition SamplingContainer.cpp:36
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:137
FieldLoc
Definition FieldDescTypes.H:29
@ NODE
Node-centered (e.g., for pressure)
Definition FieldDescTypes.H:31
@ ZFACE
Face-centered in z-direction.
Definition FieldDescTypes.H:34
@ XFACE
Face-centered in x-direction (e.g., face normal velocity)
Definition FieldDescTypes.H:32
@ CELL
Cell-centered (default)
Definition FieldDescTypes.H:30
@ YFACE
Face-centered in y-direction.
Definition FieldDescTypes.H:33
Definition DTUSpinnerSampler.cpp:19
static constexpr int SNArrayReal
Definition SamplingContainer.H:23
static constexpr int SNStructReal
Definition SamplingContainer.H:21
static constexpr int SNArrayInt
Definition SamplingContainer.H:24
static constexpr int SNStructInt
Definition SamplingContainer.H:22
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:30
Indices
Definition SamplingContainer.H:31
@ nid
Index within the set for this particle.
Definition SamplingContainer.H:34
@ uid
Unique identifier for this particle.
Definition SamplingContainer.H:32
@ sid
Identifier of the set this particle belongs to.
Definition SamplingContainer.H:33