4 #ifndef DUNE_AMGHIERARCHY_HH
5 #define DUNE_AMGHIERARCHY_HH
16 #include <dune/common/stdstreams.hh>
17 #include <dune/common/unused.hh>
18 #include <dune/common/timer.hh>
19 #include <dune/common/tuples.hh>
20 #include <dune/common/bigunsignedint.hh>
22 #include <dune/common/parallel/indexset.hh>
66 template<
typename T,
typename A=std::allocator<T> >
75 template<
typename T1,
typename T2>
111 typedef typename A::template rebind<Element>::other
Allocator;
158 template<
class C,
class T1>
160 :
public BidirectionalIteratorFacade<LevelIterator<C,T1>,T1,T1&>
164 friend class
LevelIterator<const typename remove_const<C>::type,
165 const typename remove_const<T1>::type >;
180 : element_(other.element_)
186 : element_(other.element_)
195 return element_ == other.element_;
204 return element_ == other.element_;
210 return *(element_->element_);
216 element_ = element_->coarser_;
222 element_ = element_->finer_;
231 return element_->redistributed_;
240 assert(element_->redistributed_);
241 return *element_->redistributed_;
245 element_->redistributed_ = t;
250 element_->redistributed_ =
nullptr;
292 std::size_t
levels()
const;
303 Element* nonAllocated_;
316 template<
class M,
class PI,
class A=std::allocator<M> >
324 typedef typename MatrixOperator::matrix_type
Matrix;
342 typedef typename Allocator::template rebind<AggregatesMap*>::other
AAllocator;
351 typedef typename Allocator::template rebind<RedistributeInfoType>::other
RILAllocator;
372 template<
typename O,
typename T>
373 void build(
const T& criterion);
389 template<
class V,
class TA>
397 template<
class S,
class TA>
405 std::size_t
levels()
const;
482 typename MatrixOperator::field_type prolongDamp_;
487 template<
class Matrix,
bool pr
int>
494 static void stats(
const Matrix& matrix)
496 DUNE_UNUSED_PARAMETER(matrix);
500 template<
class Matrix>
501 struct MatrixStats<
Matrix,true>
510 min=std::numeric_limits<size_type>::max();
517 min=std::min(min, row.size());
518 max=std::max(max, row.size());
529 static void stats(
const Matrix& matrix)
531 calc c= for_each(matrix.begin(), matrix.end(), calc());
532 dinfo<<
"Matrix row: min="<<c.min<<
" max="<<c.max
533 <<
" average="<<
static_cast<double>(c.sum)/matrix.N()
573 template<
typename M,
typename C1>
578 int nparts, C1& criterion)
580 DUNE_UNUSED_PARAMETER(origMatrix);
581 DUNE_UNUSED_PARAMETER(newMatrix);
582 DUNE_UNUSED_PARAMETER(origSequentialInformationomm);
583 DUNE_UNUSED_PARAMETER(newComm);
584 DUNE_UNUSED_PARAMETER(ri);
585 DUNE_UNUSED_PARAMETER(nparts);
586 DUNE_UNUSED_PARAMETER(criterion);
587 DUNE_THROW(NotImplemented,
"Redistribution does not make sense in sequential code!");
591 template<
typename M,
typename C,
typename C1>
594 int nparts, C1& criterion)
597 #ifdef AMG_REPART_ON_COMM_GRAPH
601 criterion.debugLevel()>1);
610 MatrixGraph graph(origMatrix);
611 PropertiesGraph pgraph(graph);
615 if(origComm.communicator().rank()==0)
616 std::cout<<
"Original matrix"<<std::endl;
617 origComm.communicator().barrier();
621 newComm, ri.getInterface(),
622 criterion.debugLevel()>1);
623 #endif // if else AMG_REPART
625 if(origComm.communicator().rank()==0 && criterion.debugLevel()>1)
626 std::cout<<
"Repartitioning took "<<time.elapsed()<<
" seconds."<<std::endl;
631 ri.checkInterface(origComm.indexSet(), newComm->indexSet(), origComm.communicator());
637 if(origComm.communicator().rank()==0)
638 std::cout<<
"Original matrix"<<std::endl;
639 origComm.communicator().barrier();
640 if(newComm->communicator().size()>0)
642 origComm.communicator().barrier();
645 if(origComm.communicator().rank()==0 && criterion.debugLevel()>1)
646 std::cout<<
"Redistributing matrix took "<<time.elapsed()<<
" seconds."<<std::endl;
647 return existentOnRedist;
660 template<
class M,
class IS,
class A>
666 dune_static_assert((static_cast<int>(MatrixOperator::category) ==
668 static_cast<int>(MatrixOperator::category) ==
670 static_cast<int>(MatrixOperator::category) ==
672 "MatrixOperator must be of category sequential or overlapping or nonoverlapping");
673 if (static_cast<int>(MatrixOperator::category) != static_cast<int>(pinfo.getSolverCategory()))
674 DUNE_THROW(
ISTLError,
"MatrixOperator and ParallelInformation must belong to the same category!");
678 template<
class M,
class IS,
class A>
679 template<
typename O,
typename T>
682 prolongDamp_ = criterion.getProlongationDampingFactor();
683 typedef O OverlapFlags;
689 typedef bigunsignedint<sizeof(int)*8*noints> BIGINT;
691 MatIterator mlevel = matrices_.finest();
692 MatrixStats<typename M::matrix_type,MINIMAL_DEBUG_LEVEL<=INFO_DEBUG_LEVEL>::stats(mlevel->getmat());
694 PInfoIterator infoLevel = parallelInformation_.finest();
696 finenonzeros = infoLevel->communicator().sum(finenonzeros);
697 BIGINT allnonzeros = finenonzeros;
703 BIGINT unknowns = mlevel->getmat().N();
705 unknowns = infoLevel->communicator().sum(unknowns);
706 double dunknowns=unknowns.todouble();
707 infoLevel->buildGlobalLookup(mlevel->getmat().N());
710 for(; level < criterion.maxLevel(); ++level, ++mlevel) {
711 assert(matrices_.levels()==redistributes_.size());
712 rank = infoLevel->communicator().rank();
713 if(rank==0 && criterion.debugLevel()>1)
714 std::cout<<
"Level "<<level<<
" has "<<dunknowns<<
" unknowns, "<<dunknowns/infoLevel->communicator().size()
715 <<
" unknowns per proc (procs="<<infoLevel->communicator().size()<<
")"<<std::endl;
727 && dunknowns < 30*infoLevel->communicator().size()))
728 && infoLevel->communicator().size()>1 &&
729 dunknowns/infoLevel->communicator().size() <= criterion.coarsenTarget())
734 std::size_t nodomains = (std::size_t)std::ceil(dunknowns/(criterion.minAggregateSize()
735 *criterion.coarsenTarget()));
736 if( nodomains<=criterion.minAggregateSize()/2 ||
737 dunknowns <= criterion.coarsenTarget() )
740 bool existentOnNextLevel =
742 redistComm, redistributes_.back(), nodomains,
744 BIGINT unknowns = redistMat->N();
745 unknowns = infoLevel->communicator().sum(unknowns);
746 dunknowns= unknowns.todouble();
747 if(redistComm->communicator().rank()==0 && criterion.debugLevel()>1)
748 std::cout<<
"Level "<<level<<
" (redistributed) has "<<dunknowns<<
" unknowns, "<<dunknowns/redistComm->communicator().size()
749 <<
" unknowns per proc (procs="<<redistComm->communicator().size()<<
")"<<std::endl;
750 MatrixArgs args(*redistMat, *redistComm);
752 assert(mlevel.isRedistributed());
753 infoLevel.addRedistributed(redistComm);
754 infoLevel->freeGlobalLookup();
756 if(!existentOnNextLevel)
761 matrix = &(mlevel.getRedistributed());
762 info = &(infoLevel.getRedistributed());
763 info->buildGlobalLookup(matrix->getmat().N());
766 rank = info->communicator().rank();
767 if(dunknowns <= criterion.coarsenTarget())
773 typedef typename GraphCreator::GraphTuple GraphTuple;
777 std::vector<bool> excluded(matrix->getmat().N(),
false);
779 GraphTuple graphs = GraphCreator::create(*matrix, excluded, *info, OverlapFlags());
783 aggregatesMaps_.push_back(aggregatesMap);
787 int noAggregates, isoAggregates, oneAggregates, skippedAggregates;
789 tie(noAggregates, isoAggregates, oneAggregates, skippedAggregates) =
790 aggregatesMap->
buildAggregates(matrix->getmat(), *(get<1>(graphs)), criterion, level==0);
792 if(rank==0 && criterion.debugLevel()>2)
793 std::cout<<
" Have built "<<noAggregates<<
" aggregates totally ("<<isoAggregates<<
" isolated aggregates, "<<
794 oneAggregates<<
" aggregates of one vertex, and skipped "<<
795 skippedAggregates<<
" aggregates)."<<std::endl;
799 int start, end, overlapStart, overlapEnd;
800 int procs=info->communicator().rank();
801 int n = UNKNOWNS/procs;
802 int bigger = UNKNOWNS%procs;
807 end = (rank+1)*(n+1);
809 start = bigger + rank * n;
810 end = bigger + (rank + 1) * n;
815 overlapStart = start - 1;
817 overlapStart = start;
820 overlapEnd = end + 1;
824 assert((UNKNOWNS)*(overlapEnd-overlapStart)==aggregatesMap->
noVertices());
825 for(
int j=0; j< UNKNOWNS; ++j)
826 for(
int i=0; i < UNKNOWNS; ++i)
828 if(i>=overlapStart && i<overlapEnd)
830 int no = (j/2)*((UNKNOWNS)/2)+i/2;
831 (*aggregatesMap)[j*(overlapEnd-overlapStart)+i-overlapStart]=no;
836 if(criterion.debugLevel()>1 && info->communicator().rank()==0)
837 std::cout<<
"aggregating finished."<<std::endl;
839 BIGINT gnoAggregates=noAggregates;
840 gnoAggregates = info->communicator().sum(gnoAggregates);
841 double dgnoAggregates = gnoAggregates.todouble();
843 BIGINT gnoAggregates=((UNKNOWNS)/2)*((UNKNOWNS)/2);
846 if(criterion.debugLevel()>2 && rank==0)
847 std::cout <<
"Building "<<dgnoAggregates<<
" aggregates took "<<watch.elapsed()<<
" seconds."<<std::endl;
849 if(dgnoAggregates==0 || dunknowns/dgnoAggregates<criterion.minCoarsenRate())
854 std::cerr <<
"Stopped coarsening because of rate breakdown "<<dunknowns<<
"/"<<dgnoAggregates
855 <<
"="<<dunknowns/dgnoAggregates<<
"<"
856 <<criterion.minCoarsenRate()<<std::endl;
858 std::cerr<<
"Could not build any aggregates. Probably no connected nodes."<<std::endl;
860 aggregatesMap->
free();
861 delete aggregatesMap;
862 aggregatesMaps_.pop_back();
864 if(criterion.accumulate() && mlevel.isRedistributed() && info->communicator().size()>1) {
868 delete &(mlevel.getRedistributed().getmat());
869 mlevel.deleteRedistributed();
870 delete &(infoLevel.getRedistributed());
871 infoLevel.deleteRedistributed();
872 redistributes_.back().resetSetup();
877 unknowns = noAggregates;
878 dunknowns = dgnoAggregates;
880 CommunicationArgs commargs(info->communicator(),info->getSolverCategory());
881 parallelInformation_.addCoarser(commargs);
885 typename PropertyMapTypeSelector<VertexVisitedTag,PropertiesGraph>::Type visitedMap =
896 GraphCreator::free(graphs);
898 if(criterion.debugLevel()>2) {
900 std::cout<<
"Coarsening of index sets took "<<watch.elapsed()<<
" seconds."<<std::endl;
905 infoLevel->buildGlobalLookup(aggregates);
908 infoLevel->globalLookup());
911 if(criterion.debugLevel()>2) {
913 std::cout<<
"Communicating global aggregate numbers took "<<watch.elapsed()<<
" seconds."<<std::endl;
917 std::vector<bool>& visited=excluded;
919 typedef std::vector<bool>::iterator Iterator;
920 typedef IteratorPropertyMap<Iterator, IdentityMap> VisitedMap2;
921 Iterator end = visited.end();
922 for(Iterator iter= visited.begin(); iter != end; ++iter)
925 VisitedMap2 visitedMap2(visited.begin(), Dune::IdentityMap());
927 typename MatrixOperator::matrix_type* coarseMatrix;
929 coarseMatrix = productBuilder.
build(*(get<0>(graphs)), visitedMap2,
934 dverb<<
"Building of sparsity pattern took "<<watch.elapsed()<<std::endl;
936 info->freeGlobalLookup();
938 delete get<0>(graphs);
939 productBuilder.
calculate(matrix->getmat(), *aggregatesMap, *coarseMatrix, *infoLevel, OverlapFlags());
941 if(criterion.debugLevel()>2) {
943 std::cout<<
"Calculation entries of Galerkin product took "<<watch.elapsed()<<
" seconds."<<std::endl;
947 allnonzeros = allnonzeros + infoLevel->communicator().sum(nonzeros);
948 MatrixArgs args(*coarseMatrix, *infoLevel);
950 matrices_.addCoarser(args);
955 infoLevel->freeGlobalLookup();
959 aggregatesMaps_.push_back(aggregatesMap);
961 if(criterion.debugLevel()>0) {
962 if(level==criterion.maxLevel()) {
963 BIGINT unknowns = mlevel->getmat().N();
964 unknowns = infoLevel->communicator().sum(unknowns);
965 double dunknowns = unknowns.todouble();
966 if(rank==0 && criterion.debugLevel()>1) {
967 std::cout<<
"Level "<<level<<
" has "<<dunknowns<<
" unknowns, "<<dunknowns/infoLevel->communicator().size()
968 <<
" unknowns per proc (procs="<<infoLevel->communicator().size()<<
")"<<std::endl;
973 if(criterion.accumulate() && !redistributes_.back().isSetup() &&
974 infoLevel->communicator().size()>1) {
975 #if HAVE_MPI && !HAVE_PARMETIS
977 infoLevel->communicator().rank()==0)
978 std::cerr<<
"Successive accumulation of data on coarse levels only works with ParMETIS installed."
979 <<
" Fell back to accumulation to one domain on coarsest level"<<std::endl;
988 redistComm, redistributes_.back(), nodomains,criterion);
989 MatrixArgs args(*redistMat, *redistComm);
990 BIGINT unknowns = redistMat->N();
991 unknowns = infoLevel->communicator().sum(unknowns);
993 if(redistComm->communicator().rank()==0 && criterion.debugLevel()>1) {
994 double dunknowns= unknowns.todouble();
995 std::cout<<
"Level "<<level<<
" redistributed has "<<dunknowns<<
" unknowns, "<<dunknowns/redistComm->communicator().size()
996 <<
" unknowns per proc (procs="<<redistComm->communicator().size()<<
")"<<std::endl;
999 infoLevel.addRedistributed(redistComm);
1000 infoLevel->freeGlobalLookup();
1003 int levels = matrices_.levels();
1004 maxlevels_ = parallelInformation_.finest()->communicator().max(levels);
1005 assert(matrices_.levels()==redistributes_.size());
1006 if(hasCoarsest() && rank==0 && criterion.debugLevel()>1)
1007 std::cout<<
"operator complexity: "<<allnonzeros.todouble()/finenonzeros.todouble()<<std::endl;
1011 template<
class M,
class IS,
class A>
1018 template<
class M,
class IS,
class A>
1022 return parallelInformation_;
1025 template<
class M,
class IS,
class A>
1028 int levels=aggregatesMaps().size();
1029 int maxlevels=parallelInformation_.finest()->communicator().max(levels);
1030 std::size_t size=(*(aggregatesMaps().begin()))->noVertices();
1032 std::vector<std::size_t> tmp;
1033 std::vector<std::size_t> *coarse, *fine;
1050 if(levels==maxlevels) {
1051 const AggregatesMap& map = *(*(++aggregatesMaps().rbegin()));
1056 m=std::max(*iter,m);
1058 coarse->resize(m+1);
1060 srand((
unsigned)std::clock());
1061 std::set<size_t> used;
1062 for(
typename std::vector<std::size_t>::iterator iter=coarse->begin(); iter != coarse->end();
1065 std::pair<std::set<std::size_t>::iterator,
bool> ibpair
1066 = used.insert(static_cast<std::size_t>((((
double)rand())/(RAND_MAX+1.0)))*coarse->size());
1068 while(!ibpair.second)
1069 ibpair = used.insert(static_cast<std::size_t>((((
double)rand())/(RAND_MAX+1.0))*coarse->size()));
1070 *iter=*(ibpair.first);
1078 for(
typename AggregatesMapList::const_reverse_iterator aggregates=++aggregatesMaps().rbegin();
1079 aggregates != aggregatesMaps().rend(); ++aggregates,--levels) {
1081 fine->resize((*aggregates)->noVertices());
1082 fine->assign(fine->size(), 0);
1084 ::prolongateVector(*(*aggregates), *coarse, *fine, static_cast<std::size_t>(1), *pinfo);
1086 std::swap(coarse, fine);
1090 assert(coarse==&data);
1093 template<
class M,
class IS,
class A>
1097 return aggregatesMaps_;
1099 template<
class M,
class IS,
class A>
1103 return redistributes_;
1106 template<
class M,
class IS,
class A>
1109 typedef typename AggregatesMapList::reverse_iterator AggregatesMapIterator;
1113 AggregatesMapIterator amap = aggregatesMaps_.rbegin();
1114 InfoIterator info = parallelInformation_.coarsest();
1115 for(Iterator level=matrices_.coarsest(), finest=matrices_.finest(); level != finest; --level, --info, ++amap) {
1118 delete &level->getmat();
1119 if(level.isRedistributed())
1120 delete &(level.getRedistributed().getmat());
1125 template<
class M,
class IS,
class A>
1126 template<
class V,
class TA>
1129 assert(hierarchy.levels()==1);
1131 typedef typename RedistributeInfoList::const_iterator RIter;
1132 RIter redist = redistributes_.begin();
1134 Iterator matrix = matrices_.finest(), coarsest = matrices_.coarsest();
1136 if(redist->isSetup())
1137 hierarchy.addRedistributedOnCoarsest(matrix.getRedistributed().getmat().N());
1138 Dune::dvverb<<
"Level "<<level<<
" has "<<matrices_.finest()->getmat().N()<<
" unknowns!"<<std::endl;
1140 while(matrix != coarsest) {
1141 ++matrix; ++level; ++redist;
1142 Dune::dvverb<<
"Level "<<level<<
" has "<<matrix->getmat().N()<<
" unknowns!"<<std::endl;
1144 hierarchy.addCoarser(matrix->getmat().N());
1145 if(redist->isSetup())
1146 hierarchy.addRedistributedOnCoarsest(matrix.getRedistributed().getmat().N());
1152 template<
class M,
class IS,
class A>
1153 template<
class S,
class TA>
1157 assert(smoothers.
levels()==0);
1160 typedef typename AggregatesMapList::const_iterator AggregatesIterator;
1163 cargs.setArgs(sargs);
1164 PinfoIterator pinfo = parallelInformation_.finest();
1165 AggregatesIterator aggregates = aggregatesMaps_.begin();
1167 for(MatrixIterator matrix = matrices_.finest(), coarsest = matrices_.coarsest();
1168 matrix != coarsest; ++matrix, ++pinfo, ++aggregates, ++level) {
1169 cargs.setMatrix(matrix->getmat(), **aggregates);
1170 cargs.setComm(*pinfo);
1173 if(maxlevels()>levels()) {
1175 cargs.setMatrix(matrices_.coarsest()->getmat(), **aggregates);
1176 cargs.setComm(*pinfo);
1182 template<
class M,
class IS,
class A>
1186 typedef typename AggregatesMapList::iterator AggregatesMapIterator;
1190 AggregatesMapIterator amap = aggregatesMaps_.begin();
1192 InfoIterator info = parallelInformation_.finest();
1193 typename RedistributeInfoList::iterator riIter = redistributes_.begin();
1194 Iterator level = matrices_.finest(), coarsest=matrices_.coarsest();
1195 if(level.isRedistributed()) {
1196 info->buildGlobalLookup(info->indexSet().size());
1198 const_cast<Matrix&>(level.getRedistributed().getmat()),
1199 *info,info.getRedistributed(), *riIter);
1200 info->freeGlobalLookup();
1203 for(; level!=coarsest; ++amap) {
1204 const Matrix& fine = (level.isRedistributed() ? level.getRedistributed() : *level).getmat();
1208 productBuilder.
calculate(fine, *(*amap), const_cast<Matrix&>(level->getmat()), *info, copyFlags);
1209 if(level.isRedistributed()) {
1210 info->buildGlobalLookup(info->indexSet().size());
1212 const_cast<Matrix&>(level.getRedistributed().getmat()), *info,
1213 info.getRedistributed(), *riIter);
1214 info->freeGlobalLookup();
1219 template<
class M,
class IS,
class A>
1222 return matrices_.levels();
1225 template<
class M,
class IS,
class A>
1231 template<
class M,
class IS,
class A>
1234 return levels()==maxlevels() &&
1235 (!matrices_.coarsest().isRedistributed() ||matrices_.coarsest()->getmat().N()>0);
1238 template<
class M,
class IS,
class A>
1244 template<
class T,
class A>
1246 : finest_(0), coarsest_(0), nonAllocated_(0), allocator_(), levels_(0)
1249 template<
class T,
class A>
1253 finest_ = allocator_.allocate(1,0);
1254 finest_->element_ = &first;
1255 finest_->redistributed_ =
nullptr;
1256 nonAllocated_ = finest_;
1257 coarsest_ = finest_;
1258 coarsest_->coarser_ = coarsest_->finer_ =
nullptr;
1262 template<
class T,
class A>
1266 finest_ = allocator_.allocate(1,0);
1267 finest_->element_ = first;
1268 finest_->redistributed_ =
nullptr;
1269 nonAllocated_ =
nullptr;
1270 coarsest_ = finest_;
1271 coarsest_->coarser_ = coarsest_->finer_ =
nullptr;
1274 template<
class T,
class A>
1278 Element* current = coarsest_;
1279 coarsest_ = coarsest_->finer_;
1280 if(current != nonAllocated_) {
1281 if(current->redistributed_)
1285 allocator_.deallocate(current, 1);
1291 template<
class T,
class A>
1293 : nonAllocated_(), allocator_(other.allocator_),
1294 levels_(other.levels_)
1298 finest_=coarsest_=nonAllocated_=
nullptr;
1301 finest_=allocator_.allocate(1,0);
1302 Element* finer_ =
nullptr;
1303 Element* current_ = finest_;
1304 Element* otherCurrent_ = other.finest_;
1306 while(otherCurrent_)
1308 T* t=
new T(*(otherCurrent_->element_));
1309 current_->element_=t;
1310 current_->finer_=finer_;
1311 if(otherCurrent_->redistributed_)
1312 current_->redistributed_ =
new T(*otherCurrent_->redistributed_);
1314 current_->redistributed_=
nullptr;
1316 if(otherCurrent_->coarser_)
1318 current_->coarser_=allocator_.allocate(1,0);
1319 current_=current_->coarser_;
1321 current_->coarser_=
nullptr;
1322 otherCurrent_=otherCurrent_->coarser_;
1327 template<
class T,
class A>
1333 template<
class T,
class A>
1339 template<
class T,
class A>
1344 coarsest_ = allocator_.allocate(1,0);
1346 finest_ = coarsest_;
1347 coarsest_->finer_ =
nullptr;
1349 coarsest_->coarser_ = allocator_.allocate(1,0);
1350 coarsest_->coarser_->finer_ = coarsest_;
1351 coarsest_ = coarsest_->coarser_;
1354 coarsest_->redistributed_ =
nullptr;
1355 coarsest_->coarser_=
nullptr;
1360 template<
class T,
class A>
1365 finest_ = allocator_.allocate(1,0);
1367 coarsest_ = finest_;
1368 coarsest_->coarser_ = coarsest_->finer_ =
nullptr;
1370 finest_->finer_ = allocator_.allocate(1,0);
1371 finest_->finer_->coarser_ = finest_;
1372 finest_ = finest_->finer_;
1373 finest_->finer =
nullptr;
1379 template<
class T,
class A>
1385 template<
class T,
class A>
1391 template<
class T,
class A>
1397 template<
class T,
class A>
Definition: graphcreator.hh:19
LevelIterator()
Constructor.
Definition: hierarchy.hh:169
size_type sum
Definition: hierarchy.hh:524
A::size_type size_type
Type for indices and sizes.
Definition: matrix.hh:41
const_iterator end() const
Definition: aggregates.hh:672
void deleteRedistributed()
Definition: hierarchy.hh:248
PI ParallelInformation
The type of the index set.
Definition: hierarchy.hh:327
std::size_t levels() const
Get the number of levels in the hierarchy.
Definition: hierarchy.hh:1328
A::template rebind< Element >::other Allocator
If true only the method addCoarser will be usable otherwise only the method addFiner will be usable...
Definition: hierarchy.hh:111
const AggregateDescriptor * const_iterator
Definition: aggregates.hh:665
int countNonZeros(const M &matrix)
Get the number of nonzero fields in the matrix.
Definition: matrixutils.hh:155
Category for ovelapping solvers.
Definition: solvercategory.hh:26
void buildDependency(G &graph, const typename C::Matrix &matrix, C criterion, bool finestLevel)
Build the dependency of the matrix graph.
Accumulate data to on process at once.
Definition: parameters.hh:242
Provides classes for initializing the link attributes of a matrix graph.
void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse, const I &pinfo, const O ©)
Calculate the galerkin product.
Definition: globalaggregates.hh:129
Provides a class for building the galerkin product based on a aggregation scheme. ...
Definition: indicescoarsener.hh:35
void printGlobalSparseMatrix(const M &mat, C &ooc, std::ostream &os)
Definition: matrixutils.hh:177
bool graphRepartition(const G &graph, Dune::OwnerOverlapCopyCommunication< T1, T2 > &oocomm, int nparts, Dune::OwnerOverlapCopyCommunication< T1, T2 > *&outcomm, RedistributeInterface &redistInf, bool verbose=false)
execute a graph repartition for a giving graph and indexset.
Definition: repartition.hh:1221
MatrixOperator::field_type getProlongationDampingFactor() const
Definition: hierarchy.hh:447
void build(const T &criterion)
Build the matrix hierarchy using aggregation.
Definition: hierarchy.hh:680
static const V ISOLATED
Identifier of isolated vertices.
Definition: aggregates.hh:509
A Allocator
The allocator to use.
Definition: hierarchy.hh:330
LevelIterator< const Hierarchy< T, A >, const T > ConstIterator
Type of the const iterator.
Definition: hierarchy.hh:261
LevelIterator(Element *element)
Definition: hierarchy.hh:173
static T * construct(Arguments &args)
Construct an object with the specified arguments.
Definition: construction.hh:53
CoarsenCriterion(const Dune::Amg::Parameters &parms)
Definition: hierarchy.hh:567
const ParallelInformationHierarchy & parallelInformation() const
Get the hierarchy of the parallel data distribution information.
Definition: hierarchy.hh:1020
void redistributeMatrix(M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
Redistribute a matrix according to given domain decompositions.
Definition: matrixredistribute.hh:838
void coarsenVector(Hierarchy< BlockVector< V, TA > > &hierarchy) const
Coarsen the vector hierarchy according to the matrix hierarchy.
Definition: hierarchy.hh:1127
This file implements a vector space as a tensor product of a given vector space. The number of compon...
bool equals(const LevelIterator< typename remove_const< C >::type, typename remove_const< T1 >::type > &other) const
Equality check.
Definition: hierarchy.hh:192
Iterator coarsest()
Get an iterator positioned at the coarsest level.
Definition: hierarchy.hh:1386
RedistributeInformation< ParallelInformation > RedistributeInfoType
The type of the redistribute information.
Definition: hierarchy.hh:348
Dune::Amg::Hierarchy< MatrixOperator, Allocator > ParallelMatrixHierarchy
The type of the parallel matrix hierarchy.
Definition: hierarchy.hh:336
Some handy generic functions for ISTL matrices.
T1 & getRedistributed() const
Get the redistributed container.
Definition: hierarchy.hh:238
static void deconstruct(T *t)
Destroys an object.
Definition: construction.hh:62
Attaches properties to the edges and vertices of a graph.
Definition: graph.hh:976
Definition: galerkin.hh:116
void addRedistributedOnCoarsest(Arguments &args)
Definition: hierarchy.hh:1334
A vector of blocks with memory management.
Definition: bvector.hh:253
void redistributeMatrixEntries(M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
Definition: matrixredistribute.hh:773
Graph::VertexDescriptor VertexDescriptor
The vertex descriptor.
Definition: graph.hh:987
MatrixOperator::matrix_type Matrix
The type of the matrix.
Definition: hierarchy.hh:324
Allocator::template rebind< AggregatesMap * >::other AAllocator
Allocator for pointers.
Definition: hierarchy.hh:342
std::list< AggregatesMap *, AAllocator > AggregatesMapList
The type of the aggregates maps list.
Definition: hierarchy.hh:345
void coarsenSmoother(Hierarchy< S, TA > &smoothers, const typename SmootherTraits< S >::Arguments &args) const
Coarsen the smoother hierarchy according to the matrix hierarchy.
Definition: hierarchy.hh:1154
G::MutableMatrix * build(G &fineGraph, V &visitedMap, const ParallelInformation &pinfo, AggregatesMap< typename G::VertexDescriptor > &aggregates, const typename G::Matrix::size_type &size, const Set ©)
Calculates the coarse matrix via a Galerkin product.
Definition: galerkin.hh:565
Definition: galerkin.hh:98
A generic dynamic dense matrix.
Definition: matrix.hh:24
CoarsenCriterion(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2, double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu)
Constructor.
Definition: hierarchy.hh:562
~Hierarchy()
Destructor.
Definition: hierarchy.hh:1275
size_type min
Definition: hierarchy.hh:522
Prolongation and restriction for amg.
void free()
Free the allocated memory.
Hard limit for the number of processes allowed.
Definition: hierarchy.hh:56
const void * Arguments
A type holding all the arguments needed to call the constructor.
Definition: construction.hh:45
MatrixHierarchy(const MatrixOperator &fineMatrix, const ParallelInformation &pinfo=ParallelInformation())
Constructor.
Definition: hierarchy.hh:661
Iterator finest()
Get an iterator positioned at the finest level.
Definition: hierarchy.hh:1380
Iterator over the levels in the hierarchy.
Definition: hierarchy.hh:76
Helper classes for the construction of classes without empty constructor.
T1 & dereference() const
Dereference the iterator.
Definition: hierarchy.hh:208
std::list< RedistributeInfoType, RILAllocator > RedistributeInfoList
The type of the list of redistribute information.
Definition: hierarchy.hh:354
void getCoarsestAggregatesOnFinest(std::vector< std::size_t > &data) const
Get the mapping of fine level unknowns to coarse level aggregates.
Definition: hierarchy.hh:1026
Functionality for redistributing a sparse matrix.
Class representing a node in the matrix graph.
Definition: dependency.hh:126
bool isBuilt() const
Whether the hierarchy was built.
Definition: hierarchy.hh:1239
bool hasCoarsest() const
Definition: hierarchy.hh:1232
std::size_t levels() const
Get the number of levels in the hierarchy.
Definition: hierarchy.hh:1220
T MemberType
The type of the container we store.
Definition: hierarchy.hh:73
Class providing information about the mapping of the vertices onto aggregates.
Definition: aggregates.hh:497
const AggregatesMapList & aggregatesMaps() const
Get the hierarchy of the mappings of the nodes onto aggregates.
Definition: hierarchy.hh:1095
Traits class for generically constructing non default constructable types.
Definition: novlpschwarz.hh:326
The criterion describing the stop criteria for the coarsening process.
Definition: hierarchy.hh:543
The hierarchies build by the coarsening process.
Definition: hierarchy.hh:317
Provides classes for the Coloring process of AMG.
Dune::Amg::AggregatesMap< typename MatrixGraph< Matrix >::VertexDescriptor > AggregatesMap
The type of the aggregates map we use.
Definition: hierarchy.hh:333
Matrix & A
Definition: matrixmatrix.hh:216
Category for sequential solvers.
Definition: solvercategory.hh:22
Provides classes for building the matrix graph.
Category for on overlapping solvers.
Definition: solvercategory.hh:24
Class representing the properties of an ede in the matrix graph.
Definition: dependency.hh:38
bool repartitionAndDistributeMatrix(const M &origMatrix, M &newMatrix, SequentialInformation &origSequentialInformationomm, SequentialInformation *&newComm, RedistributeInformation< SequentialInformation > &ri, int nparts, C1 &criterion)
Definition: hierarchy.hh:574
void addCoarser(Arguments &args)
Add an element on a coarser level.
Definition: hierarchy.hh:1340
void addFiner(Arguments &args)
Add an element on a finer level.
Definition: hierarchy.hh:1361
AccumulationMode
Identifiers for the different accumulation modes.
Definition: parameters.hh:230
T AggregationCriterion
The criterion for tagging connections as strong and nodes as isolated. This might be e...
Definition: hierarchy.hh:550
Traits class for getting the attribute class of a smoother.
Definition: smoother.hh:63
MM_TYPE type
Definition: matrixmarket.hh:267
const ParallelMatrixHierarchy & matrices() const
Get the matrix hierarchy.
Definition: hierarchy.hh:1013
M MatrixOperator
The type of the matrix operator.
Definition: hierarchy.hh:321
Definition: matrixredistribute.hh:18
A hierarchy of coantainers (e.g. matrices or vectors)
Definition: hierarchy.hh:67
Row row
Definition: matrixmatrix.hh:345
Provides a class for building the index set and remote indices on the coarse level.
calc()
Definition: hierarchy.hh:508
void addRedistributed(T1 *t)
Definition: hierarchy.hh:243
tuple< int, int, int, int > buildAggregates(const M &matrix, G &graph, const C &criterion, bool finestLevel)
Build the aggregates.
VariableBlockVector< T, A >::window_type row_type
The type implementing a matrix row.
Definition: matrix.hh:38
size_type max
Definition: hierarchy.hh:523
void recalculateGalerkin(const F ©Flags)
Recalculate the galerkin products.
Definition: hierarchy.hh:1184
Successively accumulate to fewer processes.
Definition: parameters.hh:246
derive error class from the base class in common
Definition: istlexception.hh:16
LevelIterator(const LevelIterator< typename remove_const< C >::type, typename remove_const< T1 >::type > &other)
Copy constructor.
Definition: hierarchy.hh:178
Allocator::template rebind< RedistributeInfoType >::other RILAllocator
Allocator for RedistributeInfoType.
Definition: hierarchy.hh:351
LevelIterator< Hierarchy< T, A >, T > Iterator
Type of the mutable iterator.
Definition: hierarchy.hh:258
Provdes class for identifying aggregates globally.
Matrix::size_type size_type
Definition: hierarchy.hh:505
Definition: transfer.hh:30
void decrement()
Move to the next fine level.
Definition: hierarchy.hh:220
bool isRedistributed() const
Check whether there was a redistribution at the current level.
Definition: hierarchy.hh:229
void operator()(const matrix_row &row)
Definition: hierarchy.hh:515
Hierarchy()
Construct a new empty hierarchy.
Definition: hierarchy.hh:1245
LevelIterator(const LevelIterator< const typename remove_const< C >::type, const typename remove_const< T1 >::type > &other)
Copy constructor.
Definition: hierarchy.hh:184
const_iterator begin() const
Definition: aggregates.hh:667
bool equals(const LevelIterator< const typename remove_const< C >::type, const typename remove_const< T1 >::type > &other) const
Equality check.
Definition: hierarchy.hh:201
ConstructionTraits< T >::Arguments Arguments
Definition: hierarchy.hh:113
std::size_t noVertices() const
Get the number of vertices.
Tag idnetifying the visited property of a vertex.
Definition: properties.hh:26
Classes for the generic construction and application of the smoothers.
void increment()
Move to the next coarser level.
Definition: hierarchy.hh:214
bool commGraphRepartition(const M &mat, Dune::OwnerOverlapCopyCommunication< T1, T2 > &oocomm, int nparts, Dune::OwnerOverlapCopyCommunication< T1, T2 > *&outcomm, RedistributeInterface &redistInf, bool verbose=false)
Definition: repartition.hh:823
~MatrixHierarchy()
Definition: hierarchy.hh:1107
std::size_t maxlevels() const
Get the max number of levels in the hierarchy of processors.
Definition: hierarchy.hh:1226
Dune::Amg::Hierarchy< ParallelInformation, Allocator > ParallelInformationHierarchy
The type of the parallel informarion hierarchy.
Definition: hierarchy.hh:339
Matrix::row_type matrix_row
Definition: hierarchy.hh:506
const RedistributeInfoList & redistributeInformation() const
Get the hierachy of the information about redistributions,.
Definition: hierarchy.hh:1101
All parameters for AMG.
Definition: parameters.hh:390
Definition: example.cc:34