From 2f81ce9ae0f422077e438f9364b3bcf08dfcc7b4 Mon Sep 17 00:00:00 2001 From: Oliver Sander <sander@igpm.rwth-aachen.de> Date: Tue, 3 Sep 2013 16:30:16 +0000 Subject: [PATCH] Test the Cosserat energy with all points from the test function set This still fails -- there must still be a bug in the Hessian computation [[Imported from SVN: r9427]] --- test/adolctest.cc | 87 +++++++++++++++++++++++++---------------------- 1 file changed, 46 insertions(+), 41 deletions(-) diff --git a/test/adolctest.cc b/test/adolctest.cc index 83cb327d..85deaf7c 100644 --- a/test/adolctest.cc +++ b/test/adolctest.cc @@ -144,59 +144,62 @@ int testHarmonicEnergy() { int testCosseratEnergy() { - size_t nDofs = 4; + typedef RigidBodyMotion<double,3> TargetSpace; + const int gridDim = 2; + + std::cout << " --- Testing " << className<TargetSpace>() << ", domain dimension: " << gridDim << " ---" << std::endl; + + ParameterTree parameterSet; + ParameterTreeParser::readINITree("../cosserat-continuum.parset", parameterSet); + + const ParameterTree& materialParameters = parameterSet.sub("materialParameters"); + std::cout << "Material parameters:" << std::endl; + materialParameters.report(); - const int dim = 2; - typedef YaspGrid<dim> GridType; - FieldVector<double,dim> l(1); - std::array<int,dim> elements = {{1, 1}}; + // set up a test grid + typedef YaspGrid<gridDim> GridType; + FieldVector<double,gridDim> l(1); + std::array<int,gridDim> elements; + std::fill(elements.begin(), elements.end(), 1); GridType grid(l,elements); - typedef Q1LocalFiniteElement<double,double,dim> LocalFE; - LocalFE localFiniteElement; + typedef Q1NodalBasis<typename GridType::LeafGridView,double> Q1Basis; + Q1Basis q1Basis(grid.leafView()); - //typedef RealTuple<double,1> TargetSpace; - typedef RigidBodyMotion<double,3> TargetSpace; - std::vector<TargetSpace> localSolution(nDofs); - FieldVector<double,7> identity(0); - identity[6] = 1; - - for (auto vIt = grid.leafbegin<dim>(); vIt != grid.leafend<dim>(); ++vIt) { - localSolution[grid.leafView().indexSet().index(*vIt)].r = 0; - for (int i=0; i<dim; i++) - localSolution[grid.leafView().indexSet().index(*vIt)].r[i] = 2*vIt->geometry().corner(0)[i]; - localSolution[grid.leafView().indexSet().index(*vIt)].q = Rotation<double,3>::identity(); - } + typedef Q1LocalFiniteElement<double,double,gridDim> LocalFE; + LocalFE localFiniteElement; - for (size_t i=0; i<localSolution.size(); i++) - std::cout << localSolution[i] << std::endl; + // Assembler using finite differences + CosseratEnergyLocalStiffness<GridType::LeafGridView, + Q1Basis::LocalFiniteElement, + 3> cosseratEnergyLocalStiffness(materialParameters,NULL,NULL); - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Assembler using ADOL-C + CosseratEnergyLocalStiffness<GridType::LeafGridView, + Q1Basis::LocalFiniteElement, + 3,adouble> cosseratEnergyADOLCLocalStiffness(materialParameters, NULL, NULL); + LocalGeodesicFEADOLCStiffness<GridType::LeafGridView, + Q1Basis::LocalFiniteElement, + TargetSpace> localGFEADOLCStiffness(&cosseratEnergyADOLCLocalStiffness); - typedef Q1NodalBasis<GridType::LeafGridView,double> Q1Basis; - Q1Basis q1Basis(grid.leafView()); + size_t nDofs = localFiniteElement.localBasis().size(); - ParameterTree parameterSet; - ParameterTreeParser::readINITree("../cosserat-continuum.parset", parameterSet); + std::vector<TargetSpace> localSolution(nDofs); + std::vector<TargetSpace> testPoints; + ValueFactory<TargetSpace>::get(testPoints); - const ParameterTree& materialParameters = parameterSet.sub("materialParameters"); - std::cout << "Material parameters:" << std::endl; - materialParameters.report(); + int nTestPoints = testPoints.size(); + MultiIndex index(nDofs, nTestPoints); + int numIndices = index.cycle(); - CosseratEnergyLocalStiffness<GridType::LeafGridView, - Q1Basis::LocalFiniteElement, - 3> cosseratEnergyLocalStiffness(materialParameters,NULL,NULL); + for (int i=0; i<numIndices; i++, ++index) { - // Assembler using ADOL-C - CosseratEnergyLocalStiffness<GridType::LeafGridView, - Q1Basis::LocalFiniteElement, - 3,adouble> cosseratEnergyADOLCLocalStiffness(materialParameters, NULL, NULL); - LocalGeodesicFEADOLCStiffness<GridType::LeafGridView, - Q1Basis::LocalFiniteElement, - TargetSpace> localGFEADOLCStiffness(&cosseratEnergyADOLCLocalStiffness); + for (size_t j=0; j<nDofs; j++) + localSolution[j] = testPoints[index[j]]; + if (diameter(localSolution) > TargetSpace::convexityRadius) + continue; cosseratEnergyLocalStiffness.assembleHessian(*grid.leafbegin<0>(),localFiniteElement, localSolution); @@ -204,7 +207,9 @@ int testCosseratEnergy() { compareMatrices(cosseratEnergyLocalStiffness.A_, localGFEADOLCStiffness.A_, localSolution); - return 0; + } + + return 0; } -- GitLab