From b08f89e68ade22c5236f23dc6b2b0b701339cd76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A5rd=20Skaflestad?= Date: Fri, 4 Sep 2015 15:08:05 +0200 Subject: [PATCH] convertSats(): Transpose loop nest for locality of data --- opm/core/simulator/initStateEquil_impl.hpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/opm/core/simulator/initStateEquil_impl.hpp b/opm/core/simulator/initStateEquil_impl.hpp index af25b15a6..a8344a24f 100644 --- a/opm/core/simulator/initStateEquil_impl.hpp +++ b/opm/core/simulator/initStateEquil_impl.hpp @@ -780,14 +780,22 @@ namespace Opm inline std::vector convertSats(const std::vector< std::vector >& sat) { - const int np = sat.size(); - const int nc = sat[0].size(); + const auto np = sat.size(); + const auto nc = sat[0].size(); + std::vector s(np * nc); - for (int c = 0; c < nc; ++c) { - for (int p = 0; p < np; ++p) { - s[np*c + p] = sat[p][c]; + + for (decltype(sat.size()) p = 0; p < np; ++p) { + const auto& sat_p = sat[p]; + double* sp = & s[0*nc + p]; + + for (decltype(sat[0].size()) c = 0; + c < nc; ++c, sp += np) + { + *sp = sat_p[c]; } } + return s; } } // namespace Details