diff --git a/src/harmonicenergystiffness.hh b/src/harmonicenergystiffness.hh index b6d8759911cf97897f3e0a728533cd23dab04a6e..509ab6c1983de6caba9e3c7081abb6b30740e068 100644 --- a/src/harmonicenergystiffness.hh +++ b/src/harmonicenergystiffness.hh @@ -63,9 +63,11 @@ energy(const Entity& element, // The derivative of the function defined on the actual element Dune::FieldMatrix<double, TargetSpace::EmbeddedTangentVector::size, gridDim> derivative(0); - for (int comp=0; comp<4; comp++) + for (int comp=0; comp<referenceDerivative.N(); comp++) jacobianInverseTransposed.umv(referenceDerivative[comp], derivative[comp]); +#if 0 + // old debugging: the image of the derivative mapping must be tangent to the TargetSpace TargetSpace value = localGeodesicFEFunction.evaluate(quadPos); for (int i=0; i<gridDim; i++) { @@ -74,25 +76,16 @@ energy(const Entity& element, dotproduct += value[j]*derivative[j][i]; assert(std::fabs(dotproduct) < 1e-6); } +#endif #if 0 - std::cout << "Derivative norm: "; - - for (int i=0; i<gridDim; i++) { - double derivativenorm = 0; - for (int j=0; j<4; j++) - derivativenorm += derivative[j][i]*derivative[j][i]; - std::cout << derivativenorm << ", "; - } - std::cout << std::endl; + std::cout << "Derivative norm squared: " << derivative.frobenius_norm2() << std::endl; #endif - for (int comp=0; comp<4; comp++) { - - for (int dir=0; dir<gridDim; dir++) - energy += weight * derivative[comp][dir] * derivative[comp][dir]; - - } + // Add the local energy density + // The Frobenius norm is the correct norm here if the metric of TargetSpace is the identity. + // (And if the metric of the domain space is the identity, which it always is here.) + energy += weight * derivative.frobenius_norm2(); }