From b71f5bf40caf60da026e3372be27238e15129011 Mon Sep 17 00:00:00 2001 From: Oliver Sander <sander@igpm.rwth-aachen.de> Date: Tue, 3 Sep 2013 16:30:01 +0000 Subject: [PATCH] Use ValueFactory for the harmonic energy test Hence many input configurations are tested now [[Imported from SVN: r9418]] --- test/adolctest.cc | 83 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 59 insertions(+), 24 deletions(-) diff --git a/test/adolctest.cc b/test/adolctest.cc index 264cd620..27331135 100644 --- a/test/adolctest.cc +++ b/test/adolctest.cc @@ -33,8 +33,24 @@ #include <dune/gfe/cosseratenergystiffness.hh> #include <dune/gfe/localgeodesicfeadolcstiffness.hh> +#include "valuefactory.hh" +#include "multiindex.hh" + using namespace Dune; +/** \brief Computes the diameter of a set */ +template <class TargetSpace> +double diameter(const std::vector<TargetSpace>& v) +{ + double d = 0; + for (size_t i=0; i<v.size(); i++) + for (size_t j=0; j<v.size(); j++) + d = std::max(d, TargetSpace::distance(v[i],v[j])); + return d; +} + + + template <int blocksize> void compareMatrices(const Matrix<FieldMatrix<double,blocksize,blocksize> >& fdMatrix, const Matrix<FieldMatrix<double,blocksize,blocksize> >& adolcMatrix) @@ -58,54 +74,73 @@ void compareMatrices(const Matrix<FieldMatrix<double,blocksize,blocksize> >& fdM int testHarmonicEnergy() { + typedef UnitVector<double,3> TargetSpace; const int dim = 1; + + std::cout << " --- Testing " << className<TargetSpace>() << ", domain dimension: " << dim << " ---" << std::endl; + + // set up a test grid typedef YaspGrid<dim> GridType; FieldVector<double,dim> l(1); std::array<int,dim> elements; std::fill(elements.begin(), elements.end(), 1); GridType grid(l,elements); - typedef Q1LocalFiniteElement<double,double,dim> LocalFE; - LocalFE localFiniteElement; - - size_t nDofs = localFiniteElement.localBasis().size(); - - typedef UnitVector<double,3> TargetSpace; - std::vector<TargetSpace> localSolution(nDofs); - - for (size_t i=0; i<nDofs; i++) - localSolution[i] = FieldVector<double,3>(1.0); - - for (size_t i=0; i<localSolution.size(); i++) - std::cout << localSolution[i] << std::endl; - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - typedef Q1NodalBasis<GridType::LeafGridView,double> Q1Basis; Q1Basis q1Basis(grid.leafView()); + typedef Q1LocalFiniteElement<double,double,dim> LocalFE; + LocalFE localFiniteElement; + + // Assembler using finite differences HarmonicEnergyLocalStiffness<GridType::LeafGridView, Q1Basis::LocalFiniteElement, TargetSpace> harmonicEnergyLocalStiffness; - // Assembler using ADOL-C + // Assembler using ADOL-C typedef TargetSpace::rebind<adouble>::other ATargetSpace; HarmonicEnergyLocalStiffness<GridType::LeafGridView, - Q1Basis::LocalFiniteElement, - ATargetSpace> harmonicEnergyADOLCLocalStiffness; + Q1Basis::LocalFiniteElement, + ATargetSpace> harmonicEnergyADOLCLocalStiffness; LocalGeodesicFEADOLCStiffness<GridType::LeafGridView, Q1Basis::LocalFiniteElement, TargetSpace> localGFEADOLCStiffness(&harmonicEnergyADOLCLocalStiffness); + size_t nDofs = localFiniteElement.localBasis().size(); - harmonicEnergyLocalStiffness.assembleHessian(*grid.leafbegin<0>(),localFiniteElement, localSolution); + std::vector<TargetSpace> localSolution(nDofs); - localGFEADOLCStiffness.assembleHessian(*grid.leafbegin<0>(),localFiniteElement, localSolution); + std::vector<TargetSpace> testPoints; + ValueFactory<TargetSpace>::get(testPoints); - compareMatrices(harmonicEnergyLocalStiffness.A_, localGFEADOLCStiffness.A_); + int nTestPoints = testPoints.size(); - return 0; + MultiIndex index(nDofs, nTestPoints); + int numIndices = index.cycle(); + + for (int i=0; i<numIndices; i++, ++index) { + + for (size_t j=0; j<nDofs; j++) + localSolution[j] = testPoints[index[j]]; + + if (diameter(localSolution) > 0.5*M_PI) + continue; + + for (size_t j=0; j<localSolution.size(); j++) + std::cout << localSolution[j] << std::endl; + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + harmonicEnergyLocalStiffness.assembleHessian(*grid.leafbegin<0>(),localFiniteElement, localSolution); + + localGFEADOLCStiffness.assembleHessian(*grid.leafbegin<0>(),localFiniteElement, localSolution); + + compareMatrices(harmonicEnergyLocalStiffness.A_, localGFEADOLCStiffness.A_); + + } + + return 0; } int testCosseratEnergy() { -- GitLab