From 1ae38ab34bcbdff622c7623119ee54bad419f4ed Mon Sep 17 00:00:00 2001
From: zmk <496160012@qq.com>
Date: 星期三, 28 八月 2024 16:11:08 +0800
Subject: [PATCH] 提交代码
---
Predict.py | 303 +++++++++++++++++++++++++++++++++++++++----------
1 files changed, 238 insertions(+), 65 deletions(-)
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)
+
+
--
Gitblit v1.9.1