From 8a038401cece502edddcf995f104caacb7e3ef08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Atgeirr=20Fl=C3=B8=20Rasmussen?= Date: Tue, 20 Nov 2018 09:48:27 +0100 Subject: [PATCH] Avoid in-loop allocation in convertToCRS(). This is done by counting entries first. --- opm/autodiff/ParallelOverlappingILU0.hpp | 25 +++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/opm/autodiff/ParallelOverlappingILU0.hpp b/opm/autodiff/ParallelOverlappingILU0.hpp index 8dbb8f1bb..ce44781b5 100644 --- a/opm/autodiff/ParallelOverlappingILU0.hpp +++ b/opm/autodiff/ParallelOverlappingILU0.hpp @@ -442,17 +442,30 @@ namespace Opm upper.resize( A.N() ); inv.resize( A.N() ); - lower.reserveAdditional( 2*A.N() ); + // Count the lower and upper matrix entries. + size_type numLower = 0; + size_type numUpper = 0; + const auto endi = A.end(); + for (auto i=A.begin(); i!=endi; ++i) { + const size_type iIndex = i.index(); + for (auto j = (*i).begin(); j.index() < iIndex; ++j) { + ++numLower; + } + for (auto j = (*i).beforeEnd(); j.index() > iIndex; --j) { + ++numUpper; + } + } + assert(numLower + numUpper + A.N() == A.nonzeroes()); + + lower.reserveAdditional( numLower ); // implement left looking variant with stored inverse - const auto endi = A.end(); size_type row = 0; size_type colcount = 0; lower.rows_[ 0 ] = colcount; for (auto i=A.begin(); i!=endi; ++i, ++row) { const size_type iIndex = i.index(); - lower.reserveAdditional( (*i).size() ); // eliminate entries left of diagonal; store L factor for (auto j=(*i).begin(); j.index() < iIndex; ++j ) @@ -463,19 +476,20 @@ namespace Opm lower.rows_[ iIndex+1 ] = colcount; } + assert(colcount == numLower); + const auto rendi = A.beforeBegin(); row = 0; colcount = 0; upper.rows_[ 0 ] = colcount ; - upper.reserveAdditional( lower.nonZeros() + A.N() ); + upper.reserveAdditional( numUpper ); // NOTE: upper and inv store entries in reverse order, reverse here // relative to ILU for (auto i=A.beforeEnd(); i!=rendi; --i, ++ row ) { const size_type iIndex = i.index(); - upper.reserveAdditional( (*i).size() ); // store in reverse row order // eliminate entries left of diagonal; store L factor @@ -495,6 +509,7 @@ namespace Opm } upper.rows_[ row+1 ] = colcount; } + assert(colcount == numUpper); } } // end namespace detail