dune-istl  2.1.1
renumberer.hh
Go to the documentation of this file.
00001 #ifndef DUNE_AMG_RENUMBERER_HH
00002 #define DUNE_AMG_RENUMBERER_HH
00003 
00004 #include "aggregates.hh"
00005 
00006 namespace Dune
00007 {
00008   namespace Amg
00009   {
00010     template<class G>
00011     class AggregateRenumberer
00012     {
00013     public:
00015       typedef typename G::VertexDescriptor Vertex;
00016       
00021       AggregateRenumberer(AggregatesMap<Vertex>& aggregates);
00022       
00024       operator Vertex() const;
00025       
00026       void operator()(const typename G::ConstEdgeIterator& edge);
00027 
00028       void operator++();
00029       
00030     protected:
00031       Vertex number_;
00032       AggregatesMap<Vertex>& aggregates_;
00033     };
00034     
00035     template<class G>
00036     AggregateRenumberer<G>::AggregateRenumberer(AggregatesMap<Vertex>& aggregates)
00037       :  number_(0), aggregates_(aggregates)
00038       {}
00039     
00040      template<class G>
00041      AggregateRenumberer<G>::operator Vertex() const
00042      {
00043        return number_;
00044      }
00045 
00046     template<class G>
00047     void AggregateRenumberer<G>::operator()(const typename G::ConstEdgeIterator& edge)
00048     {
00049       aggregates_[edge.target()]=number_;
00050     }
00051 
00052     template<class G>
00053     void AggregateRenumberer<G>::operator++()
00054     {
00055       ++number_;
00056     }
00057 
00058     template<class G, class I, class V>
00059     void renumberAggregates(const G& graph, I index, I endIndex, V& visitedMap, 
00060                             AggregatesMap<typename G::VertexDescriptor>& aggregates)
00061     {
00062       AggregateRenumberer<G> renumberer(aggregates);
00063       
00064       for(I index1=index; index1 != endIndex; ++index1)
00065         if(aggregates[index1.index()]!=AggregatesMap<typename G::VertexDescriptor>::ISOLATED && 
00066            !get(visitedMap, index1.index())){
00067 
00068           aggregates.template breadthFirstSearch<false>(index1.index(), aggregates[index1.index()], 
00069                                                         graph, renumberer, visitedMap);
00070           aggregates[index1.index()] = renumberer;
00071           ++renumberer;
00072         }
00073       for(; index != endIndex; ++index)
00074         put(visitedMap, index.index(), false);
00075     }
00076     
00077   } // namespace AMG
00078 } // namespace Dune
00079 #endif