HArD::Core3D
Hybrid Arbitrary Degree::Core 3D - Library to implement 3D schemes with vertex, edge, face and cell polynomials as unknowns
Loading...
Searching...
No Matches
hho-fullgradientdiff.hpp
Go to the documentation of this file.
1// Implementation of the HHO scheme, with full gradient, for -div(K nabla u)=f with K scalar piecewise function.
2//
3// Author: Jerome Droniou (jerome.droniou@monash.edu)
4//
5
6/*
7 *
8 * This implementation of HHO was developped following the principles described in
9 * Appendix B of the book
10 *
11 * The Hybrid High-Order Method for Polytopal Meshes: Design, Analysis, and Applications.
12 * D. A. Di Pietro and J. Droniou. Modeling, Simulation and Applications, vol. 19.
13 * Springer International Publishing, 2020, xxxi + 525p. doi: 10.1007/978-3-030-37203-3.
14 * url: https://hal.archives-ouvertes.fr/hal-02151813.
15 *
16 * If you use this code or part of it for a scientific publication, please cite the book
17 * above as a reference for the implementation.
18 *
19 */
20
21
22#ifndef HHOFULLGRADIENTDIFF_HPP
23#define HHOFULLGRADIENTDIFF_HPP
24
25#include <iostream>
26
27#include <boost/math/constants/constants.hpp>
28
29#include <Eigen/Sparse>
30#include <unsupported/Eigen/SparseExtra>
31
32#include <mesh.hpp>
33#include <mesh_builder.hpp>
35#include <linearsolver.hpp>
36
37#include <hhospace.hpp>
39#include <integralweight.hpp>
40
46namespace HArDCore3D
47{
48
56 {
57 typedef Eigen::SparseMatrix<double> SystemMatrixType;
58
59 typedef std::function<double(const VectorRd &)> ForcingTermType;
60 typedef std::function<double(const VectorRd &)> SolutionType;
61 typedef std::function<VectorRd(const VectorRd &)> SolutionGradientType;
63
66 const HHOSpace & hho_space,
67 const BoundaryConditions & BC,
68 bool use_threads,
69 std::ostream & output = std::cout
70 );
71
74 const ForcingTermType & f,
75 const PermeabilityType & kappa,
76 const SolutionType & u,
77 Eigen::VectorXd & UDir
78 );
79
81 inline size_t numSCDOFs() const
82 {
83 return m_hhospace.mesh().n_cells() * m_nloc_sc;
84 }
85
87 inline size_t numDirDOFs() const
88 {
89 return m_BC.n_dir_faces()*m_hhospace.numLocalDofsFace();
90 }
91
93 inline size_t numSkeletalDOFs() const
94 {
95 return m_hhospace.dimension() - numSCDOFs();
96 }
97
99 inline size_t sizeSystem() const
100 {
101 return m_hhospace.dimension() - numSCDOFs() - numDirDOFs();
102 }
103
105 inline const HHOSpace & hhospace() const
106 {
107 return m_hhospace;
108 }
109
111 inline const Mesh & mesh() const
112 {
113 return m_hhospace.mesh();
114 }
115
117 inline const SystemMatrixType & systemMatrix() const {
118 return m_A;
119 }
120
123 return m_A;
124 }
125
127 inline const Eigen::VectorXd & systemVector() const {
128 return m_b;
129 }
130
132 inline Eigen::VectorXd & systemVector() {
133 return m_b;
134 }
135
137 inline const double & stabilizationParameter() const {
138 return m_stab_par;
139 }
140
142 inline double & stabilizationParameter() {
143 return m_stab_par;
144 }
145
147 inline const SystemMatrixType & scMatrix() const {
148 return m_sc_A;
149 }
150
152 inline Eigen::VectorXd & scVector() {
153 return m_sc_b;
154 }
155
157 std::vector<double> computeEnergyNorms(
158 const std::vector<Eigen::VectorXd> & list_dofs
159 ) const;
160
161 private:
163 std::pair<Eigen::MatrixXd, Eigen::VectorXd>
164 _compute_local_contribution(
165 size_t iT,
166 const ForcingTermType & f,
167 const PermeabilityType & kappa
168 );
169
171 LocalStaticCondensation _compute_static_condensation(const size_t & iT) const;
172
174 void _assemble_local_contribution(
175 size_t iT,
176 const std::pair<Eigen::MatrixXd, Eigen::VectorXd> & lsT,
177 std::list<Eigen::Triplet<double> > & A1,
178 Eigen::VectorXd & b1,
179 std::list<Eigen::Triplet<double> > & A2,
180 Eigen::VectorXd & b2
181 );
182
183 const HHOSpace & m_hhospace;
184 const BoundaryConditions & m_BC;
185 bool m_use_threads;
186 std::ostream & m_output;
187 const size_t m_nloc_sc; // Number of statically condensed DOFs in each cell
188 SystemMatrixType m_A; // Matrix and RHS of statically condensed system
189 Eigen::VectorXd m_b;
190 SystemMatrixType m_sc_A; // Static condensation operator and RHS (to recover statically condensed DOFs)
191 Eigen::VectorXd m_sc_b;
192 double m_stab_par;
193 };
194
195 //------------------------------------------------------------------------------
196 // Exact solutions
197 //------------------------------------------------------------------------------
198
199 static const double PI = boost::math::constants::pi<double>();
200 using std::sin;
201 using std::cos;
202
203 //------------------------------------------------------------------------------
204
205 static const VectorRd vec_a = VectorRd(1.,2.,3.);
206
208 linear_u = [](const VectorRd & x) -> double {
209 return vec_a.dot(x) + 4.;
210 };
211
213 linear_gradu = [](const VectorRd & x) -> VectorRd {
214 return vec_a;
215 };
216
218 linear_f = [](const VectorRd & x) -> double {
219 return 0.;
220 };
221
224
225
226 //------------------------------------------------------------------------------
227
229 trigonometric_u = [](const VectorRd & x) -> double {
230 return sin(PI*x(0)) * sin(PI*x(1)) * sin(PI*x(2));
231 };
232
234 trigonometric_gradu = [](const VectorRd & x) -> VectorRd {
235 return PI * VectorRd(
236 cos(PI*x(0)) * sin(PI*x(1)) * sin(PI*x(2)),
237 sin(PI*x(0)) * cos(PI*x(1)) * sin(PI*x(2)),
238 sin(PI*x(0)) * sin(PI*x(1)) * cos(PI*x(2))
239 );
240 };
241
243 trigonometric_f = [](const VectorRd & x) -> double {
244 return 3. * std::pow(PI, 2) * trigonometric_u(x);
245 };
246
249
250
251} // end of namespace HArDCore3D
252
253#endif
The BoundaryConditions class provides definition of boundary conditions.
Definition BoundaryConditions.hpp:129
const size_t n_dir_faces() const
Returns the number of Dirichlet faces.
Definition BoundaryConditions.hpp:160
Class definition: polynomial bases and operators.
Definition hhospace.hpp:53
Class to describe a mesh.
Definition MeshND.hpp:17
@ Matrix
Definition basis.hpp:67
size_t dimension() const
Returns the dimension of the global space (all DOFs for all geometric entities)
Definition localdofspace.hpp:80
size_t numLocalDofsFace() const
Returns the number of local face DOFs.
Definition localdofspace.hpp:49
static const double PI
Definition ddr-magnetostatics.hpp:187
static Magnetostatics::SolutionPotentialType linear_u
Definition ddr-magnetostatics.hpp:214
static Magnetostatics::SolutionPotentialType trigonometric_u
Definition ddr-magnetostatics.hpp:238
static Magnetostatics::ForcingTermType trigonometric_f
Definition ddr-magnetostatics.hpp:256
static Magnetostatics::ForcingTermType linear_f
Definition ddr-magnetostatics.hpp:228
const Mesh & mesh() const
Return a const reference to the mesh.
Definition hhospace.hpp:114
bool use_threads
Definition HHO_DiffAdvecReac.hpp:47
static Brinkman::VelocityGradientType linear_gradu
Definition hho-brinkman.hpp:370
static Brinkman::VelocityGradientType trigonometric_gradu
Definition hho-brinkman.hpp:515
std::function< double(const VectorRd &)> SolutionType
Definition hho-fullgradientdiff.hpp:60
const SystemMatrixType & scMatrix() const
Returns the static condensation recovery operator.
Definition hho-fullgradientdiff.hpp:147
std::function< double(const VectorRd &)> ForcingTermType
Definition hho-fullgradientdiff.hpp:59
const SystemMatrixType & systemMatrix() const
Returns the linear system matrix.
Definition hho-fullgradientdiff.hpp:117
std::vector< double > computeEnergyNorms(const std::vector< Eigen::VectorXd > &list_dofs) const
Compute the discrete energy norm of a family of vectors representing the dofs.
Definition hho-fullgradientdiff.cpp:411
const Mesh & mesh() const
Returns the mesh.
Definition hho-fullgradientdiff.hpp:111
const Eigen::VectorXd & systemVector() const
Returns the linear system right-hand side vector.
Definition hho-fullgradientdiff.hpp:127
Eigen::SparseMatrix< double > SystemMatrixType
Definition hho-fullgradientdiff.hpp:57
Eigen::VectorXd & systemVector()
Returns the linear system right-hand side vector.
Definition hho-fullgradientdiff.hpp:132
double & stabilizationParameter()
Returns the stabilization parameter.
Definition hho-fullgradientdiff.hpp:142
Eigen::VectorXd & scVector()
Returns the static condensation rhs.
Definition hho-fullgradientdiff.hpp:152
size_t numSkeletalDOFs() const
Returns the number of DOFs after SC but before eliminating Dirichlet DOFs.
Definition hho-fullgradientdiff.hpp:93
static const VectorRd vec_a
Definition hho-fullgradientdiff.hpp:205
const HHOSpace & hhospace() const
Returns the HHO space.
Definition hho-fullgradientdiff.hpp:105
static FullGradientDiffusion::PermeabilityType trigonometric_kappa
Definition hho-fullgradientdiff.hpp:248
size_t sizeSystem() const
Returns the size of the final system, after application of SC and removal of Dirichlet BCs.
Definition hho-fullgradientdiff.hpp:99
const double & stabilizationParameter() const
Returns the stabilization parameter (scaling)
Definition hho-fullgradientdiff.hpp:137
size_t numDirDOFs() const
Returns the number of Dirichlet DOFs.
Definition hho-fullgradientdiff.hpp:87
size_t numSCDOFs() const
Returns the number of statically condensed DOFs (the cell DOFs)
Definition hho-fullgradientdiff.hpp:81
IntegralWeight PermeabilityType
Definition hho-fullgradientdiff.hpp:62
static FullGradientDiffusion::PermeabilityType linear_kappa
Definition hho-fullgradientdiff.hpp:223
std::function< VectorRd(const VectorRd &)> SolutionGradientType
Definition hho-fullgradientdiff.hpp:61
SystemMatrixType & systemMatrix()
Returns the linear system matrix.
Definition hho-fullgradientdiff.hpp:122
void assembleLinearSystem(const ForcingTermType &f, const PermeabilityType &kappa, const SolutionType &u, Eigen::VectorXd &UDir)
Assemble the global system
Definition hho-fullgradientdiff.cpp:248
std::size_t n_cells() const
number of cells in the mesh.
Definition MeshND.hpp:60
Definition ddr-magnetostatics.hpp:41
Assemble a diffusion problem.
Definition hho-fullgradientdiff.hpp:56
Structure for weights (scalar, at the moment) in integral.
Definition integralweight.hpp:36
Structure to store information for, and perform, local static condensation.
Definition local_static_condensation.hpp:25