From 19de6751ca6b3b8f951a3e8eaa2617e7d1cc91bf Mon Sep 17 00:00:00 2001 From: Arne Morten Kvarving Date: Fri, 14 Feb 2025 10:35:29 +0100 Subject: [PATCH] simplify output registration in FlowsContainer --- opm/simulators/flow/FlowsContainer.cpp | 95 ++++++++++---------------- 1 file changed, 36 insertions(+), 59 deletions(-) diff --git a/opm/simulators/flow/FlowsContainer.cpp b/opm/simulators/flow/FlowsContainer.cpp index 84124b887..6ad325258 100644 --- a/opm/simulators/flow/FlowsContainer.cpp +++ b/opm/simulators/flow/FlowsContainer.cpp @@ -38,17 +38,18 @@ namespace { template - using DataEntry = std::tuple&>; + using DataEntry = std::tuple,6>&>; template void addEntry(std::vector>& container, const std::string& name, Opm::UnitSystem::measure measure, - Array& flowArray, - const unsigned faceId) + Array& flowArray) { if constexpr (idx >= 0) { // Only add if index is valid - container.emplace_back(name, measure, flowArray[idx][faceId]); + container.emplace_back(name, measure, flowArray[idx]); } } @@ -261,67 +262,43 @@ template void FlowsContainer:: outputRestart(data::Solution& sol) { - auto doInsert = [&sol](DataEntry& entry, - const data::TargetType target) + auto doInsert = [&sol](ScalarBuffer& value, + const std::string& name, + UnitSystem::measure measure) { - if (!std::get<2>(entry).empty()) { - sol.insert(std::get(entry), - std::get(entry), - std::move(std::get<2>(entry)), - target); + if (!value.empty()) { + sol.insert(name, measure, std::move(value), + data::TargetType::RESTART_SOLUTION); } }; using Dir = FaceDir::DirEnum; - std::vector> floresSolutionVector; - addEntry(floresSolutionVector, "FLRGASI+", UnitSystem::measure::rate, flores_, FaceDir::ToIntersectionIndex(Dir::XPlus)); - addEntry(floresSolutionVector, "FLRGASJ+", UnitSystem::measure::rate, flores_, FaceDir::ToIntersectionIndex(Dir::YPlus)); - addEntry(floresSolutionVector, "FLRGASK+", UnitSystem::measure::rate, flores_, FaceDir::ToIntersectionIndex(Dir::ZPlus)); - addEntry(floresSolutionVector, "FLRGASI-", UnitSystem::measure::rate, flores_, FaceDir::ToIntersectionIndex(Dir::XMinus)); - addEntry(floresSolutionVector, "FLRGASJ-", UnitSystem::measure::rate, flores_, FaceDir::ToIntersectionIndex(Dir::YMinus)); - addEntry(floresSolutionVector, "FLRGASK-", UnitSystem::measure::rate, flores_, FaceDir::ToIntersectionIndex(Dir::ZMinus)); - addEntry(floresSolutionVector, "FLROILI+", UnitSystem::measure::rate, flores_, FaceDir::ToIntersectionIndex(Dir::XPlus)); - addEntry(floresSolutionVector, "FLROILJ+", UnitSystem::measure::rate, flores_, FaceDir::ToIntersectionIndex(Dir::YPlus)); - addEntry(floresSolutionVector, "FLROILK+", UnitSystem::measure::rate, flores_, FaceDir::ToIntersectionIndex(Dir::ZPlus)); - addEntry(floresSolutionVector, "FLROILI-", UnitSystem::measure::rate, flores_, FaceDir::ToIntersectionIndex(Dir::XMinus)); - addEntry(floresSolutionVector, "FLROILJ-", UnitSystem::measure::rate, flores_, FaceDir::ToIntersectionIndex(Dir::YMinus)); - addEntry(floresSolutionVector, "FLROILK-", UnitSystem::measure::rate, flores_, FaceDir::ToIntersectionIndex(Dir::ZMinus)); - addEntry(floresSolutionVector, "FLRWATI+", UnitSystem::measure::rate, flores_, FaceDir::ToIntersectionIndex(Dir::XPlus)); - addEntry(floresSolutionVector, "FLRWATJ+", UnitSystem::measure::rate, flores_, FaceDir::ToIntersectionIndex(Dir::YPlus)); - addEntry(floresSolutionVector, "FLRWATK+", UnitSystem::measure::rate, flores_, FaceDir::ToIntersectionIndex(Dir::ZPlus)); - addEntry(floresSolutionVector, "FLRWATI-", UnitSystem::measure::rate, flores_, FaceDir::ToIntersectionIndex(Dir::XMinus)); - addEntry(floresSolutionVector, "FLRWATJ-", UnitSystem::measure::rate, flores_, FaceDir::ToIntersectionIndex(Dir::YMinus)); - addEntry(floresSolutionVector, "FLRWATK-", UnitSystem::measure::rate, flores_, FaceDir::ToIntersectionIndex(Dir::ZMinus)); + std::vector> entries; + addEntry (entries, "FLRGAS", UnitSystem::measure::rate, flores_); + addEntry (entries, "FLROIL", UnitSystem::measure::rate, flores_); + addEntry(entries, "FLRWAT", UnitSystem::measure::rate, flores_); + addEntry (entries, "FLOGAS", UnitSystem::measure::gas_surface_rate, flows_); + addEntry (entries, "FLOOIL", UnitSystem::measure::liquid_surface_rate, flows_); + addEntry(entries, "FLOWAT", UnitSystem::measure::liquid_surface_rate, flows_); - std::vector> flowsSolutionVector; - addEntry(flowsSolutionVector, "FLOGASI+", UnitSystem::measure::gas_surface_rate, flows_, FaceDir::ToIntersectionIndex(Dir::XPlus)); - addEntry(flowsSolutionVector, "FLOGASJ+", UnitSystem::measure::gas_surface_rate, flows_, FaceDir::ToIntersectionIndex(Dir::YPlus)); - addEntry(flowsSolutionVector, "FLOGASK+", UnitSystem::measure::gas_surface_rate, flows_, FaceDir::ToIntersectionIndex(Dir::ZPlus)); - addEntry(flowsSolutionVector, "FLOOILI+", UnitSystem::measure::liquid_surface_rate, flows_, FaceDir::ToIntersectionIndex(Dir::XPlus)); - addEntry(flowsSolutionVector, "FLOOILJ+", UnitSystem::measure::liquid_surface_rate, flows_, FaceDir::ToIntersectionIndex(Dir::YPlus)); - addEntry(flowsSolutionVector, "FLOOILK+", UnitSystem::measure::liquid_surface_rate, flows_, FaceDir::ToIntersectionIndex(Dir::ZPlus)); - addEntry(flowsSolutionVector, "FLOWATI+", UnitSystem::measure::liquid_surface_rate, flows_, FaceDir::ToIntersectionIndex(Dir::XPlus)); - addEntry(flowsSolutionVector, "FLOWATJ+", UnitSystem::measure::liquid_surface_rate, flows_, FaceDir::ToIntersectionIndex(Dir::YPlus)); - addEntry(flowsSolutionVector, "FLOWATK+", UnitSystem::measure::liquid_surface_rate, flows_, FaceDir::ToIntersectionIndex(Dir::ZPlus)); - addEntry(flowsSolutionVector, "FLOGASI-", UnitSystem::measure::gas_surface_rate, flows_, FaceDir::ToIntersectionIndex(Dir::XMinus)); - addEntry(flowsSolutionVector, "FLOGASJ-", UnitSystem::measure::gas_surface_rate, flows_, FaceDir::ToIntersectionIndex(Dir::YMinus)); - addEntry(flowsSolutionVector, "FLOGASK-", UnitSystem::measure::gas_surface_rate, flows_, FaceDir::ToIntersectionIndex(Dir::ZMinus)); - addEntry(flowsSolutionVector, "FLOOILI-", UnitSystem::measure::liquid_surface_rate, flows_, FaceDir::ToIntersectionIndex(Dir::XMinus)); - addEntry(flowsSolutionVector, "FLOOILJ-", UnitSystem::measure::liquid_surface_rate, flows_, FaceDir::ToIntersectionIndex(Dir::YMinus)); - addEntry(flowsSolutionVector, "FLOOILK-", UnitSystem::measure::liquid_surface_rate, flows_, FaceDir::ToIntersectionIndex(Dir::ZMinus)); - addEntry(flowsSolutionVector, "FLOWATI-", UnitSystem::measure::liquid_surface_rate, flows_, FaceDir::ToIntersectionIndex(Dir::XMinus)); - addEntry(flowsSolutionVector, "FLOWATJ-", UnitSystem::measure::liquid_surface_rate, flows_, FaceDir::ToIntersectionIndex(Dir::YMinus)); - addEntry(flowsSolutionVector, "FLOWATK-", UnitSystem::measure::liquid_surface_rate, flows_, FaceDir::ToIntersectionIndex(Dir::ZMinus)); - - std::for_each(floresSolutionVector.begin(), floresSolutionVector.end(), - [doInsert](auto& array) - { doInsert(array, data::TargetType::RESTART_SOLUTION); }); - - if (this->enableFlows_) { - std::for_each(flowsSolutionVector.begin(), flowsSolutionVector.end(), - [doInsert](auto& array) - { doInsert(array, data::TargetType::RESTART_SOLUTION); }); - } + std::for_each(entries.begin(), entries.end(), + [&doInsert](auto& array) + { + static const auto dirs = std::array{ + std::pair{FaceDir::ToIntersectionIndex(Dir::XMinus), "I-"}, + std::pair{FaceDir::ToIntersectionIndex(Dir::XPlus), "I+"}, + std::pair{FaceDir::ToIntersectionIndex(Dir::YMinus), "J-"}, + std::pair{FaceDir::ToIntersectionIndex(Dir::YPlus), "J+"}, + std::pair{FaceDir::ToIntersectionIndex(Dir::ZMinus), "K-"}, + std::pair{FaceDir::ToIntersectionIndex(Dir::ZPlus), "K+"}, + }; + const auto& name = std::get<0>(array); + const auto& measure = std::get<1>(array); + auto& value = std::get<2>(array); + for (const auto& [index, postfix] : dirs) { + doInsert(value[index], name + postfix, measure); + } + }); } template using FS = BlackOilFluidSystem;