Merge pull request #1790 from joakim-hove/network-vfp0

When defining branch properties: vfp == 0 should delete branch
This commit is contained in:
Bård Skaflestad 2020-05-16 00:46:58 +02:00 committed by GitHub
commit 6f45df5e93
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 87 additions and 28 deletions

View File

@ -40,6 +40,7 @@ public:
bool has_node(const std::string& name) const;
void add_node(Node node);
void add_branch(Branch branch);
void drop_branch(const std::string& uptree_node, const std::string& downtree_node);
const Node& node(const std::string& name) const;
const Node& root() const;
std::vector<Branch> downtree_branches(const std::string& node) const;

View File

@ -73,6 +73,20 @@ void ExtNetwork::add_branch(Branch branch)
this->m_branches.push_back( std::move(branch) );
}
void ExtNetwork::drop_branch(const std::string& uptree_node, const std::string& downtree_node) {
auto downtree_branches = this->downtree_branches( downtree_node );
if (downtree_branches.empty()) {
auto branch_iter = std::find_if(this->m_branches.begin(), this->m_branches.end(), [&uptree_node, &downtree_node](const Branch& b) { return (b.uptree_node() == uptree_node && b.downtree_node() == downtree_node); });
if (branch_iter != this->m_branches.end())
this->m_branches.erase( branch_iter );
this->m_nodes.erase( downtree_node );
} else {
for (const auto& branch : downtree_branches)
this->drop_branch(branch.uptree_node(), branch.downtree_node());
}
}
std::optional<Branch> ExtNetwork::uptree_branch(const std::string& node) const {
if (!this->has_node(node))

View File

@ -3286,6 +3286,9 @@ void Schedule::handleBRANPROP(const DeckKeyword& keyword, std::size_t report_ste
const auto& downtree_node = record.getItem<BP::DOWNTREE_NODE>().get<std::string>(0);
const auto& uptree_node = record.getItem<BP::UPTREE_NODE>().get<std::string>(0);
int vfp_table = record.getItem<BP::VFP_TABLE>().get<int>(0);
if (vfp_table == 0)
ext_network->drop_branch( uptree_node, downtree_node );
else {
auto alq_eq = Network::Branch::AlqEqfromString( record.getItem<BP::ALQ_SURFACE_DENSITY>().get<std::string>(0));
if (alq_eq == Network::Branch::AlqEQ::ALQ_INPUT) {
double alq_value = record.getItem<BP::ALQ>().get<double>(0);
@ -3293,6 +3296,7 @@ void Schedule::handleBRANPROP(const DeckKeyword& keyword, std::size_t report_ste
} else
ext_network->add_branch( Network::Branch(downtree_node, uptree_node, vfp_table, alq_eq));
}
}
this->updateNetwork(ext_network, report_step);
}

View File

@ -189,9 +189,20 @@ NODEPROP
B1 1* YES NO 1* /
C1 1* YES NO 'GROUP' /
/
TSTEP
10 /
BRANPROP
-- Downtree Uptree #VFP ALQ
C1 PLAT-A 0 1* /
/
)";
auto sched = make_schedule(deck_string);
{
const auto& network = sched.network(0);
const auto& b1 = network.node("B1");
BOOST_CHECK(b1.as_choke());
@ -225,4 +236,33 @@ NODEPROP
BOOST_CHECK(network.active());
}
{
const auto& network = sched.network(1);
const auto& b1 = network.node("B1");
BOOST_CHECK(b1.as_choke());
BOOST_CHECK(!b1.add_gas_lift_gas());
BOOST_CHECK(b1.name() == b1.target_group());
BOOST_CHECK(!b1.terminal_pressure());
BOOST_CHECK_EQUAL(network.downtree_branches("PLAT-A").size(), 1);
for (const auto& b : network.downtree_branches("PLAT-A")) {
BOOST_CHECK_EQUAL(b.uptree_node(), "PLAT-A");
BOOST_CHECK(b.downtree_node() == "B1");
}
const auto& platform_uptree = network.uptree_branch("PLAT-A");
BOOST_CHECK(!platform_uptree.has_value());
const auto& B1_uptree = network.uptree_branch("B1");
BOOST_CHECK(B1_uptree.has_value());
BOOST_CHECK_EQUAL(B1_uptree->downtree_node(), "B1");
BOOST_CHECK_EQUAL(B1_uptree->uptree_node(), "PLAT-A");
BOOST_CHECK_THROW( network.uptree_branch("C1"), std::out_of_range);
BOOST_CHECK_THROW( network.node("C1"), std::out_of_range);
BOOST_CHECK(network.active());
}
}