Allow rerouting in standard network

This commit is contained in:
Vegard Kippe 2023-09-08 08:53:12 +02:00
parent 33c529652b
commit 0aa0af9f57
3 changed files with 39 additions and 2 deletions

View File

@ -38,6 +38,7 @@ public:
ExtNetwork() = default;
bool active() const;
void add_branch(Branch branch);
void add_or_replace_branch(Branch branch);
void drop_branch(const std::string& uptree_node, const std::string& downtree_node);
bool has_node(const std::string& name) const;
void update_node(Node node);

View File

@ -873,9 +873,9 @@ File {} line {}.)", wname, location.keyword, location.filename, location.lineno)
const auto alq_eq = Network::Branch::AlqEqfromString(record.getItem<ParserKeywords::GRUPNET::ALQ_SURFACE_DENSITY>().get<std::string>(0));
if (alq_eq == Network::Branch::AlqEQ::ALQ_INPUT) {
const double alq_value = record.getItem<ParserKeywords::GRUPNET::ALQ>().get<double>(0);
network.add_branch(Network::Branch(downtree_node, uptree_node, vfp_table, alq_value));
network.add_or_replace_branch(Network::Branch(downtree_node, uptree_node, vfp_table, alq_value));
} else {
network.add_branch(Network::Branch(downtree_node, uptree_node, vfp_table, alq_eq));
network.add_or_replace_branch(Network::Branch(downtree_node, uptree_node, vfp_table, alq_eq));
}
}
nodes.push_back(node);

View File

@ -86,6 +86,42 @@ void ExtNetwork::add_branch(Branch branch)
this->m_branches.push_back( std::move(branch) );
}
void ExtNetwork::add_or_replace_branch(Branch branch)
{
const std::string& uptree_node = branch.uptree_node();
const std::string& downtree_node = branch.downtree_node();
// Add any missing nodes
for (const std::string& nodename : { downtree_node, uptree_node }) {
if (!this->has_node(nodename)) {
this->m_nodes.insert_or_assign(nodename, Node{nodename});
}
if (!this->has_indexed_node_name(nodename)) {
this->add_indexed_node_name(nodename);
}
}
// Remote any other branch uptree from downtree_node
auto uptree_link = this->uptree_branch( downtree_node );
if (uptree_link.has_value()){
const auto& old_uptree_node = uptree_link.value().uptree_node();
this->drop_branch(old_uptree_node, downtree_node);
}
// Update existing branch
auto downtree_branches = this->downtree_branches( uptree_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()) {
*branch_iter = branch;
return;
}
}
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()) {