renumberer.hh

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

Generated on 9 Apr 2008 with Doxygen (ver 1.5.2) [logfile].