include/meltpooldg/utilities/vector_tools.templates.hpp Source File

Developer Documentation: include/meltpooldg/utilities/vector_tools.templates.hpp Source File
Developer Documentation
vector_tools.templates.hpp
Go to the documentation of this file.
1#pragma once
2
4//
5#include <deal.II/base/exceptions.h>
6#include <deal.II/base/types.h>
7
8#include <deal.II/lac/solver_cg.h>
9#include <deal.II/lac/solver_control.h>
10#include <deal.II/lac/vector_operation.h>
11
12#include <deal.II/matrix_free/operators.h>
13
14#include <type_traits>
15#include <vector>
16
18{
19 template <int dim, typename number>
20 dealii::VectorizedArray<number>
22 const dealii::Function<dim> &function,
23 const dealii::Point<dim, dealii::VectorizedArray<number>> &p_vectorized,
24 const unsigned int component)
25 {
26 dealii::VectorizedArray<number> result;
27 for (unsigned int v = 0; v < dealii::VectorizedArray<number>::size(); ++v)
28 {
29 dealii::Point<dim> p;
30 for (unsigned int d = 0; d < dim; ++d)
31 p[d] = p_vectorized[d][v];
32 result[v] = function.value(p, component);
33 }
34 return result;
35 }
36
37 template <int dim, typename number, int n_components>
38 dealii::Tensor<1, n_components, dealii::VectorizedArray<number>>
40 const dealii::Function<dim> &func,
41 const dealii::Point<dim, dealii::VectorizedArray<number>> &points)
42 {
43 AssertDimension(func.n_components, n_components);
44
45 dealii::Tensor<1, n_components, dealii::VectorizedArray<number>> vec;
46
47 for (unsigned int v = 0; v < dealii::VectorizedArray<number>::size(); ++v)
48 {
49 dealii::Point<dim> point_v;
50
51 for (unsigned int d = 0; d < dim; ++d)
52 point_v[d] = points[d][v];
53
54 for (unsigned int d = 0; d < n_components; ++d)
55 vec[d][v] = func.value(point_v, d);
56 }
57 return vec;
58 }
59
60 template <int dim, int n_components, typename T, typename VectorType, typename number>
61 void
63 VectorType &vec,
64 const dealii::MatrixFree<dim, number, dealii::VectorizedArray<number>> &matrix_free,
65 unsigned int dof_idx,
66 unsigned int quad_idx,
67 const T &cell_operation)
68 {
69 FECellIntegrator<dim, n_components, number> fe_eval(matrix_free, dof_idx, quad_idx);
70
71 dealii::MatrixFreeOperators::
72 CellwiseInverseMassMatrix<dim, -1, n_components, number, dealii::VectorizedArray<number>>
73 inverse_mass_matrix(fe_eval);
74
75 const auto &lexicographic_numbering =
76 matrix_free.get_shape_info(dof_idx, quad_idx).lexicographic_numbering;
77
78 VectorType weights;
79 weights.reinit(vec);
80 std::vector<number> ones(fe_eval.dofs_per_cell, 1.0);
81
82 std::vector<dealii::types::global_dof_index> dof_indices(fe_eval.dofs_per_cell);
83 std::vector<dealii::types::global_dof_index> dof_indices_mf(fe_eval.dofs_per_cell);
84 std::vector<number> dof_values(fe_eval.dofs_per_cell);
85
86 dealii::AffineConstraints<number> dummy;
87
88 vec = 0.0;
89
90 for (unsigned int cell = 0; cell < matrix_free.n_cell_batches(); ++cell)
91 {
92 fe_eval.reinit(cell);
93
94 for (unsigned int q = 0; q < fe_eval.n_q_points; ++q)
95 {
96 const auto temp = cell_operation(cell, q);
97 for (int c = 0; c < n_components; ++c)
98 if constexpr (std::is_same<typename std::remove_const<decltype(temp)>::type,
99 dealii::VectorizedArray<number>>::value)
100 {
101 static_assert(n_components == 1,
102 "The path should be only accessed for a single component.");
103 fe_eval.begin_values()[q] = temp;
104 }
105 else if constexpr (
106 std::is_same<
107 typename std::remove_const<decltype(temp)>::type,
108 dealii::Tensor<1, n_components, dealii::VectorizedArray<number>>>::value)
109 {
110 fe_eval.begin_values()[c * fe_eval.n_q_points + q] = temp[c];
111 }
112 else
113 {
114 Assert(false, dealii::ExcNotImplemented());
115 }
116 }
117 inverse_mass_matrix.transform_from_q_points_to_basis(n_components,
118 fe_eval.begin_values(),
119 fe_eval.begin_dof_values());
120
121 for (unsigned int v = 0; v < matrix_free.n_active_entries_per_cell_batch(cell); ++v)
122 {
123 matrix_free.get_cell_iterator(cell, v, dof_idx)->get_dof_indices(dof_indices);
124
125 for (unsigned int j = 0; j < dof_indices.size(); ++j)
126 {
127 dof_indices_mf[j] = dof_indices[lexicographic_numbering[j]];
128 dof_values[j] = fe_eval.begin_dof_values()[j][v];
129 }
130
131 dummy.distribute_local_to_global(dof_values, dof_indices_mf, vec);
132 dummy.distribute_local_to_global(ones, dof_indices_mf, weights);
133 }
134 }
135
136 vec.compress(dealii::VectorOperation::add);
137 weights.compress(dealii::VectorOperation::add);
138
139 for (unsigned int i = 0; i < vec.locally_owned_size(); ++i)
140 if (weights.local_element(i) != 0.0)
141 vec.local_element(i) /= weights.local_element(i);
142 }
143
144 template <int n_components, int dim, typename VectorType>
145 void
146 project_vector(const dealii::Mapping<dim> &mapping,
147 const dealii::DoFHandler<dim> &dof,
148 const dealii::AffineConstraints<typename VectorType::value_type> &constraints,
149 const dealii::Quadrature<dim> &quadrature,
150 const VectorType &vec_in,
151 VectorType &vec_out)
152 {
153 using number = typename VectorType::value_type;
154
155 typename dealii::MatrixFree<dim, number>::AdditionalData additional_data;
156 additional_data.tasks_parallel_scheme =
157 dealii::MatrixFree<dim, number>::AdditionalData::partition_color;
158 additional_data.mapping_update_flags = dealii::update_values | dealii::update_JxW_values;
159
160 const auto matrix_free = std::make_shared<dealii::MatrixFree<dim, number>>();
161 matrix_free->reinit(mapping, dof, constraints, quadrature, additional_data);
162
163 using MatrixType =
164 dealii::MatrixFreeOperators::MassOperator<dim, -1, 0, n_components, VectorType>;
165 MatrixType mass_matrix;
166 mass_matrix.initialize(matrix_free);
167
168 mass_matrix.compute_diagonal();
169
170 dealii::ReductionControl control(6 * vec_in.size(), 0., 1e-12, false, false);
171 dealii::SolverCG<VectorType> cg(control);
172 const dealii::DiagonalMatrix<VectorType> &preconditioner =
173 *mass_matrix.get_matrix_diagonal_inverse();
174
175 cg.solve(mass_matrix, vec_out, vec_in, preconditioner);
176 }
177} // namespace MeltPoolDG::VectorTools
Definition vector_tools.hpp:29
dealii::Tensor< 1, n_components, dealii::VectorizedArray< number > > evaluate_function_at_vectorized_points(const dealii::Function< dim > &func, const dealii::Point< dim, dealii::VectorizedArray< number > > &points)
Definition vector_tools.templates.hpp:39
void project_vector(const dealii::Mapping< dim > &mapping, const dealii::DoFHandler< dim > &dof, const dealii::AffineConstraints< typename VectorType::value_type > &constraints, const dealii::Quadrature< dim > &quadrature, const VectorType &vec_in, VectorType &vec_out)
Definition vector_tools.templates.hpp:146
void fill_dof_vector_from_cell_operation(VectorType &vec, const dealii::MatrixFree< dim, number, dealii::VectorizedArray< number > > &matrix_free, unsigned int dof_idx, unsigned int quad_idx, const T &cell_operation)
Definition vector_tools.templates.hpp:62
dealii::FEEvaluation< dim, -1, 0, n_components, number, VectorizedArrayType > FECellIntegrator
Definition fe_integrator.hpp:14