source: anuga_work/production/patong/new_version/run_model.py @ 6750

Last change on this file since 6750 was 6750, checked in by ole, 15 years ago

Reverted 'do not evolve' code in patong simulation.
It didn't work and is not desirable for this model.

File size: 8.1 KB
Line 
1"""Run a tsunami inundation scenario for Busselton, WA, Australia.
2
3The scenario is defined by a triangular mesh created from project.polygon, the
4elevation data is compiled into a pts file through build_elevation.py and a
5simulated tsunami is generated through an sts file from build_boundary.py.
6
7Input: sts file (build_boundary.py for respective event)
8       pts file (build_elevation.py)
9       information from project file
10Outputs: sww file stored in project.output_run_time_dir
11The export_results_all.py and get_timeseries.py is reliant
12on the outputs of this script
13
14Ole Nielsen and Duncan Gray, GA - 2005, Jane Sexton, Nick Bartzis, GA - 2006
15Ole Nielsen, Jane Sexton and Kristy Van Putten - 2008
16"""
17
18#------------------------------------------------------------------------------
19# Import necessary modules
20#------------------------------------------------------------------------------
21
22# Standard modules
23import os
24import os.path
25import time
26from time import localtime, strftime, gmtime
27
28# Related major packages
29from Scientific.IO.NetCDF import NetCDFFile
30import Numeric as num
31
32from anuga.interface import create_domain_from_regions
33from anuga.interface import Transmissive_stage_zero_momentum_boundary
34from anuga.interface import Dirichlet_boundary
35from anuga.interface import Reflective_boundary
36from anuga.interface import Field_boundary
37from anuga.interface import create_sts_boundary
38from anuga.interface import csv2building_polygons
39from file_length import file_length
40
41from anuga.shallow_water.data_manager import start_screen_catcher
42from anuga.shallow_water.data_manager import copy_code_files
43from anuga.shallow_water.data_manager import urs2sts
44from anuga.utilities.polygon import read_polygon, Polygon_function
45from anuga.caching import cache
46
47# Application specific imports
48from setup_model import project
49import build_urs_boundary as bub
50
51#-------------------------------------------------------------------------------
52# Copy scripts to time stamped output directory and capture screen
53# output to file. Copy script must be before screen_catcher
54#-------------------------------------------------------------------------------
55
56copy_code_files(project.output_run, __file__, 
57                os.path.join(os.path.dirname(project.__file__),
58                             project.__name__+'.py'))
59start_screen_catcher(project.output_run, 0, 1)
60
61#-------------------------------------------------------------------------------
62# Create the computational domain based on overall clipping polygon with
63# a tagged boundary and interior regions defined in project.py along with
64# resolutions (maximal area of per triangle) for each polygon
65#-------------------------------------------------------------------------------
66
67print 'Create computational domain'
68
69# Create the STS file
70# FIXME (Ole): This is deadly dangerous if buildcode changes (as was the case 24th March 2009)
71# We need to use caching instead!
72
73print 'project.mux_data_folder=%s' % project.mux_data_folder
74if not os.path.exists(project.event_sts + '.sts'):
75    bub.build_urs_boundary(project.mux_input_filename, project.event_sts)
76
77# Read in boundary from ordered sts file
78event_sts = create_sts_boundary(project.event_sts)
79
80# Reading the landward defined points, this incorporates the original clipping
81# polygon minus the 100m contour
82landward_boundary = read_polygon(project.landward_boundary)
83
84# Combine sts polyline with landward points
85bounding_polygon_sts = event_sts + landward_boundary
86
87# Number of boundary segments
88num_ocean_segments = len(event_sts) - 1
89# Number of landward_boundary points
90num_land_points = file_length(project.landward_boundary)
91
92# Boundary tags refer to project.landward_boundary
93# 4 points equals 5 segments start at N
94boundary_tags={'back': range(num_ocean_segments+1,
95                             num_ocean_segments+num_land_points),
96               'side': [num_ocean_segments,
97                        num_ocean_segments+num_land_points],
98               'ocean': range(num_ocean_segments)}
99
100# Build mesh and domain
101domain = create_domain_from_regions(bounding_polygon_sts,
102                                    boundary_tags=boundary_tags,
103                                    maximum_triangle_area=project.bounding_maxarea,
104                                    interior_regions=project.interior_regions,
105                                    mesh_filename=project.meshes,
106                                    use_cache=True,
107                                    verbose=True)
108print domain.statistics()
109
110# FIXME(Ole): How can we make this more automatic?
111domain.geo_reference.zone = project.zone
112
113
114domain.set_name(project.scenario_name)
115domain.set_datadir(project.output_run) 
116domain.set_minimum_storable_height(0.01)    # Don't store depth less than 1cm
117
118#-------------------------------------------------------------------------------
119# Setup initial conditions
120#-------------------------------------------------------------------------------
121
122print 'Setup initial conditions'
123
124# Set the initial stage in the offcoast region only
125if project.land_initial_conditions:
126    IC = Polygon_function(project.land_initial_conditions,
127                          default=project.tide,
128                          geo_reference=domain.geo_reference)
129else:
130    IC = 0
131domain.set_quantity('stage', IC, use_cache=True, verbose=True)
132domain.set_quantity('friction', project.friction) 
133domain.set_quantity('elevation', 
134                    filename=project.combined_elevation+'.pts',
135                    use_cache=True,
136                    verbose=True,
137                    alpha=project.alpha)
138
139if project.use_buildings:
140    # Add buildings from file
141    print 'Reading building polygons'   
142    building_polygons, building_heights = csv2building_polygons(project.building_polygon)
143    #clipping_polygons=project.building_area_polygons)
144
145    def create_polygon_function(building_polygons, geo_reference=None):
146        L = []
147        for i, key in enumerate(building_polygons):
148            if i%100==0: print i
149            poly = building_polygons[key]
150            elev = building_heights[key]
151            L.append((poly, elev))
152           
153            buildings = Polygon_function(L, default=0.0,
154                                         geo_reference=geo_reference)
155        return buildings
156
157    print 'Creating %d building polygons' % len(building_polygons)
158    buildings = cache(create_polygon_function,
159                      building_polygons,
160                      {'geo_reference': domain.geo_reference},
161                      verbose=True)
162
163    print 'Adding buildings'
164    domain.add_quantity('elevation',
165                        buildings,
166                        use_cache=True,
167                        verbose=True)
168
169
170#-------------------------------------------------------------------------------
171# Setup boundary conditions
172#-------------------------------------------------------------------------------
173
174print 'Set boundary - available tags:', domain.get_boundary_tags()
175
176Br = Reflective_boundary(domain)
177Bs = Transmissive_stage_zero_momentum_boundary(domain)
178Bf = Field_boundary(project.event_sts+'.sts',
179                    domain,
180                    mean_stage=project.tide,
181                    time_thinning=1,
182                    default_boundary=Dirichlet_boundary([0, 0, 0]),
183                    boundary_polygon=bounding_polygon_sts,                   
184                    use_cache=True,
185                    verbose=True)
186
187domain.set_boundary({'back': Br,
188                     'side': Bs,
189                     'ocean': Bf}) 
190
191#-------------------------------------------------------------------------------
192# Evolve system through time
193#-------------------------------------------------------------------------------
194
195t0 = time.time()
196
197# Skip over the first 6000 seconds
198for t in domain.evolve(yieldstep=2000,
199                       finaltime=6000):
200    print domain.timestepping_statistics()
201    print domain.boundary_statistics(tags='ocean')
202
203# Start detailed model
204for t in domain.evolve(yieldstep=project.yieldstep,
205                       finaltime=project.finaltime,
206                       skip_initial_step=True):
207    print domain.timestepping_statistics()
208    print domain.boundary_statistics(tags='ocean')
209   
210print 'Simulation took %.2f seconds' %(time.time()-t0)
211     
Note: See TracBrowser for help on using the repository browser.