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 }
00076 }
00077 #endif