From: Peter Munch Date: Fri, 31 Jul 2020 21:50:47 +0000 (+0200) Subject: Add face_no to methods of FiniteElements X-Git-Tag: v9.3.0-rc1~1231^2 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F10779%2Fhead;p=dealii.git Add face_no to methods of FiniteElements --- diff --git a/include/deal.II/dofs/dof_accessor.templates.h b/include/deal.II/dofs/dof_accessor.templates.h index c97f88f247..3b9f963185 100644 --- a/include/deal.II/dofs/dof_accessor.templates.h +++ b/include/deal.II/dofs/dof_accessor.templates.h @@ -968,6 +968,7 @@ namespace internal [&](const auto d) { return fe.adjust_quad_dof_index_for_face_orientation( d, + quad, accessor.face_orientation(quad), accessor.face_flip(quad), accessor.face_rotation(quad)); diff --git a/include/deal.II/fe/fe.h b/include/deal.II/fe/fe.h index 586a3784ff..48b0c78124 100644 --- a/include/deal.II/fe/fe.h +++ b/include/deal.II/fe/fe.h @@ -1285,7 +1285,8 @@ public: */ virtual void get_face_interpolation_matrix(const FiniteElement &source, - FullMatrix &matrix) const; + FullMatrix & matrix, + const unsigned int face_no = 0) const; /** @@ -1302,7 +1303,8 @@ public: virtual void get_subface_interpolation_matrix(const FiniteElement &source, const unsigned int subface, - FullMatrix &matrix) const; + FullMatrix & matrix, + const unsigned int face_no = 0) const; //@} @@ -1341,7 +1343,8 @@ public: * of freedom on quads. */ virtual std::vector> - hp_quad_dof_identities(const FiniteElement &fe_other) const; + hp_quad_dof_identities(const FiniteElement &fe_other, + const unsigned int face_no = 0) const; /** * Return whether this element dominates another one given as argument @@ -1465,7 +1468,8 @@ public: * indices. The function is mainly there for use inside the library. */ std::pair - face_system_to_component_index(const unsigned int index) const; + face_system_to_component_index(const unsigned int index, + const unsigned int face_no = 0) const; /** * For faces with non-standard face_orientation in 3D, the dofs on faces @@ -1477,6 +1481,7 @@ public: */ unsigned int adjust_quad_dof_index_for_face_orientation(const unsigned int index, + const unsigned int face_no, const bool face_orientation, const bool face_flip, const bool face_rotation) const; @@ -1760,7 +1765,8 @@ public: * indices. The function is mainly there for use inside the library. */ std::pair, unsigned int> - face_system_to_base_index(const unsigned int index) const; + face_system_to_base_index(const unsigned int index, + const unsigned int face_no = 0) const; /** * Given a base element number, return the first block of a BlockVector it @@ -2082,7 +2088,7 @@ public: * See the class documentation for details on support points. */ const std::vector> & - get_unit_face_support_points() const; + get_unit_face_support_points(const unsigned int face_no = 0) const; /** * Return whether a finite element has defined support points on faces. If @@ -2093,14 +2099,15 @@ public: * function. */ bool - has_face_support_points() const; + has_face_support_points(const unsigned int face_no = 0) const; /** * The function corresponding to the unit_support_point() function, but for * faces. See there for more information. */ virtual Point - unit_face_support_point(const unsigned int index) const; + unit_face_support_point(const unsigned int index, + const unsigned int face_no = 0) const; /** * Return a vector of generalized support points. @@ -3120,7 +3127,8 @@ FiniteElement::component_to_system_index( template inline std::pair FiniteElement::face_system_to_component_index( - const unsigned int index) const + const unsigned int index, + const unsigned int) const { AssertIndexRange(index, face_system_to_component_table.size()); @@ -3160,7 +3168,8 @@ FiniteElement::system_to_base_index( template inline std::pair, unsigned int> FiniteElement::face_system_to_base_index( - const unsigned int index) const + const unsigned int index, + const unsigned int) const { AssertIndexRange(index, face_system_to_base_table.size()); return face_system_to_base_table[index]; diff --git a/include/deal.II/fe/fe_bernstein.h b/include/deal.II/fe/fe_bernstein.h index a88638272f..c8fabd805a 100644 --- a/include/deal.II/fe/fe_bernstein.h +++ b/include/deal.II/fe/fe_bernstein.h @@ -117,7 +117,8 @@ public: */ virtual void get_face_interpolation_matrix(const FiniteElement &source, - FullMatrix &matrix) const override; + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * Return the matrix interpolating from a face of one element to the face of @@ -129,9 +130,11 @@ public: * FiniteElement::ExcInterpolationNotImplemented is thrown. */ virtual void - get_subface_interpolation_matrix(const FiniteElement &source, - const unsigned int subface, - FullMatrix &matrix) const override; + get_subface_interpolation_matrix( + const FiniteElement &source, + const unsigned int subface, + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * Return whether this element implements its hanging node constraints in @@ -172,8 +175,8 @@ public: * of freedom on quads. */ virtual std::vector> - hp_quad_dof_identities( - const FiniteElement &fe_other) const override; + hp_quad_dof_identities(const FiniteElement &fe_other, + const unsigned int face_no = 0) const override; /** * @copydoc FiniteElement::compare_for_domination() diff --git a/include/deal.II/fe/fe_dgp.h b/include/deal.II/fe/fe_dgp.h index 007fd1a388..caa3b23916 100644 --- a/include/deal.II/fe/fe_dgp.h +++ b/include/deal.II/fe/fe_dgp.h @@ -368,8 +368,8 @@ public: * course empty. */ virtual std::vector> - hp_quad_dof_identities( - const FiniteElement &fe_other) const override; + hp_quad_dof_identities(const FiniteElement &fe_other, + const unsigned int face_no = 0) const override; /** * Return whether this element implements its hanging node constraints in @@ -406,7 +406,8 @@ public: */ virtual void get_face_interpolation_matrix(const FiniteElement &source, - FullMatrix &matrix) const override; + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * Return the matrix interpolating from a face of one element to the face @@ -420,9 +421,11 @@ public: * FiniteElement::ExcInterpolationNotImplemented. */ virtual void - get_subface_interpolation_matrix(const FiniteElement &source, - const unsigned int subface, - FullMatrix &matrix) const override; + get_subface_interpolation_matrix( + const FiniteElement &source, + const unsigned int subface, + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * This function returns @p true, if the shape function @p shape_index has diff --git a/include/deal.II/fe/fe_dgp_monomial.h b/include/deal.II/fe/fe_dgp_monomial.h index 30488ff42c..ddbc679d31 100644 --- a/include/deal.II/fe/fe_dgp_monomial.h +++ b/include/deal.II/fe/fe_dgp_monomial.h @@ -341,7 +341,8 @@ public: * course empty. */ virtual std::vector> - hp_quad_dof_identities(const FiniteElement &fe_other) const override; + hp_quad_dof_identities(const FiniteElement &fe_other, + const unsigned int face_no = 0) const override; /** * Return whether this element implements its hanging node constraints in @@ -391,7 +392,8 @@ public: */ virtual void get_face_interpolation_matrix(const FiniteElement &source, - FullMatrix &matrix) const override; + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * Return the matrix interpolating from a face of one element to the face @@ -405,9 +407,11 @@ public: * FiniteElement::ExcInterpolationNotImplemented. */ virtual void - get_subface_interpolation_matrix(const FiniteElement &source, - const unsigned int subface, - FullMatrix &matrix) const override; + get_subface_interpolation_matrix( + const FiniteElement &source, + const unsigned int subface, + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * This function returns @p true, if the shape function @p shape_index has diff --git a/include/deal.II/fe/fe_dgp_nonparametric.h b/include/deal.II/fe/fe_dgp_nonparametric.h index 09de0822dd..4944c55abc 100644 --- a/include/deal.II/fe/fe_dgp_nonparametric.h +++ b/include/deal.II/fe/fe_dgp_nonparametric.h @@ -393,7 +393,8 @@ public: */ virtual void get_face_interpolation_matrix(const FiniteElement &source, - FullMatrix &matrix) const override; + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * Return the matrix interpolating from a face of one element to the face @@ -407,9 +408,11 @@ public: * FiniteElement::ExcInterpolationNotImplemented. */ virtual void - get_subface_interpolation_matrix(const FiniteElement &source, - const unsigned int subface, - FullMatrix &matrix) const override; + get_subface_interpolation_matrix( + const FiniteElement &source, + const unsigned int subface, + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * @name Functions to support hp @@ -457,8 +460,8 @@ public: * course empty. */ virtual std::vector> - hp_quad_dof_identities( - const FiniteElement &fe_other) const override; + hp_quad_dof_identities(const FiniteElement &fe_other, + const unsigned int face_no = 0) const override; /** * Return whether this element implements its hanging node constraints in diff --git a/include/deal.II/fe/fe_dgq.h b/include/deal.II/fe/fe_dgq.h index ed1e2a9baa..7e5828a6a3 100644 --- a/include/deal.II/fe/fe_dgq.h +++ b/include/deal.II/fe/fe_dgq.h @@ -152,7 +152,8 @@ public: */ virtual void get_face_interpolation_matrix(const FiniteElement &source, - FullMatrix &matrix) const override; + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * Return the matrix interpolating from a face of one element to the face @@ -166,9 +167,11 @@ public: * FiniteElement::ExcInterpolationNotImplemented. */ virtual void - get_subface_interpolation_matrix(const FiniteElement &source, - const unsigned int subface, - FullMatrix &matrix) const override; + get_subface_interpolation_matrix( + const FiniteElement &source, + const unsigned int subface, + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * Projection from a fine grid space onto a coarse grid space. Overrides the @@ -266,8 +269,8 @@ public: * course empty. */ virtual std::vector> - hp_quad_dof_identities( - const FiniteElement &fe_other) const override; + hp_quad_dof_identities(const FiniteElement &fe_other, + const unsigned int face_no = 0) const override; /** * Return whether this element implements its hanging node constraints in diff --git a/include/deal.II/fe/fe_enriched.h b/include/deal.II/fe/fe_enriched.h index e34b3cf96c..453294237b 100644 --- a/include/deal.II/fe/fe_enriched.h +++ b/include/deal.II/fe/fe_enriched.h @@ -397,7 +397,8 @@ public: */ virtual void get_face_interpolation_matrix(const FiniteElement &source, - FullMatrix &matrix) const override; + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * Return the matrix interpolating from a face of one element to the @@ -412,9 +413,11 @@ public: * will get propagated out from this element. */ virtual void - get_subface_interpolation_matrix(const FiniteElement &source, - const unsigned int subface, - FullMatrix &matrix) const override; + get_subface_interpolation_matrix( + const FiniteElement &source, + const unsigned int subface, + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * If, on a vertex, several finite elements are active, the hp code first @@ -448,8 +451,8 @@ public: * of freedom on quads. */ virtual std::vector> - hp_quad_dof_identities( - const FiniteElement &fe_other) const override; + hp_quad_dof_identities(const FiniteElement &fe_other, + const unsigned int face_no = 0) const override; /** * @copydoc FiniteElement::compare_for_domination() diff --git a/include/deal.II/fe/fe_face.h b/include/deal.II/fe/fe_face.h index 34717b6cb5..6faad3c65d 100644 --- a/include/deal.II/fe/fe_face.h +++ b/include/deal.II/fe/fe_face.h @@ -96,7 +96,8 @@ public: */ virtual void get_face_interpolation_matrix(const FiniteElement &source, - FullMatrix &matrix) const override; + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * Return the matrix interpolating from a face of one element to the face @@ -107,9 +108,11 @@ public: * FiniteElement::ExcInterpolationNotImplemented is thrown. */ virtual void - get_subface_interpolation_matrix(const FiniteElement &source, - const unsigned int subface, - FullMatrix &matrix) const override; + get_subface_interpolation_matrix( + const FiniteElement &source, + const unsigned int subface, + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * This function returns @p true, if the shape function @p shape_index has @@ -162,8 +165,8 @@ public: * The set of such constraints is non-empty only for dim==3. */ virtual std::vector> - hp_quad_dof_identities( - const FiniteElement &fe_other) const override; + hp_quad_dof_identities(const FiniteElement &fe_other, + const unsigned int face_no = 0) const override; /** * Return whether this element implements its hanging node constraints in @@ -244,7 +247,8 @@ public: */ virtual void get_face_interpolation_matrix(const FiniteElement<1, spacedim> &source, - FullMatrix &matrix) const override; + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * Return the matrix interpolating from a face of one element to the face @@ -255,9 +259,11 @@ public: * FiniteElement::ExcInterpolationNotImplemented is thrown. */ virtual void - get_subface_interpolation_matrix(const FiniteElement<1, spacedim> &source, - const unsigned int subface, - FullMatrix &matrix) const override; + get_subface_interpolation_matrix( + const FiniteElement<1, spacedim> &source, + const unsigned int subface, + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * This function returns @p true, if the shape function @p shape_index has @@ -312,8 +318,8 @@ public: * The set of such constraints is non-empty only for dim==3. */ virtual std::vector> - hp_quad_dof_identities( - const FiniteElement<1, spacedim> &fe_other) const override; + hp_quad_dof_identities(const FiniteElement<1, spacedim> &fe_other, + const unsigned int face_no = 0) const override; /** * Return a list of constant modes of the element. For this element, it @@ -493,7 +499,8 @@ public: */ virtual void get_face_interpolation_matrix(const FiniteElement &source, - FullMatrix &matrix) const override; + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * Return the matrix interpolating from a face of one element to the face @@ -504,9 +511,11 @@ public: * FiniteElement::ExcInterpolationNotImplemented is thrown. */ virtual void - get_subface_interpolation_matrix(const FiniteElement &source, - const unsigned int subface, - FullMatrix &matrix) const override; + get_subface_interpolation_matrix( + const FiniteElement &source, + const unsigned int subface, + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * This function returns @p true, if the shape function @p shape_index has diff --git a/include/deal.II/fe/fe_nedelec.h b/include/deal.II/fe/fe_nedelec.h index c1c8fc333c..7e3376700c 100644 --- a/include/deal.II/fe/fe_nedelec.h +++ b/include/deal.II/fe/fe_nedelec.h @@ -223,7 +223,8 @@ public: * of freedom on lines. */ virtual std::vector> - hp_quad_dof_identities(const FiniteElement &fe_other) const override; + hp_quad_dof_identities(const FiniteElement &fe_other, + const unsigned int face_no = 0) const override; /** * Return the matrix interpolating from a face of one element to the face of @@ -238,7 +239,8 @@ public: */ virtual void get_face_interpolation_matrix(const FiniteElement &source, - FullMatrix &matrix) const override; + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * Return the matrix interpolating from a face of one element to the subface @@ -252,9 +254,11 @@ public: * ExcInterpolationNotImplemented. */ virtual void - get_subface_interpolation_matrix(const FiniteElement &source, - const unsigned int subface, - FullMatrix &matrix) const override; + get_subface_interpolation_matrix( + const FiniteElement &source, + const unsigned int subface, + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * Projection from a fine grid space onto a coarse grid space. If this diff --git a/include/deal.II/fe/fe_nothing.h b/include/deal.II/fe/fe_nothing.h index 9ee80fb0f6..1843672195 100644 --- a/include/deal.II/fe/fe_nothing.h +++ b/include/deal.II/fe/fe_nothing.h @@ -206,8 +206,8 @@ public: const FiniteElement &fe_other) const override; virtual std::vector> - hp_quad_dof_identities( - const FiniteElement &fe_other) const override; + hp_quad_dof_identities(const FiniteElement &fe_other, + const unsigned int face_no = 0) const override; virtual bool hp_constraints_are_implemented() const override; @@ -232,9 +232,9 @@ public: */ virtual void - get_face_interpolation_matrix( - const FiniteElement &source_fe, - FullMatrix & interpolation_matrix) const override; + get_face_interpolation_matrix(const FiniteElement &source_fe, + FullMatrix &interpolation_matrix, + const unsigned int face_no = 0) const override; /** @@ -250,7 +250,8 @@ public: get_subface_interpolation_matrix( const FiniteElement &source_fe, const unsigned int index, - FullMatrix & interpolation_matrix) const override; + FullMatrix & interpolation_matrix, + const unsigned int face_no = 0) const override; /** * @return true if the FE dominates any other. diff --git a/include/deal.II/fe/fe_q_base.h b/include/deal.II/fe/fe_q_base.h index 1aba53ee59..ae2a6cffc3 100644 --- a/include/deal.II/fe/fe_q_base.h +++ b/include/deal.II/fe/fe_q_base.h @@ -72,7 +72,8 @@ public: */ virtual void get_face_interpolation_matrix(const FiniteElement &source, - FullMatrix &matrix) const override; + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * Return the matrix interpolating from a face of one element to the face @@ -84,9 +85,11 @@ public: * thrown. */ virtual void - get_subface_interpolation_matrix(const FiniteElement &source, - const unsigned int subface, - FullMatrix &matrix) const override; + get_subface_interpolation_matrix( + const FiniteElement &source, + const unsigned int subface, + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * This function returns @p true, if the shape function @p shape_index has @@ -256,8 +259,8 @@ public: * of freedom on quads. */ virtual std::vector> - hp_quad_dof_identities( - const FiniteElement &fe_other) const override; + hp_quad_dof_identities(const FiniteElement &fe_other, + const unsigned int face_no = 0) const override; //@} diff --git a/include/deal.II/fe/fe_q_hierarchical.h b/include/deal.II/fe/fe_q_hierarchical.h index 9cd599b94c..47d97564b9 100644 --- a/include/deal.II/fe/fe_q_hierarchical.h +++ b/include/deal.II/fe/fe_q_hierarchical.h @@ -624,7 +624,8 @@ public: * Same as above but for faces. */ virtual std::vector> - hp_quad_dof_identities(const FiniteElement &fe_other) const override; + hp_quad_dof_identities(const FiniteElement &fe_other, + const unsigned int face_no = 0) const override; /** * @copydoc FiniteElement::compare_for_domination() @@ -648,7 +649,8 @@ public: */ virtual void get_face_interpolation_matrix(const FiniteElement &source, - FullMatrix &matrix) const override; + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * Return the matrix interpolating from a face of one element to the subface @@ -662,9 +664,11 @@ public: * ExcInterpolationNotImplemented. */ virtual void - get_subface_interpolation_matrix(const FiniteElement &source, - const unsigned int subface, - FullMatrix &matrix) const override; + get_subface_interpolation_matrix( + const FiniteElement &source, + const unsigned int subface, + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * Determine an estimate for the memory consumption (in bytes) of this diff --git a/include/deal.II/fe/fe_raviart_thomas.h b/include/deal.II/fe/fe_raviart_thomas.h index 3594e4bcc5..ec9b9c45d3 100644 --- a/include/deal.II/fe/fe_raviart_thomas.h +++ b/include/deal.II/fe/fe_raviart_thomas.h @@ -290,12 +290,15 @@ public: virtual void get_face_interpolation_matrix(const FiniteElement &source, - FullMatrix &matrix) const override; + FullMatrix & matrix, + const unsigned int face_no = 0) const override; virtual void - get_subface_interpolation_matrix(const FiniteElement &source, - const unsigned int subface, - FullMatrix &matrix) const override; + get_subface_interpolation_matrix( + const FiniteElement &source, + const unsigned int subface, + FullMatrix & matrix, + const unsigned int face_no = 0) const override; virtual bool hp_constraints_are_implemented() const override; @@ -306,7 +309,8 @@ public: hp_line_dof_identities(const FiniteElement &fe_other) const override; virtual std::vector> - hp_quad_dof_identities(const FiniteElement &fe_other) const override; + hp_quad_dof_identities(const FiniteElement &fe_other, + const unsigned int face_no = 0) const override; /** * @copydoc FiniteElement::compare_for_domination() diff --git a/include/deal.II/fe/fe_system.h b/include/deal.II/fe/fe_system.h index a832dd886d..4d6b8e6899 100644 --- a/include/deal.II/fe/fe_system.h +++ b/include/deal.II/fe/fe_system.h @@ -867,7 +867,8 @@ public: * Implementation of the respective function in the base class. */ virtual Point - unit_face_support_point(const unsigned int index) const override; + unit_face_support_point(const unsigned int index, + const unsigned int face_no = 0) const override; /** * Return a list of constant modes of the element. The returns table has as @@ -908,7 +909,8 @@ public: */ virtual void get_face_interpolation_matrix(const FiniteElement &source, - FullMatrix &matrix) const override; + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** @@ -924,9 +926,11 @@ public: * will get propagated out from this element. */ virtual void - get_subface_interpolation_matrix(const FiniteElement &source, - const unsigned int subface, - FullMatrix &matrix) const override; + get_subface_interpolation_matrix( + const FiniteElement &source, + const unsigned int subface, + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * If, on a vertex, several finite elements are active, the hp code first @@ -960,8 +964,8 @@ public: * of freedom on quads. */ virtual std::vector> - hp_quad_dof_identities( - const FiniteElement &fe_other) const override; + hp_quad_dof_identities(const FiniteElement &fe_other, + const unsigned int = 0) const override; /** * @copydoc FiniteElement::compare_for_domination() diff --git a/include/deal.II/fe/fe_trace.h b/include/deal.II/fe/fe_trace.h index 86205542c8..28c61e2b71 100644 --- a/include/deal.II/fe/fe_trace.h +++ b/include/deal.II/fe/fe_trace.h @@ -109,7 +109,8 @@ public: */ virtual void get_face_interpolation_matrix(const FiniteElement &source, - FullMatrix &matrix) const override; + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * Return the matrix interpolating from a face of one element to the face @@ -120,9 +121,11 @@ public: * FiniteElement::ExcInterpolationNotImplemented is thrown. */ virtual void - get_subface_interpolation_matrix(const FiniteElement &source, - const unsigned int subface, - FullMatrix &matrix) const override; + get_subface_interpolation_matrix( + const FiniteElement &source, + const unsigned int subface, + FullMatrix & matrix, + const unsigned int face_no = 0) const override; /** * @copydoc FiniteElement::compare_for_domination() diff --git a/source/fe/fe.cc b/source/fe/fe.cc index bb90aaf84c..56b4bc3091 100644 --- a/source/fe/fe.cc +++ b/source/fe/fe.cc @@ -631,10 +631,13 @@ template unsigned int FiniteElement::adjust_quad_dof_index_for_face_orientation( const unsigned int index, + const unsigned int face_no, const bool face_orientation, const bool face_flip, const bool face_rotation) const { + (void)face_no; + // general template for 1D and 2D: not // implemented. in fact, the function // shouldn't even be called unless we are @@ -891,7 +894,8 @@ template void FiniteElement::get_face_interpolation_matrix( const FiniteElement &, - FullMatrix &) const + FullMatrix &, + const unsigned int) const { // by default, no interpolation // implemented. so throw exception, @@ -908,7 +912,8 @@ void FiniteElement::get_subface_interpolation_matrix( const FiniteElement &, const unsigned int, - FullMatrix &) const + FullMatrix &, + const unsigned int) const { // by default, no interpolation // implemented. so throw exception, @@ -945,7 +950,8 @@ FiniteElement::hp_line_dof_identities( template std::vector> FiniteElement::hp_quad_dof_identities( - const FiniteElement &) const + const FiniteElement &, + const unsigned int) const { Assert(false, ExcNotImplemented()); return std::vector>(); @@ -1051,7 +1057,8 @@ FiniteElement::unit_support_point(const unsigned int index) const template const std::vector> & -FiniteElement::get_unit_face_support_points() const +FiniteElement::get_unit_face_support_points( + const unsigned int) const { // a finite element may define // support points, but only if @@ -1067,7 +1074,7 @@ FiniteElement::get_unit_face_support_points() const template bool -FiniteElement::has_face_support_points() const +FiniteElement::has_face_support_points(const unsigned int) const { return (unit_face_support_points.size() != 0); } @@ -1076,8 +1083,8 @@ FiniteElement::has_face_support_points() const template Point -FiniteElement::unit_face_support_point( - const unsigned int index) const +FiniteElement::unit_face_support_point(const unsigned int index, + const unsigned int) const { AssertIndexRange(index, this->n_dofs_per_face()); Assert(unit_face_support_points.size() == this->n_dofs_per_face(), diff --git a/source/fe/fe_bernstein.cc b/source/fe/fe_bernstein.cc index 587301ecbb..8dee487809 100644 --- a/source/fe/fe_bernstein.cc +++ b/source/fe/fe_bernstein.cc @@ -95,12 +95,14 @@ template void FE_Bernstein::get_face_interpolation_matrix( const FiniteElement &source_fe, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int face_no) const { Assert(dim > 1, ExcImpossibleInDim(1)); get_subface_interpolation_matrix(source_fe, numbers::invalid_unsigned_int, - interpolation_matrix); + interpolation_matrix, + face_no); } @@ -109,7 +111,8 @@ void FE_Bernstein::get_subface_interpolation_matrix( const FiniteElement &x_source_fe, const unsigned int subface, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int) const { Assert(interpolation_matrix.m() == x_source_fe.n_dofs_per_face(), ExcDimensionMismatch(interpolation_matrix.m(), @@ -270,7 +273,8 @@ FE_Bernstein::hp_line_dof_identities( template std::vector> FE_Bernstein::hp_quad_dof_identities( - const FiniteElement &) const + const FiniteElement &, + const unsigned int) const { // Since this fe is not interpolatory but on the vertices, we can // not identify dofs on lines and on quads even if there are dofs diff --git a/source/fe/fe_dgp.cc b/source/fe/fe_dgp.cc index 7505623561..06fe6e1be9 100644 --- a/source/fe/fe_dgp.cc +++ b/source/fe/fe_dgp.cc @@ -106,7 +106,8 @@ template void FE_DGP::get_face_interpolation_matrix( const FiniteElement &x_source_fe, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int) const { // this is only implemented, if the source FE is also a DGP element. in that // case, both elements have no dofs on their faces and the face @@ -132,7 +133,8 @@ void FE_DGP::get_subface_interpolation_matrix( const FiniteElement &x_source_fe, const unsigned int, - FullMatrix &interpolation_matrix) const + FullMatrix &interpolation_matrix, + const unsigned int) const { // this is only implemented, if the source FE is also a DGP element. in that // case, both elements have no dofs on their faces and the face @@ -199,7 +201,8 @@ FE_DGP::hp_line_dof_identities( template std::vector> FE_DGP::hp_quad_dof_identities( - const FiniteElement &fe_other) const + const FiniteElement &fe_other, + const unsigned int) const { // there are no such constraints for DGP elements at all if (dynamic_cast *>(&fe_other) != nullptr) diff --git a/source/fe/fe_dgp_monomial.cc b/source/fe/fe_dgp_monomial.cc index 80780dfdc7..5c6e7dd778 100644 --- a/source/fe/fe_dgp_monomial.cc +++ b/source/fe/fe_dgp_monomial.cc @@ -280,7 +280,8 @@ template void FE_DGPMonomial::get_face_interpolation_matrix( const FiniteElement &x_source_fe, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int) const { // this is only implemented, if the source // FE is also a DGPMonomial element. in that case, @@ -307,7 +308,8 @@ void FE_DGPMonomial::get_subface_interpolation_matrix( const FiniteElement &x_source_fe, const unsigned int, - FullMatrix &interpolation_matrix) const + FullMatrix &interpolation_matrix, + const unsigned int) const { // this is only implemented, if the source // FE is also a DGPMonomial element. in that case, @@ -376,8 +378,8 @@ FE_DGPMonomial::hp_line_dof_identities( template std::vector> -FE_DGPMonomial::hp_quad_dof_identities( - const FiniteElement &fe_other) const +FE_DGPMonomial::hp_quad_dof_identities(const FiniteElement &fe_other, + const unsigned int) const { // there are no such constraints for DGPMonomial // elements at all diff --git a/source/fe/fe_dgp_nonparametric.cc b/source/fe/fe_dgp_nonparametric.cc index bf0b920513..20dc3b1227 100644 --- a/source/fe/fe_dgp_nonparametric.cc +++ b/source/fe/fe_dgp_nonparametric.cc @@ -474,7 +474,8 @@ template void FE_DGPNonparametric::get_face_interpolation_matrix( const FiniteElement &x_source_fe, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int) const { // this is only implemented, if the source // FE is also a DGPNonparametric element. in that case, @@ -502,7 +503,8 @@ void FE_DGPNonparametric::get_subface_interpolation_matrix( const FiniteElement &x_source_fe, const unsigned int, - FullMatrix &interpolation_matrix) const + FullMatrix &interpolation_matrix, + const unsigned int) const { // this is only implemented, if the source // FE is also a DGPNonparametric element. in that case, @@ -575,7 +577,8 @@ FE_DGPNonparametric::hp_line_dof_identities( template std::vector> FE_DGPNonparametric::hp_quad_dof_identities( - const FiniteElement &fe_other) const + const FiniteElement &fe_other, + const unsigned int) const { // there are no such constraints for DGPNonparametric // elements at all diff --git a/source/fe/fe_dgq.cc b/source/fe/fe_dgq.cc index 0034f68c88..6d1297c843 100644 --- a/source/fe/fe_dgq.cc +++ b/source/fe/fe_dgq.cc @@ -348,7 +348,8 @@ template void FE_DGQ::get_face_interpolation_matrix( const FiniteElement &x_source_fe, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int) const { // this is only implemented, if the source // FE is also a DGQ element. in that case, @@ -375,7 +376,8 @@ void FE_DGQ::get_subface_interpolation_matrix( const FiniteElement &x_source_fe, const unsigned int, - FullMatrix &interpolation_matrix) const + FullMatrix &interpolation_matrix, + const unsigned int) const { // this is only implemented, if the source // FE is also a DGQ element. in that case, @@ -589,7 +591,8 @@ FE_DGQ::hp_line_dof_identities( template std::vector> FE_DGQ::hp_quad_dof_identities( - const FiniteElement & /*fe_other*/) const + const FiniteElement & /*fe_other*/, + const unsigned int) const { // this element is discontinuous, so by definition there can // be no identities between its dofs and those of any neighbor diff --git a/source/fe/fe_enriched.cc b/source/fe/fe_enriched.cc index 3a37f8fd2b..5c07c74559 100644 --- a/source/fe/fe_enriched.cc +++ b/source/fe/fe_enriched.cc @@ -881,13 +881,15 @@ template void FE_Enriched::get_face_interpolation_matrix( const FiniteElement &source, - FullMatrix & matrix) const + FullMatrix & matrix, + const unsigned int face_no) const { if (const FE_Enriched *fe_enr_other = dynamic_cast *>(&source)) { fe_system->get_face_interpolation_matrix(fe_enr_other->get_fe_system(), - matrix); + matrix, + face_no); } else { @@ -904,14 +906,16 @@ void FE_Enriched::get_subface_interpolation_matrix( const FiniteElement &source, const unsigned int subface, - FullMatrix & matrix) const + FullMatrix & matrix, + const unsigned int face_no) const { if (const FE_Enriched *fe_enr_other = dynamic_cast *>(&source)) { fe_system->get_subface_interpolation_matrix(fe_enr_other->get_fe_system(), subface, - matrix); + matrix, + face_no); } else { @@ -962,12 +966,14 @@ FE_Enriched::hp_line_dof_identities( template std::vector> FE_Enriched::hp_quad_dof_identities( - const FiniteElement &fe_other) const + const FiniteElement &fe_other, + const unsigned int face_no) const { if (const FE_Enriched *fe_enr_other = dynamic_cast *>(&fe_other)) { - return fe_system->hp_quad_dof_identities(fe_enr_other->get_fe_system()); + return fe_system->hp_quad_dof_identities(fe_enr_other->get_fe_system(), + face_no); } else { diff --git a/source/fe/fe_face.cc b/source/fe/fe_face.cc index 8eefdcbbb6..e69ed3feac 100644 --- a/source/fe/fe_face.cc +++ b/source/fe/fe_face.cc @@ -146,11 +146,13 @@ template void FE_FaceQ::get_face_interpolation_matrix( const FiniteElement &source_fe, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int face_no) const { get_subface_interpolation_matrix(source_fe, numbers::invalid_unsigned_int, - interpolation_matrix); + interpolation_matrix, + face_no); } @@ -160,7 +162,8 @@ void FE_FaceQ::get_subface_interpolation_matrix( const FiniteElement &x_source_fe, const unsigned int subface, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int) const { // this function is similar to the respective method in FE_Q @@ -361,7 +364,8 @@ FE_FaceQ::hp_line_dof_identities( template std::vector> FE_FaceQ::hp_quad_dof_identities( - const FiniteElement &fe_other) const + const FiniteElement &fe_other, + const unsigned int) const { Assert(dim >= 3, ExcInternalError()); @@ -553,11 +557,13 @@ template void FE_FaceQ<1, spacedim>::get_face_interpolation_matrix( const FiniteElement<1, spacedim> &source_fe, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int face_no) const { get_subface_interpolation_matrix(source_fe, numbers::invalid_unsigned_int, - interpolation_matrix); + interpolation_matrix, + face_no); } @@ -567,7 +573,8 @@ void FE_FaceQ<1, spacedim>::get_subface_interpolation_matrix( const FiniteElement<1, spacedim> &x_source_fe, const unsigned int /*subface*/, - FullMatrix &interpolation_matrix) const + FullMatrix &interpolation_matrix, + const unsigned int) const { (void)x_source_fe; Assert(interpolation_matrix.n() == this->n_dofs_per_face(), @@ -637,7 +644,8 @@ FE_FaceQ<1, spacedim>::hp_line_dof_identities( template std::vector> FE_FaceQ<1, spacedim>::hp_quad_dof_identities( - const FiniteElement<1, spacedim> &) const + const FiniteElement<1, spacedim> &, + const unsigned int) const { // this element is continuous only for the highest dimensional bounding object return std::vector>(); @@ -863,11 +871,13 @@ template void FE_FaceP::get_face_interpolation_matrix( const FiniteElement &source_fe, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int face_no) const { get_subface_interpolation_matrix(source_fe, numbers::invalid_unsigned_int, - interpolation_matrix); + interpolation_matrix, + face_no); } @@ -877,7 +887,8 @@ void FE_FaceP::get_subface_interpolation_matrix( const FiniteElement &x_source_fe, const unsigned int subface, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int) const { // this function is similar to the respective method in FE_Q diff --git a/source/fe/fe_nedelec.cc b/source/fe/fe_nedelec.cc index 9645e6a0c9..f3b8e3bb25 100644 --- a/source/fe/fe_nedelec.cc +++ b/source/fe/fe_nedelec.cc @@ -2395,8 +2395,8 @@ FE_Nedelec::hp_line_dof_identities( template std::vector> -FE_Nedelec::hp_quad_dof_identities( - const FiniteElement &fe_other) const +FE_Nedelec::hp_quad_dof_identities(const FiniteElement &fe_other, + const unsigned int) const { // we can presently only compute // these identities if both FEs are @@ -2451,7 +2451,8 @@ template void FE_Nedelec::get_face_interpolation_matrix( const FiniteElement &source, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int) const { // this is only implemented, if the // source FE is also a @@ -2528,7 +2529,8 @@ template <> void FE_Nedelec<1>::get_subface_interpolation_matrix(const FiniteElement<1, 1> &, const unsigned int, - FullMatrix &) const + FullMatrix &, + const unsigned int) const { Assert(false, ExcNotImplemented()); } @@ -2556,7 +2558,8 @@ void FE_Nedelec::get_subface_interpolation_matrix( const FiniteElement &source, const unsigned int subface, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int) const { // this is only implemented, if the // source FE is also a diff --git a/source/fe/fe_nothing.cc b/source/fe/fe_nothing.cc index a1192f2fd2..721f34f8a8 100644 --- a/source/fe/fe_nothing.cc +++ b/source/fe/fe_nothing.cc @@ -254,7 +254,8 @@ FE_Nothing::hp_line_dof_identities( template std::vector> FE_Nothing::hp_quad_dof_identities( - const FiniteElement & /*fe_other*/) const + const FiniteElement & /*fe_other*/, + const unsigned int) const { // the FE_Nothing has no // degrees of freedom, so there @@ -295,7 +296,8 @@ template void FE_Nothing::get_face_interpolation_matrix( const FiniteElement & /*source_fe*/, - FullMatrix &interpolation_matrix) const + FullMatrix &interpolation_matrix, + const unsigned int) const { // since this element has no face dofs, the // interpolation matrix is necessarily empty @@ -313,7 +315,8 @@ void FE_Nothing::get_subface_interpolation_matrix( const FiniteElement & /*source_fe*/, const unsigned int /*index*/, - FullMatrix &interpolation_matrix) const + FullMatrix &interpolation_matrix, + const unsigned int) const { // since this element has no face dofs, the // interpolation matrix is necessarily empty diff --git a/source/fe/fe_q_base.cc b/source/fe/fe_q_base.cc index d6664d6ea9..58fadaf56e 100644 --- a/source/fe/fe_q_base.cc +++ b/source/fe/fe_q_base.cc @@ -606,12 +606,14 @@ template void FE_Q_Base::get_face_interpolation_matrix( const FiniteElement &source_fe, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int face_no) const { Assert(dim > 1, ExcImpossibleInDim(1)); get_subface_interpolation_matrix(source_fe, numbers::invalid_unsigned_int, - interpolation_matrix); + interpolation_matrix, + face_no); } @@ -621,7 +623,8 @@ void FE_Q_Base::get_subface_interpolation_matrix( const FiniteElement &x_source_fe, const unsigned int subface, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int) const { Assert(interpolation_matrix.m() == x_source_fe.n_dofs_per_face(), ExcDimensionMismatch(interpolation_matrix.m(), @@ -835,7 +838,8 @@ FE_Q_Base::hp_line_dof_identities( template std::vector> FE_Q_Base::hp_quad_dof_identities( - const FiniteElement &fe_other) const + const FiniteElement &fe_other, + const unsigned int) const { // we can presently only compute these identities if both FEs are FE_Qs or // if the other one is an FE_Nothing diff --git a/source/fe/fe_q_hierarchical.cc b/source/fe/fe_q_hierarchical.cc index 964aae3ba3..b707bf8d48 100644 --- a/source/fe/fe_q_hierarchical.cc +++ b/source/fe/fe_q_hierarchical.cc @@ -298,7 +298,8 @@ FE_Q_Hierarchical::hp_line_dof_identities( template std::vector> FE_Q_Hierarchical::hp_quad_dof_identities( - const FiniteElement &fe_other) const + const FiniteElement &fe_other, + const unsigned int) const { // we can presently only compute // these identities if both FEs are @@ -901,7 +902,8 @@ template <> void FE_Q_Hierarchical<1>::get_face_interpolation_matrix( const FiniteElement<1, 1> & /*x_source_fe*/, - FullMatrix & /*interpolation_matrix*/) const + FullMatrix & /*interpolation_matrix*/, + const unsigned int) const { Assert(false, ExcImpossibleInDim(1)); } @@ -912,7 +914,8 @@ void FE_Q_Hierarchical<1>::get_subface_interpolation_matrix( const FiniteElement<1, 1> & /*x_source_fe*/, const unsigned int /*subface*/, - FullMatrix & /*interpolation_matrix*/) const + FullMatrix & /*interpolation_matrix*/, + const unsigned int) const { Assert(false, ExcImpossibleInDim(1)); } @@ -923,7 +926,8 @@ template void FE_Q_Hierarchical::get_face_interpolation_matrix( const FiniteElement &x_source_fe, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int) const { // this is only implemented, if the // source FE is also a @@ -1011,7 +1015,8 @@ void FE_Q_Hierarchical::get_subface_interpolation_matrix( const FiniteElement &x_source_fe, const unsigned int subface, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int) const { // this is only implemented, if the // source FE is also a diff --git a/source/fe/fe_raviart_thomas_nodal.cc b/source/fe/fe_raviart_thomas_nodal.cc index 0ddeb83502..69bbb92eaa 100644 --- a/source/fe/fe_raviart_thomas_nodal.cc +++ b/source/fe/fe_raviart_thomas_nodal.cc @@ -462,7 +462,8 @@ FE_RaviartThomasNodal::hp_line_dof_identities( template std::vector> FE_RaviartThomasNodal::hp_quad_dof_identities( - const FiniteElement &fe_other) const + const FiniteElement &fe_other, + const unsigned int) const { // we can presently only compute // these identities if both FEs are @@ -549,7 +550,8 @@ template <> void FE_RaviartThomasNodal<1>::get_face_interpolation_matrix( const FiniteElement<1, 1> & /*x_source_fe*/, - FullMatrix & /*interpolation_matrix*/) const + FullMatrix & /*interpolation_matrix*/, + const unsigned int) const { Assert(false, ExcImpossibleInDim(1)); } @@ -560,7 +562,8 @@ void FE_RaviartThomasNodal<1>::get_subface_interpolation_matrix( const FiniteElement<1, 1> & /*x_source_fe*/, const unsigned int /*subface*/, - FullMatrix & /*interpolation_matrix*/) const + FullMatrix & /*interpolation_matrix*/, + const unsigned int) const { Assert(false, ExcImpossibleInDim(1)); } @@ -571,7 +574,8 @@ template void FE_RaviartThomasNodal::get_face_interpolation_matrix( const FiniteElement &x_source_fe, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int) const { // this is only implemented, if the // source FE is also a @@ -678,7 +682,8 @@ void FE_RaviartThomasNodal::get_subface_interpolation_matrix( const FiniteElement &x_source_fe, const unsigned int subface, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int) const { // this is only implemented, if the // source FE is also a diff --git a/source/fe/fe_system.cc b/source/fe/fe_system.cc index ef668c0171..beb8cb5a92 100644 --- a/source/fe/fe_system.cc +++ b/source/fe/fe_system.cc @@ -1879,7 +1879,8 @@ template void FESystem::get_face_interpolation_matrix( const FiniteElement &x_source_fe, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int face_no) const { Assert(interpolation_matrix.n() == this->n_dofs_per_face(), ExcDimensionMismatch(interpolation_matrix.n(), @@ -1925,7 +1926,8 @@ FESystem::get_face_interpolation_matrix( base_to_base_interpolation.reinit(base_other.n_dofs_per_face(), base.n_dofs_per_face()); base.get_face_interpolation_matrix(base_other, - base_to_base_interpolation); + base_to_base_interpolation, + face_no); // now translate entries. we'd like to have something like // face_base_to_system_index, but that doesn't exist. rather, all we @@ -1991,7 +1993,8 @@ void FESystem::get_subface_interpolation_matrix( const FiniteElement &x_source_fe, const unsigned int subface, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int face_no) const { AssertThrow( (x_source_fe.get_name().find("FESystem<") == 0) || @@ -2044,7 +2047,8 @@ FESystem::get_subface_interpolation_matrix( base.n_dofs_per_face()); base.get_subface_interpolation_matrix(base_other, subface, - base_to_base_interpolation); + base_to_base_interpolation, + face_no); // now translate entries. we'd like to have something like // face_base_to_system_index, but that doesn't exist. rather, all we @@ -2237,7 +2241,8 @@ FESystem::hp_line_dof_identities( template std::vector> FESystem::hp_quad_dof_identities( - const FiniteElement &fe_other) const + const FiniteElement &fe_other, + const unsigned int) const { return hp_object_dof_identities<2>(fe_other); } @@ -2340,7 +2345,9 @@ FESystem::unit_support_point(const unsigned int index) const template Point -FESystem::unit_face_support_point(const unsigned int index) const +FESystem::unit_face_support_point( + const unsigned int index, + const unsigned int face_no) const { AssertIndexRange(index, this->n_dofs_per_face()); Assert((this->unit_face_support_points.size() == this->n_dofs_per_face()) || @@ -2353,9 +2360,10 @@ FESystem::unit_face_support_point(const unsigned int index) const else // no. ask the base element whether it would like to provide this // information - return (base_element(this->face_system_to_base_index(index).first.first) - .unit_face_support_point( - this->face_system_to_base_index(index).second)); + return ( + base_element(this->face_system_to_base_index(index).first.first) + .unit_face_support_point(this->face_system_to_base_index(index).second, + face_no)); } diff --git a/source/fe/fe_trace.cc b/source/fe/fe_trace.cc index 577c3ae778..0ee59837ba 100644 --- a/source/fe/fe_trace.cc +++ b/source/fe/fe_trace.cc @@ -214,11 +214,13 @@ template void FE_TraceQ::get_face_interpolation_matrix( const FiniteElement &source_fe, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int face_no) const { get_subface_interpolation_matrix(source_fe, numbers::invalid_unsigned_int, - interpolation_matrix); + interpolation_matrix, + face_no); } @@ -228,7 +230,8 @@ void FE_TraceQ::get_subface_interpolation_matrix( const FiniteElement &x_source_fe, const unsigned int subface, - FullMatrix & interpolation_matrix) const + FullMatrix & interpolation_matrix, + const unsigned int) const { // this is the code from FE_FaceQ Assert(interpolation_matrix.n() == this->n_dofs_per_face(),