PRISMS-PF Manual v3.0-pre
All Classes Functions Variables Enumerations Pages
element_volume.h
1// SPDX-FileCopyrightText: © 2025 PRISMS Center at the University of Michigan
2// SPDX-License-Identifier: GNU Lesser General Public Version 2.1
3
4#ifndef element_volume_h
5#define element_volume_h
6
7#include <deal.II/base/aligned_vector.h>
8#include <deal.II/base/quadrature_lib.h>
9#include <deal.II/base/vectorization.h>
10#include <deal.II/fe/fe_q.h>
11#include <deal.II/fe/fe_system.h>
12#include <deal.II/fe/fe_values.h>
13#include <deal.II/matrix_free/matrix_free.h>
14
15#include <prismspf/config.h>
16
17PRISMS_PF_BEGIN_NAMESPACE
18
22template <int dim, int degree, typename number>
24{
25public:
29 elementVolume() = default;
30
34 void
35 initialize(std::shared_ptr<dealii::MatrixFree<dim, number>> _data);
36
40 void
41 compute_element_volume(const dealii::FESystem<dim> &fe);
42
46 dealii::AlignedVector<dealii::VectorizedArray<number>> element_volume;
47
48private:
52 std::shared_ptr<dealii::MatrixFree<dim, number>> data;
53};
54
55template <int dim, int degree, typename number>
56void
58 std::shared_ptr<dealii::MatrixFree<dim, number>> _data)
59{
60 data = _data;
61}
62
63template <int dim, int degree, typename number>
64void
66 const dealii::FESystem<dim> &fe)
67{
68 // Get the number of cell batches. Note this is the same as the cell range in
69 // cell_loop()
70 const unsigned int n_cells = data->n_cell_batches();
71
72 // Resize vector
73 element_volume.resize(n_cells);
74
75 // Set quadrature rule and FEValues to update the JxW values
76 dealii::QGaussLobatto<dim> quadrature(degree + 1);
77 dealii::FEValues<dim> fe_values(fe, quadrature, dealii::update_JxW_values);
78
79 // Get the number of quadrature points
80 const unsigned int num_quad_points = quadrature.size();
81
82 // Loop over the cells and each lane in the vectorized array
83 for (unsigned int cell = 0; cell < n_cells; cell++)
84 {
85 for (unsigned int lane = 0; lane < data->n_active_entries_per_cell_batch(cell);
86 lane++)
87 {
88 // Get the iterator for the current cell
89 auto cell_iterator = data->get_cell_iterator(cell, lane);
90
91 // Reinitialize the cell
92 fe_values.reinit(cell_iterator);
93
94 // Initialize volume to 0 for the current cell
95 double cell_volume = 0.0;
96
97 // Sum up the JxW values at each quadrature point to compute the element volume
98 // in 3D or area in 2D.
99 for (unsigned int q_point = 0; q_point < num_quad_points; ++q_point)
100 {
101 cell_volume += fe_values.JxW(q_point);
102 }
103
104 // Store the element volume
105 element_volume[cell][lane] = cell_volume;
106 }
107 }
108}
109
110PRISMS_PF_END_NAMESPACE
111
112#endif
Compute the element volume.
Definition element_volume.h:24
void compute_element_volume(const dealii::FESystem< dim > &fe)
Compute element volume for the triangulation.
Definition element_volume.h:65
void initialize(std::shared_ptr< dealii::MatrixFree< dim, number > > _data)
Initialize.
Definition element_volume.h:57
dealii::AlignedVector< dealii::VectorizedArray< number > > element_volume
Vector that stores element volumes.
Definition element_volume.h:46
elementVolume()=default
Constructor.