include/meltpooldg/level_set/normal_vector_operator.hpp Source File

Developer Documentation: include/meltpooldg/level_set/normal_vector_operator.hpp Source File
Developer Documentation
normal_vector_operator.hpp
Go to the documentation of this file.
1#pragma once
2// for parallelization
3#include <deal.II/lac/generic_linear_algebra.h>
4#include <deal.II/lac/la_parallel_block_vector.h>
5#include <deal.II/lac/la_parallel_vector.h>
6
7#include <deal.II/matrix_free/fe_evaluation.h>
8#include <deal.II/matrix_free/matrix_free.h>
9// MeltPoolDG
13
15{
16 template <int dim, typename number>
17 class NormalVectorOperator : public OperatorMatrixFree<dim, number>,
18 public OperatorMatrixBased<dim, number>
19 {
20 //@todo: to avoid compiler warnings regarding hidden overriden functions
22 using OperatorMatrixFree<dim, number>::vmult;
23 using OperatorMatrixFree<dim, number>::create_rhs;
25
26 public:
27 using VectorType = dealii::LinearAlgebra::distributed::Vector<number>;
28 using BlockVectorType = dealii::LinearAlgebra::distributed::BlockVector<number>;
29 using VectorizedArrayType = dealii::VectorizedArray<number>;
30 using SparseMatrixType = dealii::TrilinosWrappers::SparseMatrix;
31
33 const NormalVectorData<number> &normal_vector_data_in,
34 const std::array<unsigned int, dim> &normal_dof_indices_per_block_in,
35 const unsigned int normal_quad_idx_in,
36 const unsigned int ls_dof_idx_in,
37 const VectorType *solution_level_set_in = nullptr);
38
39 void
40 compute_system_matrix_and_rhs(const VectorType &level_set_in, BlockVectorType &rhs) const final;
41
42 /*
43 * matrix-free utility
44 */
45
46 void
47 vmult(BlockVectorType &dst, const BlockVectorType &src) const final;
48
49 void
50 create_rhs(BlockVectorType &dst, const VectorType &src) const final;
51
52 void
54 dealii::TrilinosWrappers::SparseMatrix &system_matrix) const final;
55
56 void
58
59 static void
61 const dealii::FEValues<dim> &fe_values,
62 const BlockVectorType &normal_vector_field_in,
63 std::vector<dealii::Tensor<1, dim, number>> &unit_normal_at_quadrature,
64 const number zero = 1e-16);
65 void
66 reinit() final;
67
68 private:
69 void
70 tangent_local_cell_operation(FECellIntegrator<dim, 1, number> &normal_vals,
71 FECellIntegrator<dim, 1, number> &level_set_vals,
72 const bool do_reinit_cells) const;
73
74 private:
75 const ScratchData<dim, dim, number> &scratch_data;
77
78 const std::array<unsigned int, dim> normal_dof_indices_per_block;
79 const unsigned int normal_quad_idx;
80 const unsigned int ls_dof_idx;
81
82 // optional parameters for narrow band
84
85 dealii::AlignedVector<dealii::VectorizedArray<number>> damping;
86 };
87
99 template <int dim, typename number>
100 inline dealii::VectorizedArray<number>
102 const unsigned int dof_idx,
103 const unsigned int cell_idx,
104 const number scale_factor)
105 {
106 const number n_subdivisions =
108 return dealii::Utilities::fixed_power<2>(
109 std::max(dealii::VectorizedArray<number>(scratch_data.get_min_cell_size()),
110 scratch_data.get_cell_sizes()[cell_idx] / (number)n_subdivisions)) *
111 scale_factor;
112 }
113
123 template <int dim, typename number, typename cell_type>
124 number
126 const unsigned int dof_idx,
127 const cell_type cell,
128 const number scale_factor)
129 {
130 const number n_subdivisions =
132
133 return dealii::Utilities::fixed_power<2>(
135 cell->diameter() / (std::sqrt(dim) * n_subdivisions))) *
136 scale_factor;
137 }
138} // namespace MeltPoolDG::LevelSet
Definition normal_vector_operator.hpp:19
dealii::LinearAlgebra::distributed::Vector< number > VectorType
Definition normal_vector_operator.hpp:27
void reinit() final
Reinitialize data structures. Can be overridden by derived classes.
Definition normal_vector_operator.cpp:388
void create_rhs(BlockVectorType &dst, const VectorType &src) const final
Compute the right-hand side vector for block vectors dst.
Definition normal_vector_operator.cpp:161
void compute_inverse_diagonal_from_matrixfree(BlockVectorType &diagonal) const final
Compute the inverse diagonal using matrix-free techniques for block vectors.
Definition normal_vector_operator.cpp:276
const std::array< unsigned int, dim > normal_dof_indices_per_block
Definition normal_vector_operator.hpp:78
void compute_system_matrix_from_matrixfree(dealii::TrilinosWrappers::SparseMatrix &system_matrix) const final
Compute a sparse matrix using matrix-free techniques.
Definition normal_vector_operator.cpp:243
dealii::AlignedVector< dealii::VectorizedArray< number > > damping
Definition normal_vector_operator.hpp:85
void compute_system_matrix_and_rhs(const VectorType &level_set_in, BlockVectorType &rhs) const final
Compute the system matrix and right-hand side block vector.
Definition normal_vector_operator.cpp:31
static void get_unit_normals_at_quadrature(const dealii::FEValues< dim > &fe_values, const BlockVectorType &normal_vector_field_in, std::vector< dealii::Tensor< 1, dim, number > > &unit_normal_at_quadrature, const number zero=1e-16)
Definition normal_vector_operator.cpp:362
dealii::TrilinosWrappers::SparseMatrix SparseMatrixType
Definition normal_vector_operator.hpp:30
const NormalVectorData< number > & normal_vector_data
Definition normal_vector_operator.hpp:76
const VectorType * solution_level_set
Definition normal_vector_operator.hpp:83
dealii::LinearAlgebra::distributed::BlockVector< number > BlockVectorType
Definition normal_vector_operator.hpp:28
void tangent_local_cell_operation(FECellIntegrator< dim, 1, number > &normal_vals, FECellIntegrator< dim, 1, number > &level_set_vals, const bool do_reinit_cells) const
Definition normal_vector_operator.cpp:326
const unsigned int ls_dof_idx
Definition normal_vector_operator.hpp:80
void vmult(BlockVectorType &dst, const BlockVectorType &src) const final
Definition normal_vector_operator.cpp:126
const ScratchData< dim, dim, number > & scratch_data
Definition normal_vector_operator.hpp:75
const unsigned int normal_quad_idx
Definition normal_vector_operator.hpp:79
dealii::VectorizedArray< number > VectorizedArrayType
Definition normal_vector_operator.hpp:29
unsigned int dof_idx
Definition operator_base.hpp:77
Operator handling matrix-based computations.
Definition operator_base.hpp:94
SparseMatrixType system_matrix
Definition operator_base.hpp:176
Operator handling matrix-free computations.
Definition operator_base.hpp:190
Container for shared scratch data between operations/operators.
Definition scratch_data.hpp:61
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
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
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
This operation solves the reinitialization problem for a CG- or DG-FEM-based discrete level-set field...
Definition advection_DG_operation.hpp:20
number compute_cell_size_dependent_filter_parameter(const ScratchData< dim, dim, number > &scratch_data, const unsigned int dof_idx, const cell_type cell, const number scale_factor)
Definition normal_vector_operator.hpp:125
dealii::VectorizedArray< number > compute_cell_size_dependent_filter_parameter_mf(const ScratchData< dim, dim, number > &scratch_data, const unsigned int dof_idx, const unsigned int cell_idx, const number scale_factor)
Definition normal_vector_operator.hpp:101
dealii::FEEvaluation< dim, -1, 0, n_components, number, VectorizedArrayType > FECellIntegrator
Definition fe_integrator.hpp:14
Definition dealii_tensor.hpp:10
Definition normal_vector_data.hpp:15