update SummaryNode with lgr info

This commit is contained in:
Torbjørn Skille 2021-09-13 09:30:34 +02:00
parent e4c324dcef
commit ce052232f6
6 changed files with 121 additions and 54 deletions

View File

@ -119,8 +119,9 @@ private:
void updatePathAndRootName(filesystem::path& dir, filesystem::path& rootN) const;
std::string makeKeyString(const std::string& keyword, const std::string& wgname, int num,
const std::string& lgr = "none", int numlx = -1, int numly = -1, int numlz = -1) const;
const std::optional<Opm::EclIO::lgr_info> lgr_info) const;
std::string unpackNumber(const SummaryNode&) const;
std::string lookupKey(const SummaryNode&) const;

View File

@ -24,9 +24,15 @@
#include <optional>
#include <string>
#include <unordered_set>
#include <array>
namespace Opm { namespace EclIO {
struct lgr_info {
std::string name;
std::array<int, 3> ijk;
};
struct SummaryNode {
enum class Category {
Well,
@ -52,13 +58,14 @@ struct SummaryNode {
Undefined,
};
std::string keyword;
Category category;
Type type;
std::string wgname;
int number;
std::optional<std::string> fip_region;
std::optional<lgr_info> lgr;
constexpr static int default_number { std::numeric_limits<int>::min() };

View File

@ -68,7 +68,7 @@ namespace Opm {
const KeywordLocation& location( ) const { return this->loc; }
operator Opm::EclIO::SummaryNode() const {
return { keyword_, category_, type_, name_, number_, fip_region_ };
return { keyword_, category_, type_, name_, number_, fip_region_, {}};
}
template<class Serializer>

View File

@ -177,7 +177,9 @@ void ERsm::load_block(std::deque<std::string>& lines, std::size_t& vector_length
SummaryNode::Type::Undefined,
wgnames[kw_index],
make_num(nums_list[kw_index]),
""};
"",
{}
};
block_data.emplace_back( node, vector_length );
}

View File

@ -185,23 +185,45 @@ ESmry::ESmry(const std::string &filename, bool loadBaseRunData) :
this->startdat = make_date(smspecList.back().get<int>("STARTDAT"));
for (unsigned int i=0; i<keywords.size(); i++) {
if ( have_lgr ) {
for (unsigned int i=0; i<keywords.size(); i++) {
const std::string keyString = have_lgr
? makeKeyString(keywords[i], wgnames[i], nums[i], lgrs[i], numlx[i], numly[i], numlz[i])
: makeKeyString(keywords[i], wgnames[i], nums[i]);
Opm::EclIO::lgr_info lgr { lgrs[i], {numlx[i], numly[i], numlz[i]}};
const std::string keyString = makeKeyString(keywords[i], wgnames[i], nums[i], lgr);
combindKeyList.push_back(keyString);
combindKeyList.push_back(keyString);
if (! keyString.empty()) {
summaryNodes.push_back( {
keywords[i],
SummaryNode::category_from_keyword(keywords[i], segmentExceptions),
SummaryNode::Type::Undefined,
wgnames[i],
nums[i],
"",
lgr
});
if (! keyString.empty()) {
summaryNodes.push_back({
keywords[i],
SummaryNode::category_from_keyword(keywords[i], segmentExceptions),
SummaryNode::Type::Undefined,
wgnames[i],
nums[i],
""
});
keywList.insert(keyString);
kwunits[keyString] = units[i];
}
}
} else {
for (unsigned int i=0; i<keywords.size(); i++) {
const std::string keyString = makeKeyString(keywords[i], wgnames[i], nums[i], {});
combindKeyList.push_back(keyString);
if (! keyString.empty()) {
summaryNodes.push_back( {
keywords[i],
SummaryNode::category_from_keyword(keywords[i], segmentExceptions),
SummaryNode::Type::Undefined,
wgnames[i],
nums[i],
"",
{}
});
}
keywList.insert(keyString);
kwunits[keyString] = units[i];
@ -295,26 +317,50 @@ ESmry::ESmry(const std::string &filename, bool loadBaseRunData) :
this->startdat = make_date(smspecList.back().get<int>("STARTDAT"));
for (size_t i = 0; i < keywords.size(); i++) {
if (have_lgr) {
for (size_t i = 0; i < keywords.size(); i++) {
Opm::EclIO::lgr_info lgr { lgrs[i], {numlx[i], numly[i], numlz[i]}};
const std::string keyString = makeKeyString(keywords[i], wgnames[i], nums[i], lgr);
const std::string keyString = have_lgr
? makeKeyString(keywords[i], wgnames[i], nums[i], lgrs[i], numlx[i], numly[i], numlz[i])
: makeKeyString(keywords[i], wgnames[i], nums[i]);
combindKeyList.push_back(keyString);
combindKeyList.push_back(keyString);
if (! keyString.empty()) {
summaryNodes.push_back( {
keywords[i],
SummaryNode::category_from_keyword(keywords[i], segmentExceptions),
SummaryNode::Type::Undefined,
wgnames[i],
nums[i],
"",
lgr
});
if (! keyString.empty()) {
summaryNodes.push_back({
keywords[i],
SummaryNode::category_from_keyword(keywords[i], segmentExceptions),
SummaryNode::Type::Undefined,
wgnames[i],
nums[i],
""
});
keywList.insert(keyString);
kwunits[keyString] = units[i];
}
}
keywList.insert(keyString);
kwunits[keyString] = units[i];
} else {
for (size_t i = 0; i < keywords.size(); i++) {
const std::string keyString = makeKeyString(keywords[i], wgnames[i], nums[i], {});
combindKeyList.push_back(keyString);
if (! keyString.empty()) {
summaryNodes.push_back( {
keywords[i],
SummaryNode::category_from_keyword(keywords[i], segmentExceptions),
SummaryNode::Type::Undefined,
wgnames[i],
nums[i],
"",
{}
});
keywList.insert(keyString);
kwunits[keyString] = units[i];
}
}
}
@ -377,14 +423,19 @@ ESmry::ESmry(const std::string &filename, bool loadBaseRunData) :
const bool have_lgr = !lgrs.empty();
for (size_t i=0; i < keywords.size(); i++) {
const std::string keyw = have_lgr
? makeKeyString(keywords[i], wgnames[i], nums[i], lgrs[i], numlx[i], numly[i], numlz[i])
: makeKeyString(keywords[i], wgnames[i], nums[i]);
if (keywList.find(keyw) != keywList.end())
arrayPos[specInd][keyIndex[keyw]]=i;
if (have_lgr) {
for (size_t i=0; i < keywords.size(); i++) {
Opm::EclIO::lgr_info lgr { lgrs[i], {numlx[i], numly[i], numlz[i]}};
const std::string keyw = makeKeyString(keywords[i], wgnames[i], nums[i], lgr);
if (keywList.find(keyw) != keywList.end())
arrayPos[specInd][keyIndex[keyw]]=i;
}
} else {
for (size_t i=0; i < keywords.size(); i++) {
const std::string keyw = makeKeyString(keywords[i], wgnames[i], nums[i], {});
if (keywList.find(keyw) != keywList.end())
arrayPos[specInd][keyIndex[keyw]]=i;
}
}
specInd--;
@ -1016,8 +1067,6 @@ bool ESmry::make_esmry_file()
}
}
std::vector<std::string> ESmry::checkForMultipleResultFiles(const Opm::filesystem::path& rootN, bool formatted) const {
std::vector<std::string> fileList;
@ -1083,7 +1132,7 @@ void ESmry::ijk_from_global_index(int glob, int &i, int &j, int &k) const
std::string ESmry::makeKeyString(const std::string& keywordArg, const std::string& wgname, int num,
const std::string& lgr, int numlx, int numly, int numlz) const
const std::optional<Opm::EclIO::lgr_info> lgr) const
{
const auto no_wgname = std::string_view(":+:+:+:+");
@ -1129,11 +1178,19 @@ std::string ESmry::makeKeyString(const std::string& keywordArg, const std::strin
if (first == 'L') {
if ((keywordArg[1] == 'B') || (keywordArg[1] == 'C'))
return fmt::format("{}:{}:{},{},{}", keywordArg, lgr, numlx, numly, numlz);
if (!lgr.has_value())
throw std::invalid_argument("need lgr info element for making L type vector strings");
auto lgr_ = lgr.value();
if (keywordArg[1] == 'B')
return fmt::format("{}:{}:{},{},{}", keywordArg, lgr_.name, lgr_.ijk[0], lgr_.ijk[1], lgr_.ijk[2]);
if (keywordArg[1] == 'C')
return fmt::format("{}:{}:{}:{},{},{}", keywordArg, lgr_.name, wgname, lgr_.ijk[0], lgr_.ijk[1], lgr_.ijk[2]);
if (keywordArg[1] == 'W')
return fmt::format("{}:{}:{}", keywordArg, lgr, wgname);
return fmt::format("{}:{}:{}", keywordArg, lgr_.name, wgname);
return fmt::format("{}", keywordArg);
}

View File

@ -197,12 +197,12 @@ namespace {
// Recall: Cannot use emplace_back() for PODs.
for (const auto& vector : vectors) {
entities.push_back({ kwpref + vector.kw, cat,
vector.type, name, dflt_num, {} });
vector.type, name, dflt_num, {}, {} });
}
for (const auto& extra_vector : extra_vectors) {
entities.push_back({ extra_vector.kw, cat,
extra_vector.type, name, dflt_num, {} });
extra_vector.type, name, dflt_num, {}, {} });
}
};
@ -212,7 +212,7 @@ namespace {
const auto& well = sched.getWellatEnd(well_name);
for (const auto& conn : well.getConnections()) {
for (const auto& conn_vector : extra_connection_vectors)
entities.push_back( {conn_vector.kw, Cat::Connection, conn_vector.type, well.name(), static_cast<int>(conn.global_index() + 1), {}} );
entities.push_back( {conn_vector.kw, Cat::Connection, conn_vector.type, well.name(), static_cast<int>(conn.global_index() + 1), {}, {}} );
}
}
@ -249,7 +249,7 @@ namespace {
for (auto segID = 0*nSeg + 1; segID <= nSeg; ++segID) {
for (const auto& vector : vectors) {
entities.push_back({ vector.kw, Cat::Segment,
vector.type, wname, segID, {} });
vector.type, wname, segID, {}, {} });
}
}
};
@ -286,7 +286,7 @@ namespace {
for (const auto& aquiferID : aquiferIDs) {
for (const auto& vector : vectors) {
entities.push_back({ vector.kw, Cat::Aquifer,
vector.type, "", aquiferID, {} });
vector.type, "", aquiferID, {}, {} });
}
}
@ -309,7 +309,7 @@ namespace {
for (const auto& aquiferID : aquiferIDs) {
for (const auto& vector : vectors) {
entities.push_back({ vector.kw, Cat::Aquifer,
vector.type, "", aquiferID, {} });
vector.type, "", aquiferID, {}, {} });
}
}