6#include <deal.II/base/parameter_handler.h>
7#include <deal.II/distributed/tria.h>
8#include <deal.II/grid/grid_generator.h>
9#include <deal.II/grid/grid_tools.h>
10#include <deal.II/grid/tria.h>
19#include <prismspf/config.h>
33template <
unsigned int dim>
35 std::conditional_t<dim == 1,
36 dealii::Triangulation<dim>,
37 dealii::parallel::distributed::Triangulation<dim>>;
42template <
unsigned int dim>
54 dealii::Tensor<1, dim, double> _lower_bound,
55 std::array<unsigned int, dim> _subdivisions)
67 dealii::GridGenerator::subdivided_hyper_rectangle(triangulation,
70 dealii::Point<dim>(
size));
85 dealii::Tensor<1, dim, double>
size;
95 std::vector<unsigned int>
subdivisions = std::vector<unsigned int>(dim, 1);
109 for (
const auto &cell : triangulation.active_cell_iterators())
112 for (
unsigned int face_number = 0;
113 face_number < dealii::GeometryInfo<dim>::faces_per_cell;
117 unsigned int direction = face_number / 2;
120 if (std::fabs(cell->face(face_number)->center()(direction)) <
122 std::fabs(cell->face(face_number)->center()(direction) -
125 cell->face(face_number)->set_boundary_id(face_number);
140 dealii::GridTools::PeriodicFacePair<typename Triangulation<dim>::cell_iterator>>
145 triangulation.add_periodicity(periodicity_vector);
151 template <
typename MeshType>
154 const MeshType &triangulation,
155 std::vector<dealii::GridTools::PeriodicFacePair<typename MeshType::cell_iterator>>
156 &periodicity_vector)
const
161 unsigned int boundary_id = direction * 2;
162 dealii::GridTools::collect_periodic_faces(triangulation,
174template <
unsigned int dim>
198 AssertThrow(dim != 1, dealii::ExcMessage(
"Spherical mesh not valid in 1D"));
199 dealii::GridGenerator::hyper_ball(triangulation, dealii::Point<dim>(),
radius);
229template <
unsigned int dim>
247 "Adaptive meshing for the matrix-free method is not currently supported."));
255 "The maximum refinement level must be greater than or equal to the "
256 "global refinement level."));
259 "The minimum refinement level must be less than or equal to the "
260 "global refinement level."));
263 "The maximum refinement level must be greater than or equal to the "
264 "minimum refinement level."));
279 AssertThrow(
false, UnreachableCode(
"Invalid TriangulationType"));
296 unsigned int max_criteria = 5)
const;
303 unsigned int max_criteria = 5);
336template <
unsigned int dim>
341 <<
"================================================\n"
342 <<
" Spatial Discretization\n"
343 <<
"================================================\n";
357 <<
"Degree: " <<
degree <<
"\n"
369 <<
" Field name: " << field_name <<
"\n"
370 <<
" Criterion type: " << criterion.criterion_string() <<
"\n"
371 <<
" Value lower bound: " << criterion.value_lower_bound <<
"\n"
372 <<
" Value upper bound: " << criterion.value_upper_bound <<
"\n"
373 <<
" Gradient lower bound: " << criterion.gradient_lower_bound <<
"\n\n";
380template <
unsigned int dim>
383 dealii::ParameterHandler ¶meter_handler,
384 unsigned int max_criteria)
const
386 parameter_handler.declare_entry(
"global refinement",
388 dealii::Patterns::Integer(0, INT_MAX),
389 "The number of initial refinements of the coarse mesh.",
392 parameter_handler.enter_subsection(
"Rectangular mesh");
394 parameter_handler.declare_entry(
"x size",
396 dealii::Patterns::Double(0.0, DBL_MAX),
397 "The size of the domain in the x direction.");
398 parameter_handler.declare_entry(
"y size",
400 dealii::Patterns::Double(0.0, DBL_MAX),
401 "The size of the domain in the y direction.");
402 parameter_handler.declare_entry(
"z size",
404 dealii::Patterns::Double(0.0, DBL_MAX),
405 "The size of the domain in the z direction.");
406 parameter_handler.declare_entry(
"x lower bound",
408 dealii::Patterns::Double(-DBL_MAX, DBL_MAX),
409 "The lower bound of the domain in the x direction.");
410 parameter_handler.declare_entry(
"y lower bound",
412 dealii::Patterns::Double(-DBL_MAX, DBL_MAX),
413 "The lower bound of the domain in the y direction.");
414 parameter_handler.declare_entry(
"z lower bound",
416 dealii::Patterns::Double(-DBL_MAX, DBL_MAX),
417 "The lower bound of the domain in the z direction.");
418 parameter_handler.declare_entry(
421 dealii::Patterns::Integer(1, INT_MAX),
422 "The number of mesh subdivisions in the x direction.");
423 parameter_handler.declare_entry(
426 dealii::Patterns::Integer(1, INT_MAX),
427 "The number of mesh subdivisions in the y direction.");
428 parameter_handler.declare_entry(
431 dealii::Patterns::Integer(1, INT_MAX),
432 "The number of mesh subdivisions in the z direction.");
434 parameter_handler.declare_entry(
"periodic x",
436 dealii::Patterns::Bool(),
437 "Whether to have periodicity in the x-direction.");
438 parameter_handler.declare_entry(
"periodic y",
440 dealii::Patterns::Bool(),
441 "Whether to have periodicity in the y-direction.");
442 parameter_handler.declare_entry(
"periodic z",
444 dealii::Patterns::Bool(),
445 "Whether to have periodicity in the z-direction.");
447 parameter_handler.leave_subsection();
449 parameter_handler.enter_subsection(
"Spherical mesh");
451 parameter_handler.declare_entry(
"radius",
453 dealii::Patterns::Double(0.0, DBL_MAX),
454 "The radius of the domain.");
456 parameter_handler.leave_subsection();
458 parameter_handler.declare_entry(
"mesh adaptivity",
460 dealii::Patterns::Bool(),
461 "Whether to enable mesh adaptivity.");
462 parameter_handler.declare_entry(
"max refinement",
464 dealii::Patterns::Integer(0, INT_MAX),
465 "The maximum level of refinement.");
466 parameter_handler.declare_entry(
"min refinement",
468 dealii::Patterns::Integer(0, INT_MAX),
469 "The minimum level of refinement.");
470 parameter_handler.declare_entry(
473 dealii::Patterns::Integer(1, INT_MAX),
474 "The number of time steps between mesh refinement operations.");
476 for (
unsigned int criterion_id = 0; criterion_id < max_criteria; criterion_id++)
478 std::string subsection_text =
479 "refinement criterion: " + std::to_string(criterion_id);
480 parameter_handler.enter_subsection(subsection_text);
482 parameter_handler.declare_entry(
485 dealii::Patterns::Anything(),
486 "The names of the fields that will use this refinement criterion.");
487 parameter_handler.declare_entry(
490 dealii::Patterns::Selection(
"none|value|gradient|value_and_gradient"),
491 "The type of criterion used to determine if a cell should be "
492 "refined. The options are none, value, gradient, value_and_gradient.");
493 parameter_handler.declare_entry(
496 dealii::Patterns::Double(-DBL_MAX, DBL_MAX),
497 "The lower bound for the window determining where the mesh should be "
499 parameter_handler.declare_entry(
502 dealii::Patterns::Double(-DBL_MAX, DBL_MAX),
503 "The upper bound for the window determining where the mesh should be "
505 parameter_handler.declare_entry(
"gradient magnitude lower bound",
507 dealii::Patterns::Double(0.0, DBL_MAX),
508 "The magnitude of the gradient above "
509 "which the mesh should be refined.");
510 parameter_handler.declare_alias(
"gradient magnitude lower bound",
511 "gradient lower bound");
513 parameter_handler.leave_subsection();
517template <
unsigned int dim>
520 unsigned int max_criteria)
523 parameter_handler.enter_subsection(
"Rectangular mesh");
525 static const std::vector<std::string> axis_labels = {
"x",
"y",
"z"};
527 for (
unsigned int i = 0; i < dim; ++i)
529 rect.
size[i] = parameter_handler.get_double(axis_labels[i] +
" size");
531 parameter_handler.get_double(axis_labels[i] +
" lower bound");
533 parameter_handler.get_integer(axis_labels[i] +
" subdivisions"));
534 if (parameter_handler.get_bool(
"periodic " + axis_labels[i]))
540 parameter_handler.leave_subsection();
542 parameter_handler.enter_subsection(
"Spherical mesh");
546 parameter_handler.leave_subsection();
549 (
static_cast<unsigned int>(parameter_handler.get_integer(
"global refinement")));
554 (
static_cast<unsigned int>(parameter_handler.get_integer(
"remeshing period")));
557 (
static_cast<unsigned int>(parameter_handler.get_integer(
"max refinement")));
559 (
static_cast<unsigned int>(parameter_handler.get_integer(
"min refinement")));
561 for (
unsigned int criterion_id = 0; criterion_id < max_criteria; criterion_id++)
563 std::string subsection_text =
564 "refinement criterion: " + std::to_string(criterion_id);
565 parameter_handler.enter_subsection(subsection_text);
567 std::vector<std::string> field_names =
568 dealii::Utilities::split_string_list(parameter_handler.get(
"variables"));
569 static const std::map<std::string, RefinementFlags> crit_map {
578 parameter_handler.get_double(
"value lower bound"),
579 parameter_handler.get_double(
"value upper bound"),
580 parameter_handler.get_double(
581 "gradient magnitude lower bound"));
582 for (
const auto &field_name : field_names)
587 parameter_handler.leave_subsection();
591PRISMS_PF_END_NAMESPACE
static dealii::ConditionalOStream & pout_summary()
Log output stream for writing a summary.log file.
Definition conditional_ostreams.cc:35
@ Value
Use value of the variable as a criterion for refinement.
Definition grid_refiner_criterion.h:31
@ Nothing
No adaptive refinement criterion.
Definition grid_refiner_criterion.h:26
@ Gradient
Use gradient of the variable as a criterion for refinement.
Definition grid_refiner_criterion.h:36
static const double mesh_tolerance
Default mesh tolerance.
Definition types.h:62
Definition conditional_ostreams.cc:20
std::conditional_t< dim==1, dealii::Triangulation< dim >, dealii::parallel::distributed::Triangulation< dim > > Triangulation
Definition spatial_discretization.h:34
TriangulationType
Internal enum for various triangulation types.
Definition spatial_discretization.h:27
@ Custom
Definition spatial_discretization.h:30
@ Rectangular
Definition spatial_discretization.h:28
@ Spherical
Definition spatial_discretization.h:29
Class for rectangular mesh parameters.
Definition spatial_discretization.h:44
void mark_periodic(Triangulation< dim > &triangulation) const
Mark the periodic faces of the mesh.
Definition spatial_discretization.h:135
RectangularMesh(dealii::Tensor< 1, dim, double > _size, dealii::Tensor< 1, dim, double > _lower_bound, std::array< unsigned int, dim > _subdivisions)
Constructor.
Definition spatial_discretization.h:53
void mark_boundaries(Triangulation< dim > &triangulation) const
Mark the boundaries of the mesh.
Definition spatial_discretization.h:106
dealii::Tensor< 1, dim, double > lower_bound
Domain extents in each cartesian direction.
Definition spatial_discretization.h:90
dealii::Tensor< 1, dim, double > size
Domain extents in each cartesian direction.
Definition spatial_discretization.h:85
void generate_mesh(Triangulation< dim > &triangulation) const
Generate the mesh.
Definition spatial_discretization.h:64
std::set< unsigned int > periodic_directions
Which directions have periodic conditions.
Definition spatial_discretization.h:100
std::vector< unsigned int > subdivisions
Mesh subdivisions in each cartesian direction.
Definition spatial_discretization.h:95
void collect_periodic_faces(const MeshType &triangulation, std::vector< dealii::GridTools::PeriodicFacePair< typename MeshType::cell_iterator > > &periodicity_vector) const
Get the periodic face pairs.
Definition spatial_discretization.h:153
RectangularMesh()=default
Constructor.
void validate() const
Validate.
Definition spatial_discretization.h:79
Definition grid_refiner_criterion.h:78
Struct that holds spatial discretization parameters.
Definition spatial_discretization.h:231
unsigned int min_refinement
Definition spatial_discretization.h:327
unsigned int degree
Definition spatial_discretization.h:318
TriangulationType type
Definition spatial_discretization.h:306
RectangularMesh< dim > rectangular_mesh
Definition spatial_discretization.h:309
std::map< std::string, RefinementCriterion > refinement_criteria
Definition spatial_discretization.h:333
void validate()
Validate.
Definition spatial_discretization.h:242
SphericalMesh< dim > spherical_mesh
Definition spatial_discretization.h:312
void declare_parameters(dealii::ParameterHandler ¶meter_handler, unsigned int max_criteria=5) const
Declare the parameters to be read from an input file.
Definition spatial_discretization.h:382
unsigned int remeshing_period
Definition spatial_discretization.h:330
unsigned int global_refinement
Definition spatial_discretization.h:315
bool should_refine_mesh(unsigned int increment) const
Whether the provided increment is a valid grid refinement step.
Definition spatial_discretization.h:286
void assign_parameters(dealii::ParameterHandler ¶meter_handler, unsigned int max_criteria=5)
Assign the parameters read from an input file to this object.
Definition spatial_discretization.h:519
unsigned int max_refinement
Definition spatial_discretization.h:324
bool has_adaptivity
Definition spatial_discretization.h:321
void print_parameter_summary() const
Print parameters to summary.log.
Definition spatial_discretization.h:338
Class for spherical mesh parameters.
Definition spatial_discretization.h:176
SphericalMesh()=default
Constructor.
double radius
Radius of the spherical domain.
Definition spatial_discretization.h:213
void generate_mesh(Triangulation< dim > &triangulation) const
Generate the mesh.
Definition spatial_discretization.h:193
void mark_boundaries(Triangulation< dim > &triangulation) const
Mark the boundaries of the mesh.
Definition spatial_discretization.h:220
void validate() const
Validate.
Definition spatial_discretization.h:207
SphericalMesh(double _radius)
Constructor.
Definition spatial_discretization.h:185
const char * bool_to_string(bool boolean)
Convert bool to string.
Definition utilities.h:399