diff --git a/dune/gfe/l2distancesquaredenergy.hh b/dune/gfe/l2distancesquaredenergy.hh index d08571cd1b35c42e835a22965300b1c2887fc4f4..1307fe0d0561d087c29fb011b8fe3360ca09f84d 100644 --- a/dune/gfe/l2distancesquaredenergy.hh +++ b/dune/gfe/l2distancesquaredenergy.hh @@ -57,8 +57,25 @@ public: UnitVector<double,3> originValue; origin_->evaluateLocal(element,quadPos, originValue); + // The derivative of the 'origin' function + // First: as function defined on the reference element + typename VirtualGridViewFunction<GridView,UnitVector<double,3> >::DerivativeType originReferenceDerivative; + origin_->evaluateDerivativeLocal(element,quadPos,originReferenceDerivative); + + // The derivative of the function defined on the actual element + typename VirtualGridViewFunction<GridView,UnitVector<double,3> >::DerivativeType originDerivative(0); + + auto jacobianInverseTransposed = element.geometry().jacobianInverseTransposed(quadPos); + + for (size_t comp=0; comp<originReferenceDerivative.N(); comp++) + jacobianInverseTransposed.umv(originReferenceDerivative[comp], originDerivative[comp]); + + double weightFactor = originDerivative.frobenius_norm(); + // un-comment the following line to switch off the weight factor + //weightFactor = 1.0; + // Add the local energy density - energy += weight * TargetSpace::distanceSquared(originValue, value); + energy += weight * weightFactor * TargetSpace::distanceSquared(originValue, value); }