diff --git a/test/Makefile.am b/test/Makefile.am index bfbe41e2b0e46e59140480b8e1ff1d6147939bce..9cd1709286580cdc76f30b717a33f2bd6b42c8fc 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 0000000000000000000000000000000000000000..402b86e6a55a71ed09a28e5c0edcab7d6c10505b --- /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); +}