From 776597e00b7f5c682a1e5ed43e9cf73d3fa28449 Mon Sep 17 00:00:00 2001 From: Vegard Kippe Date: Mon, 25 Sep 2023 13:28:08 +0200 Subject: [PATCH 1/2] Allow multi-segment wells with no grid connections - warning is already issued. --- src/opm/input/eclipse/Schedule/Schedule.cpp | 26 +++++++++++++++------ 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/opm/input/eclipse/Schedule/Schedule.cpp b/src/opm/input/eclipse/Schedule/Schedule.cpp index bb1d1dc30..4f14421aa 100644 --- a/src/opm/input/eclipse/Schedule/Schedule.cpp +++ b/src/opm/input/eclipse/Schedule/Schedule.cpp @@ -529,7 +529,9 @@ namespace /// \brief Check whether each MS well has COMPSEGS entry andissue error if not. /// \param welsegs All wells with a WELSEGS entry together with the location. /// \param compegs All wells with a COMPSEGS entry -void check_compsegs_consistency(::Opm::Schedule::WelSegsSet& welsegs, std::set& compsegs) +void check_compsegs_consistency(::Opm::Schedule::WelSegsSet& welsegs, + std::set& compsegs, + const std::vector<::Opm::Well>& wells) { std::vector> difference; difference.reserve(welsegs.size()); @@ -537,17 +539,27 @@ void check_compsegs_consistency(::Opm::Schedule::WelSegsSet& welsegs, std::set &x) -> bool { + const auto& wname = x.first; + const auto it = std::find_if(wells.begin(), wells.end(), + [wname](const ::Opm::Well& well) -> bool { + return well.name()==wname && well.getConnections().empty();}); + return it != wells.end(); + }; + difference.erase(std::remove_if(difference.begin(), difference.end(), empty_conn), difference.end()); + if (difference.size()) { - std::string wells = "well"; + std::string well_str = "well"; if (difference.size()>1) { - wells.append("s"); + well_str.append("s"); } - wells.append(":"); + well_str.append(":"); for(const auto& [name, location] : difference) { - wells.append(fmt::format("\n {} in {} at line {}", name, location.filename, location.lineno)); + well_str.append(fmt::format("\n {} in {} at line {}", name, location.filename, location.lineno)); } - auto msg = fmt::format("Missing COMPSEGS keyword for the following multisegment {}.", wells); + auto msg = fmt::format("Missing COMPSEGS keyword for the following multisegment {}.", well_str); throw Opm::OpmInputError(msg, std::get<1>(difference[0])); } } @@ -697,7 +709,7 @@ void Schedule::iterateScheduleSection(std::size_t load_start, std::size_t load_e keyword_index++; } - check_compsegs_consistency(welsegs_wells, compsegs_wells); + check_compsegs_consistency(welsegs_wells, compsegs_wells, this->getWells(report_step)); this->applyGlobalWPIMULT(wpimult_global_factor); this->end_report(report_step); From 30a92cca1ecc38cf797ded3dadfd9de81118e04d Mon Sep 17 00:00:00 2001 From: Vegard Kippe Date: Tue, 26 Sep 2023 13:28:36 +0200 Subject: [PATCH 2/2] Updated after review input --- src/opm/input/eclipse/Schedule/Schedule.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/opm/input/eclipse/Schedule/Schedule.cpp b/src/opm/input/eclipse/Schedule/Schedule.cpp index 4f14421aa..c35787a67 100644 --- a/src/opm/input/eclipse/Schedule/Schedule.cpp +++ b/src/opm/input/eclipse/Schedule/Schedule.cpp @@ -540,12 +540,11 @@ void check_compsegs_consistency(::Opm::Schedule::WelSegsSet& welsegs, std::back_inserter(difference), ::Opm::Schedule::PairComp()); // Ignore wells without connections - const auto empty_conn = [wells](const std::pair &x) -> bool { - const auto& wname = x.first; - const auto it = std::find_if(wells.begin(), wells.end(), - [wname](const ::Opm::Well& well) -> bool { - return well.name()==wname && well.getConnections().empty();}); - return it != wells.end(); + const auto empty_conn = [&wells](const std::pair &x) -> bool { + return std::any_of(wells.begin(), wells.end(), + [wname = x.first](const ::Opm::Well& well) { + return (well.name() == wname) && well.getConnections().empty(); } + ); }; difference.erase(std::remove_if(difference.begin(), difference.end(), empty_conn), difference.end());