From 0e22d791a30eca7cf727ac08ad67e9c83821dd07 Mon Sep 17 00:00:00 2001 From: Oliver Sander <sander@igpm.rwth-aachen.de> Date: Sun, 7 Mar 2010 08:46:36 +0000 Subject: [PATCH] add harmonicenergytest.cc [[Imported from SVN: r5665]] --- test/Makefile.am | 5 ++- test/harmonicenergytest.cc | 88 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 test/harmonicenergytest.cc diff --git a/test/Makefile.am b/test/Makefile.am index bfbe41e2..9cd17092 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -4,7 +4,8 @@ LDADD = $(UG_LDFLAGS) $(AMIRAMESH_LDFLAGS) $(UG_LIBS) $(AMIRAMESH_LIBS) AM_CPPFLAGS += $(UG_CPPFLAGS) $(AMIRAMESH_CPPFLAGS) -Wall -check_PROGRAMS = frameinvariancetest rotationtest fdcheck localgeodesicfefunctiontest +check_PROGRAMS = frameinvariancetest rotationtest fdcheck localgeodesicfefunctiontest \ + harmonicenergytest frameinvariancetest_SOURCES = frameinvariancetest.cc @@ -14,6 +15,8 @@ fdcheck_SOURCES = fdcheck.cc localgeodesicfefunctiontest_SOURCES = localgeodesicfefunctiontest.cc +harmonicenergytest_SOURCES = harmonicenergytest.cc + # don't follow the full GNU-standard # we need automake 1.5 AUTOMAKE_OPTIONS = foreign 1.5 diff --git a/test/harmonicenergytest.cc b/test/harmonicenergytest.cc new file mode 100644 index 00000000..402b86e6 --- /dev/null +++ b/test/harmonicenergytest.cc @@ -0,0 +1,88 @@ + +#include <dune/grid/uggrid.hh> + +#include <dune/src/unitvector.hh> +#include <dune/src/harmonicenergystiffness.hh> + +const int dim = 2; + +typedef UnitVector<3> TargetSpace; + +using namespace Dune; + +template <class GridType> +void testEnergy(const GridType* grid, const std::vector<TargetSpace>& coefficients) { + + HarmonicEnergyLocalStiffness<typename GridType::LeafGridView,TargetSpace> assembler; + std::vector<TargetSpace> rotatedCoefficients(coefficients.size()); + + for (int i=0; i<10; i++) { + + Rotation<3,double> rotation(FieldVector<double,3>(1), double(i)); + + FieldMatrix<double,3,3> matrix; + rotation.matrix(matrix); + for (size_t j=0; j<coefficients.size(); j++) { + FieldVector<double,3> tmp; + matrix.mv(coefficients[j].globalCoordinates(), tmp); + rotatedCoefficients[j] = tmp; + } + + std::cout << "energy: " << assembler.energy(*grid->template leafbegin<0>(), + rotatedCoefficients) << std::endl; + + std::vector<Dune::FieldVector<double,3> > rotatedGradient; + assembler.assembleGradient(*grid->template leafbegin<0>(), + rotatedCoefficients, + rotatedGradient); + + for (size_t j=0; j<coefficients.size(); j++) { + FieldVector<double,3> tmp; + matrix.mtv(rotatedGradient[j], tmp); + std::cout << "gradient: " << tmp << std::endl; + } + + } + +}; + +int main(int argc, char** argv) +{ + // //////////////////////////////////////////////////////// + // Make a test grid consisting of a single simplex + // //////////////////////////////////////////////////////// + + typedef UGGrid<dim> GridType; + + GridFactory<GridType> factory; + + FieldVector<double,dim> pos(0); + factory.insertVertex(pos); + pos[0] = 1; pos[1] = 0; + factory.insertVertex(pos); + pos[0] = 0; pos[1] = 1; + factory.insertVertex(pos); + + std::vector<unsigned int> v(dim+1); + v[0] = 0; v[1] = 1; v[2] = 2; + factory.insertElement(GeometryType(GeometryType::simplex,dim), v); + + const GridType* grid = factory.createGrid(); + + + // ////////////////////////////////////////////////////////// + // Test whether the energy is invariant under isometries + // ////////////////////////////////////////////////////////// + + FieldVector<double,3> uv; + std::vector<TargetSpace> coefficients(dim+1); + + uv[0] = 1; uv[1] = 0; uv[2] = 0; + coefficients[0] = uv; + uv[0] = 0; uv[1] = 1; uv[2] = 0; + coefficients[1] = uv; + uv[0] = 0; uv[1] = 0; uv[2] = 1; + coefficients[2] = uv; + + testEnergy<GridType>(grid, coefficients); +} -- GitLab