OpenWaterAnalytics / EPANET

The Water Distribution System Hydraulic and Water Quality Analysis Toolkit
MIT License
272 stars 201 forks source link

Incorrect number of pipes in network representation #790

Open zannads opened 1 month ago

zannads commented 1 month ago

The library doesn't decrease the number of pipes (net.Npipes) when a pipe is removed from the network. See this example:

#include <iostream>
#include <string>

#include "epanet2_2.h"
#include "types.h"

int main() {
    int errcode=0;
    EN_Project ph=NULL;
    int errco = EN_createproject(&ph);
    if (errco > 100) return 1;

    errco = EN_open(ph, "Net1.inp", "Net1.rpt", "");
    if (errco > 100) return 2;

    // Print number of links and pipes
    int nlinks=0;
    errco = EN_getcount(ph, EN_LINKCOUNT, &nlinks);
    if (errco > 100) return 1;
    std::cout << "Number of links: " << nlinks << std::endl;
    std::cout << "Number of pipes: " << ph->network.Npipes << std::endl;

    std::cout << "Adding a pipe..." <<std::endl;
    int index=0;
    errco = EN_addlink(ph, "newDupLink", EN_PIPE, "12", "13", &index);
    if (errco > 100) return 2;
    errco = EN_setpipedata(ph, index, 5280, 12, 130, 0);
    if (errcode > 100 ) return 2;

    errco = EN_getcount(ph, EN_LINKCOUNT, &nlinks);
    if (errco > 100) return 2;
    std::cout << "Number of links: " << nlinks << std::endl;
    std::cout << "Number of pipes: " << ph->network.Npipes << std::endl;

    std::cout << "Removing the pipe..." <<std::endl;
    errco = EN_getlinkindex(ph, "newDupLink", &index);
    if (errco > 100) return 3;
    errco = EN_deletelink(ph, index, EN_UNCONDITIONAL);

    errco = EN_getcount(ph, EN_LINKCOUNT, &nlinks);
    if (errco > 100) return 3;
    std::cout << "Number of links: " << nlinks << std::endl;
    std::cout << "Number of pipes: " << ph->network.Npipes << std::endl;

    // Close 
    EN_close(ph);

    return 0;
}

This is not a critical bug as the variable Npipes can not be retrieved (you can only get the number of links and net.Nlinks is correctly decreased) and is actually never used. Unless types.h is included and one specifically accesses p->network.Npipes it is not possible to see this error. However, if in the future we allow to retrieve the number of pipes or this variable will be used for some reasons, this would become a critical bug.