include/meltpooldg/particles/dem_background_triangulation_tools.hpp Source File

Developer Documentation: include/meltpooldg/particles/dem_background_triangulation_tools.hpp Source File
Developer Documentation
dem_background_triangulation_tools.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/base/point.h>
4
5#include <deal.II/grid/grid_generator.h>
6#include <deal.II/grid/tria.h>
7
11
12#include <boost/container/small_vector.hpp>
13
14namespace MeltPoolDG
15{
30 template <int dim, typename number, typename ObstacleType>
31 void
32 generate_data_structure_optimal_hyper_rectangle(dealii::Triangulation<dim> &triangulation,
33 const dealii::Point<dim, number> &p1,
34 const dealii::Point<dim, number> &p2,
35 const number max_particle_radius)
36 {
37 const number min_vertex_distance =
39 max_particle_radius);
40
41 const dealii::Tensor<1, dim, number> domain_size = p2 - p1;
42 std::vector<unsigned int> repetitions(dim);
43 // As the cell list particle handler requires at least two levels in the triangulation we first
44 // create a triangulation with half the number of cells in each direction and then refine it
45 // globally once.
46 for (unsigned int d = 0; d < dim; ++d)
47 repetitions[d] = 0.5 * std::max(1u,
48 static_cast<unsigned int>(std::floor(
49 std::abs(domain_size[d]) / min_vertex_distance)));
50
51 dealii::GridGenerator::subdivided_hyper_rectangle(triangulation, repetitions, p1, p2);
52 triangulation.refine_global(1);
53 }
54
68 template <int dim, typename number, typename ObstacleType>
69 void
71 dealii::Triangulation<dim> &triangulation)
72 {
73 const auto weight_function =
74 [&obstacle_field](const typename dealii::Triangulation<dim>::cell_iterator &cell,
75 const dealii::CellStatus) -> unsigned int {
76 // Size of the container is a guess which should ensure that no dynamic memory allocations
77 // are required for most cases.
78 boost::container::small_vector<DEMParticleAccessor<dim, number>, 5 * dim> particles_in_cell;
79 obstacle_field.get_obstacles_in_cell(cell, particles_in_cell);
80 return static_cast<unsigned int>(particles_in_cell.size());
81 };
82 triangulation.signals.weight.connect(weight_function);
83 }
84} // namespace MeltPoolDG
Definition obstacle_field.hpp:32
void get_obstacles_in_cell(const dealii::TriaIterator< dealii::CellAccessor< dim > > &cell, ObstacleContainer &particles)
Definition obstacle_field.hpp:365
Interface for a general preconditioner.
Definition boundary_condition_functions.hpp:17
void set_particle_count_partitioning_weight(ObstacleField< dim, number, ObstacleType > &obstacle_field, dealii::Triangulation< dim > &triangulation)
Definition dem_background_triangulation_tools.hpp:70
void generate_data_structure_optimal_hyper_rectangle(dealii::Triangulation< dim > &triangulation, const dealii::Point< dim, number > &p1, const dealii::Point< dim, number > &p2, const number max_particle_radius)
Definition dem_background_triangulation_tools.hpp:32
static number minimal_cell_vertex_distance(const number max_particle_radius)
Definition obstacle_data_structure.cpp:214