Loading [MathJax]/jax/output/HTML-CSS/config.js
ESPResSo
Extensible Simulation Package for Research on Soft Matter Systems
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages Concepts
LBWalberlaBase.hpp
Go to the documentation of this file.
1/*
2 * Copyright (C) 2019-2023 The ESPResSo project
3 *
4 * This file is part of ESPResSo.
5 *
6 * ESPResSo is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * ESPResSo is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#pragma once
21
22/**
23 * @file
24 * @ref LBWalberlaBase provides the public interface of the LB
25 * waLBerla bridge. It relies on type erasure to hide the waLBerla
26 * implementation details from the ESPResSo core. It is implemented
27 * by @ref walberla::LBWalberlaImpl.
28 */
29
32
33#include <utils/Vector.hpp>
34
35#include <cstddef>
36#include <memory>
37#include <optional>
38#include <vector>
39
40/** @brief Interface of a lattice-based fluid model. */
42public:
43 ~LBWalberlaBase() override = default;
44
45 /**
46 * @brief Integrate LB for one time step.
47 * The ghost layer may be out-of-date after integration.
48 * Call @ref ghost_communication() to refresh them before
49 * calling any getter function that reads from the halo region.
50 */
51 virtual void integrate() = 0;
52
53 /** @brief Perform a full ghost communication. */
54 virtual void ghost_communication() = 0;
55
56 /** @brief Perform a ghost communication of the PDF field. */
57 virtual void ghost_communication_pdf() = 0;
58
59 /** @brief Perform a ghost communication of the velocity field. */
60 virtual void ghost_communication_vel() = 0;
61
62 /** @brief Perform a ghost communication of the last applied forces field. */
63 virtual void ghost_communication_laf() = 0;
64
65 /** @brief Number of discretized velocities in the PDF. */
66 virtual std::size_t stencil_size() const noexcept = 0;
67
68 /** @brief Whether kernels use double-precision floating point numbers. */
69 [[nodiscard]] virtual bool is_double_precision() const noexcept = 0;
70
71 /** @brief Get interpolated velocities at a position. */
72 virtual std::optional<Utils::Vector3d>
73 get_velocity_at_pos(Utils::Vector3d const &position,
74 bool consider_points_in_halo = false) const = 0;
75
76 /** @brief Get interpolated velocities at positions. */
77 virtual std::vector<Utils::Vector3d>
78 get_velocities_at_pos(std::vector<Utils::Vector3d> const &pos) = 0;
79
80 /** @brief Get interpolated densities at a position. */
81 virtual std::optional<double>
82 get_density_at_pos(Utils::Vector3d const &position,
83 bool consider_points_in_halo = false) const = 0;
84
85 /**
86 * @brief Interpolate a force to the stored forces to be applied on nodes
87 * in the next time step.
88 */
89 virtual bool add_force_at_pos(Utils::Vector3d const &position,
90 Utils::Vector3d const &force) = 0;
91
92 /**
93 * @brief Interpolate forces to the stored forces to be applied on nodes
94 * in the next time step.
95 */
96 virtual void
97 add_forces_at_pos(std::vector<Utils::Vector3d> const &positions,
98 std::vector<Utils::Vector3d> const &forces) = 0;
99
100 /** @brief Get stored force to be applied on node in the next time step. */
101 virtual std::optional<Utils::Vector3d>
102 get_node_force_to_be_applied(Utils::Vector3i const &node) const = 0;
103
104 /** @brief Get stored force that was applied on node in the last time step. */
105 virtual std::optional<Utils::Vector3d>
106 get_node_last_applied_force(Utils::Vector3i const &node,
107 bool consider_ghosts = false) const = 0;
108
109 /** @brief Set stored force that was applied on node in the last time step. */
110 virtual bool set_node_last_applied_force(Utils::Vector3i const &node,
111 Utils::Vector3d const &force) = 0;
112
113 /** @brief Get stored force that was applied on slice in the last time step.
114 */
115 virtual std::vector<double>
116 get_slice_last_applied_force(Utils::Vector3i const &lower_corner,
117 Utils::Vector3i const &upper_corner) const = 0;
118
119 /** @brief Set stored force that was applied on slice in the last time step.
120 */
121 virtual void
122 set_slice_last_applied_force(Utils::Vector3i const &lower_corner,
123 Utils::Vector3i const &upper_corner,
124 std::vector<double> const &force) = 0;
125
126 /** @brief Get node population. */
127 virtual std::optional<std::vector<double>>
128 get_node_population(Utils::Vector3i const &node,
129 bool consider_ghosts = false) const = 0;
130
131 /** @brief Set node population. */
132 virtual bool set_node_population(Utils::Vector3i const &node,
133 std::vector<double> const &population) = 0;
134
135 /** @brief Get slice population. */
136 virtual std::vector<double>
137 get_slice_population(Utils::Vector3i const &lower_corner,
138 Utils::Vector3i const &upper_corner) const = 0;
139
140 /** @brief Set slice population. */
141 virtual void set_slice_population(Utils::Vector3i const &lower_corner,
142 Utils::Vector3i const &upper_corner,
143 std::vector<double> const &population) = 0;
144
145 /** @brief Get node velocity. */
146 virtual std::optional<Utils::Vector3d>
147 get_node_velocity(Utils::Vector3i const &node,
148 bool consider_ghosts = false) const = 0;
149
150 /** @brief Set node velocity. */
151 virtual bool set_node_velocity(Utils::Vector3i const &node,
152 Utils::Vector3d const &v) = 0;
153
154 /** @brief Get slice velocity. */
155 virtual std::vector<double>
156 get_slice_velocity(Utils::Vector3i const &lower_corner,
157 Utils::Vector3i const &upper_corner) const = 0;
158
159 /** @brief Set slice velocity. */
160 virtual void set_slice_velocity(Utils::Vector3i const &lower_corner,
161 Utils::Vector3i const &upper_corner,
162 std::vector<double> const &velocity) = 0;
163
164 /** @brief Get node density. */
165 virtual std::optional<double>
166 get_node_density(Utils::Vector3i const &node,
167 bool consider_ghosts = false) const = 0;
168
169 /** @brief Set node density. */
170 virtual bool set_node_density(Utils::Vector3i const &node,
171 double density) = 0;
172
173 /** @brief Get slice density. */
174 virtual std::vector<double>
175 get_slice_density(Utils::Vector3i const &lower_corner,
176 Utils::Vector3i const &upper_corner) const = 0;
177
178 /** @brief Set slice density. */
179 virtual void set_slice_density(Utils::Vector3i const &lower_corner,
180 Utils::Vector3i const &upper_corner,
181 std::vector<double> const &density) = 0;
182
183 /** @brief Get node velocity boundary conditions. */
184 virtual std::optional<Utils::Vector3d>
186 bool consider_ghosts = false) const = 0;
187
188 /** @brief Set node velocity boundary conditions. */
189 virtual bool
191 Utils::Vector3d const &velocity) = 0;
192
193 /** @brief Get slice velocity boundary conditions. */
194 virtual std::vector<std::optional<Utils::Vector3d>>
195 get_slice_velocity_at_boundary(Utils::Vector3i const &lower_corner,
196 Utils::Vector3i const &upper_corner) const = 0;
197
198 /** @brief Set slice velocity boundary conditions. */
200 Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner,
201 std::vector<std::optional<Utils::Vector3d>> const &velocity) = 0;
202
203 /** @brief Get (stored) force applied on node due to boundary condition. */
204 virtual std::optional<Utils::Vector3d>
205 get_node_boundary_force(Utils::Vector3i const &node) const = 0;
206
207 /** @brief Remove a node from the boundaries. */
208 virtual bool remove_node_from_boundary(Utils::Vector3i const &node) = 0;
209
210 /** @brief Check if node has velocity boundary conditions. */
211 virtual std::optional<bool>
212 get_node_is_boundary(Utils::Vector3i const &node,
213 bool consider_ghosts = false) const = 0;
214
215 /** @brief Check if slice has velocity boundary conditions. */
216 virtual std::vector<bool>
217 get_slice_is_boundary(Utils::Vector3i const &lower_corner,
218 Utils::Vector3i const &upper_corner) const = 0;
219
220 /** @brief Rebuild the UBB field. This is an expensive operation. */
221 virtual void reallocate_ubb_field() = 0;
222
223 /** @brief Clear the boundary flag field and the UBB field. */
224 virtual void clear_boundaries() = 0;
225
226 /** @brief Update boundary conditions from a rasterized shape. */
227 virtual void update_boundary_from_shape(std::vector<int> const &,
228 std::vector<double> const &) = 0;
229
230 /** @brief Configure the default collision model. */
231 virtual void set_collision_model(double kT, unsigned int seed) = 0;
232
233 /** @brief Configure a thermalized collision model for Lees-Edwards. */
234 virtual void
235 set_collision_model(std::unique_ptr<LeesEdwardsPack> &&lees_edwards_pack) = 0;
236
237 /** @brief Check Lees-Edwards boundary conditions. */
238 virtual void check_lebc(unsigned int shear_direction,
239 unsigned int shear_plane_normal) const = 0;
240
241 /** @brief Get node pressure tensor. */
242 virtual std::optional<Utils::VectorXd<9>>
243 get_node_pressure_tensor(Utils::Vector3i const &node) const = 0;
244
245 /** @brief Get slice pressure tensor. */
246 virtual std::vector<double>
247 get_slice_pressure_tensor(Utils::Vector3i const &lower_corner,
248 Utils::Vector3i const &upper_corner) const = 0;
249
250 /** @brief Calculate average pressure tensor of the local domain. */
251 virtual Utils::VectorXd<9> get_pressure_tensor() const = 0;
252
253 /** @brief Calculate momentum of the local domain. */
254 virtual Utils::Vector3d get_momentum() const = 0;
255
256 /** @brief Set a global external force. */
257 virtual void set_external_force(Utils::Vector3d const &ext_force) = 0;
258
259 /** @brief Get the global external force. */
260 virtual Utils::Vector3d get_external_force() const noexcept = 0;
261
262 /** @brief Set the fluid viscosity. */
263 virtual void set_viscosity(double viscosity) = 0;
264
265 /** @brief Get the fluid viscosity. */
266 virtual double get_viscosity() const noexcept = 0;
267
268 /** @brief Get the fluid density. */
269 virtual double get_density() const noexcept = 0;
270
271 /** @brief Get the fluid temperature (if thermalized). */
272 virtual double get_kT() const noexcept = 0;
273
274 /** @brief Get the RNG seed (if thermalized). */
275 virtual unsigned int get_seed() const noexcept = 0;
276
277 /** @brief Set the RNG counter (if thermalized). */
278 [[nodiscard]] virtual std::optional<uint64_t> get_rng_state() const = 0;
279
280 /** @brief Set the RNG counter (if thermalized). */
281 virtual void set_rng_state(uint64_t counter) = 0;
282
283 /** @brief Get the velocity field id */
284 [[nodiscard]] virtual std::size_t get_velocity_field_id() const noexcept = 0;
285
286 /** @brief Get the force field id */
287 [[nodiscard]] virtual std::size_t get_force_field_id() const noexcept = 0;
288
289 /** @brief Get whether the kernels run on GPUs. */
290 [[nodiscard]] virtual bool is_gpu() const noexcept = 0;
291};
Vector implementation and trait types for boost qvm interoperability.
Interface of a lattice-based fluid model.
virtual bool remove_node_from_boundary(Utils::Vector3i const &node)=0
Remove a node from the boundaries.
virtual std::optional< Utils::Vector3d > get_node_velocity(Utils::Vector3i const &node, bool consider_ghosts=false) const =0
Get node velocity.
virtual bool set_node_last_applied_force(Utils::Vector3i const &node, Utils::Vector3d const &force)=0
Set stored force that was applied on node in the last time step.
virtual std::optional< Utils::Vector3d > get_node_velocity_at_boundary(Utils::Vector3i const &node, bool consider_ghosts=false) const =0
Get node velocity boundary conditions.
virtual bool add_force_at_pos(Utils::Vector3d const &position, Utils::Vector3d const &force)=0
Interpolate a force to the stored forces to be applied on nodes in the next time step.
virtual std::optional< Utils::Vector3d > get_node_last_applied_force(Utils::Vector3i const &node, bool consider_ghosts=false) const =0
Get stored force that was applied on node in the last time step.
virtual double get_density() const noexcept=0
Get the fluid density.
virtual std::optional< Utils::Vector3d > get_velocity_at_pos(Utils::Vector3d const &position, bool consider_points_in_halo=false) const =0
Get interpolated velocities at a position.
virtual Utils::VectorXd< 9 > get_pressure_tensor() const =0
Calculate average pressure tensor of the local domain.
virtual bool is_gpu() const noexcept=0
Get whether the kernels run on GPUs.
virtual std::optional< bool > get_node_is_boundary(Utils::Vector3i const &node, bool consider_ghosts=false) const =0
Check if node has velocity boundary conditions.
virtual std::optional< double > get_density_at_pos(Utils::Vector3d const &position, bool consider_points_in_halo=false) const =0
Get interpolated densities at a position.
virtual std::vector< double > get_slice_velocity(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner) const =0
Get slice velocity.
virtual void set_slice_velocity_at_boundary(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner, std::vector< std::optional< Utils::Vector3d > > const &velocity)=0
Set slice velocity boundary conditions.
virtual void clear_boundaries()=0
Clear the boundary flag field and the UBB field.
virtual std::optional< uint64_t > get_rng_state() const =0
Set the RNG counter (if thermalized).
virtual std::vector< double > get_slice_density(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner) const =0
Get slice density.
virtual std::size_t stencil_size() const noexcept=0
Number of discretized velocities in the PDF.
virtual void set_collision_model(double kT, unsigned int seed)=0
Configure the default collision model.
virtual bool set_node_velocity_at_boundary(Utils::Vector3i const &node, Utils::Vector3d const &velocity)=0
Set node velocity boundary conditions.
virtual Utils::Vector3d get_momentum() const =0
Calculate momentum of the local domain.
virtual bool is_double_precision() const noexcept=0
Whether kernels use double-precision floating point numbers.
virtual std::optional< double > get_node_density(Utils::Vector3i const &node, bool consider_ghosts=false) const =0
Get node density.
virtual std::size_t get_velocity_field_id() const noexcept=0
Get the velocity field id.
virtual std::vector< double > get_slice_population(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner) const =0
Get slice population.
virtual void add_forces_at_pos(std::vector< Utils::Vector3d > const &positions, std::vector< Utils::Vector3d > const &forces)=0
Interpolate forces to the stored forces to be applied on nodes in the next time step.
virtual std::vector< std::optional< Utils::Vector3d > > get_slice_velocity_at_boundary(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner) const =0
Get slice velocity boundary conditions.
virtual std::optional< std::vector< double > > get_node_population(Utils::Vector3i const &node, bool consider_ghosts=false) const =0
Get node population.
virtual void reallocate_ubb_field()=0
Rebuild the UBB field.
virtual void set_slice_population(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner, std::vector< double > const &population)=0
Set slice population.
virtual void ghost_communication_laf()=0
Perform a ghost communication of the last applied forces field.
virtual std::optional< Utils::Vector3d > get_node_force_to_be_applied(Utils::Vector3i const &node) const =0
Get stored force to be applied on node in the next time step.
virtual bool set_node_population(Utils::Vector3i const &node, std::vector< double > const &population)=0
Set node population.
virtual unsigned int get_seed() const noexcept=0
Get the RNG seed (if thermalized).
virtual double get_kT() const noexcept=0
Get the fluid temperature (if thermalized).
virtual void set_rng_state(uint64_t counter)=0
Set the RNG counter (if thermalized).
virtual std::size_t get_force_field_id() const noexcept=0
Get the force field id.
virtual Utils::Vector3d get_external_force() const noexcept=0
Get the global external force.
virtual void update_boundary_from_shape(std::vector< int > const &, std::vector< double > const &)=0
Update boundary conditions from a rasterized shape.
virtual std::vector< double > get_slice_pressure_tensor(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner) const =0
Get slice pressure tensor.
virtual void set_slice_density(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner, std::vector< double > const &density)=0
Set slice density.
virtual void integrate()=0
Integrate LB for one time step.
virtual void set_viscosity(double viscosity)=0
Set the fluid viscosity.
virtual bool set_node_density(Utils::Vector3i const &node, double density)=0
Set node density.
virtual void check_lebc(unsigned int shear_direction, unsigned int shear_plane_normal) const =0
Check Lees-Edwards boundary conditions.
virtual void ghost_communication()=0
Perform a full ghost communication.
virtual void set_external_force(Utils::Vector3d const &ext_force)=0
Set a global external force.
virtual void set_slice_velocity(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner, std::vector< double > const &velocity)=0
Set slice velocity.
virtual std::optional< Utils::Vector3d > get_node_boundary_force(Utils::Vector3i const &node) const =0
Get (stored) force applied on node due to boundary condition.
virtual std::vector< bool > get_slice_is_boundary(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner) const =0
Check if slice has velocity boundary conditions.
virtual bool set_node_velocity(Utils::Vector3i const &node, Utils::Vector3d const &v)=0
Set node velocity.
virtual double get_viscosity() const noexcept=0
Get the fluid viscosity.
virtual void set_slice_last_applied_force(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner, std::vector< double > const &force)=0
Set stored force that was applied on slice in the last time step.
virtual void ghost_communication_pdf()=0
Perform a ghost communication of the PDF field.
virtual std::vector< Utils::Vector3d > get_velocities_at_pos(std::vector< Utils::Vector3d > const &pos)=0
Get interpolated velocities at positions.
virtual std::optional< Utils::VectorXd< 9 > > get_node_pressure_tensor(Utils::Vector3i const &node) const =0
Get node pressure tensor.
virtual void ghost_communication_vel()=0
Perform a ghost communication of the velocity field.
virtual std::vector< double > get_slice_last_applied_force(Utils::Vector3i const &lower_corner, Utils::Vector3i const &upper_corner) const =0
Get stored force that was applied on slice in the last time step.
~LBWalberlaBase() override=default
Abstract representation of a lattice-based model.
static Utils::Vector3d velocity(Particle const &p_ref, Particle const &p_vs)
Velocity of the virtual site.
Definition relative.cpp:64
Pack Lees-Edwards parameters for LB.