Adding leakage model

This commit is contained in:
Lew Rossman
2024-06-26 11:15:01 -04:00
parent cc9105fda6
commit b0796f346a
25 changed files with 1365 additions and 221 deletions

93
tests/test_leakage.cpp Normal file
View File

@@ -0,0 +1,93 @@
/*
******************************************************************************
Project: OWA EPANET
Version: 2.3
Module: test_leakage.cpp
Description: Tests EPANET toolkit api functions
Authors: see AUTHORS
Copyright: see AUTHORS
License: see LICENSE
Last Updated: 06/26/2024
******************************************************************************
*/
/*
Tests Pipe Leakage Feature
*/
#include <boost/test/unit_test.hpp>
#include "test_toolkit.hpp"
BOOST_AUTO_TEST_SUITE (test_leakage)
BOOST_AUTO_TEST_CASE(test_leakage_model)
//#include <stdio.h>
//#include <math.h>
//#include "epanet2_2.h"
//int main()
{
int error = 0;
int Pipe21, Junc21, Junc22;
double pipe21Leak, junc21Leak, junc22Leak;
EN_Project ph = NULL;
error = EN_createproject(&ph);
BOOST_REQUIRE(error == 0);
error = EN_open(ph, DATA_PATH_NET1, DATA_PATH_RPT, "");
// error = EN_open(ph, "Net1.inp", "Net1.rpt", "");
BOOST_REQUIRE(error == 0);
// single period analysis
error = EN_settimeparam(ph, EN_DURATION, 0);
BOOST_REQUIRE(error == 0);
// Get index of Pipe 21
error = EN_getlinkindex(ph, "21", &Pipe21);
BOOST_REQUIRE(error == 0);
// Set Pipe21 leak area to 1.0 sq mm per 100 ft of pipe
// and its expansion rate to 0.1 sq mm per ft of head
error = EN_setlinkvalue(ph, Pipe21, EN_LEAK_AREA, 1.0);
BOOST_REQUIRE(error == 0);
error = EN_setlinkvalue(ph, Pipe21, EN_LEAK_EXPAN, 0.1);
BOOST_REQUIRE(error == 0);
// Solve for hydraulics
error = EN_solveH(ph);
BOOST_REQUIRE(error == 0);
// Compute Pipe 21 leakage flow using the FAVAD formula
// Note: we can't just sum the leak rates at both end nodes
// together since in general the nodes can have leakage
// contributed by other connecting pipes.
error = EN_getlinkvalue(ph, Pipe21, EN_LINK_LEAKAGE, &pipe21Leak);
BOOST_REQUIRE(error == 0);
// printf("\n Pipe leakage flow: %.4f", pipe21Leak);
// Retrieve leakage flow at end nodes
// Note: In this case all of the leakage at these nodes is from Pipe 21.
error = EN_getnodeindex(ph, "21", &Junc21);
BOOST_REQUIRE(error == 0);
error = EN_getnodeindex(ph, "22", &Junc22);
BOOST_REQUIRE(error == 0);
error = EN_getnodevalue(ph, Junc21, EN_LEAKAGEFLOW, &junc21Leak);
BOOST_REQUIRE(error == 0);
error = EN_getnodevalue(ph, Junc22, EN_LEAKAGEFLOW, &junc22Leak);
BOOST_REQUIRE(error == 0);
// Check that the sum of the node leakages equals the pipe leakage
//printf("\n Node leakage flow: %.4f\n", junc21Leak + junc22Leak);
BOOST_REQUIRE(abs(pipe21Leak - (junc21Leak+junc22Leak)) < 0.01);
// Clean up
error = EN_close(ph);
BOOST_REQUIRE(error == 0);
error = EN_deleteproject(ph);
BOOST_REQUIRE(error == 0);
// return 0;
}
BOOST_AUTO_TEST_SUITE_END()