ASPECT
manager.h
Go to the documentation of this file.
1 // ------------------------------------------------------
2 //
3 // SPDX-License-Identifier: GPL-2.0-or-later
4 //
5 // SPDX-FileCopyrightText: Copyright (C) 2012-2026 by the ASPECT authors.
6 //
7 // This file is part of ASPECT.
8 //
9 // Detailed license information governing the source code and
10 // contributions can be found in the folder LICENSES and in
11 // LICENSE and CONTRIBUTING.md at the top level directory.
12 //
13 // ------------------------------------------------------
14 
15 #ifndef _aspect_particle_manager_h
16 #define _aspect_particle_manager_h
17 
18 #include <aspect/global.h>
19 
26 
28 
33 
37 
38 #include <deal.II/base/timer.h>
40 
41 #include <boost/serialization/unique_ptr.hpp>
42 
43 #include <random>
44 #include <vector>
45 
46 namespace aspect
47 {
48  template <int dim>
49  struct SimulatorSignals;
50 
51  namespace Particle
52  {
53  using namespace ::Particles;
54 
55  namespace Generator
56  {
57  template <int dim>
58  class Interface;
59  }
60 
61 
62  namespace Property
63  {
64  template <int dim>
65  class Manager;
66  }
67 
79  template <int dim>
80  class Manager : public SimulatorAccess<dim>
81  {
82  public:
90  Manager();
91 
97  Manager(const unsigned int particle_manager_index);
98 
102  ~Manager() override;
103 
108  Manager(Manager &&) noexcept;
109 
113  enum class ParticleVelocity
114  {
115  solid,
116  fluid,
117  };
118 
122  void initialize();
123 
127  void update();
128 
134  const Property::Manager<dim> &
135  get_property_manager() const;
136 
143  get_particle_handler() const;
144 
157  get_particle_handler();
158 
177  void copy_particle_handler (const Particles::ParticleHandler<dim> &from_particle_handler,
178  Particles::ParticleHandler<dim> &to_particle_handler) const;
179 
185  void backup_particles ();
186 
193  void restore_particles ();
194 
195 
199  void setup_initial_state ();
200 
207  get_interpolator() const;
208 
212  void generate_particles();
216  void initialize_particles();
217 
225  void advance_timestep();
226 
238  types::particle_index n_global_particles() const;
239 
250  void
251  connect_to_signals(aspect::SimulatorSignals<dim> &signals);
252 
258  unsigned int
259  cell_weight(const typename parallel::distributed::Triangulation<dim>::cell_iterator &cell,
260  const CellStatus status);
261 
265  void update_particles();
266 
270  template <class Archive>
271  void serialize (Archive &ar, const unsigned int version);
272 
276  virtual
277  void
278  save (std::ostringstream &os) const;
279 
283  virtual
284  void
285  load (std::istringstream &is);
286 
290  static
291  void
293 
301  virtual
302  void
303  parse_parameters (ParameterHandler &prm);
304 
310  get_particle_velocity_choice() const;
311 
312  private:
313 
319 
321  {
322  enum Kind
323  {
324  no_balancing = 0x0,
325  remove_particles = 0x1,
326  add_particles = 0x2,
327  repartition = 0x4,
328  remove_and_add_particles = remove_particles | add_particles
329  };
330  };
331 
335  enum class DeletionAlgorithm
336  {
337  random,
338  point_density_function,
339  };
340 
344  enum class AdditionAlgorithm
345  {
346  random,
347  histogram,
348  point_density_function,
349  monte_carlo,
350  };
351 
359 
367 
372 
376  double bandwidth;
377 
381  std::unique_ptr<Generator::Interface<dim>> generator;
382 
386  std::unique_ptr<Integrator::Interface<dim>> integrator;
387 
398 
402  std::unique_ptr<Interpolator::Interface<dim>> interpolator;
403 
408  std::unique_ptr<Particles::ParticleHandler<dim>> particle_handler;
409 
417 
423  std::unique_ptr<Property::Manager<dim>> property_manager;
424 
429 
434 
439 
444 
458 
471 
480  unsigned int particle_weight;
481 
488  std::map<types::subdomain_id, unsigned int>
489  get_subdomain_id_to_neighbor_map() const;
490 
496  void
497  apply_particle_per_cell_bounds();
498 
503  void advect_particles();
504 
508  void
509  local_initialize_particles(const typename ParticleHandler<dim>::particle_iterator &begin_particle,
510  const typename ParticleHandler<dim>::particle_iterator &end_particle);
511 
522  void
523  local_update_particles(Property::ParticleUpdateInputs<dim> &inputs,
524  small_vector<Point<dim>> &positions,
525  const std::vector<EvaluationFlags::EvaluationFlags> &evaluation_flags,
526  SolutionEvaluator<dim> &evaluator);
527 
536  void
537  local_advect_particles(const typename DoFHandler<dim>::active_cell_iterator &cell,
538  const typename ParticleHandler<dim>::particle_iterator &begin_particle,
539  const typename ParticleHandler<dim>::particle_iterator &end_particle,
540  SolutionEvaluator<dim> &evaluators);
541 
546  void
547  connect_particle_handler_signals(aspect::SimulatorSignals<dim> &signals,
548  ParticleHandler<dim> &particle_handler,
549  const bool connect_to_checkpoint_signals = true) const;
550 
559  std::vector<typename Particles::ParticleHandler<dim>::particle_iterator_range>
560  get_neighboring_particle_ranges(const typename Triangulation<dim>::active_cell_iterator &cell,
561  const typename Particles::ParticleHandler<dim> &particle_handler,
562  typename GridTools::Cache<dim> &grid_cache);
563  };
564 
565  /* -------------------------- inline and template functions ---------------------- */
566 
567  template <int dim>
568  template <class Archive>
569  void Manager<dim>::serialize (Archive &ar, const unsigned int)
570  {
571  ar &particle_manager_index;
572 
573  // Note that although Boost claims to handle serialization of pointers
574  // correctly, at least for the case of unique_ptr it seems to not work.
575  // It works correctly when archiving the content of the pointer instead.
576  ar
577  &(*particle_handler)
578  ;
579  }
580  }
581 }
582 
583 #endif
void serialize(Archive &ar, const unsigned int version)
Definition: manager.h:569
ParticlePDF< dim >::KernelFunction kernel_function
Definition: manager.h:371
unsigned int max_particles_per_cell
Definition: manager.h:470
unsigned int min_particles_per_cell
Definition: manager.h:457
unsigned int particle_weight
Definition: manager.h:480
std::unique_ptr< Generator::Interface< dim > > generator
Definition: manager.h:381
std::unique_ptr< Integrator::Interface< dim > > integrator
Definition: manager.h:386
ParticleVelocity particle_velocity
Definition: manager.h:443
std::unique_ptr< Particles::ParticleHandler< dim > > particle_handler
Definition: manager.h:408
Particles::ParticleHandler< dim > particle_handler_backup
Definition: manager.h:416
std::unique_ptr< Property::Manager< dim > > property_manager
Definition: manager.h:423
unsigned int addition_granularity_pdf
Definition: manager.h:358
std::unique_ptr< Interpolator::Interface< dim > > interpolator
Definition: manager.h:402
unsigned int particle_manager_index
Definition: manager.h:318
AdditionAlgorithm addition_algorithm
Definition: manager.h:438
DeletionAlgorithm deletion_algorithm
Definition: manager.h:433
void declare_parameters(ParameterHandler &prm)
ParticleLoadBalancing::Kind particle_load_balancing
Definition: manager.h:428
void random(DoFHandler< dim, spacedim > &dof_handler)
ParticleIterator< dim, spacedim > particle_iterator
unsigned int addition_granularity_histogram
Definition: manager.h:366
std::mt19937 random_number_generator
Definition: manager.h:397
boost::container::small_vector< T, N > small_vector
Definition: global.h:255
CellStatus
typename ::Triangulation< dim, spacedim >::cell_iterator cell_iterator