mcmgmapper.hh

Go to the documentation of this file.
00001 // $Id: mcmgmapper.hh 3903 2007-11-14 11:06:34Z sander $
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.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.type()).type(i,cc);
00090           //      std::cout << "map: cc=" << cc << " gt=" << gt << " offset=" << offset.find(gt)->second << std::endl;
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> // this is now the subentity's codim
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           // get layout object;
00140           Layout<G::dimension> layout;
00141 
00142           n=0; // zero data elements
00143           for (int c=0; c<=G::dimension; c++)
00144                 offset.clear(); // clear all maps
00145         
00146           // Compute offsets for the different geometry types.
00147           // Note that mapper becomes invalid when the grid is modified.
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                           //                      std::cout << "offset " << c << " " << is.geomTypes(c)[i] << " is " << n << std::endl;
00153               offset[is.geomTypes(c)[i]] = n;
00154               n += is.size(is.geomTypes(c)[i]);
00155                         }
00156         }
00157  
00158   private:
00159         int n; // number of data elements required
00160         const G& g;
00161         const IS& is;
00162         std::map<GeometryType,int> offset; // provide a map with all geometry types
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

Generated on 6 Nov 2008 with Doxygen (ver 1.5.6) [logfile].