combining testing framework with python diff script

This commit is contained in:
sam hatchett
2015-12-17 13:22:28 -05:00
parent cb417ce08b
commit 1d8d2fb882
8 changed files with 188 additions and 6 deletions
+1 -1
View File
@@ -20,4 +20,4 @@ target_link_libraries (runepanet LINK_PUBLIC epanet m)
# the binary hydraulics file API
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.
+178
View File
@@ -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 -2
View File
@@ -7,14 +7,14 @@ for d in network_tests/*/ ; do
officialBinFile=${netfile%.*}.enb
candidateBinFile=${netfile%.*}-candidate.enb
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
echo "epanet run for $netfile SUCCESS"
else
echo "epanet run for $netfile FAILED"
returnValue=1
fi
if python compare_enb.py $officialBinFile $candidateBinFile
if python ENBinaryOutDiff.py $officialBinFile $candidateBinFile
then
echo "binary output for $netfile PASSED"
else
@@ -27,4 +27,9 @@ done
return $returnValue
}
cp ../build/CMake/buildproducts/bin/libENBinaryOut.* ./libENBinaryOut.so
cp ../tools/outputapi/*.py ./
test_networks
+1
View File
@@ -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 sysimport osfrom math import logfrom 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
View File
@@ -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 sysimport osfrom math import logfrom 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
View File
@@ -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␍