PRISMS-PF Manual
Loading...
Searching...
No Matches
spatial_discretization.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: © 2026 PRISMS Center at the University of Michigan
2// SPDX-License-Identifier: GNU Lesser General Public Version 2.1
3
4#pragma once
5
6#include <deal.II/base/parameter_handler.h>
7#include <deal.II/base/patterns.h>
8#include <deal.II/base/vectorization.h>
9#include <deal.II/distributed/tria.h>
10#include <deal.II/dofs/dof_handler.h>
11#include <deal.II/dofs/dof_tools.h>
12#include <deal.II/grid/grid_generator.h>
13#include <deal.II/grid/grid_tools.h>
14#include <deal.II/grid/tria.h>
15#include <deal.II/lac/affine_constraints.h>
16#include <deal.II/lac/full_matrix.h>
17
21#include <prismspf/core/types.h>
22
24
26
27#include <prismspf/config.h>
28
30
40
47template <unsigned int dim>
49{
50 unsigned int boundary_id_1 = -1;
51 unsigned int boundary_id_2 = -1;
52 unsigned int direction = -1;
53 dealii::Tensor<1, dim> translation_vector;
54 dealii::FullMatrix<double> rotation_matrix;
55};
56
60template <unsigned int dim>
61struct Mesh
62{
64 std::conditional_t<dim == 1,
65 dealii::Triangulation<dim>,
66 dealii::parallel::distributed::Triangulation<dim>>;
67
71 Mesh() = default;
72
76 virtual void
77 generate_mesh(Triangulation &triangulation) const = 0;
78
82 virtual void
83 mark_boundaries(Triangulation &triangulation) const
84 {}
85
89 virtual double
90 distance(const dealii::Point<dim> &point_1, const dealii::Point<dim> &point_2) const;
94 template <typename real1, typename real2>
95 double
96 distance(const dealii::Point<dim, real1> &point_1,
97 const dealii::Point<dim, real2> &point_2) const;
101 template <typename real1>
102 dealii::VectorizedArray<real1>
103 distance(const dealii::Point<dim, dealii::VectorizedArray<real1>> &point_1,
104 const dealii::Point<dim, dealii::VectorizedArray<real1>> &point_2) const;
105
109 virtual void
110 validate() const
111 {}
112
120 virtual std::list<PeriodicPair<dim>>
121 periodicity_set() const;
122
126 void
127 mark_periodic(Triangulation &triangulation) const;
128
132 template <typename number>
133 void
134 mark_periodic(const dealii::DoFHandler<dim> &dof_handler,
135 dealii::AffineConstraints<number> &constraints) const;
136};
137
141template <unsigned int dim>
142struct RectangularMesh : public Mesh<dim>
143{
145
150 {
151 Left = 0,
152 Right = 1,
153 Top = 2,
155 Front = 4,
157 };
158
162 RectangularMesh() = default;
163
167 RectangularMesh(dealii::Tensor<1, dim, double> _size,
168 dealii::Tensor<1, dim, double> _lower_bound,
169 std::vector<unsigned int> _subdivisions);
170
174 void
175 generate_mesh(Triangulation &triangulation) const override;
176
180 void
181 mark_boundaries(Triangulation &triangulation) const override;
182
190 std::list<PeriodicPair<dim>>
191 periodicity_set() const override;
192
196 double
197 distance(const dealii::Point<dim> &point_1,
198 const dealii::Point<dim> &point_2) const override;
199
203 static void
204 declare_parameters(dealii::ParameterHandler &parameter_handler);
205
209 void
210 assign_parameters(dealii::ParameterHandler &parameter_handler);
211
215 void
216 validate() const override;
217
221 dealii::Tensor<1, dim, double> size;
222
226 dealii::Tensor<1, dim, double> lower_bound;
227
231 std::vector<unsigned int> subdivisions = std::vector<unsigned int>(dim, 1);
232
236 std::set<unsigned int> periodic_directions;
237};
238
242template <unsigned int dim>
243struct SphericalMesh : public Mesh<dim>
244{
246
251 {
253 };
254
258 SphericalMesh() = default;
259
263 explicit SphericalMesh(double _radius);
264
268 void
269 generate_mesh(Triangulation &triangulation) const override;
270
274 void
275 mark_boundaries(Triangulation &triangulation) const override;
276
280 static void
281 declare_parameters(dealii::ParameterHandler &parameter_handler);
282
286 void
287 assign_parameters(dealii::ParameterHandler &parameter_handler);
288
292 void
293 validate() const override;
294
298 double radius = 0.0;
299};
300
304template <unsigned int dim>
306 : public ParameterBase
307 , private Mesh<dim>
308{
309public:
314 static void
315 declare(dealii::ParameterHandler &parameter_handler,
316 unsigned int n_subsections = Numbers::default_subsections);
317
321 void
322 assign(dealii::ParameterHandler &parameter_handler,
323 unsigned int n_subsections = Numbers::default_subsections) override;
324
328 void
329 validate(const std::vector<FieldAttributes> &field_attributes,
330 const std::vector<SolveBlock> &solve_blocks) const override;
331
335 void
336 generate_mesh(Triangulation &triangulation) const override;
337
341 void
342 mark_boundaries(Triangulation &triangulation) const override;
343
351 std::list<PeriodicPair<dim>>
352 periodicity_set() const override;
353
357 double
358 distance(const dealii::Point<dim> &point_1,
359 const dealii::Point<dim> &point_2) const override;
360
361 using Mesh<dim>::mark_periodic;
362 using Mesh<dim>::distance;
363
367 const Mesh<dim> &
368 get_mesh() const;
369
373 Mesh<dim> &
374 get_mesh();
375
379 [[nodiscard]] bool
380 should_refine_mesh(unsigned int increment) const;
381
382 // Triangulation type
384
385 // Rectangular mesh parameters
387
388 // Spherical mesh parameters
390
391 // Custom mesh parameters
393
394 // Global refinement of mesh
395 unsigned int global_refinement = 0;
396
397 // Whether adaptive meshing (AMR) is enabled
398 bool has_adaptivity = false;
399
400 // Maximum global refinement for AMR
401 unsigned int max_refinement = 0;
402
403 // Minimum global refinement for AMR
404 unsigned int min_refinement = 0;
405
406 // The number of steps between remeshing
407 unsigned int remeshing_period = UINT_MAX;
408
409 // The criteria used for remeshing
410 std::map<std::string, RefinementCriterion> refinement_criteria;
411};
412
413PRISMS_PF_END_NAMESPACE
static constexpr unsigned int default_subsections
Max number of subsections.
Definition types.h:33
Definition conditional_ostreams.cc:20
TriangulationType
Internal enum for various triangulation types.
Definition spatial_discretization.h:35
@ Custom
Definition spatial_discretization.h:38
@ Rectangular
Definition spatial_discretization.h:36
@ Spherical
Definition spatial_discretization.h:37
virtual std::list< PeriodicPair< dim > > periodicity_set() const
Periodicity set.
Definition spatial_discretization.cc:65
void mark_periodic(Triangulation &triangulation) const
Mark the periodic faces of the mesh.
virtual void mark_boundaries(Triangulation &triangulation) const
Mark the boundaries of the mesh.
Definition spatial_discretization.h:83
virtual void generate_mesh(Triangulation &triangulation) const =0
Generate the mesh.
virtual double distance(const dealii::Point< dim > &point_1, const dealii::Point< dim > &point_2) const
Calculation the distance between two points considering periodic boundaries.
Definition spatial_discretization.cc:17
virtual void validate() const
Validate.
Definition spatial_discretization.h:110
Mesh()=default
Constructor.
std::conditional_t< dim==1, dealii::Triangulation< dim >, dealii::parallel::distributed::Triangulation< dim > > Triangulation
Definition spatial_discretization.h:63
ParameterBase()=default
Periodicity face pair.
Definition spatial_discretization.h:49
unsigned int direction
Definition spatial_discretization.h:52
dealii::FullMatrix< double > rotation_matrix
Definition spatial_discretization.h:54
unsigned int boundary_id_1
Definition spatial_discretization.h:50
unsigned int boundary_id_2
Definition spatial_discretization.h:51
dealii::Tensor< 1, dim > translation_vector
Definition spatial_discretization.h:53
Class for rectangular mesh parameters.
Definition spatial_discretization.h:143
Boundary
Simple enum for boundary ids to natural language.
Definition spatial_discretization.h:150
@ Back
Definition spatial_discretization.h:156
@ Front
Definition spatial_discretization.h:155
@ Right
Definition spatial_discretization.h:152
@ Bottom
Definition spatial_discretization.h:154
@ Left
Definition spatial_discretization.h:151
@ Top
Definition spatial_discretization.h:153
dealii::Tensor< 1, dim, double > lower_bound
Lower bound point.
Definition spatial_discretization.h:226
void validate() const override
Validate.
Definition spatial_discretization.cc:282
void assign_parameters(dealii::ParameterHandler &parameter_handler)
Assign the parameters read from an input file to this object.
Definition spatial_discretization.cc:261
typename Mesh< dim >::Triangulation Triangulation
Definition spatial_discretization.h:144
dealii::Tensor< 1, dim, double > size
Upper bound point.
Definition spatial_discretization.h:221
static void declare_parameters(dealii::ParameterHandler &parameter_handler)
Declare the parameters to be read from an input file.
Definition spatial_discretization.cc:212
double distance(const dealii::Point< dim > &point_1, const dealii::Point< dim > &point_2) const override
Calculation the distance between two points considering periodic boundaries.
Definition spatial_discretization.cc:181
std::list< PeriodicPair< dim > > periodicity_set() const override
Periodicity set.
Definition spatial_discretization.cc:165
std::set< unsigned int > periodic_directions
Which directions have periodic conditions.
Definition spatial_discretization.h:236
std::vector< unsigned int > subdivisions
Mesh subdivisions in each cartesian direction.
Definition spatial_discretization.h:231
RectangularMesh()=default
Constructor.
void generate_mesh(Triangulation &triangulation) const override
Generate the mesh.
Definition spatial_discretization.cc:133
void mark_boundaries(Triangulation &triangulation) const override
Mark the boundaries of the mesh.
Definition spatial_discretization.cc:147
Struct that holds spatial discretization parameters.
Definition spatial_discretization.h:308
static void declare(dealii::ParameterHandler &parameter_handler, unsigned int n_subsections=Numbers::default_subsections)
Declare the parameters to be read from file.
Definition spatial_discretization.cc:360
unsigned int min_refinement
Definition spatial_discretization.h:404
RectangularMesh< dim > rectangular_mesh
Definition spatial_discretization.h:386
const Mesh< dim > & get_mesh() const
Get the mesh object.
Definition spatial_discretization.cc:529
void generate_mesh(Triangulation &triangulation) const override
Generate the mesh.
Definition spatial_discretization.cc:579
TriangulationType mesh_type
Definition spatial_discretization.h:383
std::map< std::string, RefinementCriterion > refinement_criteria
Definition spatial_discretization.h:410
void assign(dealii::ParameterHandler &parameter_handler, unsigned int n_subsections=Numbers::default_subsections) override
Assign the parameters from file.
Definition spatial_discretization.cc:439
SphericalMesh< dim > spherical_mesh
Definition spatial_discretization.h:389
void mark_boundaries(Triangulation &triangulation) const override
Mark the boundaries of the mesh.
Definition spatial_discretization.cc:586
std::list< PeriodicPair< dim > > periodicity_set() const override
Periodicity set.
Definition spatial_discretization.cc:593
unsigned int remeshing_period
Definition spatial_discretization.h:407
unsigned int global_refinement
Definition spatial_discretization.h:395
bool should_refine_mesh(unsigned int increment) const
Whether the provided increment is a valid grid refinement step.
Definition spatial_discretization.cc:608
unsigned int max_refinement
Definition spatial_discretization.h:401
typename Mesh< dim >::Triangulation Triangulation
Definition spatial_discretization.h:310
bool has_adaptivity
Definition spatial_discretization.h:398
Mesh< dim > * custom_mesh
Definition spatial_discretization.h:392
double distance(const dealii::Point< dim > &point_1, const dealii::Point< dim > &point_2) const override
Calculation the distance between two points considering periodic boundaries.
Definition spatial_discretization.cc:600
Class for spherical mesh parameters.
Definition spatial_discretization.h:244
void assign_parameters(dealii::ParameterHandler &parameter_handler)
Assign the parameters read from an input file to this object.
Definition spatial_discretization.cc:342
Boundary
Simple enum for boundary ids to natural language.
Definition spatial_discretization.h:251
@ Surface
Definition spatial_discretization.h:252
SphericalMesh()=default
Constructor.
void validate() const override
Validate.
Definition spatial_discretization.cc:353
static void declare_parameters(dealii::ParameterHandler &parameter_handler)
Declare the parameters to be read from an input file.
Definition spatial_discretization.cc:328
double radius
Radius of the spherical domain.
Definition spatial_discretization.h:298
void generate_mesh(Triangulation &triangulation) const override
Generate the mesh.
Definition spatial_discretization.cc:303
void mark_boundaries(Triangulation &triangulation) const override
Mark the boundaries of the mesh.
Definition spatial_discretization.cc:320
typename Mesh< dim >::Triangulation Triangulation
Definition spatial_discretization.h:245