# -*- 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) #河流数据解析 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() #解析开采量的数据 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() #解析边界的数据 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