-
Notifications
You must be signed in to change notification settings - Fork 0
/
1_tuflow_run.py
181 lines (160 loc) · 8.53 KB
/
1_tuflow_run.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#############################################################################################
# tuflow_run.py is an automated python script to run tuflow simulations for various flow conditions
# Written by Anzy Lee, Postdoctoral Scholar, Utah State University
# Date: 10/21/2020
#############################################################################################
import os
import shutil as sl
import numpy as np
import sys
import csv
import subprocess
import matplotlib.pyplot as plt
sys.path.append(r'./py_modules')
from mannings_hfromQ_downstream import mannings_hfromQ_downstream
#############################################################################################
# 1 Input variables: case_name, Q_all, create_folders, cell_size
case_name = 'OutphaseC4' # 'VanillaC4', 'InphaseC4', 'OutphaseC4'
Q_all = np.array([1,2,3,4,5,6,7,8,9,10,12,15,20,30,40,50,60,70,80,90,100])
create_folders = 1
cell_size = '1'
#############################################################################################
if os.path.isdir(os.curdir+'/RosgenC4_'+case_name) == 0:
os.mkdir(os.curdir+'/RosgenC4_'+case_name)
os.chdir(os.curdir+'/RosgenC4_'+case_name)
timestep = str(float(cell_size) / 4)
if case_name == 'VanillaC4':
S0 = 0.00325 # dx = 770m , dz = 1004 - 1001.5
grid_name = 'vanillaC4.asc'
elif case_name == 'InphaseC4':
S0 = 0.00329 # dx = 770 m, dz = 1004.75 - 1002.22
grid_name = 'rpinphasec4_dem_1m.asc'
elif case_name == 'OutphaseC4':
S0 = 0.00331 # dx = 770 m, dz = 1003.3 - 1000.75
grid_name = 'rpoutphasec4_dem_1m.asc'
n = 0.035 # Sand bed, straight, uniform channel
#############################################################################################
if create_folders == 1:
os.mkdir('./bc_dbase')
os.mkdir('./check')
os.mkdir('./model')
os.mkdir('./results')
os.mkdir('./runs')
sl.copytree('../RosgenC4_tuflow//model/gis',
'./model/gis')
sl.copytree('../RosgenC4_tuflow//model/grid',
'./model/grid')
sl.copyfile('../RosgenC4_tuflow//model/VanillaC4_materials.csv',
'./model/materials.csv')
#############################################################################################
# Model
tbc_file = './model/' + case_name + '.tbc'
tgc_file = './model/' + case_name + '.tgc'
sl.copyfile('../RosgenC4_tuflow/model/VanillaC4_002.tbc', tbc_file)
sl.copyfile('../RosgenC4_tuflow//model/VanillaC4_002.tgc', tgc_file)
with open(tgc_file, 'r+') as myfile:
text = myfile.read()
text = text.replace("Cell Size == 10", "Cell Size == " + cell_size)
text = text.replace("Read GRID Zpts == ..\model\grid\VanillaC4.asc",
"Read GRID Zpts ==..\\model\\grid\\" + grid_name)
myfile.seek(0)
myfile.write(text)
myfile.truncate()
zero = ''
for ii in range(0,Q_all.__len__()): #np.array([9,19]): # range(0,Q_all.__len__())
zero1 = ''
s = str(ii+1)
s_len = s.__len__()
for ind in range(0,3-s_len):
zero1 = zero1 + '0'
Q_num = zero1 + s
# BCs
path_down_xsect = './model/gis/2d_bc_VanillaC4_HT_L.shp'
path_terrain = './model/grid/'+grid_name
Q = Q_all[ii]
path_figure = './results/' + case_name + '_' + Q_num + '_WSE.png'
h, A, P, R = mannings_hfromQ_downstream(path_down_xsect, path_terrain, path_figure, Q, n, S0, 1, 1)
down_WSE = h
# Boundary condition
bc_file = './bc_dbase/2d_bc_'+case_name+'_'+Q_num+'.csv'
bc_file_content = [['Name', 'Source', 'Column 1', 'Column 2'],
['RPin', case_name + '_bc_data_' + Q_num + '.csv', 'Time', 'RPin'],
['RPout', case_name + '_bc_data_' + Q_num + '.csv', 'Time', 'RPout']]
bc_data_file = './bc_dbase/'+case_name+'_bc_data_' + Q_num + '.csv'
bc_data_file_content = [['Time', 'RPin', 'RPout'],
[0, Q, h],
[0.25, Q, h]]
#sl.copyfile('../RosgenC4_tuflow/bc_dbase/2d_bc_VanillaC4.csv', bc_file)
#sl.copyfile('../RosgenC4_tuflow//bc_dbase/VanillaC4_bc_data.csv', bc_data_file)
with open(bc_file, 'w', newline='') as f:
writer = csv.writer(f)
for row in bc_file_content:
writer.writerow(row)
with open(bc_data_file, 'w', newline='') as f:
writer = csv.writer(f)
for row in bc_data_file_content:
writer.writerow(row)
# Material
material_data = './model/materials.csv'
material_data_content = [['Material ID', 'Manning\'s n', 'Infiltration Parameters',
'Land Use Hazard ID', '! Description'],
[1, n],
[4, n]]
with open(material_data, 'w', newline='') as f:
writer = csv.writer(f)
for row in material_data_content:
writer.writerow(row)
f.close()
# Run
tcf_file = os.path.abspath("runs") + '\\'+case_name+'_' + Q_num + '.tcf'
#sl.copyfile('../RosgenC4_tuflow/runs/VanillaC4_002.tcf', tcf_file)
f = open(tcf_file, "w+")
f.write("\n" +
# "\nUnits == US Customary" +
"\nGeometry Control File == " + '..\\model\\' + case_name + '.tgc' +
"\nBC Control File == " + '..\\model\\' + case_name + '.tbc' +
"\nBC Database == " + '..\\bc_dbase\\2d_bc_'+case_name+'_'+Q_num+'.csv' +
"\nRead Materials File == ..\\model\\materials.csv" + " ! This provides the link between the material ID defined in the .tgc and the Manning's roughess" +
"\nRead GIS PO == ..\\model\\gis\\2d_po_VanillaC4_P.shp" + " ! velocity monitoring point locations" +
"\nRead GIS PO == ..\\model\\gis\\2d_po_VanillaC4_L.shp" + " ! flow monitoring xs lines" +
"\nSolution Scheme == HPC !This command specifies that you want to run TUFLOW using the HPC solution scheme or engine." +
"\nHardware == GPU !CPU is default. The hardware command instructs TUFLOW HPC to run using GPU hardware. This is typically orders of magnitude faster than on CPU." +
"\n" +
"\nViscosity Formulation == SMAGORINSKY" +
"\nViscosity Coefficients == 0.5, 0.005" +
"\nSET IWL == " + str(down_WSE) + " ! matches the downstream WSE" +
# "\nCell Wet/Dry Depth == " + cell_depth + " ! Forces cells to be dry if their depth is < 0.1 m" +
"\n" +
"\nStart Time == 0" + " ! Start Simulation at 0 hours" +
"\nEnd Time == 6 ! End Simulation (hrs)" +
"\nTimestep == " + timestep + " ! Use a 2D time step that is ~1/4 of the grid size in m (10 m * 0.25 -> 2.5 s)" +
"\n" +
"\nLog Folder == Log" + " ! Redirects log output (eg. .tlf and _messages GIS layers to the folder log" +
"\nOutput Folder == ..\\results\\" + Q_num + "\\" + " ! Redirects results files to TUFLOW\Results\RUN" +
"\nWrite Check Files == ..\\check\\" + Q_num + "\\" + " ! Specifies check files to be written to TUFLOW\check\RUN" +
"\nMap Output Format == GRID XMDF" + " ! Output directly to GIS (grid) as well as SMS (xmdf compact) format" +
"\nMap Output Data Types == h d n V BSS" + " ! wse depth Manning's n velocity bed shear stress" +
"\nStart Map Output == 4 ! Start map output at 4 hours" +
"\nGrid Output Cell Size == " + str(float(cell_size)/2) +
"\nMap Output Interval == 1800 ! Output every 1800 seconds (30 minutes)" +
"\nGRID Map Output Data Types == h d n V BSS" +
"\nTime Series Output Interval == 30 ! time interval of output in seconds"
)
f.close()
#sl.copyfile('../RosgenC4_tuflow/runs/Vanilla_run_002_TUFLOW.bat',
# './runs/'+case_name+'C4_run_'+ Q_num + '_TUFLOW.bat')
bat_file = './runs/'+ case_name + '_run_' + Q_num + '_TUFLOW.bat'
f = open(bat_file, "w+")
f.write("Set TF_Exe=\"C:\Program Files\Tuflow_w64\TUFLOW_iSP_w64.exe\"" +
"\nSet RUN=start \"TUFLOW\" %TF_Exe%" +
"\n" +
"\n%RUN% -b \""+ tcf_file + "\""
"\npause")
f.close()
# Run TUFLOW
print("Running TUFLOW")
#subprocess.call('.\\runs\\'+case_name+'_run_'+ Q_num + '_TUFLOW.bat')
bat_file = '.\\runs\\'+case_name+'_run_'+ Q_num + '_TUFLOW.bat'
p = subprocess.Popen(bat_file, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = p.communicate()
print(case_name+'_'+Q_num+" complete")