dune-istl
2.1.1
|
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