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

Last change on this file since 7119 was 5672, checked in by ole, 17 years ago

Tested for bug where default_boundry was repeatedly added to by Field_boundary.
Fixed bug and updated manual accordingly.

This closes ticket:293

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