source: trunk/anuga_core/source/anuga/__init__.py @ 8150

Last change on this file since 8150 was 8133, checked in by steve, 14 years ago

Change import to base_operator

File size: 12.7 KB
Line 
1""" ANUGA models the effect of tsunamis and flooding upon a terrain mesh.
2    In typical usage, a Domain class is created for a particular piece of
3    terrain. Boundary conditions are specified for the domain, such as inflow
4    and outflow, and then the simulation is run.
5
6    This is the public API to ANUGA. It provides a toolkit of often-used
7    modules, which can be used directly by including the following line in
8    the user's code:
9
10    import anuga
11       
12    This usage pattern abstracts away the internal heirarchy of the ANUGA
13    system, allowing the user to concentrate on writing simulations without
14    searching through the ANUGA source tree for the functions that they need.
15   
16    Also, it isolates the user from "under-the-hood" refactorings.
17"""
18
19pass
20
21#Add path of package to PYTHONPATH to allow C-extensions to be loaded
22import sys
23sys.path += __path__
24
25
26#-----------------------------------------------------
27# Make selected classes available directly
28#-----------------------------------------------------
29
30from anuga.shallow_water.shallow_water_domain import Domain
31
32from anuga.abstract_2d_finite_volumes.util import file_function, \
33                                        sww2timeseries, sww2csv_gauges
34
35from anuga.abstract_2d_finite_volumes.mesh_factory import rectangular_cross, \
36                                                    rectangular
37
38from anuga.file.csv_file import load_csv_as_building_polygons,  \
39                                load_csv_as_polygons
40
41from anuga.file.sts import create_sts_boundary
42
43from anuga.file.ungenerate import load_ungenerate
44
45from anuga.geometry.polygon import read_polygon, plot_polygons, polygon_area, \
46                                   inside_polygon, polygon_area
47from anuga.geometry.polygon_function import Polygon_function
48
49from anuga.abstract_2d_finite_volumes.pmesh2domain import \
50                                            pmesh_to_domain_instance
51
52from anuga.utilities.system_tools import file_length
53from anuga.utilities.sww_merge import sww_merge
54from anuga.utilities.file_utils import copy_code_files
55from anuga.utilities.numerical_tools import safe_acos as acos
56
57from anuga.geometry.polygon import read_polygon
58from anuga.caching import cache
59
60#-----------------------------
61# Standard Boundaries
62#-----------------------------
63from anuga.shallow_water.boundaries import File_boundary
64from anuga.shallow_water.boundaries import Reflective_boundary
65from anuga.shallow_water.boundaries import Field_boundary
66from anuga.shallow_water.boundaries import \
67                    Transmissive_stage_zero_momentum_boundary
68from anuga.shallow_water.boundaries import \
69                    Transmissive_momentum_set_stage_boundary
70from anuga.shallow_water.boundaries import \
71                    Transmissive_n_momentum_zero_t_momentum_set_stage_boundary
72
73
74#-----------------------------
75# SWW-specific Boundaries
76#-----------------------------
77from anuga.abstract_2d_finite_volumes.generic_boundary_conditions \
78                            import Dirichlet_boundary
79from anuga.abstract_2d_finite_volumes.generic_boundary_conditions \
80                            import Time_boundary
81from anuga.abstract_2d_finite_volumes.generic_boundary_conditions \
82                            import Time_space_boundary
83from anuga.abstract_2d_finite_volumes.generic_boundary_conditions \
84                            import Transmissive_boundary
85
86
87
88#-----------------------------
89# Shalow Water Tsunamis
90#-----------------------------
91
92from anuga.shallow_water.smf import slide_tsunami, slump_tsunami
93
94
95#-----------------------------
96# Forcing
97#-----------------------------
98from anuga.shallow_water.forcing import Inflow, Rainfall, Wind_stress
99
100#-----------------------------
101# File conversion utilities
102#-----------------------------
103from anuga.file_conversion.file_conversion import sww2obj, \
104                    timefile2netcdf, tsh2sww
105from anuga.file_conversion.urs2nc import urs2nc
106from anuga.file_conversion.urs2sww import urs2sww 
107from anuga.file_conversion.urs2sts import urs2sts
108from anuga.file_conversion.dem2pts import dem2pts                   
109from anuga.file_conversion.esri2sww import esri2sww   
110from anuga.file_conversion.sww2dem import sww2dem, sww2dem_batch
111from anuga.file_conversion.asc2dem import asc2dem     
112from anuga.file_conversion.ferret2sww import ferret2sww     
113from anuga.file_conversion.dem2dem import dem2dem
114
115
116#-----------------------------
117# Mesh API
118#-----------------------------
119from anuga.pmesh.mesh_interface import create_mesh_from_regions
120
121#-----------------------------
122# SWW file access
123#-----------------------------
124from anuga.shallow_water.sww_interrogate import get_flow_through_cross_section
125   
126
127
128#---------------------------
129# Operators
130#---------------------------
131from anuga.operators.base_operator import Operator
132
133#---------------------------
134# Structures
135#---------------------------
136from anuga.structures.structure_operator import Structure_operator
137from anuga.structures.boyd_box_operator import Boyd_box_operator
138from anuga.structures.boyd_pipe_operator import Boyd_pipe_operator
139
140#---------------------------
141# User Access Functions
142#---------------------------
143
144from anuga.utilities.system_tools import get_user_name, get_host_name, get_revision_number
145
146
147
148
149#-----------------------------
150# rectangular domains
151#-----------------------------
152def rectangular_cross_domain(*args, **kwargs):
153    """
154    Create a rectangular domain with triangulation made
155    up of m+1 by n+1 uniform rectangular cells divided
156    into 4 triangles in a cross pattern
157
158    Arguments
159    m:      number of cells in x direction
160    n:      number of cells in y direction
161    len1:   length of domain in x direction (left to right)
162            (default 1.0)
163    len2:   length of domain in y direction (bottom to top)
164            (default 1.0)
165    origin: tuple (x,y) specifying location of lower left corner
166            of domain (default (0,0))
167    """
168    points, vertices, boundary = rectangular_cross(*args, **kwargs)
169    return Domain(points, vertices, boundary)
170
171#----------------------------
172# Create domain from file
173#----------------------------
174def create_domain_from_file(file):
175    """
176    Create a domain from a file
177    """
178    return pmesh_to_domain_instance(file,Domain)
179
180#---------------------------
181# Create domain from regions
182#---------------------------
183
184def create_domain_from_regions(bounding_polygon,
185                               boundary_tags,
186                               maximum_triangle_area=None,
187                               mesh_filename=None,
188                               interior_regions=None,
189                               interior_holes=None,
190                               hole_tags=None,
191                               poly_geo_reference=None,
192                               mesh_geo_reference=None,
193                               minimum_triangle_angle=28.0,
194                               fail_if_polygons_outside=True,
195                               use_cache=False,
196                               verbose=True):
197    """Create domain from bounding polygons and resolutions.
198
199    bounding_polygon is a list of points in Eastings and Northings,
200    relative to the zone stated in poly_geo_reference if specified.
201    Otherwise points are just x, y coordinates with no particular
202    association to any location.
203
204    boundary_tags is a dictionary of symbolic tags. For every tag there
205    is a list of indices referring to segments associated with that tag.
206    If a segment is omitted it will be assigned the default tag ''.
207
208    maximum_triangle_area is the maximal area per triangle
209    for the bounding polygon, excluding the  interior regions.
210
211    Interior_regions is a list of tuples consisting of (polygon,
212    resolution) for each region to be separately refined. Do not have
213    polygon lines cross or be on-top of each other.  Also do not have
214    polygon close to each other.
215   
216    NOTE: If a interior_region is outside the bounding_polygon it should
217    throw an error
218   
219    interior_holes is a list of ploygons for each hole. These polygons do not
220    need to be closed, but their points must be specified in a counter-clockwise
221    order.
222
223    hole_tags  is a list of tag segment dictionaries.
224
225    This function does not allow segments to share points - use underlying
226    pmesh functionality for that
227
228    poly_geo_reference is the geo_reference of the bounding polygon and
229    the interior polygons.
230    If none, assume absolute.  Please pass one though, since absolute
231    references have a zone.
232   
233    mesh_geo_reference is the geo_reference of the mesh to be created.
234    If none is given one will be automatically generated.  It was use
235    the lower left hand corner of  bounding_polygon (absolute)
236    as the x and y values for the geo_ref.
237   
238    Returns the shallow water domain instance
239
240    Note, interior regions should be fully nested, as overlaps may cause
241    unintended resolutions.
242
243    fail_if_polygons_outside: If True (the default) Exception in thrown
244    where interior polygons fall outside bounding polygon. If False, these
245    will be ignored and execution continued.
246       
247   
248    """
249
250
251    # Build arguments and keyword arguments for use with caching or apply.
252    args = (bounding_polygon,
253            boundary_tags)
254   
255    kwargs = {'maximum_triangle_area': maximum_triangle_area,
256              'mesh_filename': mesh_filename,
257              'interior_regions': interior_regions,
258              'interior_holes': interior_holes,
259              'hole_tags': hole_tags,
260              'poly_geo_reference': poly_geo_reference,
261              'mesh_geo_reference': mesh_geo_reference,
262              'minimum_triangle_angle': minimum_triangle_angle,
263              'fail_if_polygons_outside': fail_if_polygons_outside,
264              'verbose': verbose} #FIXME (Ole): See ticket:14
265
266    # Call underlying engine with or without caching
267    if use_cache is True:
268        try:
269            from anuga.caching import cache
270        except:
271            msg = 'Caching was requested, but caching module'+\
272                  'could not be imported'
273            raise (msg)
274
275
276        domain = cache(_create_domain_from_regions,
277                       args, kwargs,
278                       verbose=verbose,
279                       compression=False)
280    else:
281        domain = apply(_create_domain_from_regions,
282                       args, kwargs)
283
284    return domain
285
286       
287def _create_domain_from_regions(bounding_polygon,
288                                boundary_tags,
289                                maximum_triangle_area=None,
290                                mesh_filename=None,                           
291                                interior_regions=None,
292                                interior_holes=None,
293                                hole_tags=None,
294                                poly_geo_reference=None,
295                                mesh_geo_reference=None,
296                                minimum_triangle_angle=28.0,
297                                fail_if_polygons_outside=True,
298                                verbose=True):
299    """_create_domain_from_regions - internal function.
300
301    See create_domain_from_regions for documentation.
302    """
303
304    from anuga.shallow_water.shallow_water_domain import Domain
305    from anuga.pmesh.mesh_interface import create_mesh_from_regions
306   
307    create_mesh_from_regions(bounding_polygon,
308                             boundary_tags,
309                             maximum_triangle_area=maximum_triangle_area,
310                             interior_regions=interior_regions,
311                             filename=mesh_filename,
312                             interior_holes=interior_holes,
313                             hole_tags=hole_tags,
314                             poly_geo_reference=poly_geo_reference,
315                             mesh_geo_reference=mesh_geo_reference,
316                             minimum_triangle_angle=minimum_triangle_angle,
317                             fail_if_polygons_outside=fail_if_polygons_outside,
318                             use_cache=False,
319                             verbose=verbose)
320    domain = Domain(mesh_filename, use_cache=False, verbose=verbose)
321
322
323    return domain
324   
325import logging as log
326
327from anuga.config import use_psyco, g, velocity_protection
328if use_psyco:
329    # try using psyco if available
330    try:
331        import psyco
332    except:
333        import os
334        if os.name == 'posix' and os.uname()[4] in ['x86_64', 'ia64']:
335            pass
336            # Psyco isn't supported on 64 bit systems, but it doesn't matter
337        else:
338            log.critical('WARNING: psyco (speedup) could not be imported, '
339                         'you may want to consider installing it')
340    else:
341        psyco.full() # aggressively compile everything
342        #psyco.background() # attempt to profile code - only compile most used
343       
344
345
346
347
Note: See TracBrowser for help on using the repository browser.