From 1ae38ab34bcbdff622c7623119ee54bad419f4ed Mon Sep 17 00:00:00 2001
From: zmk <496160012@qq.com>
Date: 星期三, 28 八月 2024 16:11:08 +0800
Subject: [PATCH] 提交代码
---
Base.py | 45
OpenExcel.py | 61
AchiveReport.py | 494 ++++++
GRU_zmk.py | 275 +++
GRU_zmk_pre.py | 267 +++
CalHead.py | 908 ++++++++++--
DataTransf.py | 526 +++++++
/dev/null | 22
MainAPI.py | 620 ++++----
Predict.py | 303 +++
DataTask.py | 325 ++++
GRU_zmk_pre - 副本.py | 215 ++
WaterXBL.py | 77 +
main.py | 60
BigData.py | 39
ModelPeriod.py | 7
Base-dev.py | 173 ++
17 files changed, 3,852 insertions(+), 565 deletions(-)
diff --git a/AchiveReport.py b/AchiveReport.py
new file mode 100644
index 0000000..4abf631
--- /dev/null
+++ b/AchiveReport.py
@@ -0,0 +1,494 @@
+import matplotlib.pyplot as plt
+from matplotlib import cm
+import numpy as np
+import math
+from docxtpl import DocxTemplate
+import flopy
+import flopy.utils.binaryfile as bf
+from matplotlib import cm, colors
+import os
+import time
+import Base as base
+import CalHead
+import WaterXBL
+
+#鑾峰彇Z鍊�
+def get_flow_Z(model_name,per,layer):
+ dir = base.model_dir + model_name + "\\modflow.head"
+ mlist = CalHead.muiltyModelList()
+ if model_name==base.not_allowed_model:
+ dir = base.baseModel2 + "\\modflow.head"
+ if model_name in mlist :
+ dir = base.muiltyModel + model_name + "\\modflow.head"
+
+ head = bf.HeadFile(dir)
+ alldata = head.get_alldata()
+ #鑾峰彇鍛ㄦ湡鏁版嵁
+ z = alldata[int(per+1)*3-1,int(layer),:,:]
+ z[(z<=0)] = 0
+ return z
+
+#璇诲彇base6鏂囦欢璇诲彇鍒濆姘翠綅
+def get_init_flowZ(model_name,layer):
+ model_ws = base.model_dir + model_name
+ ml = flopy.modflow.Modflow.load("modflow.nam", model_ws=model_ws,
+ exe_name="mf2005", verbose=True, version="mf2005", check=False)
+
+ strs = ml.bas6.strt.__getitem__(layer)
+ z = strs.get_value()
+ z[(z<=0)] = 0
+
+ #澶勭悊楠岃瘉妯″瀷鐨勬棤鏁堣竟鐣�
+ if model_name==base.not_allowed_model:
+ arr = np.loadtxt(base.areapath, dtype=int)
+ for i in range(len(arr)):
+ for j in range(len(arr[i])):
+ if arr[i][j] == -9999:
+ z[i][j]=0
+ return z
+
+#鑾峰彇娴佸満鍥剧殑鎵撲簡绛夊�肩嚎鏁扮粍
+def get_flow_levels(data):
+ maxdata= np.max(data)
+ levels=[]
+ levels.append(0.1)
+ lines = 10
+ while lines < maxdata:
+ levels.append(lines)
+ lines = lines + 10
+ levels.append(math.ceil(maxdata))
+ return levels
+
+
+#鑾峰彇鍙樺箙姣旇緝灏忕殑绛夊�肩嚎鍥�
+def get_flow_levels_small(min , max, line_count):
+
+ step = round((max-min)/line_count,0)
+ if step <= 0:
+ step = 0.5
+ levels=[]
+ levels.append(min)
+ lines = min + step
+ while lines < max:
+ levels.append(lines)
+ lines = lines + step
+ levels.append(max)
+ return levels
+
+#鑾峰彇鍙樺箙鐨刏鍊�
+def get_bf_z(model_name,per1,per2):
+
+ dir = base.model_dir + model_name + "\\modflow.head"
+ mlist = CalHead.muiltyModelList()
+ if model_name==base.not_allowed_model:
+ dir = base.baseModel2 + "\\modflow.head"
+ if model_name in mlist :
+ dir = base.muiltyModel + model_name + "\\modflow.head"
+
+ head = bf.HeadFile(dir)
+ alldata = head.get_alldata()
+
+ #鍙樺箙鍊�
+ z1= alldata[int(per1+1)*3-1,0,:,:]
+ z2 = alldata[int(per2+1)*3-1,0,:,:]
+ res = np.subtract(z2,z1)
+ return res
+
+
+#鑾峰彇鍙樺箙鐨勬祦鍦哄浘
+def getFlowFieldBF(model_name,per1,per2,outpath):
+ res = get_bf_z(model_name,per1,per2)
+ max = np.max(res)
+ min = np.min(res)
+ # 鎶婃棤鏁堝尯璁剧疆涓�9999
+ arr = np.loadtxt(base.areapath, dtype=int)
+ for i in range(len(arr)):
+ for j in range(len(arr[i])):
+ if arr[i][j] == -9999:
+ res[i][j]= 9999.0
+ levels= get_flow_levels_small(min,max,10)
+ draw_flow(res,levels,outpath,cm.RdBu_r)
+
+ str_levs=[]
+ for item in levels:
+ str_levs.append(str(round(item,2)))
+
+ cols = get_gradient_color_list("RdBu_r",len(levels))
+ dicts ={"levels":str_levs,"colors":cols}
+ xbl = WaterXBL.get_grd_storage(model_name,int(per1),int(per2))
+ dicts["xbl"]=xbl
+ return dicts
+
+#鑾峰彇鍙樺箙 鍩嬫繁
+def getFlowFieldDepth(model_name,per,layer,title,flow_types,out_path):
+ Z= get_flow_Z(model_name,per,layer)
+ dis = np.loadtxt(base.dis_top_path, dtype=str)
+ areaMatrix = np.loadtxt(base.areapath, dtype=int)
+ for i in range(len(areaMatrix)):
+ for j in range(len(areaMatrix[i])):
+ if areaMatrix[i][j] == -9999:
+ Z[i][j] =0.0
+ else :
+ Z[i][j] =float(dis[i][j])-Z[i][j]
+
+ levels=[10,30,40,60,100,200,300,400,500,700,900]
+ draw_flow(Z,levels,out_path,cm.RdBu_r)
+ cols = get_gradient_color_list("RdBu_r",len(levels))
+ dicts ={"levels":levels,"colors":cols}
+ return dicts
+
+
+def getWaterResFiled(model_name,per):
+ pic = str(int(time.time())) +".png"
+ outpath = base.flow_file + pic
+ flow_field(model_name,per,0,"flow","online",outpath)
+ return pic
+
+#娴佸満鍥�
+def flow_field(model_name,per,layer,title,flow_types,out_path):
+ Z= get_flow_Z(model_name,per,layer)
+ levels = get_flow_levels(Z)
+ draw_flow(Z,levels,out_path,cm.RdBu)
+ cols = get_gradient_color_list("RdBu",len(levels))
+ dicts ={"levels":levels,"colors":cols}
+ return dicts
+
+
+#鍒濆娴佸満鍥�
+def init_flow_field(model_name,layer,title,flow_types,out_path):
+ #濡傛灉鏄獙璇佹ā鍨嬬洿鎺ヨ鍙朾ase6鐨勬枃浠跺綋鍋氬垵濮嬫按澶�
+ if model_name == base.not_allowed_model:
+ Z= get_init_flowZ(model_name,layer)
+ levels = get_flow_levels(Z)
+ draw_flow(Z,levels,out_path,cm.RdBu)
+ else:
+ pjson= CalHead.get_model_json(model_name)
+ if "initHeader" in pjson:
+ initHead = pjson["initHeader"]
+ print(initHead)
+ Z= get_flow_Z(initHead,0,0)
+ levels = get_flow_levels(Z)
+ draw_flow(Z,levels,out_path,cm.RdBu)
+ else:
+ return "#"
+ print(out_path)
+ return out_path
+
+
+ #缁樺埗娴佸満
+def draw_flow(Z,levels,out_path,colorbar):
+
+ #寮�濮嬬粯鍒舵祦鍦哄浘
+ x = np.arange(0, 114, 1)
+ y = np.arange(0, 104, 1)
+ #缃戞牸
+ X, Y = np.meshgrid(x, y)
+ #鍧愭爣杞寸炕杞� 宸︿笂瑙掍负璧峰
+ plt.gca().invert_yaxis()
+ #绛夊�肩嚎
+ C = plt.contour(X, Y, Z, levels=levels, linewidths=0.5, colors='white')
+ #绛夊�肩嚎鏍峰紡
+ plt.clabel(C, inline=2,fmt='%.2f', fontsize=4,colors='black')
+ #缁樺埗绛夊�肩嚎涔嬮棿鐨勫~鍏� # cmap="RdBu_r" cm.RdBu_r
+ plt.contourf(X, Y, Z,levels= levels,alpha = 0.75,cmap=colorbar)
+
+ plt.axis("off")
+ plt.colorbar().ax.set_visible(False)
+ plt.xticks([])
+ plt.yticks([])
+
+ plt.savefig(out_path, dpi=300,transparent=True, bbox_inches='tight')
+ plt.close('all')
+ return out_path
+
+
+def get_gradient_color_list(m_color_name, m_num):
+ m_color_list = []
+ m_color_map = plt.get_cmap(m_color_name, m_num)
+ for m_i in range(m_num):
+ m_color = tuple([int(_ * 256) for _ in list(m_color_map([m_i][0])[:-1])])
+ m_color_list.append(m_color)
+ return m_color_list
+
+#瀵煎嚭妯℃澘
+def exportReport(model_name,period):
+ tpl = DocxTemplate(base.prefix + '鍦颁笅姘村彂甯冧俊鎭ā鏉�.docx')
+ cont = archive_report_content(model_name,period)
+ tpl.render(cont)
+ save_path=""
+ tpl.save(save_path)
+
+
+#鎶ュ憡淇℃伅
+def archive_report_content(model_name,period):
+ data1 = archive_grd_depth(model_name,period)
+ data2= archive_grd_res(model_name,period)
+
+ #鍒濆娴佸満
+ initpic = str(int(time.time())) +"1.png"
+ outpath = base.flow_file + initpic
+ flow_field(model_name,0,0,"鍒濆娴佸満淇℃伅", "online",outpath)
+
+ currentpic = str(int(time.time())) +"2.png"
+ outpath2 = base.flow_file + currentpic
+ flow_field(model_name,int(period),0,"娴佸満淇℃伅", "online",outpath2)
+
+ content={
+ "py_avg_water":str(data1[0]),
+ "py_m_water":str(data1[1]),
+ "py_y_water":str(data1[2]),
+
+ "sq_avg_water":str(data1[3]),
+ "sq_m_water":str(data1[4]),
+ "sq_y_water":str(data1[5]),
+
+ "yq_avg_water":str(data1[6]),
+ "yq_m_water":str(data1[7]),
+ "yq_y_water":str(data1[8]),
+
+ "w_m_res":str(data2[0]),
+ "w_y_res":str(data2[1]),
+ "flow1":"/xishan/xinshanFlow/"+initpic,
+ "flow2":"/xishan/xinshanFlow/"+currentpic
+ }
+ if data1[1]>=0:
+ content["py_m_water"]= "鍥炲崌"+str(abs(data1[1]))
+ else:
+ content["py_m_water"]= "涓嬮檷"+str(abs(data1[1]))
+
+ if data1[2]>=0:
+ content["py_y_water"]= "鍥炲崌"+str(abs(data1[2]))
+ else:
+ content["py_y_water"]= "涓嬮檷"+str(abs(data1[2]))
+
+ if data1[4]>=0:
+ content["sq_m_water"]= "鍥炲崌"+str(abs(data1[4]))
+ else:
+ content["sq_m_water"]= "涓嬮檷"+str(abs(data1[4]))
+
+ if data1[5]>=0:
+ content["sq_y_water"]= "鍥炲崌"+str(abs(data1[5]))
+ else:
+ content["sq_y_water"]= "涓嬮檷"+str(abs(data1[5]))
+
+ if data1[7]>=0:
+ content["yq_m_water"]= "鍥炲崌"+str(abs(data1[7]))
+ else:
+ content["yq_m_water"]= "涓嬮檷"+str(abs(data1[7]))
+
+ if data1[8]>=0:
+ content["yq_y_water"]= "鍥炲崌"+str(abs(data1[8]))
+ else:
+ content["yq_y_water"]= "涓嬮檷"+str(abs(data1[8]))
+
+ if data2[1]>=0:
+ content["w_y_res"]= "澧炲姞"+str(abs(data2[1]))
+ else:
+ content["w_y_res"]= "鍑忓皯"+str(abs(data2[1]))
+ return content
+
+ #姘磋祫婧愰噺
+def archive_grd_res(model_name,period):
+ txt_path = base.model_dir + model_name + "\\water_res.txt"
+ if not os.path.exists(txt_path):
+ CalHead.run_zonebudget_res(model_name)
+
+ monthdata = CalHead.water_res_month(model_name,txt_path,int(period))
+ monthdata2=[]
+ if int(period) > 0:
+ monthdata2 = CalHead.water_res_month(model_name,txt_path,int(period-1))
+ else:
+ monthdata2 = monthdata
+
+ water1 = monthdata[0] + monthdata[1]+ monthdata[2]- monthdata[3]
+ water2 = monthdata2[0] + monthdata2[1] + monthdata2[2] - monthdata2[3]
+ water1 = round(water1 ,4)
+ wat= round(water1-water2 ,4)
+
+ return [water1,wat]
+
+#鐢熸垚鏈堝害鎶ュ憡鐨勫唴瀹瑰湴涓嬫按娣�
+def archive_grd_depth(model_name,period):
+ model_dir = base.model_dir + model_name + "\\modflow.head"
+ head = bf.HeadFile(model_dir)
+ alldata = head.get_alldata()
+
+ #鑾峰彇鏈堝害鏁版嵁
+ per = int(period)
+ current_month_data=[]
+ pre_month_data=[]
+ pre_year_data=[]
+
+ if per > 0:
+ current_month_data = alldata[int(per+1)*3-1,0,:,:]
+ pre_month_data= alldata[int(per)*3-1,0,:,:]
+ else :
+ current_month_data = alldata[int(per+1)*3-1,0,:,:]
+ pre_month_data= current_month_data
+
+ mpdict = getMPDict()
+ YQSDict = getYQSDict()
+ pingyuanArray = mpdict["1"]
+ shanquArray = mpdict["2"]
+ yqArray = YQSDict["1"]
+
+ #楂樼▼鍧愭爣
+ gc_array= np.array(getTopDis())
+ depth_array = np.subtract(gc_array,current_month_data)
+
+ py_data,py_data2 = 0,0
+ sq_data, sq_data2 = 0,0
+ yqs_data , yqs_data2 = 0,0
+ # 鍩嬫繁
+ py_depth,sq_depth,yqs_depth =0,0,0
+ k,m,n =0,0,0
+ for item in pingyuanArray:
+ i,j = item[0],item[1]
+ if current_month_data[i,j]>0:
+ py_depth += depth_array[i,j]
+ py_data += current_month_data[i,j]
+ k+=1
+ if pre_month_data[i,j]>0:
+ py_data2 += pre_month_data[i,j]
+
+ for item in shanquArray:
+ i,j = item[0],item[1]
+ if current_month_data[i,j]>0:
+ sq_depth += depth_array[i,j]
+ sq_data += current_month_data[i,j]
+ m+=1
+ if pre_month_data[i,j]>0:
+ sq_data2 += pre_month_data[i,j]
+
+ for item in yqArray:
+ i,j = item[0],item[1]
+ if current_month_data[i,j]>0:
+ yqs_depth += depth_array[i,j]
+ yqs_data += current_month_data[i,j]
+ n+=1
+ if pre_month_data[i,j]>0:
+ yqs_data2 += pre_month_data[i,j]
+
+ py_data = py_data/k
+ sq_data = sq_data/m
+ yqs_data= yqs_data/n
+
+ py_data2 = py_data2/k
+ sq_data2 = sq_data2/m
+ yqs_data2= yqs_data2/n
+
+ py_depth = py_depth/k
+ sq_depth = sq_depth/m
+ yqs_depth = yqs_depth/n
+
+
+ result=[py_depth,py_data-py_data2,0,
+ sq_depth,sq_data-sq_data2,0,
+ yqs_depth,yqs_data-yqs_data2,0]
+
+ for i in range(len(result)):
+ result[i]= round(result[i],2)
+
+ return result
+
+
+
+#鑾峰彇鐮旂┒鍖哄煙 灞卞尯 骞冲師鍖� 鐜夋硥灞卞尯鐨勬姌绾垮浘
+def getXs3LineChart(paths):
+
+ head = bf.HeadFile(paths)
+ alldata = head.get_alldata()
+ months = int(len(alldata)/3)
+
+ mpdict = getMPDict()
+ YQSDict = getYQSDict()
+
+ pingyuanArray = mpdict["1"]
+ shanquArray = mpdict["2"]
+ yqArray = YQSDict["1"]
+
+ result1=[]
+ result2=[]
+ result3=[]
+ for per in range(months):
+ current_month = alldata[int(per+1)*3-1,0,:,:]
+
+ yqs_data, py_data, sq_data = 0.0, 0.0, 0.0
+ M ,N,k = 0,0,0
+
+ for item in pingyuanArray:
+ i,j = item[0],item[1]
+ if current_month[i,j]>0:
+ py_data += current_month[i,j]
+ M+=1
+ py_data= round(py_data/M,2)
+ result1.append(py_data)
+
+ for item in shanquArray:
+ i,j = item[0],item[1]
+ if current_month[i,j]>0:
+ sq_data += current_month[i,j]
+ N+=1
+ sq_data= round(sq_data/N,2 )
+ result2.append(sq_data)
+
+ for item in yqArray:
+ i,j = item[0],item[1]
+ if current_month[i,j]>0:
+ yqs_data += current_month[i,j]
+ k+=1
+ yqs_data= round(yqs_data/k,2 )
+ result3.append(yqs_data)
+
+
+ dicts={"pyq":result1,"sq":result2,"yqs":result3}
+ return dicts
+
+
+
+#灞卞尯/骞冲師鍖虹殑瀛楀吀
+#骞冲師鍖�=1 灞卞尯 =2
+def getMPDict():
+ arr = np.loadtxt(base.xs_mp_path, dtype=int)
+ dict ={}
+ for i in range(len(arr)):
+ for j in range(len(arr[i])):
+ zb = str(arr[i][j])
+ if arr[i][j] == -9999:
+ continue
+ if zb not in dict:
+ dict[zb] = [(i,j)]
+ else:
+ dict[zb].append((i,j))
+ return dict
+
+#鐜夋硥灞辩殑瀛楀吀
+#鐜夋硥灞� = 1
+def getYQSDict():
+ arr = np.loadtxt(base.yqs_path, dtype=int)
+ dict ={}
+ for i in range(len(arr)):
+ for j in range(len(arr[i])):
+ zb = str(arr[i][j])
+ if arr[i][j] != 1:
+ continue
+ if zb not in dict:
+ dict[zb] = [(i,j)]
+ else:
+ dict[zb].append((i,j))
+ return dict
+
+#鑾峰彇楂樼▼
+def getTopDis():
+ arr = np.loadtxt(base.dis_top_path, dtype=str)
+ float_array = np.array(arr).astype("float")
+ return float_array
+
+
+
+
+
+
+
+
+
diff --git a/Base-dev.py b/Base-dev.py
new file mode 100644
index 0000000..4ba30e9
--- /dev/null
+++ b/Base-dev.py
@@ -0,0 +1,173 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Fri Oct 20 16:15:23 2023
+
+@author: ZMK
+"""
+
+import numpy as np
+import shutil
+import os
+
+
+# 鐢熸垚鐨勬祦鍦哄浘鏂囦欢
+flow_file ="D:\\javaCode\\xishan\\xishan\\xishan\\xinshanFlow\\"
+
+prefix ='C:\\Users\\86134\\Desktop\\xsModel2\\'
+
+ZoneBudget64Exe= prefix + "zonebuget\\ZoneBudget64.exe"
+
+water_bal_zones = prefix +"zonebuget\\water_bal.zones\n"
+water_res_zones = prefix +"zonebuget\\water_res.zones\n"
+
+water_lsh_path = prefix + "water_lsh.ini"
+water_yhy_path = prefix + "water_yhy.ini"
+water_dbw_path = prefix + "water_dbw.ini"
+
+
+baseModel = prefix + 'verifyModel\\'
+baseModel2 = prefix + 'verifyModel2\\'
+
+predictModel= prefix + 'predictModel\\'
+
+predictParamModel= prefix + 'predictParamModel\\'
+
+muiltyModel = prefix + 'muiltyModel\\'
+
+model_dir = prefix + '0612Model\\'
+
+obswellpath = prefix + '鐩戞祴浜�.ini'
+obswell_data_path= prefix + 'water_obs_data.ini'
+
+obs_well = np.loadtxt(obswellpath, dtype=str,encoding='utf-8')
+
+district_path = prefix +"鍖哄幙.ini"
+
+district= np.loadtxt(district_path, dtype=str,encoding='utf-8')
+
+pumpwellpath = prefix +'鎶芥按浜�.ini'
+
+pump_well = np.loadtxt(pumpwellpath, dtype=str,encoding='utf-8')
+
+period_path = prefix +"period.json"
+
+areapath = prefix + '鍒嗗尯.ini'
+area_array = np.loadtxt(areapath, dtype=str,encoding='utf-8')
+
+#姘村潎琛¤矾寰�
+water_equ_path = prefix + 'water_equ.ini'
+water_equ = np.loadtxt(water_equ_path, dtype=str,encoding='utf-8')
+
+water_equ_path2022 = prefix + 'water_equ2022.ini'
+water_equ2022 = np.loadtxt(water_equ_path2022, dtype=str,encoding='utf-8')
+
+#鍦拌〃楂樼▼鏁版嵁
+dis_top_path = prefix + 'md_dis_top.ini'
+
+#鍒嗗尯鐨勫偍姘寸郴鏁�
+lpf_path = prefix + 'md_lpf.ini'
+md_lpf = np.loadtxt(lpf_path, dtype=str,encoding='utf-8')
+
+# #鐜夋硥灞辩煩闃垫暟鎹�
+yqs_path= prefix + '鐜夋硥灞辨硥鍒掑垎.ini'
+xs_yqs_matrix = np.loadtxt(yqs_path, dtype=str,encoding='utf-8')
+
+# #灞卞尯骞冲師鍖虹煩闃�
+xs_mp_path = prefix + '灞卞尯骞冲師鍖哄垝鍒�.ini'
+xs_mp_matrix = np.loadtxt(xs_mp_path, dtype=str,encoding='utf-8')
+
+
+model_config ='D:\\javaCode\\xishan\\objclipdig\\ModelFlow_xishan\\config.ini'
+
+model3d_path='D:/javaCode/xishan/xishan/xishan/output2/'
+
+modeldata_csv_path ="C:/Users/86134/Desktop/xsModel2/0612Model/"
+
+exe_path = 'D:/javaCode/xishan/objclipdig/ModelFlow_xishan/ModelFlow_xishan.exe'
+
+
+#璋冨姩 exe 绋嬪簭
+def callModelexe():
+ os.system(exe_path)
+
+
+#鏇存柊妯″瀷鐨別xe閰嶇疆
+def updateModelConfig(model_name):
+ conf = np.loadtxt(model_config, dtype=str,encoding='utf-8')
+ outpath = "outpath=" + model3d_path + model_name
+ csvpath = "csvpath=" + modeldata_csv_path + model_name +"/output"
+ conf[1]=outpath
+ conf[2]=csvpath
+ np.savetxt(model_config,conf, newline='\n', fmt='%s' , encoding='utf-8')
+
+
+
+def getPumpWellName(row,column):
+
+ for index, r, c,ids, qu ,name in pump_well:
+ if r==row and c == column:
+ return name
+
+ return "NONE"
+
+
+#鑾峰彇鐭╅樀鍒嗙粍鐨勫瓧鍏哥粨鏋�
+def getAreas():
+ arr = np.loadtxt(areapath, dtype=int)
+ dict ={}
+ for i in range(len(arr)):
+ for j in range(len(arr[i])):
+ zb = str(arr[i][j])
+ if arr[i][j] == -9999:
+ continue
+ if zb not in dict:
+ dict[zb] = [(i,j)]
+ else:
+ dict[zb].append((i,j))
+ return dict
+
+
+def getAreaDictFirstIndex():
+ arr = np.loadtxt(areapath, dtype=int)
+ dict ={}
+ for i in range(len(arr)):
+ for j in range(len(arr[i])):
+ if arr[i][j] == -9999:
+ continue
+ if arr[i][j] not in dict:
+ dict[arr[i][j]] = [(i,j)]
+
+ return dict
+
+
+#鑾峰彇鍒嗙粍灏忔爣瀛楀吀鏁版嵁
+def getAreaDictIndexArray():
+ arr = np.loadtxt(areapath, dtype=int)
+ dict_array={}
+ for i in range(len(arr)):
+ for j in range(len(arr[i])):
+ zb= str(arr[i][j])
+ if arr[i][j] == -9999:
+ continue
+ if zb not in dict_array:
+ array= []
+ index = getCellIdByRC(i+1,j+1)
+ array.append(index)
+ dict_array[zb] = array
+ else:
+ index = getCellIdByRC(i+1,j+1)
+ dict_array[zb].append(index)
+
+ return dict_array
+
+
+def getCellIdByRC(rowVal, columnVal):
+ return (rowVal - 1) * 114 + columnVal - 1;
+
+
+
+
+
+
+
+
diff --git a/Base.py b/Base.py
index f4542fb..ce9871d 100644
--- a/Base.py
+++ b/Base.py
@@ -6,21 +6,47 @@
"""
import numpy as np
-import shutil
import os
+
+#鎴愭灉妯″瀷鐨勯粯璁ゅ悕瀛�
+not_allowed_model="202001_202212"
+
+archive_models=["SP0-0","SP1-1","SP1-2","SP1-3","SP2-1","SP2-2","SP2-3","SP3-1",
+ "SP3-2","SP3-4","SP3-5","SP3-6","SP3-7","SP4-1","SP4-7"]
+
+# 鐢熸垚鐨勬祦鍦哄浘鏂囦欢
+flow_file ="D:\\javaCode\\xishan\\xishan\\xishan\\xinshanFlow\\"
+
prefix ='C:\\Users\\ZMK\\Desktop\\xsModel2\\'
+ZoneBudget64Exe= prefix + "zonebuget\\ZoneBudget64.exe"
+
+water_bal_zones = prefix +"zonebuget\\water_bal.zones\n"
+water_res_zones = prefix +"zonebuget\\water_res.zones\n"
+
+water_lsh_path = prefix + "water_lsh.ini"
+water_yhy_path = prefix + "water_yhy.ini"
+water_dbw_path = prefix + "water_dbw.ini"
+
+
baseModel = prefix + 'verifyModel\\'
+baseModel2 = prefix + 'verifyModel2\\'
predictModel= prefix + 'predictModel\\'
+predictModel60 = prefix + 'predictModel60\\'
predictParamModel= prefix + 'predictParamModel\\'
+
+muiltyModel = prefix + 'muiltyModel\\'
model_dir = prefix + '0612Model\\'
obswellpath = prefix + '鐩戞祴浜�.ini'
+obswell_data_path= prefix + 'water_obs_data.ini'
+
+well_scale_path = prefix + 'well_scale.ini'
obs_well = np.loadtxt(obswellpath, dtype=str,encoding='utf-8')
@@ -44,7 +70,22 @@
water_equ_path2022 = prefix + 'water_equ2022.ini'
water_equ2022 = np.loadtxt(water_equ_path2022, dtype=str,encoding='utf-8')
-
+#鍦拌〃楂樼▼鏁版嵁
+dis_top_path = prefix + 'md_dis_top.ini'
+
+#鍒嗗尯鐨勫偍姘寸郴鏁�
+lpf_path = prefix + 'md_lpf.ini'
+md_lpf = np.loadtxt(lpf_path, dtype=str,encoding='utf-8')
+
+# #鐜夋硥灞辩煩闃垫暟鎹�
+yqs_path= prefix + '鐜夋硥灞辨硥鍒掑垎.ini'
+xs_yqs_matrix = np.loadtxt(yqs_path, dtype=str,encoding='utf-8')
+
+# #灞卞尯骞冲師鍖虹煩闃�
+xs_mp_path = prefix + '灞卞尯骞冲師鍖哄垝鍒�.ini'
+xs_mp_matrix = np.loadtxt(xs_mp_path, dtype=str,encoding='utf-8')
+
+
model_config ='C:\\Users\\ZMK\\Desktop\\objclipdig\\ModelFlow_xishan\\config.ini'
model3d_path='D:/javaCode/xishan/xishan/xishan/output2/'
diff --git a/BigData.py b/BigData.py
new file mode 100644
index 0000000..540147e
--- /dev/null
+++ b/BigData.py
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Tue Oct 31 16:12:55 2023
+
+@author: ZMK
+"""
+
+
+def mergeWaterData(balArray,resArray):
+ dicts ={}
+
+ inarray=[]
+ inarray.append({"name":"闄嶆按鍏ユ笚閲�","value":balArray[0]})
+ inarray.append({"name":"娌虫祦鍏ユ笚閲�","value":balArray[1]})
+ inarray.append({"name":"L1渚у悜琛ョ粰閲�","value":balArray[2]})
+ inarray.append({"name":"L3渚у悜琛ョ粰閲�","value":balArray[3]})
+ outarray=[]
+ outarray.append({"name":"浜哄伐寮�閲囬噺","value":balArray[4]})
+ outarray.append({"name":"L1渚у悜娴佸嚭閲�","value":balArray[5]})
+ outarray.append({"name":"L3渚у悜娴佸嚭閲�","value":balArray[6]})
+ dicts["pie1"]=inarray
+ dicts["pie2"]=outarray
+
+
+ inarray2=[]
+ inarray2.append({"name":"澶ф皵闄嶆按","value":resArray[0]})
+ inarray2.append({"name":"姘稿畾娌虫笚婕�","value":resArray[1]})
+ inarray2.append({"name":"渚у悜娴佸叆","value":resArray[2]})
+ outarray2=[]
+ outarray2.append({"name":"渚у悜娴佸嚭","value":resArray[3]})
+
+ dicts["pie1"]=inarray
+ dicts["pie2"]=outarray
+ dicts["pie3"]=inarray2
+ dicts["pie4"]=outarray2
+
+ return dicts
+
+
\ No newline at end of file
diff --git a/CalHead.py b/CalHead.py
index 55ecad8..162383f 100644
--- a/CalHead.py
+++ b/CalHead.py
@@ -5,78 +5,129 @@
@author: ZMK
"""
-import flopy
import flopy.utils.binaryfile as bf
import csv
import Base as base
import os
import json
+import subprocess
+import re
import ModelPeriod
import numpy as np
+import AchiveReport
-
+#娣诲姞modle
+def addModelJson(model_name,start_time,end_time,remark):
+
+ context=""
+ prediction_path = base.prefix + "\\model_list.json"
+ with open(prediction_path,encoding='utf-8') as f:
+ context = json.load(f)
+ array=[]
+ for item in context:
+ array.append(item)
+
+ dicts={"model_name":model_name,
+ "start_time":start_time,"end_time":end_time,"remark":remark}
+ array.append(dicts)
+
+ with open(prediction_path, "w",encoding='utf-8') as outfile:
+ json.dump(array, outfile,ensure_ascii=False)
+ return "淇濆瓨瀹屾瘯锛�";
+
+#鍒犻櫎model
+def removeModelJson(model_name):
+ context=""
+ prediction_path = base.prefix + "\\model_list.json"
+ with open(prediction_path,encoding='utf-8') as f:
+ context = json.load(f)
+ array=[]
+ for item in context:
+ if item["model_name"] != model_name:
+ array.append(item)
+
+ with open(prediction_path, "w",encoding='utf-8') as outfile:
+ json.dump(array, outfile,ensure_ascii=False)
+
+ return "鍒犻櫎妯″瀷瀹屾瘯锛�";
+
def get_model_json(model_name):
period_json=""
prediction_path = base.model_dir + model_name +"\\prediction.json"
with open(prediction_path,encoding='utf-8') as f:
- period_json = json.load(f)
-
+ period_json = json.load(f)
return period_json;
def get_model_period(model_name):
- period_json=""
- prediction_path = base.model_dir + model_name +"\\prediction.json"
- with open(prediction_path,encoding='utf-8') as f:
- period_json = json.load(f)
-
+ period_json= get_model_json(model_name)
start_time = period_json["start_time"]
- end_time = period_json["end_time"]
-
+ end_time = period_json["end_time"]
months = ModelPeriod.get_months_in_range_ym(start_time, end_time)
return months;
+def is_cloned_model(model_name):
+ paths = base.model_dir + model_name + "\\water_bal.txt"
+ if os.path.exists(paths):
+ return False
+ return True
+
#瑙傛祴浜昪hart
-def obsChartdata(model_name, row, column):
+def obsChartdata(wellId,model_name, row, column):
row = int(row)-1
column = int(column)-1
- dir = base.model_dir + model_name + "\\modflow.head"
-
- head = bf.HeadFile(dir)
- alldata = head.get_alldata()
- period = len(alldata)
-
- layer = 3
-
- xdata = []
- ydata = []
- result = {}
- for per in range(period):
- for lay in range(layer):
- if per % 3 == 0 and lay == 0:
- md = (int)(lay / 3 + 1)
- per_array = alldata[per][lay]
-
- cell_data = (float)(per_array[row][column])
- ydata.append(cell_data)
-
- period_json= get_model_json(model_name)
-
+ dir=""
+ period_json= get_model_json(model_name)
start_time = period_json["start_time"]
end_time = period_json["end_time"]
+ xmonths = ModelPeriod.get_months_in_range_ym(start_time, end_time)
- months = ModelPeriod.get_months_in_range_ym(start_time, end_time)
-
- result = {"y_data": ydata, "x_data": months}
+ if model_name == base.not_allowed_model:
+ dir = base.baseModel2 + "\\modflow.head"
+ else:
+ dir = base.model_dir + model_name + "\\modflow.head"
+ cloned = is_cloned_model(model_name)
+ if cloned ==True:
+ return {"y_data": [],"y_data2":[],"x_data":xmonths }
+
+ head = bf.HeadFile(dir)
+ alldata = head.get_alldata()
+
+ #鍛ㄦ湡鏁�
+ months = int(len(alldata)/3)
+ ydata= []
+ result = {}
+ for month in range(months):
+ z1= alldata[int(month+1)*3-1,0,:,:]
+ cell_data = float(z1[row][column])
+ ydata.append(round(cell_data,2))
+
+ y_data2=[]
+ if model_name == base.not_allowed_model:
+ array_data = np.loadtxt(base.obswell_data_path, dtype=str,encoding='utf-8')
+ y_data2= getObsData(wellId,array_data)
+
+ result = {"y_data": ydata,"y_data2":y_data2,"x_data": xmonths}
return result
-def getRowCloumnById(index_id):
- row = 104
- column =114
- count=0
+def getObsData(wellId,array_data):
+ result =[]
+ new_list =[]
+ for item in array_data:
+ if item[0]==wellId:
+ result.append(item[3])
+ for i in range(0,len(result),3):
+ data =( float(result[i]) +float(result[i+1])+float(result[i+2]))/3
+ data = round(data,2)
+ new_list.append(data)
+
+ return new_list;
+
+def getRowCloumnById(index_id):
+ row,column,count = 104,114,0
for i in range(row):
for j in range(column):
if index_id == count:
@@ -89,116 +140,39 @@
#鍦颁笅姘翠俊鎭�
def earthWaterChart(model_name, index_id):
- row_column = getRowCloumnById(index_id)
-
+ row_column = getRowCloumnById(index_id)
row = row_column[0]
column = row_column[1]
- dir = base.model_dir + model_name + "\\modflow.head"
-
- head = bf.HeadFile(dir)
- alldata = head.get_alldata()
- period = len(alldata)
-
- layer = 3
-
- ydata = []
- result = {}
- for per in range(period):
- for lay in range(layer):
- if per % 3 == 0 and lay == 0:
-
- per_array = alldata[per][lay]
-
- cell_data = (float)(per_array[row][column])
- ydata.append(cell_data)
-
- period_json= get_model_json(model_name)
+ period_json= get_model_json(model_name)
start_time = period_json["start_time"]
end_time = period_json["end_time"]
+ xmonths = ModelPeriod.get_months_in_range_ym(start_time, end_time)
+ dir = ""
+ if model_name == base.not_allowed_model:
+ dir = base.baseModel2 + "\\modflow.head"
+ else:
+ dir = base.model_dir + model_name + "\\modflow.head"
+ cloned = is_cloned_model(model_name)
+ if cloned ==True:
+ return {"y_data": [],"x_data":xmonths }
- months = ModelPeriod.get_months_in_range_ym(start_time, end_time)
+ head = bf.HeadFile(dir)
+ alldata = head.get_alldata()
+
+ #鍛ㄦ湡鏁�
+ months = int(len(alldata)/3)
+ ydata= []
+ result = {}
+ for month in range(months):
+ z1= alldata[int(month+1)*3-1,0,:,:]
+ cell_data = float(z1[row][column])
+ ydata.append(round(cell_data,2))
- result = {"y_data": ydata, "x_data": months}
+ result = {"y_data": ydata, "x_data": xmonths}
return result
-
-def heatmapdata(model_name,period):
- dir = base.model_dir + model_name + "\\modflow.head"
-
- head = bf.HeadFile(dir)
-
- alldata = head.get_alldata()
+
- index = int(period)*3
- return alldata[index][0]
-
-
-#姘村潎琛¤绠�
-def waterEqu(model_name):
- if model_name == '202001_202212':
- water_equ_path = base.prefix + "\\water_equ.json"
- with open(water_equ_path,encoding='utf-8') as f:
- data = json.load(f)
- return data
- else:
- year = model_name[0:4]
- title =[year]
- dict ={"title":title}
-
- celldata = np.array(base.water_equ2022).tolist()
-
- predict_json= get_model_json(model_name)
-
- a1=float(celldata[0])
- a2=float(celldata[1])
- a3=float(celldata[2])
- a4=float(celldata[3])
-
- b1=float(celldata[4])
- b2=float(celldata[5])
- b3=float(celldata[6])
-
- if predict_json["rain"]:
- a1= float(predict_json["rain"]["ratio"]) * float(celldata[0])
- a3= float(predict_json["rain"]["ratio"]) * float(celldata[2])
- a4= float(predict_json["rain"]["ratio"]) * float(celldata[3])
- b2= float(predict_json["rain"]["ratio"]) * float(celldata[5])
- b3= float(predict_json["rain"]["ratio"]) * float(celldata[6])
- if predict_json["river"]:
- a2= float(predict_json["river"]["ratio"]) * float(celldata[1])
-
- if predict_json["mine"]:
- b1= b1
-
- in_data= a1+a2+a3+a4
- out_data= b1 +b2 + b3
- float_data=[a1,a2,a3,a4,in_data,b1,b2,b3,out_data,in_data-out_data]
-
- inarray=[]
- inarray.append({"name":"闄嶆按鍏ユ笚閲�","value":a1})
- inarray.append({"name":"娌虫祦鍏ユ笚閲�","value":a2})
- inarray.append({"name":"L1渚у悜琛ョ粰閲�","value":a3})
- inarray.append({"name":"L3渚у悜琛ョ粰閲�","value":a4})
- outarray=[]
- outarray.append({"name":"浜哄伐寮�閲囬噺","value":b1})
- outarray.append({"name":"L1渚у悜娴佸嚭閲�","value":b2})
- outarray.append({"name":"L3渚у悜娴佸嚭閲�","value":b3})
- pie1={str(year):inarray}
- pie2={str(year):outarray}
-
- dict["pie1"]=pie1
- dict["pie2"]=pie2
-
- array2d=[]
- array2d.append([str(year)])
- for i in range(len(float_data)):
- tmp=[]
- tmp.append(str(float_data[i]))
- array2d.append(tmp)
- dict["data"]=array2d
- return dict
-
-
#瀵煎嚭csv鏂囦欢
def exportCsV(model_name):
@@ -207,26 +181,652 @@
if not os.path.exists(out_path):
os.mkdir(out_path)
- head = bf.HeadFile(dir)
-
+ # z1= alldata[int(per1)*3,0,:,:]
+ head = bf.HeadFile(dir)
alldata = head.get_alldata()
- month = len(alldata)
- layer = 3
-
- for i in range(month):
- for j in range(layer):
- if i % 3 == 0:
- md = (int)(i / 3 + 1)
- filename = out_path + str(md) + '-' + str(j+1) + '.csv'
+ months = int(len(alldata)/3)
+ layers = 3
+ #渚嬪 0-36鏈�
+ for month in range(months):
+ for layer in range (layers):
+ z_last= alldata[(month+1)*3-1,layer,:,:]
+
+ filename = out_path + str(month+1) + '-' + str(layer+1) + '.csv'
f = open(filename, 'w', newline='')
writer = csv.writer(f)
- for p in alldata[i][j]:
+
+ for p in z_last:
writer.writerow(p)
f.close()
-
+
return out_path
+
+#姘村潎琛¤绠�
+def waterEqu(model_name):
+ if model_name == base.not_allowed_model:
+ water_equ_path = base.prefix + "\\water_equ.json"
+ with open(water_equ_path,encoding='utf-8') as f:
+ data = json.load(f)
+ return data
+ else:
+ year = model_name
+ title =[year]
+ dict ={"title":title}
+
+ jx = get_model_json(model_name)
+ dict["start_time"]=jx["start_time"]
+ dict["end_time"]=jx["end_time"]
+
+ paths=base.model_dir + model_name +"\\water_bal.txt"
+ wat = water_balance(model_name, paths)
+
+ in_data= round(wat[0]+ wat[1]+ wat[2]+ wat[3] , 4)
+ out_data= round(wat[4] + wat[5] + wat[6], 4)
+ inout = round(in_data-out_data, 4)
+ float_data=[wat[0],wat[1],wat[2],wat[3],in_data,
+ wat[4],wat[5], wat[6],out_data,inout]
+
+ inarray=[]
+ inarray.append({"name":"闄嶆按鍏ユ笚閲�","value":wat[0]})
+ inarray.append({"name":"娌虫祦鍏ユ笚閲�","value":wat[1]})
+ inarray.append({"name":"涓�灞備晶鍚戣ˉ缁欓噺","value":wat[2]})
+ inarray.append({"name":"涓夊眰渚у悜琛ョ粰閲�","value":wat[3]})
+ outarray=[]
+ outarray.append({"name":"浜哄伐寮�閲囬噺","value":wat[4]})
+ outarray.append({"name":"涓�灞備晶鍚戞祦鍑洪噺","value":wat[5]})
+ outarray.append({"name":"涓夊眰渚у悜娴佸嚭閲�","value":wat[6]})
+ pie1={str(year):inarray}
+ pie2={str(year):outarray}
+
+ dict["pie1"]=pie1
+ dict["pie2"]=pie2
+
+ array2d=[]
+ array2d.append(["鏁版嵁锛堜嚎绔嬫柟绫筹級"])
+ for i in range(len(float_data)):
+ tmp=[]
+ tmp.append(str(float_data[i]))
+ array2d.append(tmp)
+ dict["data"]=array2d
+ return dict
+def run_zonebudget_bal(model_name):
+ # 瀹氫箟exe鏂囦欢鐨勮矾寰勫拰鍙傛暟
+ exe_path = base.ZoneBudget64Exe
+ txt_path = base.model_dir + model_name + "\\water_bal.txt\n"
+ cell_path = base.model_dir + model_name + "\\modflow.flow\n"
+ process = subprocess.Popen([exe_path], stdin=subprocess.PIPE,shell = True)
+ process.stdin.write(txt_path.encode()) # 杈撳叆鍙傛暟1
+ process.stdin.write(cell_path.encode())
+ process.stdin.write(b"title\n")
+ process.stdin.write(base.water_bal_zones.encode())
+ process.stdin.write(b"A\n")
+ output, _ = process.communicate()
+ print(output)
+
+
+def run_zonebudget_res(model_name):
+ # 瀹氫箟exe鏂囦欢鐨勮矾寰勫拰鍙傛暟
+ exe_path = base.ZoneBudget64Exe
+ txt_path = base.model_dir + model_name + "\\water_res.txt\n"
+ cell_path = base.model_dir + model_name + "\\modflow.flow\n"
+ process = subprocess.Popen([exe_path], stdin=subprocess.PIPE,shell = True)
+ process.stdin.write(txt_path.encode()) # 杈撳叆鍙傛暟1
+ process.stdin.write(cell_path.encode())
+ process.stdin.write(b"title\n")
+ process.stdin.write(base.water_res_zones.encode())
+ process.stdin.write(b"A\n")
+ output, _ = process.communicate()
+ print(output)
+
+def reg_find_int(text):
+ numbers = re.findall(r'\d+', text)
+ return numbers
+
+
+def read_txt(path):
+ data =[]
+ with open(path, 'r') as file:
+ lines = file.readlines()
+ for line in lines:
+ data.append(line)
+ return data
+#瑙f瀽姘村潎琛℃暟鎹�
+def water_balance(model_name,paths):
+ data= read_txt(paths)
+ lens = len(data)
+ index = 0
+ segment=[]
+ dicts={}
+ flag = 0
+ title=""
+ while index < lens:
+ strs = data[index].strip()
+ if strs.startswith("Flow Budget for Zone"):
+ segment=[]
+ flag = 1
+ title=strs
+ if strs.startswith("Percent Discrepancy"):
+ segment.append(strs)
+ numbers = reg_find_int(title)
+ key = ','.join(numbers)
+ dicts[key]=segment
+ flag = 0
+ if flag ==1 :
+ segment.append(strs)
+ index=index+1
+
+ recharge = 0
+ for key in dicts:
+ array = dicts[key]
+ temp=[]
+ for item in array:
+ if item.startswith("RECHARGE") :
+ strs = item.replace(" ", "").replace("RECHARGE=", "")
+ temp.append(float(strs))
+
+ recharge += (temp[0]-temp[1])
+
+ #娌虫祦鍏ユ笚閲忥紙姝o級 鎵�鏈夊簲鍔涙湡锛宖or Zone 3鐨刉ELLS椤圭浉鍔�
+ zone3 = 0
+ for key in dicts:
+ if key.startswith("3,"):
+ array = dicts[key]
+ temp=[]
+ for item in array:
+ if item.startswith("WELLS") :
+ strs = item.replace(" ", "").replace("WELLS=", "")
+ temp.append(float(strs))
+
+ zone3 += (temp[0]-temp[1])
+
+ #L1渚у悜琛ョ粰閲忥紙姝o級 鎵�鏈夊簲鍔涙湡锛宖or Zone 4鐨処N-WELLS椤圭浉鍔�
+ Zone4_in_well=0
+ for key in dicts:
+ if key.startswith("4,"):
+ array = dicts[key]
+ for item in array:
+ if item.startswith("WELLS") :
+ strs = item.replace(" ", "").replace("WELLS=", "")
+ data = float(strs)
+ Zone4_in_well +=data
+ break
+
+ #L3渚у悜琛ョ粰閲忥紙姝o級 鎵�鏈夊簲鍔涙湡锛宖or Zone 8鐨処N-WELLS椤圭浉鍔�
+ Zone8_in_well =0
+ for key in dicts:
+ if key.startswith("8,"):
+ array = dicts[key]
+ for item in array:
+ if item.startswith("WELLS") :
+ strs = item.replace(" ", "").replace("WELLS=", "")
+ data = float(strs)
+ Zone8_in_well +=data
+ break
+
+ #浜哄伐寮�閲囬噺锛堣礋锛� 鎵�鏈夊簲鍔涙湡锛宖or Zone 5鐨凮UT-WELLS椤圭浉鍔�
+ zone5out =0
+ for key in dicts:
+ if key.startswith("5,"):
+ array = dicts[key]
+ for item in array:
+ if item.startswith("WELLS") :
+ strs = item.replace(" ", "").replace("WELLS=", "")
+ data = float(strs)
+ zone5out +=data
+
+ #L1渚у悜娴佸嚭閲忥紙璐燂級 鎵�鏈夊簲鍔涙湡锛宖or Zone 4鐨凮UT-WELLS椤圭浉鍔�
+ Zone4_out_well=0
+ for key in dicts:
+ if key.startswith("4,"):
+ array = dicts[key]
+ for item in array:
+ if item.startswith("WELLS") :
+ strs = item.replace(" ", "").replace("WELLS=", "")
+ data = float(strs)
+ Zone4_out_well +=data
+
+ # L3=L3渚у悜娴佸嚭閲忥紙璐燂級
+ L3=0.0
+ result =[recharge,zone3,Zone4_in_well,Zone8_in_well,zone5out,Zone4_out_well,L3]
+ for i in range(len(result)):
+ # 姣忚鏁版嵁瀹為檯涓婅绠� 鐨勬槸 涓�涓猻tep , 1涓猻tep =10澶�
+ result[i]= round(result[i]/100000000*10, 4)
+
+ return result
+
+
+#瑙f瀽姘磋祫婧愰噺鏁版嵁
+def water_res(model_name,paths):
+ data= read_txt(paths)
+ lens = len(data)
+ index = 0
+ segment=[]
+ dicts={}
+ flag = 0
+ title=""
+ while index < lens:
+ strs = data[index].strip()
+ if strs.startswith("Flow Budget for Zone"):
+ segment=[]
+ flag = 1
+ title=strs
+ if strs.startswith("Percent Discrepancy"):
+ segment.append(strs)
+ numbers = reg_find_int(title)
+ key = ','.join(numbers)
+ dicts[key]=segment
+ flag = 0
+ if flag ==1 :
+ segment.append(strs)
+ index=index+1
+
+ # 澶ф皵闄嶆按 for zone1閲屾墍鏈夌殑recharge椤圭浉鍔狅紙鍖呮嫭in鍜宱ut锛�
+ zone1_rechage = 0
+
+ for key in dicts:
+ if key.startswith("1,"):
+ array = dicts[key]
+ temp=[]
+ for item in array:
+ if item.startswith("RECHARGE") :
+ strs = item.replace(" ", "").replace("RECHARGE=", "")
+ temp.append(float(strs))
+
+ zone1_rechage += (temp[0]-temp[1])
+
+ #姘稿畾娌虫笚婕� for zone1閲屾墍鏈夌殑zone2椤圭浉鍔狅紙鍖呮嫭in鍜宱ut锛�
+ zone1_well = 0
+ for key in dicts:
+ if key.startswith("1,"):
+ array = dicts[key]
+ indata,outdata= 0,0
+ for item in array:
+ if item.startswith("Zone 2 to 1") :
+ strs = item.replace(" ", "").replace("Zone2to1=", "")
+ indata = float(strs)
+
+ if item.startswith("Zone 1 to 2") :
+ strs = item.replace(" ", "").replace("Zone1to2=", "")
+ outdata = float(strs)
+
+ zone1_well += (indata-outdata)
+
+ #渚у悜娴佸叆 For zone7 閲屾墍鏈夌殑zone8椤圭浉鍔狅紙鍖呮嫭in鍜宱ut锛�
+ zone7=0
+ for key in dicts:
+ if key.startswith("7,"):
+ array = dicts[key]
+ indata,outdata= 0,0
+ for item in array:
+ if item.startswith("Zone 8 to 7") :
+ strs = item.replace(" ", "").replace("Zone8to7=", "")
+ indata = float(strs)
+
+ if item.startswith("Zone 7 to 8") :
+ strs = item.replace(" ", "").replace("Zone7to8=", "")
+ outdata = float(strs)
+
+ zone7 += (indata-outdata)
+
+ #瓒婃祦鎺掓硠 For zone6 閲屾墍鏈夌殑zone7椤圭浉鍔狅紙鍖呮嫭in鍜宱ut锛�
+ zone6 =0
+ for key in dicts:
+ if key.startswith("6,"):
+ array = dicts[key]
+ indata,outdata= 0,0
+ for item in array:
+ if item.startswith("Zone 7 to 6") :
+ strs = item.replace(" ", "").replace("Zone7to6=", "")
+ indata = float(strs)
+
+ if item.startswith("Zone 6 to 7") :
+ strs = item.replace(" ", "").replace("Zone6to7=", "")
+ outdata = float(strs)
+ zone6 += (indata-outdata)
+
+ result =[zone1_rechage,zone1_well,zone7,zone6]
+ for i in range(len(result)):
+ result[i]= round(result[i]/100000000*10,4)
+ return result
+
+
+ #瑙f瀽姘磋祫婧愰噺鏁版嵁
+def water_res_month(model_name,paths,per):
+ data= read_txt(paths)
+ lens = len(data)
+ index = 0
+ segment=[]
+ dicts={}
+ flag = 0
+ title=""
+ while index < lens:
+ strs = data[index].strip()
+ if strs.startswith("Flow Budget for Zone"):
+ segment=[]
+ flag = 1
+ title=strs
+ if strs.startswith("Percent Discrepancy"):
+ segment.append(strs)
+ numbers = reg_find_int(title)
+ key = ','.join(numbers)
+ dicts[key]=segment
+ flag = 0
+ if flag ==1 :
+ segment.append(strs)
+ index=index+1
+
+ # 澶ф皵闄嶆按 for zone1閲屾墍鏈夌殑recharge椤圭浉鍔狅紙鍖呮嫭in鍜宱ut锛�
+ zone1_rechage = 0
+ zone1_keys=[ "1,1,"+str(per+1),"1,2,"+str(per+1),"1,3,"+str(per+1)]
+ for key in zone1_keys:
+ array = dicts[key]
+ temp=[]
+ for item in array:
+ if item.startswith("RECHARGE") :
+ strs = item.replace(" ", "").replace("RECHARGE=", "")
+ temp.append(float(strs))
+ zone1_rechage += (temp[0]-temp[1])
+
+ #姘稿畾娌虫笚婕� for zone1閲屾墍鏈夌殑zone2椤圭浉鍔狅紙鍖呮嫭in鍜宱ut锛�
+ zone1_well = 0
+ zone1_well_keys=["1,1,"+str(per+1),"1,2,"+str(per+1),"1,3,"+str(per+1)]
+ for key in zone1_well_keys:
+ array = dicts[key]
+ indata,outdata= 0,0
+ for item in array:
+ if item.startswith("Zone 2 to 1") :
+ strs = item.replace(" ", "").replace("Zone2to1=", "")
+ indata = float(strs)
+
+ if item.startswith("Zone 1 to 2") :
+ strs = item.replace(" ", "").replace("Zone1to2=", "")
+ outdata = float(strs)
+
+ zone1_well += (indata-outdata)
+
+ #渚у悜娴佸叆 For zone7 閲屾墍鏈夌殑zone8椤圭浉鍔狅紙鍖呮嫭in鍜宱ut锛�
+ zone7=0
+ zone7_keys=["7,1,"+str(per+1),"7,2,"+str(per+1),"7,3,"+str(per+1)]
+ for key in zone7_keys:
+ array = dicts[key]
+ indata,outdata= 0,0
+ for item in array:
+ if item.startswith("Zone 8 to 7") :
+ strs = item.replace(" ", "").replace("Zone8to7=", "")
+ indata = float(strs)
+
+ if item.startswith("Zone 7 to 8") :
+ strs = item.replace(" ", "").replace("Zone7to8=", "")
+ outdata = float(strs)
+ zone7 += (indata-outdata)
+
+ #瓒婃祦鎺掓硠 For zone6 閲屾墍鏈夌殑zone7椤圭浉鍔狅紙鍖呮嫭in鍜宱ut锛�
+ zone6 =0
+ zone6_keys=["6,1,"+str(per+1),"6,2,"+str(per+1),"6,3,"+str(per+1)]
+ for key in zone6_keys:
+ array = dicts[key]
+ indata,outdata= 0,0
+ for item in array:
+ if item.startswith("Zone 7 to 6") :
+ strs = item.replace(" ", "").replace("Zone7to6=", "")
+ indata = float(strs)
+
+ if item.startswith("Zone 6 to 7") :
+ strs = item.replace(" ", "").replace("Zone6to7=", "")
+ outdata = float(strs)
+ zone6 += (indata-outdata)
+
+ result =[zone1_rechage,zone1_well,zone7,zone6]
+ for i in range(len(result)):
+ result[i]= round(result[i]/100000000*10, 4)
+
+ return result
+
+#澶氭ā鍨嬬殑姘翠綅
+def water_depth(model_name):
+ name_array = model_name.split(",")
+
+ yhyMatrix = np.loadtxt(base.water_yhy_path, dtype=str,encoding='utf-8')
+ lshMatrix = np.loadtxt(base.water_lsh_path, dtype=str,encoding='utf-8')
+ dbwMatrix = np.loadtxt(base.water_dbw_path, dtype=str,encoding='utf-8')
+
+ res ={}
+ #棰愬拰鍥紝鑾茬煶婀栵紝涓滃寳鏃虹殑姘村钩绾垮拰澶氭ā鍨嬬殑澶氭姌绾垮��
+ yhydata=[]
+ base1={"name":"鍦拌〃楂樼▼","data":[52]*12}
+ yhydata.append(base1)
+
+ lshdata=[]
+ base2={"name":"鍦拌〃楂樼▼","data":[80]*12}
+ lshdata.append(base2)
+
+ dbwdata=[]
+ base3={"name":"鍦拌〃楂樼▼","data":[49]*12}
+ dbwdata.append(base3)
+
+ months = ModelPeriod.get_months_in_range_ym("2023-01","2023-12")
+
+ for i in range(len(name_array)):
+ if name_array[i] != '':
+
+ index = muiltyModelIndex(name_array[i])
+ array1 = get_column(yhyMatrix,index)
+ array2 = get_column(lshMatrix,index)
+ array3 = get_column(dbwMatrix,index)
+
+ yhydata.append({"name":name_array[i],"data":convertColumnData(array1)})
+ lshdata.append({"name":name_array[i],"data":convertColumnData(array2)})
+ dbwdata.append({"name":name_array[i],"data":convertColumnData(array3)})
+
+ rchMatrix = np.loadtxt(base.prefix + "base_water.ini", dtype=str,encoding='utf-8')
+ riverMatrix = np.loadtxt(base.prefix + "base_river.ini", dtype=str,encoding='utf-8')
+ pumpMatrix = np.loadtxt(base.prefix + "base_mining.ini", dtype=str,encoding='utf-8')
+
+ rchdata=[]
+ rch_base1 = rchMatrix[1]
+ rch_base1_float =[]
+ for i in range (0,len(rch_base1)):
+ float_data = round(float(rch_base1[i])/9,2)
+ rch_base1_float.append(float_data)
+
+ rchdata.append({"name":"鍩哄噯鍊�","data":rch_base1_float})
+
+ riverdata=[]
+ riverdata.append({"name":"鍩哄噯鍊�","data":riverMatrix.astype(float).tolist()})
+
+ pumpdata=[]
+ pumpX=pumpMatrix[1]
+ pump_float=[]
+ for i in range (0,len(pumpX)):
+ float_data = round(float(pumpX[i]),2)
+ pump_float.append(float_data)
+
+ pumpdata.append({"name":"鍩哄噯鍊�","data":pump_float})
+
+ res["xAxis"] = months
+ res["yhy_line"] = yhydata
+ res["lsh_line"] = lshdata
+ res["dbw_line"] = dbwdata
+
+
+ for i in range(len(name_array)):
+ if name_array[i] != '':
+ rchdata.append(rchBaseResult(rchMatrix,name_array[i]))
+ riverdata.append(riverBaseResult(riverMatrix, name_array[i]))
+ pumpdata.append(pumpBaseResult(pumpMatrix, name_array[i]))
+
+ res["rch_line"] = rchdata
+ res["river_line"] = riverdata
+ res["pump_line"] = pumpdata
+
+ yqsdata=[]
+ pyqdata=[]
+ sqdata=[]
+ for i in range(len(name_array)):
+ if name_array[i] != '':
+ paths = base.muiltyModel + name_array[i] + "\\modflow.head"
+ resdata = AchiveReport.getXs3LineChart(paths)
+ pyqdata.append({"name":name_array[i],"data":resdata["pyq"]})
+ sqdata.append({"name":name_array[i],"data":resdata["sq"]})
+ yqsdata.append({"name":name_array[i],"data":resdata["yqs"]})
+
+ res["yqs_line"] = yqsdata
+ res["sq_line"] = sqdata
+ res["pyq_line"] = pyqdata
+
+ return res
+
+#灏忓満鏅按浣� 鍜屽彉骞�
+def xs_depth(model_name):
+ res={}
+ line1,line2=[],[]
+ paths = base.model_dir + model_name + "\\modflow.head"
+ if model_name == base.not_allowed_model:
+ paths = base.baseModel2 + "\\modflow.head"
+
+ resdata = AchiveReport.getXs3LineChart(paths)
+ line1.append({"name":"骞冲師鍖�","data":roundArray(resdata["pyq"])})
+ line1.append({"name":"灞卞尯","data":roundArray(resdata["sq"])})
+ line1.append({"name":"鐜夋硥灞卞湴鍖�","data":roundArray(resdata["yqs"])})
+ res["depth"] = line1
+
+ line2.append({"name":"骞冲師鍖�","data":xs_bf(resdata["pyq"])})
+ line2.append({"name":"灞卞尯","data":xs_bf(resdata["sq"])})
+ line2.append({"name":"鐜夋硥灞卞湴鍖�","data":xs_bf(resdata["yqs"])})
+ res["bf"] = line2
+ return res
+
+def xs_bf(array):
+ newlist=[]
+ newlist.append(0)
+ lens = len(array)-1
+ for i in range(0,lens):
+ x = array[i+1]-array[i]
+ newlist.append(round(x,2))
+ return newlist
+
+def roundArray(array):
+ newlist=[]
+ for item in array:
+ item = round(item,2)
+ newlist.append(item)
+ return newlist
+
+#rch 鍩哄噯鏁版嵁
+def rchBaseResult(rchMatrix,sp):
+ rchDict ={}
+ rch_base1 = rchMatrix[1]
+ rch_base2 = rchMatrix[2]
+ rch_base3 = rchMatrix[3]
+ trump = getmuiltyModelparam(sp)
+
+ types = trump[0]
+ rch_x = trump[1]
+
+ if types ==1:
+ temp = muiltyArray(rch_base1,rch_x)
+ for i in range(0,len(temp)):
+ temp[i] =round(temp[i]/9,2)
+ rchDict={"name":sp,"data":temp}
+ if types ==2:
+ temp = muiltyArray(rch_base2,rch_x)
+ for i in range(0,len(temp)):
+ temp[i] =round(temp[i]/9,2)
+ rchDict={"name":sp,"data":temp}
+ if types ==3:
+ temp = muiltyArray(rch_base3,rch_x)
+ for i in range(0,len(temp)):
+ temp[i] =round(temp[i]/9,2)
+ rchDict={"name":sp,"data":temp}
+
+ return rchDict
+
+#娌虫祦鍩哄噯 鏁版嵁
+def riverBaseResult(riverMatrix,sp):
+ trump = getmuiltyModelparam(sp)
+ river_x = trump[2]
+ riverDict={"name":sp,"data":muiltyArray(riverMatrix,river_x)}
+ return riverDict
+
+
+#鎶芥按浜曞熀鍑嗘暟鎹�
+def pumpBaseResult(pumpMatrix,sp):
+ trump = getmuiltyModelparam(sp)
+ pump_x =trump[3]
+ pumpDict={"name":sp,"data":muiltyArray(pumpMatrix[1],pump_x)}
+ return pumpDict
+
+
+def muiltyArray(array,scale):
+ result =[]
+ for item in array:
+ x= round(float(item) * scale,2)
+ result.append(x)
+ return result
+
+
+def convertColumnData(array):
+ result =[]
+ new_list=[]
+ for i in range(len(array)):
+ if i!= 0:
+ data = transToNum(array[i])
+ result.append(data)
+ for index in range(len(result)):
+ if index % 3 == 0:
+ new_list.append(result[index])
+ return new_list
+
+def transToNum(str):
+ data = 0
+ try:
+ data= round(float(str),2)
+ return data
+ except ValueError():
+ return 0
+
+
+ #鑾峰彇棰勬祴鍦烘櫙鐨勪笅鏍囧�硷紝 闇�瑕佷粠ini 鏂囦欢涓寜鐓у垪杩涜璇诲彇
+def muiltyModelIndex(name):
+ models= muiltyModelList()
+ indexs = models.index(name)
+ return indexs
+
+#棰勬祴妯″瀷鍒楄〃
+def muiltyModelList():
+ models=["SP0-0","SP1-1","SP1-2","SP1-3","SP2-1","SP2-2","SP2-3","SP3-1",
+ "SP3-2","SP3-4","SP3-5","SP3-6","SP3-7","SP4-1","SP4-7"]
+ return models
+
+
+
+#Np鑾峰彇鏌愪竴鍒楃殑鍊�
+def get_column(matrix, column_number):
+ column = matrix[:, column_number]
+ return column
+
+#鍏冪粍涓� 1=闄嶉洦绫诲瀷 2=鍊嶆暟 3,娌虫祦鍊嶆暟 4,鎶芥按浜曞�嶆暟
+def getmuiltyModelparam(sp):
+ dicts={
+ "SP0-0":(1,1,1,1),
+ "SP1-1":(2,1,1,1),
+ "SP1-2":(3,1,1,1),
+ "SP1-3":(3,1.2,1,1),
+ "SP2-1":(1,1,2,1),
+ "SP2-2":(1,1,5,1),
+ "SP2-3":(1,1,10,1),
+ "SP3-1":(1,1,1,0.25),
+ "SP3-2":(1,1,1,0.5),
+ "SP3-4":(1,1,1,0),
+ "SP3-5":(1,1,1,0.4),
+ "SP3-6":(1,1,1,0.3),
+ "SP3-7":(1,1,1,0.6),
+
+ "SP4-1":(1,1,2,0.5),
+ "SP4-7":(3,1.2,10,0)}
+ return dicts[sp]
diff --git a/DataTask.py b/DataTask.py
new file mode 100644
index 0000000..686b443
--- /dev/null
+++ b/DataTask.py
@@ -0,0 +1,325 @@
+import cx_Oracle
+import pymssql
+from datetime import datetime, timedelta
+import numpy as np
+# select * from swzdh.rain;
+# select * from swzdh.river;
+# select * from swzdh.gw;
+
+
+
+#楹诲唱闆ㄩ噺绔�
+mayu_rainfall="30747850"
+
+#闄囬┚搴勬按鏂囩珯
+ljz_swz="30700450"
+
+#LQWB锛堥緳娉夛級/ZSSC锛堝啀鐢熸按鍘傦級/WTY锛堟ⅶ妗愯嫅锛�/LSH锛堣幉鐭虫箹锛�/HZZ锛堜警搴勫瓙锛�/GC锛堝彜鍩庯級
+arr1=["30773702","30769360","30769280","30567304","30769320","30567303"]
+
+
+haidian_rainfall="xxxx"
+
+#SXC锛堝弻鍏存潙93锛�/XM1锛堥鍜屽洯瑗块棬1锛�/XM2锛堥鍜屽洯瑗块棬2锛�/SYSC锛堟按婧愪笁鍦�336锛�/SJYY锛堝洓瀛e尽鍥�2锛�/BW锛堝寳鍧烇級
+arr2=["30566324","30565080","30564400","30566335","30564840","30564880"]
+
+#鑾峰彇姘稿畾娌�15澶╃殑棰勬祴闇�瑕佺殑鏁版嵁
+def get_ydh15_real_data():
+ result =[]
+
+ current_time = datetime.now()
+ start_time = current_time- timedelta(days=60)
+ times=[]
+ #鏃堕棿搴忓垪
+ for i in range(75):
+ tmp = start_time + timedelta(days=i)
+ times.append(tmp.strftime("%Y-%m-%d"))
+
+ #寮�濮嬫椂闂� 缁撴潫鏃堕棿
+ start_str = start_time.strftime("%Y-%m-%d")
+ end_str= current_time.strftime("%Y-%m-%d")
+
+
+
+ #楹诲唱鏁版嵁
+ mayu_data = get_data("rain",mayu_rainfall,start_str,end_str)
+ mayu_dict={}
+ for i in range(len(mayu_data)):
+ time = mayu_data[i]["time"]
+ value = mayu_data[i]["value"]
+ if time not in mayu_dict:
+ mayu_dict[time] = value
+
+
+ #闄囬┚搴�
+ ljz_data = get_data("river",ljz_swz,start_str,end_str)
+ ljz_dict ={}
+ for i in range(len(ljz_data)):
+ time = ljz_data[i]["time"]
+ value = ljz_data[i]["value"]
+ if time not in ljz_data:
+ ljz_dict[time] = value
+
+ mayu_value=[]
+ ljz_value=[]
+
+ for i in range(len(times)):
+ tmp = times[i]
+ if tmp in mayu_dict:
+ mayu_value.append(tmp)
+ else:
+ mayu_value.append(0)
+
+ if tmp in ljz_dict:
+ ljz_value.append(tmp)
+ else:
+ ljz_value.append(0)
+
+
+ result.append(times)
+ result.append(mayu_value)
+ result.append(ljz_value)
+
+ for i in(len(arr1)):
+ data = get_data("gw",arr1[i],start_str,end_str)
+ dictx ={}
+ tmp_arr=[]
+ for i in range(len(data)):
+ time = data[i]["time"]
+ value = data[i]["value"]
+ if time not in dictx:
+ dictx[time] = value
+
+
+ for i in range(len(times)):
+ tmp = times[i]
+ if tmp in dictx:
+ tmp_arr.append(tmp)
+ else:
+ tmp_arr.append(0)
+
+ result.append(tmp_arr)
+
+ np_arr = np.asarray(result)
+ #鏁扮粍杞疆
+ np_result = np_arr.T
+
+ return np_result
+
+
+#鑾峰彇鐜夋硥灞�15澶╃殑棰勬祴闇�瑕佺殑鏁版嵁
+def getyqs15_real_data():
+
+
+ result =[]
+
+ current_time = datetime.now()
+ start_time = current_time- timedelta(days=60)
+ times=[]
+ #鏃堕棿搴忓垪
+ for i in range(75):
+ tmp = start_time + timedelta(days=i)
+ times.append(tmp.strftime("%Y-%m-%d"))
+
+ #寮�濮嬫椂闂� 缁撴潫鏃堕棿
+ start_str = start_time.strftime("%Y-%m-%d")
+ end_str= current_time.strftime("%Y-%m-%d")
+
+
+
+ #楹诲唱鏁版嵁
+ hd_data = get_data("rain",haidian_rainfall,start_str,end_str)
+ hd_dict={}
+ for i in range(len(hd_data)):
+ time = hd_data[i]["time"]
+ value = hd_data[i]["value"]
+ if time not in hd_dict:
+ hd_dict[time] = value
+
+
+ #闄囬┚搴�
+ ljz_data = get_data("river",ljz_swz,start_str,end_str)
+ ljz_dict ={}
+ for i in range(len(ljz_data)):
+ time = ljz_data[i]["time"]
+ value = ljz_data[i]["value"]
+ if time not in ljz_data:
+ ljz_dict[time] = value
+
+ hd_value=[]
+ ljz_value=[]
+
+ for i in range(len(times)):
+ tmp = times[i]
+ if tmp in hd_dict:
+ hd_value.append(tmp)
+ else:
+ hd_value.append(0)
+
+ if tmp in ljz_dict:
+ ljz_value.append(tmp)
+ else:
+ ljz_value.append(0)
+
+
+ result.append(times)
+ result.append(hd_value)
+ result.append(ljz_value)
+
+ for i in(len(arr2)):
+ data = get_data("gw",arr2[i],start_str,end_str)
+ dictx ={}
+ tmp_arr=[]
+ for i in range(len(data)):
+ time = data[i]["time"]
+ value = data[i]["value"]
+ if time not in dictx:
+ dictx[time] = value
+
+
+ for i in range(len(times)):
+ tmp = times[i]
+ if tmp in dictx:
+ tmp_arr.append(tmp)
+ else:
+ tmp_arr.append(0)
+
+ result.append(tmp_arr)
+
+ np_arr = np.asarray(result)
+ #鏁扮粍杞疆
+ np_result = np_arr.T
+
+ return np_result
+
+
+
+####################################################
+
+def get_data(types,num,start_time,end_time):
+
+ if types =='river':
+ return river_list(start_time,end_time,num)
+ if types =='rain':
+ return rain_list(start_time,end_time,num)
+
+ if types =='gw':
+ return gw_list(start_time,end_time,num)
+
+#娌虫祦 姘存枃绔�
+def river_list(start_time,end_time,STCD):
+ # 寤虹珛涓嶰racle鏁版嵁搴撶殑杩炴帴
+ connection = cx_Oracle.connect('mzy/mzy_^22dPoO0@192.168.44.8:1521/swzdh')
+ # 鍒涘缓娓告爣瀵硅薄
+ cursor = connection.cursor()
+
+ sql = """
+ SELECT * FROM swzdh.river
+ WHERE STCD = :STCD and tm BETWEEN TO_DATE(:start_time, 'YYYY-MM-DD') AND TO_DATE(:end_time, 'YYYY-MM-DD') order by tm ASC
+ """
+ res =[]
+ try:
+ cursor.execute(sql, {'start_time': start_time, 'end_time': end_time,'STCD':STCD})
+
+ column_names = [row[0] for row in cursor.description]
+ print("瀛楁鍚�:", column_names)
+
+ # 鑾峰彇鎵�鏈夌粨鏋滈泦
+ result = cursor.fetchall()
+
+ # 杈撳嚭缁撴灉
+ for row in result:
+ times = row[2]
+ date_str = times.strftime("%Y-%m-%d")
+ dicts={"time":date_str,"value":row[4],"stname":row[1]}
+ res.append(dicts)
+
+ except Exception as e:
+ print("Error occurred: ", str(e))
+ finally:
+ # 鍏抽棴娓告爣鍜岃繛鎺�
+ cursor.close()
+ connection.close()
+ return res
+
+ #闄嶉洦閲�
+def rain_list(start_time,end_time,STCD):
+ # 寤虹珛涓嶰racle鏁版嵁搴撶殑杩炴帴
+ connection = cx_Oracle.connect('mzy/mzy_^22dPoO0@192.168.44.8:1521/swzdh')
+ # 鍒涘缓娓告爣瀵硅薄
+ cursor = connection.cursor()
+
+ sql = """
+ SELECT * FROM swzdh.rain
+ WHERE STCD = :STCD and tm BETWEEN TO_DATE(:start_time, 'YYYY-MM-DD') AND TO_DATE(:end_time, 'YYYY-MM-DD') order by tm ASC
+ """
+ res =[]
+ try:
+ cursor.execute(sql, {'start_time': start_time, 'end_time': end_time,'STCD':STCD})
+
+ column_names = [row[0] for row in cursor.description]
+ print("瀛楁鍚�:", column_names)
+
+ # 鑾峰彇鎵�鏈夌粨鏋滈泦
+ result = cursor.fetchall()
+ print(result)
+
+ date_str_arr=[]
+ date_str_dict={}
+ # 杈撳嚭缁撴灉
+ name =""
+ for row in result:
+ name= row[1]
+ times = row[2]
+ date_str = times.strftime("%Y-%m-%d")
+ R = row[3]
+ if date_str in date_str_dict:
+ date_str_dict[date_str] = date_str_dict[date_str] + R
+ else:
+ date_str_dict[date_str] = R
+ date_str_arr.append(date_str)
+ for item in date_str_arr:
+ value = round(date_str_dict[item],2)
+ temp ={"time":item,"value":value,"stname":name}
+ res.append(temp)
+
+ except Exception as e:
+ print("Error occurred: ", str(e))
+ finally:
+ # 鍏抽棴娓告爣鍜岃繛鎺�
+ cursor.close()
+ connection.close()
+ return res
+
+
+# 鍦颁笅姘寸洃娴嬩簳 涓や釜琛� V_WT_YRS锛孷_Z_YRS
+def gw_list(start_time,end_time,STCD):
+
+ conn = pymssql.connect(server='192.168.44.66',
+ user='xsyrs',
+ password='gws@xsyrs2024',
+ database='DB_DXS',
+ as_dict=True)
+
+ cursor = conn.cursor()
+ res =[]
+ try:
+ sql = "SELECT * FROM V_Z_YRS where STCD = '" +STCD +"' and TM >= '"+start_time +"' and TM <= '"+end_time +"' order by TM ASC"
+ cursor.execute(sql)
+ result = cursor.fetchall()
+
+ for row in result:
+ times = row["TS"]
+ date_str = times.strftime("%Y-%m-%d")
+ value = float(row["Z"])
+ bd = float(row["BD"])
+ dicts={"time":date_str,"value":value,"bd":bd}
+ res.append(dicts)
+
+
+ except Exception as e:
+ print("Error occurred:", str(e))
+ finally:
+ cursor.close()
+ conn.close()
+ return res
\ No newline at end of file
diff --git a/DataTransf.py b/DataTransf.py
new file mode 100644
index 0000000..903a6cf
--- /dev/null
+++ b/DataTransf.py
@@ -0,0 +1,526 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Wed Mar 20 14:44:36 2024
+
+@author: ZMK
+"""
+import numpy as np
+import flopy
+from openpyxl import load_workbook
+import os
+import Base as base
+import CalHead
+
+#娌虫祦鐨勫垎娈典笅鏍�
+riv_seg={0:[454,479],1:[480,505],2:[506,527],3:[528,562]}
+riv_seg_celles=[26,26,22,35]
+#杈圭晫鐨勫垎娈典笅鏍�
+ibound_seg={0:[1,86],1:[87,111],2:[112,142],3:[143,170],4:[171,240],
+ 5:[241,282],6:[283,354],7:[355,393],8:[394,436],9:[437,453]}
+
+
+
+def base_excel(model_name,types):
+ if types =='闄嶉洦':
+ return rch_excel(model_name)
+ if types =='娌虫祦':
+ return river_excel(model_name)
+ if types =='寮�閲囬噺':
+ return well_excel(model_name)
+ if types =='杈圭晫':
+ return ibound_excel(model_name)
+
+ return []
+
+
+#闄嶉洦cxcel
+def rch_excel(model_name):
+ paths = base.model_dir + model_name +"\\闄嶉洦.xlsx"
+ data=[]
+ if not os.path.exists(paths):
+ return data
+ wb = load_workbook(filename = paths)
+ ws = wb[wb.sheetnames[0]]
+
+ for row in ws.iter_rows():
+ tmp =[]
+ for cell in row:
+ tmp.append(cell.value)
+ data.append(tmp)
+ wb.close()
+ #鍒嗘瀽闄嶆按骞朵笖鏇存柊
+ rch_analysis(data,model_name)
+ return data
+
+def rch_analysis(data_array,model_name):
+
+ periods =CalHead.get_model_period(model_name)
+ #鍛ㄦ湡鏁�
+ periods_len= len(periods)
+
+ array = np.asarray(data_array)
+ fid= array[1:17,2]
+ params = array[1:17,3]
+ float_params = np.asarray(params,dtype=float)
+ #鍙栧嚭鏉� 1-16琛� 4-col_last鍒楃殑鏁版嵁
+ col_last = 4 + periods_len
+ data = array[1:17,4:col_last]
+ float_data = np.asarray(data,dtype=float)
+
+ for i in range(0,len(float_data)):
+ for j in range(0,len(float_data[i])):
+ float_data[i][j] = float_data[i][j] * float_params[i] /30/100
+
+ rch_update(float_data,fid,model_name,periods_len)
+
+#鏇存柊妯″瀷rch鏁版嵁
+def rch_update(float_data,fids,model_name,periods_len):
+
+ if model_name == base.not_allowed_model or model_name in base.archive_models:
+ return "鏈ā鍨嬩负楠岃瘉妯″瀷,涓嶅厑璁镐慨鏀癸紒"
+ model_ws = base.model_dir + model_name
+ mx = flopy.modflow.Modflow.load("modflow.nam", model_ws = model_ws, exe_name="mf2005", verbose=True, version="mf2005", check=False)
+
+ areas= base.getAreas()
+
+ for per in range(periods_len):
+ #rch 涓�涓懆鏈熺殑鏁版嵁
+ item = mx.rch.rech.__getitem__(kper=per)
+ array2d = item.get_value()
+
+ per_data = float_data[:,per]
+ print(per_data)
+
+ for i in range(0,len(per_data)):
+ data =round(float(per_data[i]),8)
+ fid = fids[i]
+ tuples = areas[fid]
+ for entity in tuples:
+ x = entity[0]
+ y = entity[1]
+ array2d[x][y]= data
+
+ mx.rch.rech.__setitem__(key=per, value=array2d)
+
+
+ rch = flopy.modflow.ModflowRch(mx,nrchop=mx.rch.nrchop,
+ ipakcb=mx.rch.ipakcb,
+ rech=mx.rch.rech,
+ irch =mx.rch.irch)
+ rch.write_file(check=False)
+
+
+#娌虫祦鏁版嵁瑙f瀽
+def river_excel(model_name):
+ paths = base.model_dir + model_name +"\\娌虫祦.xlsx"
+ data=[]
+ if not os.path.exists(paths):
+ return data
+ wb = load_workbook(filename = paths)
+ ws = wb[wb.sheetnames[0]]
+
+ for row in ws.iter_rows():
+ tmp =[]
+ for cell in row:
+ tmp.append(cell.value)
+ data.append(tmp)
+ wb.close()
+ result =[]
+ for i in range(1,len(data)):
+ result.append(data[i])
+
+ river_analysis(result,model_name)
+ return result
+
+#鍒嗘瀽娌虫祦鏁版嵁
+def river_analysis(data_array,model_name):
+
+ periods =CalHead.get_model_period(model_name)
+ periods_len= len(periods)
+
+ row_last= 1 + periods_len
+ array = np.asarray(data_array)
+ data = array[1:row_last,1:2]
+ data2 = array[1:row_last,1:4]
+
+ merge_array = np.concatenate((data,data2),axis=1)
+
+ params = array[1:row_last,5:9]
+
+ float_data = np.asarray(merge_array,dtype=float)
+ float_params = np.asarray(params,dtype=float)
+
+ for i in range(0,len(float_data)):
+ for j in range(0,len(float_data[i])):
+ temp = round(float_data[i][j] * float_params[i][j] *30*86400 ,4)
+ last = round(temp/riv_seg_celles[j]/30,4)
+ float_data[i][j]=last
+ print(float_data)
+ river_update(float_data,model_name,periods_len)
+
+
+#鏇存柊娌虫祦鏁版嵁
+def river_update(float_data,model_name,periods_len):
+
+ if model_name == base.not_allowed_model or model_name in base.archive_models:
+ return "鏈ā鍨嬩负楠岃瘉妯″瀷,涓嶅厑璁镐慨鏀癸紒"
+
+ model_ws = base.model_dir + model_name
+ ml = flopy.modflow.Modflow.load("modflow.nam", model_ws = model_ws, exe_name="mf2005", verbose=True, version="mf2005", check=False)
+
+ #寰幆璁剧疆wel鏂囦欢锛屾洿鏂版暟鎹�
+ # lrcq = {0:[[2, 3, 4, -100.]], 1:[[2, 3, 4, -100.]]}
+ lrcq = {}
+
+ for per in range(periods_len):
+
+ wel = []
+ wel = ml.wel.stress_period_data.__getitem__(kper=per)
+ #娌虫祦鍒嗘鏁版嵁
+ segment0 = float_data[per][0]
+ segment1 = float_data[per][1]
+ segment2 = float_data[per][2]
+ segment3 = float_data[per][3]
+
+ #瀛樺偍姣忎釜搴斿姏鏈熺殑鏁版嵁
+ array2d = []
+ count = 1
+ for Layer, Row, Column, Q in wel:
+ array = []
+
+ if count>= riv_seg[0][0] and count <= riv_seg[0][1]:
+ array = [Layer, Row, Column, segment0]
+
+ elif count>= riv_seg[1][0] and count <= riv_seg[1][1]:
+ array = [Layer, Row, Column, segment1]
+
+ elif count>= riv_seg[2][0] and count <= riv_seg[2][1]:
+ array = [Layer, Row, Column, segment2]
+
+ elif count>= riv_seg[3][0] and count <= riv_seg[3][1]:
+ array = [Layer, Row, Column, segment3]
+ else:
+ array = [Layer, Row, Column, Q]
+
+ array2d.append(array)
+ count +=1
+
+ lrcq[per] = array2d
+
+
+ flopy.modflow.ModflowWel(ml,ipakcb= ml.wel.ipakcb,
+ dtype=ml.wel.dtype,
+ options=ml.wel.options,
+ stress_period_data=lrcq)
+ ml.write_input()
+
+
+
+ #瑙f瀽寮�閲囬噺鐨勬暟鎹�
+def well_excel(model_name):
+ paths = base.model_dir + model_name +"\\寮�閲囬噺.xlsx"
+ data=[]
+ if not os.path.exists(paths):
+ return data
+ wb = load_workbook(filename = paths)
+
+ ws = wb[wb.sheetnames[0]]
+
+ for row in ws.iter_rows():
+ tmp =[]
+ for cell in row:
+ tmp.append(cell.value)
+ data.append(tmp)
+ wb.close()
+ result =[]
+ for i in range(1,len(data)):
+ result.append(data[i])
+ well_analysis(result,model_name)
+ return result
+
+
+#寮�閲囬噺鐨勫垎鏋�
+def well_analysis(data_array,model_name):
+
+ periods =CalHead.get_model_period(model_name)
+ periods_len= len(periods)
+ row_last= 1 + periods_len
+
+ array = np.asarray(data_array)
+ data = array[1:row_last,1:5]
+ float_data= np.asarray(data,dtype=float)
+
+ #杞疆鏁扮粍
+ zz_array = float_data.transpose()
+
+ zz_data = []
+ for i in range(50):
+ zz_data.append(zz_array[0])
+ for i in range(49):
+ zz_data.append(zz_array[1])
+ for i in range(18):
+ zz_data.append(zz_array[2])
+ for i in range(12):
+ zz_data.append(zz_array[3])
+ zz_data.append(zz_array[0])
+
+ np_data = np.asarray(zz_data,dtype=float)
+
+ well_scale = np.loadtxt(base.well_scale_path, dtype=str)
+ float_scale= np.asarray(well_scale,dtype=float)
+
+ ##鎶芥按閲� = 鍚勫煄鍖烘湀寮�閲囬噺*琛楅亾姣斾緥*10000/(琛楅亾浜曟暟*30)
+ for i in range(0,len(np_data)):
+ for j in range(0,len(np_data[i])):
+ tmp = np_data[i][j] * float_scale[i][0]*10000/( float_scale[i][1] *30)
+ np_data[i][j] = round(tmp,4)
+
+ well_update(np_data,model_name,periods_len)
+
+
+#鏇存柊寮�閲囬噺
+def well_update(np_data,model_name,periods_len):
+
+ if model_name == base.not_allowed_model or model_name in base.archive_models:
+ return "鏈ā鍨嬩负楠岃瘉妯″瀷,涓嶅厑璁镐慨鏀癸紒"
+
+ model_ws = base.model_dir + model_name
+ ml = flopy.modflow.Modflow.load("modflow.nam", model_ws = model_ws, exe_name="mf2005", verbose=True, version="mf2005", check=False)
+
+ #寰幆璁剧疆wel鏂囦欢锛屾洿鏂版暟鎹�
+ # lrcq = {0:[[2, 3, 4, -100.]], 1:[[2, 3, 4, -100.]]}
+ lrcq = {}
+ for per in range(periods_len):
+ wel = []
+ wel = ml.wel.stress_period_data.__getitem__(kper=per)
+
+ per_data = np_data[:,per]
+
+ #瀛樺偍姣忎釜搴斿姏鏈熺殑鏁版嵁
+ array2d = []
+
+ #well鏂囦欢涓� 鍓�562涓綉鏍间笉鏄簳
+ # Layer= wel[i][0]
+ # Row= wel[i][1]
+ # Col = wel[i][2]
+ # Q = wel[i][3]
+ for i in range(0,562):
+ array = [wel[i][0],wel[i][1], wel[i][2],wel[i][3]]
+ array2d.append(array)
+
+ for i in range(562,len(wel)):
+ indexid = i-562
+ update_data=per_data[indexid]
+ array = [wel[i][0],wel[i][1], wel[i][2],update_data]
+ array2d.append(array)
+
+ lrcq[per] = array2d
+
+ flopy.modflow.ModflowWel(ml,ipakcb= ml.wel.ipakcb,dtype=ml.wel.dtype,
+ options=ml.wel.options,
+ stress_period_data=lrcq)
+ ml.write_input()
+
+
+
+
+ #瑙f瀽杈圭晫鐨勬暟鎹�
+def ibound_excel(model_name):
+ paths = base.model_dir + model_name +"\\杈圭晫.xlsx"
+ data=[]
+ if not os.path.exists(paths):
+ return data
+ wb = load_workbook(filename = paths)
+
+ ws = wb[wb.sheetnames[0]]
+
+ for row in ws.iter_rows():
+ tmp =[]
+ for cell in row:
+ tmp.append(cell.value)
+ data.append(tmp)
+ wb.close()
+ result =[]
+ for i in range(1,len(data)):
+ result.append(data[i])
+
+ np_array = ibound_analysis(result,model_name)
+
+ #杩斿洖椤甸潰灞曠ず鐨勫唴瀹规暟缁�
+ view_data = ibound_view_data(np_array)
+
+ periods =CalHead.get_model_period(model_name)
+ periods_len= len(periods)
+
+ ibound_update(np_array,model_name,periods_len)
+
+ return view_data
+
+
+
+
+#鏇存柊杈圭晫
+def ibound_update(np_array,model_name,periods_len):
+
+ if model_name == base.not_allowed_model or model_name in base.archive_models:
+ return "鏈ā鍨嬩负楠岃瘉妯″瀷,涓嶅厑璁镐慨鏀癸紒"
+
+ model_ws = base.model_dir + model_name
+ ml = flopy.modflow.Modflow.load("modflow.nam", model_ws = model_ws, exe_name="mf2005", verbose=True, version="mf2005", check=False)
+
+ #寰幆璁剧疆wel鏂囦欢锛屾洿鏂版暟鎹�
+ # lrcq = {0:[[2, 3, 4, -100.]], 1:[[2, 3, 4, -100.]]}
+ lrcq = {}
+ for per in range(periods_len):
+ wel = []
+ wel = ml.wel.stress_period_data.__getitem__(kper=per)
+ per_data = np_array[:,per]
+
+ #瀛樺偍姣忎釜搴斿姏鏈熺殑鏁版嵁
+ array2d = []
+
+ count = 1
+ for Layer, Row, Column, Q in wel:
+ array = []
+
+ if count>= ibound_seg[0][0] and count <= ibound_seg[0][1]:
+ array = [Layer, Row, Column, per_data[0]]
+
+ elif count>= ibound_seg[1][0] and count <= ibound_seg[1][1]:
+ array = [Layer, Row, Column, per_data[1]]
+
+ elif count>= ibound_seg[2][0] and count <= ibound_seg[2][1]:
+ array = [Layer, Row, Column, per_data[2]]
+
+ elif count>= ibound_seg[3][0] and count <= ibound_seg[3][1]:
+ array = [Layer, Row, Column, per_data[3]]
+
+ elif count>= ibound_seg[4][0] and count <= ibound_seg[4][1]:
+ array = [Layer, Row, Column, per_data[4]]
+
+ elif count>= ibound_seg[5][0] and count <= ibound_seg[5][1]:
+ array = [Layer, Row, Column, per_data[5]]
+
+ elif count>= ibound_seg[6][0] and count <= ibound_seg[6][1]:
+ array = [Layer, Row, Column, per_data[6]]
+
+ elif count>= ibound_seg[7][0] and count <= ibound_seg[7][1]:
+ array = [Layer, Row, Column, per_data[7]]
+
+ elif count>= ibound_seg[8][0] and count <= ibound_seg[8][1]:
+ array = [Layer, Row, Column, per_data[8]]
+
+ elif count>= ibound_seg[9][0] and count <= ibound_seg[9][1]:
+ array = [Layer, Row, Column, per_data[9]]
+
+ else:
+ array = [Layer, Row, Column, Q]
+
+ array2d.append(array)
+ count +=1
+
+ lrcq[per] = array2d
+
+ flopy.modflow.ModflowWel(ml,ipakcb= ml.wel.ipakcb,
+ dtype=ml.wel.dtype,
+ options=ml.wel.options,
+ stress_period_data=lrcq)
+ ml.write_input()
+
+
+
+#杈圭晫鐨勫垎鏋�
+def ibound_analysis(data_array,model_name):
+ array = np.asarray(data_array)
+ data = array[1:10,2:14]
+ #澶у彴 鍗楄緵鎴� 涓婅媷鐢� 涓夊搴� 楹昏 娓╂硥 娴锋穩 闃冲潑 娌欐渤
+ float_data= np.asarray(data,dtype=float)
+
+ # 娴佸叆1-1 (1-6)澶у彴 鍗楄緵鎴� 涓婅媷鐢� 涓夊搴� 楹昏 娓╂硥
+ result =[]
+ data1= float_data[[0,1,2,3,4,5]]
+
+ sum1 = data1.sum(axis = 0)
+
+ result.append(sum1)
+
+ # 娴佸叆1-2()涓婅媷鐢�
+ data2= float_data[2]
+
+ result.append(data2)
+ #娴佸叆1-3() 澶у彴
+ data3 = float_data[0]
+ result.append(data3)
+
+ # 娴佸嚭1-1 澶у彴 鍗楄緵鎴�
+ data4 = float_data[[0,1]]
+ sum4 = data4.sum(axis = 0)
+ result.append((-sum4))
+ # 娴佸嚭1-2 澶у彴
+ data5 = float_data[0]
+ result.append((-data5))
+
+ #娴佸叆3-1 澶у彴
+ data6 = float_data[0]
+ result.append(data6)
+
+ # 娴佸叆3-2 澶у彴 鍗楄緵鎴� 涓婅媷鐢�
+ data7 = float_data[[0,1,2]]
+ sum7 = data7.sum(axis = 0)
+ result.append(sum7)
+
+ # 娴佸叆3-3 澶у彴 鍗楄緵鎴� 涓婅媷鐢�
+ # data8= float_data[[0,1,2]]
+ result.append(sum7)
+ # 娴佸叆3-4 澶у彴 鍗楄緵鎴� 涓婅媷鐢�
+ # data9= float_data[[0,1,2]]
+ result.append(sum7)
+ # 娴佸叆3-5 澶у彴 鍗楄緵鎴� 涓婅媷鐢�
+ # data10= float_data[[0,1,2]]
+ result.append(sum7)
+
+ np_data = np.asarray(result,dtype=float)
+
+ np_data = np.around(np_data, decimals=2)
+
+ return np_data
+
+
+def ibound_view_data(np_data):
+
+ names=['娴佸叆1-1','娴佸叆1-2','娴佸叆1-3','娴佸嚭1-1','娴佸嚭1-2',
+ '娴佸叆3-1','娴佸叆3-2','娴佸叆3-3','娴佸叆3-4','娴佸叆3-5']
+ row_sums = np.sum(np_data, axis=1)
+ row_sums= np.around(row_sums,2)
+
+ params=[1,1,1,2.5,1,0.5,0.5,0.5,0.5,0.5]
+ cells=[86,47,31,28,50,42,72,39,43,17]
+ per=12
+ x=30
+ water=[]
+ for i in range(0,len(names)):
+ tmp = round( row_sums[i] * params[i] * cells[i] * per *x , 2)
+ water.append(tmp)
+ arr=[]
+ arr.append(names)
+ arr.append(row_sums)
+ arr.append(params)
+ arr.append(water)
+ str_np = np.asarray(arr,dtype=str)
+ zz= str_np.transpose()
+
+ title =['杈圭晫','闄嶉洦閲�','绯绘暟','杈撳叆鍊�']
+ result =[]
+ result.append(title)
+
+ for item in zz:
+ result.append(item)
+
+ result = np.asarray(result,dtype=str).tolist()
+
+ return result
+
+
+
+
+
diff --git a/GRU_zmk.py b/GRU_zmk.py
new file mode 100644
index 0000000..9ff5282
--- /dev/null
+++ b/GRU_zmk.py
@@ -0,0 +1,275 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Fri May 24 15:33:12 2024
+
+@author: BDYGS
+"""
+
+# -*- coding: utf-8 -*-
+"""
+Created on Tue Apr 23 05:28:13 2024
+
+@author: BDYGS
+"""
+
+# -*- coding: utf-8 -*-
+"""
+Created on Sat Apr 6 04:01:04 2024
+
+@author: BDYGS
+"""
+
+import matplotlib.pyplot as plt
+import numpy as np
+import pandas as pd
+import torch
+import torch.nn as nn
+from torch.autograd import Variable
+from sklearn.preprocessing import StandardScaler, MinMaxScaler
+from sklearn.metrics import mean_squared_error
+from sklearn.metrics import mean_absolute_error
+from torch.utils.data import TensorDataset
+from tqdm import tqdm
+
+
+
+class Config():
+ data_path = "C:\\Users\\ZMK\\Desktop\\GRU\鐜夋硥灞变簳.csv"
+ timestep = 60 # 鏃堕棿姝ラ暱锛屽氨鏄埄鐢ㄥ灏戞椂闂寸獥鍙�
+ batch_size = 30 # 鎵规澶у皬
+ feature_size = 8 # 姣忎釜姝ラ暱瀵瑰簲鐨勭壒寰佹暟閲忥紝杩欓噷鍙娇鐢�1缁达紝姣忓ぉ鐨勯閫�
+ hidden_size = 256 # 闅愬眰澶у皬
+ output_size = 15 # 鐢变簬鏄崟杈撳嚭浠诲姟锛屾渶缁堣緭鍑哄眰澶у皬涓�1锛岄娴嬫湭鏉�1澶╅閫�
+ num_layers = 2 # gru鐨勫眰鏁�
+ epochs = 100 # 杩唬杞暟
+ best_loss = 0 # 璁板綍鎹熷け
+ learning_rate = 0.0003 # 瀛︿範鐜�
+
+
+config = Config()
+
+
+def normalization(data,label):
+ mm_x=MinMaxScaler() # 瀵煎叆sklearn鐨勯澶勭悊瀹瑰櫒
+ mm_y=MinMaxScaler()
+ data=mm_x.fit_transform(data) # 瀵规暟鎹拰鏍囩杩涜褰掍竴鍖栫瓑澶勭悊
+ label=mm_y.fit_transform(label)
+ return data,label,mm_y
+
+
+def split_windows(data,seq_len,output_size):
+ x=[]
+ y=[]
+ for i in range(len(data)-seq_len-1-output_size): # range鐨勮寖鍥撮渶瑕佸噺鍘绘椂闂存闀垮拰1
+ _x=data[i:(i+seq_len),:]
+ _y=data[(i+seq_len):(i+seq_len+output_size),2:] #娉ㄦ剰锛侊紒锛佽繖涓湴鏂规槸鍙杔abel鐨�
+
+ x.append(_x)
+ y.append(_y)
+ print('split_windows_i:',i)
+ print(_x.shape,_y.shape)
+ x,y=np.array(x),np.array(y)
+ print('x.shape,y.shape=\n',x.shape,y.shape)
+ return x,y
+
+
+
+
+def split_data(x,y,split_ratio):
+
+ train_size=int(len(y)*split_ratio)
+ test_size=len(y)-train_size
+
+ x_data=Variable(torch.Tensor(np.array(x)))
+ y_data=Variable(torch.Tensor(np.array(y)))
+
+ x_train=Variable(torch.Tensor(np.array(x[0:train_size])))
+ y_train=Variable(torch.Tensor(np.array(y[0:train_size])))
+ y_test=Variable(torch.Tensor(np.array(y[train_size:len(y)])))
+ x_test=Variable(torch.Tensor(np.array(x[train_size:len(x)])))
+
+ print('x_data.shape,y_data.shape,x_train.shape,y_train.shape,x_test.shape,y_test.shape:\n{}{}{}{}{}{}'
+ .format(x_data.shape,y_data.shape,x_train.shape,y_train.shape,x_test.shape,y_test.shape))
+
+ return x_data,y_data,x_train,y_train,x_test,y_test
+
+
+def nash_sutcliffe_efficiency(y_true, y_pred):
+ """
+ 璁$畻Nash-Sutcliffe Efficiency鎸囨爣銆�
+ 鍙傛暟:
+ y_true : array-like, 鐪熷疄瑙傛祴鍊�
+ y_pred : array-like, 棰勬祴鍊�
+ 杩斿洖:
+ nse : float, Nash-Sutcliffe Efficiency
+ """
+ return 1 - np.sum((y_true - y_pred)**2) / np.sum((y_true - np.mean(y_true))**2)
+
+
+
+# 1.鍔犺浇鏃堕棿搴忓垪鏁版嵁
+
+df= pd.read_csv(config.data_path,parse_dates=["date"],index_col=[0])
+#parse_dates灏嗚鍒楄涓烘椂闂寸储寮�
+
+print(df.shape)
+
+data = df.iloc[:,0:8] # 浠ョ壒寰佷綔涓烘暟鎹�
+label = df.iloc[:,7]
+data = data.values
+label = label.values.reshape(-1,1)
+
+# torch.manual_seed(7) #璁剧疆鐢熸垚闅忔満鏁扮殑绉嶅瓙锛屼互淇濊瘉浠g爜鐨勫彲閲嶅鎬�
+
+data,label,mm_y=normalization(data,label)
+
+dataX,dataY = split_windows(data,config.timestep,config.output_size)
+
+x_data,y_data,x_train,y_train,x_test,y_test = split_data(dataX,dataY,0.8)
+
+# 5.褰㈡垚璁粌鏁版嵁闆�
+train_data = TensorDataset(x_train,y_train)
+test_data = TensorDataset(x_test,y_test)
+
+
+# 6.灏嗘暟鎹姞杞芥垚杩唬鍣�
+train_loader = torch.utils.data.DataLoader(train_data,
+ config.batch_size,
+ False)
+
+test_loader = torch.utils.data.DataLoader(test_data,
+ config.batch_size,
+ False)
+
+
+# 7.瀹氫箟GRU缃戠粶
+class GRU(nn.Module):
+ def __init__(self, feature_size, hidden_size, num_layers, output_size):
+ super(GRU, self).__init__()
+ self.hidden_size = hidden_size
+ self.output_size = output_size
+ # 闅愬眰澶у皬
+ self.num_layers = num_layers # gru灞傛暟
+ # feature_size涓虹壒寰佺淮搴︼紝灏辨槸姣忎釜鏃堕棿鐐瑰搴旂殑鐗瑰緛鏁伴噺锛岃繖閲屼负1
+ self.gru = nn.GRU(feature_size, hidden_size, num_layers, dropout=0.8,batch_first=True)
+ self.fc1 = nn.Linear(self.hidden_size, self.output_size)
+ self.fc2 = nn.Linear(self.hidden_size, self.output_size)
+ self.fc3 = nn.Linear(self.hidden_size, self.output_size)
+ self.fc4 = nn.Linear(self.hidden_size, self.output_size)
+ self.fc5 = nn.Linear(self.hidden_size, self.output_size)
+ self.fc6 = nn.Linear(self.hidden_size, self.output_size)
+
+ def forward(self, x, hidden=None):
+ batch_size = x.size()[0] # 鑾峰彇鎵规澶у皬
+
+ # 鍒濆鍖栭殣灞傜姸鎬�
+ if hidden is None:
+ h_0 = x.data.new(self.num_layers, batch_size, self.hidden_size).fill_(0).float()
+ else:
+ h_0 = hidden
+
+ # GRU杩愮畻
+ output, h_0 = self.gru(x, h_0)
+
+ # 鑾峰彇GRU杈撳嚭鐨勭淮搴︿俊鎭�
+ batch_size, timestep, hidden_size = output.shape
+
+ # 灏唎utput鍙樻垚 batch_size * timestep, hidden_dim
+ # output = output.reshape(-1, hidden_size)
+
+ preds = []
+ pred1, pred2, pred3 = self.fc1(output), self.fc2(output), self.fc3(output)
+ pred1, pred2, pred3 = pred1[:, -1, :], pred2[:, -1, :], pred3[:, -1, :]
+ pred4, pred5, pred6 = self.fc4(output), self.fc5(output), self.fc6(output)
+ pred4, pred5, pred6 = pred4[:, -1, :], pred5[:, -1, :], pred6[:, -1, :]
+ pred = torch.stack([pred1, pred2, pred3,pred4, pred5, pred6], dim=2)
+
+ return pred
+
+
+model = GRU(config.feature_size, config.hidden_size, config.num_layers, config.output_size) # 瀹氫箟GRU缃戠粶
+print(model)
+loss_function = nn.MSELoss() # 瀹氫箟鎹熷け鍑芥暟
+optimizer = torch.optim.AdamW(model.parameters(), lr=config.learning_rate) # 瀹氫箟浼樺寲鍣�
+
+# 8.妯″瀷璁粌
+for epoch in range(config.epochs):
+ model.train()
+ running_loss = 0
+ train_bar = tqdm(train_loader) # 褰㈡垚杩涘害鏉�
+ for data in train_bar:
+ x_train, y_train = data # 瑙e寘杩唬鍣ㄤ腑鐨刋鍜孻
+ optimizer.zero_grad()
+ y_train_pred = model(x_train)
+
+ loss = loss_function(y_train_pred, y_train)
+ loss.backward()
+ optimizer.step()
+
+ running_loss += loss.item()
+ train_bar.desc = "train epoch[{}/{}] loss:{:.6f}".format(epoch + 1,
+ config.epochs,
+ loss)
+
+print('Finished Training')
+
+model_name = 'GRU_YQS'
+torch.save(model.state_dict(), 'C://Users//ZMK//Desktop//GRU/{}.pth'.format(model_name))
+
+
+model.eval()
+
+#妯″瀷楠岃瘉锛氱敤鍘熷鏁版嵁鍐嶇畻涓�娆�
+
+df= pd.read_csv(config.data_path,parse_dates=["date"],index_col=[0])
+#parse_dates灏嗚鍒楄涓烘椂闂寸储寮�
+
+data = df.iloc[:,0:8] # 浠ュ洓涓壒寰佷綔涓烘暟鎹�
+label = df.iloc[:,7]
+data = data.values
+label = label.values.reshape(-1,1)
+
+
+data,label,mm_y=normalization(data,label)
+
+dataX,dataY = split_windows(data,config.timestep,config.output_size)
+
+x_data,y_data,x_train,y_train,x_test,y_test = split_data(dataX,dataY,0.8)
+
+test_pre = model(x_data)
+
+with pd.ExcelWriter("C:\\Users\\ZMK\\Desktop\\GRU\GRU-YQS.xlsx", engine='openpyxl') as writer:
+
+ for i in range(6):
+ test_pre_data = test_pre[:,0,i].data.numpy().reshape(-1,1)
+ y_test_pre = y_data[:,0,i].data.numpy().reshape(-1,1)
+
+ print(test_pre_data.shape)
+
+ test_pre_data_inv = mm_y.inverse_transform(test_pre_data)
+
+ # print(test_pre_data_inv.shape)
+ y_test_inv =mm_y.inverse_transform(y_test_pre)
+
+
+ plt.figure(figsize=(10,5))
+ plt.plot(y_test_inv)
+ plt.plot(test_pre_data_inv)
+ plt.legend(('real', 'predict'),fontsize='15')
+ plt.show()
+
+ print('MAE/RMSE/NSE')
+ print(mean_absolute_error(y_test_inv, test_pre_data_inv))
+ print(np.sqrt(mean_squared_error(y_test_inv, test_pre_data_inv)))
+ print(nash_sutcliffe_efficiency(y_test_inv, test_pre_data_inv))
+
+ y_test_inv = pd.DataFrame(y_test_inv, columns=[f'True Node {i+1}'])
+ test_pre_data_inv = pd.DataFrame(test_pre_data_inv, columns=[f'test Node {i+1}'])
+
+ # 灏嗙粨鏋滀繚瀛樺埌涓嶅悓鐨勫伐浣滆〃涓�
+ test_pre_data_inv.to_excel(writer, sheet_name=f'True Node {i+1}', index=False)
+ y_test_inv.to_excel(writer, sheet_name=f'test Node {i+1}', index=False)
+
+
+
+
diff --git "a/GRU_zmk_pre - \345\211\257\346\234\254.py" "b/GRU_zmk_pre - \345\211\257\346\234\254.py"
new file mode 100644
index 0000000..010b70f
--- /dev/null
+++ "b/GRU_zmk_pre - \345\211\257\346\234\254.py"
@@ -0,0 +1,215 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Sun May 26 02:15:11 2024
+
+@author: BDYGS
+"""
+
+
+import matplotlib.pyplot as plt
+import numpy as np
+import pandas as pd
+import torch
+import torch.nn as nn
+from torch.autograd import Variable
+# import tushare as ts
+from sklearn.preprocessing import StandardScaler, MinMaxScaler
+from sklearn.metrics import mean_squared_error
+from sklearn.metrics import mean_absolute_error
+from torch.utils.data import TensorDataset
+from tqdm import tqdm
+
+
+
+
+class Config():
+ # data_path = "C:\\Users\\ZMK\\Desktop\\GRU\姘稿畾娌充簳.csv"
+ timestep = 60 # 鏃堕棿姝ラ暱锛屽氨鏄埄鐢ㄥ灏戞椂闂寸獥鍙�
+ batch_size = 30 # 鎵规澶у皬
+ feature_size = 8 # 姣忎釜姝ラ暱瀵瑰簲鐨勭壒寰佹暟閲忥紝杩欓噷鍙娇鐢�1缁达紝姣忓ぉ鐨勯閫�
+ hidden_size = 256 # 闅愬眰澶у皬
+ output_size = 15 # 鐢变簬鏄崟杈撳嚭浠诲姟锛屾渶缁堣緭鍑哄眰澶у皬涓�1锛岄娴嬫湭鏉�1澶╅閫�
+ num_layers = 2 # gru鐨勫眰鏁�
+ epochs = 100 # 杩唬杞暟
+ best_loss = 0 # 璁板綍鎹熷け
+ learning_rate = 0.0003 # 瀛︿範鐜�
+ # model_name = 'GRU_ZMK' # 妯″瀷鍚嶇О
+ # save_path = 'C://Users//ZMK//Desktop//GRU//{}.pth'.format(model_name) # 鏈�浼樻ā鍨嬩繚瀛樿矾寰�
+
+config = Config()
+
+
+def normalization(data,label):
+ mm_x=MinMaxScaler() # 瀵煎叆sklearn鐨勯澶勭悊瀹瑰櫒
+ mm_y=MinMaxScaler()
+ data=mm_x.fit_transform(data) # 瀵规暟鎹拰鏍囩杩涜褰掍竴鍖栫瓑澶勭悊
+ label=mm_y.fit_transform(label)
+ return data,label,mm_y
+
+
+def split_windows(data,seq_len,output_size):
+ x=[]
+ y=[]
+ for i in range(len(data)-seq_len-1-output_size): # range鐨勮寖鍥撮渶瑕佸噺鍘绘椂闂存闀垮拰1
+ _x=data[i:(i+seq_len),:]
+ _y=data[(i+seq_len):(i+seq_len+output_size),2:] #娉ㄦ剰锛侊紒锛佽繖涓湴鏂规槸鍙杔abel鐨�
+
+ x.append(_x)
+ y.append(_y)
+ print('split_windows_i:',i)
+ print(_x.shape,_y.shape)
+ x,y=np.array(x),np.array(y)
+ print('x.shape,y.shape=\n',x.shape,y.shape)
+ return x,y
+
+def split_windows_long(data,seq_len,output_size):
+
+ print(len(data))
+ x=[]
+ y=[]
+ for i in range(int(len(data)/output_size)-4):
+ a = i*output_size
+ # print(a)
+ _x=data[a:a+seq_len,:]
+ # print(_x.shape)
+ _y=data[a+seq_len:a+seq_len+output_size,2:] #娉ㄦ剰锛侊紒锛佽繖涓湴鏂规槸鍙杔abel鐨�
+ # print(_y.shape)
+ x.append(_x)
+ y.append(_y)
+ print('split_windows_i:',i)
+ # print(_x,_y)
+ x,y=np.array(x),np.array(y)
+ print('x.shape,y.shape=\n',x.shape,y.shape) # (1035, 60, 4) (1035,)
+ return x,y
+
+
+def nash_sutcliffe_efficiency(y_true, y_pred):
+ """
+ 璁$畻Nash-Sutcliffe Efficiency鎸囨爣銆�
+ 鍙傛暟:
+ y_true : array-like, 鐪熷疄瑙傛祴鍊�
+ y_pred : array-like, 棰勬祴鍊�
+ 杩斿洖:
+ nse : float, Nash-Sutcliffe Efficiency
+ """
+ return 1 - np.sum((y_true - y_pred)**2) / np.sum((y_true - np.mean(y_true))**2)
+
+
+
+# 7.瀹氫箟GRU缃戠粶
+class GRU(nn.Module):
+ def __init__(self, feature_size, hidden_size, num_layers, output_size):
+ super(GRU, self).__init__()
+ self.hidden_size = hidden_size
+ self.output_size = output_size
+ # 闅愬眰澶у皬
+ self.num_layers = num_layers # gru灞傛暟
+ # feature_size涓虹壒寰佺淮搴︼紝灏辨槸姣忎釜鏃堕棿鐐瑰搴旂殑鐗瑰緛鏁伴噺锛岃繖閲屼负1
+ self.gru = nn.GRU(feature_size, hidden_size, num_layers, dropout=0.8,batch_first=True)
+ self.fc1 = nn.Linear(self.hidden_size, self.output_size)
+ self.fc2 = nn.Linear(self.hidden_size, self.output_size)
+ self.fc3 = nn.Linear(self.hidden_size, self.output_size)
+ self.fc4 = nn.Linear(self.hidden_size, self.output_size)
+ self.fc5 = nn.Linear(self.hidden_size, self.output_size)
+ self.fc6 = nn.Linear(self.hidden_size, self.output_size)
+
+ def forward(self, x, hidden=None):
+ batch_size = x.size()[0] # 鑾峰彇鎵规澶у皬
+
+ # 鍒濆鍖栭殣灞傜姸鎬�
+ if hidden is None:
+ h_0 = x.data.new(self.num_layers, batch_size, self.hidden_size).fill_(0).float()
+ else:
+ h_0 = hidden
+
+ # GRU杩愮畻
+ output, h_0 = self.gru(x, h_0)
+
+ # 鑾峰彇GRU杈撳嚭鐨勭淮搴︿俊鎭�
+ batch_size, timestep, hidden_size = output.shape
+
+ # 灏唎utput鍙樻垚 batch_size * timestep, hidden_dim
+ # output = output.reshape(-1, hidden_size)
+
+ preds = []
+ pred1, pred2, pred3 = self.fc1(output), self.fc2(output), self.fc3(output)
+ pred1, pred2, pred3 = pred1[:, -1, :], pred2[:, -1, :], pred3[:, -1, :]
+ pred4, pred5, pred6 = self.fc4(output), self.fc5(output), self.fc6(output)
+ pred4, pred5, pred6 = pred4[:, -1, :], pred5[:, -1, :], pred6[:, -1, :]
+ pred = torch.stack([pred1, pred2, pred3,pred4, pred5, pred6], dim=2)
+
+ return pred
+
+model = GRU(config.feature_size, config.hidden_size, config.num_layers, config.output_size) # 瀹氫箟GRU缃戠粶
+print(model)
+loss_function = nn.MSELoss() # 瀹氫箟鎹熷け鍑芥暟
+optimizer = torch.optim.AdamW(model.parameters(), lr=config.learning_rate) # 瀹氫箟浼樺寲鍣�
+
+#
+model.load_state_dict(torch.load('C://Users//ZMK//Desktop//GRU//GRU_YDH.pth'))
+
+
+model.eval()
+#pre
+
+df_pre = pd.read_csv("C:\\Users\\ZMK\\Desktop\\GRU\\姘稿畾娌充簳-pre.csv",parse_dates=["date"],index_col=[0])
+
+print(df_pre.shape)
+
+data_pre = df_pre.iloc[:,0:8]
+
+label_pre = df_pre.iloc[:,7] #label娌℃湁瀹為檯浣滅敤锛屼富瑕佺敤浣滄鍒欏寲缂╂斁鐨勶紝涓嶅弬涓庤绠�
+
+
+data_pre = data_pre.values
+
+label_pre = label_pre.values.reshape(-1,1)
+
+data_pre,label_pre,mm_y_pre = normalization(data_pre,label_pre)
+dataX_pre,dataY_pre = split_windows_long(data_pre,config.timestep,config.output_size)
+
+dataX_pre = Variable(torch.Tensor(np.array(dataX_pre)))
+dataY_pre = Variable(torch.Tensor(np.array(dataY_pre)))
+
+print(dataY_pre.shape)
+
+test_pre = model(dataX_pre)
+
+print(test_pre.shape)
+
+
+
+
+with pd.ExcelWriter("C:\\Users\\ZMK\\Desktop\\GRU\\GRU-pre-ydh.xlsx", engine='openpyxl') as writer:
+
+ for i in range(6):
+ test_pre_data = test_pre[:,:,i].data.numpy().reshape(-1,1)
+ y_test_pre = dataY_pre[:,:,i].data.numpy().reshape(-1,1)
+
+ test_pre_data_inv = mm_y_pre.inverse_transform(test_pre_data)
+ y_test_inv =mm_y_pre.inverse_transform(y_test_pre)
+
+
+ # plt.figure(figsize=(10,5))
+ # plt.plot(y_test_inv)
+ # plt.plot(test_pre_data_inv)
+ # plt.legend(('real', 'predict'),fontsize='15')
+ # plt.show()
+
+ print('MAE/RMSE/NSE')
+ print(mean_absolute_error(y_test_inv, test_pre_data_inv))
+ print(np.sqrt(mean_squared_error(y_test_inv, test_pre_data_inv)))
+ print(nash_sutcliffe_efficiency(y_test_inv, test_pre_data_inv))
+
+ y_test_inv = pd.DataFrame(y_test_inv, columns=[f'True Node {i+1}'])
+ test_pre_data_inv = pd.DataFrame(test_pre_data_inv, columns=[f'pre Node {i+1}'])
+
+ # 灏嗙粨鏋滀繚瀛樺埌涓嶅悓鐨勫伐浣滆〃涓�
+ test_pre_data_inv.to_excel(writer, sheet_name=f'True Node {i+1}', index=False)
+ y_test_inv.to_excel(writer, sheet_name=f'pre Node {i+1}', index=False)
+
+
+
+
+
+
diff --git a/GRU_zmk_pre.py b/GRU_zmk_pre.py
new file mode 100644
index 0000000..d3bab52
--- /dev/null
+++ b/GRU_zmk_pre.py
@@ -0,0 +1,267 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Sun May 26 02:15:11 2024
+
+@author: BDYGS
+"""
+
+
+import matplotlib.pyplot as plt
+import numpy as np
+import pandas as pd
+import torch
+import torch.nn as nn
+from torch.autograd import Variable
+# import tushare as ts
+from sklearn.preprocessing import StandardScaler, MinMaxScaler
+from sklearn.metrics import mean_squared_error
+from sklearn.metrics import mean_absolute_error
+from torch.utils.data import TensorDataset
+from tqdm import tqdm
+from datetime import datetime
+
+import DataTask
+
+
+path_dir_left ="C://Users//ZMK//Desktop//GRU//"
+
+path_dir_right ="C:\\Users\\ZMK\\Desktop\\GRU\\"
+
+
+
+class Config():
+ # data_path = "C:\\Users\\ZMK\\Desktop\\GRU\姘稿畾娌充簳.csv"
+ timestep = 60 # 鏃堕棿姝ラ暱锛屽氨鏄埄鐢ㄥ灏戞椂闂寸獥鍙�
+ batch_size = 30 # 鎵规澶у皬
+ feature_size = 8 # 姣忎釜姝ラ暱瀵瑰簲鐨勭壒寰佹暟閲忥紝杩欓噷鍙娇鐢�1缁达紝姣忓ぉ鐨勯閫�
+ hidden_size = 256 # 闅愬眰澶у皬
+ output_size = 15 # 鐢变簬鏄崟杈撳嚭浠诲姟锛屾渶缁堣緭鍑哄眰澶у皬涓�1锛岄娴嬫湭鏉�1澶╅閫�
+ num_layers = 2 # gru鐨勫眰鏁�
+ epochs = 100 # 杩唬杞暟
+ best_loss = 0 # 璁板綍鎹熷け
+ learning_rate = 0.0003 # 瀛︿範鐜�
+ # model_name = 'GRU_ZMK' # 妯″瀷鍚嶇О
+ # save_path = 'C://Users//ZMK//Desktop//GRU//{}.pth'.format(model_name) # 鏈�浼樻ā鍨嬩繚瀛樿矾寰�
+
+config = Config()
+
+
+def normalization(data,label):
+ mm_x=MinMaxScaler() # 瀵煎叆sklearn鐨勯澶勭悊瀹瑰櫒
+ mm_y=MinMaxScaler()
+ data=mm_x.fit_transform(data) # 瀵规暟鎹拰鏍囩杩涜褰掍竴鍖栫瓑澶勭悊
+ label=mm_y.fit_transform(label)
+ return data,label,mm_y
+
+
+def split_windows(data,seq_len,output_size):
+ x=[]
+ y=[]
+ for i in range(len(data)-seq_len-1-output_size): # range鐨勮寖鍥撮渶瑕佸噺鍘绘椂闂存闀垮拰1
+ _x=data[i:(i+seq_len),:]
+ _y=data[(i+seq_len):(i+seq_len+output_size),2:] #娉ㄦ剰锛侊紒锛佽繖涓湴鏂规槸鍙杔abel鐨�
+
+ x.append(_x)
+ y.append(_y)
+ print('split_windows_i:',i)
+ print(_x.shape,_y.shape)
+ x,y=np.array(x),np.array(y)
+ print('x.shape,y.shape=\n',x.shape,y.shape)
+ return x,y
+
+def split_windows_long(data,seq_len,output_size):
+
+ print(len(data))
+ x=[]
+ y=[]
+ for i in range(int(len(data)/output_size)-4):
+ a = i*output_size
+ # print(a)
+ _x=data[a:a+seq_len,:]
+ # print(_x.shape)
+ _y=data[a+seq_len:a+seq_len+output_size,2:] #娉ㄦ剰锛侊紒锛佽繖涓湴鏂规槸鍙杔abel鐨�
+ # print(_y.shape)
+ x.append(_x)
+ y.append(_y)
+ print('split_windows_i:',i)
+ # print(_x,_y)
+ x,y=np.array(x),np.array(y)
+ print('x.shape,y.shape=\n',x.shape,y.shape) # (1035, 60, 4) (1035,)
+ return x,y
+
+
+def nash_sutcliffe_efficiency(y_true, y_pred):
+ """
+ 璁$畻Nash-Sutcliffe Efficiency鎸囨爣銆�
+ 鍙傛暟:
+ y_true : array-like, 鐪熷疄瑙傛祴鍊�
+ y_pred : array-like, 棰勬祴鍊�
+ 杩斿洖:
+ nse : float, Nash-Sutcliffe Efficiency
+ """
+ return 1 - np.sum((y_true - y_pred)**2) / np.sum((y_true - np.mean(y_true))**2)
+
+
+
+# 7.瀹氫箟GRU缃戠粶
+class GRU(nn.Module):
+ def __init__(self, feature_size, hidden_size, num_layers, output_size):
+ super(GRU, self).__init__()
+ self.hidden_size = hidden_size
+ self.output_size = output_size
+ # 闅愬眰澶у皬
+ self.num_layers = num_layers # gru灞傛暟
+ # feature_size涓虹壒寰佺淮搴︼紝灏辨槸姣忎釜鏃堕棿鐐瑰搴旂殑鐗瑰緛鏁伴噺锛岃繖閲屼负1
+ self.gru = nn.GRU(feature_size, hidden_size, num_layers, dropout=0.8,batch_first=True)
+ self.fc1 = nn.Linear(self.hidden_size, self.output_size)
+ self.fc2 = nn.Linear(self.hidden_size, self.output_size)
+ self.fc3 = nn.Linear(self.hidden_size, self.output_size)
+ self.fc4 = nn.Linear(self.hidden_size, self.output_size)
+ self.fc5 = nn.Linear(self.hidden_size, self.output_size)
+ self.fc6 = nn.Linear(self.hidden_size, self.output_size)
+
+ def forward(self, x, hidden=None):
+ batch_size = x.size()[0] # 鑾峰彇鎵规澶у皬
+
+ # 鍒濆鍖栭殣灞傜姸鎬�
+ if hidden is None:
+ h_0 = x.data.new(self.num_layers, batch_size, self.hidden_size).fill_(0).float()
+ else:
+ h_0 = hidden
+
+ # GRU杩愮畻
+ output, h_0 = self.gru(x, h_0)
+
+ # 鑾峰彇GRU杈撳嚭鐨勭淮搴︿俊鎭�
+ batch_size, timestep, hidden_size = output.shape
+
+ # 灏唎utput鍙樻垚 batch_size * timestep, hidden_dim
+ # output = output.reshape(-1, hidden_size)
+
+ preds = []
+ pred1, pred2, pred3 = self.fc1(output), self.fc2(output), self.fc3(output)
+ pred1, pred2, pred3 = pred1[:, -1, :], pred2[:, -1, :], pred3[:, -1, :]
+ pred4, pred5, pred6 = self.fc4(output), self.fc5(output), self.fc6(output)
+ pred4, pred5, pred6 = pred4[:, -1, :], pred5[:, -1, :], pred6[:, -1, :]
+ pred = torch.stack([pred1, pred2, pred3,pred4, pred5, pred6], dim=2)
+
+ return pred
+
+
+
+#鏍规嵁缂栧彿鑾峰彇涓嶅悓鐨勯娴嬫ā鍨�
+def getModelName(well_num):
+ if well_num in DataTask.arr1:
+
+ return 'GRU_YDH.pth'
+
+ else :
+ return 'GRU_YQS.pth'
+
+
+
+#鍐欏叆鏁版嵁鍒癱sv
+def write_csv(model_name , np_result,csv_path):
+
+ df =""
+ if model_name =='GRU_YDH.pth':
+ df = pd.DataFrame({"date":np_result[:,0], "Myrainfall":np_result[:,1],
+ "flowrate":np_result[:,2], "LQWB":np_result[:,3],
+ "ZSSC":np_result[:,4], "WTY":np_result[:,5],
+ "LSH":np_result[:,6], "HZZ":np_result[:,7],"GC":np_result[:,8]
+ })
+
+ else:
+ df = pd.DataFrame({"date":np_result[:,0], "HDrainfall":np_result[:,1],
+ "flowrate":np_result[:,2], "SXC":np_result[:,3],
+ "XM1":np_result[:,4], "XM2":np_result[:,5],
+ "SYSC":np_result[:,6], "SJYY":np_result[:,7],"BW":np_result[:,8]
+ })
+
+ df.to_csv(csv_path, index=False)
+
+
+ #杩愯棰勬祴妯″瀷
+def runPredictModel(well_num):
+
+ data =""
+ csv_path = ""
+ excel_path = ""
+ #棰勬祴妯″瀷
+ model_name = getModelName(well_num)
+
+ #姘稿畾娌虫ā鍨�
+ if model_name == 'GRU_YDH.pth':
+
+ csv_path = path_dir_right + "姘稿畾娌充簳-pre.csv"
+ excel_path = path_dir_right + "姘稿畾娌充簳-棰勬祴缁撴灉.xlsx"
+
+ data = DataTask.get_ydh15_real_data()
+ else:
+
+ csv_path = path_dir_right + "鐜夋硥灞变簳-pre.csv"
+ excel_path = path_dir_right + "鐜夋硥灞变簳-棰勬祴缁撴灉.xlsx"
+
+ data = DataTask.getyqs15_real_data()
+
+
+ #鍐欏叆鏁版嵁鍒癱sv
+ write_csv(model_name,data,csv_path)
+
+ model_path = path_dir_left + model_name
+
+ model = GRU(config.feature_size, config.hidden_size, config.num_layers, config.output_size) # 瀹氫箟GRU缃戠粶
+
+ loss_function = nn.MSELoss() # 瀹氫箟鎹熷け鍑芥暟
+ optimizer = torch.optim.AdamW(model.parameters(), lr=config.learning_rate) # 瀹氫箟浼樺寲鍣�
+
+ model.load_state_dict(torch.load(model_path))
+ model.eval()
+
+
+ #CSV 鏂囦欢鏁版嵁 璺緞
+
+ # "C:\\Users\\ZMK\\Desktop\\GRU\\姘稿畾娌充簳-pre.csv"
+ df_pre = pd.read_csv(csv_path , parse_dates=["date"],index_col=[0])
+
+
+ data_pre = df_pre.iloc[:,0:8]
+
+ label_pre = df_pre.iloc[:,7] #label娌℃湁瀹為檯浣滅敤锛屼富瑕佺敤浣滄鍒欏寲缂╂斁鐨勶紝涓嶅弬涓庤绠�
+
+ data_pre = data_pre.values
+
+ label_pre = label_pre.values.reshape(-1,1)
+
+ data_pre,label_pre,mm_y_pre = normalization(data_pre,label_pre)
+ dataX_pre,dataY_pre = split_windows_long(data_pre,config.timestep,config.output_size)
+
+ dataX_pre = Variable(torch.Tensor(np.array(dataX_pre)))
+ dataY_pre = Variable(torch.Tensor(np.array(dataY_pre)))
+
+ test_pre = model(dataX_pre)
+
+
+ with pd.ExcelWriter( excel_path , engine='openpyxl') as writer:
+
+ for i in range(6):
+ test_pre_data = test_pre[:,:,i].data.numpy().reshape(-1,1)
+ y_test_pre = dataY_pre[:,:,i].data.numpy().reshape(-1,1)
+
+ test_pre_data_inv = mm_y_pre.inverse_transform(test_pre_data)
+ y_test_inv =mm_y_pre.inverse_transform(y_test_pre)
+
+
+
+ y_test_inv = pd.DataFrame(y_test_inv, columns=[f'True Node {i+1}'])
+ test_pre_data_inv = pd.DataFrame(test_pre_data_inv, columns=[f'pre Node {i+1}'])
+
+ # 灏嗙粨鏋滀繚瀛樺埌涓嶅悓鐨勫伐浣滆〃涓�
+ test_pre_data_inv.to_excel(writer, sheet_name=f'True Node {i+1}', index=False)
+ y_test_inv.to_excel(writer, sheet_name=f'pre Node {i+1}', index=False)
+
+
+
+
+
+
diff --git a/MainAPI.py b/MainAPI.py
index 78b64b3..a1adfdf 100644
--- a/MainAPI.py
+++ b/MainAPI.py
@@ -4,21 +4,21 @@
from flask import jsonify
from flask import request
from flask_cors import CORS
-import sys
import numpy as np
-import pandas as pd
import flopy
-import flopy.utils.binaryfile as bf
-import csv
import time
-from openpyxl import load_workbook
import os
import shutil
+import json
import Base as base
import CalHead
import Predict
-import json
import ModelPeriod
+import AchiveReport as achiveReport
+import BigData
+import OpenExcel
+import DataTransf
+import DataTask
# Flask鍑芥暟鎺ユ敹涓�涓弬鏁癬_name__锛屽畠浼氭寚鍚戠▼搴忔墍鍦ㄧ殑鍖�
app = Flask(__name__)
@@ -33,11 +33,13 @@
#娌虫祦cell鐨勬暟閲�
riverCellSize = 109
-iboundGroupSize = 5
-iboundGroup={1:[1,86],2:[87,111],3:[112,142],4:[143,170],5:[171,240]}
+iboundGroupSize = 10
+iboundGroup={1:[1,86],2:[87,111],3:[112,142],4:[143,170],5:[171,240],
+ 6:[241,282],7:[283,354],8:[355,393],9:[394,436],10:[437,453]}
-iboundGroup3Size = 5
-iboundGroup3={1:[241,282],2:[283,354],3:[355,393],4:[394,436],5:[437,453]}
+iboundName =["瑗夸晶娴佸叆","鍖楅儴娴佸叆","涓滃寳閮ㄦ祦鍏�","涓滈儴娴佸嚭","鍗楅儴娴佸嚭",
+ "灞卞尯娴佸叆","姘稿畾娌虫柇瑁傛祦鍏�","榛勫簞楂樹附鏂娴佸叆","鍏疂灞辨柇瑁傛祦鍏�","鏄嗘槑婀栨柇瑁傚叆娴�"]
+
riverGroupSize = 4
riverGroup={1:[454,479],2:[480,505],3:[506,527],4:[528,562]}
@@ -49,7 +51,7 @@
def getModel(model_name):
model_ws=""
if not model_name:
- model_ws = "202001_202212"
+ model_ws = base.not_allowed_model
else:
model_ws = base.model_dir + model_name
@@ -60,7 +62,7 @@
@app.route('/baseparam/', methods=['GET'])
def baseparam():
- model_name = request.args.get('model_name')
+ model_name = request.args.get('model_name')
ml= getModel(model_name)
nrclp = ml.get_nrow_ncol_nlay_nper()
dict = {"Row": nrclp[0], "Column": nrclp[1],
@@ -71,8 +73,31 @@
months = ModelPeriod.get_months_in_range_ym(start_time, end_time)
dict["months"]=months
+ print(jsondata)
+ if "initHeader" in jsondata:
+ dict["initHead"] = jsondata["initHeader"]
+ else:
+ dict["initHead"] = ""
return jsonify(dict)
+#淇濆瓨鍒濆姘村ご
+@app.route('/saveInitHead', methods=['POST'])
+def saveInitHead():
+ jsondata = request.get_json()
+ model_name = str(jsondata['model_name'])
+ initHeader = str(jsondata['initHead'])
+
+ if model_name == base.not_allowed_model or model_name in base.archive_models:
+ return jsonify("鏈ā鍨嬩负楠岃瘉妯″瀷,涓嶅厑璁镐慨鏀癸紒")
+
+ jsondata= CalHead.get_model_json(model_name)
+ jsondata["initHeader"] = initHeader
+
+ jpath = base.model_dir + model_name +"\\prediction.json"
+ with open(jpath, "w",encoding='utf-8') as outfile:
+ json.dump(jsondata, outfile,ensure_ascii=False)
+
+ return jsonify("淇濆瓨鍒濆姘村ご鎴愬姛锛�")
#璇诲彇wel鏂囦欢 鍙傛暟涓� Period
@app.route('/welList/', methods=['GET'])
@@ -97,11 +122,16 @@
result_len = len(result)
+ ibound_segment={}
+
if layerparam == '1':
#杈圭晫
+
+ ibound_segment={"1":[0,85],"2":[86,110],"3":[111,141],"4":[142,169],"5":[170,239]}
+
for i in range(0, 240):
iboundarray.append(result[i])
- #娌虫祦
+ #娌虫祦
for i in range(453, 562):
riverarray.append(result[i])
@@ -114,12 +144,17 @@
welarray.append(result[i])
elif layerparam == '3':
+
+ ibound_segment={"6":[0,41],"7":[42,113],"8":[114,152],"9":[153,195],"10":[196,212]}
+
for i in range(240, 453):
iboundarray.append(result[i])
+ ibounddict = {"name": "ibound", "data": iboundarray,"segment":ibound_segment}
- ibounddict = {"name": "ibound", "data": iboundarray}
- riverdict = {"name": "river", "data": riverarray}
+ riversgement={"1":[0,25],"2":[26,51],"3":[52,73],"4":[74,108]}
+ riverdict = {"name": "river", "data": riverarray,"segment":riversgement}
+
weldict = {"name": "wel", "data": welarray}
@@ -128,6 +163,7 @@
data.append(ibounddict)
data.append(weldict)
return jsonify(data)
+
#璇诲彇鍗曚釜浜曠殑鏁版嵁
@app.route('/wel/', methods=['GET'])
@@ -169,6 +205,9 @@
# model_name = request.args.get('model_name')
model_name = str(json['model_name'])
+ if model_name == base.not_allowed_model or model_name in base.archive_models:
+ return jsonify("鏈ā鍨嬩负楠岃瘉妯″瀷,涓嶅厑璁镐慨鏀癸紒")
+
ml= getModel(model_name)
@@ -199,119 +238,19 @@
lrcq[per] = array2d
- flopy.modflow.ModflowWel(ml,stress_period_data=lrcq)
+ flopy.modflow.ModflowWel(ml,ipakcb= ml.wel.ipakcb,dtype=ml.wel.dtype,
+ options=ml.wel.options,
+ stress_period_data=lrcq)
ml.write_input()
return jsonify("鏁版嵁鏇存柊瀹屾瘯锛�")
-
-
-#璇诲叆鐢靛瓙琛ㄦ牸鏂囦欢鐢熸垚wel 鏂囦欢
-@app.route('/cellFileInput', methods=['POST'])
-def cellFileInput():
-
- path ='C:\\Users\\ZMK\\Desktop\\寰呭彂閫乗\cell鏂囦欢.xlsx'
-
- data = get_cell_data(path)
-
- lrcq= get_cell_struct(data["excel1"],data["excel2"],data["excel3"])
-
- model_name = request.args.get('model_name')
-
- ml= getModel(model_name)
-
- flopy.modflow.ModflowWel(ml,stress_period_data=lrcq)
- ml.write_input()
-
- return jsonify("sucess")
-
-
-def get_cell_struct(excel1,excel2,excel3):
- lrcq={}
-
- #鍛ㄦ湡鏁伴噺
- period = 7
- start_row_index = 1
-
- #杈圭晫鏁版嵁 excel
- for col in range (0,period):
- array =[]
- for row in range(start_row_index, len(excel1)):
-
- arr = [excel1[row][2]-1,excel1[row][3]-1,excel1[row][4]-1,excel1[row][6+col]]
- array.append(arr)
- lrcq[col]= array
-
- #娌虫祦鏁版嵁 excel
- for col in range (0,period):
- array =[]
- for row in range(start_row_index, len(excel2)):
-
- arr = [excel2[row][2]-1,excel2[row][3]-1,excel2[row][4]-1,excel2[row][6+col]]
- array.append(arr)
-
- lrcq[col].extend(array)
-
- #鎶芥按鏁版嵁 excel
- for col in range (0,period):
-
- array =[]
- for row in range(start_row_index, len(excel3)):
-
- arr = [excel3[row][1]-1,excel3[row][2]-1,excel3[row][3]-1,excel3[row][8+col]]
- array.append(arr)
-
- lrcq[col].extend(array)
-
- return lrcq
-
-
-
-#鑾峰彇cell鏂囦欢
-#file_path 鏂囦欢鐨勮矾寰�
-def get_cell_data(file_path):
-
- workbook = load_workbook(file_path)
- sheetnames = workbook.get_sheet_names()
- #read first sheet
- sheet1 = workbook[sheetnames[0]]
- sheet2 = workbook[sheetnames[1]]
- sheet3 = workbook[sheetnames[2]]
-
- excel1 =[]
- excel2=[]
- excel3=[]
- # 閬嶅巻璇诲彇鏁翠釜宸ヤ綔琛�
- for row in sheet1.iter_rows(values_only=True):
- array=[]
- for cell in row:
- array.append(cell)
- excel1.append(array)
-
- for row in sheet2.iter_rows(values_only=True):
- array=[]
- for cell in row:
- array.append(cell)
- excel2.append(array)
-
- for row in sheet3.iter_rows(values_only=True):
- array=[]
- for cell in row:
- array.append(cell)
- excel3.append(array)
-
- # 鍏抽棴Excel鏂囦欢
- workbook.close()
- data={"excel1":excel1,"excel2":excel2,"excel3":excel3}
-
- return data
-
#璇诲彇wel鏂囦欢 鍙傛暟涓� Period
@app.route('/iboundList/', methods=['GET'])
def iboundList():
- return jsonify(iboundGroupSize)
+ return jsonify(iboundName)
#杈圭晫鐨勫垎缁勬暟鎹�
@@ -360,6 +299,10 @@
data = json['data']
model_name = json['model_name']
+
+ if model_name == base.not_allowed_model or model_name in base.archive_models:
+ return jsonify("鏈ā鍨嬩负楠岃瘉妯″瀷,涓嶅厑璁镐慨鏀癸紒")
+
ml= getModel(model_name)
index = iboundGroup[no]
@@ -392,7 +335,10 @@
lrcq[per] = array2d
- flopy.modflow.ModflowWel(ml,stress_period_data=lrcq)
+ flopy.modflow.ModflowWel(ml,ipakcb= ml.wel.ipakcb,
+ dtype=ml.wel.dtype,
+ options=ml.wel.options,
+ stress_period_data=lrcq)
ml.write_input()
return jsonify("鏁版嵁鏇存柊瀹屾瘯锛�")
@@ -458,6 +404,9 @@
end_index = index[1]
model_name = json['model_name']
+ if model_name == base.not_allowed_model or model_name in base.archive_models:
+ return jsonify("鏈ā鍨嬩负楠岃瘉妯″瀷,涓嶅厑璁镐慨鏀癸紒")
+
ml= getModel(model_name)
periods =CalHead.get_model_period(model_name)
@@ -487,7 +436,11 @@
lrcq[per] = array2d
- flopy.modflow.ModflowWel(ml,stress_period_data=lrcq)
+
+ flopy.modflow.ModflowWel(ml,ipakcb= ml.wel.ipakcb,
+ dtype=ml.wel.dtype,
+ options=ml.wel.options,
+ stress_period_data=lrcq)
ml.write_input()
return jsonify("鏁版嵁鏇存柊瀹屾瘯锛�")
@@ -529,55 +482,14 @@
return jsonify(result)
-#闄嶆按鏁版嵁淇敼
-# @app.route('/precipitationInput', methods=['POST'])
-# def precipitationInput():
-
-# json = request.get_json()
-# model_name= str(json['model_name'])
-# period = int(json['period'])
-# #鏈夊簭鐨勫簲鍔涘懆鏈熷垪琛� json
-# data = json['data']
-# dict = {}
-# for i in range(len(data)):
-# q1 = data[i]['Q1']
-# q2 = data[i]['Q2']
-# dict[q1] = q2
-
-# ml= getModel(model_name)
-
-# item = ml.rch.rech.__getitem__(kper=period)
-# array2d = item.get_value()
-
-# count = 0
-
-# array2d_len = len(array2d)
-
-# for i in range(array2d_len):
-
-# array_len = len(array2d[i])
-
-# for j in range(array_len):
-
-# va = str(array2d[i][j])
-# if va in dict:
-# count += 1
-# array2d[i][j] = float(dict[va])
-
-# ml.rch.rech.__setitem__(key=period, value=array2d)
-
-# rch = flopy.modflow.ModflowRch(ml, rech=ml.rch.rech)
-# rch.write_file(check=False)
-# #ml.write_input()
-
-# return jsonify("闄嶆按鍙傛暟淇敼瀹屾瘯锛�")
-
@app.route('/precipitationInput', methods=['POST'])
def precipitationInput():
json = request.get_json()
model_name= str(json['model_name'])
+ if model_name == base.not_allowed_model or model_name in base.archive_models:
+ return jsonify("鏈ā鍨嬩负楠岃瘉妯″瀷,涓嶅厑璁镐慨鏀癸紒")
period = int(json['period'])
#鏈夊簭鐨勫簲鍔涘懆鏈熷垪琛� json
data = json['data']
@@ -597,7 +509,7 @@
tuples= areas[key]
zblen= len(tuples)
- values = float(dict[key])
+ values = round(float(dict[key]),8)
for i in range(zblen):
x = tuples[i][0]
y = tuples[i][1]
@@ -605,106 +517,14 @@
ml.rch.rech.__setitem__(key=period, value=array2d)
- rch = flopy.modflow.ModflowRch(ml, rech = ml.rch.rech)
+ rch = flopy.modflow.ModflowRch(ml,nrchop=ml.rch.nrchop,
+ ipakcb=ml.rch.ipakcb,
+ rech=ml.rch.rech,
+ irch =ml.rch.irch)
rch.write_file(check=False)
# ml.write_input()
return jsonify("闄嶆按鍙傛暟淇敼瀹屾瘯锛�")
-
-#瀵煎叆csv鏂囦欢
-@app.route('/precipitationInputFile', methods=['POST'])
-def precipitationInputFile():
-
- model_name = request.args.get('model_name')
- ml= getModel(model_name)
- save_path = 'C:/Users/ZMK/Desktop/test1/' + "1111.xlsx"
- file = request.files.get('file')
-
- if file:
- file.save(save_path)
-
- #鑾峰彇璇诲彇鐨別xcel 琛ㄦ牸鏁版嵁
- stations = get_station_struct(save_path)
-
- #寰幆鍛ㄦ湡
- #perd鍛ㄦ湡鍙橀噺
- #array2d 姣忎釜鍛ㄦ湡鐨勪簩缁存暟缁�
- for perd in range(0,36):
- period = perd
- item = ml.rch.rech.__getitem__(kper=period)
- array2d = item.get_value()
-
- array2d_len = len(array2d)
- count = 0
- #寰幆绔欑偣灏嗕竴涓猵eriod鐨勬墍鏈塻tations杩涜瀛楀吀瀛樺偍
- dict = {}
- for k in range(0,len(stations)):
- row = stations[k]["row"]
- column = stations[k]["column"]
-
- data_old = array2d[row][column]
- data_new = stations[k]["data"][perd]
- dict[data_old]= data_new
-
-
- #寰幆璁剧疆姣忎釜period 鐨勫��
- for i in range(array2d_len):
-
- array_len = len(array2d[i])
-
- for j in range(array_len):
-
- va = str(array2d[i][j])
- if va in dict:
- array2d[i][j] = float(dict[va])
-
- #灏哸rray2d閲嶆柊set 瀵瑰簲鐨� item 鍛ㄦ湡鍐�
- ml.rch.rech.__setitem__(key=period, value=array2d)
-
- rch = flopy.modflow.ModflowRch(ml, rech=ml.rch.rech)
- rch.write_file(check=False)
- # ml.write_input()
- return '鏂囦欢涓婁紶鎴愬姛'
- else:
- return '涓婁紶澶辫触锛屾湭閫夋嫨鏂囦欢'
-
-
-#鑾峰彇绔欑偣鐨勬暟鎹紝鏋勯�犳暟鎹粨鏋�
-#file_path 鏂囦欢鐨勮矾寰�
-def get_station_struct(file_path):
-
- workbook = load_workbook(file_path)
- sheetnames = workbook.get_sheet_names()
- #read first sheet
- sheet = workbook[sheetnames[0]]
-
- array2d_excel=[]
- # 閬嶅巻璇诲彇鏁翠釜宸ヤ綔琛�
- for row in sheet.iter_rows(values_only=True):
- array=[]
- for cell in row:
- array.append(cell)
- array2d_excel.append(array)
- # 鍏抽棴Excel鏂囦欢
- workbook.close()
-
- #鏁版嵁鐨勫紑濮嬩笅鏍�
- data_start_index=6
- #淇℃伅鐨勫紑濮嬭鍙�
- start_row_index = 1
- #瀛樺偍绔欑偣淇℃伅
- stations = []
- for i in range (start_row_index,len(array2d_excel)):
- st={"name":array2d_excel[i][1],"row":array2d_excel[i][4],"column":array2d_excel[i][5]}
- data=[]
- for j in range(data_start_index,len(array2d_excel[i])):
- cell_data = array2d_excel[i][j]
- cell_data= cell_data/100/30*0.15
- data.append(round(cell_data, 6))
- st["data"]= data
- stations.append(st)
-
- return stations
#杩愯妯″瀷
@@ -712,22 +532,30 @@
def runModel():
model_name = request.args.get('model_name')
- msg= Predict.run_model_predict(model_name)
- #瀵煎嚭csv鏂囦欢
- csvpath = CalHead.exportCsV(model_name)
+ if model_name == base.not_allowed_model or model_name in base.archive_models:
+ return jsonify("鏈ā鍨嬩负楠岃瘉妯″瀷,涓嶅厑璁镐慨鏀癸紒")
- #鏇存柊妯″瀷涓夌淮缃戞牸閰嶇疆
+ dicts= Predict.run_model_predict(model_name)
+ if dicts["code"] == 400:
+ return dicts["msg"]
+ #瀵煎嚭csv鏂囦欢
+ CalHead.exportCsV(model_name)
+
+ # #鏇存柊妯″瀷涓夌淮缃戞牸閰嶇疆
base.updateModelConfig(model_name)
- #鍒涘缓妯″瀷鐨勪笁缁寸綉鏍�
+ # #鍒涘缓妯″瀷鐨勪笁缁寸綉鏍�
filedir = base.model3d_path + model_name
- print(filedir)
if not os.path.exists(filedir):
os.makedirs(filedir, exist_ok=True)
- base.callModelexe()
- return jsonify(msg)
+ base.callModelexe()
+ #璁$畻姘磋祫婧愰噺鍜屾按鍧囪
+ CalHead.run_zonebudget_bal(model_name)
+ CalHead.run_zonebudget_res(model_name)
+
+ return jsonify(dicts["msg"])
#鐢熸垚妯″瀷csv 鏂囦欢
@app.route('/runModelCsv/', methods=['GET'])
@@ -739,23 +567,6 @@
return jsonify(result)
-
-#鍒濆姘翠綅淇℃伅
-@app.route('/initWater/', methods=['GET'])
-def initWater():
-
- period = request.args.get('period')
-
- per = int(period)
-
- model_name = request.args.get('model_name')
-
- ml= getModel(model_name)
- item = ml.rch.rech.__getitem__(kper=per)
- value = item.get_value()
- t = np.array(value).tolist()
- return jsonify(t)
-
#鍒涘缓鏂版ā鍨�
@app.route('/saveModel/', methods=['GET'])
def saveModel():
@@ -763,29 +574,65 @@
modelname = request.args.get('name')
startTime = request.args.get('startTime')
endTime = request.args.get('endTime')
+ remark = request.args.get('remark')
file_list = os.listdir(base.model_dir)
for name in file_list:
if name == modelname:
return jsonify("妯″瀷鍚嶇О宸茬粡瀛樺湪锛屼笉鍏佽閲嶅鍒涘缓锛�")
+
+ pers = ModelPeriod.get_months_in_range_count(startTime,endTime)
+ if pers > 60 :
+ return jsonify("妯″瀷鍒涘缓澶辫触锛屾渶澶氬彧鍏佽60涓懆鏈熺殑杩炵画棰勬祴锛�")
dir = base.model_dir + modelname
- shutil.copytree(base.predictModel,dir)
+
+ if pers==12:
+ shutil.copytree(base.predictModel,dir)
+ else:
+ #濡傛灉涓嶆槸涓�骞寸殑棰勬祴锛� 鍙兘涓� 鍏朵粬鐨勫鍛ㄦ湡鐨勯娴� 澶т簬 12 涓懆鏈熸垨鑰� 灏忎簬12涓懆鏈�
+ #棣栧厛鎶�60涓懆鏈熺殑褰撳仛妯″瀷clone涓�浠斤紝 鐒跺悗淇敼 dis wel rch 鏂囦欢
+ #wel 鏂囦欢鍜� rch 鏂囦欢涓嶉渶瑕佷慨鏀�
+ shutil.copytree(base.predictModel60,dir)
+ Predict.updateDisFile(modelname,pers)
+
jsondata={"model_name":modelname,"start_time":startTime,"end_time":endTime}
predictionJson = base.model_dir + modelname +"\\prediction.json"
with open(predictionJson, "w",encoding='utf-8') as outfile:
json.dump(jsondata, outfile,ensure_ascii=False)
-
+
+ CalHead.addModelJson(modelname, startTime, endTime, remark)
return jsonify("鍒涘缓鏂版ā鍨嬪畬姣曪紒")
#鍒涘缓鏂版ā鍨�
@app.route('/ModelList/', methods=['GET'])
def ModelList():
-
file_list = os.listdir(base.model_dir)
return jsonify(file_list)
+#妯″瀷鍒楄〃2
+@app.route('/ModelList2/', methods=['GET'])
+def ModelList2():
+ model_path = base.prefix +"\\model_list.json"
+ model_lsit=""
+ with open(model_path,encoding='utf-8') as f:
+ model_lsit = json.load(f)
+ return jsonify(model_lsit)
+
+#鍒犻櫎妯″瀷
+@app.route('/deleteModel/', methods=['GET'])
+def deleteModel():
+ model_name = request.args.get('model_name')
+ if not model_name:
+ return jsonify({"code":400,"msg":"涓嶅厑璁稿垹闄ょ┖鐩綍锛�"})
+ if model_name == base.not_allowed_model:
+ return jsonify({"code":400,"msg":"楠岃瘉妯″瀷涓嶅厑璁稿垹闄わ紒"})
+
+ paths = base.model_dir + model_name
+ shutil.rmtree(paths)
+ CalHead.removeModelJson(model_name)
+ return jsonify({"code":200,"msg":"妯″瀷鍒犻櫎瀹屾瘯锛�"})
#棰勬祴鍦烘櫙鍙傛暟
@app.route('/prediction', methods=['POST'])
@@ -800,15 +647,19 @@
predictionJson = base.model_dir + model_name +"\\prediction.json"
with open(predictionJson, "w",encoding='utf-8') as outfile:
json.dump(jsondata, outfile,ensure_ascii=False)
-
- return jsonify("淇濆瓨棰勬祴鍦烘櫙鍙傛暟瀹屾瘯锛�")
+
+ #杩愯妯″瀷
+ dicts = Predict.run_model(model_name)
+ return jsonify(dicts["msg"])
+
#棰勬祴鍦烘櫙鍙傛暟
@app.route('/predictionparam', methods=['GET'])
def predictionparam():
- model_name = request.args.get('model_name')
+ model_name = request.args.get('model_name')
+ print(model_name)
file_list = os.listdir(base.model_dir)
if model_name not in file_list:
return jsonify("妯″瀷涓嶅瓨鍦紒")
@@ -862,28 +713,31 @@
def pump_importdata():
model_name = request.form.get('model_name')
-
- # ml= getModel(model_name)
+ types = request.form.get('type')
file = request.files.get('file')
+ print(types)
- save_path = base.model_dir + model_name +"\\extra_cell.xlsx"
+ save_path = base.model_dir + model_name +"\\"+types+".xlsx"
+ print(save_path)
if file:
file.save(save_path)
- resultDict={"code":200,"msg":"淇濆瓨鏁版嵁瀹屾瘯锛�"}
+ data= DataTransf.base_excel(model_name,types)
+
+ resultDict={"code":200,"msg":"淇濆瓨鏁版嵁瀹屾瘯锛�","data":data}
return jsonify(resultDict)
#瑙傛祴浜曞垪琛�
@app.route('/obsWellList', methods=['GET'])
def obsWellList():
obswell= base.obs_well
- dict =[]
- for name , row ,column in obswell:
- obj ={"name":name,"row":row,"column":column,"Layer":1}
- dict.append(obj)
+ dicts =[]
+ for wellId, name , row ,column in obswell:
+ obj ={"wellId":wellId,"name":name,"row":row,"column":column,"Layer":1}
+ dicts.append(obj)
- return jsonify(dict)
+ return jsonify(dicts)
#瑙傛祴浜昪hart鏁版嵁鎺ュ彛
@@ -892,8 +746,9 @@
model_name = request.args.get('model_name')
row = request.args.get('row')
column = request.args.get('column')
+ wellId = request.args.get('wellId')
- result = CalHead.obsChartdata(model_name, row, column)
+ result = CalHead.obsChartdata(wellId,model_name, row, column)
return jsonify(result)
@@ -904,8 +759,8 @@
base_year = request.args.get('base_year')
start_time = request.args.get('start_time')
end_time = request.args.get('end_time')
-
- return jsonify(Predict.predict_river_chart(base_year, start_time, end_time))
+ value = float(request.args.get('value'))
+ return jsonify(Predict.predict_river_chart(base_year, start_time, end_time,value))
#棰勬祴椤甸潰 闄嶆按鍥捐〃
@app.route('/predictWaterChart', methods=['GET'])
@@ -913,15 +768,57 @@
base_year = request.args.get('base_year')
start_time = request.args.get('start_time')
end_time = request.args.get('end_time')
- return jsonify(Predict.predict_water_chart(base_year, start_time, end_time))
+ value = float(request.args.get('value'))
+ return jsonify(Predict.predict_water_chart(base_year, start_time, end_time,value))
-@app.route('/heatmap', methods=['GET'])
-def heatmap():
+#寮�閲囬噺鐨勬姌绾垮浘
+@app.route('/predictWellChart', methods=['POST'])
+def predictWellChart():
+
+ json = request.get_json()
+ base_year = str(json['base_year'])
+ start_time = json['start_time']
+ end_time = json['end_time']
+ data = json['data']
+
+ return jsonify(Predict.predict_well_chart(base_year, start_time, end_time,data))
+
+#娴佸満鍥�
+@app.route('/flowField', methods=['GET'])
+def flowField():
model_name = request.args.get('model_name')
- period = request.args.get('period')
- data = CalHead.heatmapdata(model_name,period)
- maximum_value = np.max(data)
- return jsonify(np.array(data).tolist())
+ flowStartTime = int(request.args.get('flowStartTime'))
+ flowEndTime=int(request.args.get('flowEndTime'))
+ flowType= request.args.get('flowType')
+ # layer = int(request.args.get('layer') )
+
+ pic = str(int(time.time())) +".png"
+ outpath = base.flow_file + pic
+ dicts={}
+ if flowType=="姘翠綅":
+ dicts = achiveReport.flow_field(model_name, flowStartTime, 0,"娴佸満淇℃伅", "online", outpath)
+ if flowType=="鍙樺箙":
+ dicts = achiveReport.getFlowFieldBF(model_name,flowStartTime,flowEndTime,outpath)
+
+ if flowType=="鍩嬫繁":
+ dicts = achiveReport.getFlowFieldDepth(model_name,flowStartTime, 0,"娴佸満淇℃伅", "online", outpath)
+
+ dicts["path"] = "/xishan/xinshanFlow/"+pic
+ return jsonify(dicts)
+
+
+#鍒濆姘翠綅娴佸満淇℃伅
+@app.route('/initWaterFlow/', methods=['GET'])
+def initWater():
+
+ model_name = request.args.get('model_name')
+ layer = int(request.args.get('layer') )
+ pic = str(int(time.time())) +".png"
+ outpath = base.flow_file + pic
+ result= achiveReport.init_flow_field(model_name, layer,"鍒濆娴佸満淇℃伅", "online", outpath)
+ if result == "#":
+ return jsonify("")
+ return jsonify("/xishan/xinshanFlow/"+pic)
#闄嶆按鍧囪
@@ -935,15 +832,104 @@
#鍦扮悆椤甸潰鏁版嵁
@app.route('/earthWaterChart', methods=['GET'])
def earthWaterChart():
-
+ model_name = request.args.get('model_name')
indexId = int(request.args.get('index_id'))
- data = CalHead.earthWaterChart("202001_202212",indexId)
+ data = CalHead.earthWaterChart(model_name,indexId)
return jsonify(data)
+
+#娓楅�忕郴鏁�
+@app.route('/mdLpf', methods=['GET'])
+def mdLpf():
+ lf = base.md_lpf
+ return jsonify(np.array(lf).tolist())
+
+#姘磋祫婧愰噺
+@app.route('/water_res', methods=['GET'])
+def water_res():
+ model_name = request.args.get('model_name')
+ #姘村潎琛�
+ path1=base.muiltyModel + model_name +"\\water_bal.txt"
+ bal = CalHead.water_balance(model_name, path1)
+ path2=base.muiltyModel + model_name +"\\water_res.txt"
+ res = CalHead.water_res(model_name,path2)
+ dicts = BigData.mergeWaterData(bal,res)
+
+ initFlowPNG = achiveReport.getWaterResFiled(model_name,0)
+ dicts["initFlowPNG"]= "/xishan/xinshanFlow/" + initFlowPNG
+
+ FlowPNG2 = achiveReport.getWaterResFiled(model_name,11)
+ dicts["lastFlowPNG"]= "/xishan/xinshanFlow/" + FlowPNG2
+ dicts["initMonth"] ="2023-01"
+ dicts["lastMonth"] ="2023-12"
+
+ #姘磋祫婧愰噺
+ return dicts
+
+
+#澶氭ā鍨嬪湴涓嬫按浣�
+@app.route('/water_depth', methods=['GET'])
+def water_depth():
+ model_name = request.args.get('model_name')
+
+ result = CalHead.water_depth(model_name)
+ #姘磋祫婧愰噺
+ return result
+
+
+#灏忓満鏅� 鍗曚釜妯″瀷姘翠綅 鍜屽彉骞�
+@app.route('/xs_depth', methods=['GET'])
+def xs_depth():
+ model_name = request.args.get('model_name')
+
+ res = CalHead.xs_depth(model_name)
+ jsondata= CalHead.get_model_json(model_name)
+ start_time = jsondata["start_time"]
+ end_time = jsondata["end_time"]
+ months = ModelPeriod.get_months_in_range_ym(start_time, end_time)
+ res["months"] = months
+ #姘磋祫婧愰噺
+ return res
+
+#淇濆瓨鐩戞祴绔欓檷闆ㄩ噺
+@app.route('/sensor_jyl_list', methods=['GET'])
+def sensor_jyl_list():
+ model_name = request.args.get('model_name')
+ data = OpenExcel.read_excel(model_name)
+ return jsonify(data)
+
+#淇濆瓨鐩戞祴绔欓檷闆ㄩ噺
+@app.route('/sensor_jyl_save', methods=['POST'])
+def sensor_jyl_save():
+ json = request.get_json()
+ model_name = str(json['model_name'])
+ data = json['data']
+ OpenExcel.write_excel(model_name,data)
+ return jsonify("淇濆瓨瀹屾瘯")
+
+#鏈堟姤鍐呭
+@app.route('/xs_month_report', methods=['GET'])
+def xs_month_report():
+ model_name = request.args.get('model_name')
+ per = int(request.args.get('period'))
+ res = achiveReport.archive_report_content(model_name,per)
+ return res
+
+
+#瀹炴椂鏁版嵁
+@app.route('/xs_real_data', methods=['GET'])
+def xs_real_data():
+ num = request.args.get('num')
+ start_time = request.args.get('start_time')
+ end_time = request.args.get('end_time')
+ types = request.args.get('types')
+ res = DataTask.get_data(types,num,start_time,end_time)
+ return jsonify(res)
+
+
if __name__ == '__main__':
#app.run() # 鍙互鎸囧畾杩愯鐨勪富鏈篒P鍦板潃锛岀鍙o紝鏄惁寮�鍚皟璇曟ā寮�
- app.run(host="192.168.0.122", port=5000)
-
-
-
+ app.run(host="localhost", port=5000)
+
+
diff --git a/ModelPeriod.py b/ModelPeriod.py
index 7c9a407..c7c0e25 100644
--- a/ModelPeriod.py
+++ b/ModelPeriod.py
@@ -7,10 +7,6 @@
from datetime import datetime
import calendar
from dateutil import rrule
-import json
-import Base as base
-import os
-
#鏍规嵁骞存湀鏃ヨ幏鍙栨渶鍚庝竴澶╃殑鏃ユ湡
@@ -26,7 +22,8 @@
last_day= last_day_of_month(int(start_date[0]),int(start_date[1]),1)
return last_day
-
+def get_months_in_year():
+ return ["1鏈�","2鏈�","3鏈�","4鏈�","5鏈�","6鏈�","7鏈�","8鏈�","9鏈�","10鏈�","11鏈�","12鏈�",]
def get_months_in_range_ym(start_time, end_time):
diff --git a/OpenExcel.py b/OpenExcel.py
new file mode 100644
index 0000000..95f2d5d
--- /dev/null
+++ b/OpenExcel.py
@@ -0,0 +1,61 @@
+
+from openpyxl import load_workbook
+import os
+import shutil
+import Base as base
+
+
+def save_excel(model_name):
+ dst = base.model_dir + model_name +"\\jyl.xlsx"
+ shutil.copyfile(base.prefix +"闆ㄩ噺绔欒緭鍏ユā鏉�.xlsx",dst)
+
+#璇诲彇excel妯℃澘鏁版嵁
+def read_excel(model_name):
+ paths = base.model_dir + model_name +"\\jyl.xlsx"
+ data=[]
+ if not os.path.exists(paths):
+ return data
+ wb = load_workbook(filename = paths)
+ ws = wb[wb.sheetnames[1]]
+
+ for row in ws.iter_rows():
+ tmp =[]
+ for cell in row:
+ tmp.append(cell.value)
+ data.append(tmp)
+ wb.close()
+ return data
+
+
+#璇诲彇闄嶉洦閲忕殑璁$畻鏂囦欢
+def read_jyl_excel(model_name):
+ paths = base.model_dir + model_name +"\\jyl.xlsx"
+ data=[]
+ if not os.path.exists(paths):
+ return data
+ wb = load_workbook(filename = paths,data_only=True)
+ ws = wb[wb.sheetnames[2]]
+
+ for row in ws.iter_rows():
+ tmp =[]
+ for cell in row:
+ tmp.append(cell.value)
+ data.append(tmp)
+ wb.close()
+ return data
+
+
+def write_excel(model_name,data):
+ paths = base.model_dir + model_name +"\\jyl.xlsx"
+ if not os.path.exists(paths):
+ save_excel(model_name)
+ wb = load_workbook(filename = paths)
+ ws = wb[wb.sheetnames[1]]
+ for i in range(len(data)):
+ for j in range(len(data[i])):
+ ws.cell(row=i+1, column=j+1).value = data[i][j]
+ wb.save(paths)
+ wb.close()
+
+
+
diff --git "a/Predict - \345\211\257\346\234\254.py" "b/Predict - \345\211\257\346\234\254.py"
deleted file mode 100644
index bbbfccc..0000000
--- "a/Predict - \345\211\257\346\234\254.py"
+++ /dev/null
@@ -1,592 +0,0 @@
-
-# 瀵煎叆Flask绫�
-from flask import Flask
-from flask import jsonify
-from flask import request
-from flask_cors import CORS
-import sys
-import numpy as np
-import pandas as pd
-import flopy
-import flopy.utils.binaryfile as bf
-import csv
-import time
-from openpyxl import load_workbook
-import os
-import shutil
-import json
-import Base as base
-import CalHead
-import ModelPeriod
-
-
-# strt = ml.bas6.strt
-# # strs = ml.bas6.strt.__getitem__(1)
-# # print(strs.get_value())
-
-# mdBase = flopy.modflow.ModflowBas(ml,strt=1.0,ibound=ml.bas6.ibound)
-# mdBase.write_file(check=False)
-
-
-base_init_year=["2020","2021","2022"]
-river_start_index = 454
-river_end_index =562
-
-#棰勬祴鍛ㄦ湡鏁�
-predict_per = 12
-
-#闄嶆按閲�
-# def predict_water_chart(base_year,start_time ,end_time):
-# model_ws = base.baseModel
-# baseMdoel = flopy.modflow.Modflow.load("modflow.nam", model_ws=model_ws,
-# exe_name="mf2005", verbose=True, version="mf2005", check=False)
-# index = 0
-# if base_year in base_init_year:
-# index = base_init_year.index(str(base_year))
-
-# y_data=[]
-# x_data=[]
-# satrt_index = index*12
-# end_index = satrt_index+12
-# for per in range(satrt_index,end_index):
-# item = baseMdoel.rch.rech.__getitem__(kper=per)
-# value = item.get_value()
-# value_float = np.array(value)
-# avg = value_float.mean()
-# y_data.append(float (avg))
-
-# start_month = str(base_year) +"-01"
-# end_month = str(base_year) +"-12"
-# x_data= ModelPeriod.get_months_in_range_ym(start_month,end_month)
-# result = {"y_data": y_data, "x_data": x_data}
-# return result
-
-base_water = base.prefix + 'base_water.ini'
-def predict_water_chart(base_year,start_time ,end_time):
-
-
- water_array = np.loadtxt(base_water, dtype=str,encoding='utf-8')
- print(water_array)
- y_data=[]
- x_data= ModelPeriod.get_months_in_range_ym("2022-01","2022-12")
- water= water_array[0]
- for e in water:
- y_data.append(e)
-
- result = {"y_data": y_data, "x_data": x_data}
- return result
-
-#娌虫祦鐨勬姌绾垮浘
-# def predict_river_chart(base_year,start_time ,end_time):
-# model_ws = base.baseModel
-# baseMdoel = flopy.modflow.Modflow.load("modflow.nam", model_ws=model_ws,
-# exe_name="mf2005", verbose=True, version="mf2005", check=False)
-# index = 0
-# if base_year in base_init_year:
-# index = base_init_year.index(str(base_year))
-
-# y_data=[]
-# x_data=[]
-# satrt_index = index*12
-# end_index = satrt_index+12
-# for per in range(satrt_index,end_index):
-# wel = baseMdoel.wel.stress_period_data.__getitem__(kper=per)
-# arr=[]
-# for i in range(river_start_index, river_end_index):
-# Q = wel[i][3]
-# arr.append(float(Q))
-# avg = np.array(arr).mean()
-# y_data.append(float(avg))
-# start_month = str(base_year) +"-01"
-# end_month = str(base_year) +"-12"
-# x_data= ModelPeriod.get_months_in_range_ym(start_month,end_month)
-# result = {"y_data": y_data, "x_data": x_data}
-# return result
-
-base_river = base.prefix + 'base_river.ini'
-def predict_river_chart(base_year,start_time ,end_time):
-
-
- river_array = np.loadtxt(base_river, dtype=str,encoding='utf-8')
- print(river_array)
- y_data=[]
- x_data= ModelPeriod.get_months_in_range_ym("2022-01","2022-12")
- for e in river_array:
- y_data.append(e)
-
- result = {"y_data": y_data, "x_data": x_data}
- return result
-
-
-def run_model_predict(model_name):
-
- predictiondata=""
- prediction_path = base.model_dir + model_name +"\\prediction.json"
- if os.path.exists(prediction_path):
- with open(prediction_path,encoding='utf-8') as f:
- predictiondata = json.load(f)
-
-
- if predictiondata:
-
- per = ModelPeriod.get_months_in_range_count(
- predictiondata["start_time"], predictiondata["end_time"])
-
- # updateDisFile(model_name,per)
-
- # updateBase6File(model_name,predictiondata)
-
- #updateRchFile(model_name,predictiondata)
-
- updateRiverFile(model_name,predictiondata)
-
- #updateMineFile(model_name,predictiondata)
- else:
- print("prediction.json 棰勬祴鍦烘櫙鏂囦欢涓虹┖锛屾棤闇�鏇存敼鐩稿簲鏂囦欢")
-
-
- # model_ws = base.model_dir + model_name
-
- # ml = flopy.modflow.Modflow.load("modflow.nam", model_ws=model_ws,
- # exe_name="mf2005", verbose=True, version="mf2005", check=False)
- # ml.run_model(report = True)
- return jsonify("杩愯鎴愬姛锛�")
-
-
-
-
-#鏇存柊閲囬泦鍖虹殑鏁版嵁锛屽垎涓�1.鎸夌収鍖哄煙锛�2.鎸夌収鍏ㄩ儴 杩涜鏇存柊
-def updateMineFile(model_name,predictiondata):
-
- start_time =predictiondata["start_time"]
- end_time = predictiondata["end_time"]
- base_year = predictiondata["mine"]["base_year"]
-
- base_start= str(base_year) + "-" + str(start_time.split("-")[1])
- base_end= str(base_year) + "-" + str(end_time.split("-")[1])
-
- start_index = (int)(base.times_month_per_dict[base_start])
- end_index = (int)(base.times_month_per_dict[base_end])
-
- pers= end_index-start_index + 1
-
- area= predictiondata["mine"]["area"]
- flag = check_mine_param(predictiondata)
-
- if flag == 'true':
- baseMdoel = flopy.modflow.Modflow.load("modflow.nam", model_ws= base.baseModel,
- exe_name="mf2005", verbose=True, version="mf2005", check=False)
- update_model_ws = base.model_dir + model_name
- updateMdoel = flopy.modflow.Modflow.load("modflow.nam", model_ws= update_model_ws,
- exe_name="mf2005", verbose=True, version="mf2005", check=False)
-
- district_dict = get_distric_dict()
-
- area_dict = get_area_dict(area)
-
- lrcq = {}
- for per in range(pers):
- wel = []
- wel = baseMdoel.wel.stress_period_data.__getitem__(kper = (per + start_index ))
- array2d = []
- count = 1
- for Layer, Row, Column, Q in wel:
- array = []
- # 濡傛灉鏄渤娴佺殑鏁版嵁鑼冨洿
- if count > river_end_index :
-
- r = (float) (get_row_column_ratio(Row, Column, district_dict, area_dict))
-
- array = [Layer, Row, Column, Q * r]
-
- else:
- array = [Layer, Row, Column, Q]
-
- array2d.append(array)
- count +=1
-
- lrcq[per] = array2d
-
- flopy.modflow.ModflowWel(updateMdoel,stress_period_data=lrcq)
- updateMdoel.write_input()
- else:
- print("Well--Mine鏂囦欢鏃犻渶淇敼锛�")
-
-
-#鑾峰彇 area鐨� name--> ratio 鐨勭粨鏋�
-def get_area_dict(area):
- result ={}
-
- for i in range(len(area)):
- name = area[i]["name"]
- rt = area[i]["ratio"]
- result[name]= rt
- return result
-
-
-#鑾峰彇鍖哄幙鐨� row+column --> name缁撴瀯
-def get_distric_dict():
- data = base.district
- result = {}
- for row ,column ,id ,name in data:
- key = str(row)+","+str(column)
- result[key]= name
- return result
-
-
-#鏍规嵁 row clomn 鑾峰彇 ratio
-def get_row_column_ratio(row, column ,district_dict, area_dict ):
- key = str(row) +"," + str(column)
- if area_dict.__contains__("鍏ㄩ儴鍖哄煙"):
- return area_dict["鍏ㄩ儴鍖哄煙"]
-
- if district_dict.__contains__(key):
- name = district_dict[key]
- ratio = area_dict[name]
- return float(ratio)
-
- return float(1.0)
-
-
-
-def check_mine_param(predictiondata):
-
- mine = predictiondata["mine"]
- if not mine:
- print("鎶芥按浜� 棰勬祴鍙傛暟涓虹┖锛屾棤闇�瑕佷慨鏀�")
- return "false"
-
- base_year = predictiondata["mine"]["base_year"]
- if not base_year :
- print(" Mine : base_year棰勬祴鍙傛暟涓虹┖锛屾棤闇�瑕佷慨鏀�")
- return "false"
-
- area= predictiondata["mine"]["area"]
- if not area :
- print(" Mine : area棰勬祴鍙傛暟涓虹┖锛屾棤闇�瑕佷慨鏀�")
- return "false"
-
- return "true"
-
-
-#鏇存柊娌虫祦鐨勫�嶆暟
-# def updateRiverFile(model_name,predictiondata):
-
-# start_time =predictiondata["start_time"]
-# end_time = predictiondata["end_time"]
-# base_year = predictiondata["river"]["base_year"]
-
-# ratio= float(predictiondata["river"]["ratio"])
-
-# base_start= str(base_year) + "-" + str(start_time.split("-")[1])
-# base_end= str(base_year) + "-" + str(end_time.split("-")[1])
-
-# start_index = (int)(base.times_month_per_dict[base_start])
-# end_index = (int)(base.times_month_per_dict[base_end])
-
-# pers= end_index-start_index + 1
-
-
-# flag = check_river_param(predictiondata)
-
-# if flag == "true":
-
-# baseMdoel = flopy.modflow.Modflow.load("modflow.nam", model_ws= base.baseModel,
-# exe_name="mf2005", verbose=True, version="mf2005", check=False)
-
-# update_model_ws = base.model_dir + model_name
-# updateMdoel = flopy.modflow.Modflow.load("modflow.nam", model_ws= update_model_ws,
-# exe_name="mf2005", verbose=True, version="mf2005", check=False)
-
-# lrcq = {}
-# for per in range(pers):
-# wel = []
-
-# wel = baseMdoel.wel.stress_period_data.__getitem__(kper = (per + start_index ))
-# array2d = []
-
-# count = 1
-
-# for Layer, Row, Column, Q in wel:
-# array = []
-# # 濡傛灉鏄渤娴佺殑鏁版嵁鑼冨洿
-# if count > river_start_index and count <= river_end_index:
-# array = [Layer, Row, Column, Q * ratio]
-# else:
-# array = [Layer, Row, Column, Q]
-
-# array2d.append(array)
-# count +=1
-
-# lrcq[per] = array2d
-
-# flopy.modflow.ModflowWel(updateMdoel,stress_period_data=lrcq)
-# updateMdoel.write_input()
-
-# else:
-# print("Well--River鏂囦欢鏃犻渶淇敼锛�")
-
-
-def updateRiverFile(model_name,predictiondata):
-
- start_time =predictiondata["start_time"]
- end_time = predictiondata["end_time"]
-
-
- river_ratio= float(predictiondata["river"]["ratio"])
-
- rain_ratio = float(predictiondata["rain"]["ratio"])
- rain_base_year = predictiondata["rain"]["base_year"]
-
- area= predictiondata["mine"]["area"]
-
- flag = check_river_param(predictiondata)
-
- if flag == "true":
-
- ws = base.predictParamModel + rain_base_year
-
- baseMdoel = flopy.modflow.Modflow.load("modflow.nam", model_ws= ws,
- exe_name="mf2005", verbose=True, version="mf2005", check=False)
-
- update_model_ws = base.model_dir + model_name
- updateMdoel = flopy.modflow.Modflow.load("modflow.nam", model_ws= update_model_ws,
- exe_name="mf2005", verbose=True, version="mf2005", check=False)
-
- district_dict = get_distric_dict()
-
- area_dict = get_area_dict(area)
-
- lrcq = {}
-
- for per in range(predict_per):
- wel = []
-
- wel = baseMdoel.wel.stress_period_data.__getitem__(kper = per)
- wel_len = len(wel)
-
- #渚у悜杈圭晫
- for i in range (0,453):
- wel[i][3] = wel[i][3] * rain_ratio
-
- #娌虫祦
- for i in range(453, 562):
- wel[i][3] = wel[i][3] * river_ratio
-
- #鎶芥按浜�
- for i in range(562,wel_len):
-
- r = (float) (get_row_column_ratio(wel[i][1], wel[i][2], district_dict, area_dict))
- wel[i][3] = wel[i][3] * r
-
- lrcq[per] = wel
-
- flopy.modflow.ModflowWel(updateMdoel,stress_period_data=lrcq)
- updateMdoel.write_input()
-
- else:
- print("Well--River鏂囦欢鏃犻渶淇敼锛�")
-
-def check_river_param(predictiondata):
-
- river = predictiondata["river"]
- if not river:
- print("River棰勬祴鍙傛暟涓虹┖锛屾棤闇�瑕佷慨鏀�")
- return "false"
-
- base_year = predictiondata["river"]["base_year"]
- if not base_year :
- print(" River : base_year棰勬祴鍙傛暟涓虹┖锛屾棤闇�瑕佷慨鏀�")
- return "false"
-
- ratio= predictiondata["river"]["ratio"]
- if not ratio or ratio == "1" :
- print(" River : ratio棰勬祴鍙傛暟涓虹┖锛屾棤闇�瑕佷慨鏀�")
- return "false"
-
- return "true"
-
-
-# def updateRchFile(model_name,predictiondata):
-
-# start_time =predictiondata["start_time"]
-# end_time = predictiondata["end_time"]
-
-# base_year = predictiondata["rain"]["base_year"]
-# ratio= float(predictiondata["rain"]["ratio"])
-
-# base_start= str(base_year) + "-" + str(start_time.split("-")[1])
-# base_end= str(base_year) + "-" + str(end_time.split("-")[1])
-
-# start_index = (int)(base.times_month_per_dict[base_start])
-# end_index = (int)(base.times_month_per_dict[base_end])
-# pers= end_index-start_index + 1
-
-
-# flag = check_rain_param(predictiondata)
-
-# if flag == "true":
-
-# baseMdoel = flopy.modflow.Modflow.load("modflow.nam", model_ws= base.baseModel,
-# exe_name="mf2005", verbose=True, version="mf2005", check=False)
-
-# update_model_ws = base.model_dir + model_name
-# updateMdoel = flopy.modflow.Modflow.load("modflow.nam", model_ws= update_model_ws,
-# exe_name="mf2005", verbose=True, version="mf2005", check=False)
-
-# for per in range(pers):
-
-# item = baseMdoel.rch.rech.__getitem__(kper = (per + start_index))
-# array2d = item.get_value()
-# array2d_len = len(array2d)
-
-# for i in range(array2d_len):
-
-# array_len = len(array2d[i])
-# for j in range(array_len):
-
-# if str(base.area_array[i][j]) != '-9999':
-
-# array2d[i][j] = array2d[i][j] * ratio
-
-# updateMdoel.rch.rech.__setitem__(key = per, value=array2d)
-
-# rch = flopy.modflow.ModflowRch(updateMdoel, rech=updateMdoel.rch.rech)
-# rch.write_file(check=False)
-
-# else:
-
-# print("Rch鏂囦欢鏃犻渶淇敼锛�")
-
-
-def updateRchFile(model_name,predictiondata):
-
- start_time =predictiondata["start_time"]
- end_time = predictiondata["end_time"]
-
- #涓版按骞� 鏋按骞�
- base_year = predictiondata["rain"]["base_year"]
- ratio= float(predictiondata["rain"]["ratio"])
-
-
- flag = check_rain_param(predictiondata)
-
- #鏁版嵁鏉ユ簮鐨勬ā鍨嬫枃浠跺す
- base_ws= base.predictParamModel + base_year
-
- if flag == "true":
-
- baseMdoel = flopy.modflow.Modflow.load("modflow.nam", model_ws= base_ws,
- exe_name="mf2005", verbose=True, version="mf2005", check=False)
-
- update_model_ws = base.model_dir + model_name
- updateMdoel = flopy.modflow.Modflow.load("modflow.nam", model_ws= update_model_ws,
- exe_name="mf2005", verbose=True, version="mf2005", check=False)
-
- for per in range(predict_per):
-
- item = baseMdoel.rch.rech.__getitem__(kper = per)
- array2d = item.get_value()
- array2d_len = len(array2d)
-
- for i in range(array2d_len):
-
- array_len = len(array2d[i])
- for j in range(array_len):
-
- if str(base.area_array[i][j]) != '-9999':
-
- array2d[i][j] = array2d[i][j] * ratio
-
- updateMdoel.rch.rech.__setitem__(key = per, value=array2d)
-
- rch = flopy.modflow.ModflowRch(updateMdoel, rech=updateMdoel.rch.rech)
- rch.write_file(check=False)
-
- else:
-
- print("Rch鏂囦欢鏃犻渶淇敼锛�")
-
-def check_rain_param(predictiondata):
-
- rain = predictiondata["rain"]
- if not rain:
- print("Rch棰勬祴鍙傛暟涓虹┖锛屾棤闇�瑕佷慨鏀�")
- return "false"
-
- base_year = predictiondata["rain"]["base_year"]
- if not base_year :
- print(" Rch : base_year棰勬祴鍙傛暟涓虹┖锛屾棤闇�瑕佷慨鏀�")
- return "false"
-
- ratio= predictiondata["rain"]["ratio"]
- if not ratio or ratio == "1" :
- print(" Rch : ratio棰勬祴鍙傛暟涓虹┖锛屾棤闇�瑕佷慨鏀�")
- return "false"
-
- return "true"
-
-
- #鏇存柊bas6鏂囦欢 鍒濆姘村ご淇℃伅
-def updateBase6File(model_name,predictdata):
- model_ws = base.model_dir + model_name
- ml = flopy.modflow.Modflow.load("modflow.nam", model_ws=model_ws,
- exe_name="mf2005", verbose=True, version="mf2005", check=False)
-
-
- #鍒濆姘村ご
- init_header = predictdata["initHeader"]
-
- dir = base.model_dir + init_header + "\\modflow.head"
- head = bf.HeadFile(dir)
- alldata = head.get_alldata()
-
- lens = len(alldata)
- last_index = lens-3
-
- last_array3= alldata[last_index]
-
- strt = ml.bas6.strt
- # strs = ml.bas6.strt.__getitem__(2)
- # print(strs.get_value())
- strt.__setitem__(0,last_array3[0])
- strt.__setitem__(1,last_array3[1])
- strt.__setitem__(2,last_array3[2])
-
-
- mfBase6 = flopy.modflow.ModflowBas(
- ml,
- strt= strt,
- ibound=ml.bas6.ibound,
- hnoflo=ml.bas6.hnoflo,
- extension="bas6",)
-
- mfBase6.write_file(check=False)
-
-
-#淇敼dis 鏂囦欢
-def updateDisFile(model_name, per):
-
- model_ws = base.model_dir + model_name
- ml = flopy.modflow.Modflow.load("modflow.nam", model_ws=model_ws,
- exe_name="mf2005", verbose=True, version="mf2005", check=False)
-
- mfDis = flopy.modflow.ModflowDis(
- ml,
- nlay=ml.dis.nlay,
- nrow=ml.dis.nrow,
- ncol=ml.dis.ncol,
- nper=per,
- delr=ml.dis.delr,
- delc=ml.dis.delc,
- top=ml.dis.top,
- botm=ml.dis.botm,
- perlen=ml.dis.perlen,
- nstp=ml.dis.nstp,
- tsmult=ml.dis.tsmult,
- steady=ml.dis.steady,
- itmuni=ml.dis.itmuni,
- lenuni=ml.dis.lenuni,
- extension="dis")
-
- mfDis.write_file(check=False)
diff --git a/Predict.py b/Predict.py
index 36ea1ce..8a30b46 100644
--- a/Predict.py
+++ b/Predict.py
@@ -1,23 +1,14 @@
# 瀵煎叆Flask绫�
-from flask import Flask
-from flask import jsonify
-from flask import request
-from flask_cors import CORS
-import sys
import numpy as np
-import pandas as pd
import flopy
import flopy.utils.binaryfile as bf
-import csv
-import time
-from openpyxl import load_workbook
import os
-import shutil
import json
import Base as base
import CalHead
import ModelPeriod
+import OpenExcel
base_init_year=["2020","2021","2022"]
@@ -30,16 +21,15 @@
#闄嶆按閲�
base_water = base.prefix + 'base_water.ini'
-def predict_water_chart(base_year,start_time ,end_time):
-
-
+def predict_water_chart(base_year,start_time ,end_time,value):
water_array = np.loadtxt(base_water, dtype=str,encoding='utf-8')
-
y_data=[]
- x_data= ModelPeriod.get_months_in_range_ym("2022-01","2022-12")
- water= water_array[0]
- for e in water:
- y_data.append(e)
+ x_data= ModelPeriod.get_months_in_year()
+ water= water_array[int(base_year)]
+ for data in water:
+ float_data = float(data)/9
+ float_data= round(float_data*value,2)
+ y_data.append(float_data)
result = {"y_data": y_data, "x_data": x_data}
return result
@@ -47,43 +37,104 @@
#娌虫祦鐨勬姌绾垮浘
base_river = base.prefix + 'base_river.ini'
-def predict_river_chart(base_year,start_time ,end_time):
-
-
+def predict_river_chart(base_year,start_time ,end_time,value):
river_array = np.loadtxt(base_river, dtype=str,encoding='utf-8')
-
y_data=[]
- x_data= ModelPeriod.get_months_in_range_ym("2022-01","2022-12")
- for e in river_array:
- y_data.append(e)
+ x_data= ModelPeriod.get_months_in_year()
+ for data in river_array:
+ #涓囩珛鏂圭背
+ float_data = float(data)/4/10000
+ float_data= round(float_data*value,2)
+ y_data.append(float_data)
result = {"y_data": y_data, "x_data": x_data}
return result
+#寮�閲囬噺鎶樼嚎鍥�
+base_mining = base.prefix + 'base_mining.ini'
+def predict_well_chart(base_year,start_time ,end_time,data):
+ # 2022/娴锋穩/鏄屽钩/闂ㄥご娌�/鐭虫櫙灞�
+ area_names=["鍏ㄩ儴鍖哄煙","娴锋穩鍖�","鏄屽钩鍖�","闂ㄥご娌熷尯","鐭虫櫙灞卞尯"]
+ mining_array = np.loadtxt(base_mining, dtype=str,encoding='utf-8')
+ x_data= ModelPeriod.get_months_in_year()
+ result = {"x_data": x_data}
+ y_data=[]
+ for item in data:
+ name = item["area_name"]
+ value = float(item["value"])
+ if name =='鏈濋槼鍖�':
+ continue
+ index = area_names.index(name)
+ row_data = mining_array[index]
+ float_data=[]
+ for item in row_data:
+ x = round(float(item)/10000*value,2)
+ float_data.append(x)
+ dicts={"name":name,"data":float_data}
+ y_data.append(dicts)
+ result["y_data"] = y_data
+ return result
+
+
+def run_model(model_name):
+ if model_name == base.not_allowed_model or model_name in base.archive_models:
+ return "鏈ā鍨嬩负楠岃瘉妯″瀷,涓嶅厑璁镐慨鏀癸紒"
+
+ dicts= run_model_predict(model_name)
+ if dicts["code"] == 400:
+ return dicts
+ #瀵煎嚭csv鏂囦欢
+ CalHead.exportCsV(model_name)
+
+ # #鏇存柊妯″瀷涓夌淮缃戞牸閰嶇疆
+ base.updateModelConfig(model_name)
+
+ # #鍒涘缓妯″瀷鐨勪笁缁寸綉鏍�
+ filedir = base.model3d_path + model_name
+
+ if not os.path.exists(filedir):
+ os.makedirs(filedir, exist_ok=True)
+
+ base.callModelexe()
+ #璁$畻姘磋祫婧愰噺鍜屾按鍧囪
+ CalHead.run_zonebudget_bal(model_name)
+ CalHead.run_zonebudget_res(model_name)
+ dicts= {"code":200,"msg":"棰勬祴妯″瀷杩愯鎴愬姛锛�" }
+ return dicts
+
+
def run_model_predict(model_name):
-
+
predictiondata=""
prediction_path = base.model_dir + model_name +"\\prediction.json"
if os.path.exists(prediction_path):
with open(prediction_path,encoding='utf-8') as f:
- predictiondata = json.load(f)
+ predictiondata = json.load(f)
- if predictiondata:
-
+ periods =CalHead.get_model_period(model_name)
+ periods_len= len(periods)
+
+ if predictiondata:
+ updateDisFile(model_name,periods_len)
try:
- updateDisFile(model_name,predict_per)
-
- updateBase6File(model_name,predictiondata)
+ flag = updateBase6File(model_name,predictiondata)
+ if bool(flag)==False:
+ dicts= {"code":400,"msg":"璇锋鏌ユā鍨嬬殑鍒濆姘存槸鍚﹁缃紒" }
+ return dicts
+ except:
+ dicts= {"code":400,"msg":"璇锋鏌ユā鍨嬬殑鍒濆姘存槸鍚﹁缃紒" }
+ return dicts
- updateRchFile(model_name,predictiondata)
+ try:
+ updateRchFile(model_name,predictiondata)
+ except:
+ print("RchFile鏃犻娴嬪弬鏁帮紝鏃犻渶淇敼锛�")
+ try:
updateRiverFile(model_name,predictiondata)
- except:
-
- return "璇锋鏌ュ垵濮嬫按澶淬�侀檷姘撮噺銆佹案瀹氭渤鍏ユ笚閲忋�佸紑閲囬噺绛夊弬鏁版槸鍚﹀~鍐欏畬鏁达紒"
-
-
+ except:
+ print("RiverFile鏃犻娴嬪弬鏁帮紝鏃犻渶淇敼锛�")
else:
print("prediction.json 棰勬祴鍦烘櫙鏂囦欢涓虹┖锛屾棤闇�鏇存敼鐩稿簲鏂囦欢")
@@ -93,7 +144,8 @@
ml = flopy.modflow.Modflow.load("modflow.nam", model_ws=model_ws,
exe_name="mf2005", verbose=True, version="mf2005", check=False)
ml.run_model(report = True)
- return "棰勬祴妯″瀷杩愯鎴愬姛锛�"
+ dicts= {"code":200,"msg":"棰勬祴妯″瀷杩愯鎴愬姛锛�" }
+ return dicts
@@ -142,11 +194,21 @@
rain_ratio = float(predictiondata["rain"]["ratio"])
rain_base_year = predictiondata["rain"]["base_year"]
+ if rain_base_year=='4':
+ rain_base_year="1"
river_ratio= float(predictiondata["river"]["ratio"])
area= predictiondata["mine"]["area"]
- ws = base.predictParamModel + rain_base_year
+ # ws = base.predictParamModel + rain_base_year
+ ws=""
+ start_time = predictiondata["start_time"]
+ end_time = predictiondata["end_time"]
+ count = ModelPeriod.get_months_in_range_count(start_time, end_time)
+ if count==12:
+ ws= base.predictParamModel + rain_base_year
+ else:
+ ws= base.predictModel60
baseMdoel = flopy.modflow.Modflow.load("modflow.nam", model_ws= ws,
exe_name="mf2005", verbose=True, version="mf2005", check=False)
@@ -161,7 +223,10 @@
lrcq = {}
- for per in range(predict_per):
+ periods =CalHead.get_model_period(model_name)
+ periods_len= len(periods)
+
+ for per in range(periods_len):
wel = []
array2d = []
@@ -188,14 +253,21 @@
array = [Layer, Row, Column, Q]
array2d.append(array)
+ #杩藉姞浜�
flex_data= getFlexdata(model_name)
+ print("==============")
+ print(flex_data)
for i in range(len(flex_data)):
array2d.append(flex_data[i])
lrcq[per] = array2d
- flopy.modflow.ModflowWel(updateMdoel,stress_period_data=lrcq)
+ flopy.modflow.ModflowWel(updateMdoel,
+ ipakcb= baseMdoel.wel.ipakcb,
+ dtype=baseMdoel.wel.dtype,
+ options=baseMdoel.wel.options,
+ stress_period_data=lrcq)
updateMdoel.write_input()
else:
@@ -227,11 +299,30 @@
if flag == "true":
#涓版按骞� 鏋按骞�
base_year = predictiondata["rain"]["base_year"]
- ratio= float(predictiondata["rain"]["ratio"])
+ if base_year =="1" or base_year =="2" or base_year =="3":
+ updateRchBaseYear(model_name,predictiondata)
+ elif base_year =="4":
+ #鎺ュ叆浼犳劅鍣ㄦ暟鎹�
+ updateRchRealData(model_name,predictiondata)
+ else:
+ print("Rch鏂囦欢鏃犻渶淇敼锛�")
+
+#鏇存柊骞虫按骞� 涓版按骞� 鏋按骞存暟鎹�
+def updateRchBaseYear(model_name,predictiondata):
+ #涓版按骞� 鏋按骞�
+ base_year = predictiondata["rain"]["base_year"]
+ ratio= float(predictiondata["rain"]["ratio"])
#鏁版嵁鏉ユ簮鐨勬ā鍨嬫枃浠跺す
- base_ws= base.predictParamModel + base_year
-
+ base_ws=""
+ start_time = predictiondata["start_time"]
+ end_time = predictiondata["end_time"]
+ count = ModelPeriod.get_months_in_range_count(start_time, end_time)
+ if count==12:
+ base_ws= base.predictParamModel + base_year
+ else:
+ base_ws= base.predictModel60
+
baseMdoel = flopy.modflow.Modflow.load("modflow.nam", model_ws= base_ws,
exe_name="mf2005", verbose=True, version="mf2005", check=False)
@@ -239,28 +330,107 @@
updateMdoel = flopy.modflow.Modflow.load("modflow.nam", model_ws= update_model_ws,
exe_name="mf2005", verbose=True, version="mf2005", check=False)
- for per in range(predict_per):
-
+
+ periods =CalHead.get_model_period(model_name)
+ periods_len= len(periods)
+ for per in range(periods_len):
item = baseMdoel.rch.rech.__getitem__(kper = per)
array2d = item.get_value()
array2d_len = len(array2d)
for i in range(array2d_len):
-
array_len = len(array2d[i])
- for j in range(array_len):
-
- if str(base.area_array[i][j]) != '-9999':
-
+ for j in range(array_len):
+ if str(base.area_array[i][j]) != '-9999':
array2d[i][j] = array2d[i][j] * ratio
- updateMdoel.rch.rech.__setitem__(key = per, value=array2d)
-
- rch = flopy.modflow.ModflowRch(updateMdoel, rech=updateMdoel.rch.rech)
- rch.write_file(check=False)
+ updateMdoel.rch.rech.__setitem__(key = per, value=array2d)
+ rch = flopy.modflow.ModflowRch(updateMdoel,
+ nrchop=baseMdoel.rch.nrchop,
+ ipakcb=baseMdoel.rch.ipakcb,
+ rech=updateMdoel.rch.rech,
+ irch =baseMdoel.rch.irch)
+
+ rch.write_file(check=False)
+
+
+#鎺ュ叆浼犳劅鍣ㄦ暟鎹�
+def updateRchRealData(model_name,predictiondata):
+
+ # 鍙栧钩姘村勾鐨剅ch鏂囦欢
+ base_year = "1"
+ ratio= float(predictiondata["rain"]["ratio"])
+ if not ratio:
+ ratio = 1
+ excel_data = OpenExcel.read_jyl_excel(model_name)
+ array_data =[]
- else:
- print("Rch鏂囦欢鏃犻渶淇敼锛�")
+ if not excel_data:
+ print("闄嶆按妯℃澘鏁版嵁鏈幏鍙栧埌锛�")
+ return "闄嶆按妯℃澘鏁版嵁鏈幏鍙栧埌锛�"
+ for i in range(1,len(excel_data)):
+ temp =[]
+ for j in range(1,len(excel_data[i])):
+ data = round(float(excel_data[i][j]),8)
+ temp.append(data)
+ array_data.append(temp)
+
+ base_ws=""
+ start_time = predictiondata["start_time"]
+ end_time = predictiondata["end_time"]
+ count = ModelPeriod.get_months_in_range_count(start_time, end_time)
+ if count==12:
+ base_ws= base.predictParamModel + base_year
+ else:
+ base_ws= base.predictModel60
+
+ baseMdoel = flopy.modflow.Modflow.load("modflow.nam", model_ws= base_ws,
+ exe_name="mf2005", verbose=True, version="mf2005", check=False)
+
+ update_model_ws = base.model_dir + model_name
+
+ updateMdoel = flopy.modflow.Modflow.load("modflow.nam", model_ws= update_model_ws,
+ exe_name="mf2005", verbose=True, version="mf2005", check=False)
+
+ #闄嶉洦鍒嗗尯
+ area_dicts = base.getAreas()
+
+
+ periods =CalHead.get_model_period(model_name)
+ periods_len= len(periods)
+
+ for per in range(periods_len):
+ #16涓垎鍖烘煇涓懆鏈熺殑 鏁版嵁 涓嬫爣(0,15) 鍜宎rea_dicts瀛楀吀闄嶉洦鍒嗗尯鐨刱ey瀵瑰簲
+ water_per_data = get_Array2_column(array_data,per)
+
+ item = baseMdoel.rch.rech.__getitem__(kper = per)
+ array2d = item.get_value()
+ for key in area_dicts:
+ tuples= area_dicts[key]
+ values = water_per_data[int(key)]
+ for i in range(len(tuples)):
+ x = tuples[i][0]
+ y = tuples[i][1]
+ array2d[x][y]= values*ratio
+
+ updateMdoel.rch.rech.__setitem__(key = per, value=array2d)
+
+ rch = flopy.modflow.ModflowRch(updateMdoel,
+ nrchop=baseMdoel.rch.nrchop,
+ ipakcb=baseMdoel.rch.ipakcb,
+ rech=updateMdoel.rch.rech,
+ irch =baseMdoel.rch.irch)
+
+ rch.write_file(check=False)
+ print("闄嶆按鍒嗗尯鏁版嵁鏇存柊瀹屾瘯!")
+ return "闄嶆按鍒嗗尯鏁版嵁鏇存柊瀹屾瘯锛�"
+
+#鑾峰彇鍒楁暟鎹�
+def get_Array2_column(array_data,column):
+ arr = np.array(array_data)
+ column_data = arr[:, column]
+ return column_data
+
def check_rain_param(predictiondata):
@@ -287,18 +457,18 @@
model_ws = base.model_dir + model_name
ml = flopy.modflow.Modflow.load("modflow.nam", model_ws=model_ws,
exe_name="mf2005", verbose=True, version="mf2005", check=False)
-
-
#鍒濆姘村ご
- init_header = predictdata["initHeader"]
- dir = base.model_dir + init_header + "\\modflow.head"
+ if "initHeader" not in predictdata:
+ print("=============has no initHeader=============")
+ return False
+ init_header = predictdata["initHeader"]
+
+ dir = base.model_dir + init_header + "\\modflow.head"
head = bf.HeadFile(dir)
alldata = head.get_alldata()
- lens = len(alldata)
- last_index = lens-3
-
+ last_index = len(alldata)-1
last_array3= alldata[last_index]
strt = ml.bas6.strt
@@ -317,6 +487,7 @@
extension="bas6",)
mfBase6.write_file(check=False)
+ return True
#淇敼dis 鏂囦欢
@@ -345,3 +516,5 @@
extension="dis")
mfDis.write_file(check=False)
+
+
diff --git a/WaterXBL.py b/WaterXBL.py
new file mode 100644
index 0000000..5e9a980
--- /dev/null
+++ b/WaterXBL.py
@@ -0,0 +1,77 @@
+
+import flopy.utils.binaryfile as bf
+import Base as base
+import numpy as np
+
+#缁欐按搴�
+water_u = 0.2
+#鐮旂┒鍖哄煙闈㈢Н骞虫柟绫�
+water_F= float(5652 * 500 *500)
+#鏈夋晥璁$畻鍗曞厓鏍�
+water_invalid_cell =5652
+#鐮旂┒鍖哄煙骞虫柟鍗冪背
+water_F_KM= 680.250
+
+pyq_cells_total =2721
+
+
+#鍦颁笅姘磋搫鍙橀噺
+def get_grd_storage(model_name,per1,per2):
+ arr = np.loadtxt(base.xs_mp_path, dtype=int)
+ pyq_cells=[]
+ k=0
+ for i in range(len(arr)):
+ for j in range(len(arr[i])):
+ if arr[i][j] == 1:
+ k+=1
+ pyq_cells.append((i,j))
+
+ dir = base.model_dir + model_name + "\\modflow.head"
+
+ if model_name=="202001_202212":
+ dir = base.baseModel2 + "\\modflow.head"
+
+ head = bf.HeadFile(dir)
+ alldata = head.get_alldata()
+
+ #鍒濆姘翠綅鏁版嵁
+ z_start = alldata[int(per1+1)*3-3,0,:,:]
+ #缁撴潫姘翠綅鏁版嵁
+
+ z_end = alldata[int(per2+1)*3-1,0,:,:]
+
+ z_start[(z_start<=0)] = 0
+ z_end[(z_end<=0)] = 0
+
+ # z_start_avg = float(np.sum(z_start)/5652)
+ # z_end_avg = float(np.sum(z_end)/5652)
+
+ z_start_total = 0
+ z_end_total = 0
+ for item in pyq_cells:
+ i = item[0]
+ j = item[1]
+ z_start_total += z_start[i,j]
+ z_end_total += z_end[i,j]
+
+ z_start_avg = z_start_total/2721
+ z_end_avg = z_end_total/2721
+
+ #螖W锛�100路(h1-h2)路渭路F/t
+ year = (per2+1-per1)/12
+ # print(year)
+ storage = 100 * (z_start_avg-z_end_avg) * water_u * water_F_KM /year
+ return storage
+
+
+
+#鐩稿鍧囪 宸� Q1
+#Q鎬昏ˉ锛峇鎬绘帓卤螖W锛澪�
+# 围/Q鎬昏ˉ *100%
+def get_grd_relative_equ(Q1, Q2,w):
+ x= ( Q1-Q2) + w
+ y = x/Q1
+ return y
+
+
+
diff --git a/main.py b/main.py
new file mode 100644
index 0000000..432b616
--- /dev/null
+++ b/main.py
@@ -0,0 +1,60 @@
+
+# 瀵煎叆Flask绫�
+from flask import Flask
+from flask import jsonify
+from flask import request
+from flask_cors import CORS
+import pymssql
+
+
+# Flask鍑芥暟鎺ユ敹涓�涓弬鏁癬_name__锛屽畠浼氭寚鍚戠▼搴忔墍鍦ㄧ殑鍖�
+app = Flask(__name__)
+CORS(app, supports_credentials=True, resources=r'/*')
+
+server = '192.168.0.123:1433'
+user='sa'
+password='admin123X'
+database ='microseism3'
+
+#鏍规嵁鏈堜唤鑾峰彇鏁版嵁
+def get_event_location_data(month):
+
+ conn = pymssql.connect(server=server, user=user, password=password, database=database,as_dict=True)
+ cursor = conn.cursor()
+ res =[]
+ try:
+ sqlStr = 'SELECT * FROM dbo.event_location_'+ str(month)
+ # 鎵ц鏌ヨ璇彞鎴栧叾浠栨搷浣�
+ cursor.execute(sqlStr)
+
+ # 鑾峰彇缁撴灉闆�
+ result = cursor.fetchall()
+
+ for row in result:
+ dic={"x":row["Event_X"],"y":row["Event_Y"],"z":row["Event_Z"],"v":row["Event_Energy"]}
+ res.append(dic)
+
+ except Exception as e:
+ print("Error occurred:", str(e))
+ return []
+
+ finally:
+ # 鍏抽棴杩炴帴
+ cursor.close()
+ conn.close()
+ return res
+
+#鏍规嵁浼犲叆鐨勬湀浠芥煡璇㈡暟鎹�
+@app.route('/get_event_location_data', methods=['GET'])
+def event_location_data():
+ month = request.args.get('month')
+ res = get_event_location_data(month)
+ return jsonify(res)
+
+
+if __name__ == '__main__':
+ #app.run() # 鍙互鎸囧畾杩愯鐨勪富鏈篒P鍦板潃锛岀鍙o紝鏄惁寮�鍚皟璇曟ā寮�
+ app.run(host="192.168.0.107", port=8080)
+
+
+
diff --git a/test.py b/test.py
deleted file mode 100644
index 192d800..0000000
--- a/test.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-Created on Thu Dec 21 12:02:24 2023
-
-@author: ZMK
-"""
-
-import Base
-
-import numpy as np
-
-# model_config ='C:\\Users\\ZMK\\Desktop\\objclipdig\\ModelFlow_xishan\\config.ini'
-
-# conf = np.loadtxt(model_config, dtype=str,encoding='utf-8')
-
-
-# conf[1]='1'
-
-# np.savetxt(model_config,conf,fmt='%100s',encoding='utf-8')
-
-# print(conf)
-Base.updateModelConfig("202301_202312")
--
Gitblit v1.9.1