include/meltpooldg/utilities/fe_subcell_evaluation.hpp Source File

Developer Documentation: include/meltpooldg/utilities/fe_subcell_evaluation.hpp Source File
Developer Documentation
fe_subcell_evaluation.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/base/aligned_vector.h>
4#include <deal.II/base/point.h>
5#include <deal.II/base/tensor.h>
6#include <deal.II/base/vectorization.h>
7
8#include <deal.II/lac/la_parallel_vector.h>
9
10#include <deal.II/matrix_free/evaluation_flags.h>
11#include <deal.II/matrix_free/fe_evaluation.h>
12#include <deal.II/matrix_free/matrix_free.h>
13
14#include <meltpooldg/utilities/better_enum.hpp>
17
18#include <bitset>
19#include <ranges>
20#include <utility>
21#include <vector>
22
23namespace MeltPoolDG
24{
186 template <int dim, int n_components, typename number>
188 {
189 using VectorizedArrayType = dealii::VectorizedArray<number>;
190
192 dealii::FEEvaluation<dim, -1, 0, n_components, number, VectorizedArrayType>::value_type;
193
195 dealii::FEEvaluation<dim, -1, 0, n_components, number, VectorizedArrayType>::gradient_type;
196
197 static constexpr unsigned int n_lanes = VectorizedArrayType::size();
198
199 public:
211 FESubcellEvaluation(const dealii::MatrixFree<dim, number> &matrix_free,
212 const unsigned int dof_no,
213 const unsigned int quad_no);
214
219 const dealii::FEEvaluation<dim, -1, 0, n_components, number, VectorizedArrayType>
220 &fe_evaluation);
221
230 void
231 reinit(const unsigned int cell_batch_index);
232
243 void
244 read_dof_values(const dealii::LinearAlgebra::distributed::Vector<number> &src_vector,
245 const std::bitset<n_lanes> &mask = std::bitset<n_lanes>().flip());
246
254 void
255 evaluate(const dealii::EvaluationFlags::EvaluationFlags evaluation_flags);
256
271 void
272 gather_evaluate(const dealii::LinearAlgebra::distributed::Vector<number> &input_vector,
273 const dealii::EvaluationFlags::EvaluationFlags evaluation_flags,
274 const std::bitset<n_lanes> &mask = std::bitset<n_lanes>().flip());
275
282 get_value(const unsigned int subcell_index) const;
283
284
292 get_face_value(const unsigned int subcell_face_index, const bool interior_value) const;
293
300 get_gradient(const unsigned int subcell_index) const;
301
310 void
311 submit_value(const unsigned int subcell_index, const value_type &value);
312
323 void
324 submit_flux(const unsigned int subcell_face_index, const value_type &flux);
325
336 void
337 integrate();
338
349 void
350 distribute_local_to_global(dealii::LinearAlgebra::distributed::Vector<number> &dst_vector,
351 const std::bitset<n_lanes> &mask = std::bitset<n_lanes>().flip());
352
368 void
369 integrate_scatter(dealii::LinearAlgebra::distributed::Vector<number> &dst_vector,
370 const std::bitset<n_lanes> &mask = std::bitset<n_lanes>().flip());
371
382 void
383 set_dof_values(dealii::LinearAlgebra::distributed::Vector<number> &dst,
384 const std::bitset<n_lanes> &mask = std::bitset<n_lanes>().flip());
385
392 std::ranges::iota_view<unsigned int, unsigned int>
393 subcell_indices() const;
394
395
402 std::ranges::iota_view<unsigned int, unsigned int>
403 subcell_face_indices() const;
404
412 template <typename T>
413 T
414 read_cell_data(const dealii::AlignedVector<T> &data) const;
415
423 template <typename T>
424 void
425 set_cell_data(dealii::AlignedVector<T> &data, const T &value) const;
426
431 subcell_size(const unsigned int subcell_index) const;
432
438 subcell_face_size(const unsigned int subcell_face_index) const;
439
445 dealii::Point<dim, VectorizedArrayType>
446 subcell_location(const unsigned int subcell_index) const;
447
451 unsigned
452 n_subcells() const;
453
461 dealii::Tensor<1, dim, VectorizedArrayType>
462 subcell_face_normal_vector(const unsigned int subcell_face_index) const;
463
471 std::pair<unsigned int, unsigned int>
472 subcell_face_interior_exterior_indices(const unsigned int subcell_face_index) const;
473
474 private:
477 unsigned int cell_batch_index;
478
481 dealii::FEEvaluation<dim, -1, 0, n_components, number, VectorizedArrayType> fe_cell_evaluator;
482
487 std::vector<value_type> subcell_values;
488
493 std::vector<gradient_type> subcell_gradients;
494
499 std::vector<value_type> submitted_subcell_values;
500
505 std::vector<value_type> intra_cell_face_fluxes;
506
510 std::vector<VectorizedArrayType> intra_cell_face_sizes;
511
514 std::vector<value_type> integrated_values_buffer;
515
518 std::vector<VectorizedArrayType> subcell_values_to_project_buffer;
519
522 unsigned int n_subcells_1d;
523
525 unsigned int n_subcells_total;
526
529 unsigned int n_intra_cell_faces;
530
533 bool is_reinitialized = false;
534
537
540
543
547
551
557 void
559
564 void
566
583 void
585 const dealii::EvaluationFlags::EvaluationFlags evaluation_flags);
586
595 void
596 project_subcell_values_to_dof_values(const std::vector<value_type> &values_to_project);
597
603 unsigned int
604 compute_reference_coordinates_normal_direction(const unsigned int subcell_face_index) const;
605
615 unsigned int
616 face_adjacent_subcell_index(const unsigned int subcell_face_index,
617 const bool interior_face) const;
618 };
619
620
621 template <int dim, int n_components, typename number>
622 template <typename T>
623 T
625 const dealii::AlignedVector<T> &data) const
626 {
627 return fe_cell_evaluator.read_cell_data(data);
628 }
629
630 template <int dim, int n_components, typename number>
631 template <typename T>
632 void
634 const T &value) const
635 {
636 fe_cell_evaluator.set_cell_data(data, value);
637 }
638} // namespace MeltPoolDG
Definition fe_subcell_evaluation.hpp:188
dealii::FEEvaluation< dim, -1, 0, n_components, number, VectorizedArrayType >::value_type value_type
Definition fe_subcell_evaluation.hpp:192
void submit_value(const unsigned int subcell_index, const value_type &value)
Definition fe_subcell_evaluation.templates.hpp:130
unsigned int compute_reference_coordinates_normal_direction(const unsigned int subcell_face_index) const
Definition fe_subcell_evaluation.templates.hpp:411
static constexpr unsigned int n_lanes
Definition fe_subcell_evaluation.hpp:197
value_type get_value(const unsigned int subcell_index) const
Definition fe_subcell_evaluation.templates.hpp:92
void integrate()
Definition fe_subcell_evaluation.templates.hpp:150
value_type get_face_value(const unsigned int subcell_face_index, const bool interior_value) const
Definition fe_subcell_evaluation.templates.hpp:104
std::ranges::iota_view< unsigned int, unsigned int > subcell_indices() const
Definition fe_subcell_evaluation.templates.hpp:218
void gather_evaluate(const dealii::LinearAlgebra::distributed::Vector< number > &input_vector, const dealii::EvaluationFlags::EvaluationFlags evaluation_flags, const std::bitset< n_lanes > &mask=std::bitset< n_lanes >().flip())
Definition fe_subcell_evaluation.templates.hpp:81
std::vector< value_type > subcell_values
Definition fe_subcell_evaluation.hpp:487
std::vector< value_type > submitted_subcell_values
Definition fe_subcell_evaluation.hpp:499
bool dof_values_initialized
A flag indicating whether the DoF values have been set. Used for debug information.
Definition fe_subcell_evaluation.hpp:536
std::ranges::iota_view< unsigned int, unsigned int > subcell_face_indices() const
Definition fe_subcell_evaluation.templates.hpp:225
dealii::Tensor< 1, dim, VectorizedArrayType > subcell_face_normal_vector(const unsigned int subcell_face_index) const
Definition fe_subcell_evaluation.templates.hpp:279
void evaluate(const dealii::EvaluationFlags::EvaluationFlags evaluation_flags)
Definition fe_subcell_evaluation.templates.hpp:69
void distribute_local_to_global(dealii::LinearAlgebra::distributed::Vector< number > &dst_vector, const std::bitset< n_lanes > &mask=std::bitset< n_lanes >().flip())
Definition fe_subcell_evaluation.templates.hpp:200
void read_dof_values(const dealii::LinearAlgebra::distributed::Vector< number > &src_vector, const std::bitset< n_lanes > &mask=std::bitset< n_lanes >().flip())
Definition fe_subcell_evaluation.templates.hpp:55
gradient_type get_gradient(const unsigned int subcell_index) const
Definition fe_subcell_evaluation.templates.hpp:117
T read_cell_data(const dealii::AlignedVector< T > &data) const
Definition fe_subcell_evaluation.hpp:624
unsigned int n_subcells_1d
Definition fe_subcell_evaluation.hpp:522
dealii::FEEvaluation< dim, -1, 0, n_components, number, VectorizedArrayType >::gradient_type gradient_type
Definition fe_subcell_evaluation.hpp:195
std::vector< VectorizedArrayType > subcell_values_to_project_buffer
Definition fe_subcell_evaluation.hpp:518
unsigned int n_intra_cell_faces
Definition fe_subcell_evaluation.hpp:529
void reinit(const unsigned int cell_batch_index)
Definition fe_subcell_evaluation.templates.hpp:39
dealii::FEEvaluation< dim, -1, 0, n_components, number, VectorizedArrayType > fe_cell_evaluator
Definition fe_subcell_evaluation.hpp:481
std::pair< unsigned int, unsigned int > subcell_face_interior_exterior_indices(const unsigned int subcell_face_index) const
Definition fe_subcell_evaluation.templates.hpp:296
bool subcell_fluxes_submitted
Definition fe_subcell_evaluation.hpp:550
unsigned int face_adjacent_subcell_index(const unsigned int subcell_face_index, const bool interior_face) const
Definition fe_subcell_evaluation.templates.hpp:422
unsigned int n_subcells_total
The total number of subcells on the current cell.
Definition fe_subcell_evaluation.hpp:525
std::vector< VectorizedArrayType > intra_cell_face_sizes
Definition fe_subcell_evaluation.hpp:510
bool subcell_values_initialized
A flag indicating whether the subcell values have been set. Used for debug information.
Definition fe_subcell_evaluation.hpp:539
dealii::Point< dim, VectorizedArrayType > subcell_location(const unsigned int subcell_index) const
Definition fe_subcell_evaluation.templates.hpp:259
bool is_reinitialized
Definition fe_subcell_evaluation.hpp:533
VectorizedArrayType subcell_size(const unsigned int subcell_index) const
Definition fe_subcell_evaluation.templates.hpp:232
void set_cell_data(dealii::AlignedVector< T > &data, const T &value) const
Definition fe_subcell_evaluation.hpp:633
bool subcell_gradients_initialized
A flag indicating whether the subcell gradients have been set. Used for debug information.
Definition fe_subcell_evaluation.hpp:542
unsigned int cell_batch_index
Definition fe_subcell_evaluation.hpp:477
std::vector< value_type > intra_cell_face_fluxes
Definition fe_subcell_evaluation.hpp:505
void project_dof_values_to_subcell_values(const dealii::EvaluationFlags::EvaluationFlags evaluation_flags)
Definition fe_subcell_evaluation.templates.hpp:364
dealii::VectorizedArray< number > VectorizedArrayType
Definition fe_subcell_evaluation.hpp:189
VectorizedArrayType subcell_face_size(const unsigned int subcell_face_index) const
Definition fe_subcell_evaluation.templates.hpp:245
std::vector< value_type > integrated_values_buffer
Definition fe_subcell_evaluation.hpp:514
void project_subcell_values_to_dof_values(const std::vector< value_type > &values_to_project)
Definition fe_subcell_evaluation.templates.hpp:387
void submit_flux(const unsigned int subcell_face_index, const value_type &flux)
Definition fe_subcell_evaluation.templates.hpp:140
bool subcell_values_submitted
Definition fe_subcell_evaluation.hpp:546
void compute_intra_cell_face_sizes()
Definition fe_subcell_evaluation.templates.hpp:332
void set_dof_values(dealii::LinearAlgebra::distributed::Vector< number > &dst, const std::bitset< n_lanes > &mask=std::bitset< n_lanes >().flip())
Definition fe_subcell_evaluation.templates.hpp:209
void setup_internal_data_structures()
Definition fe_subcell_evaluation.templates.hpp:313
void integrate_scatter(dealii::LinearAlgebra::distributed::Vector< number > &dst_vector, const std::bitset< n_lanes > &mask=std::bitset< n_lanes >().flip())
Definition fe_subcell_evaluation.templates.hpp:190
unsigned n_subcells() const
Definition fe_subcell_evaluation.templates.hpp:272
std::vector< gradient_type > subcell_gradients
Definition fe_subcell_evaluation.hpp:493
Interface for a general preconditioner.
Definition boundary_condition_functions.hpp:17