00001
00002
00003 #ifndef DUNE_MCMGMAPPER_HH
00004 #define DUNE_MCMGMAPPER_HH
00005
00006 #include <iostream>
00007 #include <map>
00008 #include "mapper.hh"
00009 #include "referenceelements.hh"
00010
00017 namespace Dune
00018 {
00052 template <typename G, typename IS, template<int> class Layout>
00053 class MultipleCodimMultipleGeomTypeMapper : Mapper<G,MultipleCodimMultipleGeomTypeMapper<G,IS,Layout> > {
00054 public:
00055
00062 MultipleCodimMultipleGeomTypeMapper (const G& grid, const IS& indexset)
00063 : g(grid), is(indexset)
00064 {
00065 update();
00066 }
00067
00073 template<class EntityType>
00074 int map (const EntityType& e) const
00075 {
00076 return is.index(e) + offset.find(e.geometry().type())->second;
00077 }
00078
00079
00086 template<int cc>
00087 int map (const typename G::Traits::template Codim<0>::Entity& e, int i) const
00088 {
00089 GeometryType gt=ReferenceElements<double,G::dimension>::general(e.geometry().type()).type(i,cc);
00090
00091 return is.template subIndex<cc>(e,i) + offset.find(gt)->second;
00092 }
00093
00102 int size () const
00103 {
00104 return n;
00105 }
00106
00113 template<class EntityType>
00114 bool contains (const EntityType& e, int& result) const
00115 {
00116 result = map(e);
00117 return true;
00118 }
00119
00127 template<int cc>
00128 bool contains (const typename G::Traits::template Codim<0>::Entity& e, int i, int& result) const
00129 {
00130 result = this->template map<cc>(e,i);
00131 return true;
00132 }
00133
00134
00137 void update ()
00138 {
00139
00140 Layout<G::dimension> layout;
00141
00142 n=0;
00143 for (int c=0; c<=G::dimension; c++)
00144 offset.clear();
00145
00146
00147
00148 for (int c=0; c<=G::dimension; c++)
00149 for (size_t i=0; i<is.geomTypes(c).size(); i++)
00150 if (layout.contains(is.geomTypes(c)[i]))
00151 {
00152
00153 offset[is.geomTypes(c)[i]] = n;
00154 n += is.size(is.geomTypes(c)[i]);
00155 }
00156 }
00157
00158 private:
00159 int n;
00160 const G& g;
00161 const IS& is;
00162 std::map<GeometryType,int> offset;
00163 };
00164
00165
00166
00167
00189 template <typename G, template<int> class Layout>
00190 class LeafMultipleCodimMultipleGeomTypeMapper
00191 : public MultipleCodimMultipleGeomTypeMapper<G,typename G::Traits::LeafIndexSet,Layout>
00192 {
00193 public:
00197 LeafMultipleCodimMultipleGeomTypeMapper (const G& grid)
00198 : MultipleCodimMultipleGeomTypeMapper<G,typename G::Traits::LeafIndexSet,Layout>(grid,grid.leafIndexSet())
00199 {}
00200 };
00201
00224 template <typename G, template<int> class Layout>
00225 class LevelMultipleCodimMultipleGeomTypeMapper
00226 : public MultipleCodimMultipleGeomTypeMapper<G,typename G::Traits::LevelIndexSet,Layout> {
00227 public:
00232 LevelMultipleCodimMultipleGeomTypeMapper (const G& grid, int level)
00233 : MultipleCodimMultipleGeomTypeMapper<G,typename G::Traits::LevelIndexSet,Layout>(grid,grid.levelIndexSet(level))
00234 {}
00235 };
00236
00238 }
00239 #endif