This adds a method Geometry::jacobianInverse(localCoordinate)
and a
corresponding typedef Geometry::JacobianInverse
to the Geometry
interface class. The method is default implemented using the
TransposedMatrixWrapper
from dunecommon which internally captures
(by value) the matrix returned by Geometry::jacobianInverseTransposed()
.
This is marked WIP, because a few things need to be discussed:
Currently the method is defaultimplemented in the interface classDune::Geometry
. Hence it will work for all grid implementations. But one may argue (I tend to do so) that it should be implemented directly in the geometry implementations. Otherwise aGeometry
provided by a grid provides a different interface than e.g. aMultilinearGeometry
. To avoid that all grid implementations need to be modified, one could conditionally activate the defaultimplementation depending on presence of an implemenation in the grid implementation.Which interface do we want to provide? Currently you can do exactly one thing: Multiply the matrix from the right to aFieldMatrix
usingoperator*
. This is exactly what you need for the chain rule. This is in some sense the 'linear operator interface' proposed by @peter, but for the case where you want to chain the operator instead of directly applying it. Is this sufficient?Maybe one also wants a cast to a suitableFieldMatrix
?ShouldGeometry::jacobian()
also be implemented in a similar way? I currently don't have a use case for this, but having both,jacobian()
andjacobianTransposed()
seems to be reasonable. This would e.g. allow to writeg.jacobianTransposed(x)*g.jacobian(x)
to compute the metric tensor which is conceptually nice (but probably inefficient).Tests are missing (in dunegrid) due to the open questions. But theTransposedMatrixWrapper
is already tested in dunecommon and I also tested with the dunefunctions examples, where this allows to replacing the ridiculoustranspose(geometry.jacobianInverseTransposed(x)
by a plaingeometry.jacobianInverse(x)
.
This is related to several other MRs that should be merged in appropriate order:
dunecommon!1100 (merged) provides a utility needed for the subsequent extension oftranspose()
.dunecommon!1101 (closed) extends thetranspose()
function to support capturing matrices by value.
dunecommon!1138 (merged) extends support for
transpose(matrix)
andmatrix.transposed()

!577 (merged) (present MR) extends the (grid)
Geometry
interface class by the new interface. This is conditionally defaultimplemented: If the actual grid geometry provides the new interface it is used, otherwise a default implementation based ontranspose()
is used.  dunegeometry!193 (merged) extends the actual geometry check and the implementations provided in dunegeomtry by the new interface.