include/meltpooldg/heat/heat_cut_operator.hpp Source File

Developer Documentation: include/meltpooldg/heat/heat_cut_operator.hpp Source File
Developer Documentation
heat_cut_operator.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/base/function.h>
4#include <deal.II/base/tensor.h>
5#include <deal.II/base/vectorization.h>
6
7#include <deal.II/fe/fe_q.h>
8#include <deal.II/fe/fe_system.h>
9
10#include <deal.II/matrix_free/fe_point_evaluation.h>
11#include <deal.II/matrix_free/matrix_free.h>
12
13#include <deal.II/non_matching/mapping_info.h>
14
23
24#include <memory>
25#include <utility>
26#include <vector>
27
28
29namespace MeltPoolDG::Heat
30{
31 template <int dim, typename number>
32 class HeatCutOperator : public OperatorMatrixFree<dim, number>
33 {
34 private:
35 // to avoid compiler warnings regarding hidden overridden functions
36 using OperatorMatrixFree<dim, number>::vmult;
37 using OperatorMatrixFree<dim, number>::create_rhs;
39
40 template <int n_components = 1>
42 template <int n_components = 1>
43 using PointEval =
44 dealii::FEPointEvaluation<n_components, dim, dim, dealii::VectorizedArray<number>>;
46
49
53
54 // ScratchData's DoFHandler indices for ..
55 const unsigned int heat_cut_dof_idx; // .. CutFEM DoFs with Dirichlet BCs
56 const unsigned int heat_cut_no_bc_dof_idx; // .. CutFEM DoFs without Dirichlet BCs
57 const unsigned int heat_continuous_no_bc_dof_idx; // .. continuous DoFs without Dirichlet BCs
58 // ScratchData's Quadrature index
59 const unsigned int heat_quad_idx;
60
62
63 dealii::NonMatching::MappingInfo<dim, dim, dealii::VectorizedArray<number>>
65 const std::vector<
66 std::shared_ptr<dealii::NonMatching::MappingInfo<dim, dim, dealii::VectorizedArray<number>>>>
68
69 // use FE_Q for FEPointEvaluation (DoF numbering reasons)
70 const dealii::FE_Q<dim> reference_finite_element_heat;
71 const unsigned int n_dofs_per_cell_heat;
72 const dealii::FESystem<dim> reference_finite_element_vel;
73 const unsigned int n_dofs_per_cell_vel;
74
75 // coefficients for weighted average operator for two-phase case
76 const number kappa_l;
77 const number kappa_g;
78
79 static constexpr unsigned int n_lanes = dealii::VectorizedArray<number>::size();
80
81 // weighted averaged Nitsche term factor for two-phase case
83
84 number cell_side_length = 0.;
85 number ost_factor_implicit; // delta_t * theta
86 number ost_factor_explicit; // delta_t * (1. - theta)
87 number nitsche_factor; // delta_t * gamma_Gamma / h
88
89 // TODO boundary conditions, radiation etc.
90
91 // optional: evaporative heat cooling
92 std::unique_ptr<Evaporation::EvaporativeCooling<number>> evapor_cooling;
93
94 // optional: laser intensity and direction
95 std::shared_ptr<const dealii::Function<dim, number>> laser_intensity_profile;
96 dealii::Tensor<1, dim, number> laser_direction;
97
98 // optional: flow velocity for internal convection
99 const unsigned int vel_dof_idx;
102
103 // optional: melting/solidification effects
105
106 public:
107 HeatCutOperator(const ScratchData<dim, dim, number> &scratch_data_in,
108 const HeatData<number> &heat_data_in,
109 const MaterialData<number> &material_data_in,
110 const Evaporation::EvaporationData<number> &evapor_data_in,
111 const unsigned int heat_cut_dof_idx_in,
112 const unsigned int heat_cut_no_bc_dof_idx_in,
113 const unsigned int heat_continuous_no_bc_dof_idx_in,
114 const unsigned int heat_quad_idx_in,
115 const VectorType &temperature_in,
116 dealii::NonMatching::MappingInfo<dim, dim, dealii::VectorizedArray<number>>
117 &mapping_info_surface_in,
118 const std::vector<std::shared_ptr<
119 dealii::NonMatching::MappingInfo<dim, dim, dealii::VectorizedArray<number>>>>
120 &mapping_info_cells_in,
121 const bool do_solidification_in,
122 const unsigned int vel_dof_idx_in = -1,
123 const VectorType *velocity_in = nullptr,
124 const VectorType *velocity_old_in = nullptr);
125
126 void
128 std::shared_ptr<const dealii::Function<dim, number>> laser_intensity_profile_in,
129 const dealii::Tensor<1, dim, number> &laser_direction_in);
130
131 void
132 reinit() final;
133
134 void
135 init_time_advance(const double dt);
136
137 void
138 update_ghost_values() const;
139
140 /*
141 * matrix-free implementation
142 */
143 void
144 vmult(VectorType &dst, const VectorType &src) const final;
145
146 void
148
149 void
151 dealii::TrilinosWrappers::SparseMatrix &system_matrix) const final;
152
156 void
157 create_rhs(VectorType &residual, const VectorType &temperature_old) const final;
158
159 private:
160 dealii::VectorizedArray<number>
161 compute_qVapor(const dealii::VectorizedArray<number> &T) const;
162
163 dealii::VectorizedArray<number>
164 compute_qVapor_derivative(const dealii::VectorizedArray<number> &T) const;
165
166 /*
167 * Local appliers for consistent tangent modulus
168 */
169 void
170 tangent_cell_operation_liquid(const unsigned int cell_batch,
171 DomainEval<> &eval_l,
172 DomainEval<> *T_eval_l,
173 DomainEval<dim> *vel_eval,
174 const bool do_reinit_cell = true) const;
175
176 void
177 tangent_cell_operation_gas(const unsigned int cell_batch,
178 DomainEval<> &eval_g,
179 DomainEval<dim> *vel_eval,
180 const bool do_reinit_cell = true) const;
181
182 void
183 tangent_cell_operation_intersected_one_phase(const unsigned int cell_batch,
184 DomainEval<> &eval_cell_l,
185 PointEval<> &eval_subdomain_l,
186 PointEval<> *eval_interface_l,
187 DomainEval<> *T_eval_cell_l,
188 PointEval<> *T_eval_subdomain_l,
189 PointEval<> *T_eval_interface_l,
190 DomainEval<dim> *vel_eval,
191 PointEval<dim> *vel_eval_subdomain_l,
192 const bool do_reinit_cell = true) const;
193
194 void
195 tangent_cell_operation_intersected_two_phase(const unsigned int cell_batch,
196 DomainEval<> &eval_cell_l,
197 DomainEval<> &eval_cell_g,
198 PointEval<> &eval_subdomain_l,
199 PointEval<> &eval_subdomain_g,
200 PointEval<> &eval_interface_l,
201 PointEval<> &eval_interface_g,
202 DomainEval<> *T_eval_cell_l,
203 DomainEval<> *T_eval_cell_g,
204 PointEval<> *T_eval_subdomain_l,
205 PointEval<> *T_eval_interface_l,
206 PointEval<> *T_eval_interface_g,
207 DomainEval<dim> *vel_eval,
208 PointEval<dim> *vel_eval_subdomain_l,
209 PointEval<dim> *vel_eval_subdomain_g,
210 const bool do_reinit_cell = true) const;
211
212 void
214 const dealii::MatrixFree<dim, number, dealii::VectorizedArray<number>> &matrix_free_in,
215 VectorType &dst,
216 const VectorType &src,
217 const std::pair<unsigned int, unsigned int> &cell_batch_range) const;
218
219 void
221 const dealii::MatrixFree<dim, number, dealii::VectorizedArray<number>> &matrix_free_in,
222 VectorType &dst,
223 const VectorType &src,
224 const std::pair<unsigned int, unsigned int> &face_batch_range) const;
225
226 void
228 const dealii::MatrixFree<dim, number, dealii::VectorizedArray<number>> &matrix_free_in,
229 VectorType &dst,
230 const VectorType &src,
231 const std::pair<unsigned int, unsigned int> &face_batch_range) const;
232
233 /*
234 * Local appliers for residual
235 */
236 void
238 const dealii::MatrixFree<dim, number, dealii::VectorizedArray<number>> &matrix_free,
239 VectorType &residual,
240 const VectorType &temperature_new,
241 const std::pair<unsigned int, unsigned int> &cell_batch_range) const;
242
243 void
245 const dealii::MatrixFree<dim, number, dealii::VectorizedArray<number>> &matrix_free_in,
246 VectorType &residual,
247 const VectorType &temperature_new,
248 const std::pair<unsigned int, unsigned int> &face_batch_range) const;
249
250 void
252 const dealii::MatrixFree<dim, number, dealii::VectorizedArray<number>> &matrix_free_in,
253 VectorType &residual,
254 const VectorType &temperature_new,
255 const std::pair<unsigned int, unsigned int> &face_batch_range) const;
256
263 void
265 [[maybe_unused]] VectorType &diagonal,
266 [[maybe_unused]] dealii::TrilinosWrappers::SparseMatrix &system_matrix,
267 const bool do_diagonal) const;
268 };
269} // namespace MeltPoolDG::Heat
Definition heat_cut_operator.hpp:33
const unsigned int n_dofs_per_cell_vel
Definition heat_cut_operator.hpp:73
const VectorType * velocity_old
Definition heat_cut_operator.hpp:101
const std::vector< std::shared_ptr< dealii::NonMatching::MappingInfo< dim, dim, dealii::VectorizedArray< number > > > > & mapping_info_cells
Definition heat_cut_operator.hpp:67
void residual_inner_face_loop(const dealii::MatrixFree< dim, number, dealii::VectorizedArray< number > > &matrix_free_in, VectorType &residual, const VectorType &temperature_new, const std::pair< unsigned int, unsigned int > &face_batch_range) const
Definition heat_cut_operator.cpp:1990
number cell_side_length
Definition heat_cut_operator.hpp:84
const unsigned int vel_dof_idx
Definition heat_cut_operator.hpp:99
const VectorType & temperature
Definition heat_cut_operator.hpp:61
dealii::VectorizedArray< number > compute_qVapor_derivative(const dealii::VectorizedArray< number > &T) const
Definition heat_cut_operator.cpp:639
void init_time_advance(const double dt)
Definition heat_cut_operator.cpp:563
const unsigned int heat_quad_idx
Definition heat_cut_operator.hpp:59
std::unique_ptr< Evaporation::EvaporativeCooling< number > > evapor_cooling
Definition heat_cut_operator.hpp:92
void tangent_inner_face_loop(const dealii::MatrixFree< dim, number, dealii::VectorizedArray< number > > &matrix_free_in, VectorType &dst, const VectorType &src, const std::pair< unsigned int, unsigned int > &face_batch_range) const
Definition heat_cut_operator.cpp:1258
void residual_boundary_face_loop(const dealii::MatrixFree< dim, number, dealii::VectorizedArray< number > > &matrix_free_in, VectorType &residual, const VectorType &temperature_new, const std::pair< unsigned int, unsigned int > &face_batch_range) const
Definition heat_cut_operator.cpp:2124
void tangent_cell_operation_gas(const unsigned int cell_batch, DomainEval<> &eval_g, DomainEval< dim > *vel_eval, const bool do_reinit_cell=true) const
Definition heat_cut_operator.cpp:688
typename OperatorMatrixFree< dim, number >::SparseMatrixType SparseMatrixType
Definition heat_cut_operator.hpp:48
void compute_system_matrix_from_matrixfree(dealii::TrilinosWrappers::SparseMatrix &system_matrix) const final
Compute a sparse matrix using matrix-free techniques.
Definition heat_cut_operator.cpp:2158
std::shared_ptr< const dealii::Function< dim, number > > laser_intensity_profile
Definition heat_cut_operator.hpp:95
const unsigned int heat_continuous_no_bc_dof_idx
Definition heat_cut_operator.hpp:57
const unsigned int n_dofs_per_cell_heat
Definition heat_cut_operator.hpp:71
void reinit() final
Reinitialize data structures. Can be overridden by derived classes.
Definition heat_cut_operator.cpp:544
number ost_factor_implicit
Definition heat_cut_operator.hpp:85
void tangent_cell_operation_intersected_two_phase(const unsigned int cell_batch, DomainEval<> &eval_cell_l, DomainEval<> &eval_cell_g, PointEval<> &eval_subdomain_l, PointEval<> &eval_subdomain_g, PointEval<> &eval_interface_l, PointEval<> &eval_interface_g, DomainEval<> *T_eval_cell_l, DomainEval<> *T_eval_cell_g, PointEval<> *T_eval_subdomain_l, PointEval<> *T_eval_interface_l, PointEval<> *T_eval_interface_g, DomainEval< dim > *vel_eval, PointEval< dim > *vel_eval_subdomain_l, PointEval< dim > *vel_eval_subdomain_g, const bool do_reinit_cell=true) const
Definition heat_cut_operator.cpp:839
const HeatData< number > & heat_data
Definition heat_cut_operator.hpp:51
dealii::FEPointEvaluation< n_components, dim, dim, dealii::VectorizedArray< number > > PointEval
Definition heat_cut_operator.hpp:44
void register_laser_intensity_function_and_direction(std::shared_ptr< const dealii::Function< dim, number > > laser_intensity_profile_in, const dealii::Tensor< 1, dim, number > &laser_direction_in)
Definition heat_cut_operator.cpp:532
const unsigned int heat_cut_no_bc_dof_idx
Definition heat_cut_operator.hpp:56
const Material< number > material
Definition heat_cut_operator.hpp:52
number weighted_nitsche_factor
Definition heat_cut_operator.hpp:82
const unsigned int heat_cut_dof_idx
Definition heat_cut_operator.hpp:55
dealii::NonMatching::MappingInfo< dim, dim, dealii::VectorizedArray< number > > & mapping_info_surface
Definition heat_cut_operator.hpp:64
number ost_factor_explicit
Definition heat_cut_operator.hpp:86
void tangent_cell_operation_liquid(const unsigned int cell_batch, DomainEval<> &eval_l, DomainEval<> *T_eval_l, DomainEval< dim > *vel_eval, const bool do_reinit_cell=true) const
Definition heat_cut_operator.cpp:649
FECellIntegrator< dim, n_components, number > DomainEval
Definition heat_cut_operator.hpp:41
void create_rhs(VectorType &residual, const VectorType &temperature_old) const final
Definition heat_cut_operator.cpp:611
void tangent_cell_loop(const dealii::MatrixFree< dim, number, dealii::VectorizedArray< number > > &matrix_free_in, VectorType &dst, const VectorType &src, const std::pair< unsigned int, unsigned int > &cell_batch_range) const
Definition heat_cut_operator.cpp:1030
void compute_inverse_diagonal_from_matrixfree(VectorType &diagonal) const final
Compute the inverse diagonal using matrix-free techniques.
Definition heat_cut_operator.cpp:2141
void vmult(VectorType &dst, const VectorType &src) const final
Definition heat_cut_operator.cpp:589
void update_ghost_values() const
Definition heat_cut_operator.cpp:577
void residual_cell_loop(const dealii::MatrixFree< dim, number, dealii::VectorizedArray< number > > &matrix_free, VectorType &residual, const VectorType &temperature_new, const std::pair< unsigned int, unsigned int > &cell_batch_range) const
Definition heat_cut_operator.cpp:1407
number nitsche_factor
Definition heat_cut_operator.hpp:87
const dealii::FESystem< dim > reference_finite_element_vel
Definition heat_cut_operator.hpp:72
typename OperatorMatrixFree< dim, number >::VectorType VectorType
Definition heat_cut_operator.hpp:47
const bool do_solidification
Definition heat_cut_operator.hpp:104
void tangent_boundary_face_loop(const dealii::MatrixFree< dim, number, dealii::VectorizedArray< number > > &matrix_free_in, VectorType &dst, const VectorType &src, const std::pair< unsigned int, unsigned int > &face_batch_range) const
Definition heat_cut_operator.cpp:1390
const number kappa_g
Definition heat_cut_operator.hpp:77
static constexpr unsigned int n_lanes
Definition heat_cut_operator.hpp:79
FEFaceIntegrator< dim, 1, number > FaceEval
Definition heat_cut_operator.hpp:45
void internal_compute_diagonal_or_system_matrix(VectorType &diagonal, dealii::TrilinosWrappers::SparseMatrix &system_matrix, const bool do_diagonal) const
Definition heat_cut_operator.cpp:2171
const number kappa_l
Definition heat_cut_operator.hpp:76
const ScratchData< dim, dim, number > & scratch_data
Definition heat_cut_operator.hpp:50
dealii::VectorizedArray< number > compute_qVapor(const dealii::VectorizedArray< number > &T) const
Definition heat_cut_operator.cpp:632
void tangent_cell_operation_intersected_one_phase(const unsigned int cell_batch, DomainEval<> &eval_cell_l, PointEval<> &eval_subdomain_l, PointEval<> *eval_interface_l, DomainEval<> *T_eval_cell_l, PointEval<> *T_eval_subdomain_l, PointEval<> *T_eval_interface_l, DomainEval< dim > *vel_eval, PointEval< dim > *vel_eval_subdomain_l, const bool do_reinit_cell=true) const
Definition heat_cut_operator.cpp:718
dealii::Tensor< 1, dim, number > laser_direction
Definition heat_cut_operator.hpp:96
const dealii::FE_Q< dim > reference_finite_element_heat
Definition heat_cut_operator.hpp:70
const VectorType * velocity
Definition heat_cut_operator.hpp:100
Definition material.hpp:96
Operator handling matrix-free computations.
Definition operator_base.hpp:190
dealii::TrilinosWrappers::SparseMatrix SparseMatrixType
Definition operator_base.hpp:194
dealii::LinearAlgebra::distributed::Vector< number > VectorType
Definition operator_base.hpp:192
Container for shared scratch data between operations/operators.
Definition scratch_data.hpp:61
Definition apparent_capacity.hpp:9
dealii::FEFaceEvaluation< dim, -1, 0, n_components, number, VectorizedArrayType > FEFaceIntegrator
Definition fe_integrator.hpp:22
dealii::FEEvaluation< dim, -1, 0, n_components, number, VectorizedArrayType > FECellIntegrator
Definition fe_integrator.hpp:14
Definition dealii_tensor.hpp:10
Definition heat_data.hpp:18
Definition material_data.hpp:84