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:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user