"""Script for running tsunami inundation scenario for Dampier, WA, Australia. Source data such as elevation and boundary data is assumed to be available in directories specified by project.py The output sww file is stored in project.output_run_time_dir The scenario is defined by a triangular mesh created from project.polygon, the elevation data and a simulated tsunami generated with URS code. Ole Nielsen and Duncan Gray, GA - 2005 and Jane Sexton, Nick Bartzis, GA - 2006 """ #------------------------------------------------------------------------------ # Import necessary modules #------------------------------------------------------------------------------ # Standard modules from os import sep from os.path import dirname, basename from os import mkdir, access, F_OK from shutil import copy import time import sys # Related major packages from anuga.shallow_water import Domain from anuga.shallow_water import Dirichlet_boundary from anuga.shallow_water import File_boundary from anuga.shallow_water import Reflective_boundary from anuga.shallow_water import Field_boundary from Numeric import allclose from anuga.shallow_water.data_manager import export_grid from anuga.pmesh.mesh_interface import create_mesh_from_regions from anuga.shallow_water.data_manager import start_screen_catcher, copy_code_files,store_parameters from anuga_parallel.parallel_api import distribute, numprocs, myid, barrier from anuga_parallel.parallel_abstraction import get_processor_name from anuga.caching import myhash from anuga.damage_modelling.inundation_damage import add_depth_and_momentum2csv, inundation_damage from anuga.fit_interpolate.benchmark_least_squares import mem_usage # Application specific imports import project # Definition of file names and polygons def run_model(**kwargs): #------------------------------------------------------------------------------ # Copy scripts to time stamped output directory and capture screen # output to file #------------------------------------------------------------------------------ print "Processor Name:",get_processor_name() #copy script must be before screen_catcher #print kwargs print 'output_dir',kwargs['output_dir'] if myid == 0: copy_code_files(kwargs['output_dir'],__file__, dirname(project.__file__)+sep+ project.__name__+'.py' ) store_parameters(**kwargs) barrier() start_screen_catcher(kwargs['output_dir'], myid, numprocs) print "Processor Name:",get_processor_name() # filenames # meshes_dir_name = project.meshes_dir_name+'.msh' # creates copy of code in output dir print 'min triangles', project.trigs_min, print 'Note: This is generally about 20% less than the final amount' #-------------------------------------------------------------------------- # Create the triangular mesh based on overall clipping polygon with a # tagged # boundary and interior regions defined in project.py along with # resolutions (maximal area of per triangle) for each polygon #-------------------------------------------------------------------------- #IMPORTANT don't cache create_mesh_from_region and Domain(mesh....) as it # causes problems with the ability to cache set quantity which takes alot of times if myid == 0: print 'start create mesh from regions' create_mesh_from_regions(project.poly_all, boundary_tags=project.boundary_tags, maximum_triangle_area=project.res_poly_all, interior_regions=project.interior_regions, filename=project.meshes_dir_name+'.msh', use_cache=False, verbose=False) barrier() #------------------------------------------------------------------------- # Setup computational domain #------------------------------------------------------------------------- print 'Setup computational domain' #domain = cache(Domain, (meshes_dir_name), {'use_cache':True, 'verbose':True}, verbose=True) #above don't work domain = Domain(project.meshes_dir_name+'.msh', use_cache=False, verbose=True) print 'memory usage before del domain',mem_usage() print domain.statistics() print 'triangles',len(domain) kwargs['act_num_trigs']=len(domain) #------------------------------------------------------------------------- # Setup initial conditions #------------------------------------------------------------------------- if myid == 0: print 'Setup initial conditions' from polygon import Polygon_function #following sets the stage/water to be offcoast only IC = Polygon_function( [(project.poly_mainland, 0)], default = kwargs['tide'], geo_reference = domain.geo_reference) domain.set_quantity('stage', IC) # domain.set_quantity('stage', kwargs['tide']) domain.set_quantity('friction', kwargs['friction']) print 'Start Set quantity',kwargs['bathy_file'] domain.set_quantity('elevation', filename = kwargs['bathy_file'], use_cache = True, verbose = True, alpha = kwargs['alpha']) print 'Finished Set quantity' barrier() #------------------------------------------------------ # Distribute domain to implement parallelism !!! #------------------------------------------------------ if numprocs > 1: domain=distribute(domain) #------------------------------------------------------ # Set domain parameters #------------------------------------------------------ print 'domain id', id(domain) domain.set_name(kwargs['aa_scenario_name']) domain.set_datadir(kwargs['output_dir']) domain.set_default_order(2) # Apply second order scheme domain.set_minimum_storable_height(0.01) # Don't store anything less than 1cm domain.set_store_vertices_uniquely(False) domain.set_quantities_to_be_stored(['stage', 'xmomentum', 'ymomentum']) domain.tight_slope_limiters = 1 #domain.set_maximum_allowed_speed(0.1) # Allow a little runoff (0.1 is OK) print 'domain id', id(domain) domain.beta_h = 0 #------------------------------------------------------------------------- # Setup boundary conditions #------------------------------------------------------------------------- print 'Available boundary tags', domain.get_boundary_tags() print 'domain id', id(domain) #print 'Reading Boundary file',project.boundaries_dir_namea + '.sww' print'set_boundary' Br = Reflective_boundary(domain) Bd = Dirichlet_boundary([kwargs['tide'],0,0]) Bf = Field_boundary(kwargs['boundary_file'], domain, time_thinning=kwargs['time_thinning'], mean_stage=kwargs['tide'], use_cache=True, verbose=True) print 'finished reading boundary file' domain.set_boundary({'back': Bd, 'side': Bd, 'ocean': Bf}) kwargs['input_start_time']=domain.starttime print'finish set boundary' #---------------------------------------------------------------------------- # Evolve system through time #-------------------------------------------------------------------- t0 = time.time() for t in domain.evolve(yieldstep = 240, finaltime = kwargs['finaltime']): domain.write_time() domain.write_boundary_statistics(tags = 'ocean') x, y = domain.get_maximum_inundation_location() q = domain.get_maximum_inundation_elevation() print 'Maximum runup observed at (%.2f, %.2f) with elevation %.2f' %(x,y,q) print 'That took %.2f seconds' %(time.time()-t0) #kwargs 'completed' must be added to write the final parameters to file kwargs['completed']=str(time.time()-t0) if myid==0: store_parameters(**kwargs) barrier print 'memory usage before del domain1',mem_usage() #------------------------------------------------------------- if __name__ == "__main__": kwargs={} kwargs['est_num_trigs']=project.trigs_min kwargs['num_cpu']=numprocs kwargs['host']=project.host kwargs['res_factor']=project.res_factor kwargs['starttime']=project.starttime kwargs['yieldstep']=project.yieldstep kwargs['midtime']=project.midtime kwargs['finaltime']=project.finaltime kwargs['output_dir']=project.output_run_time_dir kwargs['bathy_file']=project.combined_dir_name+'.txt' # kwargs['bathy_file']=project.combined_small_dir_name + '.pts' kwargs['boundary_file']=project.boundaries_in_dir_name + '.sww' kwargs['file_name']=project.home+'detail.csv' kwargs['aa_scenario_name']=project.scenario_name kwargs['ab_time']=project.time kwargs['res_factor']= project.res_factor kwargs['tide']=project.tide kwargs['user']=project.user kwargs['alpha'] = project.alpha kwargs['friction']=project.friction kwargs['time_thinning'] = project.time_thinning kwargs['dir_comment']=project.dir_comment kwargs['export_cellsize']=project.export_cellsize run_model(**kwargs) if myid==0: export_model(**kwargs) barrier