From 6037c7219c7b034796aacad3f06c6b31b8fa5d8e Mon Sep 17 00:00:00 2001 From: Oliver Sander <sander@igpm.rwth-aachen.de> Date: Mon, 6 Jun 2011 12:40:48 +0000 Subject: [PATCH] Remove a few specializations. From now on we will assume that all target spaces can be parametrized by some sort of global embedding. I don't see a case coming where that is not general enough [[Imported from SVN: r7373]] --- dune/gfe/localgeodesicfestiffness.hh | 160 ++++++++++----------------- 1 file changed, 58 insertions(+), 102 deletions(-) diff --git a/dune/gfe/localgeodesicfestiffness.hh b/dune/gfe/localgeodesicfestiffness.hh index 656fc6ab..ad1fa227 100644 --- a/dune/gfe/localgeodesicfestiffness.hh +++ b/dune/gfe/localgeodesicfestiffness.hh @@ -14,7 +14,7 @@ template<class GridView, class TargetSpace> class LocalGeodesicFEStiffness; -template<class GridView, class TargetSpace, bool globalIsometricCoordinates> +template<class GridView, class TargetSpace> class LocalGeodesicFEStiffnessImp { @@ -40,6 +40,41 @@ class LocalGeodesicFEStiffnessImp c = result; } + /** \brief For the fd approximations + */ + static void infinitesimalVariation(RigidBodyMotion<3>& c, double eps, int i) + { + if (i<3) + c.r[i] += eps; + else + c.q = c.q.mult(Rotation<3,double>::exp((i==3)*eps, + (i==4)*eps, + (i==5)*eps)); + } + + /** \brief For the fd approximations + */ + static void infinitesimalVariation(RigidBodyMotion<2>& c, double eps, int i) + { + if (i<2) + c.r[i] += eps; + else + c.q = c.q.mult(Rotation<2,double>::exp(Dune::FieldVector<double,1>(eps))); + } + + static void infinitesimalVariation(Rotation<3,double>& c, double eps, int i) + { + c = c.mult(Rotation<3,double>::exp((i==0)*eps, + (i==1)*eps, + (i==2)*eps)); + } + + static void infinitesimalVariation(Rotation<2,double>& c, double eps, int i) + { + Dune::FieldVector<double,1> v(eps); + c = Rotation<2,double>::exp(c,v); + } + static void assembleEmbeddedGradient(const Entity& element, const std::vector<TargetSpace>& localSolution, std::vector<typename TargetSpace::EmbeddedTangentVector>& localGradient, @@ -68,8 +103,8 @@ class LocalGeodesicFEStiffnessImp // to a neighborhood around S^n forwardSolution[i] = localSolution[i]; backwardSolution[i] = localSolution[i]; - LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::infinitesimalVariation(forwardSolution[i], eps, j); - LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::infinitesimalVariation(backwardSolution[i], -eps, j); + LocalGeodesicFEStiffnessImp<GridView,TargetSpace>::infinitesimalVariation(forwardSolution[i], eps, j); + LocalGeodesicFEStiffnessImp<GridView,TargetSpace>::infinitesimalVariation(backwardSolution[i], -eps, j); localGradient[i][j] = (energyObject->energy(element,forwardSolution) - energyObject->energy(element,backwardSolution)) / (2*eps); @@ -105,85 +140,6 @@ class LocalGeodesicFEStiffnessImp }; -template<class GridView, class TargetSpace> -class LocalGeodesicFEStiffnessImp<GridView,TargetSpace,false> -{ - typedef typename GridView::template Codim<0>::Entity Entity; - -public: - - /** \brief For the fd approximations - */ - static void infinitesimalVariation(RigidBodyMotion<3>& c, double eps, int i) - { - if (i<3) - c.r[i] += eps; - else - c.q = c.q.mult(Rotation<3,double>::exp((i==3)*eps, - (i==4)*eps, - (i==5)*eps)); - } - - /** \brief For the fd approximations - */ - static void infinitesimalVariation(RigidBodyMotion<2>& c, double eps, int i) - { - if (i<2) - c.r[i] += eps; - else - c.q = c.q.mult(Rotation<2,double>::exp(Dune::FieldVector<double,1>(eps))); - } - - static void infinitesimalVariation(Rotation<3,double>& c, double eps, int i) - { - c = c.mult(Rotation<3,double>::exp((i==0)*eps, - (i==1)*eps, - (i==2)*eps)); - } - - static void infinitesimalVariation(Rotation<2,double>& c, double eps, int i) - { - Dune::FieldVector<double,1> v(eps); - c = Rotation<2,double>::exp(c,v); - } - - static void assembleGradient(const Entity& element, - const std::vector<TargetSpace>& localSolution, - std::vector<typename TargetSpace::TangentVector>& localGradient, - const LocalGeodesicFEStiffness<GridView,TargetSpace>* energyObject) - { - // /////////////////////////////////////////////////////////// - // Compute gradient by finite-difference approximation - // /////////////////////////////////////////////////////////// - - double eps = 1e-6; - - localGradient.resize(localSolution.size()); - - std::vector<TargetSpace> forwardSolution = localSolution; - std::vector<TargetSpace> backwardSolution = localSolution; - - for (size_t i=0; i<localSolution.size(); i++) { - - for (int j=0; j<TargetSpace::TangentVector::size; j++) { - - infinitesimalVariation(forwardSolution[i], eps, j); - infinitesimalVariation(backwardSolution[i], -eps, j); - - localGradient[i][j] = (energyObject->energy(element,forwardSolution) - energyObject->energy(element,backwardSolution)) - / (2*eps); - - forwardSolution[i] = localSolution[i]; - backwardSolution[i] = localSolution[i]; - } - - } - - } - -}; - - template<class GridView, class TargetSpace> class LocalGeodesicFEStiffness { @@ -235,7 +191,7 @@ assembleGradient(const Entity& element, const std::vector<TargetSpace>& localSolution, std::vector<Dune::FieldVector<double,blocksize> >& localGradient) const { - LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::assembleGradient(element, localSolution, localGradient, this); + LocalGeodesicFEStiffnessImp<GridView,TargetSpace>::assembleGradient(element, localSolution, localGradient, this); } template <class GridView, class TargetSpace> @@ -244,7 +200,7 @@ assembleEmbeddedFDGradient(const Entity& element, const std::vector<TargetSpace>& localSolution, std::vector<typename TargetSpace::EmbeddedTangentVector>& localGradient) const { - LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::assembleEmbeddedGradient(element, localSolution, localGradient, this); + LocalGeodesicFEStiffnessImp<GridView,TargetSpace>::assembleEmbeddedGradient(element, localSolution, localGradient, this); } template <class GridView, class TargetSpace> @@ -260,7 +216,7 @@ assembleHessian(const Entity& element, A_ = 0; - double eps = 1e-4; + double eps = 1e-8; typedef typename Dune::Matrix<Dune::FieldMatrix<double,blocksize,blocksize> >::row_type::iterator ColumnIterator; @@ -304,8 +260,8 @@ assembleHessian(const Entity& element, // Diagonal entries if (i==cIt.index() && j==k) { - LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::infinitesimalVariation(forwardSolution[i], eps, j); - LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::infinitesimalVariation(backwardSolution[i], -eps, j); + LocalGeodesicFEStiffnessImp<GridView,TargetSpace>::infinitesimalVariation(forwardSolution[i], eps, j); + LocalGeodesicFEStiffnessImp<GridView,TargetSpace>::infinitesimalVariation(backwardSolution[i], -eps, j); double forwardEnergy = energy(element, forwardSolution); @@ -322,14 +278,14 @@ assembleHessian(const Entity& element, } else { // Off-diagonal entries - LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::infinitesimalVariation(forwardForwardSolution[i], eps, j); - LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::infinitesimalVariation(forwardForwardSolution[cIt.index()], eps, k); - LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::infinitesimalVariation(forwardBackwardSolution[i], eps, j); - LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::infinitesimalVariation(forwardBackwardSolution[cIt.index()], -eps, k); - LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::infinitesimalVariation(backwardForwardSolution[i], -eps, j); - LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::infinitesimalVariation(backwardForwardSolution[cIt.index()], eps, k); - LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::infinitesimalVariation(backwardBackwardSolution[i], -eps, j); - LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::infinitesimalVariation(backwardBackwardSolution[cIt.index()],-eps, k); + LocalGeodesicFEStiffnessImp<GridView,TargetSpace>::infinitesimalVariation(forwardForwardSolution[i], eps, j); + LocalGeodesicFEStiffnessImp<GridView,TargetSpace>::infinitesimalVariation(forwardForwardSolution[cIt.index()], eps, k); + LocalGeodesicFEStiffnessImp<GridView,TargetSpace>::infinitesimalVariation(forwardBackwardSolution[i], eps, j); + LocalGeodesicFEStiffnessImp<GridView,TargetSpace>::infinitesimalVariation(forwardBackwardSolution[cIt.index()], -eps, k); + LocalGeodesicFEStiffnessImp<GridView,TargetSpace>::infinitesimalVariation(backwardForwardSolution[i], -eps, j); + LocalGeodesicFEStiffnessImp<GridView,TargetSpace>::infinitesimalVariation(backwardForwardSolution[cIt.index()], eps, k); + LocalGeodesicFEStiffnessImp<GridView,TargetSpace>::infinitesimalVariation(backwardBackwardSolution[i], -eps, j); + LocalGeodesicFEStiffnessImp<GridView,TargetSpace>::infinitesimalVariation(backwardBackwardSolution[cIt.index()],-eps, k); double forwardForwardEnergy = energy(element, forwardForwardSolution); @@ -455,7 +411,7 @@ public: int component, std::vector<Dune::FieldMatrix<double,embeddedBlocksize,embeddedBlocksize> >& gradient) const { - double eps = 1e-6; + double eps = 1e-8; gradient.resize(localSolution.size()); std::fill(gradient.begin(), gradient.end(), Dune::FieldMatrix<double,embeddedBlocksize,embeddedBlocksize>(0)); @@ -471,13 +427,13 @@ public: // to a neighborhood around S^n forwardSolution[component] = localSolution[component]; backwardSolution[component] = localSolution[component]; - LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::infinitesimalVariation(forwardSolution[component], eps, j); - LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::infinitesimalVariation(backwardSolution[component], -eps, j); + LocalGeodesicFEStiffnessImp<GridView,TargetSpace>::infinitesimalVariation(forwardSolution[component], eps, j); + LocalGeodesicFEStiffnessImp<GridView,TargetSpace>::infinitesimalVariation(backwardSolution[component], -eps, j); std::vector<Dune::FieldVector<double,embeddedBlocksize> > forwardGradient; std::vector<Dune::FieldVector<double,embeddedBlocksize> > backwardGradient; - LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::assembleEmbeddedGradient(element, forwardSolution, forwardGradient,this); - LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::assembleEmbeddedGradient(element, backwardSolution, backwardGradient,this); + LocalGeodesicFEStiffnessImp<GridView,TargetSpace>::assembleEmbeddedGradient(element, forwardSolution, forwardGradient,this); + LocalGeodesicFEStiffnessImp<GridView,TargetSpace>::assembleEmbeddedGradient(element, backwardSolution, backwardGradient,this); for (size_t k=0; k<localSolution.size(); k++) for (int l=0; l<embeddedBlocksize; l++) @@ -515,7 +471,7 @@ assembleGradient(const Entity& element, const std::vector<TargetSpace>& localSolution, std::vector<typename TargetSpace::TangentVector>& localGradient) const { - LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::assembleGradient(element, localSolution, localGradient,this); + LocalGeodesicFEStiffnessImp<GridView,TargetSpace>::assembleGradient(element, localSolution, localGradient,this); } template <class GridView, int dim> @@ -524,7 +480,7 @@ assembleEmbeddedFDGradient(const Entity& element, const std::vector<TargetSpace>& localSolution, std::vector<typename TargetSpace::EmbeddedTangentVector>& localGradient) const { - LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::assembleEmbeddedGradient(element, localSolution, localGradient, this); + LocalGeodesicFEStiffnessImp<GridView,TargetSpace>::assembleEmbeddedGradient(element, localSolution, localGradient, this); } -- GitLab