*
* For example, in 2D the layout of a quadrilateral cell is as follows:
* @verbatim
- * . 3
- * . 2-->--3
- * . | |
- * . 0 ^ ^ 1
- * . | |
- * . 0-->--1
- * . 2
+ * 3
+ * 2-->--3
+ * | |
+ * 0 ^ ^ 1
+ * | |
+ * 0-->--1
+ * 2
* @endverbatim
* Vertices and faces are indicated with their numbers, faces also with
* their directions.
*
* Now, when refined, the layout is like this:
* @verbatim
- * *--*--*
- * | 2|3 |
- * *--*--*
- * | 0|1 |
- * *--*--*
+ * *---*---*
+ * | 2 | 3 |
+ * *---*---*
+ * | 0 | 1 |
+ * *---*---*
* @endverbatim
*
* Thus, the child cells on face 0 are (ordered in the direction of the
*
* For three spatial dimensions, the exact order of the children is laid
* down in the general documentation of this class.
+ *
+ * The <tt>face_orientation</tt>, <tt>face_flip</tt> and
+ * <tt>face_rotation</tt> arguments are meant exclusively for quadrialaterals
+ * and hexahedra at the moment. They determine how this function handles faces
+ * oriented in the standard and non-standard orientation.
+ * <tt>face_orientation</tt> defaults to <tt>true</tt>, <tt>face_flip</tt> and
+ * <tt>face_rotation</tt> default to <tt>false</tt> (standard orientation) and
+ * has no effect in 2d. The concept of face orientations is explained in this
+ * @ref GlossFaceOrientation "glossary"
+ * entry.
*/
unsigned int
child_cell_on_face(const unsigned int face_n,
- const unsigned int subface_n) const;
+ const unsigned int subface_n,
+ const bool face_orientation = true,
+ const bool face_flip = false,
+ const bool face_rotation = false) const;
/**
* For a given vertex in a cell, return a pair of a face index and a
inline unsigned int
ReferenceCell::child_cell_on_face(const unsigned int face,
- const unsigned int subface) const
+ const unsigned int subface,
+ const bool face_orientation,
+ const bool face_flip,
+ const bool face_rotation) const
{
AssertIndexRange(face, n_faces());
}
else if (*this == ReferenceCells::Quadrilateral)
{
- Assert(false, ExcNotImplemented());
+ return GeometryInfo<2>::child_cell_on_face(
+ RefinementCase<2>(RefinementPossibilities<2>::no_refinement),
+ face,
+ subface,
+ face_orientation,
+ face_flip,
+ face_rotation);
}
else if (*this == ReferenceCells::Tetrahedron)
{
}
else if (*this == ReferenceCells::Hexahedron)
{
- Assert(false, ExcNotImplemented());
+ return GeometryInfo<3>::child_cell_on_face(
+ RefinementCase<3>(RefinementPossibilities<3>::no_refinement),
+ face,
+ subface,
+ face_orientation,
+ face_flip,
+ face_rotation);
}
Assert(false, ExcNotImplemented());