source: anuga_work/development/boxingday08/run_boxingday_most.py @ 5404

Last change on this file since 5404 was 5404, checked in by ole, 16 years ago

Fixed clipping of polygons.
Updated polygon files
Played with resolutions.

File size: 8.4 KB
Line 
1"""Script for running the 2004 boxing Day tsunami inundation scenario for
2Phuket, Thailand.
3
4Source data such as elevation and boundary data is assumed to be available in
5directories specified by project.py
6The output sww file is stored in directory named after the scenario, i.e
7slide or fixed_wave.
8
9The scenario is defined by a triangular mesh created from project.polygon,
10the elevation data and a tsunami wave generated by a submarine mass failure.
11
12Author: John Jakeman, The Australian National University (2008)
13"""
14
15#------------------------------------------------------------------------------
16# Import necessary modules
17#------------------------------------------------------------------------------
18
19# Standard modules
20import os
21import time
22import sys
23from time import localtime, strftime
24
25# Related major packages
26from anuga.shallow_water import Domain
27from anuga.shallow_water import Reflective_boundary
28from anuga.shallow_water import Dirichlet_boundary
29from anuga.shallow_water import Time_boundary
30from anuga.shallow_water import File_boundary
31from anuga.pmesh.mesh_interface import create_mesh_from_regions
32from anuga.shallow_water.data_manager import convert_dem_from_ascii2netcdf, ferret2sww
33from anuga.shallow_water.data_manager import dem2pts
34from anuga.coordinate_transforms.redfearn import convert_from_latlon_to_utm
35from anuga.utilities.polygon import number_mesh_triangles
36from anuga.fit_interpolate.fit import fit_to_mesh_file
37from anuga.caching import cache
38from anuga.abstract_2d_finite_volumes.pmesh2domain import pmesh_to_domain_instance
39
40# Application specific imports
41import project                 # Definition of file names and polygons
42
43#------------------------------------------------------------------------------
44# Define scenario as either slide or fixed_wave.
45#------------------------------------------------------------------------------
46
47#scenario = 'poor_simulation'
48scenario = 'good_simulation'
49
50if os.access(scenario, os.F_OK) == 0:
51    os.mkdir(scenario)
52
53timestamp = strftime('%Y%m%d_%H%M%S',localtime())
54basename = scenario[:4] + '_most'
55
56
57#------------------------------------------------------------------------------
58# Preparation of topographic data
59# Convert ASC 2 DEM 2 PTS using source data and store result in source data
60#------------------------------------------------------------------------------
61
62if scenario == 'good_simualation':
63     msg = 'Must use combine_good_data to create bathymetry .pts file'
64     assert os.path.exists(project.good_combined_dir_name+'.pts'), msg
65
66#------------------------------------------------------------------------------
67# Create the triangular mesh based on overall clipping polygon with a tagged
68# boundary and interior regions defined in project.py along with
69# resolutions (maximal area of per triangle) for each polygon
70#------------------------------------------------------------------------------
71extent_res     = 1000000.0
72contour20m_res = 50000.0
73island_res     = 5000.0
74bay_res        = 2000.0
75patong_res     = 400.0
76
77
78
79# make polygon that contains land that does not affect result.
80interior_regions = [[project.patong, patong_res],
81                    [project.bay, bay_res],
82                    [project.contour20m, contour20m_res]]#,
83                    #[project.island_north, island_res],
84                    #[project.island_south, island_res],
85                    #[project.island_south2, island_res]]
86
87#for coarse run to test gauges
88#extent_res = 1000000.0 #causes inaccurate stage
89#interior_regions=None
90
91from Numeric import arange,allclose
92boundary_tags={'ocean': arange(0,41).tolist(), 'otherocean': [41,44], 'land': [42,43]}
93
94
95#trigs_min = number_mesh_triangles(interior_regions, project.bounding_polygon,extent_res)
96#print 'Minimum number of traingles ', trigs_min
97
98# filenames
99meshname = project.meshname + '_most.tsh'
100mesh_elevname = project.mesh_elevname  + '_most.tsh'
101
102print 'start create mesh from regions'
103
104_ = cache(create_mesh_from_regions,
105          project.bounding_polygon,
106          {'boundary_tags': boundary_tags,
107           'maximum_triangle_area': extent_res,
108           'filename': meshname,           
109           'interior_regions': interior_regions},
110          verbose = True#,
111          #dependencies = ['run_boxingday_most.py']
112          #, evaluate=True
113          )
114
115#------------------------------------------------------------------------------
116# Setup computational domain
117#------------------------------------------------------------------------------
118print 'Converting mesh to domain'
119
120#domain = Domain(meshname, use_cache=False, verbose=True)
121
122domain = cache(pmesh_to_domain_instance,
123               (meshname, Domain),
124               dependencies = [meshname])
125
126print 'Number of triangles = ', len(domain)
127print 'The extent is ', domain.get_extent()
128print domain.statistics()
129
130domain.set_name(basename+timestamp) 
131domain.set_datadir(scenario)
132domain.set_quantities_to_be_stored(['stage', 'xmomentum', 'ymomentum'])
133domain.set_minimum_storable_height(0.01)
134
135domain.beta_h = 0
136domain.tight_slope_limiters = 1
137domain.set_default_order(2)
138print 'domain.tight_slope_limiters', domain.tight_slope_limiters
139
140domain.points_file_block_line_size = 50000
141
142#------------------------------------------------------------------------------
143# Setup initial conditions
144#------------------------------------------------------------------------------
145     
146tide = 0.0
147domain.set_quantity('stage', tide)
148domain.set_quantity('friction', 0.01) 
149
150if scenario == 'poor_simulation':
151     domain.set_quantity('elevation', 
152                         filename=project.poor_combined_dir_name + '.pts',
153                         use_cache=True,
154                         verbose=True,
155                         alpha=0.1)
156
157if scenario == 'good_simulation':
158     domain.set_quantity('elevation', 
159                         filename=project.good_combined_dir_name + '.pts',
160                         use_cache=True,
161                         verbose=True,
162                         alpha=0.1)
163#------------------------------------------------------------------------------
164# Setup boundary conditions
165#------------------------------------------------------------------------------
166
167print 'start ferret2sww'
168# Note only need to do when an SWW file for the MOST boundary doesn't exist or the bounding polygon has changed
169
170if os.path.exists(project.boundary_most_out+'.sww'):
171    print 'sww boundary file already created ensure boundary polygon has not changed'
172else:
173    south = project.south
174    north = project.north
175    west = project.west
176    east = project.east
177
178    #note only need to do when an SWW file for the MOST boundary doesn't exist
179    cache(ferret2sww,
180          (project.boundary_most_in,
181           project.boundary_most_out), 
182          {'verbose': True,
183           'minlat': south,
184           'maxlat': north,
185           'minlon': west,
186           'maxlon': east,
187           #'origin': project.mesh_origin,
188           'origin': domain.geo_reference.get_origin(),
189           'mean_stage': tide,
190           'zscale': 1,                 #Enhance tsunami
191           'fail_on_NaN': False,
192           'inverted_bathymetry': True},
193           evaluate = True,
194           verbose = True,
195          dependencies = 'run_boxingday_most.py')
196
197print 'Available boundary tags', domain.get_boundary_tags()
198#Bf = File_boundary(project.boundary_most_out+'.sww',
199#                    domain, time_thinning=1, use_cache=True,verbose = True)
200Br = Reflective_boundary(domain)
201Bd = Dirichlet_boundary([tide,0.0,0.0])
202
203domain.set_boundary({'ocean': Bd,
204                     'otherocean': Bd,
205                     'land': Br,
206                     'both': Bd})
207
208#------------------------------------------------------------------------------
209# Evolve system through time
210#------------------------------------------------------------------------------
211import time
212t0 = time.time()
213
214#from Numeric import allclose
215#from anuga.abstract_2d_finite_volumes.quantity import Quantity
216
217# Add new loop that uses larger yieldstep until wave first reaches a point of
218# the ANUGA boundary. Or find a way to clip MOST sww boundary file to only
219# start when boundary stage first becomes non-zero.
220
221for t in domain.evolve(yieldstep = 20.0, finaltime = 18000.0, 
222                       skip_initial_step = False):
223    if allclose(t,10800.0):
224        print 'Changing urs file boundary to dirichlet. Urs gauges only have 3 hours of data'
225        domain.set_boundary({'ocean': Bd,
226                     'otherocean': Bd,
227                     'land': Br,
228                     'both': Bd})
229   
230    domain.write_time()
231print 'That took %.2f seconds' %(time.time()-t0)
Note: See TracBrowser for help on using the repository browser.