*/
virtual std::string get_name () const;
+ /**
+ * @name Functions to support hp
+ * @{
+ */
+
+ /**
+ * If, on a vertex, several
+ * finite elements are active,
+ * the hp code first assigns the
+ * degrees of freedom of each of
+ * these FEs different global
+ * indices. It then calls this
+ * function to find out which of
+ * them should get identical
+ * values, and consequently can
+ * receive the same global DoF
+ * index. This function therefore
+ * returns a list of identities
+ * between DoFs of the present
+ * finite element object with the
+ * DoFs of @p fe_other, which is
+ * a reference to a finite
+ * element object representing
+ * one of the other finite
+ * elements active on this
+ * particular vertex. The
+ * function computes which of the
+ * degrees of freedom of the two
+ * finite element objects are
+ * equivalent, and returns a list
+ * of pairs of global dof indices
+ * in @p identities. The first
+ * index of each pair denotes one
+ * of the vertex dofs of the
+ * present element, whereas the
+ * second is the corresponding
+ * index of the other finite
+ * element.
+ *
+ * This being a discontinuous element,
+ * the set of such constraints is of
+ * course empty.
+ */
+ virtual
+ std::vector<std::pair<unsigned int, unsigned int> >
+ hp_vertex_dof_identities (const FiniteElement<dim> &fe_other) const;
+
+ /**
+ * Same as
+ * hp_vertex_dof_indices(),
+ * except that the function
+ * treats degrees of freedom on
+ * lines.
+ *
+ * This being a discontinuous element,
+ * the set of such constraints is of
+ * course empty.
+ */
+ virtual
+ std::vector<std::pair<unsigned int, unsigned int> >
+ hp_line_dof_identities (const FiniteElement<dim> &fe_other) const;
+
+ /**
+ * Same as
+ * hp_vertex_dof_indices(),
+ * except that the function
+ * treats degrees of freedom on
+ * quads.
+ *
+ * This being a discontinuous element,
+ * the set of such constraints is of
+ * course empty.
+ */
+ virtual
+ std::vector<std::pair<unsigned int, unsigned int> >
+ hp_quad_dof_identities (const FiniteElement<dim> &fe_other) const;
+
/**
* Return whether this element
* implements its hanging node
FiniteElementDomination::Domination
compare_for_domination (const FiniteElement<dim> &fe_other) const;
+ /**
+ * @}
+ */
+
/**
* Return the matrix
* interpolating from a face of
*/
virtual std::string get_name () const;
+ /**
+ * @name Functions to support hp
+ * @{
+ */
+
+ /**
+ * If, on a vertex, several
+ * finite elements are active,
+ * the hp code first assigns the
+ * degrees of freedom of each of
+ * these FEs different global
+ * indices. It then calls this
+ * function to find out which of
+ * them should get identical
+ * values, and consequently can
+ * receive the same global DoF
+ * index. This function therefore
+ * returns a list of identities
+ * between DoFs of the present
+ * finite element object with the
+ * DoFs of @p fe_other, which is
+ * a reference to a finite
+ * element object representing
+ * one of the other finite
+ * elements active on this
+ * particular vertex. The
+ * function computes which of the
+ * degrees of freedom of the two
+ * finite element objects are
+ * equivalent, and returns a list
+ * of pairs of global dof indices
+ * in @p identities. The first
+ * index of each pair denotes one
+ * of the vertex dofs of the
+ * present element, whereas the
+ * second is the corresponding
+ * index of the other finite
+ * element.
+ *
+ * This being a discontinuous element,
+ * the set of such constraints is of
+ * course empty.
+ */
+ virtual
+ std::vector<std::pair<unsigned int, unsigned int> >
+ hp_vertex_dof_identities (const FiniteElement<dim> &fe_other) const;
+
+ /**
+ * Same as
+ * hp_vertex_dof_indices(),
+ * except that the function
+ * treats degrees of freedom on
+ * lines.
+ *
+ * This being a discontinuous element,
+ * the set of such constraints is of
+ * course empty.
+ */
+ virtual
+ std::vector<std::pair<unsigned int, unsigned int> >
+ hp_line_dof_identities (const FiniteElement<dim> &fe_other) const;
+
+ /**
+ * Same as
+ * hp_vertex_dof_indices(),
+ * except that the function
+ * treats degrees of freedom on
+ * quads.
+ *
+ * This being a discontinuous element,
+ * the set of such constraints is of
+ * course empty.
+ */
+ virtual
+ std::vector<std::pair<unsigned int, unsigned int> >
+ hp_quad_dof_identities (const FiniteElement<dim> &fe_other) const;
+
/**
* Return whether this element
* implements its hanging node
FiniteElementDomination::Domination
compare_for_domination (const FiniteElement<dim> &fe_other) const;
+ /**
+ * @}
+ */
+
/**
* Return the matrix
* interpolating from the given
const unsigned int subface,
FullMatrix<double> &matrix) const;
+ /**
+ * @name Functions to support hp
+ * @{
+ */
+
+ /**
+ * If, on a vertex, several
+ * finite elements are active,
+ * the hp code first assigns the
+ * degrees of freedom of each of
+ * these FEs different global
+ * indices. It then calls this
+ * function to find out which of
+ * them should get identical
+ * values, and consequently can
+ * receive the same global DoF
+ * index. This function therefore
+ * returns a list of identities
+ * between DoFs of the present
+ * finite element object with the
+ * DoFs of @p fe_other, which is
+ * a reference to a finite
+ * element object representing
+ * one of the other finite
+ * elements active on this
+ * particular vertex. The
+ * function computes which of the
+ * degrees of freedom of the two
+ * finite element objects are
+ * equivalent, and returns a list
+ * of pairs of global dof indices
+ * in @p identities. The first
+ * index of each pair denotes one
+ * of the vertex dofs of the
+ * present element, whereas the
+ * second is the corresponding
+ * index of the other finite
+ * element.
+ *
+ * This being a discontinuous element,
+ * the set of such constraints is of
+ * course empty.
+ */
+ virtual
+ std::vector<std::pair<unsigned int, unsigned int> >
+ hp_vertex_dof_identities (const FiniteElement<dim> &fe_other) const;
+
+ /**
+ * Same as
+ * hp_vertex_dof_indices(),
+ * except that the function
+ * treats degrees of freedom on
+ * lines.
+ *
+ * This being a discontinuous element,
+ * the set of such constraints is of
+ * course empty.
+ */
+ virtual
+ std::vector<std::pair<unsigned int, unsigned int> >
+ hp_line_dof_identities (const FiniteElement<dim> &fe_other) const;
+
+ /**
+ * Same as
+ * hp_vertex_dof_indices(),
+ * except that the function
+ * treats degrees of freedom on
+ * quads.
+ *
+ * This being a discontinuous element,
+ * the set of such constraints is of
+ * course empty.
+ */
+ virtual
+ std::vector<std::pair<unsigned int, unsigned int> >
+ hp_quad_dof_identities (const FiniteElement<dim> &fe_other) const;
+
/**
* Return whether this element
* implements its hanging node
FiniteElementDomination::Domination
compare_for_domination (const FiniteElement<dim> &fe_other) const;
+ /**
+ * @}
+ */
+
/**
* Check for non-zero values on a face.
*
+template <int dim>
+std::vector<std::pair<unsigned int, unsigned int> >
+FE_DGP<dim>::
+hp_vertex_dof_identities (const FiniteElement<dim> &fe_other) const
+{
+ // there are no such constraints for DGP
+ // elements at all
+ if (dynamic_cast<const FE_DGP<dim>*>(&fe_other) != 0)
+ return
+ std::vector<std::pair<unsigned int, unsigned int> > ();
+ else
+ {
+ Assert (false, ExcNotImplemented());
+ return std::vector<std::pair<unsigned int, unsigned int> > ();
+ }
+}
+
+
+
+template <int dim>
+std::vector<std::pair<unsigned int, unsigned int> >
+FE_DGP<dim>::
+hp_line_dof_identities (const FiniteElement<dim> &fe_other) const
+{
+ // there are no such constraints for DGP
+ // elements at all
+ if (dynamic_cast<const FE_DGP<dim>*>(&fe_other) != 0)
+ return
+ std::vector<std::pair<unsigned int, unsigned int> > ();
+ else
+ {
+ Assert (false, ExcNotImplemented());
+ return std::vector<std::pair<unsigned int, unsigned int> > ();
+ }
+}
+
+
+
+template <int dim>
+std::vector<std::pair<unsigned int, unsigned int> >
+FE_DGP<dim>::
+hp_quad_dof_identities (const FiniteElement<dim> &fe_other) const
+{
+ // there are no such constraints for DGP
+ // elements at all
+ if (dynamic_cast<const FE_DGP<dim>*>(&fe_other) != 0)
+ return
+ std::vector<std::pair<unsigned int, unsigned int> > ();
+ else
+ {
+ Assert (false, ExcNotImplemented());
+ return std::vector<std::pair<unsigned int, unsigned int> > ();
+ }
+}
+
+
+
template <int dim>
FiniteElementDomination::Domination
FE_DGP<dim>::compare_for_domination (const FiniteElement<dim> &fe_other) const
+template <int dim>
+std::vector<std::pair<unsigned int, unsigned int> >
+FE_DGPMonomial<dim>::
+hp_vertex_dof_identities (const FiniteElement<dim> &fe_other) const
+{
+ // there are no such constraints for DGPMonomial
+ // elements at all
+ if (dynamic_cast<const FE_DGPMonomial<dim>*>(&fe_other) != 0)
+ return
+ std::vector<std::pair<unsigned int, unsigned int> > ();
+ else
+ {
+ Assert (false, ExcNotImplemented());
+ return std::vector<std::pair<unsigned int, unsigned int> > ();
+ }
+}
+
+
+
+template <int dim>
+std::vector<std::pair<unsigned int, unsigned int> >
+FE_DGPMonomial<dim>::
+hp_line_dof_identities (const FiniteElement<dim> &fe_other) const
+{
+ // there are no such constraints for DGPMonomial
+ // elements at all
+ if (dynamic_cast<const FE_DGPMonomial<dim>*>(&fe_other) != 0)
+ return
+ std::vector<std::pair<unsigned int, unsigned int> > ();
+ else
+ {
+ Assert (false, ExcNotImplemented());
+ return std::vector<std::pair<unsigned int, unsigned int> > ();
+ }
+}
+
+
+
+template <int dim>
+std::vector<std::pair<unsigned int, unsigned int> >
+FE_DGPMonomial<dim>::
+hp_quad_dof_identities (const FiniteElement<dim> &fe_other) const
+{
+ // there are no such constraints for DGPMonomial
+ // elements at all
+ if (dynamic_cast<const FE_DGPMonomial<dim>*>(&fe_other) != 0)
+ return
+ std::vector<std::pair<unsigned int, unsigned int> > ();
+ else
+ {
+ Assert (false, ExcNotImplemented());
+ return std::vector<std::pair<unsigned int, unsigned int> > ();
+ }
+}
+
+
+
template <int dim>
FiniteElementDomination::Domination
FE_DGPMonomial<dim>::
+template <int dim>
+std::vector<std::pair<unsigned int, unsigned int> >
+FE_DGPNonparametric<dim>::
+hp_vertex_dof_identities (const FiniteElement<dim> &fe_other) const
+{
+ // there are no such constraints for DGPNonparametric
+ // elements at all
+ if (dynamic_cast<const FE_DGPNonparametric<dim>*>(&fe_other) != 0)
+ return
+ std::vector<std::pair<unsigned int, unsigned int> > ();
+ else
+ {
+ Assert (false, ExcNotImplemented());
+ return std::vector<std::pair<unsigned int, unsigned int> > ();
+ }
+}
+
+
+
+template <int dim>
+std::vector<std::pair<unsigned int, unsigned int> >
+FE_DGPNonparametric<dim>::
+hp_line_dof_identities (const FiniteElement<dim> &fe_other) const
+{
+ // there are no such constraints for DGPNonparametric
+ // elements at all
+ if (dynamic_cast<const FE_DGPNonparametric<dim>*>(&fe_other) != 0)
+ return
+ std::vector<std::pair<unsigned int, unsigned int> > ();
+ else
+ {
+ Assert (false, ExcNotImplemented());
+ return std::vector<std::pair<unsigned int, unsigned int> > ();
+ }
+}
+
+
+
+template <int dim>
+std::vector<std::pair<unsigned int, unsigned int> >
+FE_DGPNonparametric<dim>::
+hp_quad_dof_identities (const FiniteElement<dim> &fe_other) const
+{
+ // there are no such constraints for DGPNonparametric
+ // elements at all
+ if (dynamic_cast<const FE_DGPNonparametric<dim>*>(&fe_other) != 0)
+ return
+ std::vector<std::pair<unsigned int, unsigned int> > ();
+ else
+ {
+ Assert (false, ExcNotImplemented());
+ return std::vector<std::pair<unsigned int, unsigned int> > ();
+ }
+}
+
+
+
template <int dim>
FiniteElementDomination::Domination
FE_DGPNonparametric<dim>::