29#include <blockforest/Initialization.h>
30#include <blockforest/StructuredBlockForest.h>
31#include <domain_decomposition/BlockDataID.h>
32#include <domain_decomposition/IBlock.h>
33#include <field/AddToStorage.h>
34#include <field/vtk/FlagFieldCellFilter.h>
35#include <field/vtk/VTKWriter.h>
36#include <stencil/D3Q19.h>
37#include <stencil/D3Q27.h>
38#include <waLBerlaDefinitions.h>
39#if defined(__CUDACC__) and defined(WALBERLA_BUILD_WITH_CUDA)
40#include <gpu/AddGPUFieldToStorage.h>
43#include "../BoundaryHandling.hpp"
44#include "../BoundaryPackInfo.hpp"
45#include "../utils/boundary.hpp"
46#include "../utils/types_conversion.hpp"
51#if defined(__CUDACC__) and defined(WALBERLA_BUILD_WITH_CUDA)
70#include <initializer_list>
84template <
typename FloatType, lbmpy::Arch Architecture>
86#if not defined(WALBERLA_BUILD_WITH_CUDA)
88 "waLBerla was compiled without CUDA support");
93 using Kernels = detail::KernelTrait<FloatType, Architecture>;
117#if defined(__CUDACC__) and defined(WALBERLA_BUILD_WITH_CUDA)
118 using GPUField = gpu::GPUField<FloatType>;
141 Architecture>::template RegularCommScheme<stencil::D3Q27>;
144 Architecture>::template BoundaryCommScheme<stencil::D3Q27>;
151 Architecture>::template RegularCommScheme<Stencil>;
152 template <
class Field>
182#if defined(__CUDACC__) and defined(WALBERLA_BUILD_WITH_CUDA)
183 std::optional<BlockDataID> m_pdf_cpu_field_id;
184 std::optional<BlockDataID> m_vel_cpu_field_id;
211 std::shared_ptr<typename Kernels::UpdateVelFromPDF>
216 std::shared_ptr<InterpolateAndShiftAtBoundary<_PdfField, FloatType>>
218 std::shared_ptr<InterpolateAndShiftAtBoundary<_VectorField, FloatType>>
220 std::shared_ptr<InterpolateAndShiftAtBoundary<_VectorField, FloatType>>
225 return numeric_cast<FloatType>(t);
229 return static_cast<std::size_t
>(Stencil::Size);
233 return std::is_same_v<FloatType, double>;
236 [[nodiscard]]
bool is_gpu() const noexcept
override {
248 auto const &blocks =
m_lattice->get_blocks();
249 auto const n_ghost_layers =
m_lattice->get_ghost_layers();
250 if (n_ghost_layers == 0u)
251 throw std::runtime_error(
"At least one ghost layer must be used");
264 for (
auto &
block : *blocks) {
270 blocks,
"flag field", n_ghost_layers);
282 m_reset_force = std::make_shared<ResetForce<PdfField, VectorField>>(
287 std::make_shared<typename Kernels::UpdateVelFromPDF>(
296 integrate_pull_scheme();
303 auto &vtk_handle = it.second;
304 if (vtk_handle->enabled) {
305 vtk::writeFiles(vtk_handle->ptr)();
306 vtk_handle->execution_count++;
318 void integrate_pull_scheme() {
322 integrate_reset_force(blocks);
324 integrate_stream_collide(blocks);
330 if (has_lees_edwards_bc()) {
331 apply_lees_edwards_pdf_interpolation(blocks);
332 apply_lees_edwards_last_applied_force_interpolation(blocks);
336 integrate_boundaries(blocks);
339 integrate_update_velocities_from_pdf(blocks);
341 if (has_lees_edwards_bc()) {
342 apply_lees_edwards_vel_interpolation_and_shift(blocks);
346 void integrate_stream_collide(std::shared_ptr<BlockStorage>
const &blocks) {
348 for (
auto &
block : *blocks) {
349 auto const block_variant = std::variant<IBlock *>(&
block);
350 std::visit(m_run_stream_collide_sweep, cm_variant, block_variant);
353 std::get_if<typename Kernels::StreamCollisionModelThermalized>(
355 cm->setTime_step(cm->getTime_step() + 1u);
359 void integrate_reset_force(std::shared_ptr<BlockStorage>
const &blocks) {
360 for (
auto &
block : *blocks)
364 void integrate_boundaries(std::shared_ptr<BlockStorage>
const &blocks) {
365 for (
auto &
block : *blocks)
369 void integrate_update_velocities_from_pdf(
370 std::shared_ptr<BlockStorage>
const &blocks) {
371 for (
auto &
block : *blocks)
383 class StreamCollideSweepVisitor {
387 void operator()(
typename Kernels::StreamCollisionModelThermalized &cm,
389 cm.configure(m_storage, b);
393 void operator()(
typename Kernels::StreamCollisionModelLeesEdwards &cm,
395 cm.setV_s(
static_cast<decltype(cm.getV_s())
>(
396 m_lees_edwards_callbacks->get_shear_velocity()));
400 StreamCollideSweepVisitor() =
default;
401 StreamCollideSweepVisitor(std::shared_ptr<StructuredBlockStorage> storage) {
402 m_storage = std::move(storage);
404 StreamCollideSweepVisitor(std::shared_ptr<StructuredBlockStorage> storage,
405 std::shared_ptr<LeesEdwardsPack> callbacks) {
406 m_storage = std::move(storage);
407 m_lees_edwards_callbacks = std::move(callbacks);
411 std::shared_ptr<StructuredBlockStorage> m_storage{};
412 std::shared_ptr<LeesEdwardsPack> m_lees_edwards_callbacks{};
414 StreamCollideSweepVisitor m_run_stream_collide_sweep{};
417 FloatType shear_mode_relaxation_rate()
const;
423 FloatType odd_mode_relaxation_rate(
424 FloatType shear_relaxation,
425 FloatType magic_number = FloatType{3} / FloatType{16})
const;
430 std::unique_ptr<LeesEdwardsPack> &&lees_edwards_pack)
override;
432 unsigned int shear_plane_normal)
const override;
456 if (has_lees_edwards_bc()) {
458 apply_lees_edwards_pdf_interpolation(blocks);
468 if (has_lees_edwards_bc()) {
470 apply_lees_edwards_vel_interpolation_and_shift(blocks);
480 if (has_lees_edwards_bc()) {
482 apply_lees_edwards_last_applied_force_interpolation(blocks);
500 if (has_lees_edwards_bc()) {
511 auto has_lees_edwards_bc()
const {
512 return std::holds_alternative<
513 typename Kernels::StreamCollisionModelLeesEdwards>(*m_collision_model);
516 void apply_lees_edwards_pdf_interpolation(
517 std::shared_ptr<BlockStorage>
const &blocks) {
518 for (
auto &
block : *blocks)
522 void apply_lees_edwards_vel_interpolation_and_shift(
523 std::shared_ptr<BlockStorage>
const &blocks) {
524 for (
auto &
block : *blocks)
528 void apply_lees_edwards_last_applied_force_interpolation(
529 std::shared_ptr<BlockStorage>
const &blocks) {
530 for (
auto &
block : *blocks)
537 apply_lees_edwards_pdf_interpolation(blocks);
538 apply_lees_edwards_vel_interpolation_and_shift(blocks);
539 apply_lees_edwards_last_applied_force_interpolation(blocks);
546 std::optional<Utils::Vector3d>
548 bool consider_ghosts =
false)
const override;
556 std::vector<double>
const &
velocity)
override;
559 std::optional<double>
561 bool consider_ghosts =
false)
const override;
568 std::vector<double>
const &
density)
override;
571 std::optional<std::vector<double>>
573 bool consider_ghosts =
false)
const override;
575 std::vector<double>
const &population)
override;
581 std::vector<double>
const &population)
override;
584 std::optional<Utils::Vector3d>
586 std::optional<Utils::Vector3d>
588 bool consider_ghosts =
false)
const override;
596 std::vector<double>
const &force)
override;
599 std::optional<Utils::VectorXd<9>>
609 auto make_force_interpolation_kernel()
const;
611 auto make_velocity_interpolation_kernel()
const;
613 auto make_density_interpolation_kernel()
const;
621 std::vector<Utils::Vector3d>
const &forces)
override;
622 std::optional<Utils::Vector3d>
624 bool consider_points_in_halo =
false)
const override;
625 std::vector<Utils::Vector3d>
627 std::optional<double>
629 bool consider_points_in_halo =
false)
const override;
637 auto const [lc, uc] =
m_lattice->get_local_grid_range(
true);
648 std::vector<double>
const &data_flat)
override;
649 std::optional<Utils::Vector3d>
651 bool consider_ghosts =
false)
const override;
659 std::vector<std::optional<Utils::Vector3d>>
const &
velocity)
override;
660 std::optional<Utils::Vector3d>
665 bool consider_ghosts =
false)
const override;
670 std::vector<int>
const &raster_flat)
const override;
683 Matrix3<FloatType> tensor(FloatType{0});
691 return to_vector9d(tensor) * (1. /
static_cast<double>(number_of_nodes));
696 Vector3<FloatType> mom(FloatType{0});
728 [[nodiscard]]
double get_kT() const noexcept
override {
729 return static_cast<double>(
m_kT);
732 [[nodiscard]]
unsigned int get_seed() const noexcept
override {
738 std::get_if<typename Kernels::StreamCollisionModelThermalized>(
740 if (!cm or
m_kT == 0.) {
743 return {
static_cast<uint64_t
>(cm->getTime_step())};
748 std::get_if<typename Kernels::StreamCollisionModelThermalized>(
750 if (!cm or
m_kT == 0.) {
751 throw std::runtime_error(
"This LB instance is unthermalized");
754 static_cast<uint32_t
>(std::numeric_limits<uint_t>::max()));
755 cm->setTime_step(
static_cast<uint32_t
>(counter));
781 for (
auto const i : {1u, 2u, 3u, 5u, 6u, 7u}) {
782 tensor[i] *= revert_factor;
788 for (
auto const i : {1u, 2u, 3u, 5u, 6u, 7u}) {
789 tensor[i] *= revert_factor;
801 template <
typename T>
803 if constexpr (std::is_arithmetic_v<T>) {
804 static_assert(std::is_floating_point_v<T>);
805 data *=
static_cast<T
>(factor);
807 auto const coef =
static_cast<typename T::value_type
>(factor);
808 std::transform(std::begin(data), std::end(data), std::begin(data),
809 [coef](
auto value) {
return value * coef; });
822 auto transformed_data = data;
824 return transformed_data;
828 auto transformed_data = data;
830 return transformed_data;
839 vtk_obj.addCellExclusionFilter(fluid_filter);
844 int flag_observables)
override;
861 auto const &blocks =
m_lattice->get_blocks();
862 auto const n_ghost_layers =
m_lattice->get_ghost_layers();
864#ifdef ESPRESSO_BUILD_WITH_AVX_KERNELS
865 constexpr auto alignment = field::SIMDAlignment();
866 using value_type = Field::value_type;
867 using Allocator = field::AllocateAligned<value_type, alignment>;
868 auto const allocator = std::make_shared<Allocator>();
869 auto const empty_set = Set<SUID>::emptySet();
870 return field::addToStorage<Field>(
871 blocks, tag, field::internal::defaultSize, FloatType{0}, field::fzyx,
872 n_ghost_layers,
false, {}, empty_set, empty_set, allocator);
874 return field::addToStorage<Field>(blocks, tag, FloatType{0}, field::fzyx,
878#if defined(__CUDACC__) and defined(WALBERLA_BUILD_WITH_CUDA)
880 auto field_id = gpu::addGPUFieldToStorage<GPUField>(
881 blocks, tag, Field::F_SIZE, field::fzyx, n_ghost_layers);
882 if constexpr (std::is_same_v<Field, _VectorField>) {
883 for (
auto &
block : *blocks) {
884 auto field =
block.template getData<GPUField>(field_id);
887 }
else if constexpr (std::is_same_v<Field, _PdfField>) {
888 for (
auto &
block : *blocks) {
889 auto field =
block.template getData<GPUField>(field_id);
891 field, std::array<FloatType, Stencil::Size>{});
905 auto const &blocks =
m_lattice->get_blocks();
926 std::make_shared<BoundaryFullCommunicator>(blocks);
930 auto boundary_packinfo = std::make_shared<
944 auto const setup = [
this]<
typename PackInfoPdf,
typename PackInfoVec>() {
945 auto const &blocks =
m_lattice->get_blocks();
947 std::make_shared<PDFStreamingCommunicator>(blocks);
959 setup.template operator()<PackInfoPdf, PackInfoVec>();
Out-of-class boundary access definitions for walberla::LBWalberlaImpl.
Out-of-class collision model setup definitions for walberla::LBWalberlaImpl.
Out-of-class position-based interpolation definitions for walberla::LBWalberlaImpl.
Out-of-class node access definitions for walberla::LBWalberlaImpl.
Out-of-class slice access definitions for walberla::LBWalberlaImpl.
Out-of-class VTK writer registration definition for walberla::LBWalberlaImpl.
LBWalberlaBase provides the public interface of the LB waLBerla bridge.
Vector implementation and trait types for boost qvm interoperability.
Interface of a lattice-based fluid model.
std::map< std::string, std::shared_ptr< VTKHandle > > m_vtk_auto
VTK writers that are executed automatically.
std::unordered_map< std::string, double > units_map
Class that runs and controls the BlockForest in waLBerla.
auto const & get_grid_dimensions() const
walberla::blockforest::StructuredBlockForest Lattice_T
Boundary class optimized for sparse data.
field::FlagField< uint8_t > FlagField
Class that runs and controls the LB on waLBerla.
void add_forces_at_pos(std::vector< Utils::Vector3d > const &pos, std::vector< Utils::Vector3d > const &forces) override
Distribute forces to the lattice at given positions.
std::shared_ptr< typename Kernels::UpdateVelFromPDF > m_update_velocities_from_pdf
std::vector< double > get_slice_last_applied_force(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner) const override
std::variant< typename Kernels::StreamCollisionModelThermalized, typename Kernels::StreamCollisionModelLeesEdwards > CollisionModel
void zero_centered_transform_impl(T &data, auto const factor) const
Scale data by a conversion factor (in-place).
void reset_boundary_handling(std::shared_ptr< BlockStorage > const &blocks)
std::shared_ptr< RegularFullCommunicator > m_pdf_communicator
std::vector< std::optional< Utils::Vector3d > > get_slice_velocity_at_boundary(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner) const override
std::optional< Utils::Vector3d > get_node_last_applied_force(Utils::Vector3i const &node, bool consider_ghosts=false) const override
stencil::D3Q19 Stencil
Stencil for collision and streaming operations.
std::optional< Utils::Vector3d > get_node_velocity_at_boundary(Utils::Vector3i const &node, bool consider_ghosts=false) const override
void ghost_communication() override
Perform all pending ghost layer updates.
void pressure_tensor_correction(Matrix3< FloatType > &tensor) const
std::optional< Utils::Vector3d > get_node_velocity(Utils::Vector3i const &node, bool consider_ghosts=false) const override
FieldTrait< FloatType, Stencil, Architecture >::template RegularCommScheme< Stencil > PDFStreamingCommunicator
Regular communicator.
void reallocate_ubb_field() override
Utils::Vector3d get_boundary_force_from_shape(std::vector< int > const &raster_flat) const override
Total force exerted by the fluid on a subset of boundary nodes.
std::shared_ptr< RegularFullCommunicator > m_full_communicator
BlockDataID m_pdf_tmp_field_id
std::size_t get_force_field_id() const noexcept override
BlockDataID m_pdf_field_id
std::shared_ptr< CollisionModel > m_collision_model
void set_slice_velocity(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner, std::vector< double > const &velocity) override
unsigned int get_seed() const noexcept override
void integrate_vtk_writers() override
void pressure_tensor_correction(std::span< FloatType, 9ul > tensor) const
BoundaryModel::FlagField FlagField
bool remove_node_from_boundary(Utils::Vector3i const &node) override
std::optional< Utils::Vector3d > get_node_boundary_force(Utils::Vector3i const &node) const override
std::optional< double > get_density_at_pos(Utils::Vector3d const &pos, bool consider_points_in_halo=false) const override
void zero_centered_to_md_in_place(auto &data) const
BlockDataID m_vel_tmp_field_id
FieldTrait< FloatType, Stencil >::VectorField _VectorField
void set_slice_velocity_at_boundary(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner, std::vector< std::optional< Utils::Vector3d > > const &velocity) override
std::vector< double > get_slice_population(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner) const override
void set_rng_state(uint64_t counter) override
std::vector< double > get_slice_velocity(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner) const override
Utils::Vector3d get_boundary_force() const override
std::shared_ptr< LatticeWalberla > m_lattice
std::shared_ptr< LeesEdwardsPack > m_lees_edwards_callbacks
LBWalberlaImpl(std::shared_ptr< LatticeWalberla > lattice, double viscosity, double density)
bool set_node_last_applied_force(Utils::Vector3i const &node, Utils::Vector3d const &force) override
std::function< bool(Utils::Vector3d const &)> make_lattice_position_checker(bool consider_points_in_halo) const override
FieldTrait< FloatType, Stencil >::PdfField _PdfField
std::shared_ptr< InterpolateAndShiftAtBoundary< _VectorField, FloatType > > m_lees_edwards_vel_interpol_sweep
std::vector< bool > get_slice_is_boundary(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
bool is_double_precision() const noexcept override
void update_boundary_from_shape(std::vector< int > const &raster_flat, std::vector< double > const &data_flat) override
Set boundary conditions from a rasterized shape.
std::shared_ptr< BoundaryModel > m_boundary
FieldTrait< FloatType, Stencil, Architecture >::PdfField PdfField
std::vector< double > get_slice_pressure_tensor(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner) const override
FieldTrait< FloatType, Stencil, Architecture >::template PackInfo< Field > PackInfo
bool set_node_density(Utils::Vector3i const &node, double density) override
void set_collision_model(double kT, unsigned int seed) override
Set up the thermalized collision model.
std::vector< Utils::Vector3d > get_velocities_at_pos(std::vector< Utils::Vector3d > const &pos) override
Interpolate velocities at given positions (batch version).
void ghost_communication_laf() override
std::optional< bool > get_node_is_boundary(Utils::Vector3i const &node, bool consider_ghosts=false) const override
BlockDataID m_velocity_field_id
std::shared_ptr< ResetForce< PdfField, VectorField > > m_reset_force
void setup_streaming_communicator()
Set up the communicator used during integration.
BlockDataID m_flag_field_id
FlagUID const Boundary_flag
Flag for boundary cells.
~LBWalberlaImpl() override=default
std::optional< uint64_t > get_rng_state() const override
std::optional< std::vector< double > > get_node_population(Utils::Vector3i const &node, bool consider_ghosts=false) const override
FloatType m_density
kinematic viscosity
double get_viscosity() const noexcept override
double get_kT() const noexcept override
Utils::Vector3d get_momentum() const override
void set_viscosity(double viscosity) override
void on_boundary_add()
Lazily enable boundary mode on first boundary addition.
std::shared_ptr< BoundaryFullCommunicator > m_boundary_communicator
std::size_t stencil_size() const noexcept override
std::optional< BlockDataID > m_pressure_tensor_field_id
auto add_to_storage(std::string const tag)
Convenience function to add a field with a custom allocator.
void ghost_communication_full()
Communicate all fields at once using the D3Q27 stencil.
auto zero_centered_to_lb(auto const &data) const
FieldTrait< FloatType, Stencil, Architecture >::template BoundaryCommScheme< stencil::D3Q27 > BoundaryFullCommunicator
bool set_node_velocity_at_boundary(Utils::Vector3i const &node, Utils::Vector3d const &velocity) override
stencil::D3Q27 StencilFull
Stencil for ghost communication (includes domain corners).
void register_vtk_field_writers(walberla::vtk::VTKOutput &vtk_obj, LatticeModel::units_map const &units, int flag_observables) override
std::optional< double > get_node_density(Utils::Vector3i const &node, bool consider_ghosts=false) const override
void check_lebc(unsigned int shear_direction, unsigned int shear_plane_normal) const override
Verify that MD and LB Lees-Edwards parameters are consistent.
void set_slice_density(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner, std::vector< double > const &density) override
void ghost_communication_vel() override
Utils::Vector3d get_external_force() const noexcept override
BlockDataID m_force_to_be_applied_id
FloatType FloatType_c(T t) const
std::shared_ptr< RegularFullCommunicator > m_laf_communicator
void apply_lees_edwards_interpolation()
std::size_t get_velocity_field_id() const noexcept override
Utils::VectorXd< 9 > get_pressure_tensor() const override
ResourceObserver m_mpi_cart_comm_observer
FieldTrait< FloatType, Stencil, Architecture >::template RegularCommScheme< stencil::D3Q27 > RegularFullCommunicator
Full communicator.
std::shared_ptr< InterpolateAndShiftAtBoundary< _PdfField, FloatType > > m_lees_edwards_pdf_interpol_sweep
void set_external_force(Utils::Vector3d const &ext_force) override
void setup_full_communicator()
Set up D3Q27 communicators for full ghost layer updates.
std::optional< Utils::Vector3d > get_velocity_at_pos(Utils::Vector3d const &pos, bool consider_points_in_halo=false) const override
FieldTrait< FloatType, Stencil, Architecture >::VectorField VectorField
void set_slice_last_applied_force(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner, std::vector< double > const &force) override
LatticeWalberla::Lattice_T BlockStorage
Lattice model (e.g.
std::shared_ptr< RegularFullCommunicator > m_vel_communicator
std::bitset< GhostComm::SIZE > m_pending_ghost_comm
LatticeWalberla const & get_lattice() const noexcept override
auto zero_centered_to_md(auto const &data) const
void set_slice_population(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner, std::vector< double > const &population) override
double get_density() const noexcept override
void ghost_communication_pdf() override
void register_vtk_field_filters(walberla::vtk::VTKOutput &vtk_obj) override
std::optional< Utils::Vector3d > get_node_force_to_be_applied(Utils::Vector3i const &node) const override
std::vector< double > get_densities_at_pos(std::vector< Utils::Vector3d > const &pos) override
void zero_centered_to_lb_in_place(auto &data) const
bool set_node_velocity(Utils::Vector3i const &node, Utils::Vector3d const &v) override
void clear_boundaries() override
bool set_node_population(Utils::Vector3i const &node, std::vector< double > const &population) override
bool is_gpu() const noexcept override
FloatType pressure_tensor_correction_factor() const
Correction factor for off-diagonal pressure tensor elements.
std::shared_ptr< PDFStreamingCommunicator > m_pdf_streaming_communicator
detail::KernelTrait< FloatType, Architecture > Kernels
BlockDataID m_last_applied_force_field_id
void integrate() override
std::optional< Utils::VectorXd< 9 > > get_node_pressure_tensor(Utils::Vector3i const &node) const override
std::shared_ptr< InterpolateAndShiftAtBoundary< _VectorField, FloatType > > m_lees_edwards_last_applied_force_interpol_sweep
void ghost_communication_boundary()
bool add_force_at_pos(Utils::Vector3d const &pos, Utils::Vector3d const &force) override
void setup_boundary_handle(std::shared_ptr< LatticeWalberla > lattice, std::shared_ptr< Boundary_T > boundary)
static double * block(double *p, std::size_t index, std::size_t size)
T product(Vector< T, N > const &v)
auto reduce(GhostLayerField< double, uint_t{19u}> const *pdf_field, GhostLayerField< double, uint_t{3u}> const *force_field, double const density)
void initialize(GhostLayerField< double, uint_t{19u}> *pdf_field, std::array< double, 19u > const &pop)
auto reduce(GhostLayerField< double, uint_t{19u}> const *pdf_field, double const density)
void initialize(GhostLayerField< double, uint_t{3u}> *vec_field, Vector3< double > const &vec)
\file PackInfoPdfDoublePrecision.cpp \author pystencils
auto to_vector3d(Vector3< T > const &v) noexcept
Cell to_cell(signed_integral_vector auto const &xyz)
ResourceObserver get_mpi_cart_comm_observer()
Get an observer on waLBerla's MPI Cartesian communicator status.
auto to_vector9d(Matrix3< T > const &m) noexcept
static Utils::Vector3d velocity(Particle const &p_ref, Particle const &p_vs)
Velocity of the virtual site.
Observer to monitor the lifetime of a shared resource.
detail::KernelTrait< FT, AT >::PackInfoVec PackInfoStreamingVec
field::GhostLayerField< FT, PdfStencil::Size > PdfField
field::GhostLayerField< FT, uint_t{3u}> VectorField
detail::KernelTrait< FT, AT >::PackInfoPdf PackInfoStreamingPdf
GhostCommFlags
Ghost communication operations.
@ VEL
velocities communication
@ LAF
last applied forces communication
@ UBB
boundaries communication