Make Derivation of Enumerated Well Items Public

We need this ability to handle segment level UDQ ASSIGN statements
too, so give the operation a well defined home and call it where
applicable.
This commit is contained in:
Bård Skaflestad
2023-01-31 19:04:29 +01:00
parent 72519e3e1f
commit cf9b66d8ec
4 changed files with 29 additions and 36 deletions

View File

@@ -29,6 +29,10 @@
#include <unordered_map>
#include <vector>
namespace Opm {
class SegmentSet;
} // namespace Opm
namespace Opm {
class UDQScalar
@@ -197,6 +201,9 @@ public:
}
};
static std::vector<EnumeratedWellItems>
getSegmentItems(const SegmentSet& segmentSet);
/// Construct empty, named UDQ set of specific variable type
///
/// \param[in] name UDQ set name

View File

@@ -68,22 +68,6 @@ Opm::UDQVarType init_type(const Opm::UDQTokenType token_type)
return Opm::UDQVarType::NONE;
}
std::vector<Opm::UDQSet::EnumeratedWellItems>
make_segment_items(const Opm::SegmentSet& segSet)
{
const auto numWells = segSet.numWells();
auto items = std::vector<Opm::UDQSet::EnumeratedWellItems>(numWells);
for (auto wellID = 0*numWells; wellID < numWells; ++wellID) {
auto segRange = segSet.segments(wellID);
items[wellID].well = segRange.well();
items[wellID].numbers.assign(segRange.begin(), segRange.end());
}
return items;
}
} // Anonymous namespace
namespace Opm {
@@ -415,7 +399,7 @@ UDQSet
UDQASTNode::eval_segment_expression(const std::string& string_value,
const UDQContext& context) const
{
const auto all_msw_segments = make_segment_items(context.segments());
const auto all_msw_segments = UDQSet::getSegmentItems(context.segments());
if (this->selector.empty()) {
auto res = UDQSet::segments(string_value, all_msw_segments);
@@ -513,7 +497,7 @@ UDQASTNode::eval_number(const UDQVarType target_type,
return UDQSet::groups(dummy_name, context.groups(), numeric_value);
case UDQVarType::SEGMENT_VAR:
return UDQSet::segments(dummy_name, make_segment_items(context.segments()), numeric_value);
return UDQSet::segments(dummy_name, UDQSet::getSegmentItems(context.segments()), numeric_value);
case UDQVarType::SCALAR:
return UDQSet::scalar(dummy_name, numeric_value);

View File

@@ -218,22 +218,6 @@ bool dynamic_type_check(const Opm::UDQVarType lhs,
return true;
}
std::vector<Opm::UDQSet::EnumeratedWellItems>
make_segment_items(const Opm::SegmentSet& segSet)
{
const auto numWells = segSet.numWells();
auto items = std::vector<Opm::UDQSet::EnumeratedWellItems>(numWells);
for (auto wellID = 0*numWells; wellID < numWells; ++wellID) {
auto segRange = segSet.segments(wellID);
items[wellID].well = segRange.well();
items[wellID].numbers.assign(segRange.begin(), segRange.end());
}
return items;
}
} // Anonymous namespace
namespace Opm {
@@ -487,10 +471,10 @@ UDQSet UDQDefine::scatter_scalar_segment_value(const UDQContext& cont
const std::optional<double>& value) const
{
if (! value.has_value()) {
return UDQSet::segments(this->m_keyword, make_segment_items(context.segments()));
return UDQSet::segments(this->m_keyword, UDQSet::getSegmentItems(context.segments()));
}
return UDQSet::segments(this->m_keyword, make_segment_items(context.segments()), *value);
return UDQSet::segments(this->m_keyword, UDQSet::getSegmentItems(context.segments()), *value);
}
} // namespace Opm

View File

@@ -19,6 +19,8 @@
#include <opm/input/eclipse/Schedule/UDQ/UDQSet.hpp>
#include <opm/input/eclipse/Schedule/MSW/SegmentMatcher.hpp>
#include <opm/common/utility/shmatch.hpp>
#include <algorithm>
@@ -770,4 +772,20 @@ bool UDQSet::operator==(const UDQSet& other) const
&& (this->values == other.values);
}
std::vector<UDQSet::EnumeratedWellItems>
UDQSet::getSegmentItems(const SegmentSet& segSet)
{
const auto numWells = segSet.numWells();
auto items = std::vector<Opm::UDQSet::EnumeratedWellItems>(numWells);
for (auto wellID = 0*numWells; wellID < numWells; ++wellID) {
auto segRange = segSet.segments(wellID);
items[wellID].well = segRange.well();
items[wellID].numbers.assign(segRange.begin(), segRange.end());
}
return items;
}
} // namespace Opm