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 }
00078 }
00079 #endif