dune-localfunctions
2.2.0
|
00001 #ifndef DUNE_ORTHONORMALBASIS_HH 00002 #define DUNE_ORTHONORMALBASIS_HH 00003 00004 #include <sstream> 00005 00006 #include <dune/geometry/topologyfactory.hh> 00007 00008 #include <dune/localfunctions/utility/polynomialbasis.hh> 00009 #include <dune/localfunctions/orthonormal/orthonormalcompute.hh> 00010 00011 namespace Dune 00012 { 00013 00014 // OrthonormalBasisFactory 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