include/meltpooldg/particles/obstacle_field.hpp Source File

Developer Documentation: include/meltpooldg/particles/obstacle_field.hpp Source File
Developer Documentation
obstacle_field.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/base/conditional_ostream.h>
4#include <deal.II/base/iterator_range.h>
5
6#include <deal.II/fe/mapping.h>
7
8#include <deal.II/grid/tria.h>
9#include <deal.II/grid/tria_accessor.h>
10
11#include <deal.II/particles/particle_accessor.h>
12#include <deal.II/particles/particle_handler.h>
13
23
24#include <ranges>
25#include <type_traits>
26#include <vector>
27
28namespace MeltPoolDG
29{
30 template <int dim, typename number, typename ObstacleType>
32 {
33 public:
49 const dealii::Triangulation<dim> &triangulation,
50 const dealii::Mapping<dim> &mapping);
51
66 const dealii::Triangulation<dim> &triangulation,
67 const dealii::Mapping<dim> &mapping,
68 const std::vector<dealii::Point<dim, number>> &obstacle_locations,
69 const std::vector<std::vector<number>> &obstacle_properties);
70
76 void
77 advance_time(const number time_step);
78
88 void
90
100 template <typename ObstacleLoadType>
101 requires(!std::is_lvalue_reference_v<ObstacleLoadType>) //
102 void
103 add_load_type(ObstacleLoadType &&obstacle_load)
104 {
105 loads.emplace_back(std::move(obstacle_load));
106 }
107
121 template <typename ObstacleContainer>
122 void
123 get_obstacles_in_cell(const dealii::TriaIterator<dealii::CellAccessor<dim>> &cell,
124 ObstacleContainer &particles);
125
145 boost::container::small_vector<DEMParticleAccessor<dim, number>, 3 * dim>
147 const number relative_tolerance);
148
157 void
158 compress();
159
170 void
171 print_accumulated_particle_quantities(const dealii::ConditionalOStream &pout) const;
172
179 void
180 deserialize();
181
191 template <class Archive>
192 void
193 serialize(Archive &ar, const unsigned int version);
194
201 void
203
217 std::vector<AMR::AMRRegion<dim, number>>
219
225 void
227
236 void
238
244 void
246
259 void
260 insert_obstacles(const dealii::Triangulation<dim> &triangulation,
261 const std::vector<dealii::Point<dim, number>> &obstacle_locations,
262 const std::vector<std::vector<number>> &obstacle_properties);
263
269 std::ranges::subrange<ParticleIterator<dim, number>>
271
277 std::ranges::subrange<ParticleIterator<dim, number>>
278 ghost_particle_range() const;
279
287 typename std::ranges::subrange<ParticleIterator<dim, number>>
288 particles_in_cell(typename dealii::Triangulation<dim>::active_cell_iterator cell) const;
289
294 unsigned int
295 n_global_particles() const;
296
300 unsigned int
302
306 unsigned int
307 n_ghost_particles() const;
308
312 const dealii::Triangulation<dim> &
313 get_triangulation() const;
314
318 MPI_Comm
319 get_mpi_communicator() const;
320
331 number
333
341 void
343 std::function<
346 callback);
347
348 private:
351
353 std::vector<ObstacleLoad<dim, number, ObstacleType>> loads;
354
357
360 };
361
362 template <int dim, typename number, typename ObstacleType>
363 template <typename ObstacleContainer>
364 void
366 const dealii::TriaIterator<dealii::CellAccessor<dim>> &cell,
367 ObstacleContainer &particles)
368 {
369 obstacle_data_structure.get_obstacles_in_cell(cell, particles);
370 }
371
372 template <int dim, typename number, typename ObstacleType>
373 template <class Archive>
374 void
375 ObstacleField<dim, number, ObstacleType>::serialize(Archive &ar, const unsigned int version)
376 {
377 obstacle_data_structure.serialize(ar, version);
378 }
379} // namespace MeltPoolDG
Utilities for region-based adaptive mesh refinement (AMR).
Definition particle_accessor.hpp:20
Definition obstacle_field.hpp:32
void insert_obstacles(const dealii::Triangulation< dim > &triangulation, const std::vector< dealii::Point< dim, number > > &obstacle_locations, const std::vector< std::vector< number > > &obstacle_properties)
Insert obstacles into the particle handler based on provided locations and properties.
Definition obstacle_field.cpp:190
std::vector< ObstacleLoad< dim, number, ObstacleType > > loads
Vector of load objects representing all loads acting on the obstacles.
Definition obstacle_field.hpp:353
void add_load_type(ObstacleLoadType &&obstacle_load)
Adds a new obstacle load to the list of loads acting on obstacles.
Definition obstacle_field.hpp:103
CellListParticleHandler< dim, number, ObstacleType > obstacle_data_structure
Obstacle search utility for locating relevant obstacles within a given cell or batch.
Definition obstacle_field.hpp:356
void subscribe_to_data_structure(std::function< void(CellListParticleHandler< dim, number, ObstacleType > &, const typename CellListParticleHandler< dim, number, ObstacleType >::NotifyEvent &)> callback)
Definition obstacle_field.cpp:308
unsigned int n_locally_owned_particles() const
Definition obstacle_field.cpp:251
number compute_rayleigh_time_step() const
Computes the Rayleigh time step, scaled by a safety factor.
Definition obstacle_field.cpp:279
void advance_time(const number time_step)
Advances the state of all obstacles in time by a single time step.
Definition obstacle_field.cpp:54
void compress()
Definition obstacle_field.cpp:215
void serialize(Archive &ar, const unsigned int version)
Serializes the internal state of the class.
Definition obstacle_field.hpp:375
std::ranges::subrange< ParticleIterator< dim, number > > ghost_particle_range() const
Definition obstacle_field.cpp:229
MPI_Comm get_mpi_communicator() const
Definition obstacle_field.cpp:265
void prepare_for_serialization()
Prepares this object for serialization.
Definition obstacle_field.cpp:65
void compute_loads_on_obstacles()
Computes and applies the total load acting on each obstacle in the field. This includes both forces a...
Definition obstacle_field.cpp:101
std::ranges::subrange< ParticleIterator< dim, number > > particles_in_cell(typename dealii::Triangulation< dim >::active_cell_iterator cell) const
Definition obstacle_field.cpp:236
const dealii::Triangulation< dim > & get_triangulation() const
Definition obstacle_field.cpp:272
void deserialize()
Performs the objects deserialization.
Definition obstacle_field.cpp:160
boost::container::small_vector< DEMParticleAccessor< dim, number >, 3 *dim > find_particles_in_neighborhood(const DEMParticleAccessor< dim, number > &particle, const number relative_tolerance)
Definition obstacle_field.cpp:205
std::ranges::subrange< ParticleIterator< dim, number > > locally_owned_particle_range() const
Definition obstacle_field.cpp:222
void get_obstacles_in_cell(const dealii::TriaIterator< dealii::CellAccessor< dim > > &cell, ObstacleContainer &particles)
Definition obstacle_field.hpp:365
void prepare_for_coarsening_and_refinement()
Definition obstacle_field.cpp:168
void register_particle_output(Postprocessor< dim, number > &postprocessor) const
Definition obstacle_field.cpp:182
unsigned int n_global_particles() const
Definition obstacle_field.cpp:244
void print_accumulated_particle_quantities(const dealii::ConditionalOStream &pout) const
Definition obstacle_field.cpp:127
std::vector< AMR::AMRRegion< dim, number > > get_refinement_regions() const
Return the AMR regions relevant for the obstacle field in region-based refinement.
Definition obstacle_field.cpp:72
const ObstacleData< number > & data
Struct holding configuration data for obstacles.
Definition obstacle_field.hpp:350
void unpack_after_coarsening_and_refinement()
Definition obstacle_field.cpp:175
unsigned int n_ghost_particles() const
Definition obstacle_field.cpp:258
MPI_Comm mpi_communicator
MPI communicator used for parallel operations on the obstacle field.
Definition obstacle_field.hpp:359
Definition postprocessor.hpp:33
Interface for a general preconditioner.
Definition boundary_condition_functions.hpp:17
Forward declaration of the CellListParticleHandler class template.
Definition obstacle_data_structure.hpp:210
NotifyEvent
Definition obstacle_data_structure.hpp:217
Definition obstacle_data.hpp:13