orthonormalbasis.hh
Go to the documentation of this file.00001 #ifndef DUNE_ORTHONORMALBASIS_HH
00002 #define DUNE_ORTHONORMALBASIS_HH
00003
00004 #include <sstream>
00005
00006 #include <dune/grid/common/topologyfactory.hh>
00007
00008 #include <dune/localfunctions/utility/polynomialbasis.hh>
00009 #include <dune/localfunctions/orthonormal/orthonormalcompute.hh>
00010
00011 namespace Dune
00012 {
00013
00014
00015
00016 template< int dim, class SF, class CF = typename ComputeField< SF, 512 >::Type >
00017 struct OrthonormalBasisFactory;
00018 template< int dim, class SF, class CF >
00019 struct OrthonormalBasisFactoryTraits
00020 {
00021 typedef Dune::MonomialBasisProvider< dim, SF > MonomialBasisProviderType;
00022 typedef typename MonomialBasisProviderType::Object MonomialBasisType;
00023 typedef SparseCoeffMatrix< SF, 1 > CoefficientMatrix;
00024 typedef StandardEvaluator< MonomialBasisType > Evaluator;
00025 typedef PolynomialBasis< Evaluator, CoefficientMatrix > Basis;
00026
00027 static const unsigned int dimension = dim;
00028 typedef unsigned int Key;
00029 typedef const Basis Object;
00030 typedef OrthonormalBasisFactory<dim,SF,CF> Factory;
00031 };
00032
00033 template< int dim, class SF, class CF >
00034 struct OrthonormalBasisFactory :
00035 public TopologyFactory< OrthonormalBasisFactoryTraits<dim,SF,CF> >
00036 {
00037 static const unsigned int dimension = dim;
00038 typedef SF StorageField;
00039 typedef CF ComputeField;
00040 typedef OrthonormalBasisFactoryTraits<dim,SF,CF> Traits;
00041
00042 typedef typename Traits::Key Key;
00043 typedef typename Traits::Object Object;
00044
00045 template <unsigned int dd, class FF>
00046 struct EvaluationBasisFactory
00047 {
00048 typedef MonomialBasisProvider<dd,FF> Type;
00049 };
00050
00051 typedef typename EvaluationBasisFactory< dimension, StorageField >::Type MonomialBasisProviderType;
00052 typedef typename MonomialBasisProviderType::Object MonomialBasisType;
00053
00054 typedef SparseCoeffMatrix< StorageField, 1 > CoefficientMatrix;
00055 typedef StandardEvaluator< MonomialBasisType > Evaluator;
00056 typedef PolynomialBasis< Evaluator, CoefficientMatrix > Basis;
00057
00058 typedef typename GenericGeometry::SimplexTopology< dim >::type SimplexTopology;
00059
00060 template< class Topology >
00061 static Object *createObject ( const unsigned int order )
00062 {
00063 const typename Traits::MonomialBasisType &monomialBasis = *Traits::MonomialBasisProviderType::template create< SimplexTopology >( order );
00064
00065 static typename Traits::CoefficientMatrix _coeffs;
00066 if( _coeffs.size() <= monomialBasis.size() )
00067 {
00068 ONBCompute::ONBMatrix< Topology, ComputeField > matrix( order );
00069 _coeffs.fill( matrix );
00070 }
00071
00072 return new Basis( monomialBasis, _coeffs, monomialBasis.size() );
00073 }
00074 };
00075
00076 }
00077
00078 #endif // #ifndef DUNE_ORTHONORMALBASIS_HH
00079