combining testing framework with python diff script
This commit is contained in:
@@ -20,4 +20,4 @@ target_link_libraries (runepanet LINK_PUBLIC epanet m)
|
|||||||
|
|
||||||
# the binary hydraulics file API
|
# the binary hydraulics file API
|
||||||
include_directories(../../tools/outputapi)
|
include_directories(../../tools/outputapi)
|
||||||
add_library(epanet_bin_out STATIC ../../tools/outputapi/outputapi.c)
|
add_library(ENBinaryOut SHARED ../../tools/outputapi/outputapi.c)
|
||||||
|
|||||||
Binary file not shown.
@@ -0,0 +1,178 @@
|
|||||||
|
[TITLE]
|
||||||
|
EPANET Example Network 1
|
||||||
|
A simple example of modeling chlorine decay. Both bulk and
|
||||||
|
wall reactions are included.
|
||||||
|
|
||||||
|
[JUNCTIONS]
|
||||||
|
;ID Elev Demand Pattern
|
||||||
|
10 710 0 ;
|
||||||
|
11 710 150 ;
|
||||||
|
12 700 150 ;
|
||||||
|
13 695 100 ;
|
||||||
|
21 700 150 ;
|
||||||
|
22 695 200 ;
|
||||||
|
23 690 150 ;
|
||||||
|
31 700 100 ;
|
||||||
|
32 710 100 ;
|
||||||
|
|
||||||
|
[RESERVOIRS]
|
||||||
|
;ID Head Pattern
|
||||||
|
9 800 ;
|
||||||
|
|
||||||
|
[TANKS]
|
||||||
|
;ID Elevation InitLevel MinLevel MaxLevel Diameter MinVol VolCurve
|
||||||
|
2 850 120 100 150 50.5 0 ;
|
||||||
|
|
||||||
|
[PIPES]
|
||||||
|
;ID Node1 Node2 Length Diameter Roughness MinorLoss Status
|
||||||
|
10 10 11 10530 18 100 0 Open ;
|
||||||
|
11 11 12 5280 14 100 0 Open ;
|
||||||
|
12 12 13 5280 10 100 0 Open ;
|
||||||
|
21 21 22 5280 10 100 0 Open ;
|
||||||
|
22 22 23 5280 12 100 0 Open ;
|
||||||
|
31 31 32 5280 6 100 0 Open ;
|
||||||
|
110 2 12 200 18 100 0 Open ;
|
||||||
|
111 11 21 5280 10 100 0 Open ;
|
||||||
|
112 12 22 5280 12 100 0 Open ;
|
||||||
|
113 13 23 5280 8 100 0 Open ;
|
||||||
|
121 21 31 5280 8 100 0 Open ;
|
||||||
|
122 22 32 5280 6 100 0 Open ;
|
||||||
|
|
||||||
|
[PUMPS]
|
||||||
|
;ID Node1 Node2 Parameters
|
||||||
|
9 9 10 HEAD 1 ;
|
||||||
|
|
||||||
|
[VALVES]
|
||||||
|
;ID Node1 Node2 Diameter Type Setting MinorLoss
|
||||||
|
|
||||||
|
[TAGS]
|
||||||
|
|
||||||
|
[DEMANDS]
|
||||||
|
;Junction Demand Pattern Category
|
||||||
|
|
||||||
|
[STATUS]
|
||||||
|
;ID Status/Setting
|
||||||
|
|
||||||
|
[PATTERNS]
|
||||||
|
;ID Multipliers
|
||||||
|
;Demand Pattern
|
||||||
|
1 1.0 1.2 1.4 1.6 1.4 1.2
|
||||||
|
1 1.0 0.8 0.6 0.4 0.6 0.8
|
||||||
|
|
||||||
|
[CURVES]
|
||||||
|
;ID X-Value Y-Value
|
||||||
|
;PUMP: Pump Curve for Pump 9
|
||||||
|
1 1500 250
|
||||||
|
|
||||||
|
[CONTROLS]
|
||||||
|
LINK 9 OPEN IF NODE 2 BELOW 110
|
||||||
|
LINK 9 CLOSED IF NODE 2 ABOVE 140
|
||||||
|
|
||||||
|
|
||||||
|
[RULES]
|
||||||
|
|
||||||
|
[ENERGY]
|
||||||
|
Global Efficiency 75
|
||||||
|
Global Price 0.0
|
||||||
|
Demand Charge 0.0
|
||||||
|
|
||||||
|
[EMITTERS]
|
||||||
|
;Junction Coefficient
|
||||||
|
|
||||||
|
[QUALITY]
|
||||||
|
;Node InitQual
|
||||||
|
10 0.5
|
||||||
|
11 0.5
|
||||||
|
12 0.5
|
||||||
|
13 0.5
|
||||||
|
21 0.5
|
||||||
|
22 0.5
|
||||||
|
23 0.5
|
||||||
|
31 0.5
|
||||||
|
32 0.5
|
||||||
|
9 1.0
|
||||||
|
2 1.0
|
||||||
|
|
||||||
|
[SOURCES]
|
||||||
|
;Node Type Quality Pattern
|
||||||
|
|
||||||
|
[REACTIONS]
|
||||||
|
;Type Pipe/Tank Coefficient
|
||||||
|
|
||||||
|
|
||||||
|
[REACTIONS]
|
||||||
|
Order Bulk 1
|
||||||
|
Order Tank 1
|
||||||
|
Order Wall 1
|
||||||
|
Global Bulk -.5
|
||||||
|
Global Wall -1
|
||||||
|
Limiting Potential 0.0
|
||||||
|
Roughness Correlation 0.0
|
||||||
|
|
||||||
|
[MIXING]
|
||||||
|
;Tank Model
|
||||||
|
|
||||||
|
[TIMES]
|
||||||
|
Duration 24:00
|
||||||
|
Hydraulic Timestep 1:00
|
||||||
|
Quality Timestep 0:05
|
||||||
|
Pattern Timestep 2:00
|
||||||
|
Pattern Start 0:00
|
||||||
|
Report Timestep 1:00
|
||||||
|
Report Start 0:00
|
||||||
|
Start ClockTime 12 am
|
||||||
|
Statistic None
|
||||||
|
|
||||||
|
[REPORT]
|
||||||
|
Status Yes
|
||||||
|
Summary No
|
||||||
|
Page 0
|
||||||
|
|
||||||
|
[OPTIONS]
|
||||||
|
Units GPM
|
||||||
|
Headloss H-W
|
||||||
|
Specific Gravity 1.0
|
||||||
|
Viscosity 1.0
|
||||||
|
Trials 40
|
||||||
|
Accuracy 0.001
|
||||||
|
CHECKFREQ 2
|
||||||
|
MAXCHECK 10
|
||||||
|
DAMPLIMIT 0
|
||||||
|
Unbalanced Continue 10
|
||||||
|
Pattern 1
|
||||||
|
Demand Multiplier 1.0
|
||||||
|
Emitter Exponent 0.5
|
||||||
|
Quality Chlorine mg/L
|
||||||
|
Diffusivity 1.0
|
||||||
|
Tolerance 0.01
|
||||||
|
|
||||||
|
[COORDINATES]
|
||||||
|
;Node X-Coord Y-Coord
|
||||||
|
10 20.00 70.00
|
||||||
|
11 30.00 70.00
|
||||||
|
12 50.00 70.00
|
||||||
|
13 70.00 70.00
|
||||||
|
21 30.00 40.00
|
||||||
|
22 50.00 40.00
|
||||||
|
23 70.00 40.00
|
||||||
|
31 30.00 10.00
|
||||||
|
32 50.00 10.00
|
||||||
|
9 10.00 70.00
|
||||||
|
2 50.00 90.00
|
||||||
|
|
||||||
|
[VERTICES]
|
||||||
|
;Link X-Coord Y-Coord
|
||||||
|
|
||||||
|
[LABELS]
|
||||||
|
;X-Coord Y-Coord Label & Anchor Node
|
||||||
|
6.99 73.63 "Source"
|
||||||
|
13.48 68.13 "Pump"
|
||||||
|
43.85 91.21 "Tank"
|
||||||
|
|
||||||
|
[BACKDROP]
|
||||||
|
DIMENSIONS 7.00 6.00 73.00 94.00
|
||||||
|
UNITS None
|
||||||
|
FILE
|
||||||
|
OFFSET 0.00 0.00
|
||||||
|
|
||||||
|
[END]
|
||||||
|
|||||||
@@ -7,14 +7,14 @@ for d in network_tests/*/ ; do
|
|||||||
officialBinFile=${netfile%.*}.enb
|
officialBinFile=${netfile%.*}.enb
|
||||||
candidateBinFile=${netfile%.*}-candidate.enb
|
candidateBinFile=${netfile%.*}-candidate.enb
|
||||||
echo "testing $netfile with known good binary output $officialBinFile"
|
echo "testing $netfile with known good binary output $officialBinFile"
|
||||||
if true ## path/to/runepanet $netfile ${netfile%.*}-candidate.rpt $candidateBinFile
|
if ../build/CMake/buildproducts/bin/runepanet $netfile ${netfile%.*}-candidate.rpt $candidateBinFile
|
||||||
then
|
then
|
||||||
echo "epanet run for $netfile SUCCESS"
|
echo "epanet run for $netfile SUCCESS"
|
||||||
else
|
else
|
||||||
echo "epanet run for $netfile FAILED"
|
echo "epanet run for $netfile FAILED"
|
||||||
returnValue=1
|
returnValue=1
|
||||||
fi
|
fi
|
||||||
if python compare_enb.py $officialBinFile $candidateBinFile
|
if python ENBinaryOutDiff.py $officialBinFile $candidateBinFile
|
||||||
then
|
then
|
||||||
echo "binary output for $netfile PASSED"
|
echo "binary output for $netfile PASSED"
|
||||||
else
|
else
|
||||||
@@ -27,4 +27,9 @@ done
|
|||||||
return $returnValue
|
return $returnValue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cp ../build/CMake/buildproducts/bin/libENBinaryOut.* ./libENBinaryOut.so
|
||||||
|
cp ../tools/outputapi/*.py ./
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
test_networks
|
test_networks
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
'''␍␍Compares Two EPANET binary output files.␍␍Author: Bryant E. McDonnell␍Date: 12/16/2015␍␍␍Compares the absolute value of two values against a given threshold value.␍␍*******************␍Command Line Arguments:␍␍python <OutDiff.py> <*.out 1> <*.out 2> ␍␍␍Returns True / False (Pass / Fail, respectively)␍␍␍*******************␍'''␍␍␍import sys␍import os␍from math import log␍from ENOutputWrapper import *␍␍def BinCompare(args):␍ # Some Error Checking for Command Line Arguments....␍ if len(args) < 3:␍ raise Exception("Not Enough Input Arguments: python <ENBinaryOutDiff.py> <*.out 1> <*.out 2>")␍# if not args[1].endswith('.out') or not args[2].endswith('.out'):␍# raise Exception("Wrong file extension: python <ENBinaryOutDiff.py> <*.out 1> <*.out 2>")␍ print(sys.argv[1],sys.argv[2])␍ ␍ dllLoc = ''␍ if (sys.platform == 'linux2' or sys.platform == 'darwin'):␍ dllLoc = os.getcwd() + '/libENBinaryOut.so'␍ else:␍ raise Exception("only implemented on mac/linux")␍ ␍ BinFile1 = OutputObject(dllLoc)␍ BinFile1.OpenOutputFile(args[1])␍ BinFile1.get_NetSize()␍ BinFile1.get_Times()␍␍ BinFile2 = OutputObject(dllLoc)␍ BinFile2.OpenOutputFile(args[2])␍␍ ####ENR_NodeAttribute;␍ ##ENR_demand = 0␍ ##ENR_head = 1␍ ##ENR_pressure = 2␍ ##ENR_quality = 3␍ NumberOfNodeAttr = 4␍␍ ####ENR_LinkAttribute;␍ ##ENR_flow = 0␍ ##ENR_velocity = 1␍ ##ENR_headloss = 2␍ ##ENR_avgQuality = 3␍ ##ENR_status = 4␍ ##ENR_setting = 5␍ ##ENR_rxRate = 6␍ ##ENT_frctnFctr = 7␍ NumberOfLinkAttr = 8␍␍ NumberOfPeriods = BinFile1.numPeriods␍␍ # Set Tolerances for each attribute␍ # demand, head, pressure, quality␍ NodeAttributeTolerances = [1e-6, 1e-6, 1e-6, 1e-6]␍ # flow, velocity, headloss, avgQuality, status, setting, rxRate, frctnFctr␍ LinkAttributeTolerances = [1e-6, 1e-6, 1e-6, 1e-6, 1e-6, 1e-6, 1e-6, 1e-6]␍␍ #Compare Node Attributes␍ for nodeAttrInd in range(NumberOfNodeAttr):␍ for TSind in range(NumberOfPeriods):␍ #Get 1 attribute for all nodes at time t␍ NodeAttributeOut1 = BinFile1.get_NodeAttribute(nodeAttrInd, TSind)␍ #Get 1 attribute for all nodes at time t␍ NodeAttributeOut2 = BinFile2.get_NodeAttribute(nodeAttrInd, TSind)␍ for Nodeind, NodeAttrVal in enumerate(NodeAttributeOut1):␍ if abs(NodeAttrVal - NodeAttributeOut2[Nodeind]) > 0:␍ diff = abs(NodeAttrVal - NodeAttributeOut2[Nodeind] )␍ if diff > NodeAttributeTolerances[nodeAttrInd]:␍ return False␍␍ #Compare Link Attributes ␍ for linkAttrInd in range(NumberOfLinkAttr):␍ for TSind in range(NumberOfPeriods):␍ #Get 1 attribute for all links at time t␍ LinkAttributeOut1 = BinFile1.get_NodeAttribute(linkAttrInd, TSind)␍ #Get 1 attribute for all links at time t␍ LinkAttributeOut2 = BinFile2.get_NodeAttribute(linkAttrInd, TSind)␍ for linkind, LinkAttrVal in enumerate(LinkAttributeOut1):␍ if abs(LinkAttrVal - LinkAttributeOut2[linkind]) > 0:␍ diff = abs(LinkAttrVal - LinkAttributeOut2[linkind] )␍ if diff > LinkAttributeTolerances[linkAttrInd]:␍ return False␍ return True␍␍␍if __name__ == '__main__':␍ if(BinCompare(sys.argv)):␍ sys.exit(0)␍ else:␍ sys.exit(1)␍
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
'''␍␍Compares Two EPANET binary output files.␍␍Author: Bryant E. McDonnell␍Date: 12/16/2015␍␍␍Compares the absolute value of two values against a given threshold value.␍␍*******************␍Command Line Arguments:␍␍python <OutDiff.py> <*.out 1> <*.out 2> ␍␍␍Returns True / False (Pass / Fail, respectively)␍␍␍*******************␍'''␍␍␍import sys␍import os␍from math import log␍from ENOutputWrapper import *␍␍def BinCompare(args):␍ # Some Error Checking for Command Line Arguments....␍ if len(args) < 3:␍ raise Exception("Not Enough Input Arguments: python <OutDiff.py> <*.out 1> <*.out 2>")␍ if args[1].endswith('.out') == False or args[2].endswith('.out') == False:␍ raise Exception("python <OutDiff.py> <*.out 1> <*.out 2>")␍ print(sys.argv[1],sys.argv[2])␍ dllLoc = os.getcwd() + '/' + 'outputAPI.dll'␍ ␍ BinFile1 = OutputObject(dllLoc)␍ BinFile1.OpenOutputFile(args[1])␍ BinFile1.get_NetSize()␍ BinFile1.get_Times()␍␍ BinFile2 = OutputObject(dllLoc)␍ BinFile2.OpenOutputFile(args[2])␍␍ ####ENR_NodeAttribute;␍ ##ENR_demand = 0␍ ##ENR_head = 1␍ ##ENR_pressure = 2␍ ##ENR_quality = 3␍ NumberOfNodeAttr = 4␍␍ ####ENR_LinkAttribute;␍ ##ENR_flow = 0␍ ##ENR_velocity = 1␍ ##ENR_headloss = 2␍ ##ENR_avgQuality = 3␍ ##ENR_status = 4␍ ##ENR_setting = 5␍ ##ENR_rxRate = 6␍ ##ENT_frctnFctr = 7␍ NumberOfLinkAttr = 8␍␍ NumberOfPeriods = BinFile1.numPeriods␍␍ # Set Tolerances for each attribute␍ # demand, head, pressure, quality␍ NodeAttributeTolerances = [1e-6, 1e-6, 1e-6, 1e-6]␍ # flow, velocity, headloss, avgQuality, status, setting, rxRate, frctnFctr␍ LinkAttributeTolerances = [1e-6, 1e-6, 1e-6, 1e-6, 1e-6, 1e-6, 1e-6, 1e-6]␍␍ #Compare Node Attributes␍ for nodeAttrInd in range(NumberOfNodeAttr):␍ for TSind in range(NumberOfPeriods):␍ #Get 1 attribute for all nodes at time t␍ NodeAttributeOut1 = BinFile1.get_NodeAttribute(nodeAttrInd, TSind)␍ #Get 1 attribute for all nodes at time t␍ NodeAttributeOut2 = BinFile2.get_NodeAttribute(nodeAttrInd, TSind)␍ for Nodeind, NodeAttrVal in enumerate(NodeAttributeOut1):␍ if abs(NodeAttrVal - NodeAttributeOut2[Nodeind]) > 0:␍ diff = abs(NodeAttrVal - NodeAttributeOut2[Nodeind] )␍ if diff > NodeAttributeTolerances[nodeAttrInd]:␍ return False␍␍ #Compare Link Attributes ␍ for linkAttrInd in range(NumberOfLinkAttr):␍ for TSind in range(NumberOfPeriods):␍ #Get 1 attribute for all links at time t␍ LinkAttributeOut1 = BinFile1.get_NodeAttribute(linkAttrInd, TSind)␍ #Get 1 attribute for all links at time t␍ LinkAttributeOut2 = BinFile2.get_NodeAttribute(linkAttrInd, TSind)␍ for linkind, LinkAttrVal in enumerate(LinkAttributeOut1):␍ if abs(LinkAttrVal - LinkAttributeOut2[linkind]) > 0:␍ diff = abs(LinkAttrVal - LinkAttributeOut2[linkind] )␍ if diff > LinkAttributeTolerances[linkAttrInd]:␍ return False␍ return True␍␍␍if __name__ == '__main__':␍ print(BinCompare(sys.argv))␍
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
##ENR_ElementType;␍ENR_node = 1␍ENR_link = 2␍␍##ENR_ApiFunction;␍ENR_getSeries = 1␍ENR_getAttribute = 2␍ENR_getResult = 3␍␍##ENR_ElementCount;␍ENR_nodeCount = 1␍ENR_tankCount = 2␍ENR_linkCount = 3␍ENR_pumpCount = 4␍ENR_valveCount = 5␍␍##ENR_Unit;␍ENR_flowUnits = 1␍ENR_pressUnits = 2␍␍##ENR_Time;␍ENR_reportStart = 1␍ENR_reportStep = 2␍ENR_simDuration = 3␍ENR_numPeriods = 4␍␍##ENR_NodeAttribute;␍ENR_demand = 0␍ENR_head = 1␍ENR_pressure = 2␍ENR_quality = 3␍␍##ENR_LinkAttribute;␍ENR_flow = 0␍ENR_velocity = 1␍ENR_headloss = 2␍ENR_avgQuality = 3␍ENR_status = 4␍ENR_setting = 5␍ENR_rxRate = 6␍ENT_frctnFctr = 7␍
|
|
||||||
Reference in New Issue
Block a user