1#ifndef RTN_PK_PK_PK_HPP 
    2#define RTN_PK_PK_PK_HPP 
    4#include <boost/fusion/include/map.hpp> 
   14    class RTNPkPkPk: 
public HYPRE {      
 
   16      typedef boost::fusion::map<boost::fusion::pair<RolyCellType, std::string>,
 
   36        return m_cell_dofs_map;
 
 
   50                                               const Eigen::VectorXd & uT_old,
 
   51                                               const Eigen::VectorXd & bT_old,
 
   52                                                     const size_t cell_degree,
 
   53                                                     const double viscosity,
 
   54                                                     const double magnetic_diffusivity,
 
   55                                                     const double current_time) 
const;  
 
   59                                               const Eigen::VectorXd & uT_old,
 
   60                                               const Eigen::VectorXd & bT_old,
 
   61                                                     const size_t cell_degree,
 
   62                                                     const double viscosity,
 
   63                                                     const double magnetic_diffusivity,
 
   64                                                     const double current_time) 
const;      
 
   68      Eigen::VectorXd _interpolate_velocity(
 
   73      void _construct_local_operators(
size_t iT);
 
   74      void _construct_stabilization(
size_t iT);
 
   75      std::pair<Eigen::MatrixXd, Eigen::VectorXd> _velocity_pressure_coupling(
 
   78                                                                              const Eigen::VectorXd & uT_old,
 
   79                                                                              const Eigen::VectorXd & pT_old,
 
   80                                                                              const double & current_time
 
   83      std::pair<Eigen::MatrixXd, Eigen::VectorXd> _magnetic_field_magnetic_pressure_coupling(
 
   86                                                                                                  const Eigen::VectorXd & bT_old,
 
   87                                                                                                  const Eigen::VectorXd & rT_old,
 
   88                                                                              const double & current_time 
 
   91      Eigen::MatrixXd _forcing_terms(
 
   94                                     const double current_time = 0.
 
   97      std::pair<Eigen::MatrixXd, Eigen::VectorXd> _linearized_convective_term(
 
   99                                                                              const Eigen::VectorXd & uT_old
 
  102      std::tuple<Eigen::MatrixXd, Eigen::MatrixXd, Eigen::VectorXd> _linearized_convective_mixed_term(
 
  104                                                                              const Eigen::VectorXd & wT_old,
 
  105                                                                              const Eigen::VectorXd & vT_old
 
  108      std::pair<Eigen::MatrixXd, Eigen::VectorXd> _convective_stabilization_term(
 
  110                                                                                 const Eigen::VectorXd & uT_old,
 
  111                                                                                 const Eigen::VectorXd & bT_old,
 
  113                                                                                 const double current_time
 
  116      std::pair<Eigen::MatrixXd, Eigen::VectorXd> _magnetic_convective_stabilization_term(
 
  118                                                                                 const Eigen::VectorXd & uT_old,
 
  119                                                                                 const Eigen::VectorXd & bT_old,
 
  121                                                                                 const double current_time
 
  126      std::unique_ptr<DiscreteSpace> m_pkpo_pk;
 
  132    Eigen::VectorXd RTNPkPkPk::_interpolate_velocity(
 
  134                                                     const InterpolateParameters & parameters
 
  140      int doe_cell = (parameters.doe_cell > 0 ? doe_cell : 2 * 
m_degree + 1);
 
  141      int doe_edge = (parameters.doe_edge > 0 ? doe_edge : 2 * 
m_degree + 3);
 
  144      std::function<void(
size_t, 
size_t)> interpolate_edges
 
  145        = [
this, 
v, &vh, &doe_edge](
size_t start, 
size_t end)->
void 
  149          for (
size_t iE = start; iE < 
end; iE++) {
 
  151            const auto & edge_dofs_E = edge_dofs[E.global_index()];
 
  154            vh.segment(this->
m_velocity_space->globalOffset(E), this->m_velocity_space->numberOfLocalEdgeDofs())
 
  161      std::function<void(
size_t, 
size_t)> interpolate_cells
 
  162        = [
this, &vh, 
v, &doe_cell, &doe_edge](
size_t start, 
size_t end)->
void 
  169          size_t dim_rtn_cell_dofs = LocalSpaceDimensions<PolynCellType>::get(
m_degree - 1);
 
  170          size_t dim_rtn_edge_dofs = LocalSpaceDimensions<PolyEdgeType>::get(
m_degree);
 
  171          size_t dim_roly_cell_dofs = LocalSpaceDimensions<RolyCellType>::get(
m_degree);
 
  172          size_t dim_roly_compl_cell_dofs = LocalSpaceDimensions<RolyComplCellType>::get(
m_degree + 1);
 
  173          size_t dim_cell_dofs = dim_roly_cell_dofs + dim_roly_compl_cell_dofs;
 
  175          for (
size_t iT = start; iT < 
end; iT++) {
 
  179            Eigen::MatrixXd MIT = Eigen::MatrixXd::Zero(dim_cell_dofs, dim_cell_dofs);
 
  180            Eigen::VectorXd bIT = Eigen::VectorXd(dim_cell_dofs);
 
  185            if (dim_rtn_cell_dofs > 0) {
 
  188              MIT.block(m_rtn_dof_table.
localOffset(
T), 0, dim_rtn_cell_dofs, dim_roly_cell_dofs)
 
  189                = 
GramMatrix(
T, *rtn_cell_dofs, *roly_cell_dofs[iT], int_mono_cell);
 
  190              MIT.block(m_rtn_dof_table.
localOffset(
T), dim_roly_cell_dofs, dim_rtn_cell_dofs, dim_roly_compl_cell_dofs)
 
  191                = 
GramMatrix(
T, *rtn_cell_dofs, *roly_compl_cell_dofs[iT], int_mono_cell);
 
  194              bIT.segment(m_rtn_dof_table.
localOffset(
T), dim_rtn_cell_dofs)
 
  198            for (
size_t iE = 0; iE < 
T.n_edges(); iE++) {
 
  199              const Edge & E = *
T.edge(iE);
 
  200              auto nTE = 
T.edge_normal(iE);
 
  202              const auto & rtn_edge_dofs_E = rtn_edge_dofs[E.global_index()];
 
  204              auto normal_component = [&nTE](
const VectorRd & w)->
double { 
return w.dot(nTE); };
 
  207              auto roly_cell_dofs_quad
 
  210              auto roly_compl_cell_dofs_quad
 
  216              std::function<double(
const VectorRd &)> evaluate_normal_component
 
  217                = [
v, &nTE](
const VectorRd & 
x) { 
return v(
x).dot(nTE); };
 
  219              MIT.block(m_rtn_dof_table.
localOffset(
T, E), 0, dim_rtn_edge_dofs, dim_roly_cell_dofs)
 
  221              MIT.block(m_rtn_dof_table.
localOffset(
T, E), dim_roly_cell_dofs, dim_rtn_edge_dofs, dim_roly_compl_cell_dofs)
 
  224              bIT.segment(m_rtn_dof_table.
localOffset(
T, E), dim_rtn_edge_dofs)
 
  225                = 
l2_projection(evaluate_normal_component, *rtn_edge_dofs_E, quad_E, rtn_edge_dofs_quad, 
GramMatrix(E, *rtn_edge_dofs_E));
 
  228            vh.segment(this->
m_velocity_space->globalOffset(T), this->m_velocity_space->numberOfLocalCellDofs())
 
  229              = MIT.fullPivLu().solve(bIT);
 
The BoundaryConditions class provides definition of boundary conditions.
Definition BoundaryConditions.hpp:45
 
Definition discrete-space.hpp:20
 
std::function< VectorRd(const VectorRd &)> VelocityType
Definition hypre.hpp:37
 
size_t degree() const
Returns the degree.
Definition hypre.hpp:64
 
const Mesh & mesh() const
Returns the mesh.
Definition hypre.hpp:166
 
std::unique_ptr< DiscreteSpace > m_velocity_space
Definition hypre.hpp:366
 
size_t m_degree
Definition hypre.hpp:345
 
std::function< double(const VectorRd &)> PressureType
Definition hypre.hpp:39
 
bool m_use_threads
Definition hypre.hpp:348
 
Eigen::VectorXd extendCellDofs(const Eigen::VectorXd &vh) const
Extend cell DOFs from  to .
 
const DiscreteSpace & extendedDofsSpace() const
Return the discrete space corresponding to the extended DOFs.
Definition rtn-pk-pk-pk.hpp:43
 
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 rtn-pk-pk-pk.cpp:763
 
RTNPkPkPk(const Mesh &mesh, size_t degree, const BoundaryConditions &bc, const HYPREParameters ¶meters)
Constructor.
 
boost::fusion::map< boost::fusion::pair< RolyCellType, std::string >, boost::fusion::pair< RolyComplCellType, std::string > > CellDofsMapType
Definition rtn-pk-pk-pk.hpp:17
 
const CellDofsMapType & cellDofsMap() const
Return cell DOFs map.
Definition rtn-pk-pk-pk.hpp:34
 
double magnetic_convective_stabilization_parameter(size_t iT, const HArDCore2D::NavierStokesSolutions::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 rtn-pk-pk-pk.cpp:1188
 
Eigen::VectorXd interpolate(const VelocityType &u, const PressureType &p) const
Interpolate both velocity and pressure.
 
Base class for global DOF spaces. Provides functions to manipulate global DOFs (the local version bei...
Definition globaldofspace.hpp:16
 
end
Definition convergence_analysis.m:107
 
Create grid points x
Definition generate_cartesian_mesh.m:22
 
Eigen::Vector2d VectorRd
Definition basis.hpp:55
 
Eigen::MatrixXd compute_gram_matrix(const boost::multi_array< VectorRd, 2 > &B1, const boost::multi_array< double, 2 > &B2, const QuadratureRule &qr)
Compute the Gram-like matrix given a family of vector-valued and one of scalar-valued functions by te...
Definition basis.cpp:239
 
Eigen::VectorXd l2_projection(const std::function< typename BasisType::FunctionValue(const VectorRd &)> &f, const BasisType &basis, QuadratureRule &quad, const boost::multi_array< typename BasisType::FunctionValue, 2 > &basis_quad, const Eigen::MatrixXd &mass_basis=Eigen::MatrixXd::Zero(1, 1))
Compute the L2-projection of a function.
Definition basis.hpp:3023
 
static boost::multi_array< typename detail::basis_evaluation_traits< BasisType, BasisFunction >::ReturnValue, 2 > compute(const BasisType &basis, const QuadratureRule &quad)
Generic basis evaluation.
Definition basis.hpp:2425
 
size_t localOffset(const Edge &E, const Vertex &V) const
Returns the local offset of the vertex V with respect to the edge E.
Definition localdofspace.hpp:143
 
static void parallel_for(unsigned nb_elements, std::function< void(size_t start, size_t end)> functor, bool use_threads=true, unsigned nb_threads_max=1e9)
Generic function to execute threaded processes.
Definition parallel_for.hpp:42
 
Polytope< DIMENSION > Cell
Definition Polytope2D.hpp:151
 
Polytope< 1 > Edge
A Face is a Polytope with object_dim = DIMENSION - 1.
Definition Polytope2D.hpp:147
 
std::vector< QuadratureNode > QuadratureRule
Definition quadraturerule.hpp:55
 
std::unordered_map< VectorZd, double, VecHash > MonomialCellIntegralsType
Type for list of integrals of monomials.
Definition GMpoly_cell.hpp:53
 
MonomialCellIntegralsType IntegrateCellMonomials(const Cell &T, const size_t maxdeg)
Compute all integrals on a cell of monomials up to a total degree, using vertex values.
Definition GMpoly_cell.cpp:7
 
Eigen::MatrixXd GramMatrix(const Cell &T, const MonomialScalarBasisCell &basis1, const MonomialScalarBasisCell &basis2, MonomialCellIntegralsType mono_int_map={})
Computes the Gram Matrix of a pair of local scalar monomial bases.
Definition GMpoly_cell.cpp:86
 
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
 
TensorizedVectorFamily< PolyCellType, dimspace > PolynCellType
Definition discrete-space-descriptor.hpp:23
 
TensorizedVectorFamily< Family< MonomialScalarBasisEdge >, dimspace > PolynEdgeType
Definition discrete-space-descriptor.hpp:24
 
Family< RolyComplBasisCell > RolyComplCellType
Definition discrete-space-descriptor.hpp:30
 
Family< CurlBasis< ShiftedBasis< MonomialScalarBasisCell > > > RolyCellType
Definition discrete-space-descriptor.hpp:29
 
Family< MonomialScalarBasisEdge > PolyEdgeType
Definition discrete-space-descriptor.hpp:22
 
Definition ddr-klplate.hpp:27
 
static auto v
Definition ddrcore-test.hpp:32
 
Definition hho-interpolate.hpp:15
 
Definition ns-solutions.hpp:15
 
Evaluate a basis at quadrature nodes. 'BasisFunction' (=Function, Gradient, Curl, Divergence,...
Definition basis.hpp:2421