We consider a number of element types that can be used to discretize two- and three-dimensional spaces. In the community there has been a tendency to choose only one element type to discretize a given domain. This is due to the widely conceived idea that using more than one type of element is prohibitively expensive in terms of implementation complexity. It is believed that this introduces a large number of conditional statements. To counter these problems we have taken advantage of the object-oriented language C++. Object-oriented programming allows us to replace a set of conditional ``if'' statements with a look up table for each element type which is more computationally efficient. We will discuss the implementation aspects in section 4.1.4.
We show that it can be advantageuous to use both triangles and quadrilaterals together to solve a problem set in a two-dimensional domain. In three-dimensions we demonstrate that it is beneficial to use a combination of tetrahedra, pyramids, prisms, and hexahedra.
The most natural description of an element is as a subset of
,where d is the dimension of the problem. Each element is then mapped
to a reference element of its own type. Though we only allow invertible
mappings, these mappings can be quite complex and can be
represented as polynomial mappings in terms of the reference elements
coordinate system. This is commonly referred to as an isoparametric
mapping. Finally, we map the element to a tensor coordinate
system attached locally to the reference element.
In this chapter we develop new algorithms that enable the connection of three-dimensional elements (i.e. tetrahedra, prisms and hexahedra) that have constraints on the ways they can be connected together. Specifically we provide algorithms that have an operation count that is proportional to the number of elements in a mesh.