diff --git a/src/localgeodesicfefunction.hh b/src/localgeodesicfefunction.hh index 06d3f944b11963e5e3a5402cbc52eb77a44f7226..25e278482d128e7138185705bfe0304864e65768 100644 --- a/src/localgeodesicfefunction.hh +++ b/src/localgeodesicfefunction.hh @@ -259,46 +259,26 @@ template <int dim, class ctype, class TargetSpace> Dune::FieldMatrix<ctype, TargetSpace::EmbeddedTangentVector::size, dim> LocalGeodesicFEFunction<dim,ctype,TargetSpace>:: evaluateDerivativeFD(const Dune::FieldVector<ctype, dim>& local) { - Dune::FieldMatrix<ctype, EmbeddedTangentVector::size, dim> result; - - if (dim==1) { - - EmbeddedTangentVector tmp = TargetSpace::interpolateDerivative(coefficients_[0], coefficients_[1], local[0]); - - for (int i=0; i<EmbeddedTangentVector::size; i++) - result[i][0] = tmp[i]; - - } - - if (dim==2) { - - double eps = 1e-6; + double eps = 1e-6; - Dune::FieldVector<ctype, dim> fX = local; - Dune::FieldVector<ctype, dim> bX = local; - Dune::FieldVector<ctype, dim> fY = local; - Dune::FieldVector<ctype, dim> bY = local; - - fX[0] += eps; - bX[0] -= eps; - fY[1] += eps; - bY[1] -= eps; - - Quaternion<double> dX = (evaluate(fX) - evaluate(bX)); - Quaternion<double> dY = (evaluate(fY) - evaluate(bY)); - - dX /= 2*eps; - dY /= 2*eps; - - for (int i=0; i<EmbeddedTangentVector::size; i++){ - result[i][0] = dX[i]; - result[i][1] = dY[i]; - } + Dune::FieldMatrix<ctype, EmbeddedTangentVector::size, dim> result; + for (int i=0; i<dim; i++) { + + Dune::FieldVector<ctype, dim> forward = local; + Dune::FieldVector<ctype, dim> backward = local; + + forward[i] += eps; + backward[i] -= eps; + + EmbeddedTangentVector fdDer = evaluate(forward) - evaluate(backward); + fdDer /= 2*eps; + + for (int j=0; j<EmbeddedTangentVector::size; j++) + result[j][i] = fdDer[j]; + } - assert(dim==1 || dim==2); - return result; }