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; bool has_node(const std::string& name) const;
void add_node(Node node); void add_node(Node node);
void add_branch(Branch branch); 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& node(const std::string& name) const;
const Node& root() const; const Node& root() const;
std::vector<Branch> downtree_branches(const std::string& node) 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) ); 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 { std::optional<Branch> ExtNetwork::uptree_branch(const std::string& node) const {
if (!this->has_node(node)) if (!this->has_node(node))

View File

@ -3286,12 +3286,16 @@ 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& downtree_node = record.getItem<BP::DOWNTREE_NODE>().get<std::string>(0);
const auto& uptree_node = record.getItem<BP::UPTREE_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); int vfp_table = record.getItem<BP::VFP_TABLE>().get<int>(0);
auto alq_eq = Network::Branch::AlqEqfromString( record.getItem<BP::ALQ_SURFACE_DENSITY>().get<std::string>(0)); if (vfp_table == 0)
if (alq_eq == Network::Branch::AlqEQ::ALQ_INPUT) { ext_network->drop_branch( uptree_node, downtree_node );
double alq_value = record.getItem<BP::ALQ>().get<double>(0); else {
ext_network->add_branch( Network::Branch(downtree_node, uptree_node, vfp_table, alq_value)); auto alq_eq = Network::Branch::AlqEqfromString( record.getItem<BP::ALQ_SURFACE_DENSITY>().get<std::string>(0));
} else if (alq_eq == Network::Branch::AlqEQ::ALQ_INPUT) {
ext_network->add_branch( Network::Branch(downtree_node, uptree_node, vfp_table, alq_eq)); double alq_value = record.getItem<BP::ALQ>().get<double>(0);
ext_network->add_branch( Network::Branch(downtree_node, uptree_node, vfp_table, alq_value));
} else
ext_network->add_branch( Network::Branch(downtree_node, uptree_node, vfp_table, alq_eq));
}
} }
this->updateNetwork(ext_network, report_step); this->updateNetwork(ext_network, report_step);
} }

View File

@ -189,40 +189,80 @@ NODEPROP
B1 1* YES NO 1* / B1 1* YES NO 1* /
C1 1* YES NO 'GROUP' / C1 1* YES NO 'GROUP' /
/ /
TSTEP
10 /
BRANPROP
-- Downtree Uptree #VFP ALQ
C1 PLAT-A 0 1* /
/
)"; )";
auto sched = make_schedule(deck_string); auto sched = make_schedule(deck_string);
const auto& network = sched.network(0); {
const auto& b1 = network.node("B1"); const auto& network = sched.network(0);
BOOST_CHECK( b1.as_choke() ); const auto& b1 = network.node("B1");
BOOST_CHECK(!b1.add_gas_lift_gas()); BOOST_CHECK(b1.as_choke());
BOOST_CHECK( b1.name() == b1.target_group()); BOOST_CHECK(!b1.add_gas_lift_gas());
BOOST_CHECK(!b1.terminal_pressure()); BOOST_CHECK(b1.name() == b1.target_group());
BOOST_CHECK(!b1.terminal_pressure());
const auto& p = network.node("PLAT-A"); const auto& p = network.node("PLAT-A");
BOOST_CHECK( p.terminal_pressure() ); BOOST_CHECK(p.terminal_pressure());
BOOST_CHECK_EQUAL( p.terminal_pressure().value() , 21 * 100000 ); BOOST_CHECK_EQUAL(p.terminal_pressure().value(), 21 * 100000);
BOOST_CHECK( p == network.root() ); BOOST_CHECK(p == network.root());
BOOST_CHECK_THROW( network.node("NO_SUCH_NODE"), std::out_of_range); BOOST_CHECK_THROW(network.node("NO_SUCH_NODE"), std::out_of_range);
BOOST_CHECK_EQUAL( network.downtree_branches("PLAT-A").size(), 2); BOOST_CHECK_EQUAL(network.downtree_branches("PLAT-A").size(), 2);
for (const auto& b : network.downtree_branches("PLAT-A")) { for (const auto& b : network.downtree_branches("PLAT-A")) {
BOOST_CHECK_EQUAL(b.uptree_node(), "PLAT-A"); BOOST_CHECK_EQUAL(b.uptree_node(), "PLAT-A");
BOOST_CHECK(b.downtree_node() == "B1" || b.downtree_node() == "C1"); BOOST_CHECK(b.downtree_node() == "B1" || b.downtree_node() == "C1");
}
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(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"); const auto& platform_uptree = network.uptree_branch("PLAT-A");
BOOST_CHECK( !platform_uptree.has_value() ); BOOST_CHECK(!platform_uptree.has_value());
const auto& B1_uptree = network.uptree_branch("B1"); const auto& B1_uptree = network.uptree_branch("B1");
BOOST_CHECK( B1_uptree.has_value() ); BOOST_CHECK(B1_uptree.has_value());
BOOST_CHECK_EQUAL( B1_uptree->downtree_node(), "B1" ); BOOST_CHECK_EQUAL(B1_uptree->downtree_node(), "B1");
BOOST_CHECK_EQUAL( B1_uptree->uptree_node(), "PLAT-A" ); BOOST_CHECK_EQUAL(B1_uptree->uptree_node(), "PLAT-A");
BOOST_CHECK( network.active() ); 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());
}
} }