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