Skip to content
Snippets Groups Projects
localgfetestfunctiontest.cc 3.83 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include <config.h>
    
    #include <fenv.h>
    #include <iostream>
    
    #include <dune/common/fvector.hh>
    #include <dune/localfunctions/lagrange/pqkfactory.hh>
    
    #include <dune/gfe/rotation.hh>
    #include <dune/gfe/realtuple.hh>
    #include <dune/gfe/unitvector.hh>
    
    #include <dune/gfe/localgeodesicfefunction.hh>
    #include <dune/gfe/localgfetestfunction.hh>
    
    #include "multiindex.hh"
    #include "valuefactory.hh"
    
    const double eps = 1e-6;
    
    using namespace Dune;
    
    
    
    template <int domainDim>
    void testRealTuples()
    {
        std::cout << " --- Testing RealTuple<1>, domain dimension: " << domainDim << " ---" << std::endl;
    
        typedef RealTuple<1> TargetSpace;
    
        std::vector<TargetSpace> corners = {TargetSpace(1),
                                            TargetSpace(2),
                                            TargetSpace(3)};
    
    }
    
    template <int domainDim>
    void testUnitVector2d()
    {
        std::cout << " --- Testing UnitVector<2>, domain dimension: " << domainDim << " ---" << std::endl;
    
        typedef UnitVector<2> TargetSpace;
    
        std::vector<TargetSpace> testPoints;
        ValueFactory<TargetSpace>::get(testPoints);
        
        int nTestPoints = testPoints.size();
        
        // Set up elements of S^1
        std::vector<TargetSpace> corners(domainDim+1);
        
        MultiIndex<domainDim+1> index(nTestPoints);
        int numIndices = index.cycle();
        
        for (int i=0; i<numIndices; i++, ++index) {
            
            for (int j=0; j<domainDim+1; j++)
                corners[j] = testPoints[index[j]];
    
            bool spreadOut = false;
            for (int j=0; j<domainDim+1; j++)
                for (int k=0; k<domainDim+1; k++)
                    if (UnitVector<2>::distance(corners[j],corners[k]) > M_PI*0.98)
                        spreadOut = true;
                        
            if (spreadOut)
                continue;
            
        }
    
    }
    
    template <int domainDim>
    void testUnitVector3d()
    {
        std::cout << " --- Testing UnitVector<3>, domain dimension: " << domainDim << " ---" << std::endl;
    
        typedef UnitVector<3> TargetSpace;
    
        std::vector<TargetSpace> testPoints;
        ValueFactory<TargetSpace>::get(testPoints);
        
        int nTestPoints = testPoints.size();
        
        // Set up elements of S^2
        std::vector<TargetSpace> corners(domainDim+1);
    
        MultiIndex<domainDim+1> index(nTestPoints);
        int numIndices = index.cycle();
    
        for (int i=0; i<numIndices; i++, ++index) {
            
            for (int j=0; j<domainDim+1; j++)
                corners[j] = testPoints[index[j]];
    
                      
        }
    
    }
    
    template <int domainDim>
    void testRotation()
    {
        std::cout << " --- Testing Rotation<3>, domain dimension: " << domainDim << " ---" << std::endl;
    
        typedef Rotation<3,double> TargetSpace;
    
        std::vector<Rotation<3,double> > testPoints;
        ValueFactory<Rotation<3,double> >::get(testPoints);
        
        int nTestPoints = testPoints.size();
    
        // Set up elements of SO(3)
        std::vector<TargetSpace> coefficients(domainDim+1);
    
        MultiIndex<domainDim+1> index(nTestPoints);
        int numIndices = index.cycle();
        
        PQkLocalFiniteElementCache<double,double,domainDim,1> feCache;
        typedef typename PQkLocalFiniteElementCache<double,double,domainDim,1>::FiniteElementType LocalFiniteElement;
        GeometryType simplex;
        simplex.makeSimplex(domainDim);
    
        for (int i=0; i<numIndices; i++, ++index) {
            
            for (int j=0; j<domainDim+1; j++)
                coefficients[j] = testPoints[index[j]];
    
            LocalGFETestFunction<3,double,LocalFiniteElement,TargetSpace>(feCache.get(simplex),coefficients);
            
        }
    
    }
    
    
    int main()
    {
        // choke on NaN -- don't enable this by default, as there are
        // a few harmless NaN in the loopsolver
        //feenableexcept(FE_INVALID);
    
        std::cout << std::setw(15) << std::setprecision(12);
        
        testRealTuples<1>();
        testUnitVector2d<1>();
        testUnitVector3d<1>();
        testUnitVector2d<2>();
        testUnitVector3d<2>();
        
        testRotation<1>();
        testRotation<2>();
    }