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;
131 assert(m_cell_deg ==
b.get_cell_deg() || m_face_deg ==
b.get_face_deg() );
132 return UVector(m_values +
b.asVectorXd(), m_mesh, m_cell_deg, m_face_deg);
137 assert(m_cell_deg ==
b.get_cell_deg() || m_face_deg ==
b.get_face_deg() );
138 return UVector(m_values -
b.asVectorXd(), m_mesh, m_cell_deg, m_face_deg);
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,
187 std::ostream &
output = std::cout,
188 const bool ortho =
true
204 inline const size_t FaceDegree()
const {
return m_face_deg; };
211 return *m_cell_basis[
iT].get();
219 return *m_face_basis[
iF].get();
227 return *m_edge_basis[
iE].get();
242 template<
typename ContinuousFunction>
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>
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 );
312 = [&](
size_t start,
size_t end)->
void
323 XTF.segment(n_total_cell_dofs +
iF * n_face_dofs, n_face_dofs) =
UF;
330 = [&](
size_t start,
size_t end)->
void
333 Cell* cell = m_mesh->
cell(
iT);
342 Eigen::VectorXd
bT = Eigen::VectorXd::Zero(n_cell_dofs);
343 for (
size_t i = 0;
i < n_cell_dofs;
i++) {
350 Eigen::VectorXd
UT =
MT.ldlt().solve(
bT);
358 size_t nfaces = cell->n_faces();
362 VectorRd
xT = cell->center_mass();
365 VectorRd
xF = cell->face(
ilF)->center_mass();
366 size_t iF = cell->face(
ilF)->global_index();
373 size_t iF = cell->face(
ilF)->global_index();
Family of functions expressed as linear combination of the functions of a given basis.
Definition basis.hpp:389
Definition hybridcore.hpp:174
Definition hybridcore.hpp:87
Class to describe a mesh.
Definition MeshND.hpp:17
FunctionValue function(size_t i, const VectorRd &x) const
Evaluate the i-th function at point x.
Definition basis.hpp:428
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:2224
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:353
@ Matrix
Definition basis.hpp:67
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
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
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 PolyFaceBasisType & FaceBasis(size_t iF) const
Return face basis for face with global index iF.
Definition hybridcore.hpp:215
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 PolyEdgeBasisType & EdgeBasis(size_t iE) const
Return edge basis for edge with global index iE.
Definition hybridcore.hpp:223
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
UVector operator+(const UVector &b)
Overloads the addition: adds the coefficients.
Definition hybridcore.hpp:130
const Mesh * get_mesh() const
Returns a pointer to the mesh.
Definition hybridcore.hpp:198
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 PolyCellBasisType & CellBasis(size_t iT) const
Return cell basis for element with global index iT.
Definition hybridcore.hpp:207
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
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
Eigen::VectorXd & asVectorXd() const
Return the values as an Eigen vector.
Definition hybridcore.hpp:97
UVector operator-(const UVector &b)
Overloads the subtraction: subtracts the coefficients.
Definition hybridcore.hpp:136
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_faces() const
number of faces in the mesh.
Definition MeshND.hpp:59
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:41