HArD::Core2D
Hybrid Arbitrary Degree::Core 2D - Library to implement 2D schemes with edge and cell polynomials as unknowns
Loading...
Searching...
No Matches
hypre.hpp
Go to the documentation of this file.
1#ifndef HYPRE_HPP
2#define HYPRE_HPP
3
4#include <ostream>
5#include <Eigen/Sparse>
6
8
10
11#include <unordered_set>
12
13
14#include "discrete-space.hpp"
16#include "hho-interpolate.hpp"
17#include "mhd-solutions.hpp"
18
19
20
21namespace HArDCore2D {
22
23 namespace DSL {
24
25 struct HYPREParameters {
26 bool static_condensation = false; // true;
27 bool use_threads = true;
28 bool upwinding = true;
29 double stabilization_parameter= 1.0;
30 double viscosity = 1.;
32 std::ostream & output = std::cout;
33 };
34
35 class HYPRE {
36 public:
37 typedef Eigen::SparseMatrix<double> SystemMatrixType;
38
39 typedef std::function<VectorRd(const VectorRd &)> MomentumForcingTermType;
40 typedef std::function<VectorRd(const VectorRd &)> MagneticForcingTermType;
41 typedef std::function<double(const VectorRd &)> CompressibilityForcingTermType;
42
43 typedef std::function<VectorRd(const VectorRd &)> VelocityType;
44 typedef std::function<MatrixRd(const VectorRd &)> VelocityGradientType;
45
46 typedef std::function<double(const VectorRd &)> PressureType;
47 typedef std::function<VectorRd(const VectorRd &)> PressureGradientType;
48
49
51 const Mesh & mesh,
52 size_t degree,
53 const BoundaryConditions & bc,
54 const HYPREParameters & parameters = {}
55 );
56 virtual ~HYPRE() {}
57
59 virtual Eigen::VectorXd interpolate(
60 const VelocityType & u,
61 const PressureType & p
62 ) const = 0;
63
65 template<typename F>
66 Eigen::VectorXd pkpoPkPkPkInterpolate(
67 const F & v,
69 ) const;
70
72 size_t degree() const
73 {
74 return m_degree;
75 }
76
79 {
81 }
82
84 const std::vector<Eigen::MatrixXd> potential() const
85 {
86 return m_potential;
87 }
88
90 const std::vector<Eigen::MatrixXd> stabilization() const
91 {
92 return m_stabilization;
93 }
94
96 const Eigen::MatrixXd & potential(size_t iT) const
97 {
98 return m_potential[iT];
99 }
100
103 {
104 return m_nloc_sc_u;
105 }
106
109 {
110 return m_nloc_sc_p;
111 }
112
115 {
116 return m_velocity_space->mesh().n_cells() * m_nloc_sc_u;
117 }
118
121 {
122 return m_velocity_space->mesh().n_cells() * m_nloc_sc_p;
123 }
124
130
132 size_t numDirichletDofs() const
133 {
134 return 2*(m_bc.n_dir_edges() * m_velocity_space->numberOfLocalEdgeDofs());
135 }
136
138 size_t dimVelocity() const
139 {
140 return m_velocity_space->dimension();
141 }
142
144 size_t dimPressure() const
145 {
146 return m_pressure_space->dimension();
147 }
148
151 {
152 return 2*dimVelocity() + 2*dimPressure() + 2 - numStaticallyCondensedDofs();
153 }
154
156 size_t sizeSystem() const
157 {
159 }
160
166
172
173
175 inline const DiscreteSpace & velocitySpace() const
176 {
177 return *m_velocity_space;
178 }
179
181 inline const DiscreteSpace & pressureSpace() const
182 {
183 return *m_pressure_space;
184 }
185
187 inline const Mesh & mesh() const
188 {
189 return m_velocity_space->mesh();
190 }
191
193 inline const SystemMatrixType & systemMatrix() const {
194 return m_A;
195 }
196
199 return m_A;
200 }
201
203 inline const Eigen::VectorXd & systemVector() const {
204 return m_b;
205 }
206
208 inline Eigen::VectorXd & systemVector() {
209 return m_b;
210 }
211
214 return m_sc_A;
215 }
216
218 inline const Eigen::VectorXd & staticallyCondensedVector() const {
219 return m_sc_b;
220 }
221
223 inline const BoundaryConditions & boundaryConditions() const {
224 return m_bc;
225 }
226
230 const Eigen::VectorXd & uph_old,
231 const Eigen::VectorXd & uph_prev,
232 const Eigen::VectorXd & brh_old,
233 const Eigen::VectorXd & brh_prev,
234 const double time_step,
235 const double current_time);
236
237
238 //This should be the stationary case assembleResidual case!
239
242 const Eigen::VectorXd & uph_old,
243 const Eigen::VectorXd & brh_old) {
244 Eigen::VectorXd uph_prev = Eigen::VectorXd::Zero(uph_old.size());
245 Eigen::VectorXd brh_prev = Eigen::VectorXd::Zero(brh_old.size());
247 uph_old,
248 uph_prev,
249 brh_old,
250 brh_prev,
251 std::numeric_limits<double>::infinity(),
252 0.);
253 };
254
256 Eigen::VectorXd reconstructSolution(const Eigen::VectorXd & uhp_solsystem) const;
257
258
260 virtual double convective_stabilization_parameter(size_t iT,
262 const Eigen::VectorXd & uT_old,
263 const Eigen::VectorXd & bT_old,
264 const size_t cell_degree,
265 const double viscosity,
266 const double magnetic_diffusivity,
267 const double current_time) const;
268
271 const Eigen::VectorXd & uT_old,
272 const Eigen::VectorXd & bT_old,
273 const size_t cell_degree,
274 const double viscosity,
275 const double magnetic_diffusivity,
276 const double current_time) const;
277
278
279 protected:
281
282 std::pair<Eigen::MatrixXd, Eigen::VectorXd> _time_deriv_term(size_t iT,
283 const Eigen::VectorXd & uT_old,
284 const Eigen::VectorXd & uT_prev,
285 const double time_step); // = std::numeric_limits<double>::infinity()
286
287
288 std::pair<Eigen::MatrixXd, Eigen::VectorXd> _viscous_term(size_t iT, const Eigen::VectorXd & uT_old);
289
290 std::pair<Eigen::MatrixXd, Eigen::VectorXd> _magnetic_diffusive_term(size_t iT, const Eigen::VectorXd & bT_old);
291
292
293 virtual std::pair<Eigen::MatrixXd, Eigen::VectorXd> _velocity_pressure_coupling(
294 size_t iT,
296 const Eigen::VectorXd & uT_old,
297 const Eigen::VectorXd & pT_old,
298 const double & current_time = 0.
299 );
300
301 virtual std::pair<Eigen::MatrixXd, Eigen::VectorXd> _magnetic_field_magnetic_pressure_coupling(
302 size_t iT,
304 const Eigen::VectorXd & bT_old,
305 const Eigen::VectorXd & rT_old,
306 const double & current_time = 0.
307 );
308
309
310 virtual Eigen::MatrixXd _forcing_terms(
311 size_t iT,
313 const double current_time = 0.
314 );
315
316 virtual std::pair<Eigen::MatrixXd, Eigen::VectorXd>
317 _linearized_convective_term(size_t iT, const Eigen::VectorXd & uT_old);
318
319 virtual std::tuple<Eigen::MatrixXd, Eigen::MatrixXd, Eigen::VectorXd>
320 _linearized_convective_mixed_term(size_t iT, const Eigen::VectorXd & wT_old, const Eigen::VectorXd & vT_old);
321
322 virtual std::pair<Eigen::MatrixXd, Eigen::VectorXd>
324 size_t iT,
325 const Eigen::VectorXd & uT_old,
326 const Eigen::VectorXd & bT_old,
328 const double current_time);
329
330 virtual std::pair<Eigen::MatrixXd, Eigen::VectorXd>
332 size_t iT,
333 const Eigen::VectorXd & uT_old,
334 const Eigen::VectorXd & bT_old,
336 const double current_time);
337
338 std::pair<Eigen::MatrixXd, Eigen::VectorXd>
340 size_t iT,
342 const Eigen::VectorXd & uph_old,
343 const Eigen::VectorXd & uph_prev,
344 const Eigen::VectorXd & brh_old,
345 const Eigen::VectorXd & brh_prev,
346 const double time_step,
347 const double current_time);
348
349 std::pair<Eigen::MatrixXd, Eigen::VectorXd>
351 size_t iT,
353 const Eigen::VectorXd & uph_old,
354 const Eigen::VectorXd & brh_old) {
355 Eigen::VectorXd uph_prev = uph_old;
356 Eigen::VectorXd brh_prev = brh_old;
357
359 isolution,
360 uph_old,
361 uph_prev,
362 brh_old,
363 brh_prev,
364 std::numeric_limits<double>::infinity(),
365 0.);
366
367 }
368
370
372 size_t iT,
373 const std::pair<Eigen::MatrixXd, Eigen::VectorXd> & lsT,
374 std::list<Eigen::Triplet<double> > & A1,
375 Eigen::VectorXd & b1,
376 std::list<Eigen::Triplet<double> > & A2,
377 Eigen::VectorXd & b2
378 );
379
380 size_t m_degree;
381 const BoundaryConditions & m_bc;
383 bool m_use_threads;
385
387 double m_viscosity;
389
390 std::ostream & m_output;
391
392 size_t m_nloc_sc_u;
393 size_t m_nloc_sc_p;
394
395 std::vector<Eigen::MatrixXd> m_discrete_l2;
396 std::vector<Eigen::MatrixXd> m_gradient;
397 std::vector<Eigen::MatrixXd> m_gradient_rhs;
398 std::vector<Eigen::MatrixXd> m_potential;
399 std::vector<Eigen::MatrixXd> m_stabilization;
400
401 std::unique_ptr<DiscreteSpace> m_velocity_space;
402 std::unique_ptr<DiscreteSpace> m_pressure_space;
403
404
406 Eigen::VectorXd m_b;
407
409 Eigen::VectorXd m_sc_b;
410
411 std::vector<int> m_nsc_to_dof_map;
412 std::vector<int> m_sc_to_dof_map;
413
414 };
415
416 } // namespace DSL
417
418} // namespace HArDCore2D
419
420#endif
The BoundaryConditions class provides definition of boundary conditions.
Definition BoundaryConditions.hpp:45
const size_t n_dir_edges() const
Returns the number of Dirichlet edges.
Definition BoundaryConditions.hpp:70
Definition discrete-space.hpp:20
Definition hypre.hpp:31
const Eigen::MatrixXd & potential(size_t iT) const
Returns the potential reconstruction.
Definition hypre.hpp:96
virtual std::pair< Eigen::MatrixXd, Eigen::VectorXd > _magnetic_convective_stabilization_term(size_t iT, const Eigen::VectorXd &uT_old, const Eigen::VectorXd &bT_old, const HArDCore2D::MHDSolutions::IExactSolution *isolution, const double current_time)
Definition hypre.cpp:693
std::pair< Eigen::MatrixXd, Eigen::VectorXd > _compute_local_contribution(size_t iT, const HArDCore2D::NavierStokesSolutions::IExactSolution *isolution, const Eigen::VectorXd &uph_old, const Eigen::VectorXd &uph_prev, const double time_step, const double current_time)
Definition hypre.cpp:834
Eigen::VectorXd m_b
Definition hypre.hpp:370
double m_magnetic_diffusivity
Definition hypre.hpp:388
const std::vector< Eigen::MatrixXd > potential() const
Returns the vector of potential reconstructions.
Definition hypre.hpp:84
virtual Eigen::MatrixXd _forcing_terms(size_t iT, const HArDCore2D::NavierStokesSolutions::IExactSolution *isolution, const double current_time=0.)
Definition hypre.cpp:616
bool m_static_condensation
Definition hypre.hpp:347
std::function< VectorRd(const VectorRd &)> VelocityType
Definition hypre.hpp:43
const SystemMatrixType & staticallyCondensedMatrix() const
Returns the static condensation recovery operator.
Definition hypre.hpp:213
virtual std::pair< Eigen::MatrixXd, Eigen::VectorXd > _velocity_pressure_coupling(size_t iT, const HArDCore2D::NavierStokesSolutions::IExactSolution *isolution, const Eigen::VectorXd &uT_old, const Eigen::VectorXd &pT_old, const double &current_time=0.)
Definition hypre.cpp:555
std::vector< Eigen::MatrixXd > m_gradient_rhs
Definition hypre.hpp:360
size_t degree() const
Returns the degree.
Definition hypre.hpp:64
Eigen::VectorXd reconstructSolution(const Eigen::VectorXd &uhp_solsystem) const
Reconstruct the solution from the vector of non-statically-condensed DOFs.
virtual double convective_stabilization_parameter(size_t iT, const HArDCore2D::NavierStokesSolutions::IExactSolution *isolution, const size_t cell_degree, const double viscosity, const Eigen::VectorXd uT_old, const double current_time=0.) const
Evaluates convective stabilisation parameter.
Definition hypre.cpp:1155
std::function< VectorRd(const VectorRd &)> PressureGradientType
Definition hypre.hpp:47
const SystemMatrixType & systemMatrix() const
Returns the linear system matrix.
Definition hypre.hpp:193
std::pair< Eigen::MatrixXd, Eigen::VectorXd > _magnetic_diffusive_term(size_t iT, const Eigen::VectorXd &bT_old)
Definition hypre.cpp:177
const std::vector< Eigen::MatrixXd > stabilization() const
Returns the vector of stabilization matrices.
Definition hypre.hpp:90
const Mesh & mesh() const
Returns the mesh.
Definition hypre.hpp:166
std::ostream & m_output
Definition hypre.hpp:353
std::function< MatrixRd(const VectorRd &)> VelocityGradientType
Definition hypre.hpp:44
const DiscreteSpace & pressureSpace() const
Returns the pressure space.
Definition hypre.hpp:181
size_t numNonStaticallyCondensedDofsPressure() const
Returns the number of non statically condensed DOFs for the pressure.
Definition hypre.hpp:168
size_t numNonStaticallyCondensedDofsVelocity() const
Returns the number of non statically condensed DOFs for the velocity.
Definition hypre.hpp:162
double stabilizationParameter() const
Returns the stabilization parameter.
Definition hypre.hpp:78
size_t numStaticallyCondensedDofsVelocity() const
Returns the number of statically condensed DOFs for the velocity.
Definition hypre.hpp:114
std::pair< Eigen::MatrixXd, Eigen::VectorXd > _viscous_term(size_t iT, const Eigen::VectorXd &uT_old)
double m_stabilization_parameter
Definition hypre.hpp:349
Eigen::VectorXd m_sc_b
Definition hypre.hpp:373
size_t m_nloc_sc_u
Definition hypre.hpp:355
size_t numStaticallyCondensedDofs() const
Returns the number of statically condensed DOFs.
Definition hypre.hpp:126
size_t numLocalStaticallyCondensedDofsVelocity() const
Returns the local number of velocity statically condensed DOFs.
Definition hypre.hpp:102
std::unique_ptr< DiscreteSpace > m_pressure_space
Definition hypre.hpp:367
bool m_upwinding
Definition hypre.hpp:384
void assembleResidualSystem(const HArDCore2D::NavierStokesSolutions::IExactSolution *isolution, const Eigen::VectorXd &uph_old, const Eigen::VectorXd &uph_prev, const double time_step, const double current_time)
Assemble the global system.
Definition hypre.cpp:1042
const DiscreteSpace & velocitySpace() const
Returns the velocity space.
Definition hypre.hpp:175
Eigen::SparseMatrix< double > SystemMatrixType
Definition hypre.hpp:37
std::vector< Eigen::MatrixXd > m_discrete_l2
Definition hypre.hpp:358
const Eigen::VectorXd & systemVector() const
Returns the linear system right-hand side vector.
Definition hypre.hpp:203
const BoundaryConditions & boundaryConditions() const
Returns the boundary condition handler.
Definition hypre.hpp:223
virtual std::pair< Eigen::MatrixXd, Eigen::VectorXd > _linearized_convective_term(size_t iT, const Eigen::VectorXd &uT_old)
virtual std::pair< Eigen::MatrixXd, Eigen::VectorXd > _convective_stabilization_term(size_t iT, const Eigen::VectorXd &uT_old, const HArDCore2D::NavierStokesSolutions::IExactSolution *isolution, const double current_time=0.)
Definition hypre.cpp:775
std::function< VectorRd(const VectorRd &)> MomentumForcingTermType
Definition hypre.hpp:39
std::vector< int > m_nsc_to_dof_map
Definition hypre.hpp:375
virtual double magnetic_convective_stabilization_parameter(size_t iT, const HArDCore2D::MHDSolutions::IExactSolution *isolution, const Eigen::VectorXd &uT_old, const Eigen::VectorXd &bT_old, const size_t cell_degree, const double viscosity, const double magnetic_diffusivity, const double current_time) const
Definition hypre.cpp:1342
const Eigen::VectorXd & staticallyCondensedVector() const
Returns the static condensation rhs.
Definition hypre.hpp:218
size_t dimVelocity() const
Returns the dimension of velocity space.
Definition hypre.hpp:138
std::unique_ptr< DiscreteSpace > m_velocity_space
Definition hypre.hpp:366
SystemMatrixType & systemMatrix()
Returns the linear system matrix.
Definition hypre.hpp:198
SystemMatrixType m_A
Definition hypre.hpp:369
std::pair< Eigen::MatrixXd, Eigen::VectorXd > _time_deriv_term(size_t iT, const Eigen::VectorXd &uT_old, const Eigen::VectorXd &uT_prev, const double time_step)
size_t m_nloc_sc_p
Definition hypre.hpp:356
std::function< double(const VectorRd &)> CompressibilityForcingTermType
Definition hypre.hpp:41
std::vector< Eigen::MatrixXd > m_potential
Definition hypre.hpp:363
size_t sizeSystem() const
Returns the size of the final system with Lagrange multiplier, after application of SC and removal of...
Definition hypre.hpp:156
std::vector< Eigen::MatrixXd > m_stabilization
Definition hypre.hpp:364
size_t dimPressure() const
Returns the dimension of pressure space.
Definition hypre.hpp:144
size_t numLocalStaticallyCondensedDofsPressure() const
Returns the local number of pressure statically condensed DOFs.
Definition hypre.hpp:108
std::function< VectorRd(const VectorRd &)> MagneticForcingTermType
Definition hypre.hpp:40
size_t m_degree
Definition hypre.hpp:345
virtual std::tuple< Eigen::MatrixXd, Eigen::MatrixXd, Eigen::VectorXd > _linearized_convective_mixed_term(size_t iT, const Eigen::VectorXd &wT_old, const Eigen::VectorXd &vT_old)
Definition hypre.cpp:483
size_t numNonStaticallyCondensedDofs() const
Returns the number of DOFs after SC and with Lagrange multiplier, but before eliminating Dirichlet DO...
Definition hypre.hpp:150
const BoundaryConditions & m_bc
Definition hypre.hpp:346
Eigen::VectorXd pkpoPkPkPkInterpolate(const F &v, const InterpolateParameters &parameters={}) const
Compute the interpolate for the Pk+1-Pk-Pk-Pk method.
SystemMatrixType m_sc_A
Definition hypre.hpp:372
void _assemble_local_contribution(size_t iT, const std::pair< Eigen::MatrixXd, Eigen::VectorXd > &lsT, std::list< Eigen::Triplet< double > > &A1, Eigen::VectorXd &b1, std::list< Eigen::Triplet< double > > &A2, Eigen::VectorXd &b2)
double m_viscosity
Definition hypre.hpp:350
virtual std::pair< Eigen::MatrixXd, Eigen::VectorXd > _magnetic_field_magnetic_pressure_coupling(size_t iT, const HArDCore2D::MHDSolutions::IExactSolution *isolution, const Eigen::VectorXd &bT_old, const Eigen::VectorXd &rT_old, const double &current_time=0.)
Definition hypre.cpp:251
virtual ~HYPRE()
Definition hypre.hpp:56
std::function< double(const VectorRd &)> PressureType
Definition hypre.hpp:46
bool m_use_threads
Definition hypre.hpp:348
std::vector< int > m_sc_to_dof_map
Definition hypre.hpp:376
std::vector< Eigen::MatrixXd > m_gradient
Definition hypre.hpp:359
std::pair< Eigen::MatrixXd, Eigen::VectorXd > _compute_local_contribution(size_t iT, const HArDCore2D::MHDSolutions::IExactSolution *isolution, const Eigen::VectorXd &uph_old, const Eigen::VectorXd &brh_old)
Definition hypre.hpp:350
void _construct_local_operators(size_t iT)
size_t numStaticallyCondensedDofsPressure() const
Returns the number of statically condensed DOFs for the pressure.
Definition hypre.hpp:120
Eigen::VectorXd & systemVector()
Returns the linear system right-hand side vector.
Definition hypre.hpp:208
virtual Eigen::VectorXd interpolate(const VelocityType &u, const PressureType &p) const =0
Interpolates velocity and pressure.
HYPRE(const Mesh &mesh, size_t degree, const BoundaryConditions &bc, const HYPREParameters &parameters={})
LocalStaticCondensation _compute_static_condensation(const size_t &iT)
void assembleResidualSystem(const HArDCore2D::MHDSolutions::IExactSolution *isolution, const Eigen::VectorXd &uph_old, const Eigen::VectorXd &brh_old)
Definition hypre.hpp:240
size_t numDirichletDofs() const
Returns the number of Dirichlet DOFs.
Definition hypre.hpp:132
Definition Mesh2D.hpp:26
Eigen::Vector2d VectorRd
Definition basis.hpp:55
Eigen::Matrix2d MatrixRd
Definition basis.hpp:54
depending on the Matrix Market format indicated by or array(dense array storage). The data will be duplicated % as appropriate if symmetry is indicated in the header. % % Optionally
Definition mhd-solutions.hpp:9
static auto v
Definition ddrcore-test.hpp:32
Definition hypre.hpp:21
bool static_condensation
Definition hypre.hpp:22
double stabilization_parameter
Definition hypre.hpp:24
std::ostream & output
Definition hypre.hpp:28
bool use_threads
Definition hypre.hpp:23
bool upwinding
Definition hypre.hpp:28
double viscosity
Definition hypre.hpp:25
double magnetic_diffusivity
Definition hypre.hpp:31
Definition hho-interpolate.hpp:15
Structure to store information for, and perform, local static condensation.
Definition local_static_condensation.hpp:25
Definition mhd-solutions.hpp:15