dune-localfunctions
2.1.1
|
00001 #ifndef DUNE_DGLOCALCOEFFICIENTS_HH 00002 #define DUNE_DGLOCALCOEFFICIENTS_HH 00003 00004 #include <cassert> 00005 #include <vector> 00006 00007 #include <dune/grid/common/topologyfactory.hh> 00008 #include <dune/localfunctions/common/localkey.hh> 00009 00010 namespace Dune 00011 { 00012 00013 // DGLocalCoefficients 00014 // ------------------- 00015 00019 class DGLocalCoefficients 00020 { 00021 typedef DGLocalCoefficients This; 00022 00023 public: 00025 DGLocalCoefficients ( const unsigned int n ) 00026 : localKey_( n ) 00027 { 00028 for( unsigned i = 0; i < n; ++i ) 00029 localKey_[ i ] = LocalKey( 0, 0, i ); 00030 } 00031 00032 const LocalKey &localKey ( const unsigned int i ) const 00033 { 00034 assert( i < size() ); 00035 return localKey_[ i ]; 00036 } 00037 00038 unsigned int size () const 00039 { 00040 return localKey_.size(); 00041 } 00042 00043 private: 00044 std::vector< LocalKey > localKey_; 00045 }; 00046 00047 00048 00049 // DGLocalCoefficientsFactory 00050 // -------------------------- 00054 template< class BasisCreator > 00055 struct DGLocalCoefficientsFactory; 00056 template< class BasisFactory > 00057 struct DGLocalCoefficientsFactoryTraits 00058 { 00059 static const unsigned int dimension = BasisFactory::dimension; 00060 typedef typename BasisFactory::Key Key; 00061 typedef DGLocalCoefficients LocalCoefficients; 00062 typedef const DGLocalCoefficients Object; 00063 typedef DGLocalCoefficientsFactory<BasisFactory> Factory; 00064 }; 00065 00066 template< class BasisFactory > 00067 struct DGLocalCoefficientsFactory : 00068 public TopologyFactory< DGLocalCoefficientsFactoryTraits<BasisFactory> > 00069 { 00070 typedef DGLocalCoefficientsFactoryTraits<BasisFactory> Traits; 00071 00072 static const unsigned int dimension = Traits::dimension; 00073 typedef typename Traits::Key Key; 00074 typedef typename Traits::Object Object; 00075 00076 template< class Topology > 00077 static Object *createObject ( const Key &key ) 00078 { 00079 const typename BasisFactory::Object *basis 00080 = BasisFactory::template create< Topology >( key ); 00081 Object *coefficients = new Object( basis->size() ); 00082 BasisFactory::release( basis ); 00083 return coefficients; 00084 } 00085 }; 00086 00087 } 00088 00089 #endif // #ifndef DUNE_DGLOCALCOEFFICIENTS_HH