35template <
typename FloatType, lbmpy::Arch Architecture>
39 std::vector<double> out;
41 get_lattice(), lower_corner, upper_corner,
42 [&](
auto &
block,
auto const &bci,
auto const &ci,
43 auto const &block_offset) {
45 out.resize(3u * ci.numCells());
47 block.template getData<VectorField>(m_velocity_field_id);
50 auto kernel = [&values, &out,
this](
unsigned const block_index,
51 unsigned const local_index,
53 if (m_boundary->node_is_boundary(node)) {
54 auto const &vec = m_boundary->get_node_value_at_boundary(node);
55 for (uint_t f = 0u; f < 3u; ++f) {
56 out[3u * local_index + f] = vec[f];
59 for (uint_t f = 0u; f < 3u; ++f) {
60 out[3u * local_index + f] =
61 double_c(values[3u * block_index + f]);
71template <
typename FloatType, lbmpy::Arch Architecture>
74 std::vector<double>
const &
velocity) {
75 m_pending_ghost_comm.set(GhostComm::PDF);
76 m_pending_ghost_comm.set(GhostComm::VEL);
78 get_lattice(), lower_corner, upper_corner,
79 [&](
auto &
block,
auto const &bci,
auto const &ci,
80 auto const &block_offset) {
82 auto pdf_field =
block.template getData<PdfField>(m_pdf_field_id);
84 block.template getData<VectorField>(m_last_applied_force_field_id);
86 block.template getData<VectorField>(m_velocity_field_id);
87 std::vector<FloatType> values(3u * bci.numCells());
89 auto kernel = [&values, &
velocity](
unsigned const block_index,
90 unsigned const local_index,
92 for (uint_t f = 0u; f < 3u; ++f) {
93 values[3u * block_index + f] =
94 numeric_cast<FloatType>(
velocity[3u * local_index + f]);
104template <
typename FloatType, lbmpy::Arch Architecture>
109 std::vector<double> out;
111 get_lattice(), lower_corner, upper_corner,
112 [&](
auto const &
block,
auto const &bci,
auto const &ci,
113 auto const &block_offset) {
115 out.resize(3u * ci.numCells());
117 block.template getData<VectorField>(m_last_applied_force_field_id);
120 auto kernel = [&values, &out](
unsigned const block_index,
121 unsigned const local_index,
123 for (uint_t f = 0u; f < 3u; ++f) {
124 out[3u * local_index + f] = values[3u * block_index + f];
130 zero_centered_to_md_in_place(out);
134template <
typename FloatType, lbmpy::Arch Architecture>
137 std::vector<double>
const &force) {
138 m_pending_ghost_comm.set(GhostComm::VEL);
139 m_pending_ghost_comm.set(GhostComm::LAF);
141 get_lattice(), lower_corner, upper_corner,
142 [&](
auto &
block,
auto const &bci,
auto const &ci,
143 auto const &block_offset) {
144 assert(force.size() == 3u * ci.numCells());
145 auto pdf_field =
block.template getData<PdfField>(m_pdf_field_id);
147 block.template getData<VectorField>(m_last_applied_force_field_id);
149 block.template getData<VectorField>(m_velocity_field_id);
150 std::vector<FloatType> values(3u * bci.numCells());
152 auto kernel = [&values, &force](
unsigned const block_index,
153 unsigned const local_index,
155 for (uint_t f = 0u; f < 3u; ++f) {
156 values[3u * block_index + f] =
157 numeric_cast<FloatType>(force[3u * local_index + f]);
167template <
typename FloatType, lbmpy::Arch Architecture>
172 std::vector<double> out;
174 get_lattice(), lower_corner, upper_corner,
175 [&](
auto const &
block,
auto const &bci,
auto const &ci,
176 auto const &block_offset) {
178 out.resize(stencil_size() * ci.numCells());
179 auto const pdf_field =
block.template getData<PdfField>(m_pdf_field_id);
182 auto kernel = [&values, &out,
this](
unsigned const block_index,
183 unsigned const local_index,
185 for (uint_t f = 0u; f < stencil_size(); ++f) {
186 out[stencil_size() * local_index + f] =
187 values[stencil_size() * block_index + f];
196template <
typename FloatType, lbmpy::Arch Architecture>
199 std::vector<double>
const &population) {
201 get_lattice(), lower_corner, upper_corner,
202 [&](
auto &
block,
auto const &bci,
auto const &ci,
203 auto const &block_offset) {
204 assert(population.size() == stencil_size() * ci.numCells());
205 auto pdf_field =
block.template getData<PdfField>(m_pdf_field_id);
207 block.template getData<VectorField>(m_last_applied_force_field_id);
209 block.template getData<VectorField>(m_velocity_field_id);
210 std::vector<FloatType> values(stencil_size() * bci.numCells());
212 auto kernel = [&values, &population,
this](
unsigned const block_index,
213 unsigned const local_index,
215 for (uint_t f = 0u; f < stencil_size(); ++f) {
216 values[stencil_size() * block_index + f] = numeric_cast<FloatType>(
217 population[stencil_size() * local_index + f]);
227template <
typename FloatType, lbmpy::Arch Architecture>
231 std::vector<double> out;
233 get_lattice(), lower_corner, upper_corner,
234 [&](
auto const &
block,
auto const &bci,
auto const &ci,
235 auto const &block_offset) {
237 out.resize(ci.numCells());
238 auto const pdf_field =
block.template getData<PdfField>(m_pdf_field_id);
242 auto kernel = [&values, &out](
unsigned const block_index,
243 unsigned const local_index,
245 out[local_index] = values[block_index];
253template <
typename FloatType, lbmpy::Arch Architecture>
256 std::vector<double>
const &
density) {
257 m_pending_ghost_comm.set(GhostComm::PDF);
259 get_lattice(), lower_corner, upper_corner,
260 [&](
auto &
block,
auto const &bci,
auto const &ci,
261 auto const &block_offset) {
262 assert(
density.size() == ci.numCells());
263 auto pdf_field =
block.template getData<PdfField>(m_pdf_field_id);
264 std::vector<FloatType> values(bci.numCells());
266 auto kernel = [&values, &
density](
unsigned const block_index,
267 unsigned const local_index,
269 values[block_index] = numeric_cast<FloatType>(
density[local_index]);
277template <
typename FloatType, lbmpy::Arch Architecture>
282 std::vector<double> out;
284 get_lattice(), lower_corner, upper_corner,
285 [&](
auto const &
block,
auto const &bci,
auto const &ci,
286 auto const &block_offset) {
288 out.resize(9u * ci.numCells());
289 auto const pdf_field =
block.template getData<PdfField>(m_pdf_field_id);
293 auto kernel = [&values, &out,
this](
unsigned const block_index,
294 unsigned const local_index,
296 pressure_tensor_correction(
297 std::span<FloatType, 9ul>(&values[9u * block_index], 9ul));
298 for (uint_t f = 0u; f < 9u; ++f) {
299 out[9u * local_index + f] = values[9u * block_index + f];
Vector implementation and trait types for boost qvm interoperability.
DEVICE_QUALIFIER constexpr size_type size() const noexcept
std::vector< double > get_slice_last_applied_force(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner) const override
void set_slice_velocity(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner, std::vector< double > const &velocity) override
std::vector< double > get_slice_population(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner) const override
std::vector< double > get_slice_velocity(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner) const override
std::vector< double > get_slice_density(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner) const override
std::vector< double > get_slice_pressure_tensor(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner) const override
void set_slice_density(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner, std::vector< double > const &density) override
void set_slice_last_applied_force(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner, std::vector< double > const &force) override
void set_slice_population(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner, std::vector< double > const &population) override
static double * block(double *p, std::size_t index, std::size_t size)
void set(GhostLayerField< double, uint_t{19u}> *pdf_field, double const rho_in, double const density, Cell const &cell)
double get(GhostLayerField< double, uint_t{19u}> const *pdf_field, double const density, Cell const &cell)
void set(GhostLayerField< double, uint_t{19u}> const *pdf_field, GhostLayerField< double, uint_t{3u}> *velocity_field, GhostLayerField< double, uint_t{3u}> *force_field, Vector3< double > const &force, double const density, Cell const &cell)
void set(GhostLayerField< double, uint_t{19u}> *pdf_field, std::array< double, 19u > const &pop, Cell const &cell)
auto get(GhostLayerField< double, uint_t{19u}> const *pdf_field, Cell const &cell)
auto get(GhostLayerField< double, uint_t{19u}> const *pdf_field, double const density, Cell const &cell)
auto get(GhostLayerField< double, uint_t{3u}> const *vec_field, Cell const &cell)
void set(GhostLayerField< double, uint_t{19u}> *pdf_field, GhostLayerField< double, uint_t{3u}> *velocity_field, GhostLayerField< double, uint_t{3u}> const *force_field, Vector3< double > const &u, Cell const &cell)
\file PackInfoPdfDoublePrecision.cpp \author pystencils
void copy_block_buffer(CellInterval const &bci, CellInterval const &ci, Utils::Vector3i const &block_offset, Utils::Vector3i const &lower_corner, auto &&kernel)
Synchronize data between a sliced block and a container.
void for_each_block_in_slice(::LatticeWalberla const &lattice, Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner, auto &&visitor)
Iterate over all local blocks that overlap a given 3D slice, invoking a visitor for each such block.
static Utils::Vector3d velocity(Particle const &p_ref, Particle const &p_vs)
Velocity of the virtual site.