wolfhece 2.1.127__py3-none-any.whl → 2.1.129__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wolfhece/PyDraw.py +52 -3
- wolfhece/PyPalette.py +36 -0
- wolfhece/PyParams.py +7 -3
- wolfhece/PyVertexvectors.py +579 -70
- wolfhece/apps/version.py +1 -1
- wolfhece/coupling/hydrology_2d.py +295 -192
- wolfhece/eikonal.py +13 -3
- wolfhece/hydrology/Catchment.py +153 -52
- wolfhece/hydrology/Comparison.py +29 -25
- wolfhece/hydrology/Optimisation.py +309 -178
- wolfhece/hydrology/PostProcessHydrology.py +6 -3
- wolfhece/hydrology/PyWatershed.py +93 -93
- wolfhece/hydrology/RetentionBasin.py +21 -14
- wolfhece/hydrology/SubBasin.py +128 -12
- wolfhece/hydrology/constant.py +3 -0
- wolfhece/hydrology/cst_exchanges.py +364 -38
- wolfhece/hydrology/plot_hydrology.py +32 -16
- wolfhece/hydrology/read.py +16 -6
- wolfhece/lagrange_multiplier.py +205 -0
- wolfhece/libs/WolfDll.dll +0 -0
- wolfhece/math_parser/calculator.py +1 -0
- wolfhece/pybridges.py +2 -2
- wolfhece/pypolygons_scen.py +2 -2
- wolfhece/radar/wolfradar.py +75 -22
- wolfhece/shapes/__init__.py +0 -0
- wolfhece/shapes/circle.py +335 -0
- wolfhece/wolf_array.py +834 -40
- wolfhece/wolfresults_2D.py +204 -13
- {wolfhece-2.1.127.dist-info → wolfhece-2.1.129.dist-info}/METADATA +5 -5
- {wolfhece-2.1.127.dist-info → wolfhece-2.1.129.dist-info}/RECORD +33 -30
- {wolfhece-2.1.127.dist-info → wolfhece-2.1.129.dist-info}/WHEEL +1 -1
- {wolfhece-2.1.127.dist-info → wolfhece-2.1.129.dist-info}/entry_points.txt +0 -0
- {wolfhece-2.1.127.dist-info → wolfhece-2.1.129.dist-info}/top_level.txt +0 -0
@@ -104,8 +104,8 @@ class RetentionBasin():
|
|
104
104
|
|
105
105
|
self.outletObj = None # object to compute the outlet
|
106
106
|
|
107
|
-
self.zData =
|
108
|
-
self.vData =
|
107
|
+
self.zData = None # height from z-v file stored
|
108
|
+
self.vData = None # volume from z-v file stored
|
109
109
|
self.zvInterpol = None
|
110
110
|
|
111
111
|
self.timeDelay = 0.0 # [s]????? -> A vérifier!!!
|
@@ -663,7 +663,7 @@ class RetentionBasin():
|
|
663
663
|
time_delta = datetime.timedelta(seconds=dt)
|
664
664
|
if(rangeData==[]):
|
665
665
|
rangeData = [beginDate,endDate]
|
666
|
-
x_date = drange(beginDate, endDate, time_delta)
|
666
|
+
x_date = drange(beginDate, endDate+time_delta, time_delta)
|
667
667
|
|
668
668
|
font11 = FontProperties()
|
669
669
|
font11.set_family('serif')
|
@@ -698,7 +698,8 @@ class RetentionBasin():
|
|
698
698
|
if(axis=="Hours"):
|
699
699
|
ax1.plot(x, y, label = name)
|
700
700
|
else:
|
701
|
-
|
701
|
+
x_plot = ph.check_drange_bug(x_date, y)
|
702
|
+
ax1.plot_date(x_plot, y, '-', label = name)
|
702
703
|
for iInlet in self.directFluxObj :
|
703
704
|
y = self.directFluxObj[iInlet].get_outFlow_global(typeOutFlow="Net", whichOutFlow=iInlet)
|
704
705
|
name = self.directFluxObj[iInlet].name + " " + iInlet
|
@@ -708,7 +709,8 @@ class RetentionBasin():
|
|
708
709
|
if(axis=="Hours"):
|
709
710
|
ax1.plot(x, y, '-.', label = name)
|
710
711
|
else:
|
711
|
-
|
712
|
+
x_plot = ph.check_drange_bug(x_date, y)
|
713
|
+
ax1.plot_date(x_plot, y, '-.', label = name)
|
712
714
|
|
713
715
|
for iOutFlow in self._outFlow:
|
714
716
|
y = self.get_outFlow_global(typeOutFlow="Net", whichOutFlow=iOutFlow)
|
@@ -716,16 +718,18 @@ class RetentionBasin():
|
|
716
718
|
if(axis=="Hours"):
|
717
719
|
ax1.plot(x, y, label = self.name+" "+iOutFlow, color='k')
|
718
720
|
else:
|
719
|
-
|
721
|
+
x_plot = ph.check_drange_bug(x_date, y)
|
722
|
+
ax1.plot_date(x_plot, y, '-', label = self.name+" "+iOutFlow, color='k')
|
720
723
|
|
721
724
|
if(plotRaw):
|
722
|
-
nameMainOut = list(self.
|
725
|
+
nameMainOut = list(self._outFlow.items())[0][0]
|
723
726
|
y = self.get_outFlow_global(typeOutFlow="Raw", whichOutFlow=nameMainOut)
|
724
727
|
|
725
728
|
if(axis=="Hours"):
|
726
729
|
ax1.plot(x, y, '--', label = self.name+' Raw', color='k')
|
727
730
|
else:
|
728
|
-
|
731
|
+
x_plot = ph.check_drange_bug(x_date, y)
|
732
|
+
ax1.plot(x_plot, y, '--', label = self.name+' Raw', color='k')
|
729
733
|
|
730
734
|
if(axis=="Hours"):
|
731
735
|
ax1.set_xlim(x[0], x[len(x)-1])
|
@@ -793,7 +797,8 @@ class RetentionBasin():
|
|
793
797
|
else:
|
794
798
|
y = self.hBank*np.ones(len(x))
|
795
799
|
else:
|
796
|
-
|
800
|
+
x_plot = ph.check_drange_bug(x_date, y)
|
801
|
+
ax2.plot_date(x_plot, y, '-', label = self.name)
|
797
802
|
if unitReservoir == "[m^3]":
|
798
803
|
y = self.volume*np.ones(len(x_date))
|
799
804
|
else:
|
@@ -807,9 +812,11 @@ class RetentionBasin():
|
|
807
812
|
ax2.grid()
|
808
813
|
else:
|
809
814
|
if unitReservoir == "[m^3]":
|
810
|
-
|
815
|
+
x_plot = ph.check_drange_bug(x_date, y)
|
816
|
+
ax2.plot_date(x_plot, y, '--', label = "Volume max")
|
811
817
|
else:
|
812
|
-
|
818
|
+
x_plot = ph.check_drange_bug(x_date, y)
|
819
|
+
ax2.plot_date(x_plot, y, '--', label = "Height max")
|
813
820
|
ax2.set_xlim(rangeData[0], rangeData[1])
|
814
821
|
|
815
822
|
|
@@ -868,7 +875,7 @@ class RetentionBasin():
|
|
868
875
|
|
869
876
|
if(volume==0.0):
|
870
877
|
h=0
|
871
|
-
elif(self.zData
|
878
|
+
elif(self.zData is not None):
|
872
879
|
if(volume>max(self.zvVtoHInterpol.x)):
|
873
880
|
# h = max(self.zvVtoHInterpol.y)
|
874
881
|
slope = (self.zvVtoHInterpol.y[-1]-self.zvVtoHInterpol.y[-2])/(self.zvVtoHInterpol.x[-1]-self.zvVtoHInterpol.x[-2])
|
@@ -888,7 +895,7 @@ class RetentionBasin():
|
|
888
895
|
|
889
896
|
if(h==0):
|
890
897
|
vol = 0
|
891
|
-
elif(self.zData
|
898
|
+
elif(self.zData is not None):
|
892
899
|
if(h>max(self.zvHtoVInterpol.x)):
|
893
900
|
# h_tmp=max(self.zvHtoVInterpol.x)
|
894
901
|
# vol = self.zvHtoVInterpol(h_tmp)
|
@@ -1747,7 +1754,7 @@ class RetentionBasin():
|
|
1747
1754
|
Returns the outFlow in the global time, i.e. the hydrograph to which the timeDelay is applied.
|
1748
1755
|
"""
|
1749
1756
|
if self.type == "HelleRB" :
|
1750
|
-
if whichOutFlow == self._outFlow.keys[0]:
|
1757
|
+
if whichOutFlow == list(self._outFlow.keys())[0]:
|
1751
1758
|
tD = self.timeDelay
|
1752
1759
|
else:
|
1753
1760
|
tD = self.downstreamObj[whichOutFlow].timeDelay
|
wolfhece/hydrology/SubBasin.py
CHANGED
@@ -989,6 +989,95 @@ class SubBasin:
|
|
989
989
|
print("ERROR: the dates read are not consitent with the dates already recored in this subbasin!")
|
990
990
|
sys.exit()
|
991
991
|
return timeArray[:index], outFlow[:index]
|
992
|
+
|
993
|
+
else:
|
994
|
+
# Valid for any hydro model with an assement module at the end, there is only 1 output to consider.
|
995
|
+
|
996
|
+
print("Reading the 1 outlet file ...")
|
997
|
+
matrixData = []
|
998
|
+
|
999
|
+
# Reading the overland flow file and time
|
1000
|
+
if(fileNames is None):
|
1001
|
+
subBasinName = os.path.join(workingDir, 'Subbasin_' + str(iDSorted), 'simul_')
|
1002
|
+
fileName = subBasinName + "out.txt"
|
1003
|
+
else:
|
1004
|
+
# The file can only be a string or a list with 1 string
|
1005
|
+
if(type(fileNames)==str):
|
1006
|
+
fileName = workingDir + fileNames[0]
|
1007
|
+
elif(type(fileNames)==list and len(fileNames)==1):
|
1008
|
+
fileName = workingDir + fileNames
|
1009
|
+
else:
|
1010
|
+
print("ERROR: Expecting only 1 file name for UH model!")
|
1011
|
+
sys.exit()
|
1012
|
+
|
1013
|
+
with open(fileName, newline = '') as fileID:
|
1014
|
+
data_reader = csv.reader(fileID, delimiter='\t')
|
1015
|
+
list_data = []
|
1016
|
+
i=0
|
1017
|
+
for raw in data_reader:
|
1018
|
+
if i>1:
|
1019
|
+
list_data.append(raw)
|
1020
|
+
i += 1
|
1021
|
+
matrixData = np.array(list_data).astype("float")
|
1022
|
+
timeArray = np.zeros(len(matrixData))
|
1023
|
+
# Init of the outflow array
|
1024
|
+
outFlow = np.zeros((len(matrixData),1),dtype=ct.c_double, order='F')
|
1025
|
+
|
1026
|
+
# Init the time properties if not already done
|
1027
|
+
if self.dateBegin is None or self.dateEnd is None or self.deltaT == 0:
|
1028
|
+
self.dateBegin = datetime.datetime(year=int(matrixData[0][2]), month=int(matrixData[0][1]), day=int(matrixData[0][0]),
|
1029
|
+
hour=int(matrixData[0][3]), minute=int(matrixData[0][4]), second=int(matrixData[0][5]),
|
1030
|
+
microsecond=0, tzinfo=datetime.timezone.utc)
|
1031
|
+
self.dateEnd = datetime.datetime(year=int(matrixData[-1][2]), month=int(matrixData[-1][1]), day=int(matrixData[-1][0]),
|
1032
|
+
hour=int(matrixData[-1][3]), minute=int(matrixData[-1][4]), second=int(matrixData[-1][5]),
|
1033
|
+
microsecond=0, tzinfo=datetime.timezone.utc)
|
1034
|
+
self.deltaT = (datetime.datetime(year=int(matrixData[1][2]), month=int(matrixData[1][1]), day=int(matrixData[1][0]),
|
1035
|
+
hour=int(matrixData[1][3]), minute=int(matrixData[1][4]), second=int(matrixData[1][5]),
|
1036
|
+
microsecond=0, tzinfo=datetime.timezone.utc) - self.dateBegin).total_seconds()
|
1037
|
+
|
1038
|
+
secondsInDay = 24*60*60
|
1039
|
+
prevDate = datetime.datetime(year=int(matrixData[0][2]), month=int(matrixData[0][1]), day=int(matrixData[0][0]), hour=int(matrixData[0][3]), minute=int(matrixData[0][4]), second=int(matrixData[0][5]), microsecond=0, tzinfo=datetime.timezone.utc)
|
1040
|
+
prevDate -= tzDelta
|
1041
|
+
if(self.dateBegin!=prevDate):
|
1042
|
+
print("ERROR: The first date in hydro data does not coincide with the one expected!")
|
1043
|
+
print("Date read = ", prevDate)
|
1044
|
+
print("Date expected = ", self.dateBegin)
|
1045
|
+
sys.exit()
|
1046
|
+
timeArray[0] = datetime.datetime.timestamp(prevDate)
|
1047
|
+
outFlow[0][0] = matrixData[0][6]
|
1048
|
+
|
1049
|
+
for i in range(1,len(matrixData)):
|
1050
|
+
currDate = datetime.datetime(year=int(matrixData[i][2]), month=int(matrixData[i][1]), day=int(matrixData[i][0]),
|
1051
|
+
hour=int(matrixData[i][3]), minute=int(matrixData[i][4]), second=int(matrixData[i][5]),
|
1052
|
+
microsecond=0, tzinfo=datetime.timezone.utc)
|
1053
|
+
currDate -= tzDelta
|
1054
|
+
prevDate = datetime.datetime(year=int(matrixData[i-1][2]), month=int(matrixData[i-1][1]), day=int(matrixData[i-1][0]),
|
1055
|
+
hour=int(matrixData[i-1][3]), minute=int(matrixData[i-1][4]), second=int(matrixData[i-1][5]),
|
1056
|
+
microsecond=0, tzinfo=datetime.timezone.utc)
|
1057
|
+
prevDate -= tzDelta
|
1058
|
+
diffDate = currDate - prevDate
|
1059
|
+
diffTimeInSeconds = diffDate.days*secondsInDay + diffDate.seconds
|
1060
|
+
timeArray[i] = datetime.datetime.timestamp(currDate)
|
1061
|
+
|
1062
|
+
outFlow[i][0] = matrixData[i][6]
|
1063
|
+
|
1064
|
+
if(self.dateEnd!=currDate):
|
1065
|
+
print("ERROR: The last date in hydro data does not coincide with the one expected!")
|
1066
|
+
print("Date read = ", currDate)
|
1067
|
+
print("Date expected = ", self.dateEnd)
|
1068
|
+
sys.exit()
|
1069
|
+
if(self.deltaT!=diffTimeInSeconds):
|
1070
|
+
print("Delta t read = ", diffTimeInSeconds)
|
1071
|
+
print("Delta t expected = ", self.deltaT)
|
1072
|
+
print("ERROR: The last timestep in hydro data does not coincide with the one expected!")
|
1073
|
+
sys.exit()
|
1074
|
+
# Save time array if it does not exist yet
|
1075
|
+
# Otherwise, check the consistency of the array with the time array of the object
|
1076
|
+
if(self.time is None):
|
1077
|
+
self.time=timeArray
|
1078
|
+
elif((self.time!=timeArray).all()):
|
1079
|
+
print("ERROR: the dates read are not consitent with the dates already recored in this subbasin!")
|
1080
|
+
sys.exit()
|
992
1081
|
|
993
1082
|
return timeArray, outFlow
|
994
1083
|
|
@@ -1152,7 +1241,8 @@ class SubBasin:
|
|
1152
1241
|
self._outFlow[nameOutFlow]["Raw"] = self.inletsRaw + tmpHydro
|
1153
1242
|
# Real hydrograph
|
1154
1243
|
self._outFlow[nameOutFlow]["Net"] = self.inlets + tmpHydro
|
1155
|
-
elif(self.model==cst.tom_VHM or self.model==cst.tom_2layers_linIF or self.model==cst.tom_2layers_UH
|
1244
|
+
elif(self.model==cst.tom_VHM or self.model==cst.tom_2layers_linIF or self.model==cst.tom_2layers_UH or
|
1245
|
+
self.model==cst.tom_HBV, self.model==cst.tom_SAC_SMA, self.model==cst.tom_NAM):
|
1156
1246
|
tmpOutFlow = np.sum(self.myHydro,1)*self.surfaceDrained/3.6
|
1157
1247
|
|
1158
1248
|
# Raw hydrograph
|
@@ -1459,7 +1549,8 @@ class SubBasin:
|
|
1459
1549
|
- the raw outlet: in black dashed line
|
1460
1550
|
"""
|
1461
1551
|
|
1462
|
-
if(self.model==cst.tom_UH or self.model==cst.tom_2layers_linIF or self.model==cst.tom_2layers_UH or self.model==cst.tom_GR4
|
1552
|
+
if(self.model==cst.tom_UH or self.model==cst.tom_2layers_linIF or self.model==cst.tom_2layers_UH or self.model==cst.tom_GR4 or
|
1553
|
+
self.model==cst.tom_HBV, self.model==cst.tom_SAC_SMA, self.model==cst.tom_NAM):
|
1463
1554
|
# x = self.time/3600.0
|
1464
1555
|
if(axis=="Hours"):
|
1465
1556
|
x = (self.time[:]-self.time[0])/3600.0
|
@@ -1663,6 +1754,9 @@ class SubBasin:
|
|
1663
1754
|
elif(self.model==cst.tom_2layers_linIF or self.model==cst.tom_2layers_UH):
|
1664
1755
|
nbElements = 3
|
1665
1756
|
lastElement = 0
|
1757
|
+
else:
|
1758
|
+
nbElements = 1
|
1759
|
+
lastElement = 0
|
1666
1760
|
|
1667
1761
|
# Construction of the list of element to plot on the main hydrograph
|
1668
1762
|
myOutFlow = self.outFlow_global
|
@@ -1675,7 +1769,7 @@ class SubBasin:
|
|
1675
1769
|
y[:,i] = self.myHydro[:,i]*self.surfaceDrained/3.6
|
1676
1770
|
tmpSum += self.myHydro[:,i]*self.surfaceDrained/3.6
|
1677
1771
|
y[:,-1] = tmpSum
|
1678
|
-
elif(self.model==cst.tom_GR4):
|
1772
|
+
elif(self.model==cst.tom_GR4 or self.model==cst.tom_HBV, self.model==cst.tom_SAC_SMA, self.model==cst.tom_NAM):
|
1679
1773
|
y[:,0] = self.myHydro[:,0]*self.surfaceDrained/3.6
|
1680
1774
|
else:
|
1681
1775
|
print("ERROR: this model was not implemented yet!")
|
@@ -1703,9 +1797,11 @@ class SubBasin:
|
|
1703
1797
|
y_titles.append("Overland flow")
|
1704
1798
|
y_titles.append("Interflow")
|
1705
1799
|
y_titles.append("Total")
|
1800
|
+
else:
|
1801
|
+
y_titles.append("Total")
|
1706
1802
|
|
1707
1803
|
if(Measures is not None):
|
1708
|
-
y_titles.append("
|
1804
|
+
y_titles.append("Measurement")
|
1709
1805
|
|
1710
1806
|
# Colors of the plot
|
1711
1807
|
myColors = []
|
@@ -1821,6 +1917,9 @@ class SubBasin:
|
|
1821
1917
|
# nbElements = 3
|
1822
1918
|
nbElements = 1
|
1823
1919
|
lastElement = 0
|
1920
|
+
else:
|
1921
|
+
nbElements = 1
|
1922
|
+
lastElement = 0
|
1824
1923
|
|
1825
1924
|
|
1826
1925
|
# Take into account any additionnal data given and add it to plot
|
@@ -1882,7 +1981,8 @@ class SubBasin:
|
|
1882
1981
|
tmpSum = np.zeros(len(myOutFlow)-lastElement)
|
1883
1982
|
# y = np.zeros((len(self.outFlow)-lastElement,nbElements))
|
1884
1983
|
y = []
|
1885
|
-
if(self.model==cst.tom_UH or self.model==cst.tom_2layers_linIF or self.model==cst.tom_2layers_UH or
|
1984
|
+
if(self.model==cst.tom_UH or self.model==cst.tom_2layers_linIF or self.model==cst.tom_2layers_UH or
|
1985
|
+
cst.tom_GR4 or cst.tom_HBV or cst.tom_SAC_SMA or cst.tom_NAM):
|
1886
1986
|
if(withDelay):
|
1887
1987
|
# y[:,0] = self.outFlow[:-1]
|
1888
1988
|
y.append(myOutFlow[:])
|
@@ -1949,10 +2049,11 @@ class SubBasin:
|
|
1949
2049
|
# y_titles.append("Interflow")
|
1950
2050
|
# y_titles.append("Baseflow")
|
1951
2051
|
# y_titles.append("Total")
|
1952
|
-
y_titles.append('Débits simulés')
|
1953
|
-
elif(self.model==cst.tom_UH or self.model==cst.tom_2layers_linIF or self.model==cst.tom_2layers_UH
|
2052
|
+
y_titles.append(_('Débits simulés'))
|
2053
|
+
elif(self.model==cst.tom_UH or self.model==cst.tom_2layers_linIF or self.model==cst.tom_2layers_UH or
|
2054
|
+
self.model==cst.tom_HBV or self.model==cst.tom_SAC_SMA or self.model==cst.tom_NAM):
|
1954
2055
|
if(ylabel==[]):
|
1955
|
-
y_titles.append('Débits simulés')
|
2056
|
+
y_titles.append(_('Débits simulés'))
|
1956
2057
|
# y_titles.append('Avec reconstruction Qout B. Vesdre')
|
1957
2058
|
# y_titles.append('Avec Qout décrit par Le Soir au B. Vesdre')
|
1958
2059
|
# y_titles.append('Débits nuls aux barrages')
|
@@ -1980,7 +2081,7 @@ class SubBasin:
|
|
1980
2081
|
|
1981
2082
|
if(Measures is not None):
|
1982
2083
|
# y_titles.append("Measures")
|
1983
|
-
y_titles.append("
|
2084
|
+
y_titles.append("Measurement")
|
1984
2085
|
# y_titles.append("Débits entrant reconstruits")
|
1985
2086
|
|
1986
2087
|
# Colors of the plot
|
@@ -2307,6 +2408,14 @@ class SubBasin:
|
|
2307
2408
|
myOutFlow *= 3.6/self.surfaceDrainedHydro
|
2308
2409
|
|
2309
2410
|
return myOutFlow
|
2411
|
+
|
2412
|
+
|
2413
|
+
def get_outFlow_at_time(self, time:datetime.datetime, typeOutFlow:str="Net", unit:str='m3/s', whichOutFlow="", lag:float=0.0):
|
2414
|
+
if time.tzname() != "UTC":
|
2415
|
+
logging.warning(f"Time {time} is not in UTC! Be aware that the time will keep the time zone you defined !")
|
2416
|
+
|
2417
|
+
return self.get_outFlow(typeOutFlow=typeOutFlow, unit=unit, whichOutFlow=whichOutFlow, lag=lag)[np.where(self.time==time.timestamp())][0]
|
2418
|
+
|
2310
2419
|
|
2311
2420
|
def get_inlets(self, unit:str='m3/s', lag:float=0.0):
|
2312
2421
|
|
@@ -2421,13 +2530,20 @@ class SubBasin:
|
|
2421
2530
|
|
2422
2531
|
|
2423
2532
|
|
2424
|
-
def plot_diff_cumulRain_with_lagtime(self, interval, lagTime, graph_title="", factor=1.5, writeDir="", lawNetRain=cst.tom_netRain_no, netRainParams={}):
|
2533
|
+
def plot_diff_cumulRain_with_lagtime(self, interval=0.0, lagTime=0.0, graph_title="", factor=1.5, writeDir="", lawNetRain=cst.tom_netRain_no, netRainParams={}):
|
2425
2534
|
"""
|
2426
2535
|
@var interval interval to consider in the gliding sum [sec]
|
2427
2536
|
@var lagTime time to skip before applyihng the current rain [sec]
|
2428
2537
|
"""
|
2429
|
-
|
2430
|
-
|
2538
|
+
if interval==0:
|
2539
|
+
nbIntervals = len(self.myRain)
|
2540
|
+
else:
|
2541
|
+
nbIntervals = math.ceil(interval/self.deltaT)
|
2542
|
+
|
2543
|
+
if lagTime==0:
|
2544
|
+
nbLagSteps = 0
|
2545
|
+
else:
|
2546
|
+
nbLagSteps = math.ceil(lagTime/self.deltaT)
|
2431
2547
|
|
2432
2548
|
if(lawNetRain==cst.tom_netRain_no):
|
2433
2549
|
rain = self.myRain
|