diff --git a/dune/istl/paamg/aggregates.hh b/dune/istl/paamg/aggregates.hh index 43696b507a55006f75247a0217ab487371f84daf..d4fdbc21f5eceffa083288afc458b35f17e6ddf5 100644 --- a/dune/istl/paamg/aggregates.hh +++ b/dune/istl/paamg/aggregates.hh @@ -172,13 +172,15 @@ namespace Dune /** @brief The matrix we work on. */ const Matrix* matrix_; /** @brief The current max value.*/ - typename Matrix::field_type maxValue_; + typedef typename Matrix::field_type field_type; + typedef typename FieldTraits<field_type>::real_type real_type; + real_type maxValue_; /** @brief The functor for calculating the norm. */ Norm norm_; /** @brief index of the currently evaluated row. */ int row_; /** @brief The norm of the current diagonal. */ - typename Matrix::field_type diagonal_; + real_type diagonal_; std::vector<typename Matrix::field_type> vals_; typename std::vector<typename Matrix::field_type>::iterator valIter_; @@ -207,7 +209,7 @@ namespace Dune inline void SymmetricMatrixDependency<M,N>::examine(const ColIter& col) { // skip positive offdiagonals if norm preserves sign of them. - typename Matrix::field_type eij = norm_(*col); + real_type eij = norm_(*col); if(!N::is_sign_preserving || eij<0) // || eji<0) { *valIter_ = eij/diagonal_*eij/norm_(matrix_->operator[](col.index())[col.index()]); @@ -287,13 +289,15 @@ namespace Dune /** @brief The matrix we work on. */ const Matrix* matrix_; /** @brief The current max value.*/ - typename Matrix::field_type maxValue_; + typedef typename Matrix::field_type field_type; + typedef typename FieldTraits<field_type>::real_type real_type; + real_type maxValue_; /** @brief The functor for calculating the norm. */ Norm norm_; /** @brief index of the currently evaluated row. */ int row_; /** @brief The norm of the current diagonal. */ - typename Matrix::field_type diagonal_; + real_type diagonal_; }; /** @@ -346,13 +350,13 @@ namespace Dune /** @brief The matrix we work on. */ const Matrix* matrix_; /** @brief The current max value.*/ - typename Matrix::field_type maxValue_; + real_type maxValue_; /** @brief The functor for calculating the norm. */ Norm norm_; /** @brief index of the currently evaluated row. */ int row_; /** @brief The norm of the current diagonal. */ - typename Matrix::field_type diagonal_; + real_type diagonal_; }; /** @@ -372,9 +376,10 @@ namespace Dune * @param m The matrix ro compute the norm of. */ template<class M> - typename M::field_type operator()(const M& m) const + typename FieldTraits<typename M::field_type>::real_type operator()(const M& m) const { - return m[N][N]; + return std::real(m[N][N]); + // return m[N][N]; } }; @@ -401,7 +406,7 @@ namespace Dune * @param m The matrix row to compute the norm of. */ template<class M> - typename M::field_type operator()(const M& m) const + typename FieldTraits<typename M::field_type>::real_type operator()(const M& m) const { return m.infinity_norm(); } @@ -418,7 +423,7 @@ namespace Dune * @param m The matrix row to compute the norm of. */ template<class M> - typename M::field_type operator()(const M& m) const + typename FieldTraits<typename M::field_type>::real_type operator()(const M& m) const { return m.frobenius_norm(); } @@ -434,7 +439,7 @@ namespace Dune * @param m The matrix row to compute the norm of. */ template<class M> - typename M::field_type operator()(const M& m) const + typename FieldTraits<typename M::field_type>::real_type operator()(const M& m) const { return 1; } @@ -1362,8 +1367,8 @@ namespace Dune template<class M, class N> inline void SymmetricDependency<M,N>::examine(const ColIter& col) { - typename Matrix::field_type eij = norm_(*col); - typename Matrix::field_type eji = norm_(matrix_->operator[](col.index())[row_]); + real_type eij = norm_(*col); + real_type eji = norm_(matrix_->operator[](col.index())[row_]); // skip positive offdiagonals if norm preserves sign of them. if(!N::is_sign_preserving || eij<0 || eji<0) @@ -1376,8 +1381,8 @@ namespace Dune template<class G> inline void SymmetricDependency<M,N>::examine(G& graph, const typename G::EdgeIterator& edge, const ColIter& col) { - typename Matrix::field_type eij = norm_(*col); - typename Matrix::field_type eji = norm_(matrix_->operator[](col.index())[row_]); + real_type eij = norm_(*col); + real_type eji = norm_(matrix_->operator[](col.index())[row_]); // skip positve offdiagonals if norm preserves sign of them. if(!N::is_sign_preserving || (eij<0 || eji<0)) @@ -1409,7 +1414,7 @@ namespace Dune inline void Dependency<M,N>::initRow(const Row& row, int index) { DUNE_UNUSED_PARAMETER(row); - maxValue_ = std::min(- std::numeric_limits<typename Matrix::field_type>::max(), std::numeric_limits<typename Matrix::field_type>::min()); + maxValue_ = std::min(- std::numeric_limits<real_type>::max(), std::numeric_limits<real_type>::min()); row_ = index; diagonal_ = norm_(matrix_->operator[](row_)[row_]); } @@ -1758,7 +1763,7 @@ namespace Dune // the calculator should know whether the vertex is isolated. typedef typename Matrix::ConstColIterator ColIterator; ColIterator end = row.end(); - typename Matrix::field_type absoffdiag=0; + typename FieldTraits<typename Matrix::field_type>::real_type absoffdiag=0.; if(firstlevel) { for(ColIterator col = row.begin(); col != end; ++col)