diff --git a/dune/gfe/averagedistanceassembler.hh b/dune/gfe/averagedistanceassembler.hh index ff09c61e8aa835ded08115d7ed8eedda8de266d0..9291406818c78aff3ed8da18a7b60c4796f3da6f 100644 --- a/dune/gfe/averagedistanceassembler.hh +++ b/dune/gfe/averagedistanceassembler.hh @@ -8,7 +8,8 @@ template <class TargetSpace> class AverageDistanceAssembler { - static const int size = TargetSpace::EmbeddedTangentVector::size; + static const int size = TargetSpace::TangentVector::size; + static const int embeddedSize = TargetSpace::EmbeddedTangentVector::size; public: @@ -38,6 +39,24 @@ public: TargetSpace::derivativeOfDistanceSquaredWRTSecondArgument(coefficients_[i], x)); } + void assembleGradient(const TargetSpace& x, + typename TargetSpace::TangentVector& gradient) const + { + typename TargetSpace::EmbeddedTangentVector embeddedGradient; + assembleGradient(x,embeddedGradient); + + Dune::FieldMatrix<double,size,embeddedSize> orthonormalFrame = x.orthonormalFrame(); + orthonormalFrame.mv(embeddedGradient,gradient); + } + + void assembleHessianApproximation(const TargetSpace& x, + Dune::FieldMatrix<double,embeddedSize,embeddedSize>& matrix) const + { + for (int i=0; i<embeddedSize; i++) + for (int j=0; j<embeddedSize; j++) + matrix[i][j] = (i==j); + } + void assembleHessianApproximation(const TargetSpace& x, Dune::FieldMatrix<double,size,size>& matrix) const { @@ -47,7 +66,7 @@ public: } void assembleHessian(const TargetSpace& x, - Dune::FieldMatrix<double,size,size>& matrix) const + Dune::FieldMatrix<double,embeddedSize,embeddedSize>& matrix) const { matrix = 0; for (size_t i=0; i<coefficients_.size(); i++) diff --git a/dune/gfe/targetspacertrsolver.hh b/dune/gfe/targetspacertrsolver.hh index c05aadea97083ad41572bce2e3f21d3be980e13e..cb6928b4d432f174917c3d08d10b3862e93e9301 100644 --- a/dune/gfe/targetspacertrsolver.hh +++ b/dune/gfe/targetspacertrsolver.hh @@ -13,7 +13,7 @@ class TargetSpaceRiemannianTRSolver // : public IterativeSolver<std::vector<TargetSpace>, // Dune::BitSetVector<TargetSpace::TangentVector::size> > { - const static int blocksize = TargetSpace::EmbeddedTangentVector::size; + const static int blocksize = TargetSpace::TangentVector::size; // Centralize the field type here typedef double field_type;