PolyDiM
C++ library for POLYtopal DIscretization Methods
Loading...
Searching...
No Matches
EllipticEquation.hpp
Go to the documentation of this file.
1// _LICENSE_HEADER_
2//
3// Copyright (C) 2019 - 2025.
4// Terms register on the GPL-3.0 license.
5//
6// This file can be redistributed and/or modified under the license terms.
7//
8// See top level LICENSE file for more details.
9//
10// This file can be used citing references in CITATION.cff file.
11
12#ifndef __PDETOOLS_EQUATION_EllipticEquation_HPP
13#define __PDETOOLS_EQUATION_EllipticEquation_HPP
14
15#include "Eigen/Eigen"
16#include <vector>
17
18namespace Polydim
19{
20namespace PDETools
21{
22namespace Equations
23{
24struct EllipticEquation final
25{
37 Eigen::MatrixXd ComputeCellDiffusionMatrix(const Eigen::VectorXd &diffusion_term_values,
38 const std::vector<Eigen::MatrixXd> &trial_basis_functions_derivative_values,
39 const std::vector<Eigen::MatrixXd> &test_basis_functions_derivative_values,
40 const Eigen::VectorXd &quadrature_weights) const
41 {
42 Eigen::MatrixXd cell_matrix = test_basis_functions_derivative_values.at(0).transpose() *
43 quadrature_weights.cwiseProduct(diffusion_term_values).asDiagonal() *
44 trial_basis_functions_derivative_values.at(0);
45
46 for (unsigned int d = 1; d < test_basis_functions_derivative_values.size(); ++d)
47 {
48 cell_matrix.noalias() += test_basis_functions_derivative_values.at(d).transpose() *
49 quadrature_weights.cwiseProduct(diffusion_term_values).asDiagonal() *
50 trial_basis_functions_derivative_values.at(d);
51 }
52
53 return cell_matrix;
54 }
55
65 Eigen::MatrixXd ComputeCellDiffusionMatrix(const Eigen::VectorXd &diffusion_term_values,
66 const std::vector<Eigen::MatrixXd> &basis_functions_derivative_values,
67 const Eigen::VectorXd &quadrature_weights) const
68 {
69 return ComputeCellDiffusionMatrix(diffusion_term_values, basis_functions_derivative_values, basis_functions_derivative_values, quadrature_weights);
70 }
71
85 Eigen::MatrixXd ComputeCellDiffusionMatrix(const std::array<Eigen::VectorXd, 9> &diffusion_term_values,
86 const std::vector<Eigen::MatrixXd> &trial_basis_functions_derivative_values,
87 const std::vector<Eigen::MatrixXd> &test_basis_functions_derivative_values,
88 const Eigen::VectorXd &quadrature_weights) const
89 {
90 const unsigned int dimension = trial_basis_functions_derivative_values.size();
91
92 Eigen::MatrixXd cell_matrix = Eigen::MatrixXd::Zero(test_basis_functions_derivative_values.at(0).cols(),
93 trial_basis_functions_derivative_values.at(0).cols());
94 for (unsigned int d1 = 0; d1 < dimension; d1++)
95 {
96 for (unsigned int d2 = 0; d2 < dimension; d2++)
97 {
98 cell_matrix.noalias() += test_basis_functions_derivative_values.at(d1).transpose() *
99 quadrature_weights.cwiseProduct(diffusion_term_values.at(d1 + 3 * d2)).asDiagonal() *
100 trial_basis_functions_derivative_values.at(d2);
101 }
102 }
103 return cell_matrix;
104 }
105
116 Eigen::MatrixXd ComputeCellDiffusionMatrix(const std::array<Eigen::VectorXd, 9> &diffusion_term_values,
117 const std::vector<Eigen::MatrixXd> &basis_functions_derivative_values,
118 const Eigen::VectorXd &quadrature_weights) const
119 {
120 return ComputeCellDiffusionMatrix(diffusion_term_values, basis_functions_derivative_values, basis_functions_derivative_values, quadrature_weights);
121 }
122
132 inline Eigen::MatrixXd ComputeCellReactionMatrix(const Eigen::VectorXd &reaction_term_values,
133 const Eigen::MatrixXd &basis_functions_values,
134 const Eigen::VectorXd &quadrature_weights) const
135 {
136 return basis_functions_values.transpose() * quadrature_weights.cwiseProduct(reaction_term_values).asDiagonal() * basis_functions_values;
137 }
138
148 inline Eigen::MatrixXd ComputeCellReactionMatrix(const Eigen::VectorXd &reaction_term_values,
149 const Eigen::MatrixXd &trial_basis_functions_values,
150 const Eigen::MatrixXd &test_basis_functions_values,
151 const Eigen::VectorXd &quadrature_weights) const
152 {
153 return test_basis_functions_values.transpose() *
154 quadrature_weights.cwiseProduct(reaction_term_values).asDiagonal() * trial_basis_functions_values;
155 }
156
169 Eigen::MatrixXd ComputeCellAdvectionMatrix(const std::array<Eigen::VectorXd, 3> &advection_term_values,
170 const Eigen::MatrixXd &test_basis_functions_values,
171 const std::vector<Eigen::MatrixXd> &trial_basis_functions_derivative_values,
172 const Eigen::VectorXd &quadrature_weights) const
173 {
174 Eigen::MatrixXd cell_matrix = test_basis_functions_values.transpose() *
175 quadrature_weights.cwiseProduct(advection_term_values[0]).asDiagonal() *
176 trial_basis_functions_derivative_values[0];
177
178 for (unsigned int d = 1; d < trial_basis_functions_derivative_values.size(); ++d)
179 {
180 cell_matrix.noalias() += test_basis_functions_values.transpose() *
181 quadrature_weights.cwiseProduct(advection_term_values.at(d)).asDiagonal() *
182 trial_basis_functions_derivative_values.at(d);
183 }
184
185 return cell_matrix;
186 }
187
196 inline Eigen::VectorXd ComputeCellForcingTerm(const Eigen::VectorXd &forcing_term_values,
197 const Eigen::MatrixXd &test_basis_functions_values,
198 const Eigen::VectorXd &quadrature_weights) const
199 {
200 return test_basis_functions_values.transpose() * quadrature_weights.asDiagonal() * forcing_term_values;
201 }
202
213 inline Eigen::VectorXd ComputeCellForcingTerm(const std::array<Eigen::VectorXd, 3> &forcing_term_values,
214 const std::vector<Eigen::MatrixXd> &test_basis_functions_values,
215 const Eigen::VectorXd &quadrature_weights) const
216 {
217 Eigen::MatrixXd rightHandSide =
218 test_basis_functions_values[0].transpose() * quadrature_weights.asDiagonal() * forcing_term_values[0];
219
220 for (unsigned int d = 1; d < test_basis_functions_values.size(); d++)
221 {
222 rightHandSide.noalias() +=
223 test_basis_functions_values[d].transpose() * quadrature_weights.asDiagonal() * forcing_term_values[d];
224 }
225
226 return rightHandSide;
227 }
228};
229} // namespace Equations
230} // namespace PDETools
231} // namespace Polydim
232
233#endif
Definition FEM_MCC_2D_LocalSpace.cpp:17
Definition EllipticEquation.hpp:25
Eigen::MatrixXd ComputeCellDiffusionMatrix(const Eigen::VectorXd &diffusion_term_values, const std::vector< Eigen::MatrixXd > &trial_basis_functions_derivative_values, const std::vector< Eigen::MatrixXd > &test_basis_functions_derivative_values, const Eigen::VectorXd &quadrature_weights) const
Local diffusion matrix with a scalar diffusion coefficient (Petrov–Galerkin).
Definition EllipticEquation.hpp:37
Eigen::MatrixXd ComputeCellAdvectionMatrix(const std::array< Eigen::VectorXd, 3 > &advection_term_values, const Eigen::MatrixXd &test_basis_functions_values, const std::vector< Eigen::MatrixXd > &trial_basis_functions_derivative_values, const Eigen::VectorXd &quadrature_weights) const
Local advection matrix (Petrov–Galerkin).
Definition EllipticEquation.hpp:169
Eigen::VectorXd ComputeCellForcingTerm(const std::array< Eigen::VectorXd, 3 > &forcing_term_values, const std::vector< Eigen::MatrixXd > &test_basis_functions_values, const Eigen::VectorXd &quadrature_weights) const
Local forcing term for a vector-valued problem.
Definition EllipticEquation.hpp:213
Eigen::MatrixXd ComputeCellDiffusionMatrix(const std::array< Eigen::VectorXd, 9 > &diffusion_term_values, const std::vector< Eigen::MatrixXd > &trial_basis_functions_derivative_values, const std::vector< Eigen::MatrixXd > &test_basis_functions_derivative_values, const Eigen::VectorXd &quadrature_weights) const
Local diffusion matrix with a full diffusion tensor (Petrov–Galerkin).
Definition EllipticEquation.hpp:85
Eigen::MatrixXd ComputeCellDiffusionMatrix(const Eigen::VectorXd &diffusion_term_values, const std::vector< Eigen::MatrixXd > &basis_functions_derivative_values, const Eigen::VectorXd &quadrature_weights) const
Local diffusion matrix with a scalar diffusion coefficient (Galerkin).
Definition EllipticEquation.hpp:65
Eigen::MatrixXd ComputeCellReactionMatrix(const Eigen::VectorXd &reaction_term_values, const Eigen::MatrixXd &trial_basis_functions_values, const Eigen::MatrixXd &test_basis_functions_values, const Eigen::VectorXd &quadrature_weights) const
Local reaction (mass-like) matrix (Petrov–Galerkin).
Definition EllipticEquation.hpp:148
Eigen::VectorXd ComputeCellForcingTerm(const Eigen::VectorXd &forcing_term_values, const Eigen::MatrixXd &test_basis_functions_values, const Eigen::VectorXd &quadrature_weights) const
Local forcing term for a scalar problem.
Definition EllipticEquation.hpp:196
Eigen::MatrixXd ComputeCellDiffusionMatrix(const std::array< Eigen::VectorXd, 9 > &diffusion_term_values, const std::vector< Eigen::MatrixXd > &basis_functions_derivative_values, const Eigen::VectorXd &quadrature_weights) const
Local diffusion matrix with a full diffusion tensor (Galerkin).
Definition EllipticEquation.hpp:116
Eigen::MatrixXd ComputeCellReactionMatrix(const Eigen::VectorXd &reaction_term_values, const Eigen::MatrixXd &basis_functions_values, const Eigen::VectorXd &quadrature_weights) const
Local reaction (mass-like) matrix (Galerkin).
Definition EllipticEquation.hpp:132