From 7539404ebf5007671eb223fe968f042357641a3b Mon Sep 17 00:00:00 2001 From: Oliver Sander <sander@igpm.rwth-aachen.de> Date: Wed, 6 Apr 2011 10:07:03 +0000 Subject: [PATCH] really make the domain dimension a parameter [[Imported from SVN: r7103]] --- test/localgeodesicfefunctiontest.cc | 108 ++++++++++++++-------------- 1 file changed, 56 insertions(+), 52 deletions(-) diff --git a/test/localgeodesicfefunctiontest.cc b/test/localgeodesicfefunctiontest.cc index 30ceb7c4..15c27c22 100644 --- a/test/localgeodesicfefunctiontest.cc +++ b/test/localgeodesicfefunctiontest.cc @@ -12,14 +12,11 @@ #include <dune/gfe/localgeodesicfefunction.hh> -// Domain dimension -const int dim = 2; - const double eps = 1e-6; using namespace Dune; -/** \brief dim-dimensional multi-index +/** \brief N-dimensional multi-index */ template <int N> class MultiIndex @@ -66,18 +63,19 @@ public: }; +template <int domainDim> void testDerivativeTangentiality(const RealTuple<1>& x, - const FieldMatrix<double,1,dim>& derivative) + const FieldMatrix<double,1,domainDim>& derivative) { // By construction, derivatives of RealTuples are always tangent } // the columns of the derivative must be tangential to the manifold -template <int vectorDim> +template <int domainDim, int vectorDim> void testDerivativeTangentiality(const UnitVector<vectorDim>& x, - const FieldMatrix<double,vectorDim,dim>& derivative) + const FieldMatrix<double,vectorDim,domainDim>& derivative) { - for (int i=0; i<dim; i++) { + for (int i=0; i<domainDim; i++) { // The i-th column is a tangent vector if its scalar product with the global coordinates // of x vanishes. @@ -94,11 +92,14 @@ void testDerivativeTangentiality(const UnitVector<vectorDim>& x, /** \brief Test whether interpolation is invariant under permutation of the simplex vertices */ -template <class TargetSpace> +template <int domainDim, class TargetSpace> void testPermutationInvariance(const std::vector<TargetSpace>& corners) { - std::vector<TargetSpace> cornersRotated1(dim+1); - std::vector<TargetSpace> cornersRotated2(dim+1); + // works only for 2d domains + assert(domainDim==2); + + std::vector<TargetSpace> cornersRotated1(domainDim+1); + std::vector<TargetSpace> cornersRotated2(domainDim+1); cornersRotated1[0] = cornersRotated2[2] = corners[1]; cornersRotated1[1] = cornersRotated2[0] = corners[2]; @@ -111,16 +112,16 @@ void testPermutationInvariance(const std::vector<TargetSpace>& corners) // A quadrature rule as a set of test points int quadOrder = 3; - const Dune::QuadratureRule<double, dim>& quad - = Dune::QuadratureRules<double, dim>::rule(GeometryType(GeometryType::simplex,dim), quadOrder); + const Dune::QuadratureRule<double, domainDim>& quad + = Dune::QuadratureRules<double, domainDim>::rule(GeometryType(GeometryType::simplex,domainDim), quadOrder); for (size_t pt=0; pt<quad.size(); pt++) { - const Dune::FieldVector<double,dim>& quadPos = quad[pt].position(); - - Dune::FieldVector<double,dim> l0 = quadPos; - Dune::FieldVector<double,dim> l1, l2; + const Dune::FieldVector<double,domainDim>& quadPos = quad[pt].position(); + Dune::FieldVector<double,domainDim> l0 = quadPos; + Dune::FieldVector<double,domainDim> l1, l2; + l1[0] = quadPos[1]; l1[1] = 1-quadPos[0]-quadPos[1]; @@ -140,7 +141,7 @@ void testPermutationInvariance(const std::vector<TargetSpace>& corners) } -template <class TargetSpace> +template <int domainDim, class TargetSpace> void testDerivative(const std::vector<TargetSpace>& corners) { // Make local fe function to be tested @@ -149,20 +150,20 @@ void testDerivative(const std::vector<TargetSpace>& corners) // A quadrature rule as a set of test points int quadOrder = 3; - const Dune::QuadratureRule<double, dim>& quad - = Dune::QuadratureRules<double, dim>::rule(GeometryType(GeometryType::simplex,dim), quadOrder); + const Dune::QuadratureRule<double, domainDim>& quad + = Dune::QuadratureRules<double, domainDim>::rule(GeometryType(GeometryType::simplex,domainDim), quadOrder); for (size_t pt=0; pt<quad.size(); pt++) { - const Dune::FieldVector<double,dim>& quadPos = quad[pt].position(); + const Dune::FieldVector<double,domainDim>& quadPos = quad[pt].position(); // evaluate actual derivative - Dune::FieldMatrix<double, TargetSpace::EmbeddedTangentVector::size, dim> derivative = f.evaluateDerivative(quadPos); + Dune::FieldMatrix<double, TargetSpace::EmbeddedTangentVector::size, domainDim> derivative = f.evaluateDerivative(quadPos); // evaluate fd approximation of derivative - Dune::FieldMatrix<double, TargetSpace::EmbeddedTangentVector::size, dim> fdDerivative = f.evaluateDerivativeFD(quadPos); + Dune::FieldMatrix<double, TargetSpace::EmbeddedTangentVector::size, domainDim> fdDerivative = f.evaluateDerivativeFD(quadPos); - Dune::FieldMatrix<double, TargetSpace::EmbeddedTangentVector::size, dim> diff = derivative; + Dune::FieldMatrix<double, TargetSpace::EmbeddedTangentVector::size, domainDim> diff = derivative; diff -= fdDerivative; if ( diff.infinity_norm() > 100*eps ) { @@ -176,7 +177,7 @@ void testDerivative(const std::vector<TargetSpace>& corners) } } -template <class TargetSpace> +template <int domainDim, class TargetSpace> void testDerivativeOfGradientWRTCoefficients(const std::vector<TargetSpace>& corners) { // Make local fe function to be tested @@ -185,22 +186,22 @@ void testDerivativeOfGradientWRTCoefficients(const std::vector<TargetSpace>& cor // A quadrature rule as a set of test points int quadOrder = 3; - const Dune::QuadratureRule<double, dim>& quad - = Dune::QuadratureRules<double, dim>::rule(GeometryType(GeometryType::simplex,dim), quadOrder); + const Dune::QuadratureRule<double, domainDim>& quad + = Dune::QuadratureRules<double, domainDim>::rule(GeometryType(GeometryType::simplex,domainDim), quadOrder); for (size_t pt=0; pt<quad.size(); pt++) { - const Dune::FieldVector<double,dim>& quadPos = quad[pt].position(); + const Dune::FieldVector<double,domainDim>& quadPos = quad[pt].position(); // loop over the coefficients for (size_t i=0; i<corners.size(); i++) { // evaluate actual derivative - Tensor3<double, TargetSpace::EmbeddedTangentVector::size, TargetSpace::EmbeddedTangentVector::size, dim> derivative; + Tensor3<double, TargetSpace::EmbeddedTangentVector::size, TargetSpace::EmbeddedTangentVector::size, domainDim> derivative; f.evaluateDerivativeOfGradientWRTCoefficient(quadPos, i, derivative); // evaluate fd approximation of derivative - Tensor3<double, TargetSpace::EmbeddedTangentVector::size, TargetSpace::EmbeddedTangentVector::size, dim> fdDerivative; + Tensor3<double, TargetSpace::EmbeddedTangentVector::size, TargetSpace::EmbeddedTangentVector::size, domainDim> fdDerivative; for (int j=0; j<TargetSpace::EmbeddedTangentVector::size; j++) { @@ -215,8 +216,8 @@ void testDerivativeOfGradientWRTCoefficients(const std::vector<TargetSpace>& cor LocalGeodesicFEFunction<2,double,TargetSpace> fPlus(cornersPlus); LocalGeodesicFEFunction<2,double,TargetSpace> fMinus(cornersMinus); - FieldMatrix<double,TargetSpace::EmbeddedTangentVector::size,dim> hPlus = fPlus.evaluateDerivative(quadPos); - FieldMatrix<double,TargetSpace::EmbeddedTangentVector::size,dim> hMinus = fMinus.evaluateDerivative(quadPos); + FieldMatrix<double,TargetSpace::EmbeddedTangentVector::size,domainDim> hPlus = fPlus.evaluateDerivative(quadPos); + FieldMatrix<double,TargetSpace::EmbeddedTangentVector::size,domainDim> hMinus = fMinus.evaluateDerivative(quadPos); fdDerivative[j] = hPlus; fdDerivative[j] -= hMinus; @@ -238,6 +239,7 @@ void testDerivativeOfGradientWRTCoefficients(const std::vector<TargetSpace>& cor } +template <int domainDim> void testRealTuples() { std::cout << " --- Testing RealTuple<1> ---" << std::endl; @@ -248,10 +250,11 @@ void testRealTuples() TargetSpace(2), TargetSpace(3)}; - testPermutationInvariance(corners); - testDerivative(corners); + testPermutationInvariance<domainDim>(corners); + testDerivative<domainDim>(corners); } +template <int domainDim> void testUnitVector2d() { std::cout << " --- Testing UnitVector<2> ---" << std::endl; @@ -262,21 +265,21 @@ void testUnitVector2d() double testPoints[10][2] = {{1,0}, {0.5,0.5}, {0,1}, {-0.5,0.5}, {-1,0}, {-0.5,-0.5}, {0,-1}, {0.5,-0.5}, {0.1,1}, {1,.1}}; // Set up elements of S^1 - std::vector<TargetSpace> corners(dim+1); + std::vector<TargetSpace> corners(domainDim+1); - MultiIndex<dim+1> index(nTestPoints); + MultiIndex<domainDim+1> index(nTestPoints); int numIndices = index.cycle(); for (int i=0; i<numIndices; i++, ++index) { - for (int j=0; j<dim+1; j++) { + for (int j=0; j<domainDim+1; j++) { Dune::array<double,2> w = {testPoints[index[j]][0], testPoints[index[j]][1]}; corners[j] = UnitVector<2>(w); } bool spreadOut = false; - for (int j=0; j<dim+1; j++) - for (int k=0; k<dim+1; k++) + for (int j=0; j<domainDim+1; j++) + for (int k=0; k<domainDim+1; k++) if (UnitVector<2>::distance(corners[j],corners[k]) > M_PI*0.98) spreadOut = true; @@ -284,13 +287,14 @@ void testUnitVector2d() continue; //testPermutationInvariance(corners); - testDerivative(corners); - testDerivativeOfGradientWRTCoefficients(corners); + testDerivative<domainDim>(corners); + testDerivativeOfGradientWRTCoefficients<domainDim>(corners); } } +template <int domainDim> void testUnitVector3d() { std::cout << " --- Testing UnitVector<3> ---" << std::endl; @@ -302,29 +306,29 @@ void testUnitVector3d() {-0.490946,-0.306456,0.81551},{-0.944506,0.123687,-0.304319}, {-0.6,0.1,-0.2},{0.45,0.12,0.517}, {-0.1,0.3,-0.1},{-0.444506,0.123687,0.104319},{-0.7,-0.123687,-0.304319}}; - assert(dim==2); // Set up elements of S^1 - std::vector<TargetSpace> corners(dim+1); + std::vector<TargetSpace> corners(domainDim+1); - MultiIndex<dim+1> index(nTestPoints); + MultiIndex<domainDim+1> index(nTestPoints); int numIndices = index.cycle(); for (int i=0; i<numIndices; i++, ++index) { - for (int j=0; j<dim+1; j++) { - Dune::array<double,3> w = {testPoints[index[j]][0], testPoints[index[j]][1]}; + for (int j=0; j<domainDim+1; j++) { + Dune::array<double,3> w = {testPoints[index[j]][0], testPoints[index[j]][1], testPoints[index[j]][2]}; corners[j] = UnitVector<3>(w); } //testPermutationInvariance(corners); - testDerivative(corners); - testDerivativeOfGradientWRTCoefficients(corners); + testDerivative<domainDim>(corners); + testDerivativeOfGradientWRTCoefficients<domainDim>(corners); } } +template <int domainDim> void testRotations() { std::cout << " --- Testing Rotation<3> ---" << std::endl; @@ -339,12 +343,12 @@ void testRotations() zAxis[2] = 1; - std::vector<TargetSpace> corners(dim+1); + std::vector<TargetSpace> corners(domainDim+1); corners[0] = Rotation<3,double>(xAxis,0.1); corners[1] = Rotation<3,double>(yAxis,0.1); corners[2] = Rotation<3,double>(zAxis,0.1); - testPermutationInvariance(corners); + testPermutationInvariance<domainDim>(corners); //testDerivative(corners); } @@ -355,7 +359,7 @@ int main() feenableexcept(FE_INVALID); //testRealTuples(); - testUnitVector2d(); - testUnitVector3d(); + testUnitVector2d<2>(); + testUnitVector3d<2>(); //testRotations(); } -- GitLab