Skip to content
Snippets Groups Projects
harmonicenergytest.cc 3.03 KiB
Newer Older
  • Learn to ignore specific revisions
  • Oliver Sander's avatar
    Oliver Sander committed
    
    #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);
    
    
        // //////////////////////////////////////////////////////////
        //   Test the approximation to the Hesse matrix
        // //////////////////////////////////////////////////////////
        
        HarmonicEnergyLocalStiffness<GridType::LeafGridView,TargetSpace> assembler;
    
        assembler.assemble(*grid->leafbegin<0>(), coefficients);
    
        std::cout << "Hessian: \n" << assembler.A[0][0] << std::endl;