11#include <unordered_set>
23 struct HYPREParameters {
30 std::ostream &
output = std::cout;
82 const std::vector<Eigen::MatrixXd>
potential()
const
228 const Eigen::VectorXd & uph_old,
229 const Eigen::VectorXd & uph_prev,
230 const Eigen::VectorXd & brh_old,
231 const Eigen::VectorXd & brh_prev,
232 const double time_step,
233 const double current_time);
240 const Eigen::VectorXd & uph_old,
241 const Eigen::VectorXd & brh_old) {
242 Eigen::VectorXd uph_prev = Eigen::VectorXd::Zero(uph_old.size());
243 Eigen::VectorXd brh_prev = Eigen::VectorXd::Zero(brh_old.size());
249 std::numeric_limits<double>::infinity(),
317 const size_t cell_degree,
318 const double viscosity,
319 const double magnetic_diffusivity,
320 const double current_time = 0.)
const {
332 for (
size_t iqn = 0; iqn < quad.size(); ++iqn) {
334 Eigen::VectorXd uT_old_iqn = isolution->
velocity(quad[iqn].vector(), current_time);
335 Eigen::VectorXd bT_old_iqn = isolution->
magnetic_field(quad[iqn].vector(), current_time);
336 double local_norm = std::max(uT_old_iqn.lpNorm<Eigen::Infinity>(), bT_old_iqn.lpNorm<Eigen::Infinity>());
345 beta_T = std::max(beta_T, local_norm);
359 const size_t cell_degree,
360 const double viscosity,
361 const double magnetic_diffusivity,
362 const double current_time = 0. )
const {
371 double gamma_T = 0.0;
374 for (
size_t iqn = 0; iqn < quad.size(); ++iqn) {
376 Eigen::VectorXd uT_old_iqn = isolution->
velocity(quad[iqn].vector(), current_time);
377 Eigen::VectorXd bT_old_iqn = isolution->
magnetic_field(quad[iqn].vector(), current_time);
378 double local_norm = std::max(uT_old_iqn.lpNorm<Eigen::Infinity>(), bT_old_iqn.lpNorm<Eigen::Infinity>());
388 gamma_T = std::max(gamma_T, local_norm);
404 const Eigen::VectorXd & uT_old,
405 const Eigen::VectorXd & uT_prev,
406 const double time_step);
409 std::pair<Eigen::MatrixXd, Eigen::VectorXd>
_viscous_term(
size_t iT,
const Eigen::VectorXd & uT_old);
417 const Eigen::VectorXd & uT_old,
418 const Eigen::VectorXd & pT_old,
419 const double & current_time = 0.
425 const Eigen::VectorXd & bT_old,
426 const Eigen::VectorXd & rT_old,
427 const double & current_time = 0.
434 const double current_time = 0.
437 virtual std::pair<Eigen::MatrixXd, Eigen::VectorXd>
440 virtual std::tuple<Eigen::MatrixXd, Eigen::MatrixXd, Eigen::VectorXd>
443 virtual std::pair<Eigen::MatrixXd, Eigen::VectorXd>
445 const Eigen::VectorXd & uT_old,
447 const double current_time = 0.);
449 virtual std::pair<Eigen::MatrixXd, Eigen::VectorXd>
451 const Eigen::VectorXd & bT_old,
453 const double current_time = 0.);
455 std::pair<Eigen::MatrixXd, Eigen::VectorXd>
459 const Eigen::VectorXd & uph_old,
460 const Eigen::VectorXd & uph_prev,
461 const Eigen::VectorXd & brh_old,
462 const Eigen::VectorXd & brh_prev,
463 const double time_step,
464 const double current_time);
466 std::pair<Eigen::MatrixXd, Eigen::VectorXd>
470 const Eigen::VectorXd & uph_old,
471 const Eigen::VectorXd & brh_old) {
472 Eigen::VectorXd uph_prev = uph_old;
473 Eigen::VectorXd brh_prev = brh_old;
481 std::numeric_limits<double>::infinity(),
490 const std::pair<Eigen::MatrixXd, Eigen::VectorXd> & lsT,
491 std::list<Eigen::Triplet<double> > & A1,
492 Eigen::VectorXd & b1,
493 std::list<Eigen::Triplet<double> > & A2,
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
const Eigen::MatrixXd & potential(size_t iT) const
Returns the potential reconstruction.
Definition hypre.hpp:94
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
virtual std::pair< Eigen::MatrixXd, Eigen::VectorXd > _magnetic_field_magnetic_pressure_coupling(size_t iT, const HArDCore2D::NavierStokesSolutions::IExactSolution *isolution, const Eigen::VectorXd &bT_old, const Eigen::VectorXd &rT_old, const double ¤t_time=0.)
Definition hypre.cpp:251
double m_magnetic_diffusivity
Definition hypre.hpp:505
const std::vector< Eigen::MatrixXd > potential() const
Returns the vector of potential reconstructions.
Definition hypre.hpp:82
bool m_static_condensation
Definition hypre.hpp:347
virtual std::pair< Eigen::MatrixXd, Eigen::VectorXd > _magnetic_convective_stabilization_term(size_t iT, const Eigen::VectorXd &bT_old, const HArDCore2D::NavierStokesSolutions::IExactSolution *isolution, const double current_time=0.)
Definition hypre.cpp:693
std::function< VectorRd(const VectorRd &)> VelocityType
Definition hypre.hpp:41
const SystemMatrixType & staticallyCondensedMatrix() const
Returns the static condensation recovery operator.
Definition hypre.hpp:211
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 &brh_old)
Definition hypre.hpp:467
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.
std::function< VectorRd(const VectorRd &)> PressureGradientType
Definition hypre.hpp:45
const SystemMatrixType & systemMatrix() const
Returns the linear system matrix.
Definition hypre.hpp:191
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:88
const Mesh & mesh() const
Returns the mesh.
Definition hypre.hpp:166
double convective_stabilization_parameter(size_t iT, const HArDCore2D::NavierStokesSolutions::IExactSolution *isolution, const size_t cell_degree, const double viscosity, const double magnetic_diffusivity, const double current_time=0.) const
Definition hypre.hpp:315
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.)
std::ostream & m_output
Definition hypre.hpp:353
std::function< MatrixRd(const VectorRd &)> VelocityGradientType
Definition hypre.hpp:42
const DiscreteSpace & pressureSpace() const
Returns the pressure space.
Definition hypre.hpp:179
size_t numNonStaticallyCondensedDofsPressure() const
Returns the number of non statically condensed DOFs for the pressure.
Definition hypre.hpp:166
size_t numNonStaticallyCondensedDofsVelocity() const
Returns the number of non statically condensed DOFs for the velocity.
Definition hypre.hpp:160
virtual Eigen::MatrixXd _forcing_terms(size_t iT, const HArDCore2D::NavierStokesSolutions::IExactSolution *isolution, const double current_time=0.)
double stabilizationParameter() const
Returns the stabilization parameter.
Definition hypre.hpp:76
size_t numStaticallyCondensedDofsVelocity() const
Returns the number of statically condensed DOFs for the velocity.
Definition hypre.hpp:112
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:124
size_t numLocalStaticallyCondensedDofsVelocity() const
Returns the local number of velocity statically condensed DOFs.
Definition hypre.hpp:100
std::unique_ptr< DiscreteSpace > m_pressure_space
Definition hypre.hpp:367
bool m_upwinding
Definition hypre.hpp:501
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:173
Eigen::SparseMatrix< double > SystemMatrixType
Definition hypre.hpp:35
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:201
const BoundaryConditions & boundaryConditions() const
Returns the boundary condition handler.
Definition hypre.hpp:221
virtual std::pair< Eigen::MatrixXd, Eigen::VectorXd > _linearized_convective_term(size_t iT, const Eigen::VectorXd &uT_old)
std::function< VectorRd(const VectorRd &)> MomentumForcingTermType
Definition hypre.hpp:37
std::vector< int > m_nsc_to_dof_map
Definition hypre.hpp:375
const Eigen::VectorXd & staticallyCondensedVector() const
Returns the static condensation rhs.
Definition hypre.hpp:216
size_t dimVelocity() const
Returns the dimension of velocity space.
Definition hypre.hpp:136
std::unique_ptr< DiscreteSpace > m_velocity_space
Definition hypre.hpp:366
SystemMatrixType & systemMatrix()
Returns the linear system matrix.
Definition hypre.hpp:196
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:39
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:154
std::vector< Eigen::MatrixXd > m_stabilization
Definition hypre.hpp:364
size_t dimPressure() const
Returns the dimension of pressure space.
Definition hypre.hpp:142
size_t numLocalStaticallyCondensedDofsPressure() const
Returns the local number of pressure statically condensed DOFs.
Definition hypre.hpp:106
std::function< VectorRd(const VectorRd &)> MagneticForcingTermType
Definition hypre.hpp:38
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:148
const BoundaryConditions & m_bc
Definition hypre.hpp:346
Eigen::VectorXd pkpoPkPkPkInterpolate(const F &v, const InterpolateParameters ¶meters={}) 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 > _velocity_pressure_coupling(size_t iT, const HArDCore2D::NavierStokesSolutions::IExactSolution *isolution, const Eigen::VectorXd &uT_old, const Eigen::VectorXd &pT_old, const double ¤t_time=0.)
virtual ~HYPRE()
Definition hypre.hpp:54
std::function< double(const VectorRd &)> PressureType
Definition hypre.hpp:44
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
void _construct_local_operators(size_t iT)
size_t numStaticallyCondensedDofsPressure() const
Returns the number of statically condensed DOFs for the pressure.
Definition hypre.hpp:118
Eigen::VectorXd & systemVector()
Returns the linear system right-hand side vector.
Definition hypre.hpp:206
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 ¶meters={})
void assembleResidualSystem(const HArDCore2D::NavierStokesSolutions::IExactSolution *isolution, const Eigen::VectorXd &uph_old, const Eigen::VectorXd &brh_old)
Definition hypre.hpp:238
LocalStaticCondensation _compute_static_condensation(const size_t &iT)
size_t numDirichletDofs() const
Returns the number of Dirichlet DOFs.
Definition hypre.hpp:130
double magnetic_convective_stabilization_parameter(size_t iT, const HArDCore2D::NavierStokesSolutions::IExactSolution *isolution, const size_t cell_degree, const double viscosity, const double magnetic_diffusivity, const double current_time=0.) const
Definition hypre.hpp:357
Eigen::Vector2d VectorRd
Definition basis.hpp:55
Eigen::Matrix2d MatrixRd
Definition basis.hpp:54
std::vector< QuadratureNode > QuadratureRule
Definition quadraturerule.hpp:55
QuadratureRule generate_quadrature_rule(const Cell &T, const int doe, const bool force_split)
Generate quadrature rule on mesh element.
Definition quadraturerule.cpp:10
if(strcmp(field, 'real')) % real valued entries T
Definition mmread.m:93
Definition ddr-klplate.hpp:27
static auto v
Definition ddrcore-test.hpp:32
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:26
double viscosity
Definition hypre.hpp:25
double magnetic_diffusivity
Definition hypre.hpp:29
Definition hho-interpolate.hpp:15
Structure to store information for, and perform, local static condensation.
Definition local_static_condensation.hpp:25
Definition ns-solutions.hpp:15
virtual Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const =0
virtual Eigen::Vector2d magnetic_field(const Eigen::Vector2d &x, const double &t=0) const =0