diff --git a/test/unitvectortest.cc b/test/unitvectortest.cc index e7bf64b4ec87f4818acecfcd3a32d37c31e5f77f..421eabfd47482a3e18a8b134304d1670a4c51913 100644 --- a/test/unitvectortest.cc +++ b/test/unitvectortest.cc @@ -6,24 +6,9 @@ #include <typeinfo> -#ifdef __GNUC__ -#include <cxxabi.h> -#endif - using Dune::FieldVector; using std::complex; -template <class T> -std::string className(T &t) -{ -#ifdef __GNUC__ - int status; - return abi::__cxa_demangle(typeid(t).name(),0,0,&status); -#else - return typeid(t).name(); -#endif -}; - /** \file \brief Unit tests for the UnitVector class @@ -56,24 +41,25 @@ double energy(const FieldVector<double,dim>& a, const FieldVector<double,dim>& b The formula for the Riemannian Hessian has been taken from Absil, Mahony, Sepulchre: 'Optimization algorithms on matrix manifolds', page 107 */ -template <class TargetSpace, int dim> -FieldMatrix<double,dim,dim> getSecondDerivativeOfSecondArgumentFD(const TargetSpace& a, const TargetSpace& b) +template <class TargetSpace, int worldDim> +FieldMatrix<double,worldDim,worldDim> getSecondDerivativeOfSecondArgumentFD(const TargetSpace& a, const TargetSpace& b) { - // finite-difference approximation - FieldMatrix<double,dim,dim> d2d2_fd(0); const size_t spaceDim = TargetSpace::dim; + + // finite-difference approximation + FieldMatrix<double,spaceDim,spaceDim> d2d2_fd(0); - FieldMatrix<double,dim,dim> B = b.orthonormalFrame(); + FieldMatrix<double,spaceDim,worldDim> B = b.orthonormalFrame(); for (size_t i=0; i<spaceDim; i++) { for (size_t j=0; j<spaceDim; j++) { - FieldVector<double,dim> epsXi = B[i]; epsXi *= eps; - FieldVector<double,dim> epsEta = B[j]; epsEta *= eps; + FieldVector<double,worldDim> epsXi = B[i]; epsXi *= eps; + FieldVector<double,worldDim> epsEta = B[j]; epsEta *= eps; - FieldVector<double,dim> minusEpsXi = epsXi; minusEpsXi *= -1; - FieldVector<double,dim> minusEpsEta = epsEta; minusEpsEta *= -1; + FieldVector<double,worldDim> minusEpsXi = epsXi; minusEpsXi *= -1; + FieldVector<double,worldDim> minusEpsEta = epsEta; minusEpsEta *= -1; double forwardValue = energy(a,TargetSpace::exp(b,epsXi+epsEta)) - energy(a, TargetSpace::exp(b,epsXi)) - energy(a,TargetSpace::exp(b,epsEta)); double centerValue = energy(a,b) - energy(a,b) - energy(a,b); @@ -84,17 +70,17 @@ FieldMatrix<double,dim,dim> getSecondDerivativeOfSecondArgumentFD(const TargetSp } } - B.invert(); - FieldMatrix<double,dim,dim> BT; - for (int i=0; i<dim; i++) - for (int j=0; j<dim; j++) + //B.invert(); + FieldMatrix<double,worldDim,spaceDim> BT; + for (int i=0; i<worldDim; i++) + for (int j=0; j<spaceDim; j++) BT[i][j] = B[j][i]; - FieldMatrix<double,dim,dim> ret1; + FieldMatrix<double,spaceDim,worldDim> ret1; FMatrixHelp::multMatrix(d2d2_fd,B,ret1); - FieldMatrix<double,dim,dim> ret2; + FieldMatrix<double,worldDim,worldDim> ret2; FMatrixHelp::multMatrix(BT,ret1,ret2); return ret2; } @@ -256,17 +242,46 @@ void testDerivativesOfSquaredDistance(const TargetSpace& a, const TargetSpace& b } +void testUnitVector2d() +{ + int nTestPoints = 1; + double testPoints[1][2][2] = {{{1,0}, {0,1}}}; + + // Set up elements of S^1 + for (int i=0; i<nTestPoints; i++) { + + Dune::array<double,2> w0 = {testPoints[i][0][0], testPoints[i][0][1]}; + UnitVector<2> uv0(w0); + Dune::array<double,2> w1 = {testPoints[i][1][0], testPoints[i][1][1]}; + UnitVector<2> uv1(w1); + + testDerivativesOfSquaredDistance<UnitVector<2>, 2>(uv0, uv1); + + } +} + +void testUnitVector3d() +{ + int nTestPoints = 1; + double testPoints[1][2][3] = {{{1,0,0}, {0,1,0}}}; + + // Set up elements of S^1 + for (int i=0; i<nTestPoints; i++) { + + Dune::array<double,3> w0 = {testPoints[i][0][0], testPoints[i][0][1], testPoints[i][0][2]}; + UnitVector<3> uv0(w0); + Dune::array<double,3> w1 = {testPoints[i][1][0], testPoints[i][1][1], testPoints[i][1][2]}; + UnitVector<3> uv1(w1); + + testDerivativesOfSquaredDistance<UnitVector<3>, 3>(uv0, uv1); + + } +} int main() { -#if 1 - // Set up elements of S^1 - Dune::array<double,2> w0 = {{1,0}}; - UnitVector<2> uv0(w0); - Dune::array<double,2> w1 = {{0,1}}; - UnitVector<2> uv1(w1); - testDerivativesOfSquaredDistance<UnitVector<2>, 2>(uv0, uv1); -#endif + testUnitVector2d(); + testUnitVector3d(); // Set up elements of R^1 Dune::FieldVector<double,2> rtw0; rtw0[0] = 0; rtw0[1] = 1;