diff --git a/opm/parser/eclipse/EclipseState/Schedule/Network/ExtNetwork.hpp b/opm/parser/eclipse/EclipseState/Schedule/Network/ExtNetwork.hpp index a1c9c3e28..ad11ce05f 100644 --- a/opm/parser/eclipse/EclipseState/Schedule/Network/ExtNetwork.hpp +++ b/opm/parser/eclipse/EclipseState/Schedule/Network/ExtNetwork.hpp @@ -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 downtree_branches(const std::string& node) const; diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/Network/ExtNetwork.cpp b/src/opm/parser/eclipse/EclipseState/Schedule/Network/ExtNetwork.cpp index 539632bcd..b62ff6809 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/Network/ExtNetwork.cpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/Network/ExtNetwork.cpp @@ -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 ExtNetwork::uptree_branch(const std::string& node) const { if (!this->has_node(node)) diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/Schedule.cpp b/src/opm/parser/eclipse/EclipseState/Schedule/Schedule.cpp index 590bb69f8..de7c25b8e 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/Schedule.cpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/Schedule.cpp @@ -3286,12 +3286,16 @@ void Schedule::handleBRANPROP(const DeckKeyword& keyword, std::size_t report_ste const auto& downtree_node = record.getItem().get(0); const auto& uptree_node = record.getItem().get(0); int vfp_table = record.getItem().get(0); - auto alq_eq = Network::Branch::AlqEqfromString( record.getItem().get(0)); - if (alq_eq == Network::Branch::AlqEQ::ALQ_INPUT) { - double alq_value = record.getItem().get(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)); + if (vfp_table == 0) + ext_network->drop_branch( uptree_node, downtree_node ); + else { + auto alq_eq = Network::Branch::AlqEqfromString( record.getItem().get(0)); + if (alq_eq == Network::Branch::AlqEQ::ALQ_INPUT) { + double alq_value = record.getItem().get(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); } diff --git a/tests/parser/NetworkTests.cpp b/tests/parser/NetworkTests.cpp index ed5476f9e..c4b819707 100644 --- a/tests/parser/NetworkTests.cpp +++ b/tests/parser/NetworkTests.cpp @@ -189,40 +189,80 @@ 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() ); - BOOST_CHECK(!b1.add_gas_lift_gas()); - BOOST_CHECK( b1.name() == b1.target_group()); - BOOST_CHECK(!b1.terminal_pressure()); + { + const auto& network = sched.network(0); + 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()); - const auto& p = network.node("PLAT-A"); - BOOST_CHECK( p.terminal_pressure() ); - BOOST_CHECK_EQUAL( p.terminal_pressure().value() , 21 * 100000 ); - BOOST_CHECK( p == network.root() ); + const auto& p = network.node("PLAT-A"); + BOOST_CHECK(p.terminal_pressure()); + BOOST_CHECK_EQUAL(p.terminal_pressure().value(), 21 * 100000); + 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); - for (const auto& b : network.downtree_branches("PLAT-A")) { - BOOST_CHECK_EQUAL(b.uptree_node(), "PLAT-A"); - BOOST_CHECK(b.downtree_node() == "B1" || b.downtree_node() == "C1"); + BOOST_CHECK_EQUAL(network.downtree_branches("PLAT-A").size(), 2); + for (const auto& b : network.downtree_branches("PLAT-A")) { + BOOST_CHECK_EQUAL(b.uptree_node(), "PLAT-A"); + 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"); - BOOST_CHECK( !platform_uptree.has_value() ); + 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" ); + 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() ); + 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()); + } }