[5973] | 1 | """ |
---|
| 2 | -----------------------------------------------------------------model_data.py |
---|
| 3 | ANUGA FLOOD MODELLING TEMPLATE (Data Assembly) |
---|
| 4 | This initialisation script contains surface and scenario-event specific definitions and |
---|
| 5 | data for use in the subsequent mesh-domain build process described in model_run.py. |
---|
| 6 | This script is imported by the model_run.py script |
---|
| 7 | |
---|
| 8 | <<<<THIS VERSION HAS BEEN CONSTRUCTED TO ACCEPT TUFLOW DATA INPUTS>>>> |
---|
| 9 | <<<< IT READS IN DATA FROM THE VARIOUS TUFLOW MID/MIF INPUT FILES >>>> |
---|
| 10 | |
---|
| 11 | Version 1.00: June 2008 Initial release |
---|
| 12 | Author : E Rigby (0437 250 500) ted.rigby@rienco.com.au |
---|
| 13 | |
---|
| 14 | -------------------------------------------------------------------------------- |
---|
| 15 | """ |
---|
| 16 | ##################################################################################### |
---|
| 17 | # # |
---|
| 18 | # IMPORT THE REQUIRED PYTHON MODULES # |
---|
| 19 | # # |
---|
| 20 | ##################################################################################### |
---|
| 21 | |
---|
| 22 | # Standard python modules |
---|
| 23 | import os |
---|
| 24 | import time |
---|
| 25 | import sys |
---|
| 26 | from os import sep |
---|
| 27 | |
---|
| 28 | # Related ANUGA modules |
---|
| 29 | from anuga.utilities.polygon import read_polygon, plot_polygons, polygon_area, is_outside_polygon |
---|
| 30 | from anuga.geospatial_data import Geospatial_data |
---|
| 31 | from anuga.utilities.system_tools import get_revision_number |
---|
| 32 | |
---|
| 33 | # Model specific imports |
---|
| 34 | import get_tuflow_data # Provides the routines to read in tuflow specific input data |
---|
| 35 | |
---|
| 36 | ##################################################################################### |
---|
| 37 | # # |
---|
| 38 | # SET THE REQUIRED INI VARIABLES # |
---|
| 39 | # # |
---|
| 40 | ##################################################################################### |
---|
| 41 | |
---|
| 42 | anuga_verbose = True # Ini variable may be set to True to enable additional anuga internal output |
---|
| 43 | model_verbose = True # Ini variable may be set to True to enable additional model output |
---|
| 44 | model_graphics = False # Ini variable may be set to True to enable model check graphics |
---|
| 45 | |
---|
| 46 | org_name = 'Rienco Consulting' |
---|
| 47 | org_add1 = '4/163 Keira Street' |
---|
| 48 | org_add2 = 'Wollongong' |
---|
| 49 | org_add3 = 'NSW 2500' |
---|
| 50 | org_add4 = 'Australia' |
---|
| 51 | org_phone = '0242 250 500' |
---|
| 52 | org_web = 'www.rienco.com.au' |
---|
| 53 | |
---|
| 54 | user_name = 'E.Rigby' |
---|
| 55 | user_email = 'ted.rigby@rienco.com.au' |
---|
| 56 | |
---|
| 57 | |
---|
| 58 | ##################################################################################### |
---|
| 59 | # # |
---|
| 60 | # ASSIGN THE REQUIRED SIMULATION FILES & VARIABLES # |
---|
| 61 | # # |
---|
| 62 | ##################################################################################### |
---|
| 63 | |
---|
| 64 | #------------------------------------------------------------------------------------ |
---|
| 65 | # Defines the current catchment-simclass-scenario-event and checks files/directories |
---|
| 66 | # This assumes a directory structure in which the 'model*'.py files are in a directory |
---|
| 67 | # called simclass/scenario. the tms and output directories are checked or created by this |
---|
| 68 | # code in a directory below the 'model*'.py files . |
---|
| 69 | #------------------------------------------------------------------------------------- |
---|
| 70 | |
---|
| 71 | |
---|
| 72 | # If a historic event simulation (typically for calibration or validation purposes) |
---|
| 73 | catchment= 'Macquarie_Rivulet' # Set catchment name |
---|
| 74 | simclass = 'Historic' # Set simulation class 'Historic' (actual recorded event) |
---|
| 75 | scenario = 'Existing' # Set scenario (eg existing conditions 1991) |
---|
| 76 | event = 'Jun91' # Set event (eg Event of June 1991) |
---|
| 77 | |
---|
| 78 | # If a design event simulation |
---|
| 79 | #catchment= 'Macquarie_Rivulet' # Set catchment name |
---|
| 80 | #simclass = 'Design' # Set simulation class 'Design' (AR&R design event) |
---|
| 81 | #scenario = 'ExAllClear' # Set scenario (eg 'Exallclear','Exblocked','2050AllClear' etc) |
---|
| 82 | #event = '100Yr' # Set event ARI (eg 2-100YrARI or PMF) and optionally Duration |
---|
| 83 | |
---|
| 84 | # Assign the required input files and tms output directory |
---|
| 85 | |
---|
| 86 | # ANUGA input files |
---|
| 87 | # EHR - expand when finalised respoly GIS formats!!!!!!!!!!!! |
---|
| 88 | elev_filename = 'macriv_merge_2mdem_trimmed.csv' # assign the raw ALS (csv) filename |
---|
| 89 | |
---|
| 90 | # ANUGA output/results files |
---|
| 91 | results_dir = event # assign output to a directory called 'event' |
---|
| 92 | |
---|
| 93 | # WBNM - TUFLOW input Files |
---|
| 94 | wbnm_filename = 'Macriv_Jun91.wbn' # assign wbnm runfile filename |
---|
| 95 | bcdbase_filename = 'bc dbase.csv' # assign tuflow bc datanase filename |
---|
| 96 | tmf_filename = 'macriv91.tmf' # assign tuflow tmf filename |
---|
| 97 | mat_filename = '2d_mat_Macriv_Jun91.mif' # assign tuflow 2d_mat filename |
---|
| 98 | po_filename = '2d_po_Macriv_Jun91.mif' # assign tuflow 2d_po filename |
---|
| 99 | |
---|
| 100 | # Converted ANUGA tms (hydrographs and dsbc files) directory |
---|
| 101 | tms_dir = 'tms_files' # assign anuga tms file directory name |
---|
| 102 | |
---|
| 103 | # assign a basename to identify screen and result output |
---|
| 104 | basename='macriv91' # prefix for output files and screen comments from the simulation |
---|
| 105 | |
---|
| 106 | # Assign initial water level for this simulation |
---|
| 107 | InitialWaterLevel = 0.3 # Set initial lake level to 0.3m AHD |
---|
| 108 | |
---|
| 109 | # Assign the default RID to apply to the domain (before application of the spatially variable RIDs) |
---|
| 110 | default_RID = 2 # This simulation - 'Treed areas of equal resistance at ground and depth' |
---|
| 111 | |
---|
| 112 | |
---|
| 113 | ##################################################################################### |
---|
| 114 | # # |
---|
| 115 | # CHECK THE SPECIFIED SIMULATION FILES ARE PRESENT # |
---|
| 116 | # # |
---|
| 117 | ##################################################################################### |
---|
| 118 | |
---|
| 119 | # Check the required directories and files are present |
---|
| 120 | if os.access(tms_dir, os.F_OK) == 0: # Make sure we have the required tms directory below us |
---|
| 121 | os.mkdir(tms_dir) |
---|
| 122 | print basename+ ' >>>> NOTE - tms directory %s was missing and has been created ' %(tms_dir) |
---|
| 123 | |
---|
| 124 | if os.access(results_dir, os.F_OK) == 0: # Make sure we have the required results directory below us |
---|
| 125 | os.mkdir(results_dir) |
---|
| 126 | print basename+ ' >>>> NOTE - Results directory %s was missing and has been created ' %(results_dir) |
---|
| 127 | |
---|
| 128 | if os.access(elev_filename, os.F_OK) == 0: # check and istop run if absent |
---|
| 129 | print basename+ ' >>>> ERROR - specified elevation (ALS) file %s missing ' %(elev_filename) |
---|
| 130 | sys.exit(0) # terminate the program |
---|
| 131 | |
---|
| 132 | if os.access(wbnm_filename, os.F_OK) == 0: # check and istop run if absent |
---|
| 133 | print basename+ ' >>>> ERROR - specified wbnm runfile %s missing ' %(wbnm_filename) |
---|
| 134 | sys.exit(0) # terminate the program |
---|
| 135 | |
---|
| 136 | if os.access(bcdbase_filename, os.F_OK) == 0: # check and stop run if absent |
---|
| 137 | print basename+ ' >>>> ERROR - specified tuflow bcdbase file %s missing ' %(bcdbase_filename) |
---|
| 138 | sys.exit(0) # terminate the program |
---|
| 139 | |
---|
| 140 | if os.access(tmf_filename, os.F_OK) == 0: # check and stop run if absent |
---|
| 141 | print basename+ ' >>>> ERROR - specified tuflow btmf file %s missing ' %(tmf_filename) |
---|
| 142 | sys.exit(0) # terminate the program |
---|
| 143 | |
---|
| 144 | if os.access(mat_filename, os.F_OK) == 0: # check and stop run if absent |
---|
| 145 | print basename+ ' >>>> ERROR - specified tuflow 2d_mat file %s missing ' %(mat_filename) |
---|
| 146 | sys.exit(0) # terminate the program |
---|
| 147 | |
---|
| 148 | if os.access(po_filename, os.F_OK) == 0: # check and stop run if absent |
---|
| 149 | print basename+ ' >>>> ERROR - specified tuflow 2d_po file %s missing ' %(po_filename) |
---|
| 150 | sys.exit(0) # terminate the program |
---|
| 151 | |
---|
| 152 | |
---|
| 153 | print basename+ ' >>>> #########################################################################' |
---|
| 154 | print basename+ ' >>>> COMMENCING THIS MODEL SIMULATION USING ANUGA REVISION NUMBER %s ' %0#%(get_revision_number()) |
---|
| 155 | print basename+ ' >>>> for the simulation named ' |
---|
| 156 | print basename+ ' >>>> ',catchment,'-',simclass,'-',scenario,'-',event |
---|
| 157 | print basename+ ' >>>> Run dated %s by %s of %s ' %(time.ctime(),user_name,org_name) |
---|
| 158 | print basename+ ' >>>> #########################################################################\n' |
---|
| 159 | |
---|
| 160 | print basename+ ' >>>> Checked - All required files/directories exist - OK to proceed! \n ' |
---|
| 161 | |
---|
| 162 | ##################################################################################### |
---|
| 163 | # # |
---|
| 164 | # COMMENCE ASSEMBLY OF THE REQUIRED DATA # |
---|
| 165 | # # |
---|
| 166 | ##################################################################################### |
---|
| 167 | |
---|
| 168 | print basename+' >>>> Commencing data assembly for this simulation ' |
---|
| 169 | |
---|
| 170 | |
---|
| 171 | ##################################################################################### |
---|
| 172 | # # |
---|
| 173 | # ASSEMBLE THE BOUNDING POLYGON # |
---|
| 174 | # # |
---|
| 175 | ##################################################################################### |
---|
| 176 | |
---|
| 177 | #------------------------------------------------------------------------------ |
---|
| 178 | # Define bounding polygon and default res to be used later in model_run.py to build |
---|
| 179 | # the mesh and boudary strings with their tags |
---|
| 180 | # |
---|
| 181 | # OUTPUTS OF THIS CODE BLOCK ARE; |
---|
| 182 | # bounding_polygon -- The bounding polygon within which the mesh will be created |
---|
| 183 | # default_res -- The default resolution to apply in creating the mesh |
---|
| 184 | #------------------------------------------------------------------------------ |
---|
| 185 | |
---|
| 186 | print basename+ ' >>>> Assemble the bounding polygon and set default mesh resolution' |
---|
| 187 | |
---|
| 188 | |
---|
| 189 | # Note..Bounding poly is a single contiguous polygon initially created in MapInfo. |
---|
| 190 | # Once selected it was exported to MID/MIF and a bounding_poly,csv created by editing the MIF |
---|
| 191 | # to remove pre and postambles and to add comma separators |
---|
| 192 | # EHR...Clumsy - need to be able to read bounding poly directly from (tuflow?)GIS!!! |
---|
| 193 | bounding_polygon = read_polygon('bounding_poly.csv') |
---|
| 194 | |
---|
| 195 | print basename+ ' >>>> Area of bounding polygon in Km2', polygon_area(bounding_polygon)/1000000.0 |
---|
| 196 | |
---|
| 197 | # Set mesh filename to be created with *.py files in simclass/scenario directory |
---|
| 198 | mesh_filename = basename+'.msh' |
---|
| 199 | |
---|
| 200 | # Set bounding polygon (default) mesh resolution |
---|
| 201 | default_res = 200 # m^2 (max area of triangle in triangular mesh) (coarse res rural and forest)) |
---|
| 202 | |
---|
| 203 | print basename+ ' >>>> Default resolution within bounding polygon is ',default_res,' m2' |
---|
| 204 | |
---|
| 205 | |
---|
| 206 | ##################################################################################### |
---|
| 207 | # # |
---|
| 208 | # ASSEMBLE THE TAGGED BOUNDARY STRINGS AROUND THE BOUNDING POLYGON # |
---|
| 209 | # # |
---|
| 210 | ##################################################################################### |
---|
| 211 | |
---|
| 212 | #------------------------------------------------------------------------------------ |
---|
| 213 | # Create tagged boundary string list for use in create-mesh in model_build.py |
---|
| 214 | # EHR... finding out point IDs to use is a hassle . Used mapinfo to identify vertex |
---|
| 215 | # numbers and then manually transfered to model_data.py (dont forget to subtract 1??) |
---|
| 216 | # Needs some way of creating in GIS and being read in?? |
---|
| 217 | # |
---|
| 218 | # OUTPUTS OF THIS CODE BLOCK ARE; |
---|
| 219 | # boundary_strings[]-- List of vertices of each tagged string segment around the |
---|
| 220 | # bounding polygon at which boundary conditions will be defined |
---|
| 221 | #------------------------------------------------------------------------------------ |
---|
| 222 | |
---|
| 223 | print basename+ ' >>>> Assemble tagged boundary strings around the bounding polygon ' |
---|
| 224 | |
---|
| 225 | boundary_strings = {'Lake': [84,85,86], |
---|
| 226 | 'MaMt': [56], |
---|
| 227 | 'Mriv': [39], |
---|
| 228 | 'Cbck': [36], |
---|
| 229 | 'WFra': [20], |
---|
| 230 | 'EFra': [12,13] } |
---|
| 231 | |
---|
| 232 | # Note Anuga will automatically create boundary tagged strings for what is left of the bounding |
---|
| 233 | # poly with the tag 'exterior'. ALL must be associated with a BC in the mainline Model_run.py |
---|
| 234 | |
---|
| 235 | print basename+ ' >>>> %i tagged boundary strings assigned by user' %(len(boundary_strings)) |
---|
| 236 | |
---|
| 237 | ##################################################################################### |
---|
| 238 | # # |
---|
| 239 | # ASSEMBLE INTERIOR RESOLUTION POLYGONS # |
---|
| 240 | # # |
---|
| 241 | ##################################################################################### |
---|
| 242 | |
---|
| 243 | #------------------------------------------------------------------------------- |
---|
| 244 | # Define Interior region polygons for later use in model_run.py to define zones |
---|
| 245 | # of different mesh resolution |
---|
| 246 | # This is an ANUGA specific input with no Tuflow equivalent |
---|
| 247 | # |
---|
| 248 | # OUTPUTS OF THIS CODE BLOCK ARE; |
---|
| 249 | # interior_resregions[]-- List of interior res regions containing [res_poly, res] |
---|
| 250 | # to be used in model_run to create the mesh |
---|
| 251 | #------------------------------------------------------------------------------- |
---|
| 252 | |
---|
| 253 | print basename+ ' >>>> Assemble any inner region polygons and set associated resolutions' |
---|
| 254 | |
---|
| 255 | # EHR...Clumsy - need to be able to read multiple regions directly from GIS |
---|
| 256 | fine_polygon = read_polygon('fine_poly.csv') # Fine) res (typ streams and around bridge openingss) |
---|
| 257 | fine_res = 50 # m^2 max |
---|
| 258 | #Note coarse not needed as set as default for bounding_polgon |
---|
| 259 | |
---|
| 260 | # Plot res polygons out to event/plot_respoly_filename.png for visual check |
---|
| 261 | if model_graphics : |
---|
| 262 | plot_respoly_filename = event+sep+'Macriv_Res_Polys' |
---|
| 263 | plot_polygons([bounding_polygon, fine_polygon], style=None,figname=plot_respoly_filename,verbose=model_verbose) |
---|
| 264 | |
---|
| 265 | # Create interior region resolutions list for later use in model_run.py - only one for this model |
---|
| 266 | interior_resregions = [ [ fine_polygon, fine_res] ] |
---|
| 267 | |
---|
| 268 | print basename+ ' >>>> %i interior resolution regions added ' %(len(interior_resregions)) |
---|
| 269 | |
---|
| 270 | ##################################################################################### |
---|
| 271 | # # |
---|
| 272 | # ASSEMBLE ELEVATION DATA # |
---|
| 273 | # # |
---|
| 274 | ##################################################################################### |
---|
| 275 | |
---|
| 276 | #------------------------------------------------------------------------------ |
---|
| 277 | # Assign reference to file with elevation data for later uset in model_build.py |
---|
| 278 | # the following assumes these elevation data files are stored with the *.py files |
---|
| 279 | # in the simclass/scenario (current) directory |
---|
| 280 | # |
---|
| 281 | # OUTPUTS OF THIS CODE BLOCK ARE; |
---|
| 282 | # elev_filename -- Filename containing the ALS data to be used to set mesh elevations |
---|
| 283 | #------------------------------------------------------------------------------ |
---|
| 284 | |
---|
| 285 | print basename+ ' >>>> Assemble the file containing elevation (ALS) data from %s ' %(elev_filename) |
---|
| 286 | |
---|
| 287 | # Assign/pre-process the file with the data to be used to assign mesh elevations |
---|
| 288 | # Identify the raw ALS data file |
---|
| 289 | |
---|
| 290 | # OPTION 1 (Preferred but limited to smaller ALS datasets) |
---|
| 291 | # This option converts the raw xyz ALS data into NETCDF (pts) format |
---|
| 292 | # This only needs to be done once. The pts file is then used to assign |
---|
| 293 | # mesh elevations in model_run.py |
---|
| 294 | # |
---|
| 295 | #print basename+' >>>> Elevation x,y,z scatterpoint dataset %s being used to create NETCDF pts file' %(elev_filename) |
---|
| 296 | # Convert into NETCDF pts format to speed later use in setting mesh elevations |
---|
| 297 | #G = Geospatial_data(elev_filename, max_read_lines=500, load_file_now=True, verbose=True) |
---|
| 298 | #G.export_points_file(basename+'.pts') |
---|
| 299 | # switch elev_filename to now point to the NETCDF pts file |
---|
| 300 | #elev_filename = basename+'.pts' |
---|
| 301 | |
---|
| 302 | # OPTION 2 (Leave elevation data in original (csv) format) |
---|
| 303 | # Export_points loads all data into memory (no blocking) so is limited in |
---|
| 304 | # regard to the number of points it can read in/export. |
---|
| 305 | # If there are more than about 6 million points in the ALS dataset |
---|
| 306 | # export_points will fail with a memory over-run error. |
---|
| 307 | # In such a case the elevation data should be left in csv format. |
---|
| 308 | |
---|
| 309 | # The elevation data is left in csv format in this model as the ALS dataset overruns memory ! |
---|
| 310 | |
---|
| 311 | print basename+ ' >>>> %s will be used to supply elevation data to the mesh' %(elev_filename) |
---|
| 312 | |
---|
| 313 | ##################################################################################### |
---|
| 314 | # # |
---|
| 315 | # ASSEMBLE TUFLOW SURFACE ROUGHNESS POLYGONS AND ASSOCIATED DATA # |
---|
| 316 | # # |
---|
| 317 | ##################################################################################### |
---|
| 318 | |
---|
| 319 | #------------------------------------------------------------------------------- |
---|
| 320 | # Read in tuflow roughness polygons and associated roughness data for later use |
---|
| 321 | # in model_run.py |
---|
| 322 | # |
---|
| 323 | # OUTPUTS OF THIS CODE BLOCK ARE; |
---|
[5977] | 324 | # mat_roughness_data[RID] -- dictionary of properties for each surface (RID) |
---|
| 325 | # mat_RID_list[RID] -- surface roughness Ids (RID) for each poly |
---|
| 326 | # mat_poly_list[[x0,y0],[x1,y1]...] -- list of vertices for each roughness poly |
---|
[5973] | 327 | #-------------------------------------------------------------------------------- |
---|
| 328 | |
---|
| 329 | |
---|
| 330 | print basename+ ' >>>> Assemble the surface roughness data from Tuflows %s and %s ' %(tmf_filename, mat_filename) |
---|
| 331 | |
---|
[5977] | 332 | # Get the tuflow roughness data for each surface class |
---|
[5973] | 333 | mat_roughness_data_list=[] |
---|
[5977] | 334 | mat_roughness_data_list=get_tuflow_data.get_tuflow_tmf(tmf_filename,verbose=model_verbose) |
---|
[5973] | 335 | |
---|
[5977] | 336 | # Turn material roughness data list into a dictionary |
---|
| 337 | mat_roughness_data = {} |
---|
| 338 | for entry in mat_roughness_data_list: |
---|
| 339 | key = entry[0] # rid |
---|
| 340 | mat_roughness_data[key] = [entry[1], # n0 |
---|
| 341 | entry[4], # d1 |
---|
| 342 | entry[5], # n1 |
---|
| 343 | entry[6], # d2 |
---|
| 344 | entry[7]] # n2 |
---|
| 345 | |
---|
| 346 | |
---|
| 347 | |
---|
| 348 | |
---|
[5973] | 349 | mat_RID_list=[] # Int list of rough poly IDs-one for each poly |
---|
| 350 | mat_poly_list=[] # list of float list of poly coords |
---|
| 351 | |
---|
| 352 | mat_RID_list,mat_poly_list=get_tuflow_data.get_tuflow_mat(mat_filename,model_verbose) # get the tuflow roughness polys |
---|
| 353 | |
---|
| 354 | # Plot roughness polygons out to event/plot_roughpoly_filename.png for visual check |
---|
| 355 | if model_graphics : |
---|
| 356 | plot_roughpoly_filename = event+sep+'Macriv_rough_Polys' |
---|
| 357 | plot_polygons( mat_poly_list, style=None, figname=plot_roughpoly_filename,verbose=model_verbose) |
---|
| 358 | |
---|
| 359 | # Extract the default RID roughness data |
---|
| 360 | for i in range(len(mat_roughness_data_list)) : |
---|
| 361 | if default_RID == mat_roughness_data_list[i][0] : # got a match |
---|
| 362 | default_n = mat_roughness_data_list[i][1] # default_n is initially the tuflow fixed n value |
---|
| 363 | default_mat = mat_roughness_data_list[i][8].rstrip(' ') # default mat name |
---|
| 364 | |
---|
| 365 | if model_verbose: |
---|
| 366 | print ' ++++ The default RID is %i - fixed n=%3.3f - %s ' %(default_RID,default_n,default_mat) |
---|
| 367 | |
---|
| 368 | print basename+ ' >>>> %i roughness polys and %i unique roughness IDs read in' %(len(mat_poly_list), len(mat_roughness_data_list)) |
---|
| 369 | |
---|
| 370 | |
---|
| 371 | ####################################################################################### |
---|
| 372 | # # |
---|
| 373 | # ASSEMBLE TUFLOW (TEMPORAL) SUBAREAL INFLOWS AND DOWNSTREAM BOUNDARY CONDITIONS # |
---|
| 374 | # # |
---|
| 375 | ####################################################################################### |
---|
| 376 | |
---|
| 377 | #-------------------------------------------------------------------------------------- |
---|
| 378 | # This section reads in the tuflow bc_dbase.csv file to obtain locations and file |
---|
| 379 | # references for the associated inflows or downstream boundary conditions. |
---|
| 380 | # It then creates the NetCDF flow hydrograph files from the tuflow ts1 file. |
---|
| 381 | # model_run then uses these to load the local or total temporal inflows into the domain. |
---|
| 382 | # The downstream boundary conditions are read in at the same time and stored for |
---|
| 383 | # later application in model_run where boundary conditions are applied. |
---|
| 384 | # |
---|
| 385 | # OUTPUTS OF THIS CODE BLOCK ARE; |
---|
| 386 | # inflow_hydrographs[]-- List of inflow hydrographs containing [tms_filename, xcoord,ycoord] |
---|
| 387 | # dsbc_hydrographs[] -- List of dsbc hydrographs containing [dsbc_filename] |
---|
| 388 | #-------------------------------------------------------------------------------------- |
---|
| 389 | |
---|
| 390 | |
---|
| 391 | # ASSEMBLE THE (TEMPORAL) SUBAREAL INFLOWS::::::::::::::::::::::::::::::::::::::::::::::: |
---|
| 392 | |
---|
| 393 | # Note: The current inflow function 'pours' flow onto the domain within a circle or |
---|
| 394 | # polygonal area specified by the user at the specified temporal rate. |
---|
| 395 | # In due course, the above inflows should be augmented by latteral inflows at the boundary |
---|
| 396 | # (total as distinct from local hydrographs) to better correspond with conventional |
---|
| 397 | # flood modelling. |
---|
| 398 | # A forcing function for flow (or rainfall) poured onto a polygon is still however |
---|
| 399 | # relevant to inflow/rainfall falling directly onto the model domain |
---|
| 400 | |
---|
| 401 | print basename+" >>>> Assemble the inflow and dsbc hydrographs from the tuflow database file", bcdbase_filename |
---|
| 402 | |
---|
| 403 | inflowNo = int(-1) # Initialise no of inflow hydrographs |
---|
| 404 | dsbcNo = int(-1) # Initialise no of dsbc hydrographs |
---|
| 405 | inflow_hydrographs = [] # Initialise list of inflow hydros |
---|
| 406 | dsbc_hydrograph = [] # Initialise dsbc hydrograph |
---|
| 407 | inflow_hydrograph = [] # Initialise inflow hydrograph |
---|
| 408 | outlet = [] # initialise x,y coords of subareal outlet |
---|
| 409 | dsbc_hydrographs = [] # Initialise list of dsbc hydrographs |
---|
| 410 | |
---|
| 411 | bc_fid=open(bcdbase_filename, 'r') # open the primary bc_dbase file |
---|
| 412 | bc_lines = bc_fid.readlines() # read all file into string list |
---|
| 413 | bc_fid.close() # close the bc_dbase file |
---|
| 414 | |
---|
| 415 | for bc_line in bc_lines[1:]: # skip headers and read each line of bc_lines and process |
---|
| 416 | |
---|
| 417 | # break each bcdbase line into fields confirm type of bc data and obtain/append hydrograph |
---|
| 418 | |
---|
| 419 | bc_fields=bc_line.split(',') # split bc_line into bc fields |
---|
| 420 | location=bc_fields[0] # record the bc location |
---|
| 421 | loc_tempname=bc_fields[1] # record the assoc bc's filename |
---|
| 422 | loc_filename=loc_tempname.replace("_EVENT_",'_'+event+'_') # modify loc filename to reflect event |
---|
| 423 | |
---|
| 424 | bc_filetype=get_tuflow_data.get_tuflow_bc_filetype(loc_filename,verbose=model_verbose) # obtain type = "ts1"(flowrate) or "csv" (dsbc elev) |
---|
| 425 | |
---|
| 426 | if loc_filename.find(".ts1")>=0: # Is file containing hydrographs for each subarea |
---|
| 427 | bc_filetype="ts1" |
---|
| 428 | |
---|
| 429 | elif loc_filename.find(".csv")>=0: # Is time(hrs),elev(m) dsbc.csv file |
---|
| 430 | bc_filetype="csv" |
---|
| 431 | |
---|
| 432 | else: |
---|
| 433 | print basename+ " >>>> ERROR model_data.py - Unrecognised bc filetype %s - aborting " %(bc_filetype) |
---|
| 434 | sys.exit(0) # terminate the program |
---|
| 435 | |
---|
| 436 | if bc_filetype == "ts1": # add inflow hydrograph |
---|
| 437 | inflowNo = inflowNo +1 # increment inflow hydro Id |
---|
| 438 | # read in the inflow time series |
---|
| 439 | hyd_time,hyd_flow=get_tuflow_data.get_tuflow_bc(location=location, loc_filename=loc_filename, bc_filetype=bc_filetype, verbose=model_verbose) |
---|
| 440 | # convert to tms NetCDF file type |
---|
| 441 | tms_filename=get_tuflow_data.convert_asc_ts_to_tms(tms_dir,location,'seconds',hyd_time,hyd_flow,verbose=model_verbose) |
---|
| 442 | # get coords of subareal outlet node |
---|
| 443 | xcoord,ycoord=get_tuflow_data.get_wbnm_coords(wbnm_filename=wbnm_filename,subarea=location,verbose=model_verbose) |
---|
| 444 | outlet=[xcoord,ycoord] |
---|
| 445 | # check inflow coords are within bounding poly |
---|
| 446 | if is_outside_polygon(outlet,bounding_polygon,closed = True,verbose=False): |
---|
| 447 | print basename+ " >>>> ERROR model_data.py - Subareal outlet for %s at - %7.2f %7.2f is on or outside the bounding polygon " %(tms_filename,xcoord,ycoord) |
---|
| 448 | sys,exit(0) # terminate the program |
---|
| 449 | |
---|
| 450 | inflow_hydrograph=[tms_filename,xcoord,ycoord] |
---|
| 451 | inflow_hydrographs.append(inflow_hydrograph) # Store details ready to use in model_run |
---|
| 452 | |
---|
| 453 | |
---|
| 454 | if bc_filetype == "csv": # add dsbc hydrograph |
---|
| 455 | dsbcNo = dsbcNo+1 # Increment dsbc hydro ID |
---|
| 456 | # read in downstream boundary condition water elevation time series |
---|
| 457 | dsbc_time,dsbc_elev=get_tuflow_data.get_tuflow_bc(location=location, loc_filename=loc_filename, bc_filetype=bc_filetype,verbose=model_verbose) |
---|
| 458 | # convert to tms NetCDF file type |
---|
| 459 | dsbc_tms_filename=get_tuflow_data.convert_asc_ts_to_tms(tms_dir,location,'seconds',dsbc_time,dsbc_elev,verbose=model_verbose) |
---|
| 460 | dsbc_hydrographs.append(dsbc_tms_filename) # Store details ready to use in model_run |
---|
| 461 | if dsbcNo > 1 : |
---|
| 462 | print basename+ " >>>> ERROR model_data_py - Current model is limited to 1 but dsbc - %i read in" %(dsbcNo) |
---|
| 463 | sys.exit(0) # EHR -- need to generalise to many dsbc!!!!!! |
---|
| 464 | |
---|
| 465 | print basename+' >>>> %i inflow and %i dsbc hydrographs read in and and stored ' %(len(inflow_hydrographs),len(dsbc_hydrographs)) |
---|
| 466 | |
---|
| 467 | print basename+' >>>> Converted tuflow inflow and dsbc hydrographs and stored as tms files in %s ' %(sep+tms_dir) |
---|
| 468 | |
---|
| 469 | |
---|