ASPECT
distribution.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) 2025-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_distribution_h
16 #define _aspect_particle_distribution_h
17 
20 #include <algorithm>
21 #include <limits>
22 #include <deal.II/base/table.h>
26 #include <vector>
27 
28 namespace aspect
29 {
30  namespace Particle
31  {
41  template <int dim>
43  {
44  public:
45 
51  enum class KernelFunction
52  {
53  gaussian,
54  triangular,
55  uniform,
59  };
60 
71  ParticlePDF(const unsigned int granularity,
72  const double bandwidth,
74 
83  ParticlePDF(const double bandwidth,
84  const KernelFunction kernel_function);
85 
95  void
98  &particle_ranges_to_sum_over,
99  const unsigned int n_particles_in_cell,
100  const typename ::Mapping<dim> &mapping,
101  const typename Triangulation<dim>::active_cell_iterator &cell);
102 
114  void
115  insert_kernel_sum_from_particle_range(const Point<dim> &reference_point,
116  const std::array<unsigned int,dim> &table_index,
117  const typename Triangulation<dim>::active_cell_iterator &cell,
119  &particle_ranges_to_sum_over,
120  const typename ::Mapping<dim> &mapping);
121 
129  void
130  add_value_to_function_table(const unsigned int x_index,
131  const unsigned int y_index,
132  const unsigned int z_index,
133  const double input_value);
134 
141  void
142  add_value_to_function_table(const std::array<unsigned int,dim> &index_point,
143  const double input_value);
144 
152  void
153  add_value_to_function_table(const double input_value,
154  const types::particle_index reference_particle_id);
155 
163  double
164  evaluate_function_at_index(const unsigned int x_index,
165  const unsigned int y_index,
166  const unsigned int z_index) const;
167 
171  void
173 
177  double
178  get_max() const;
179 
183  double
184  get_min() const;
185 
189  Point<dim>
190  get_max_position() const;
191 
195  std::vector<Point<dim>>
196  get_min_positions() const;
197 
201  double
202  get_standard_deviation() const;
203 
210  get_max_particle() const;
211 
218  get_min_particle() const;
219 
220  private:
228 
237  double bandwidth;
238 
244 
250  unsigned int granularity;
251 
255  double max;
256 
260  double min;
261 
266 
272  std::vector<Point<dim>> min_positions;
273 
278 
282  double mean;
283 
290 
297 
303 
309 
315  double apply_selected_kernel_function(const double distance) const;
316 
323  double kernelfunction_uniform(const double distance) const;
324 
331  double kernelfunction_triangular(const double distance) const;
332 
339  double kernelfunction_gaussian(const double distance) const;
340 
347  double kernelfunction_epanechnikov(const double distance) const;
348  };
349  }
350 }
351 
352 #endif
double kernelfunction_triangular(const double distance) const
ParticlePDF(const unsigned int granularity, const double bandwidth, const KernelFunction kernel_function)
types::particle_index get_min_particle() const
double kernelfunction_uniform(const double distance) const
double get_standard_deviation() const
small_vector< double > function_output_vector
Definition: distribution.h:289
void insert_kernel_sum_from_particle_range(const Point< dim > &reference_point, const std::array< unsigned int, dim > &table_index, const typename Triangulation< dim >::active_cell_iterator &cell, const std::vector< typename Particles::ParticleHandler< dim >::particle_iterator_range > &particle_ranges_to_sum_over, const typename ::Mapping< dim > &mapping)
std::vector< Point< dim > > min_positions
Definition: distribution.h:272
types::particle_index get_max_particle() const
std::vector< Point< dim > > get_min_positions() const
double kernelfunction_gaussian(const double distance) const
boost::iterator_range< particle_iterator > particle_iterator_range
void fill_from_particle_range(const typename Particles::ParticleHandler< dim >::particle_iterator_range &particle_range, const std::vector< typename Particles::ParticleHandler< dim >::particle_iterator_range > &particle_ranges_to_sum_over, const unsigned int n_particles_in_cell, const typename ::Mapping< dim > &mapping, const typename Triangulation< dim >::active_cell_iterator &cell)
types::particle_index min_particle_index
Definition: distribution.h:308
Point< dim > get_max_position() const
double kernelfunction_epanechnikov(const double distance) const
double apply_selected_kernel_function(const double distance) const
void add_value_to_function_table(const unsigned int x_index, const unsigned int y_index, const unsigned int z_index, const double input_value)
boost::container::small_vector< T, N > small_vector
Definition: global.h:255
Table< dim, double > function_output_table
Definition: distribution.h:227
types::particle_index max_particle_index
Definition: distribution.h:302
double evaluate_function_at_index(const unsigned int x_index, const unsigned int y_index, const unsigned int z_index) const