diff --git a/dune/istl/paamg/aggregates.hh b/dune/istl/paamg/aggregates.hh index 352e6272476f1092305df96dba61ac6f4c9d2b27..dd2d9d6495dfbe0eeabe88e33e64dd6fa43ded7e 100644 --- a/dune/istl/paamg/aggregates.hh +++ b/dune/istl/paamg/aggregates.hh @@ -1409,7 +1409,14 @@ namespace Dune inline void SymmetricDependency<M,N>::examine(const ColIter& col) { real_type eij = norm_(*col); - real_type eji = norm_(matrix_->operator[](col.index())[row_]); + typename Matrix::ConstColIterator opposite_entry = + matrix_->operator[](col.index()).find(row_); + if ( opposite_entry == matrix_->operator[](col.index()).end() ) + { + // Consider this a weak connection we disregard. + return; + } + real_type eji = norm_(*opposite_entry); // skip positive offdiagonals if norm preserves sign of them. if(!N::is_sign_preserving || eij<0 || eji<0) @@ -1423,15 +1430,21 @@ namespace Dune inline void SymmetricDependency<M,N>::examine(G& graph, const typename G::EdgeIterator& edge, const ColIter& col) { real_type eij = norm_(*col); - real_type eji = norm_(matrix_->operator[](col.index())[row_]); + typename Matrix::ConstColIterator opposite_entry = + matrix_->operator[](col.index()).find(row_); + if ( opposite_entry == matrix_->operator[](col.index()).end() ) + { + // Consider this as a weak connection we disregard. + return; + } + real_type eji = norm_(*opposite_entry); // skip positve offdiagonals if norm preserves sign of them. if(!N::is_sign_preserving || (eij<0 || eji<0)) if(eji / norm_(matrix_->operator[](edge.target())[edge.target()]) * eij/ diagonal_ > alpha() * maxValue_) { edge.properties().setDepends(); edge.properties().setInfluences(); - typename G::EdgeProperties& other = graph.getEdgeProperties(edge.target(), edge.source()); other.setInfluences(); other.setDepends();