source: anuga_work/development/boxingday08/run_boxingday_polyline.py @ 5442

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

Retired h-limiter and beta_h as per ticket:194.
All unit tests and validation tests pass.

File size: 7.5 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#------------------------------------------------------------------------------
45# Define scenario as either slide or fixed_wave.
46#------------------------------------------------------------------------------
47
48#scenario = 'poor_simulation'
49scenario = 'good_simulation'
50
51if os.access(scenario, os.F_OK) == 0:
52    os.mkdir(scenario)
53
54timestamp = strftime('%Y%m%d_%H%M%S',localtime())
55basename = scenario[:4] + '_polyline'
56
57
58#------------------------------------------------------------------------------
59# Preparation of topographic data
60# Convert ASC 2 DEM 2 PTS using source data and store result in source data
61#------------------------------------------------------------------------------
62
63if scenario == 'good_simualation':
64     msg = 'Must use combine_good_data to create bathymetry .pts file'
65     assert os.path.exists(project.good_combined_dir_name+'.pts'), msg
66
67#------------------------------------------------------------------------------
68# Create the triangular mesh based on overall clipping polygon with a tagged
69# boundary and interior regions defined in project.py along with
70# resolutions (maximal area of per triangle) for each polygon
71#------------------------------------------------------------------------------
72extent_res     = 1000000.0
73contour20m_res = 50000.0
74island_res     = 5000.0
75bay_res        = 2000.0
76patong_res     = 400.0
77
78
79# make polygon that contains land that does not affect result.
80
81interior_regions = [[project.patong, patong_res],
82                    [project.bay, bay_res],
83                    [project.contour20m, contour20m_res]]#,
84                    #[project.island_north, island_res],
85                    #[project.island_south, island_res],
86                    #[project.island_south2, island_res]]
87
88
89#for coarse run to test gauges
90#extent_res = 10000000.0
91#interior_regions=None
92
93from Numeric import arange,allclose
94boundary_tags={'ocean': arange(0,41).tolist(), 'otherocean': [41,44], 'land': [42,43]}
95
96#trigs_min = number_mesh_triangles(interior_regions, project.bounding_polygon,extent_res)
97#print 'Minimum number of traingles ', trigs_min
98
99# filenames
100meshname = project.meshname + '_polyline.tsh'
101mesh_elevname = project.mesh_elevname  + '_polyline.tsh'
102
103print 'start create mesh from regions'
104
105_ = cache(create_mesh_from_regions,
106          project.bounding_polygon,
107          {'boundary_tags': boundary_tags,
108           'maximum_triangle_area': extent_res,
109           'filename': meshname,           
110           'interior_regions': interior_regions},
111          verbose = True,
112          dependencies = ['project.py']
113          #, evaluate=True
114          )
115
116
117#------------------------------------------------------------------------------
118# Setup computational domain
119#------------------------------------------------------------------------------
120print 'Converting mesh to domain'
121
122#domain = Domain(meshname, use_cache=False, verbose=True)
123
124domain = cache(pmesh_to_domain_instance,
125               (meshname, Domain),
126               dependencies = [meshname])
127
128print 'The extent is ', domain.get_extent()
129print domain.statistics()
130
131domain.set_name(basename+timestamp)
132#domain.set_name(basename)
133domain.set_datadir(scenario)
134domain.set_quantities_to_be_stored(['stage', 'xmomentum', 'ymomentum'])
135domain.set_minimum_storable_height(0.01)
136
137domain.tight_slope_limiters = 1
138domain.set_default_order(2)
139print 'domain.tight_slope_limiters', domain.tight_slope_limiters
140
141domain.points_file_block_line_size = 50000
142
143#------------------------------------------------------------------------------
144# Setup initial conditions
145#------------------------------------------------------------------------------
146     
147tide = 0.0
148domain.set_quantity('stage', tide)
149domain.set_quantity('friction', 0.01) 
150
151if scenario == 'poor_simulation':
152     domain.set_quantity('elevation', 
153                         filename=project.poor_combined_dir_name + '.pts',
154                         use_cache=True,
155                         verbose=True,
156                         alpha=0.1)
157
158if scenario == 'good_simulation':
159     domain.set_quantity('elevation', 
160                         filename=project.good_combined_dir_name + '.pts',
161                         use_cache=True,
162                         verbose=True,
163                         alpha=0.1)
164#------------------------------------------------------------------------------
165# Setup boundary conditions
166#------------------------------------------------------------------------------
167boundary_urs_in='data/boxing'
168boundary_urs_out=project.base_name
169
170print 'Available boundary tags', domain.get_boundary_tags()
171Bf = File_boundary(boundary_urs_out+'.sts', 
172                   domain, time_thinning=1,
173                   use_cache=True,verbose = True,boundary_polygon=project.bounding_polygon)
174
175Br = Reflective_boundary(domain)
176Bd = Dirichlet_boundary([tide,0.0,0.0])
177
178domain.set_boundary({'ocean': Bf,
179                     'otherocean': Bd,
180                     'land': Br,
181                     'both': Bd})
182
183#------------------------------------------------------------------------------
184# Evolve system through time
185#------------------------------------------------------------------------------
186import time
187t0 = time.time()
188
189#from Numeric import allclose
190#from anuga.abstract_2d_finite_volumes.quantity import Quantity
191
192# Add new loop that uses larger yieldstep until wave first reaches a point of
193# the ANUGA boundary. Or find a way to clip MOST sww boundary file to only
194# start when boundary stage first becomes non-zero.
195
196for t in domain.evolve(yieldstep = 20.0, finaltime = 18000.0, 
197                       skip_initial_step = False):
198    if allclose(t,10800.0):
199        print 'Changing urs file boundary to dirichlet. Urs gauges only have 3 hours of data'
200        domain.set_boundary({'ocean': Bd,
201                     'otherocean': Bd,
202                     'land': Br,
203                     'both': Bd})
204   
205    domain.write_time()
206           
207print 'That took %.2f seconds' %(time.time()-t0)
Note: See TracBrowser for help on using the repository browser.