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