22 #ifndef HYBRIDCORE_HPP
23 #define HYBRIDCORE_HPP
56 template<
typename GeometricSupport>
63 return (m >= 0 ? (m * (m + 1) * (2 * m + 1) + 9 * m * (m + 1) + 12 * (m + 1)) / 12 : 0);
70 return (m >= 0 ? (m + 1) * (m + 2) / 2 : 0);
77 return (m >= 0 ? m + 1 : 0);
90 const Eigen::VectorXd values,
127 Eigen::VectorXd
restr(
size_t iT)
const;
143 return m_values(index);
147 mutable Eigen::VectorXd m_values;
149 const int m_cell_deg;
150 const size_t m_face_deg;
182 const Mesh* mesh_ptr,
184 const size_t face_deg,
187 std::ostream & output = std::cout,
188 const bool ortho =
true
204 inline const size_t FaceDegree()
const {
return m_face_deg; };
210 assert( m_cell_basis[iT] );
211 return *m_cell_basis[iT].get();
218 assert( m_face_basis[iF] );
219 return *m_face_basis[iF].get();
226 assert( m_edge_basis[iE] );
227 return *m_edge_basis[iE].get();
242 template<
typename ContinuousFunction>
244 const ContinuousFunction& f,
246 const size_t deg_face,
261 const std::string from_dofs
268 const int m_cell_deg;
269 const size_t m_cell_deg_pos;
271 const int m_face_deg;
273 const int m_edge_deg;
277 std::ostream & m_output;
282 std::vector<std::unique_ptr<PolyCellBasisType>> m_cell_basis;
283 std::vector<std::unique_ptr<PolyFaceBasisType>> m_face_basis;
284 std::vector<std::unique_ptr<PolyEdgeBasisType>> m_edge_basis;
297 template<
typename ContinuousFunction>
300 size_t cell_deg_pos = std::max(cell_deg, 0);
305 size_t n_total_cell_dofs = m_mesh->
n_cells() * n_cell_dofs;
307 size_t n_total_face_dofs = m_mesh->
n_faces() * n_face_dofs;
308 Eigen::VectorXd XTF = Eigen::VectorXd::Zero( n_total_cell_dofs + n_total_face_dofs );
311 std::function<void(
size_t,
size_t)> construct_all_face_projections
312 = [&](
size_t start,
size_t end)->
void
314 for (
size_t iF = start; iF < end; iF++) {
320 Eigen::VectorXd UF = l2_projection<PolyFaceBasisType>(f,
FaceBasis(iF), quadF, phiF_quadF);
323 XTF.segment(n_total_cell_dofs + iF * n_face_dofs, n_face_dofs) = UF;
329 std::function<void(
size_t,
size_t)> construct_all_cell_projections
330 = [&](
size_t start,
size_t end)->
void
332 for (
size_t iT = start; iT < end; iT++) {
339 Eigen::MatrixXd MT =
compute_gram_matrix(phiT_quadT, phiT_quadT, quadT, n_cell_dofs, n_cell_dofs,
"sym");
342 Eigen::VectorXd bT = Eigen::VectorXd::Zero(n_cell_dofs);
343 for (
size_t i = 0; i < n_cell_dofs; i++) {
344 for (
size_t iqn = 0; iqn < quadT.size(); iqn++){
345 bT(i) += quadT[iqn].w * phiT_quadT[i][iqn] * f(quadT[iqn].vector());
350 Eigen::VectorXd UT = MT.ldlt().solve(bT);
353 size_t offset_T = iT * n_cell_dofs;
354 XTF.segment(offset_T, n_cell_dofs) = UT;
358 size_t nfaces = cell->n_faces();
364 for (
size_t ilF = 0; ilF < nfaces; ilF++){
365 VectorRd xF = cell->face(ilF)->center_mass();
366 size_t iF = cell->face(ilF)->global_index();
368 barycoefT(ilF) *= phiF_cst / phiT_cst;
372 for (
size_t ilF = 0; ilF < nfaces; ilF++) {
373 size_t iF = cell->face(ilF)->global_index();
374 XTF(iT) += barycoefT(ilF) * XTF(n_total_cell_dofs + iF);
Family of functions expressed as linear combination of the functions of a given basis.
Definition: basis.hpp:388
Definition: hybridcore.hpp:174
Definition: hybridcore.hpp:87
Class to describe a mesh.
Definition: MeshND.hpp:17
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:2189
FunctionValue function(size_t i, const VectorRd &x) const
Evaluate the i-th function at point x.
Definition: basis.hpp:427
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:339
static void parallel_for(unsigned nb_elements, std::function< void(size_t start, size_t end)> functor, bool use_threads=true)
Generic function to execute threaded processes.
Definition: parallel_for.hpp:58
bool use_threads
Definition: HHO_DiffAdvecReac.hpp:47
size_t const DimPoly(int m)
Eigen::VectorXd compute_weights(size_t iT) const
Computes the weights to get cell values from face values when l=-1.
Definition: hybridcore.cpp:175
double evaluate_in_face(const UVector Xh, size_t iF, VectorRd x) const
Evaluates a discrete function on the face iF at point x.
Definition: hybridcore.cpp:309
HybridCore(const Mesh *mesh_ptr, const int cell_deg, const size_t face_deg, const int edge_deg, const bool use_threads=true, std::ostream &output=std::cout, const bool ortho=true)
Class constructor: initialises the data structure with the given mesh, and desired polynomial degrees...
Definition: hybridcore.cpp:51
const size_t n_cell_dofs() const
Number of dofs in each cell.
Definition: hybridcore.hpp:112
const int CellDegree() const
Return the degree of cell polynomials.
Definition: hybridcore.hpp:201
Eigen::VectorXd VertexValues(const UVector Xh, const std::string from_dofs)
From a hybrid function, computes a vector of values at the vertices of the mesh.
Definition: hybridcore.cpp:325
const PolyEdgeBasisType & EdgeBasis(size_t iE) const
Return edge basis for edge with global index iE.
Definition: hybridcore.hpp:223
Eigen::VectorXd restr(size_t iT) const
Extract the restriction of the unknowns corresponding to cell iT and its faces.
Definition: hybridcore.cpp:28
const int CellDegreePos() const
Definition: hybridcore.hpp:202
const int get_cell_deg() const
Return the cell degree.
Definition: hybridcore.hpp:102
const size_t DimPoly< Face >(const int m)
Compute the size of the basis of 2-variate polynomials up to degree m.
Definition: hybridcore.hpp:68
const size_t n_total_cell_dofs() const
Total number of cell dofs (in the vector, this is where the face dofs start)
Definition: hybridcore.hpp:122
Family< MonomialScalarBasisCell > PolyCellBasisType
type for cell basis
Definition: hybridcore.hpp:192
const PolyFaceBasisType & FaceBasis(size_t iF) const
Return face basis for face with global index iF.
Definition: hybridcore.hpp:215
UVector operator+(const UVector &b)
Overloads the addition: adds the coefficients.
Definition: hybridcore.hpp:130
const size_t get_face_deg() const
Return the face degree.
Definition: hybridcore.hpp:107
double evaluate_in_cell(const UVector Xh, size_t iT, VectorRd x) const
Evaluates a discrete function in the cell iT at point x.
Definition: hybridcore.cpp:298
const size_t n_face_dofs() const
Number of dofs on each face.
Definition: hybridcore.hpp:117
Family< MonomialScalarBasisFace > PolyFaceBasisType
type for face basis
Definition: hybridcore.hpp:193
double L2norm(const UVector &Xh) const
Compute L2 norm of a discrete function (using cell values)
Definition: hybridcore.cpp:201
const size_t FaceDegree() const
Return the degree of face polynomials.
Definition: hybridcore.hpp:204
const size_t DimPoly< Cell >(const int m)
Compute the size of the basis of 3-variate polynomials up to degree m.
Definition: hybridcore.hpp:61
Eigen::VectorXd & asVectorXd() const
Return the values as an Eigen vector.
Definition: hybridcore.hpp:97
double operator()(size_t index) const
Overloads the (): returns the corresponding coefficient.
Definition: hybridcore.hpp:142
const size_t DimPoly< Edge >(const int m)
Compute the size of the basis of 1-variate polynomials up to degree m.
Definition: hybridcore.hpp:75
Family< MonomialScalarBasisEdge > PolyEdgeBasisType
type for edge basis
Definition: hybridcore.hpp:194
double H1norm(const UVector &Xh) const
Compute discrete H1 norm of a discrete function.
Definition: hybridcore.cpp:227
UVector interpolate(const ContinuousFunction &f, const int deg_cell, const size_t deg_face, size_t doe) const
Compute the interpolant in the discrete space of a continuous function.
Definition: hybridcore.hpp:298
UVector(const Eigen::VectorXd values, const Mesh &mesh, const int cell_deg, const size_t face_deg)
Definition: hybridcore.cpp:19
const Mesh * get_mesh() const
Returns a pointer to the mesh.
Definition: hybridcore.hpp:198
UVector operator-(const UVector &b)
Overloads the subtraction: subtracts the coefficients.
Definition: hybridcore.hpp:136
const PolyCellBasisType & CellBasis(size_t iT) const
Return cell basis for element with global index iT.
Definition: hybridcore.hpp:207
std::size_t n_faces() const
number of faces in the mesh.
Definition: MeshND.hpp:59
Face< dimension > * face(std::size_t index) const
get a constant pointer to a face using its global index
Definition: MeshND.hpp:196
std::size_t n_cells() const
number of cells in the mesh.
Definition: MeshND.hpp:60
Cell< dimension > * cell(std::size_t index) const
get a constant pointer to a cell using its global index
Definition: MeshND.hpp:197
QuadratureRule generate_quadrature_rule(const Cell &T, const int doe, const bool force_split)
Generate quadrature rule on mesh element.
Definition: quadraturerule.cpp:11
std::vector< QuadratureNode > QuadratureRule
Definition: quadraturerule.hpp:61
Definition: ddr-magnetostatics.hpp:40
MeshND::VectorRd< 2 > VectorRd
Definition: Mesh2D.hpp:14
MeshND::Face< 2 > Face
Definition: Mesh2D.hpp:12
MeshND::Cell< 2 > Cell
Definition: Mesh2D.hpp:13