I wanted to solicit ideas and discussion for designs handling the edge/face orientation and element order. In particular, for scalar Lagrange elements of order >= 3 (and other scalar elements) or oriented vector elements (e.g. Nedelec), the orientation of the element matters and must be taken into account to ensure continuity of the solution. Right now, this is handled on a case-by-case basis in the hierarchic elements and the nedelec elements, but we ought to be able to do better. In particular, for 3-D, higher order, the face orientation handling is going to be ugly (I think). For sure, even the edge orientation for the hexes and tets will be a bit long winded and it would be nice to have that in one place.

My thinking is that such an FEOrientation (other suggestions for names?) function (object?) should return a scaling factor (either 1 or -1 ) that depends on the geometric element and finite element type and order and then each finite element class can call as needed. I do think we should take care of this internally in the shape function routines and not move this higher because I think it would be more error prone.

I see at least a couple ways to proceed along this path:

1. We could put a function in FEInterface. I don't like this because such a function would necessarily be bloated.

2. Have a pointer stashed in the FE object which gets built based on the FE type and we can specialize based on the geometric element type (including testing for element order).

3. Implement an edge (and face in 3D) orientation function within each geometric element type that returns the scaling factor and then have each finite element type worry about the element order scaling factor.

Other ideas? Of the 3 above, I think I prefer the last, but I admit I haven't thought too deeply about it. At the moment, I don't have a good suggestion of how to handle the fact that we have to worry about the order of the dofs on edges/faces for higher order elements (see hierarchic element). At the very least, I wanted a good starting point to start putting in the 3D case as it is the highest priority for me at the moment, but I didn't want to push it all in the 3D Nedelec shape functions.

Thanks for any thoughts.

Best,

Paul