Skip to content
Snippets Groups Projects
Commit 75150c48 authored by Oliver Sander's avatar Oliver Sander Committed by sander@FU-BERLIN.DE
Browse files

reimplement evaluateFDDerivativeOfValueWRTCoefficient actually using the exponential map

[[Imported from SVN: r7412]]
parent 9460750d
No related branches found
No related tags found
No related merge requests found
...@@ -57,6 +57,8 @@ class LocalGeodesicFEFunction ...@@ -57,6 +57,8 @@ class LocalGeodesicFEFunction
typedef typename TargetSpace::EmbeddedTangentVector EmbeddedTangentVector; typedef typename TargetSpace::EmbeddedTangentVector EmbeddedTangentVector;
static const int embeddedDim = EmbeddedTangentVector::size; static const int embeddedDim = EmbeddedTangentVector::size;
static const int spaceDim = TargetSpace::TangentVector::size;
public: public:
...@@ -377,28 +379,44 @@ evaluateFDDerivativeOfValueWRTCoefficient(const Dune::FieldVector<ctype, dim>& l ...@@ -377,28 +379,44 @@ evaluateFDDerivativeOfValueWRTCoefficient(const Dune::FieldVector<ctype, dim>& l
Dune::FieldMatrix<double,embeddedDim,embeddedDim>& result) const Dune::FieldMatrix<double,embeddedDim,embeddedDim>& result) const
{ {
double eps = 1e-6; double eps = 1e-6;
for (int j=0; j<TargetSpace::EmbeddedTangentVector::size; j++) {
// the function value at the point where we are evaluating the derivative
std::vector<TargetSpace> cornersPlus = coefficients_; const Dune::FieldMatrix<double,spaceDim,embeddedDim> B = coefficients_[coefficient].orthonormalFrame();
std::vector<TargetSpace> cornersMinus = coefficients_;
typename TargetSpace::CoordinateType aPlus = coefficients_[coefficient].globalCoordinates(); Dune::FieldMatrix<double,spaceDim,embeddedDim> interimResult;
typename TargetSpace::CoordinateType aMinus = coefficients_[coefficient].globalCoordinates();
aPlus[j] += eps; std::vector<TargetSpace> cornersPlus = coefficients_;
aMinus[j] -= eps; std::vector<TargetSpace> cornersMinus = coefficients_;
cornersPlus[coefficient] = TargetSpace(aPlus);
cornersMinus[coefficient] = TargetSpace(aMinus); for (int j=0; j<spaceDim; j++) {
typename TargetSpace::EmbeddedTangentVector forwardVariation = B[j];
forwardVariation *= eps;
typename TargetSpace::EmbeddedTangentVector backwardVariation = B[j];
backwardVariation *= -eps;
cornersPlus [coefficient] = TargetSpace::exp(coefficients_[coefficient], forwardVariation);
cornersMinus[coefficient] = TargetSpace::exp(coefficients_[coefficient], backwardVariation);
LocalGeodesicFEFunction<dim,double,TargetSpace> fPlus(cornersPlus); LocalGeodesicFEFunction<dim,double,TargetSpace> fPlus(cornersPlus);
LocalGeodesicFEFunction<dim,double,TargetSpace> fMinus(cornersMinus); LocalGeodesicFEFunction<dim,double,TargetSpace> fMinus(cornersMinus);
TargetSpace hPlus = fPlus.evaluate(local); TargetSpace hPlus = fPlus.evaluate(local);
TargetSpace hMinus = fMinus.evaluate(local); TargetSpace hMinus = fMinus.evaluate(local);
result[j] = hPlus.globalCoordinates(); interimResult[j] = hPlus.globalCoordinates();
result[j] -= hMinus.globalCoordinates(); interimResult[j] -= hMinus.globalCoordinates();
result[j] /= 2*eps; interimResult[j] /= 2*eps;
} }
for (int i=0; i<embeddedDim; i++)
for (int j=0; j<embeddedDim; j++) {
result[i][j] = 0;
for (int k=0; k<spaceDim; k++)
result[i][j] += B[k][i]*interimResult[k][j];
}
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment