include/meltpooldg/core/scratch_data.hpp Source File

Developer Documentation: include/meltpooldg/core/scratch_data.hpp Source File
Developer Documentation
scratch_data.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/base/index_set.h>
4#include <deal.II/base/mpi.h>
5#include <deal.II/base/mpi_remote_point_evaluation.h>
6#include <deal.II/base/partitioner.h>
7#include <deal.II/base/quadrature.h>
8#include <deal.II/base/timer.h>
9#include <deal.II/base/vectorization.h>
10
11#include <deal.II/dofs/dof_handler.h>
12
13#include <deal.II/fe/fe.h>
14#include <deal.II/fe/mapping.h>
15
16#include <deal.II/grid/tria.h>
17
18#include <deal.II/lac/affine_constraints.h>
19#include <deal.II/lac/la_parallel_block_vector.h>
20#include <deal.II/lac/la_parallel_vector.h>
21
22#include <deal.II/matrix_free/matrix_free.h>
23
26
27#include <functional>
28#include <map>
29#include <memory>
30#include <vector>
31
32namespace MeltPoolDG
33{
59 template <int dim, int spacedim, typename number>
61 {
62 private:
63 using VectorizedArrayType = dealii::VectorizedArray<number>;
64 using VectorType = dealii::LinearAlgebra::distributed::Vector<number>;
65 using BlockVectorType = dealii::LinearAlgebra::distributed::BlockVector<number>;
66
67 public:
81 ScratchData(const MPI_Comm mpi_communicator,
82 const unsigned int verbosity_level_in,
83 const bool do_matrix_free);
84
106 void
107 reinit(const dealii::Mapping<dim, spacedim> &mapping,
108 const std::vector<const dealii::DoFHandler<dim, spacedim> *> &dof_handler,
109 const std::vector<const dealii::AffineConstraints<number> *> &constraint,
110 const std::vector<dealii::Quadrature<dim>> &quad,
111 const bool enable_boundary_face_loops,
112 const bool enable_inner_face_loops,
113 const bool enable_normal_vector_update = false);
121 void
122 set_mapping(const dealii::Mapping<dim, spacedim> &mapping);
123
132 void
133 set_mapping(const std::shared_ptr<dealii::Mapping<dim, spacedim>> mapping);
134
144 unsigned int
145 attach_dof_handler(const dealii::DoFHandler<dim, spacedim> &dof_handler);
146
156 unsigned int
157 attach_constraint_matrix(const dealii::AffineConstraints<number> &constraint);
158
170 unsigned int
171 attach_dof_handler_and_constraint(const dealii::DoFHandler<dim, spacedim> &dof_handler,
172 const dealii::AffineConstraints<number> &constraint);
173
184 unsigned int
185 attach_quadrature(const dealii::Quadrature<dim> &quadrature);
186
197 void
199
217 void
218 build(const bool enable_boundary_face_loops,
219 const bool enable_inner_face_loops,
220 const bool enable_normal_vector_update = false,
221 const bool enable_inner_face_hessians_update = false);
222
233 void
234 initialize_dof_vector(VectorType &vec, const unsigned int dof_idx) const;
235
244 void
245 initialize_dof_vector(BlockVectorType &vec, const unsigned int dof_idx) const;
246
255 void
257 const std::array<unsigned int, dim> &dof_indices_per_block) const;
258
269 void
270 initialize_bc_vector(VectorType &vec, const unsigned int dof_idx) const;
271
281 void
282 initialize_bc_vector(BlockVectorType &vec, const unsigned int dof_idx) const;
283
291 void
292 clear();
293
304 void
305 create_remote_point_evaluation(const unsigned int dof_idx,
306 const std::function<std::vector<bool>()> &marked_vertices = {});
307
313 const dealii::Mapping<dim, spacedim> &
314 get_mapping() const;
321 const dealii::FiniteElement<dim, spacedim> &
322 get_fe(const unsigned int fe_index) const;
329 const dealii::AffineConstraints<number> &
330 get_constraint(const unsigned int constraint_index) const;
337 dealii::AffineConstraints<number> &
338 get_constraint(const unsigned int constraint_index);
344 const std::vector<const dealii::AffineConstraints<number> *> &
345 get_constraints() const;
352 const dealii::Quadrature<dim> &
353 get_quadrature(const unsigned int quad_index) const;
354
360 const std::vector<dealii::Quadrature<dim>> &
361 get_quadratures() const;
368 const dealii::Quadrature<dim - 1> &
369 get_face_quadrature(const unsigned int quad_index) const;
375 const std::vector<dealii::Quadrature<dim - 1>> &
376 get_face_quadratures() const;
382 dealii::MatrixFree<dim, number, VectorizedArrayType> &
389 const dealii::MatrixFree<dim, number, VectorizedArrayType> &
390 get_matrix_free() const;
397 const dealii::DoFHandler<dim, spacedim> &
398 get_dof_handler(const unsigned int dof_idx) const;
405 dealii::DoFHandler<dim, spacedim> &
406 get_dof_handler(const unsigned int dof_idx);
412 const std::vector<const dealii::DoFHandler<dim, spacedim> *> &
413 get_dof_handlers() const;
420 const dealii::Triangulation<dim> &
421 get_triangulation(const unsigned int dof_idx = 0) const;
428 unsigned int
429 get_n_dofs_per_cell(const unsigned int dof_idx) const;
430
437 unsigned int
438 get_degree(const unsigned int dof_idx) const;
445 unsigned int
446 get_n_q_points(const unsigned int dof_idx) const;
454 const number &
455 get_min_cell_size() const;
466 number
467 get_min_cell_size(const unsigned int dof_idx) const;
468
474 const number &
475 get_max_cell_size() const;
476
482 const number &
483 get_min_diameter() const;
484
493 const dealii::AlignedVector<dealii::VectorizedArray<number>> &
494 get_cell_sizes() const;
495
502 MPI_Comm
503 get_mpi_comm(const unsigned int dof_idx = 0) const;
510 const dealii::IndexSet &
511 get_locally_owned_dofs(const unsigned int dof_idx) const;
512
519 const dealii::IndexSet &
520 get_locally_relevant_dofs(const unsigned int dof_idx) const;
521
528 const std::shared_ptr<dealii::Utilities::MPI::Partitioner> &
529 get_partitioner(const unsigned int dof_idx) const;
540 get_pcout(const unsigned int level = 1) const;
541
551 unsigned int
552 get_cell_range_category(const std::pair<unsigned, unsigned> &cell_range) const;
553
563 std::pair<unsigned int, unsigned int>
564 get_face_range_category(const std::pair<unsigned, unsigned> &face_range) const;
565
572 bool
573 is_hex_mesh(const unsigned int dof_idx = 0) const;
574
584 bool
585 is_FE_Q_iso_Q_1(const unsigned int dof_idx, const unsigned int component = 0) const;
586
596 bool
597 is_FE_DGQ(const unsigned int dof_idx, const unsigned int component = 0) const;
598
607 CutUtil::CutPhaseType
608 get_cut_type(const unsigned int dof_idx) const;
609
615 dealii::TimerOutput &
616 get_timer() const;
617
627 dealii::Utilities::MPI::RemotePointEvaluation<dim, dim> &
628 get_remote_point_evaluation(const unsigned int dof_idx) const;
629
637
645
646 private:
648 std::vector<dealii::ConditionalOStream> pcout;
649 std::shared_ptr<dealii::Mapping<dim, spacedim>> mapping;
650 std::vector<const dealii::DoFHandler<dim, spacedim> *> dof_handler;
651 std::vector<const dealii::AffineConstraints<number> *> constraint;
652 std::vector<dealii::Quadrature<dim>> quad;
653 std::vector<dealii::Quadrature<dim - 1>> face_quad;
655 number max_cell_size; // only computed in case of matrixfree
657 dealii::AlignedVector<dealii::VectorizedArray<number>> cell_sizes;
658 std::vector<dealii::IndexSet> locally_owned_dofs;
659 std::vector<dealii::IndexSet> locally_relevant_dofs;
660 std::vector<std::shared_ptr<dealii::Utilities::MPI::Partitioner>> partitioner;
661 std::map<unsigned int, std::shared_ptr<dealii::Utilities::MPI::RemotePointEvaluation<dim, dim>>>
663 const unsigned int verbosity_level;
664
665 mutable std::shared_ptr<dealii::TimerOutput> timer;
666
667 dealii::MatrixFree<dim, number, VectorizedArrayType> matrix_free;
668
676 void
677 create_pcout(MPI_Comm mpi_communicator);
678 };
679} // namespace MeltPoolDG
Definition conditional_ostream.hpp:7
Container for shared scratch data between operations/operators.
Definition scratch_data.hpp:61
dealii::MatrixFree< dim, number, VectorizedArrayType > matrix_free
Definition scratch_data.hpp:667
bool is_FE_Q_iso_Q_1(const unsigned int dof_idx, const unsigned int component=0) const
Check whether a given component uses FE_Q_iso_Q1.
Definition scratch_data.cpp:581
dealii::Utilities::MPI::RemotePointEvaluation< dim, dim > & get_remote_point_evaluation(const unsigned int dof_idx) const
Access the RemotePointEvaluation object for a given DoF index.
Definition scratch_data.cpp:615
std::pair< unsigned int, unsigned int > get_face_range_category(const std::pair< unsigned, unsigned > &face_range) const
Get the face range category for a given face range.
Definition scratch_data.cpp:566
unsigned int attach_dof_handler(const dealii::DoFHandler< dim, spacedim > &dof_handler)
Attach a DoFHandler and return its index.
Definition scratch_data.cpp:85
const ConditionalOStream get_pcout(const unsigned int level=1) const
Get a ConditionalOStream associated with a given verbosity level.
Definition scratch_data.cpp:550
void clear()
Clear all attached data and reset to the default-constructed state.
Definition scratch_data.cpp:325
std::vector< const dealii::AffineConstraints< number > * > constraint
Definition scratch_data.hpp:651
void create_partitioning()
Build partitioning and cell-size information for all attached DoFHandlers.
Definition scratch_data.cpp:149
void set_mapping(const dealii::Mapping< dim, spacedim > &mapping)
Set the mapping by value.
Definition scratch_data.cpp:70
const std::shared_ptr< dealii::Utilities::MPI::Partitioner > & get_partitioner(const unsigned int dof_idx) const
Get the partitioner object for a given DoFHandler index.
Definition scratch_data.cpp:543
const number & get_max_cell_size() const
Get the global maximum cell size.
Definition scratch_data.cpp:501
void create_remote_point_evaluation(const unsigned int dof_idx, const std::function< std::vector< bool >()> &marked_vertices={})
Create a dealii::Utilities::MPI::RemotePointEvaluation object for a given DoF index,...
Definition scratch_data.cpp:342
dealii::LinearAlgebra::distributed::Vector< number > VectorType
Definition scratch_data.hpp:64
unsigned int get_n_dofs_per_cell(const unsigned int dof_idx) const
Get the number of DoFs per cell for a given DoFHandler index.
Definition scratch_data.cpp:466
void initialize_bc_vector(VectorType &vec, const unsigned int dof_idx) const
Initialize a vector and distribute constraints for a given DoF index.
Definition scratch_data.cpp:306
number max_cell_size
Definition scratch_data.hpp:655
std::shared_ptr< dealii::TimerOutput > timer
Definition scratch_data.hpp:665
MPI_Comm get_mpi_comm(const unsigned int dof_idx=0) const
Get the MPI communicator for a given DoFHandler.
Definition scratch_data.cpp:522
unsigned int get_cell_range_category(const std::pair< unsigned, unsigned > &cell_range) const
Get the cell range category for a given cell range.
Definition scratch_data.cpp:558
const dealii::IndexSet & get_locally_owned_dofs(const unsigned int dof_idx) const
Get the set of locally owned DoFs for a given DoFHandler index.
Definition scratch_data.cpp:529
CutUtil::CutPhaseType get_cut_type(const unsigned int dof_idx) const
Get the cut-cell phase type for a given DoFHandler.
Definition scratch_data.cpp:600
number min_diameter
Definition scratch_data.hpp:656
const dealii::Quadrature< dim > & get_quadrature(const unsigned int quad_index) const
Get a cell quadrature rule by index.
Definition scratch_data.cpp:396
const dealii::DoFHandler< dim, spacedim > & get_dof_handler(const unsigned int dof_idx) const
Get a DoFHandler by index (const overload).
Definition scratch_data.cpp:438
dealii::LinearAlgebra::distributed::BlockVector< number > BlockVectorType
Definition scratch_data.hpp:65
std::vector< const dealii::DoFHandler< dim, spacedim > * > dof_handler
Definition scratch_data.hpp:650
bool is_hex_mesh(const unsigned int dof_idx=0) const
Check whether the underlying mesh is a pure hypercube mesh.
Definition scratch_data.cpp:574
const number & get_min_diameter() const
Get the minimal cell diameter over the triangulation.
Definition scratch_data.cpp:508
unsigned int attach_dof_handler_and_constraint(const dealii::DoFHandler< dim, spacedim > &dof_handler, const dealii::AffineConstraints< number > &constraint)
Attach a DoFHandler and its corresponding constraint matrix.
Definition scratch_data.cpp:103
const std::vector< const dealii::DoFHandler< dim, spacedim > * > & get_dof_handlers() const
Get the vector of all attached DoFHandlers.
Definition scratch_data.cpp:452
bool is_FE_DGQ(const unsigned int dof_idx, const unsigned int component=0) const
Check whether a given component uses FE_DGQ.
Definition scratch_data.cpp:591
const dealii::Mapping< dim, spacedim > & get_mapping() const
Access the stored mapping.
Definition scratch_data.cpp:361
const dealii::Triangulation< dim > & get_triangulation(const unsigned int dof_idx=0) const
Get the triangulation associated with a given DoFHandler index.
Definition scratch_data.cpp:459
void build(const bool enable_boundary_face_loops, const bool enable_inner_face_loops, const bool enable_normal_vector_update=false, const bool enable_inner_face_hessians_update=false)
Build matrix-free and mapping-related data structures.
Definition scratch_data.cpp:192
unsigned int attach_constraint_matrix(const dealii::AffineConstraints< number > &constraint)
Attach a constraint matrix and return its index.
Definition scratch_data.cpp:94
std::vector< dealii::Quadrature< dim > > quad
Definition scratch_data.hpp:652
const dealii::FiniteElement< dim, spacedim > & get_fe(const unsigned int fe_index) const
Get the finite element associated with a given DoF index.
Definition scratch_data.cpp:368
unsigned int get_degree(const unsigned int dof_idx) const
Get the polynomial degree of the finite element at a given DoF index.
Definition scratch_data.cpp:473
std::vector< dealii::IndexSet > locally_owned_dofs
Definition scratch_data.hpp:658
void initialize_dof_vector(VectorType &vec, const unsigned int dof_idx) const
Initialize a distributed vector for a given DoF index.
Definition scratch_data.cpp:272
std::vector< dealii::Quadrature< dim - 1 > > face_quad
Definition scratch_data.hpp:653
const dealii::Quadrature< dim - 1 > & get_face_quadrature(const unsigned int quad_index) const
Get a face quadrature rule corresponding to a given cell rule.
Definition scratch_data.cpp:410
unsigned int get_n_q_points(const unsigned int dof_idx) const
Get the number of quadrature points for a given quadrature index.
Definition scratch_data.cpp:480
const std::vector< dealii::Quadrature< dim > > & get_quadratures() const
Get all stored cell quadrature rules.
Definition scratch_data.cpp:403
bool do_matrix_free
Definition scratch_data.hpp:647
number min_cell_size
Definition scratch_data.hpp:654
const std::vector< const dealii::AffineConstraints< number > * > & get_constraints() const
Get the list of all attached constraint matrices.
Definition scratch_data.cpp:389
std::map< unsigned int, std::shared_ptr< dealii::Utilities::MPI::RemotePointEvaluation< dim, dim > > > rpe
Definition scratch_data.hpp:662
void create_pcout(MPI_Comm mpi_communicator)
Helper function that (re)creates the internal ConditionalOStreams.
Definition scratch_data.cpp:626
bool enable_boundary_faces
Flag indicating whether boundary-face matrix-free loops are enabled.
Definition scratch_data.hpp:636
dealii::MatrixFree< dim, number, VectorizedArrayType > & get_matrix_free()
Access the internal MatrixFree object (non-const).
Definition scratch_data.cpp:424
dealii::TimerOutput & get_timer() const
Access the timer associated with this scratch data object.
Definition scratch_data.cpp:608
const std::vector< dealii::Quadrature< dim - 1 > > & get_face_quadratures() const
Get all stored face quadrature rules.
Definition scratch_data.cpp:417
bool enable_inner_faces
Flag indicating whether interior-face matrix-free loops are enabled.
Definition scratch_data.hpp:644
const unsigned int verbosity_level
Definition scratch_data.hpp:663
const dealii::AffineConstraints< number > & get_constraint(const unsigned int constraint_index) const
Get a constraint object by index (const overload).
Definition scratch_data.cpp:375
std::vector< dealii::IndexSet > locally_relevant_dofs
Definition scratch_data.hpp:659
const dealii::IndexSet & get_locally_relevant_dofs(const unsigned int dof_idx) const
Get the set of locally relevant DoFs for a given DoFHandler index.
Definition scratch_data.cpp:536
const number & get_min_cell_size() const
Get the global minimum cell size.
Definition scratch_data.cpp:487
const dealii::AlignedVector< dealii::VectorizedArray< number > > & get_cell_sizes() const
Get the vector of cell sizes used by the MatrixFree object.
Definition scratch_data.cpp:515
std::vector< std::shared_ptr< dealii::Utilities::MPI::Partitioner > > partitioner
Definition scratch_data.hpp:660
void reinit(const dealii::Mapping< dim, spacedim > &mapping, const std::vector< const dealii::DoFHandler< dim, spacedim > * > &dof_handler, const std::vector< const dealii::AffineConstraints< number > * > &constraint, const std::vector< dealii::Quadrature< dim > > &quad, const bool enable_boundary_face_loops, const bool enable_inner_face_loops, const bool enable_normal_vector_update=false)
Set up mapping, DoFHandlers, constraints, quadrature rules and matrix-free data in a single call.
Definition scratch_data.cpp:39
dealii::AlignedVector< dealii::VectorizedArray< number > > cell_sizes
Definition scratch_data.hpp:657
dealii::VectorizedArray< number > VectorizedArrayType
Definition scratch_data.hpp:63
std::shared_ptr< dealii::Mapping< dim, spacedim > > mapping
Definition scratch_data.hpp:649
unsigned int attach_quadrature(const dealii::Quadrature< dim > &quadrature)
Attach a cell quadrature rule and create a corresponding face rule.
Definition scratch_data.cpp:117
std::vector< dealii::ConditionalOStream > pcout
Definition scratch_data.hpp:648
Interface for a general preconditioner.
Definition boundary_condition_functions.hpp:17