|
# 导入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
|
|
|
base_init_year=["2020","2021","2022"]
|
river_start_index = 454
|
river_end_index =562
|
|
#预测周期数
|
predict_per = 12
|
|
#降水量
|
|
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')
|
|
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
|
|
#河流的折线图
|
|
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')
|
|
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:
|
|
try:
|
updateDisFile(model_name,predict_per)
|
|
updateBase6File(model_name,predictiondata)
|
|
updateRchFile(model_name,predictiondata)
|
|
updateRiverFile(model_name,predictiondata)
|
except:
|
|
return "请检查初始水头、降水量、永定河入渗量、开采量等参数是否填写完整!"
|
|
|
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 "预测模型运行成功!"
|
|
|
|
#获取 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 updateRiverFile(model_name,predictiondata):
|
|
flag = check_rain_param(predictiondata)
|
|
if flag == "true":
|
|
rain_ratio = float(predictiondata["rain"]["ratio"])
|
rain_base_year = predictiondata["rain"]["base_year"]
|
|
river_ratio= float(predictiondata["river"]["ratio"])
|
area= predictiondata["mine"]["area"]
|
|
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 = []
|
array2d = []
|
|
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
|
|
|
#重置数组
|
for Layer, Row, Column, Q in wel:
|
array = [Layer, Row, Column, Q]
|
array2d.append(array)
|
|
flex_data= getFlexdata(model_name)
|
|
for i in range(len(flex_data)):
|
array2d.append(flex_data[i])
|
|
lrcq[per] = array2d
|
|
flopy.modflow.ModflowWel(updateMdoel,stress_period_data=lrcq)
|
updateMdoel.write_input()
|
|
else:
|
print("Well--River文件无需修改!")
|
|
#追加复杂原汇项信息
|
def getFlexdata(model_name):
|
welldata=""
|
well_path = base.model_dir + model_name +"\\pump_well.json"
|
data=[]
|
if os.path.exists(well_path):
|
with open(well_path,encoding='utf-8') as f:
|
welldata = json.load(f)
|
wel= welldata["well"]
|
|
for i in range (len(wel)):
|
layer = int (wel[i]['layer'])-1
|
row= int(wel[i]['row'])-1
|
column = int(wel[i]['column'])-1
|
v = float(wel[i]['value'])
|
arr = [layer,row, column, v]
|
data.append(arr)
|
|
return data
|
|
|
def updateRchFile(model_name,predictiondata):
|
flag = check_rain_param(predictiondata)
|
if flag == "true":
|
#丰水年 枯水年
|
base_year = predictiondata["rain"]["base_year"]
|
ratio= float(predictiondata["rain"]["ratio"])
|
|
#数据来源的模型文件夹
|
base_ws= base.predictParamModel + base_year
|
|
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 :
|
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)
|