source: anuga_core/documentation/user_manual/anuga_user_manual.tex @ 4874

Last change on this file since 4874 was 4874, checked in by sexton, 16 years ago

typo

  • Property svn:keywords set to LastChangedDate LastChangedRevision LastChangedBy HeadURL Id
File size: 155.7 KB
Line 
1% Complete documentation on the extended LaTeX markup used for Python
2% documentation is available in ``Documenting Python'', which is part
3% of the standard documentation for Python.  It may be found online
4% at:
5%
6%     http://www.python.org/doc/current/doc/doc.html
7
8
9%labels
10%Sections and subsections \label{sec: }
11%Chapters \label{ch: }
12%Equations \label{eq: }
13%Figures \label{fig: }
14
15% Is latex failing with;
16% `modanuga_user_manual.ind' not found?
17% try this command-line
18%   makeindex modanuga_user_manual.idx
19% To produce the modanuga_user_manual.ind file.
20
21
22\documentclass{manual}
23
24\usepackage{graphicx}
25\usepackage{datetime}
26
27\input{definitions}
28
29\title{\anuga User Manual}
30\author{Geoscience Australia and the Australian National University}
31
32% Please at least include a long-lived email address;
33% the rest is at your discretion.
34\authoraddress{Geoscience Australia \\
35  Email: \email{ole.nielsen@ga.gov.au}
36}
37
38%Draft date
39
40% update before release!
41% Use an explicit date so that reformatting
42% doesn't cause a new date to be used.  Setting
43% the date to \today can be used during draft
44% stages to make it easier to handle versions.
45
46
47\longdate       % Make date format long using datetime.sty
48%\settimeformat{xxivtime} % 24 hour Format
49\settimeformat{oclock} % Verbose
50\date{\today, \ \currenttime}
51%\hyphenation{set\_datadir}
52
53\ifhtml
54\date{\today} % latex2html does not know about datetime
55\fi
56
57
58
59
60\input{version} % Get version info - this file may be modified by
61                % update_anuga_user_manual.py - if not a dummy
62                % will be used.
63               
64%\release{1.0}   % release version; this is used to define the
65%                % \version macro
66
67\makeindex          % tell \index to actually write the .idx file
68\makemodindex       % If this contains a lot of module sections.
69
70\setcounter{tocdepth}{3}
71\setcounter{secnumdepth}{3}
72
73
74\begin{document}
75\maketitle
76
77
78% This makes the contents more accessible from the front page of the HTML.
79\ifhtml
80\chapter*{Front Matter\label{front}}
81\fi
82
83%Subversion keywords:
84%
85%$LastChangedDate: 2007-12-03 06:40:23 +0000 (Mon, 03 Dec 2007) $
86%$LastChangedRevision: 4874 $
87%$LastChangedBy: sexton $
88
89\input{copyright}
90
91
92\begin{abstract}
93\label{def:anuga}
94
95\noindent \anuga\index{\anuga} is a hydrodynamic modelling tool that
96allows users to model realistic flow problems in complex geometries.
97Examples include dam breaks or the effects of natural hazards such
98as riverine flooding, storm surges and tsunami.
99
100The user must specify a study area represented by a mesh of triangular
101cells, the topography and bathymetry, frictional resistance, initial
102values for water level (called \emph{stage}\index{stage} within \anuga),
103boundary
104conditions and forces such as windstress or pressure gradients if
105applicable.
106
107\anuga tracks the evolution of water depth and horizontal momentum
108within each cell over time by solving the shallow water wave equation
109governing equation using a finite-volume method.
110
111\anuga also incorporates a mesh generator %, called \code{graphical
112                                %mesh generator},
113that
114allows the user to set up the geometry of the problem interactively as
115well as tools for interpolation and surface fitting, and a number of
116auxiliary tools for visualising and interrogating the model output.
117
118Most \anuga components are written in the object-oriented programming
119language Python and most users will interact with \anuga by writing
120small Python programs based on the \anuga library
121functions. Computationally intensive components are written for
122efficiency in C routines working directly with the Numerical Python
123structures.
124
125
126\end{abstract}
127
128\tableofcontents
129
130
131\chapter{Introduction}
132
133
134\section{Purpose}
135
136The purpose of this user manual is to introduce the new user to the
137inundation software, describe what it can do and give step-by-step
138instructions for setting up and running hydrodynamic simulations.
139
140\section{Scope}
141
142This manual covers only what is needed to operate the software after
143installation and configuration. It does not includes instructions
144for installing the software or detailed API documentation, both of
145which will be covered in separate publications and by documentation
146in the source code.
147
148\section{Audience}
149
150Readers are assumed to be familiar with the operating environment
151and have a general understanding of the subject matter, as well as
152enough programming experience to adapt the code to different
153requirements and to understand the basic terminology of
154object-oriented programming.
155
156\pagebreak
157\chapter{Background}
158
159
160Modelling the effects on the built environment of natural hazards such
161as riverine flooding, storm surges and tsunami is critical for
162understanding their economic and social impact on our urban
163communities.  Geoscience Australia and the Australian National
164University are developing a hydrodynamic inundation modelling tool
165called \anuga to help simulate the impact of these hazards.
166
167The core of \anuga is the fluid dynamics module, called \code{shallow\_water},
168which is based on a finite-volume method for solving the Shallow Water
169Wave Equation.  The study area is represented by a mesh of triangular
170cells.  By solving the governing equation within each cell, water
171depth and horizontal momentum are tracked over time.
172
173A major capability of \anuga is that it can model the process of
174wetting and drying as water enters and leaves an area.  This means
175that it is suitable for simulating water flow onto a beach or dry land
176and around structures such as buildings.  \anuga is also capable
177of modelling hydraulic jumps due to the ability of the finite-volume
178method to accommodate discontinuities in the solution.
179
180To set up a particular scenario the user specifies the geometry
181(bathymetry and topography), the initial water level (stage),
182boundary conditions such as tide, and any forcing terms that may
183drive the system such as wind stress or atmospheric pressure
184gradients. Gravity and frictional resistance from the different
185terrains in the model are represented by predefined forcing terms.
186
187The built-in mesh generator, called \code{graphical\_mesh\_generator},
188allows the user to set up the geometry
189of the problem interactively and to identify boundary segments and
190regions using symbolic tags.  These tags may then be used to set the
191actual boundary conditions and attributes for different regions
192(e.g.\ the Manning friction coefficient) for each simulation.
193
194Most \anuga components are written in the object-oriented programming
195language Python.  Software written in Python can be produced quickly
196and can be readily adapted to changing requirements throughout its
197lifetime.  Computationally intensive components are written for
198efficiency in C routines working directly with the Numerical Python
199structures.  The animation tool developed for \anuga is based on
200OpenSceneGraph, an Open Source Software (OSS) component allowing high
201level interaction with sophisticated graphics primitives.
202See \cite{nielsen2005} for more background on \anuga.
203
204\chapter{Restrictions and limitations on \anuga}
205\label{ch:limitations}
206
207Although a powerful and flexible tool for hydrodynamic modelling, \anuga has a
208number of limitations that any potential user need to be aware of. They are
209
210\begin{itemize}
211  \item The mathematical model is the 2D shallow water wave equation.
212  As such it cannot resolve vertical convection and consequently not breaking
213  waves or 3D turbulence (e.g.\ vorticity).
214  \item The surface is assumed to be open, e.g. \anuga cannot model
215  flow under ceilings or in pipes
216  \item All spatial coordinates are assumed to be UTM (meters). As such,
217  ANUGA is unsuitable for modelling flows in areas larger than one UTM zone
218  (6 degrees wide).
219  \item Fluid is assumed to be inviscid
220  \item The finite volume is a very robust and flexible numerical technique,
221  but it is not the fastest method around. If the geometry is sufficiently
222  simple and if there is no need for wetting or drying, a finite-difference
223  method may be able to solve the problem faster than \anuga.
224  %\item Mesh resolutions near coastlines with steep gradients need to be...
225  \item Frictional resistance is implemented using Manning's formula, but
226  \anuga has not yet been fully validated in regard to bottom roughness
227  \item ANUGA contains no tsunami-genic functionality relating to
228  earthquakes.
229\end{itemize}
230
231
232
233\chapter{Getting Started}
234\label{ch:getstarted}
235
236This section is designed to assist the reader to get started with
237\anuga by working through some examples. Two examples are discussed;
238the first is a simple example to illustrate many of the ideas, and
239the second is a more realistic example.
240
241\section{A Simple Example}
242\label{sec:simpleexample}
243
244\subsection{Overview}
245
246What follows is a discussion of the structure and operation of a
247script called \file{runup.py}.
248
249This example carries out the solution of the shallow-water wave
250equation in the simple case of a configuration comprising a flat
251bed, sloping at a fixed angle in one direction and having a
252constant depth across each line in the perpendicular direction.
253
254The example demonstrates the basic ideas involved in setting up a
255complex scenario. In general the user specifies the geometry
256(bathymetry and topography), the initial water level, boundary
257conditions such as tide, and any forcing terms that may drive the
258system such as wind stress or atmospheric pressure gradients.
259Frictional resistance from the different terrains in the model is
260represented by predefined forcing terms. In this example, the
261boundary is reflective on three sides and a time dependent wave on
262one side.
263
264The present example represents a simple scenario and does not
265include any forcing terms, nor is the data taken from a file as it
266would typically be.
267
268The conserved quantities involved in the
269problem are stage (absolute height of water surface),
270$x$-momentum and $y$-momentum. Other quantities
271involved in the computation are the friction and elevation.
272
273Water depth can be obtained through the equation
274
275\begin{tabular}{rcrcl}
276  \code{depth} &=& \code{stage} &$-$& \code{elevation}
277\end{tabular}
278
279
280\subsection{Outline of the Program}
281
282In outline, \file{runup.py} performs the following steps:
283
284\begin{enumerate}
285
286   \item Sets up a triangular mesh.
287
288   \item Sets certain parameters governing the mode of
289operation of the model-specifying, for instance, where to store the model output.
290
291   \item Inputs various quantities describing physical measurements, such
292as the elevation, to be specified at each mesh point (vertex).
293
294   \item Sets up the boundary conditions.
295
296   \item Carries out the evolution of the model through a series of time
297steps and outputs the results, providing a results file that can
298be visualised.
299
300\end{enumerate}
301
302\subsection{The Code}
303
304%FIXME: we are using the \code function here.
305%This should be used wherever possible
306For reference we include below the complete code listing for
307\file{runup.py}. Subsequent paragraphs provide a
308`commentary' that describes each step of the program and explains it
309significance.
310
311\verbatiminput{demos/runup.py}
312
313\subsection{Establishing the Mesh}\index{mesh, establishing}
314
315The first task is to set up the triangular mesh to be used for the
316scenario. This is carried out through the statement:
317
318{\small \begin{verbatim}
319    points, vertices, boundary = rectangular(10, 10)
320\end{verbatim}}
321
322The function \function{rectangular} is imported from a module
323\module{mesh\_factory} defined elsewhere. (\anuga also contains
324several other schemes that can be used for setting up meshes, but we
325shall not discuss these.) The above assignment sets up a $10 \times
32610$ rectangular mesh, triangulated in a regular way. The assignment
327
328{\small \begin{verbatim}
329    points, vertices, boundary = rectangular(m, n)
330\end{verbatim}}
331
332returns:
333
334\begin{itemize}
335
336   \item a list \code{points} giving the coordinates of each mesh point,
337
338   \item a list \code{vertices} specifying the three vertices of each triangle, and
339
340   \item a dictionary \code{boundary} that stores the edges on
341   the boundary and associates each with one of the symbolic tags \code{`left'}, \code{`right'},
342   \code{`top'} or \code{`bottom'}.
343
344\end{itemize}
345
346(For more details on symbolic tags, see page
347\pageref{ref:tagdescription}.)
348
349An example of a general unstructured mesh and the associated data
350structures \code{points}, \code{vertices} and \code{boundary} is
351given in Section \ref{sec:meshexample}.
352
353
354
355
356\subsection{Initialising the Domain}
357
358These variables are then used to set up a data structure
359\code{domain}, through the assignment:
360
361{\small \begin{verbatim}
362    domain = Domain(points, vertices, boundary)
363\end{verbatim}}
364
365This creates an instance of the \class{Domain} class, which
366represents the domain of the simulation. Specific options are set at
367this point, including the basename for the output file and the
368directory to be used for data:
369
370{\small \begin{verbatim}
371    domain.set_name('runup')
372\end{verbatim}}
373
374{\small \begin{verbatim}
375    domain.set_datadir('.')
376\end{verbatim}}
377
378In addition, the following statement now specifies that the
379quantities \code{stage}, \code{xmomentum} and \code{ymomentum} are
380to be stored:
381
382{\small \begin{verbatim}
383    domain.set_quantities_to_be_stored(['stage', 'xmomentum',
384    'ymomentum'])
385\end{verbatim}}
386
387
388\subsection{Initial Conditions}
389
390The next task is to specify a number of quantities that we wish to
391set for each mesh point. The class \class{Domain} has a method
392\method{set\_quantity}, used to specify these quantities. It is a
393flexible method that allows the user to set quantities in a variety
394of ways---using constants, functions, numeric arrays, expressions
395involving other quantities, or arbitrary data points with associated
396values, all of which can be passed as arguments. All quantities can
397be initialised using \method{set\_quantity}. For a conserved
398quantity (such as \code{stage, xmomentum, ymomentum}) this is called
399an \emph{initial condition}. However, other quantities that aren't
400updated by the equation are also assigned values using the same
401interface. The code in the present example demonstrates a number of
402forms in which we can invoke \method{set\_quantity}.
403
404
405\subsubsection{Elevation}
406
407The elevation, or height of the bed, is set using a function,
408defined through the statements below, which is specific to this
409example and specifies a particularly simple initial configuration
410for demonstration purposes:
411
412{\small \begin{verbatim}
413    def f(x,y):
414        return -x/2
415\end{verbatim}}
416
417This simply associates an elevation with each point \code{(x, y)} of
418the plane.  It specifies that the bed slopes linearly in the
419\code{x} direction, with slope $-\frac{1}{2}$,  and is constant in
420the \code{y} direction.
421
422Once the function \function{f} is specified, the quantity
423\code{elevation} is assigned through the simple statement:
424
425{\small \begin{verbatim}
426    domain.set_quantity('elevation', f)
427\end{verbatim}}
428
429NOTE: If using function to set \code{elevation} it must be vector
430compatible. For example square root will not work.
431
432\subsubsection{Friction}
433
434The assignment of the friction quantity (a forcing term)
435demonstrates another way we can use \method{set\_quantity} to set
436quantities---namely, assign them to a constant numerical value:
437
438{\small \begin{verbatim}
439    domain.set_quantity('friction', 0.1)
440\end{verbatim}}
441
442This specifies that the Manning friction coefficient is set to 0.1
443at every mesh point.
444
445\subsubsection{Stage}
446
447The stage (the height of the water surface) is related to the
448elevation and the depth at any time by the equation
449
450{\small \begin{verbatim}
451    stage = elevation + depth
452\end{verbatim}}
453
454
455For this example, we simply assign a constant value to \code{stage},
456using the statement
457
458{\small \begin{verbatim}
459    domain.set_quantity('stage', -.4)
460\end{verbatim}}
461
462which specifies that the surface level is set to a height of $-0.4$,
463i.e. 0.4 units (m) below the zero level.
464
465Although it is not necessary for this example, it may be useful to
466digress here and mention a variant to this requirement, which allows
467us to illustrate another way to use \method{set\_quantity}---namely,
468incorporating an expression involving other quantities. Suppose,
469instead of setting a constant value for the stage, we wished to
470specify a constant value for the \emph{depth}. For such a case we
471need to specify that \code{stage} is everywhere obtained by adding
472that value to the value already specified for \code{elevation}. We
473would do this by means of the statements:
474
475{\small \begin{verbatim}
476    h = 0.05 # Constant depth
477    domain.set_quantity('stage', expression = 'elevation + %f' %h)
478\end{verbatim}}
479
480That is, the value of \code{stage} is set to $\code{h} = 0.05$ plus
481the value of \code{elevation} already defined.
482
483The reader will probably appreciate that this capability to
484incorporate expressions into statements using \method{set\_quantity}
485greatly expands its power.) See Section \ref{sec:Initial Conditions} for more
486details.
487
488\subsection{Boundary Conditions}\index{boundary conditions}
489
490The boundary conditions are specified as follows:
491
492{\small \begin{verbatim}
493    Br = Reflective_boundary(domain)
494
495    Bt = Transmissive_boundary(domain)
496
497    Bd = Dirichlet_boundary([0.2,0.,0.])
498
499    Bw = Time_boundary(domain=domain,
500                f=lambda t: [(0.1*sin(t*2*pi)-0.3), 0.0, 0.0])
501\end{verbatim}}
502
503The effect of these statements is to set up a selection of different
504alternative boundary conditions and store them in variables that can be
505assigned as needed. Each boundary condition specifies the
506behaviour at a boundary in terms of the behaviour in neighbouring
507elements. The boundary conditions introduced here may be briefly described as
508follows:
509
510\begin{itemize}
511    \item \textbf{Reflective boundary}\label{def:reflective boundary} Returns same \code{stage} as
512      as present in its neighbour volume but momentum vector
513      reversed 180 degrees (reflected).
514      Specific to the shallow water equation as it works with the
515      momentum quantities assumed to be the second and third conserved
516      quantities. A reflective boundary condition models a solid wall.
517    \item \textbf{Transmissive boundary}\label{def:transmissive boundary} Returns same conserved quantities as
518      those present in its neighbour volume. This is one way of modelling
519      outflow from a domain, but it should be used with caution if flow is
520      not steady state as replication of momentum at the boundary
521      may cause occasional spurious effects. If this occurs,
522      consider using e.g. a Dirichlet boundary condition.
523    \item \textbf{Dirichlet boundary}\label{def:dirichlet boundary} Specifies
524      constant values for stage, $x$-momentum and $y$-momentum at the boundary.
525    \item \textbf{Time boundary}\label{def:time boundary} Like a Dirichlet
526      boundary but with behaviour varying with time.
527\end{itemize}
528
529\label{ref:tagdescription}Before describing how these boundary
530conditions are assigned, we recall that a mesh is specified using
531three variables \code{points}, \code{vertices} and \code{boundary}.
532In the code we are discussing, these three variables are returned by
533the function \code{rectangular}; however, the example given in
534Section \ref{sec:realdataexample} illustrates another way of
535assigning the values, by means of the function
536\code{create\_mesh\_from\_regions}.
537
538These variables store the data determining the mesh as follows. (You
539may find that the example given in Section \ref{sec:meshexample}
540helps to clarify the following discussion, even though that example
541is a \emph{non-rectangular} mesh.)
542
543\begin{itemize}
544\item The variable \code{points} stores a list of 2-tuples giving the
545coordinates of the mesh points.
546
547\item The variable \code{vertices} stores a list of 3-tuples of
548numbers, representing vertices of triangles in the mesh. In this
549list, the triangle whose vertices are \code{points[i]},
550\code{points[j]}, \code{points[k]} is represented by the 3-tuple
551\code{(i, j, k)}.
552
553\item The variable \code{boundary} is a Python dictionary that
554not only stores the edges that make up the boundary but also assigns
555symbolic tags to these edges to distinguish different parts of the
556boundary. An edge with endpoints \code{points[i]} and
557\code{points[j]} is represented by the 2-tuple \code{(i, j)}. The
558keys for the dictionary are the 2-tuples \code{(i, j)} corresponding
559to boundary edges in the mesh, and the values are the tags are used
560to label them. In the present example, the value \code{boundary[(i,
561j)]} assigned to \code{(i, j)]} is one of the four tags
562\code{`left'}, \code{`right'}, \code{`top'} or \code{`bottom'},
563depending on whether the boundary edge represented by \code{(i, j)}
564occurs at the left, right, top or bottom of the rectangle bounding
565the mesh. The function \code{rectangular} automatically assigns
566these tags to the boundary edges when it generates the mesh.
567\end{itemize}
568
569The tags provide the means to assign different boundary conditions
570to an edge depending on which part of the boundary it belongs to.
571(In Section \ref{sec:realdataexample} we describe an example that
572uses different boundary tags --- in general, the possible tags are entirely selectable by the user when generating the mesh and not
573limited to `left', `right', `top' and `bottom' as in this example.)
574All segments in bounding polygon must be tagged. If a tag is not supplied, the default tag name 'exterior' will be assigned by ANUGA.
575
576
577Using the boundary objects described above, we assign a boundary
578condition to each part of the boundary by means of a statement like
579
580{\small \begin{verbatim}
581    domain.set_boundary({'left': Br, 'right': Bw, 'top': Br, 'bottom': Br})
582\end{verbatim}}
583
584It is critical that all tags are assoctiated with a boundary conditing in this statement. If not the program will halt with a statement like
585
586\begin{verbatim}
587
588Traceback (most recent call last):
589  File "mesh_test.py", line 114, in ?
590    domain.set_boundary({'west': Bi, 'east': Bo, 'north': Br, 'south': Br})
591  File "X:\inundation\sandpits\onielsen\anuga_core\source\anuga\abstract_2d_finite_volumes\domain.py", line 505, in set_boundary
592    raise msg
593ERROR (domain.py): Tag "exterior" has not been bound to a boundary object.
594All boundary tags defined in domain must appear in the supplied dictionary.
595The tags are: ['ocean', 'east', 'north', 'exterior', 'south']
596\end{verbatim} 
597
598
599The command \code{set\_boundary} stipulates that, in the current example, the right
600boundary varies with time, as defined by the lambda function, while the other
601boundaries are all reflective.
602
603The reader may wish to experiment by varying the choice of boundary
604types for one or more of the boundaries. (In the case of \code{Bd}
605and \code{Bw}, the three arguments in each case represent the
606\code{stage}, $x$-momentum and $y$-momentum, respectively.)
607
608{\small \begin{verbatim}
609    Bw = Time_boundary(domain=domain,
610                       f=lambda t: [(0.1*sin(t*2*pi)-0.3), 0.0, 0.0])
611\end{verbatim}}
612
613
614
615\subsection{Evolution}\index{evolution}
616
617The final statement \nopagebreak[3]
618{\small \begin{verbatim}
619    for t in domain.evolve(yieldstep = 0.1, duration = 4.0):
620        print domain.timestepping_statistics()
621\end{verbatim}}
622
623causes the configuration of the domain to `evolve', over a series of
624steps indicated by the values of \code{yieldstep} and
625\code{duration}, which can be altered as required.  The value of
626\code{yieldstep} controls the time interval between successive model
627outputs.  Behind the scenes more time steps are generally taken.
628
629
630\subsection{Output}
631
632The output is a NetCDF file with the extension \code{.sww}. It
633contains stage and momentum information and can be used with the
634ANUGA viewer \code{animate} (see Section \ref{sec:animate})
635visualisation package
636to generate a visual display. See Section \ref{sec:file formats}
637(page \pageref{sec:file formats}) for more on NetCDF and other file
638formats.
639
640The following is a listing of the screen output seen by the user
641when this example is run:
642
643\verbatiminput{examples/runupoutput.txt}
644
645
646\section{How to Run the Code}
647
648The code can be run in various ways:
649
650\begin{itemize}
651  \item{from a Windows or Unix command line} as in\ \code{python runup.py}
652  \item{within the Python IDLE environment}
653  \item{within emacs}
654  \item{within Windows, by double-clicking the \code{runup.py}
655  file.}
656\end{itemize}
657
658
659\section{Exploring the Model Output}
660
661The following figures are screenshots from the \anuga visualisation
662tool \code{animate}. Figure \ref{fig:runupstart} shows the domain
663with water surface as specified by the initial condition, $t=0$.
664Figure \ref{fig:runup2} shows later snapshots for $t=2.3$ and
665$t=4$ where the system has been evolved and the wave is encroaching
666on the previously dry bed.  All figures are screenshots from an
667interactive animation tool called animate which is part of \anuga and
668distributed as in the package anuga\_viewer.
669Animate is described in more detail is Section \ref{sec:animate}.
670
671\begin{figure}[hbt]
672
673  \centerline{\includegraphics[width=75mm, height=75mm]
674    {graphics/bedslopestart.jpg}}
675
676  \caption{Runup example viewed with the ANUGA viewer}
677  \label{fig:runupstart}
678\end{figure}
679
680
681\begin{figure}[hbt]
682
683  \centerline{
684   \includegraphics[width=75mm, height=75mm]{graphics/bedslopeduring.jpg}
685    \includegraphics[width=75mm, height=75mm]{graphics/bedslopeend.jpg}
686   }
687
688  \caption{Runup example viewed with ANGUA viewer}
689  \label{fig:runup2}
690\end{figure}
691
692
693
694\clearpage
695
696%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
697
698\section{A slightly more complex example}
699\label{sec:channelexample}
700
701\subsection{Overview}
702
703The next example is about waterflow in a channel with varying boundary conditions and
704more complex topograhies. These examples build on the
705concepts introduced through the \file{runup.py} in Section \ref{sec:simpleexample}.
706The example will be built up through three progressively more complex scripts.
707
708\subsection{Overview}
709As in the case of \file{runup.py}, the actions carried
710out by the program can be organised according to this outline:
711
712\begin{enumerate}
713
714   \item Set up a triangular mesh.
715
716   \item Set certain parameters governing the mode of
717operation of the model---specifying, for instance, where to store the
718model output.
719
720   \item Set up initial conditions for various quantities such as the elevation, to be specified at each mesh point (vertex).
721
722   \item Set up the boundary conditions.
723
724   \item Carry out the evolution of the model through a series of time
725steps and output the results, providing a results file that can be
726visualised.
727
728\end{enumerate}
729
730
731\subsection{The Code}
732
733Here is the code for the first version of the channel flow \file{channel1.py}:
734
735\verbatiminput{demos/channel1.py}
736
737In discussing the details of this example, we follow the outline
738given above, discussing each major step of the code in turn.
739
740\subsection{Establishing the Mesh}\index{mesh, establishing}
741
742In this example we use a similar simple structured triangular mesh as in \code{runup.py}
743for simplicity, but this time we will use a symmetric one and also
744change the physical extent of the domain. The assignment
745
746{\small \begin{verbatim}
747    points, vertices, boundary = rectangular_cross(m, n,
748                                                   len1=length, len2=width)
749\end{verbatim}}
750returns a m x n mesh similar to the one used in the previous example, except that now the
751extent in the x and y directions are given by the value of \code{length} and \code{width}
752respectively.
753
754Defining m and n in terms of the extent as in this example provides a convenient way of
755controlling the resolution: By defining dx and dy to be the desired size of each hypothenuse in the mesh we can write the mesh generation as follows:
756
757{\small \begin{verbatim}
758length = 10.
759width = 5.
760dx = dy = 1           # Resolution: Length of subdivisions on both axes
761
762points, vertices, boundary = rectangular_cross(int(length/dx), int(width/dy),
763                                               len1=length, len2=width)
764\end{verbatim}}
765which yields a mesh of length=10m, width=5m with 1m spacings. To increase the resolution, as we will later in this example, one merely decrease the values of dx and dy.
766
767The rest of this script is as in the previous example.
768% except for an application of the 'expression' form of \code{set\_quantity} where we use the value of \code{elevation} to define the (dry) initial condition for \code{stage}:
769%{\small \begin{verbatim}
770%  domain.set_quantity('stage', expression='elevation')
771%\end{verbatim}}
772
773\section{Model Output}
774
775The following figure is a screenshot from the \anuga visualisation
776tool \code{animate} of output from this example.
777\begin{figure}[hbt]
778  \centerline{\includegraphics[height=75mm]
779    {graphics/channel1.png}}%
780
781  \caption{Simple channel example viewed with the ANUGA viewer.}
782  \label{fig:channel1}
783\end{figure}
784
785
786\subsection{Changing boundary conditions on the fly}
787\label{sec:change boundary}
788
789Here is the code for the second version of the channel flow \file{channel2.py}:
790\verbatiminput{demos/channel2.py}
791This example differs from the first version in that a constant outflow boundary condition has
792been defined
793{\small \begin{verbatim}
794    Bo = Dirichlet_boundary([-5, 0, 0]) # Outflow
795\end{verbatim}}
796and that it is applied to the right hand side boundary when the water level there exceeds 0m.
797{\small \begin{verbatim}
798for t in domain.evolve(yieldstep = 0.2, finaltime = 40.0):
799    domain.write_time()
800
801    if domain.get_quantity('stage').get_values(interpolation_points=[[10, 2.5]]) > 0:
802        print 'Stage > 0: Changing to outflow boundary'
803        domain.set_boundary({'right': Bo})
804\end{verbatim}}
805\label{sec:change boundary code}
806
807The if statement in the timestepping loop (evolve) gets the quantity
808\code{stage} and obtain the interpolated value at the point (10m,
8092.5m) which is on the right boundary. If the stage exceeds 0m a
810message is printed and the old boundary condition at tag 'right' is
811replaced by the outflow boundary using the method
812{\small \begin{verbatim}
813    domain.set_boundary({'right': Bo})
814\end{verbatim}}
815This type of dynamically varying boundary could for example be
816used to model the
817breakdown of a sluice door when water exceeds a certain level.
818
819\subsection{Output}
820
821The text output from this example looks like this
822{\small \begin{verbatim}
823...
824Time = 15.4000, delta t in [0.03789902, 0.03789916], steps=6 (6)
825Time = 15.6000, delta t in [0.03789896, 0.03789908], steps=6 (6)
826Time = 15.8000, delta t in [0.03789891, 0.03789903], steps=6 (6)
827Stage > 0: Changing to outflow boundary
828Time = 16.0000, delta t in [0.02709050, 0.03789898], steps=6 (6)
829Time = 16.2000, delta t in [0.03789892, 0.03789904], steps=6 (6)
830...
831\end{verbatim}}
832
833
834\subsection{Flow through more complex topograhies}
835
836Here is the code for the third version of the channel flow \file{channel3.py}:
837\verbatiminput{demos/channel3.py}
838
839This example differs from the first two versions in that the topography
840contains obstacles.
841
842This is accomplished here by defining the function \code{topography} as follows
843{\small \begin{verbatim}
844def topography(x,y):
845    """Complex topography defined by a function of vectors x and y
846    """
847
848    z = -x/10
849
850    N = len(x)
851    for i in range(N):
852
853        # Step
854        if 10 < x[i] < 12:
855            z[i] += 0.4 - 0.05*y[i]
856
857        # Constriction
858        if 27 < x[i] < 29 and y[i] > 3:
859            z[i] += 2
860
861        # Pole
862        if (x[i] - 34)**2 + (y[i] - 2)**2 < 0.4**2:
863            z[i] += 2
864
865    return z
866\end{verbatim}}
867
868In addition, changing the resolution to dx=dy=0.1 creates a finer mesh resolving the new featurse better.
869
870A screenshot of this model at time == 15s is
871\begin{figure}[hbt]
872
873  \centerline{\includegraphics[height=75mm]
874    {graphics/channel3.png}}
875
876  \caption{More complex flow in a channel}
877  \label{fig:channel3}
878\end{figure}
879
880
881
882
883\clearpage
884
885%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
886
887\section{An Example with Real Data}
888\label{sec:realdataexample} The following discussion builds on the
889concepts introduced through the \file{runup.py} example and
890introduces a second example, \file{runcairns.py}.  This refers to
891a real-life scenario, in which the domain of interest surrounds the
892Cairns region. Two scenarios are given; firstly, a
893hypothetical tsunami wave is generated by a submarine mass failure
894situated on the edge of the continental shelf, and secondly, a fixed wave
895of given amplitude and period is introduced through the boundary.
896
897\subsection{Overview}
898As in the case of \file{runup.py}, the actions carried
899out by the program can be organised according to this outline:
900
901\begin{enumerate}
902
903   \item Set up a triangular mesh.
904
905   \item Set certain parameters governing the mode of
906operation of the model---specifying, for instance, where to store the
907model output.
908
909   \item Input various quantities describing physical measurements, such
910as the elevation, to be specified at each mesh point (vertex).
911
912   \item Set up the boundary conditions.
913
914   \item Carry out the evolution of the model through a series of time
915steps and output the results, providing a results file that can be
916visualised.
917
918\end{enumerate}
919
920
921
922\subsection{The Code}
923
924Here is the code for \file{runcairns.py}:
925
926\verbatiminput{demos/cairns/runcairns.py}
927
928In discussing the details of this example, we follow the outline
929given above, discussing each major step of the code in turn.
930
931\subsection{Establishing the Mesh}\index{mesh, establishing}
932
933One obvious way that the present example differs from
934\file{runup.py} is in the use of a more complex method to
935create the mesh. Instead of imposing a mesh structure on a
936rectangular grid, the technique used for this example involves
937building mesh structures inside polygons specified by the user,
938using a mesh-generator.
939
940In its simplest form, the mesh-generator creates the mesh within a single
941polygon whose vertices are at geographical locations specified by
942the user. The user specifies the \emph{resolution}---that is, the
943maximal area of a triangle used for triangulation---and a triangular
944mesh is created inside the polygon using a mesh generation engine.
945On any given platform, the same mesh will be returned.
946%Figure
947%\ref{fig:pentagon} shows a simple example of this, in which the
948%triangulation is carried out within a pentagon.
949
950
951%\begin{figure}[hbt]
952
953%  \caption{Mesh points are created inside the polygon}
954  %\label{fig:pentagon}
955%\end{figure}
956
957Boundary tags are not restricted to \code{`left'}, \code{`bottom'},
958\code{`right'} and \code{`top'}, as in the case of
959\file{runup.py}. Instead the user specifies a list of
960tags appropriate to the configuration being modelled.
961
962In addition, the mesh-generator provides a way to adapt to geographic or
963other features in the landscape, whose presence may require an
964increase in resolution. This is done by allowing the user to specify
965a number of \emph{interior polygons}, each with a specified
966resolution. It is also
967possible to specify one or more `holes'---that is, areas bounded by
968polygons in which no triangulation is required.
969
970%\begin{figure}[hbt]
971%  \caption{Interior meshes with individual resolution}
972%  \label{fig:interior meshes}
973%\end{figure}
974
975In its general form, the mesh-generator takes for its input a bounding
976polygon and (optionally) a list of interior polygons. The user
977specifies resolutions, both for the bounding polygon and for each of
978the interior polygons. Given this data, the mesh-generator first creates a
979triangular mesh with varying resolution.
980
981The function used to implement this process is
982\function{create\_mesh\_from\_regions}. Its arguments include the
983bounding polygon and its resolution, a list of boundary tags, and a
984list of pairs \code{[polygon, resolution]}, specifying the interior
985polygons and their resolutions.
986
987The resulting mesh is output to a \emph{mesh file}\index{mesh
988file}\label{def:mesh file}. This term is used to describe a file of
989a specific format used to store the data specifying a mesh. (There
990are in fact two possible formats for such a file: it can either be a
991binary file, with extension \code{.msh}, or an ASCII file, with
992extension \code{.tsh}. In the present case, the binary file format
993\code{.msh} is used. See Section \ref{sec:file formats} (page
994\pageref{sec:file formats}) for more on file formats.)
995
996In practice, the details of the polygons used are read from a
997separate file \file{project.py}. Here is a complete listing of
998\file{project.py}:
999
1000\verbatiminput{demos/cairns/project.py}
1001
1002Figure \ref{fig:cairns3d} illustrates the landscape of the region
1003for the Cairns example. Understanding the landscape is important in
1004determining the location and resolution of interior polygons. The
1005supporting data is found in the ASCII grid, \code{cairns.asc}, which
1006has been sourced from the publically available Australian Bathymetry
1007and Topography Grid 2005, \cite{grid250}. The required resolution
1008for inundation modelling will depend on the underlying topography and
1009bathymetry; as the terrain becomes more complex, the desired resolution
1010would decrease to the order of tens of metres.
1011
1012\begin{figure}[hbt]
1013\centerline{\includegraphics[scale=0.5]{graphics/cairns3.jpg}}
1014\caption{Landscape of the Cairns scenario.}
1015\label{fig:cairns3d}
1016
1017\end{figure}
1018The following statements are used to read in the specific polygons
1019from \code{project.cairns} and assign a defined resolution to
1020each polygon.
1021
1022{\small \begin{verbatim}
1023    islands_res = 100000
1024    cairns_res = 100000
1025    shallow_res = 500000
1026    interior_regions = [[project.poly_cairns, cairns_res],
1027                        [project.poly_island0, islands_res],
1028                        [project.poly_island1, islands_res],
1029                        [project.poly_island2, islands_res],
1030                        [project.poly_island3, islands_res],
1031                        [project.poly_shallow, shallow_res]]
1032\end{verbatim}}
1033
1034Figure \ref{fig:cairnspolys}
1035illustrates the polygons used for the Cairns scenario.
1036
1037\begin{figure}[hbt]
1038
1039  \centerline{\includegraphics[scale=0.5]
1040      {graphics/cairnsmodel.jpg}}
1041  \caption{Interior and bounding polygons for the Cairns example.}
1042  \label{fig:cairnspolys}
1043\end{figure}
1044
1045The statement
1046
1047
1048{\small \begin{verbatim}
1049remainder_res = 10000000
1050create_mesh_from_regions(project.bounding_polygon,
1051                         boundary_tags={'top': [0],
1052                                        'ocean_east': [1],
1053                                        'bottom': [2],
1054                                        'onshore': [3]},
1055                         maximum_triangle_area=remainder_res,
1056                         filename=meshname,
1057                         interior_regions=interior_regions,
1058                         use_cache=True,
1059                         verbose=True)
1060\end{verbatim}}
1061is then used to create the mesh, taking the bounding polygon to be
1062the polygon \code{bounding\_polygon} specified in \file{project.py}.
1063The argument \code{boundary\_tags} assigns a dictionary, whose keys
1064are the names of the boundary tags used for the bounding
1065polygon---\code{`top'}, \code{`ocean\_east'}, \code{`bottom'}, and
1066\code{`onshore'}--- and whose values identify the indices of the
1067segments associated with each of these tags.
1068The polygon may be arranged either clock-wise or counter clock-wise and the
1069indices refer to edges in the order they appear: Edge 0 connects vertex 0 and vertex 1, edge 1 connects vertex 1 and 2; and so forth.
1070(Here, the values associated with each boundary tag are one-element lists, but they can have as many indices as there are edges)
1071If polygons intersect, or edges coincide the resolution may be undefined in some regions.
1072Use the underlying mesh interface for such cases. See Section
1073\ref{sec:mesh interface}.
1074
1075Note that every point on each polygon defining the mesh will be used as vertices in triangles.
1076Consequently, polygons with points very close together will cause triangles with very small
1077areas to be generated irrespective of the requested resolution.
1078Make sure points on polygons are spaced to be no closer than the smallest resolution requested.
1079
1080
1081\subsection{Initialising the Domain}
1082
1083As with \file{runup.py}, once we have created the mesh, the next
1084step is to create the data structure \code{domain}. We did this for
1085\file{runup.py} by inputting lists of points and triangles and
1086specifying the boundary tags directly. However, in the present case,
1087we use a method that works directly with the mesh file
1088\code{meshname}, as follows:
1089
1090
1091{\small \begin{verbatim}
1092    domain = Domain(meshname, use_cache=True, verbose=True)
1093\end{verbatim}}
1094
1095Providing a filename instead of the lists used in \file{runup.py}
1096above causes \code{Domain} to convert a mesh file \code{meshname}
1097into an instance of \code{Domain}, allowing us to use methods like
1098\method{set\_quantity} to set quantities and to apply other
1099operations.
1100
1101%(In principle, the
1102%second argument of \function{pmesh\_to\_domain\_instance} can be any
1103%subclass of \class{Domain}, but for applications involving the
1104%shallow-water wave equation, the second argument of
1105%\function{pmesh\_to\_domain\_instance} can always be set simply to
1106%\class{Domain}.)
1107
1108The following statements specify a basename and data directory, and
1109identify quantities to be stored. For the first two, values are
1110taken from \file{project.py}.
1111
1112{\small \begin{verbatim}
1113    domain.set_name(project.basename)
1114    domain.set_datadir(project.outputdir)
1115    domain.set_quantities_to_be_stored(['stage', 'xmomentum',
1116        'ymomentum'])
1117\end{verbatim}}
1118
1119
1120\subsection{Initial Conditions}
1121Quantities for \file{runcairns.py} are set
1122using similar methods to those in \file{runup.py}. However,
1123in this case, many of the values are read from the auxiliary file
1124\file{project.py} or, in the case of \code{elevation}, from an
1125ancillary points file.
1126
1127
1128
1129\subsubsection{Stage}
1130
1131For the scenario we are modelling in this case, we use a callable
1132object \code{tsunami\_source}, assigned by means of a function
1133\function{slide\_tsunami}. This is similar to how we set elevation in
1134\file{runup.py} using a function---however, in this case the
1135function is both more complex and more interesting.
1136
1137The function returns the water displacement for all \code{x} and
1138\code{y} in the domain. The water displacement is a double Gaussian
1139function that depends on the characteristics of the slide (length,
1140width, thickness, slope, etc), its location (origin) and the depth at that
1141location. For this example, we choose to apply the slide function
1142at a specified time into the simulation.
1143
1144\subsubsection{Friction}
1145
1146We assign the friction exactly as we did for \file{runup.py}:
1147
1148{\small \begin{verbatim}
1149    domain.set_quantity('friction', 0.0)
1150\end{verbatim}}
1151
1152
1153\subsubsection{Elevation}
1154
1155The elevation is specified by reading data from a file:
1156
1157{\small \begin{verbatim}
1158    domain.set_quantity('elevation',
1159                        filename = project.dem_name + '.pts',
1160                        use_cache = True,
1161                        verbose = True)
1162\end{verbatim}}
1163
1164%However, before this step can be executed, some preliminary steps
1165%are needed to prepare the file from which the data is taken. Two
1166%source files are used for this data---their names are specified in
1167%the file \file{project.py}, in the variables \code{coarsedemname}
1168%and \code{finedemname}. They contain `coarse' and `fine' data,
1169%respectively---that is, data sampled at widely spaced points over a
1170%large region and data sampled at closely spaced points over a
1171%smaller subregion. The data in these files is combined through the
1172%statement
1173
1174%{\small \begin{verbatim}
1175%combine_rectangular_points_files(project.finedemname + '.pts',
1176%                                 project.coarsedemname + '.pts',
1177%                                 project.combineddemname + '.pts')
1178%\end{verbatim}}
1179%The effect of this is simply to combine the datasets by eliminating
1180%any coarse data associated with points inside the smaller region
1181%common to both datasets. The name to be assigned to the resulting
1182%dataset is also derived from the name stored in the variable
1183%\code{combinedname} in the file \file{project.py}.
1184
1185\subsection{Boundary Conditions}\index{boundary conditions}
1186
1187Setting boundaries follows a similar pattern to the one used for
1188\file{runup.py}, except that in this case we need to associate a
1189boundary type with each of the
1190boundary tag names introduced when we established the mesh. In place of the four
1191boundary types introduced for \file{runup.py}, we use the reflective
1192boundary for each of the
1193eight tagged segments defined by \code{create_mesh_from_regions}:
1194
1195{\small \begin{verbatim}
1196Bd = Dirichlet_boundary([0.0,0.0,0.0])
1197domain.set_boundary( {'ocean_east': Bd, 'bottom': Bd, 'onshore': Bd,
1198                          'top': Bd} )
1199\end{verbatim}}
1200
1201\subsection{Evolution}
1202
1203With the basics established, the running of the `evolve' step is
1204very similar to the corresponding step in \file{runup.py}. For the slide
1205scenario,
1206the simulation is run for 5000 seconds with the output stored every ten seconds.
1207For this example, we choose to apply the slide at 60 seconds into the simulation.
1208
1209{\small \begin{verbatim}
1210    import time t0 = time.time()
1211
1212
1213    for t in domain.evolve(yieldstep = 10, finaltime = 60):
1214            domain.write_time()
1215            domain.write_boundary_statistics(tags = 'ocean_east')
1216
1217        # add slide
1218        thisstagestep = domain.get_quantity('stage')
1219        if allclose(t, 60):
1220            slide = Quantity(domain)
1221            slide.set_values(tsunami_source)
1222            domain.set_quantity('stage', slide + thisstagestep)
1223
1224        for t in domain.evolve(yieldstep = 10, finaltime = 5000,
1225                               skip_initial_step = True):
1226            domain.write_time()
1227        domain.write_boundary_statistics(tags = 'ocean_east')
1228\end{verbatim}}
1229
1230For the fixed wave scenario, the simulation is run to 10000 seconds,
1231with the first half of the simulation stored at two minute intervals,
1232and the second half of the simulation stored at ten second intervals.
1233This functionality is especially convenient as it allows the detailed
1234parts of the simulation to be viewed at higher time resolution.
1235
1236
1237{\small \begin{verbatim}
1238
1239# save every two mins leading up to wave approaching land
1240    for t in domain.evolve(yieldstep = 120, finaltime = 5000):
1241        domain.write_time()
1242        domain.write_boundary_statistics(tags = 'ocean_east')
1243
1244    # save every 30 secs as wave starts inundating ashore
1245    for t in domain.evolve(yieldstep = 10, finaltime = 10000,
1246                           skip_initial_step = True):
1247        domain.write_time()
1248        domain.write_boundary_statistics(tags = 'ocean_east')
1249
1250\end{verbatim}}
1251
1252\section{Exploring the Model Output}
1253
1254Now that the scenario has been run, the user can view the output in a number of ways.
1255As described earlier, the user may run animate to view a three-dimensional representation
1256of the simulation.
1257
1258The user may also be interested in a maximum inundation map. This simply shows the
1259maximum water depth over the domain and is achieved with the function sww2dem (described in
1260Section \ref{sec:basicfileconversions}).
1261\file{ExportResults.py} demonstrates how this function can be used:
1262
1263\verbatiminput{demos/cairns/ExportResults.py}
1264
1265The script generates an maximum water depth ASCII grid at a defined
1266resolution (here 100 m$^2$) which can then be viewed in a GIS environment, for
1267example. The parameters used in the function are defined in \file{project.py}.
1268Figures \ref{fig:maxdepthcairnsslide} and \ref{fig:maxdepthcairnsfixedwave} show
1269the maximum water depth within the defined region for the slide and fixed wave scenario
1270respectively.
1271The user could develop a maximum absolute momentum or other expressions which can be
1272derived from the quantities.
1273It must be noted here that depth is more meaningful when the elevation is positive
1274(\code{depth} = \code{stage} $-$ \code{elevation}) as it describes the water height
1275above the available elevation. When the elevation is negative, depth is meauring the
1276water height from the sea floor. With this in mind, maximum inundation maps are
1277typically "clipped" to the coastline. However, the data input here did not contain a
1278coastline.
1279
1280\begin{figure}[hbt]
1281\centerline{\includegraphics[scale=0.5]{graphics/slidedepth.jpg}}
1282\caption{Maximum inundation map for the Cairns slide scenario.}
1283\label{fig:maxdepthcairnsslide}
1284\end{figure}
1285
1286\begin{figure}[hbt]
1287\centerline{\includegraphics[scale=0.5]{graphics/fixedwavedepth.jpg}}
1288\caption{Maximum inundation map for the Cairns fixed wave scenario.}
1289\label{fig:maxdepthcairnsfixedwave}
1290\end{figure}
1291
1292The user may also be interested in interrogating the solution at a particular spatial
1293location to understand the behaviour of the system through time. To do this, the user
1294must first define the locations of interest. A number of locations have been
1295identified for the Cairns scenario, as shown in Figure \ref{fig:cairnsgauges}.
1296
1297\begin{figure}[hbt]
1298\centerline{\includegraphics[scale=0.5]{graphics/cairnsgauges.jpg}}
1299\caption{Point locations to show time series information for the Cairns scenario.}
1300\label{fig:cairnsgauges}
1301\end{figure}
1302
1303These locations
1304must be stored in either a .csv or .txt file. The corresponding .csv file for
1305the gauges shown in Figure \ref{fig:cairnsgauges} is \file{gauges.csv}
1306
1307\verbatiminput{demos/cairns/gauges.csv}
1308
1309Header information has been included to identify the location in terms of eastings and
1310northings, and each gauge is given a name. The elevation column can be zero here.
1311This information is then passed to the function sww2timeseries (shown in
1312\file{GetTimeseries.py} which generates figures for
1313each desired quantity for each point location.
1314
1315\verbatiminput{demos/cairns/GetTimeseries.py}
1316
1317Here, the time series for the quantities stage and speed will be generated for
1318each gauge defined in the gauge file. As described earlie, depth is more meaningful
1319for onshore gauges, and stage is more appropriate for offshore gauges. However, the
1320function used to generate the time series information at each gauge will plot
1321stage or depth depending on the elevation at that gauge location. Note, if this is
1322not required, users may update the relevation section of the function.
1323
1324As an example output,
1325Figure \ref{fig:reef} shows the time series for the quantity stage for the
1326Elford Reef location for each scenario (the elevation at this location is negative,
1327thereby showing stage).
1328
1329\begin{figure}[hbt]
1330\centerline{\includegraphics[scale=0.5]{graphics/gaugeElfordReefboth.png}}
1331\caption{Time series information of the quantity stage for the Elford Reef location for the
1332fixed wave and slide scenario.}
1333\label{fig:reef}
1334\end{figure}
1335
1336By contrast, the time series for depth is shown for the onshore location of the Cairns
1337Airport for each scenario is Figure \ref{fig:airportboth}.
1338
1339\begin{figure}[hbt]
1340\centerline{\includegraphics[scale=0.5]{graphics/gaugeCairnsAirportboth.png}}
1341\caption{Time series information of the quantity depth for the Cairns Airport
1342location for the slide and fixed wave scenario.}
1343\label{fig:airportboth}
1344\end{figure}
1345
1346
1347%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1348%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1349
1350\chapter{\anuga Public Interface}
1351\label{ch:interface}
1352
1353This chapter gives an overview of the features of \anuga available
1354to the user at the public interface. These are grouped under the
1355following headings, which correspond to the outline of the examples
1356described in Chapter \ref{ch:getstarted}:
1357
1358\begin{itemize}
1359    \item Establishing the Mesh
1360    \item Initialising the Domain
1361    \item Specifying the Quantities
1362    \item Initial Conditions
1363    \item Boundary Conditions
1364    \item Forcing Functions
1365    \item Evolution
1366\end{itemize}
1367
1368The listings are intended merely to give the reader an idea of what
1369each feature is, where to find it and how it can be used---they do
1370not give full specifications; for these the reader
1371may consult the code. The code for every function or class contains
1372a documentation string, or `docstring', that specifies the precise
1373syntax for its use. This appears immediately after the line
1374introducing the code, between two sets of triple quotes.
1375
1376Each listing also describes the location of the module in which
1377the code for the feature being described can be found. All modules
1378are in the folder \file{inundation} or one of its subfolders, and the
1379location of each module is described relative to \file{inundation}. Rather
1380than using pathnames, whose syntax depends on the operating system,
1381we use the format adopted for importing the function or class for
1382use in Python code. For example, suppose we wish to specify that the
1383function \function{create\_mesh\_from\_regions} is in a module called
1384\module{mesh\_interface} in a subfolder of \module{inundation} called
1385\code{pmesh}. In Linux or Unix syntax, the pathname of the file
1386containing the function, relative to \file{inundation}, would be
1387
1388\begin{center}
1389%    \code{pmesh/mesh\_interface.py}
1390    \code{pmesh}$\slash$\code{mesh\_interface.py}
1391\end{center}
1392\label{sec:mesh interface}
1393
1394while in Windows syntax it would be
1395
1396\begin{center}
1397    \code{pmesh}$\backslash$\code{mesh\_interface.py}
1398\end{center}
1399
1400Rather than using either of these forms, in this chapter we specify
1401the location simply as \code{pmesh.mesh\_interface}, in keeping with
1402the usage in the Python statement for importing the function,
1403namely:
1404\begin{center}
1405    \code{from pmesh.mesh\_interface import create\_mesh\_from\_regions}
1406\end{center}
1407
1408Each listing details the full set of parameters for the class or
1409function; however, the description is generally limited to the most
1410important parameters and the reader is again referred to the code
1411for more details.
1412
1413The following parameters are common to many functions and classes
1414and are omitted from the descriptions given below:
1415
1416%\begin{center}
1417\begin{tabular}{ll}  %\hline
1418%\textbf{Name } & \textbf{Description}\\
1419%\hline
1420\emph{use\_cache} & Specifies whether caching is to be used for improved performance. See Section \ref{sec:caching} for details on the underlying caching functionality\\
1421\emph{verbose} & If \code{True}, provides detailed terminal output
1422to the user\\  % \hline
1423\end{tabular}
1424%\end{center}
1425
1426\section{Mesh Generation}
1427
1428Before discussing the part of the interface relating to mesh
1429generation, we begin with a description of a simple example of a
1430mesh and use it to describe how mesh data is stored.
1431
1432\label{sec:meshexample} Figure \ref{fig:simplemesh} represents a
1433very simple mesh comprising just 11 points and 10 triangles.
1434
1435
1436\begin{figure}[h]
1437  \begin{center}
1438    \includegraphics[width=90mm, height=90mm]{triangularmesh.jpg}
1439  \end{center}
1440
1441  \caption{A simple mesh}
1442  \label{fig:simplemesh}
1443\end{figure}
1444
1445
1446The variables \code{points}, \code{vertices} and \code{boundary}
1447represent the data displayed in Figure \ref{fig:simplemesh} as
1448follows. The list \code{points} stores the coordinates of the
1449points, and may be displayed schematically as in Table
1450\ref{tab:points}.
1451
1452
1453\begin{table}
1454  \begin{center}
1455    \begin{tabular}[t]{|c|cc|} \hline
1456      index & \code{x} & \code{y}\\  \hline
1457      0 & 1 & 1\\
1458      1 & 4 & 2\\
1459      2 & 8 & 1\\
1460      3 & 1 & 3\\
1461      4 & 5 & 5\\
1462      5 & 8 & 6\\
1463      6 & 11 & 5\\
1464      7 & 3 & 6\\
1465      8 & 1 & 8\\
1466      9 & 4 & 9\\
1467      10 & 10 & 7\\  \hline
1468    \end{tabular}
1469  \end{center}
1470
1471  \caption{Point coordinates for mesh in
1472    Figure \protect \ref{fig:simplemesh}}
1473  \label{tab:points}
1474\end{table}
1475
1476The list \code{vertices} specifies the triangles that make up the
1477mesh. It does this by specifying, for each triangle, the indices
1478(the numbers shown in the first column above) that correspond to the
1479three points at its vertices, taken in an anti-clockwise order
1480around the triangle. Thus, in the example shown in Figure
1481\ref{fig:simplemesh}, the variable \code{vertices} contains the
1482entries shown in Table \ref{tab:vertices}. The starting point is
1483arbitrary so triangle $(0,1,3)$ is considered the same as $(1,3,0)$
1484and $(3,0,1)$.
1485
1486
1487\begin{table}
1488  \begin{center}
1489    \begin{tabular}{|c|ccc|} \hline
1490      index & \multicolumn{3}{c|}{\code{vertices}}\\ \hline
1491      0 & 0 & 1 & 3\\
1492      1 & 1 & 2 & 4\\
1493      2 & 2 & 5 & 4\\
1494      3 & 2 & 6 & 5\\
1495      4 & 4 & 5 & 9\\
1496      5 & 4 & 9 & 7\\
1497      6 & 3 & 4 & 7\\
1498      7 & 7 & 9 & 8\\
1499      8 & 1 & 4 & 3\\
1500      9 & 5 & 10 & 9\\  \hline
1501    \end{tabular}
1502  \end{center}
1503
1504  \caption{Vertices for mesh in Figure \protect \ref{fig:simplemesh}}
1505  \label{tab:vertices}
1506\end{table}
1507
1508Finally, the variable \code{boundary} identifies the boundary
1509triangles and associates a tag with each.
1510
1511\refmodindex[pmesh.meshinterface]{pmesh.mesh\_interface}\label{sec:meshgeneration}
1512
1513\begin{funcdesc}  {create\_mesh\_from\_regions}{bounding_polygon,
1514                             boundary_tags,
1515                             maximum_triangle_area,
1516                             filename=None,
1517                             interior_regions=None,
1518                             poly_geo_reference=None,
1519                             mesh_geo_reference=None,
1520                             minimum_triangle_angle=28.0}
1521Module: \module{pmesh.mesh\_interface}
1522
1523This function allows a user to initiate the automatic creation of a
1524mesh inside a specified polygon (input \code{bounding_polygon}).
1525Among the parameters that can be set are the \emph{resolution}
1526(maximal area for any triangle in the mesh) and the minimal angle
1527allowable in any triangle. The user can specify a number of internal
1528polygons within each of which the resolution of the mesh can be
1529specified. \code{interior_regions} is a paired list containing the
1530interior polygon and its resolution.  Additionally, the user specifies
1531a list of boundary tags, one for each edge of the bounding polygon.
1532
1533\textbf{WARNING}. Note that the dictionary structure used for the
1534parameter \code{boundary\_tags} is different from that used for the
1535variable \code{boundary} that occurs in the specification of a mesh.
1536In the case of \code{boundary}, the tags are the \emph{values} of
1537the dictionary, whereas in the case of \code{boundary_tags}, the
1538tags are the \emph{keys} and the \emph{value} corresponding to a
1539particular tag is a list of numbers identifying boundary edges
1540labelled with that tag. Because of this, it is theoretically
1541possible to assign the same edge to more than one tag. However, an
1542attempt to do this will cause an error.
1543
1544\textbf{WARNING}. Do not have polygon lines cross or be on-top of each
1545    other. This can result in regions of unspecified resolutions. Do
1546    not have polygon close to each other. This can result in the area
1547    between the polygons having small triangles.  For more control
1548    over the mesh outline use the methods described below.
1549   
1550\end{funcdesc}
1551
1552
1553
1554\subsection{Advanced mesh generation}
1555
1556For more control over the creation of the mesh outline, use the
1557methods of the class \class{Mesh}.
1558
1559
1560\begin{classdesc}  {Mesh}{userSegments=None,
1561                 userVertices=None,
1562                 holes=None,
1563                 regions=None}
1564Module: \module{pmesh.mesh}
1565
1566A class used to build a mesh outline and generate a two-dimensional
1567triangular mesh. The mesh outline is used to describe features on the
1568mesh, such as the mesh boundary. Many of this classes methods are used
1569to build a mesh outline, such as \code{add\_vertices} and
1570\code{add\_region\_from\_polygon}.
1571
1572\end{classdesc}
1573
1574
1575\subsubsection{Key Methods of Class Mesh}
1576
1577
1578\begin{methoddesc} {add\_hole}{x,y}
1579Module: \module{pmesh.mesh},  Class: \class{Mesh}
1580
1581This method is used to build the mesh outline.  It defines a hole,
1582when the boundary of the hole has already been defined, by selecting a
1583point within the boundary.
1584
1585\end{methoddesc}
1586
1587
1588\begin{methoddesc}  {add\_hole\_from\_polygon}{self, polygon, tags=None}
1589Module: \module{pmesh.mesh},  Class: \class{Mesh}
1590
1591This method is used to add a `hole' within a region ---that is, to
1592define a interior region where the triangular mesh will not be
1593generated---to a \class{Mesh} instance. The region boundary is described by
1594the polygon passed in.  Additionally, the user specifies a list of
1595boundary tags, one for each edge of the bounding polygon.
1596\end{methoddesc}
1597
1598
1599\begin{methoddesc}  {add\_points_and_segments}{self, points, segments,
1600    segment\_tags=None}
1601Module: \module{pmesh.mesh},  Class: \class{Mesh}
1602
1603This method is used to build the mesh outline. It adds points and
1604segments connecting the points.  A tag for each segment can optionally
1605be added.
1606
1607\end{methoddesc}
1608
1609\begin{methoddesc} {add\_region}{x,y}
1610Module: \module{pmesh.mesh},  Class: \class{Mesh}
1611
1612This method is used to build the mesh outline.  It defines a region,
1613when the boundary of the region has already been defined, by selecting
1614a point within the boundary.  A region instance is returned.  This can
1615be used to set the resolution.
1616
1617\end{methoddesc}
1618
1619\begin{methoddesc}  {add\_region\_from\_polygon}{self, polygon, tags=None,
1620                                max_triangle_area=None}
1621Module: \module{pmesh.mesh},  Class: \class{Mesh}
1622
1623This method is used to build the mesh outline.  It adds a region to a
1624\class{Mesh} instance.  Regions are commonly used to describe an area
1625with an increased density of triangles, by setting
1626\code{max_triangle_area}.  The
1627region boundary is described by the input \code{polygon}.  Additionally, the
1628user specifies a list of segment tags, one for each edge of the
1629bounding polygon.
1630
1631\end{methoddesc}
1632
1633
1634
1635
1636
1637\begin{methoddesc} {add\_vertices}{point_data}
1638Module: \module{pmesh.mesh},  Class: \class{Mesh}
1639
1640Add user vertices. The point_data can be a list of (x,y) values, a numeric
1641array or a geospatial_data instance.
1642\end{methoddesc}
1643
1644\begin{methoddesc} {auto\_segment}{raw_boundary=raw_boundary,
1645                    remove_holes=remove_holes,
1646                    smooth_indents=smooth_indents,
1647                    expand_pinch=expand_pinch}
1648Module: \module{pmesh.mesh},  Class: \class{Mesh}
1649
1650Add segments between some of the user vertices to give the vertices an
1651outline.  The outline is an alpha shape. This method is
1652useful since a set of user vertices need to be outlined by segments
1653before generate_mesh is called.
1654
1655\end{methoddesc}
1656
1657\begin{methoddesc}  {export\_mesh_file}{self,ofile}
1658Module: \module{pmesh.mesh},  Class: \class{Mesh}
1659
1660This method is used to save the mesh to a file. \code{ofile} is the
1661name of the mesh file to be written, including the extension.  Use
1662the extension \code{.msh} for the file to be in NetCDF format and
1663\code{.tsh} for the file to be ASCII format.
1664\end{methoddesc}
1665
1666\begin{methoddesc}  {generate\_mesh}{self,
1667                      maximum_triangle_area=None,
1668                      minimum_triangle_angle=28.0,
1669                      verbose=False}
1670Module: \module{pmesh.mesh},  Class: \class{Mesh}
1671
1672This method is used to generate the triangular mesh.  The  maximal
1673area of any triangle in the mesh can be specified, which is used to
1674control the triangle density, along with the
1675minimum angle in any triangle.
1676\end{methoddesc}
1677
1678
1679
1680\begin{methoddesc}  {import_ungenerate_file}{self,ofile, tag=None}
1681Module: \module{pmesh.mesh},  Class: \class{Mesh}
1682
1683This method is used to import a polygon file in the ungenerate
1684format, which is used by arcGIS. The polygons from the file are converted to
1685vertices and segments. \code{ofile} is the name of the polygon file.
1686\code{tag} is the tag given to all the polygon's segments.
1687
1688This function can be used to import building footprints.
1689\end{methoddesc}
1690
1691%%%%%%
1692\section{Initialising the Domain}
1693
1694%Include description of the class Domain and the module domain.
1695
1696%FIXME (Ole): This is also defined in a later chapter
1697%\declaremodule{standard}{...domain}
1698
1699\begin{classdesc} {Domain} {source=None,
1700                 triangles=None,
1701                 boundary=None,
1702                 conserved_quantities=None,
1703                 other_quantities=None,
1704                 tagged_elements=None,
1705                 use_inscribed_circle=False,
1706                 mesh_filename=None,
1707                 use_cache=False,
1708                 verbose=False,
1709                 full_send_dict=None,
1710                 ghost_recv_dict=None,
1711                 processor=0,
1712                 numproc=1}
1713Module: \refmodule{abstract_2d_finite_volumes.domain}
1714
1715This class is used to create an instance of a data structure used to
1716store and manipulate data associated with a mesh. The mesh is
1717specified either by assigning the name of a mesh file to
1718\code{source} or by specifying the points, triangle and boundary of the
1719mesh.
1720\end{classdesc}
1721
1722\subsection{Key Methods of Domain}
1723
1724\begin{methoddesc} {set\_name}{name}
1725    Module: \refmodule{abstract\_2d\_finite\_volumes.domain},
1726    page \pageref{mod:domain}
1727
1728    Assigns the name \code{name} to the domain.
1729\end{methoddesc}
1730
1731\begin{methoddesc} {get\_name}{}
1732    Module: \module{abstract\_2d\_finite\_volumes.domain}
1733
1734    Returns the name assigned to the domain by \code{set\_name}. If no name has been
1735    assigned, returns \code{`domain'}.
1736\end{methoddesc}
1737
1738\begin{methoddesc} {set\_datadir}{name}
1739    Module: \module{abstract\_2d\_finite\_volumes.domain}
1740
1741    Specifies the directory used for SWW files, assigning it to the
1742    pathname \code{name}. The default value, before
1743    \code{set\_datadir} has been run, is the value \code{default\_datadir}
1744    specified in \code{config.py}.
1745
1746    Since different operating systems use different formats for specifying pathnames,
1747    it is necessary to specify path separators using the Python code \code{os.sep}, rather than
1748    the operating-specific ones such as `$\slash$' or `$\backslash$'.
1749    For this to work you will need to include the statement \code{import os}
1750    in your code, before the first appearance of \code{set\_datadir}.
1751
1752    For example, to set the data directory to a subdirectory
1753    \code{data} of the directory \code{project}, you could use
1754    the statements:
1755
1756    {\small \begin{verbatim}
1757        import os
1758        domain.set_datadir{'project' + os.sep + 'data'}
1759    \end{verbatim}}
1760\end{methoddesc}
1761
1762\begin{methoddesc} {get\_datadir}{}
1763    Module: \module{abstract\_2d\_finite\_volumes.domain}
1764
1765    Returns the data directory set by \code{set\_datadir} or,
1766    if \code{set\_datadir} has not
1767    been run, returns the value \code{default\_datadir} specified in
1768    \code{config.py}.
1769\end{methoddesc}
1770
1771
1772\begin{methoddesc} {set\_minimum_allowed_height}{}
1773    Module: \module{shallow\_water.shallow\_water\_domain}
1774
1775    Set the minimum depth (in meters) that will be recognised in
1776    the numerical scheme (including limiters and flux computations)
1777
1778    Default value is $10^{-3}$ m, but by setting this to a greater value,
1779    e.g.\ for large scale simulations, the computation time can be
1780    significantly reduced.
1781\end{methoddesc}
1782
1783
1784\begin{methoddesc} {set\_minimum_storable_height}{}
1785    Module: \module{shallow\_water.shallow\_water\_domain}
1786
1787    Sets the minimum depth that will be recognised when writing
1788    to an sww file. This is useful for removing thin water layers
1789    that seems to be caused by friction creep.
1790\end{methoddesc}
1791
1792
1793\begin{methoddesc} {set\_maximum_allowed_speed}{}
1794    Module: \module{shallow\_water.shallow\_water\_domain}
1795
1796    Set the maximum particle speed that is allowed in water
1797    shallower than minimum_allowed_height. This is useful for
1798    controlling speeds in very thin layers of water and at the same time
1799    allow some movement avoiding pooling of water.
1800\end{methoddesc}
1801
1802
1803\begin{methoddesc} {set\_time}{time=0.0}
1804    Module: \module{abstract\_2d\_finite\_volumes.domain}
1805
1806    Sets the initial time, in seconds, for the simulation. The
1807    default is 0.0.
1808\end{methoddesc}
1809
1810\begin{methoddesc} {set\_default\_order}{n}
1811    Sets the default (spatial) order to the value specified by
1812    \code{n}, which must be either 1 or 2. (Assigning any other value
1813    to \code{n} will cause an error.)
1814\end{methoddesc}
1815
1816
1817\begin{methoddesc} {set\_store\_vertices\_uniquely}{flag}
1818Decide whether vertex values should be stored uniquely as
1819computed in the model or whether they should be reduced to one
1820value per vertex using averaging.
1821
1822Triangles stored in the sww file can be discontinuous reflecting
1823the internal representation of the finite-volume scheme
1824(this is a feature allowing for arbitrary steepness).
1825However, for visual purposes and also for use with \code{Field\_boundary} 
1826(and \code{File\_boundary}) it is often desirable to store triangles
1827with values at each vertex point as the average of the potentially
1828discontinuous numbers found at vertices of different triangles sharing the
1829same vertex location. 
1830 
1831Storing one way or the other is controlled in ANUGA through the method
1832\code{domain.store\_vertices\_uniquely}. Options are
1833\begin{itemize} 
1834  \item \code{domain.store\_vertices\_uniquely(True)}: Allow discontinuities in the sww file
1835  \item \code{domain.store\_vertices\_uniquely(False)}: (Default).
1836  Average values
1837  to ensure continuity in sww file. The latter also makes for smaller
1838  sww files.
1839\end{itemize}   
1840
1841\end{methoddesc}
1842
1843
1844% Structural methods
1845\begin{methoddesc}{get\_nodes}{absolute=False}
1846    Return x,y coordinates of all nodes in mesh.
1847
1848    The nodes are ordered in an Nx2 array where N is the number of nodes.
1849    This is the same format they were provided in the constructor
1850    i.e. without any duplication.
1851
1852    Boolean keyword argument absolute determines whether coordinates
1853    are to be made absolute by taking georeference into account
1854    Default is False as many parts of ANUGA expects relative coordinates.
1855\end{methoddesc}
1856
1857
1858\begin{methoddesc}{get\_vertex_coordinates}{absolute=False}
1859
1860    Return vertex coordinates for all triangles.
1861
1862    Return all vertex coordinates for all triangles as a 3*M x 2 array
1863    where the jth vertex of the ith triangle is located in row 3*i+j and
1864    M the number of triangles in the mesh.
1865
1866    Boolean keyword argument absolute determines whether coordinates
1867    are to be made absolute by taking georeference into account
1868    Default is False as many parts of ANUGA expects relative coordinates.
1869\end{methoddesc}
1870
1871
1872\begin{methoddesc}{get\_triangles}{indices=None}
1873
1874        Return Mx3 integer array where M is the number of triangles.
1875        Each row corresponds to one triangle and the three entries are
1876        indices into the mesh nodes which can be obtained using the method
1877        get\_nodes()
1878
1879        Optional argument, indices is the set of triangle ids of interest.
1880\end{methoddesc}
1881
1882\begin{methoddesc}{get\_disconnected\_triangles}{}
1883
1884Get mesh based on nodes obtained from get_vertex_coordinates.
1885
1886        Return array Mx3 array of integers where each row corresponds to
1887        a triangle. A triangle is a triplet of indices into
1888        point coordinates obtained from get_vertex_coordinates and each
1889        index appears only once.\\
1890
1891        This provides a mesh where no triangles share nodes
1892        (hence the name disconnected triangles) and different
1893        nodes may have the same coordinates.\\
1894
1895        This version of the mesh is useful for storing meshes with
1896        discontinuities at each node and is e.g. used for storing
1897        data in sww files.\\
1898
1899        The triangles created will have the format
1900
1901    {\small \begin{verbatim}
1902        [[0,1,2],
1903         [3,4,5],
1904         [6,7,8],
1905         ...
1906         [3*M-3 3*M-2 3*M-1]]
1907     \end{verbatim}}
1908\end{methoddesc}
1909
1910
1911
1912%%%%%%
1913\section{Initial Conditions}
1914\label{sec:Initial Conditions}
1915In standard usage of partial differential equations, initial conditions
1916refers to the values associated to the system variables (the conserved
1917quantities here) for \code{time = 0}. In setting up a scenario script
1918as described in Sections \ref{sec:simpleexample} and \ref{sec:realdataexample},
1919\code{set_quantity} is used to define the initial conditions of variables
1920other than the conserved quantities, such as friction. Here, we use the terminology
1921of initial conditions to refer to initial values for variables which need
1922prescription to solve the shallow water wave equation. Further, it must be noted
1923that \code{set_quantity} does not necessarily have to be used in the initial
1924condition setting; it can be used at any time throughout the simulation.
1925
1926\begin{methoddesc}{set\_quantity}{name,
1927    numeric = None,
1928    quantity = None,
1929    function = None,
1930    geospatial_data = None,
1931    filename = None,
1932    attribute_name = None,
1933    alpha = None,
1934    location = 'vertices',
1935    indices = None,
1936    verbose = False,
1937    use_cache = False}
1938  Module: \module{abstract\_2d\_finite\_volumes.domain}
1939  (see also \module{abstract\_2d\_finite\_volumes.quantity.set\_values})
1940
1941This function is used to assign values to individual quantities for a
1942domain. It is very flexible and can be used with many data types: a
1943statement of the form \code{domain.set\_quantity(name, x)} can be used
1944to define a quantity having the name \code{name}, where the other
1945argument \code{x} can be any of the following:
1946
1947\begin{itemize}
1948\item a number, in which case all vertices in the mesh gets that for
1949the quantity in question.
1950\item a list of numbers or a Numeric array ordered the same way as the mesh vertices.
1951\item a function (e.g.\ see the samples introduced in Chapter 2)
1952\item an expression composed of other quantities and numbers, arrays, lists (for
1953example, a linear combination of quantities, such as
1954\code{domain.set\_quantity('stage','elevation'+x))}
1955\item the name of a file from which the data can be read. In this case, the optional argument attribute\_name will select which attribute to use from the file. If left out, set\_quantity will pick one. This is useful in cases where there is only one attribute.
1956\item a geospatial dataset (See Section \ref{sec:geospatial}).
1957Optional argument attribute\_name applies here as with files.
1958\end{itemize}
1959
1960
1961Exactly one of the arguments
1962  numeric, quantity, function, points, filename
1963must be present.
1964
1965
1966Set quantity will look at the type of the second argument (\code{numeric}) and
1967determine what action to take.
1968
1969Values can also be set using the appropriate keyword arguments.
1970If x is a function, for example, \code{domain.set\_quantity(name, x)}, \code{domain.set\_quantity(name, numeric=x)}, and \code{domain.set\_quantity(name, function=x)}
1971are all equivalent.
1972
1973
1974Other optional arguments are
1975\begin{itemize}
1976\item \code{indices} which is a list of ids of triangles to which set\_quantity should apply its assignment of values.
1977\item \code{location} determines which part of the triangles to assign
1978  to. Options are 'vertices' (default), 'edges', 'unique vertices', and 'centroids'.
1979\end{itemize}
1980
1981%%%
1982\anuga provides a number of predefined initial conditions to be used
1983with \code{set\_quantity}. See for example callable object
1984\code{slump\_tsunami} below.
1985
1986\end{methoddesc}
1987
1988
1989
1990
1991\begin{funcdesc}{set_region}{tag, quantity, X, location='vertices'}
1992  Module: \module{abstract\_2d\_finite\_volumes.domain}
1993
1994  (see also \module{abstract\_2d\_finite\_volumes.quantity.set\_values})
1995
1996This function is used to assign values to individual quantities given
1997a regional tag.   It is similar to \code{set\_quantity}.
1998For example, if in the mesh-generator a regional tag of 'ditch' was
1999used, set\_region can be used to set elevation of this region to
2000-10m. X is the constant or function to be applied to the quantity,
2001over the tagged region.  Location describes how the values will be
2002applied.  Options are 'vertices' (default), 'edges', 'unique
2003vertices', and 'centroids'.
2004
2005This method can also be called with a list of region objects.  This is
2006useful for adding quantities in regions, and having one quantity
2007value based on another quantity. See  \module{abstract\_2d\_finite\_volumes.region} for
2008more details.
2009\end{funcdesc}
2010
2011
2012
2013
2014\begin{funcdesc}{slump_tsunami}{length, depth, slope, width=None, thickness=None,
2015                x0=0.0, y0=0.0, alpha=0.0,
2016                gravity=9.8, gamma=1.85,
2017                massco=1, dragco=1, frictionco=0, psi=0,
2018                dx=None, kappa=3.0, kappad=0.8, zsmall=0.01,
2019                domain=None,
2020                verbose=False}
2021Module: \module{shallow\_water.smf}
2022
2023This function returns a callable object representing an initial water
2024displacement generated by a submarine sediment failure. These failures can take the form of
2025a submarine slump or slide. In the case of a slide, use \code{slide_tsunami} instead.
2026
2027The arguments include as a minimum, the slump or slide length, the water depth to the centre of sediment
2028mass, and the bathymetric slope. Other slump or slide parameters can be included if they are known.
2029\end{funcdesc}
2030
2031
2032%%%
2033\begin{funcdesc}{file\_function}{filename,
2034    domain = None,
2035    quantities = None,
2036    interpolation_points = None,
2037    verbose = False,
2038    use_cache = False}
2039Module: \module{abstract\_2d\_finite\_volumes.util}
2040
2041Reads the time history of spatial data for
2042specified interpolation points from a NetCDF file (\code{filename})
2043and returns
2044a callable object. \code{filename} could be a \code{sww} file.
2045Returns interpolated values based on the input
2046file using the underlying \code{interpolation\_function}.
2047
2048\code{quantities} is either the name of a single quantity to be
2049interpolated or a list of such quantity names. In the second case, the resulting
2050function will return a tuple of values---one for each quantity.
2051
2052\code{interpolation\_points} is a list of absolute coordinates or a
2053geospatial object
2054for points at which values are sought.
2055
2056The model time stored within the file function can be accessed using
2057the method \code{f.get\_time()}
2058
2059
2060The underlying algorithm used is as follows:\\
2061Given a time series (i.e.\ a series of values associated with
2062different times), whose values are either just numbers or a set of
2063 numbers defined at the vertices of a triangular mesh (such as those
2064 stored in SWW files), \code{Interpolation\_function} is used to
2065 create a callable object that interpolates a value for an arbitrary
2066 time \code{t} within the model limits and possibly a point \code{(x,
2067 y)} within a mesh region.
2068
2069 The actual time series at which data is available is specified by
2070 means of an array \code{time} of monotonically increasing times. The
2071 quantities containing the values to be interpolated are specified in
2072 an array---or dictionary of arrays (used in conjunction with the
2073 optional argument \code{quantity\_names}) --- called
2074 \code{quantities}. The optional arguments \code{vertex\_coordinates}
2075 and \code{triangles} represent the spatial mesh associated with the
2076 quantity arrays. If omitted the function created by
2077 \code{Interpolation\_function} will be a function of \code{t} only.
2078
2079 Since, in practice, values need to be computed at specified points,
2080 the syntax allows the user to specify, once and for all, a list
2081 \code{interpolation\_points} of points at which values are required.
2082 In this case, the function may be called using the form \code{f(t,
2083 id)}, where \code{id} is an index for the list
2084 \code{interpolation\_points}.
2085
2086
2087\end{funcdesc}
2088
2089%%%
2090%% \begin{classdesc}{Interpolation\_function}{self,
2091%%     time,
2092%%     quantities,
2093%%     quantity_names = None,
2094%%     vertex_coordinates = None,
2095%%     triangles = None,
2096%%     interpolation_points = None,
2097%%     verbose = False}
2098%% Module: \module{abstract\_2d\_finite\_volumes.least\_squares}
2099
2100%% Given a time series (i.e.\ a series of values associated with
2101%% different times), whose values are either just numbers or a set of
2102%% numbers defined at the vertices of a triangular mesh (such as those
2103%% stored in SWW files), \code{Interpolation\_function} is used to
2104%% create a callable object that interpolates a value for an arbitrary
2105%% time \code{t} within the model limits and possibly a point \code{(x,
2106%% y)} within a mesh region.
2107
2108%% The actual time series at which data is available is specified by
2109%% means of an array \code{time} of monotonically increasing times. The
2110%% quantities containing the values to be interpolated are specified in
2111%% an array---or dictionary of arrays (used in conjunction with the
2112%% optional argument \code{quantity\_names}) --- called
2113%% \code{quantities}. The optional arguments \code{vertex\_coordinates}
2114%% and \code{triangles} represent the spatial mesh associated with the
2115%% quantity arrays. If omitted the function created by
2116%% \code{Interpolation\_function} will be a function of \code{t} only.
2117
2118%% Since, in practice, values need to be computed at specified points,
2119%% the syntax allows the user to specify, once and for all, a list
2120%% \code{interpolation\_points} of points at which values are required.
2121%% In this case, the function may be called using the form \code{f(t,
2122%% id)}, where \code{id} is an index for the list
2123%% \code{interpolation\_points}.
2124
2125%% \end{classdesc}
2126
2127%%%
2128%\begin{funcdesc}{set\_region}{functions}
2129%[Low priority. Will be merged into set\_quantity]
2130
2131%Module:\module{abstract\_2d\_finite\_volumes.domain}
2132%\end{funcdesc}
2133
2134
2135
2136%%%%%%
2137\section{Boundary Conditions}\index{boundary conditions}
2138
2139\anuga provides a large number of predefined boundary conditions,
2140represented by objects such as \code{Reflective\_boundary(domain)} and
2141\code{Dirichlet\_boundary([0.2, 0.0, 0.0])}, described in the examples
2142in Chapter 2. Alternatively, you may prefer to ``roll your own'',
2143following the method explained in Section \ref{sec:roll your own}.
2144
2145These boundary objects may be used with the function \code{set\_boundary} described below
2146to assign boundary conditions according to the tags used to label boundary segments.
2147
2148\begin{methoddesc}{set\_boundary}{boundary_map}
2149Module: \module{abstract\_2d\_finite\_volumes.domain}
2150
2151This function allows you to assign a boundary object (corresponding to a
2152pre-defined or user-specified boundary condition) to every boundary segment that
2153has been assigned a particular tag.
2154
2155This is done by specifying a dictionary \code{boundary\_map}, whose values are the boundary objects
2156and whose keys are the symbolic tags.
2157
2158\end{methoddesc}
2159
2160\begin{methoddesc} {get\_boundary\_tags}{}
2161Module: \module{abstract\_2d\_finite\_volumes.domain}
2162
2163Returns a list of the available boundary tags.
2164\end{methoddesc}
2165
2166%%%
2167\subsection{Predefined boundary conditions}
2168
2169\begin{classdesc}{Reflective\_boundary}{Boundary}
2170Module: \module{shallow\_water}
2171
2172Reflective boundary returns same conserved quantities as those present in
2173the neighbouring volume but reflected.
2174
2175This class is specific to the shallow water equation as it works with the
2176momentum quantities assumed to be the second and third conserved quantities.
2177\end{classdesc}
2178
2179%%%
2180\begin{classdesc}{Transmissive\_boundary}{domain = None}
2181Module: \module{abstract\_2d\_finite\_volumes.generic\_boundary\_conditions}
2182
2183A transmissive boundary returns the same conserved quantities as
2184those present in the neighbouring volume.
2185
2186The underlying domain must be specified when the boundary is instantiated.
2187\end{classdesc}
2188
2189%%%
2190\begin{classdesc}{Dirichlet\_boundary}{conserved_quantities=None}
2191Module: \module{abstract\_2d\_finite\_volumes.generic\_boundary\_conditions}
2192
2193A Dirichlet boundary returns constant values for each of conserved
2194quantities. In the example of \code{Dirichlet\_boundary([0.2, 0.0, 0.0])},
2195the \code{stage} value at the boundary is 0.2 and the \code{xmomentum} and
2196\code{ymomentum} at the boundary are set to 0.0. The list must contain
2197a value for each conserved quantity.
2198\end{classdesc}
2199
2200%%%
2201\begin{classdesc}{Time\_boundary}{domain = None, f = None}
2202Module: \module{abstract\_2d\_finite\_volumes.generic\_boundary\_conditions}
2203
2204A time-dependent boundary returns values for the conserved
2205quantities as a function \code{f(t)} of time. The user must specify
2206the domain to get access to the model time.
2207\end{classdesc}
2208
2209%%%
2210\begin{classdesc}{File\_boundary}{Boundary}
2211Module: \module{abstract\_2d\_finite\_volumes.generic\_boundary\_conditions}
2212
2213This method may be used if the user wishes to apply a SWW file or
2214a time series file to a boundary segment or segments.
2215The boundary values are obtained from a file and interpolated to the
2216appropriate segments for each conserved quantity.
2217\end{classdesc}
2218
2219
2220
2221%%%
2222\begin{classdesc}{Transmissive\_Momentum\_Set\_Stage\_boundary}{Boundary}
2223Module: \module{shallow\_water}
2224
2225This boundary returns same momentum conserved quantities as
2226those present in its neighbour volume but sets stage as in a Time\_boundary.
2227The underlying domain must be specified when boundary is instantiated
2228
2229This type of boundary is useful when stage is known at the boundary as a
2230function of time, but momenta (or speeds) aren't.
2231
2232This class is specific to the shallow water equation as it works with the
2233momentum quantities assumed to be the second and third conserved quantities.
2234\end{classdesc}
2235
2236
2237\begin{classdesc}{Dirichlet\_Discharge\_boundary}{Boundary}
2238Module: \module{shallow\_water}
2239
2240Sets stage (stage0)
2241Sets momentum (wh0) in the inward normal direction.
2242\end{classdesc}
2243
2244
2245
2246\subsection{User-defined boundary conditions}
2247\label{sec:roll your own}
2248
2249All boundary classes must inherit from the generic boundary class
2250\code{Boundary} and have a method called \code{evaluate} which must
2251take as inputs \code{self, vol\_id, edge\_id} where self refers to the
2252object itself and vol\_id and edge\_id are integers referring to
2253particular edges. The method must return a list of three floating point
2254numbers representing values for \code{stage},
2255\code{xmomentum} and \code{ymomentum}, respectively.
2256
2257The constructor of a particular boundary class may be used to specify
2258particular values or flags to be used by the \code{evaluate} method.
2259Please refer to the source code for the existing boundary conditions
2260for examples of how to implement boundary conditions.
2261
2262
2263
2264%\section{Forcing Functions}
2265%
2266%\anuga provides a number of predefined forcing functions to be used with .....
2267
2268
2269
2270
2271\section{Evolution}\index{evolution}
2272
2273  \begin{methoddesc}{evolve}{yieldstep = None, finaltime = None, duration = None, skip_initial_step = False}
2274
2275  Module: \module{abstract\_2d\_finite\_volumes.domain}
2276
2277  This function (a method of \class{domain}) is invoked once all the
2278  preliminaries have been completed, and causes the model to progress
2279  through successive steps in its evolution, storing results and
2280  outputting statistics whenever a user-specified period
2281  \code{yieldstep} is completed (generally during this period the
2282  model will evolve through several steps internally
2283  as the method forces the water speed to be calculated
2284  on successive new cells). The user
2285  specifies the total time period over which the evolution is to take
2286  place, by specifying values (in seconds) for either \code{duration}
2287  or \code{finaltime}, as well as the interval in seconds after which
2288  results are to be stored and statistics output.
2289
2290  You can include \method{evolve} in a statement of the type:
2291
2292  {\small \begin{verbatim}
2293      for t in domain.evolve(yieldstep, finaltime):
2294          <Do something with domain and t>
2295  \end{verbatim}}
2296
2297  \end{methoddesc}
2298
2299
2300
2301\subsection{Diagnostics}
2302\label{sec:diagnostics}
2303
2304
2305  \begin{funcdesc}{statistics}{}
2306  Module: \module{abstract\_2d\_finite\_volumes.domain}
2307
2308  \end{funcdesc}
2309
2310  \begin{funcdesc}{timestepping\_statistics}{}
2311  Module: \module{abstract\_2d\_finite\_volumes.domain}
2312
2313  Returns a string of the following type for each
2314  timestep:
2315
2316  \code{Time = 0.9000, delta t in [0.00598964, 0.01177388], steps=12
2317  (12)}
2318
2319  Here the numbers in \code{steps=12 (12)} indicate the number of steps taken and
2320  the number of first-order steps, respectively.\\
2321
2322  The optional keyword argument \code{track_speeds=True} will
2323  generate a histogram of speeds generated by each triangle. The
2324  speeds relate to the size of the timesteps used by ANUGA and
2325  this diagnostics may help pinpoint problem areas where excessive speeds
2326  are generated.
2327
2328  \end{funcdesc}
2329
2330
2331  \begin{funcdesc}{boundary\_statistics}{quantities = None, tags = None}
2332  Module: \module{abstract\_2d\_finite\_volumes.domain}
2333
2334  Returns a string of the following type when \code{quantities = 'stage'} and \code{tags = ['top', 'bottom']}:
2335
2336  {\small \begin{verbatim}
2337 Boundary values at time 0.5000:
2338    top:
2339        stage in [ -0.25821218,  -0.02499998]
2340    bottom:
2341        stage in [ -0.27098821,  -0.02499974]
2342  \end{verbatim}}
2343
2344  \end{funcdesc}
2345
2346
2347  \begin{funcdesc}{get\_quantity}{name, location='vertices', indices = None}
2348  Module: \module{abstract\_2d\_finite\_volumes.domain}
2349
2350  Allow access to individual quantities and their methods
2351
2352  \end{funcdesc}
2353
2354 
2355  \begin{funcdesc}{set\_quantities\_to\_be\_monitored}{}
2356  Module: \module{abstract\_2d\_finite\_volumes.domain}
2357
2358  Selects quantities and derived quantities for which extrema attained at internal timesteps
2359  will be collected.
2360 
2361  Information can be tracked in the evolve loop by printing \code{quantity\_statistics} and
2362  collected data will be stored in the sww file.
2363
2364  Optional parameters \code{polygon} and \code{time\_interval} may be specified to restrict the
2365  extremum computation.
2366  \end{funcdesc} 
2367   
2368  \begin{funcdesc}{quantity\_statistics}{}
2369  Module: \module{abstract\_2d\_finite\_volumes.domain}
2370
2371  Reports on extrema attained by selected quantities.
2372 
2373  Returns a string of the following type for each
2374  timestep:
2375
2376  \begin{verbatim} 
2377  Monitored quantities at time 1.0000:
2378    stage-elevation:
2379      values since time = 0.00 in [0.00000000, 0.30000000]
2380      minimum attained at time = 0.00000000, location = (0.16666667, 0.33333333)
2381      maximum attained at time = 0.00000000, location = (0.83333333, 0.16666667)
2382    ymomentum:
2383      values since time = 0.00 in [0.00000000, 0.06241221]
2384      minimum attained at time = 0.00000000, location = (0.33333333, 0.16666667)
2385      maximum attained at time = 0.22472667, location = (0.83333333, 0.66666667)
2386    xmomentum:
2387      values since time = 0.00 in [-0.06062178, 0.47886313]
2388      minimum attained at time = 0.00000000, location = (0.16666667, 0.33333333)
2389      maximum attained at time = 0.35103646, location = (0.83333333, 0.16666667)
2390  \end{verbatim}     
2391
2392  The quantities (and derived quantities) listed here must be selected at model
2393  initialisation using the method \code{domain.set_quantities_to_be_monitored}.\\
2394   
2395  The optional keyword argument \code{precision='\%.4f'} will
2396  determine the precision used for floating point values in the output.
2397  This diagnostics helps track extrema attained by the selected quantities
2398  at every internal timestep.
2399
2400  These values are also stored in the sww file for post processing.
2401
2402  \end{funcdesc}
2403 
2404
2405 
2406  \begin{funcdesc}{get\_values}{location='vertices', indices = None}
2407  Module: \module{abstract\_2d\_finite\_volumes.quantity}
2408
2409  Extract values for quantity as an array
2410
2411  \end{funcdesc}
2412
2413
2414  \begin{funcdesc}{get\_integral}{}
2415  Module: \module{abstract\_2d\_finite\_volumes.quantity}
2416
2417  Return computed integral over entire domain for this quantity
2418
2419  \end{funcdesc}
2420
2421
2422
2423
2424  \begin{funcdesc}{get\_maximum\_value}{indices = None}
2425  Module: \module{abstract\_2d\_finite\_volumes.quantity}
2426
2427  Return maximum value of quantity (on centroids)
2428
2429  Optional argument indices is the set of element ids that
2430  the operation applies to. If omitted all elements are considered.
2431
2432  We do not seek the maximum at vertices as each vertex can
2433  have multiple values - one for each triangle sharing it.
2434  \end{funcdesc}
2435
2436
2437
2438  \begin{funcdesc}{get\_maximum\_location}{indices = None}
2439  Module: \module{abstract\_2d\_finite\_volumes.quantity}
2440
2441  Return location of maximum value of quantity (on centroids)
2442
2443  Optional argument indices is the set of element ids that
2444  the operation applies to.
2445
2446  We do not seek the maximum at vertices as each vertex can
2447  have multiple values - one for each triangle sharing it.
2448
2449  If there are multiple cells with same maximum value, the
2450  first cell encountered in the triangle array is returned.
2451  \end{funcdesc}
2452
2453
2454
2455  \begin{funcdesc}{get\_wet\_elements}{indices=None}
2456  Module: \module{shallow\_water.shallow\_water\_domain}
2457
2458  Return indices for elements where h $>$ minimum_allowed_height
2459  Optional argument indices is the set of element ids that the operation applies to.
2460  \end{funcdesc}
2461
2462
2463  \begin{funcdesc}{get\_maximum\_inundation\_elevation}{indices=None}
2464  Module: \module{shallow\_water.shallow\_water\_domain}
2465
2466  Return highest elevation where h $>$ 0.\\
2467  Optional argument indices is the set of element ids that the operation applies to.\\
2468
2469  Example to find maximum runup elevation:\\
2470     z = domain.get_maximum_inundation_elevation()
2471  \end{funcdesc}
2472
2473
2474  \begin{funcdesc}{get\_maximum\_inundation\_location}{indices=None}
2475  Module: \module{shallow\_water.shallow\_water\_domain}
2476
2477  Return location (x,y) of highest elevation where h $>$ 0.\\
2478  Optional argument indices is the set of element ids that the operation applies to.\\
2479
2480  Example to find maximum runup location:\\
2481     x, y = domain.get_maximum_inundation_location()
2482  \end{funcdesc}
2483
2484
2485\section{Queries of SWW model output files} 
2486After a model has been run, it is often useful to extract various information from the sww
2487output file (see Section \ref{sec:sww format}). This is typically more convenient than using the
2488diagnostics described in Section \ref{sec:diagnostics} which rely on the model running - something
2489that can be very time consuming. The sww files are easy and quick to read and offer much information
2490about the model results such as runup heights, time histories of selected quantities,
2491flow through cross sections and much more.
2492
2493\begin{funcdesc}{get\_maximum\_inundation\_elevation}{filename, polygon=None,
2494    time_interval=None, verbose=False}
2495  Module: \module{shallow\_water.data\_manager}
2496
2497  Return highest elevation where depth is positive ($h > 0$)
2498
2499  Example to find maximum runup elevation:\\   
2500  max_runup = get_maximum_inundation_elevation(filename,
2501  polygon=None,
2502  time_interval=None,
2503  verbose=False)
2504
2505   
2506  filename is a NetCDF sww file containing ANUGA model output.                                                       
2507  Optional arguments polygon and time_interval restricts the maximum runup calculation
2508  to a points that lie within the specified polygon and time interval.
2509
2510  If no inundation is found within polygon and time_interval the return value
2511  is None signifying "No Runup" or "Everything is dry".
2512
2513  See doc string for general function get_maximum_inundation_data for details.
2514\end{funcdesc}
2515
2516
2517\begin{funcdesc}{get\_maximum\_inundation\_location}{filename, polygon=None,
2518    time_interval=None, verbose=False}
2519  Module: \module{shallow\_water.data\_manager}
2520
2521  Return location (x,y) of highest elevation where depth is positive ($h > 0$)
2522
2523  Example to find maximum runup location:\\   
2524  max_runup_location = get_maximum_inundation_location(filename,
2525  polygon=None,
2526  time_interval=None,
2527  verbose=False)
2528
2529   
2530  filename is a NetCDF sww file containing ANUGA model output.                                                       
2531  Optional arguments polygon and time_interval restricts the maximum runup calculation
2532  to a points that lie within the specified polygon and time interval.
2533
2534  If no inundation is found within polygon and time_interval the return value
2535  is None signifying "No Runup" or "Everything is dry".
2536
2537  See doc string for general function get_maximum_inundation_data for details.
2538\end{funcdesc}
2539
2540
2541\begin{funcdesc}{sww2timeseries}{swwfiles, gauge_filename, production_dirs, report = None, reportname = None,
2542plot_quantity = None, generate_fig = False, surface = None, time_min = None, time_max = None, time_thinning = 1,
2543time_unit = None, title_on = None, use_cache = False, verbose = False}
2544
2545  Module: \module{anuga.abstract\_2d\_finite\_volumes.util}
2546 
2547  Return csv files for the location in the \code{gauge_filename} and can also return plots of them
2548 
2549  See doc string for general function sww2timeseries for details.
2550
2551\end{funcdesc}
2552 
2553 
2554
2555\section{Other}
2556
2557  \begin{funcdesc}{domain.create\_quantity\_from\_expression}{string}
2558
2559  Handy for creating derived quantities on-the-fly as for example
2560  \begin{verbatim}
2561  Depth = domain.create_quantity_from_expression('stage-elevation')
2562
2563  exp = '(xmomentum*xmomentum + ymomentum*ymomentum)**0.5')
2564  Absolute_momentum = domain.create_quantity_from_expression(exp)
2565  \end{verbatim}
2566
2567  %See also \file{Analytical\_solution\_circular\_hydraulic\_jump.py} for an example of use.
2568  \end{funcdesc}
2569
2570
2571
2572
2573
2574%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2575%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2576
2577\chapter{\anuga System Architecture}
2578
2579
2580\section{File Formats}
2581\label{sec:file formats}
2582
2583\anuga makes use of a number of different file formats. The
2584following table lists all these formats, which are described in more
2585detail in the paragraphs below.
2586
2587\bigskip
2588
2589\begin{center}
2590
2591\begin{tabular}{|ll|}  \hline
2592
2593\textbf{Extension} & \textbf{Description} \\
2594\hline\hline
2595
2596\code{.sww} & NetCDF format for storing model output
2597\code{f(t,x,y)}\\
2598
2599\code{.tms} & NetCDF format for storing time series \code{f(t)}\\
2600
2601\code{.csv/.txt} & ASCII format called points csv for storing
2602arbitrary points and associated attributes\\
2603
2604\code{.pts} & NetCDF format for storing arbitrary points and
2605associated attributes\\
2606
2607\code{.asc} & ASCII format of regular DEMs as output from ArcView\\
2608
2609\code{.prj} & Associated ArcView file giving more metadata for
2610\code{.asc} format\\
2611
2612\code{.ers} & ERMapper header format of regular DEMs for ArcView\\
2613
2614\code{.dem} & NetCDF representation of regular DEM data\\
2615
2616\code{.tsh} & ASCII format for storing meshes and associated
2617boundary and region info\\
2618
2619\code{.msh} & NetCDF format for storing meshes and associated
2620boundary and region info\\
2621
2622\code{.nc} & Native ferret NetCDF format\\
2623
2624\code{.geo} & Houdinis ASCII geometry format (?) \\  \par \hline
2625%\caption{File formats used by \anuga}
2626\end{tabular}
2627
2628
2629\end{center}
2630
2631The above table shows the file extensions used to identify the
2632formats of files. However, typically, in referring to a format we
2633capitalise the extension and omit the initial full stop---thus, we
2634refer, for example, to `SWW files' or `PRJ files'.
2635
2636\bigskip
2637
2638A typical dataflow can be described as follows:
2639
2640\subsection{Manually Created Files}
2641
2642\begin{tabular}{ll}
2643ASC, PRJ & Digital elevation models (gridded)\\
2644NC & Model outputs for use as boundary conditions (e.g. from MOST)
2645\end{tabular}
2646
2647\subsection{Automatically Created Files}
2648
2649\begin{tabular}{ll}
2650ASC, PRJ  $\rightarrow$  DEM  $\rightarrow$  PTS & Convert
2651DEMs to native \code{.pts} file\\
2652
2653NC $\rightarrow$ SWW & Convert MOST boundary files to
2654boundary \code{.sww}\\
2655
2656PTS + TSH $\rightarrow$ TSH with elevation & Least squares fit\\
2657
2658TSH $\rightarrow$ SWW & Convert TSH to \code{.sww}-viewable using
2659\code{animate}\\
2660
2661TSH + Boundary SWW $\rightarrow$ SWW & Simulation using
2662\code{\anuga}\\
2663
2664Polygonal mesh outline $\rightarrow$ & TSH or MSH
2665\end{tabular}
2666
2667
2668
2669
2670\bigskip
2671
2672\subsection{SWW and TMS Formats}
2673\label{sec:sww format}
2674
2675The SWW and TMS formats are both NetCDF formats, and are of key
2676importance for \anuga.
2677
2678An SWW file is used for storing \anuga output and therefore pertains
2679to a set of points and a set of times at which a model is evaluated.
2680It contains, in addition to dimension information, the following
2681variables:
2682
2683\begin{itemize}
2684    \item \code{x} and \code{y}: coordinates of the points, represented as Numeric arrays
2685    \item \code{elevation}, a Numeric array storing bed-elevations
2686    \item \code{volumes}, a list specifying the points at the vertices of each of the
2687    triangles
2688    % Refer here to the example to be provided in describing the simple example
2689    \item \code{time}, a Numeric array containing times for model
2690    evaluation
2691\end{itemize}
2692
2693
2694The contents of an SWW file may be viewed using the anuga viewer
2695\code{animate}, which creates an on-screen geometric
2696representation. See section \ref{sec:animate} (page
2697\pageref{sec:animate}) in Appendix \ref{ch:supportingtools} for more
2698on \code{animate}.
2699
2700Alternatively, there are tools, such as \code{ncdump}, that allow
2701you to convert an NetCDF file into a readable format such as the
2702Class Definition Language (CDL). The following is an excerpt from a
2703CDL representation of the output file \file{runup.sww} generated
2704from running the simple example \file{runup.py} of
2705Chapter \ref{ch:getstarted}:
2706
2707\verbatiminput{examples/bedslopeexcerpt.cdl}
2708
2709The SWW format is used not only for output but also serves as input
2710for functions such as \function{file\_boundary} and
2711\function{file\_function}, described in Chapter \ref{ch:interface}.
2712
2713A TMS file is used to store time series data that is independent of
2714position.
2715
2716
2717\subsection{Mesh File Formats}
2718
2719A mesh file is a file that has a specific format suited to
2720triangular meshes and their outlines. A mesh file can have one of
2721two formats: it can be either a TSH file, which is an ASCII file, or
2722an MSH file, which is a NetCDF file. A mesh file can be generated
2723from the function \function{create\_mesh\_from\_regions} (see
2724Section \ref{sec:meshgeneration}) and used to initialise a domain.
2725
2726A mesh file can define the outline of the mesh---the vertices and
2727line segments that enclose the region in which the mesh is
2728created---and the triangular mesh itself, which is specified by
2729listing the triangles and their vertices, and the segments, which
2730are those sides of the triangles that are associated with boundary
2731conditions.
2732
2733In addition, a mesh file may contain `holes' and/or `regions'. A
2734hole represents an area where no mesh is to be created, while a
2735region is a labelled area used for defining properties of a mesh,
2736such as friction values.  A hole or region is specified by a point
2737and bounded by a number of segments that enclose that point.
2738
2739A mesh file can also contain a georeference, which describes an
2740offset to be applied to $x$ and $y$ values---eg to the vertices.
2741
2742
2743\subsection{Formats for Storing Arbitrary Points and Attributes}
2744
2745
2746A CSV/TXT file is used to store data representing
2747arbitrary numerical attributes associated with a set of points.
2748
2749The format for an CSV/TXT file is:\\
2750%\begin{verbatim}
2751
2752            first line:     \code{[column names]}\\
2753            other lines:  \code{[x value], [y value], [attributes]}\\
2754
2755            for example:\\
2756            \code{x, y, elevation, friction}\\
2757            \code{0.6, 0.7, 4.9, 0.3}\\
2758            \code{1.9, 2.8, 5, 0.3}\\
2759            \code{2.7, 2.4, 5.2, 0.3}
2760
2761        The delimiter is a comma. The first two columns are assumed to
2762        be x, y coordinates.
2763       
2764
2765A PTS file is a NetCDF representation of the data held in an points CSV
2766file. If the data is associated with a set of $N$ points, then the
2767data is stored using an $N \times 2$ Numeric array of float
2768variables for the points and an $N \times 1$ Numeric array for each
2769attribute.
2770
2771%\end{verbatim}
2772
2773\subsection{ArcView Formats}
2774
2775Files of the three formats ASC, PRJ and ERS are all associated with
2776data from ArcView.
2777
2778An ASC file is an ASCII representation of DEM output from ArcView.
2779It contains a header with the following format:
2780
2781\begin{tabular}{l l}
2782\code{ncols}      &   \code{753}\\
2783\code{nrows}      &   \code{766}\\
2784\code{xllcorner}  &   \code{314036.58727982}\\
2785\code{yllcorner}  & \code{6224951.2960092}\\
2786\code{cellsize}   & \code{100}\\
2787\code{NODATA_value} & \code{-9999}
2788\end{tabular}
2789
2790The remainder of the file contains the elevation data for each grid point
2791in the grid defined by the above information.
2792
2793A PRJ file is an ArcView file used in conjunction with an ASC file
2794to represent metadata for a DEM.
2795
2796
2797\subsection{DEM Format}
2798
2799A DEM file is a NetCDF representation of regular DEM data.
2800
2801
2802\subsection{Other Formats}
2803
2804
2805
2806
2807\subsection{Basic File Conversions}
2808\label{sec:basicfileconversions}
2809
2810  \begin{funcdesc}{sww2dem}{basename_in, basename_out = None,
2811            quantity = None,
2812            timestep = None,
2813            reduction = None,
2814            cellsize = 10,
2815            NODATA_value = -9999,
2816            easting_min = None,
2817            easting_max = None,
2818            northing_min = None,
2819            northing_max = None,
2820            expand_search = False,
2821            verbose = False,
2822            origin = None,
2823            datum = 'WGS84',
2824            format = 'ers'}
2825  Module: \module{shallow\_water.data\_manager}
2826
2827  Takes data from an SWW file \code{basename_in} and converts it to DEM format (ASC or
2828  ERS) of a desired grid size \code{cellsize} in metres.
2829  The easting and northing values are used if the user wished to clip the output
2830  file to a specified rectangular area. The \code{reduction} input refers to a function
2831  to reduce the quantities over all time step of the SWW file, example, maximum.
2832  \end{funcdesc}
2833
2834
2835  \begin{funcdesc}{dem2pts}{basename_in, basename_out=None,
2836            easting_min=None, easting_max=None,
2837            northing_min=None, northing_max=None,
2838            use_cache=False, verbose=False}
2839  Module: \module{shallow\_water.data\_manager}
2840
2841  Takes DEM data (a NetCDF file representation of data from a regular Digital
2842  Elevation Model) and converts it to PTS format.
2843  \end{funcdesc}
2844
2845
2846
2847%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2848%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2849
2850\chapter{\anuga mathematical background}
2851\label{cd:mathematical background}
2852
2853\section{Introduction}
2854
2855This chapter outlines the mathematics underpinning \anuga.
2856
2857
2858
2859\section{Model}
2860\label{sec:model}
2861
2862The shallow water wave equations are a system of differential
2863conservation equations which describe the flow of a thin layer of
2864fluid over terrain. The form of the equations are:
2865\[
2866\frac{\partial \UU}{\partial t}+\frac{\partial \EE}{\partial
2867x}+\frac{\partial \GG}{\partial y}=\SSS
2868\]
2869where $\UU=\left[ {{\begin{array}{*{20}c}
2870 h & {uh} & {vh} \\
2871\end{array} }} \right]^T$ is the vector of conserved quantities; water depth
2872$h$, $x$-momentum $uh$ and $y$-momentum $vh$. Other quantities
2873entering the system are bed elevation $z$ and stage (absolute water
2874level) $w$, where the relation $w = z + h$ holds true at all times.
2875The fluxes in the $x$ and $y$ directions, $\EE$ and $\GG$ are given
2876by
2877\[
2878\EE=\left[ {{\begin{array}{*{20}c}
2879 {uh} \hfill \\
2880 {u^2h+gh^2/2} \hfill \\
2881 {uvh} \hfill \\
2882\end{array} }} \right]\mbox{ and }\GG=\left[ {{\begin{array}{*{20}c}
2883 {vh} \hfill \\
2884 {vuh} \hfill \\
2885 {v^2h+gh^2/2} \hfill \\
2886\end{array} }} \right]
2887\]
2888and the source term (which includes gravity and friction) is given
2889by
2890\[
2891\SSS=\left[ {{\begin{array}{*{20}c}
2892 0 \hfill \\
2893 -{gh(z_{x} + S_{fx} )} \hfill \\
2894 -{gh(z_{y} + S_{fy} )} \hfill \\
2895\end{array} }} \right]
2896\]
2897where $S_f$ is the bed friction. The friction term is modelled using
2898Manning's resistance law
2899\[
2900S_{fx} =\frac{u\eta ^2\sqrt {u^2+v^2} }{h^{4/3}}\mbox{ and }S_{fy}
2901=\frac{v\eta ^2\sqrt {u^2+v^2} }{h^{4/3}}
2902\]
2903in which $\eta$ is the Manning resistance coefficient.
2904
2905As demonstrated in our papers, \cite{ZR1999,nielsen2005} these
2906equations provide an excellent model of flows associated with
2907inundation such as dam breaks and tsunamis.
2908
2909\section{Finite Volume Method}
2910\label{sec:fvm}
2911
2912We use a finite-volume method for solving the shallow water wave
2913equations \cite{ZR1999}. The study area is represented by a mesh of
2914triangular cells as in Figure~\ref{fig:mesh} in which the conserved
2915quantities of  water depth $h$, and horizontal momentum $(uh, vh)$,
2916in each volume are to be determined. The size of the triangles may
2917be varied within the mesh to allow greater resolution in regions of
2918particular interest.
2919
2920\begin{figure}
2921\begin{center}
2922\includegraphics[width=8.0cm,keepaspectratio=true]{graphics/step-five}
2923\caption{Triangular mesh used in our finite volume method. Conserved
2924quantities $h$, $uh$ and $vh$ are associated with the centroid of
2925each triangular cell.} \label{fig:mesh}
2926\end{center}
2927\end{figure}
2928
2929The equations constituting the finite-volume method are obtained by
2930integrating the differential conservation equations over each
2931triangular cell of the mesh. Introducing some notation we use $i$ to
2932refer to the $i$th triangular cell $T_i$, and ${\cal N}(i)$ to the
2933set of indices referring to the cells neighbouring the $i$th cell.
2934Then $A_i$ is the area of the $i$th triangular cell and $l_{ij}$ is
2935the length of the edge between the $i$th and $j$th cells.
2936
2937By applying the divergence theorem we obtain for each volume an
2938equation which describes the rate of change of the average of the
2939conserved quantities within each cell, in terms of the fluxes across
2940the edges of the cells and the effect of the source terms. In
2941particular, rate equations associated with each cell have the form
2942$$
2943 \frac{d\UU_i }{dt}+ \frac1{A_i}\sum\limits_{j\in{\cal N}(i)} \HH_{ij} l_{ij} = \SSS_i
2944$$
2945where
2946\begin{itemize}
2947\item $\UU_i$ the vector of conserved quantities averaged over the $i$th cell,
2948\item $\SSS_i$ is the source term associated with the $i$th cell,
2949and
2950\item $\HH_{ij}$ is the outward normal flux of
2951material across the \textit{ij}th edge.
2952\end{itemize}
2953
2954
2955%\item $l_{ij}$ is the length of the edge between the $i$th and $j$th
2956%cells
2957%\item $m_{ij}$ is the midpoint of
2958%the \textit{ij}th edge,
2959%\item
2960%$\mathbf{n}_{ij} = (n_{ij,1} , n_{ij,2})$is the outward pointing
2961%normal along the \textit{ij}th edge, and The
2962
2963The flux $\HH_{ij}$ is evaluated using a numerical flux function
2964$\HH(\cdot, \cdot ; \ \cdot)$ which is consistent with the shallow
2965water flux in the sense that for all conservation vectors $\UU$ and normal vectors $\nn$
2966$$
2967H(\UU,\UU;\ \nn) = \EE(\UU) n_1 + \GG(\UU) n_2 .
2968$$
2969
2970Then
2971$$
2972\HH_{ij}  = \HH(\UU_i(m_{ij}),
2973\UU_j(m_{ij}); \mathbf{n}_{ij})
2974$$
2975where $m_{ij}$ is the midpoint of the \textit{ij}th edge and
2976$\mathbf{n}_{ij}$ is the outward pointing normal, with respect to the $i$th cell, on the
2977\textit{ij}th edge. The function $\UU_i(x)$ for $x \in
2978T_i$ is obtained from the vector $\UU_k$ of conserved average values for the $i$th and
2979neighbouring  cells.
2980
2981We use a second order reconstruction to produce a piece-wise linear
2982function construction of the conserved quantities for  all $x \in
2983T_i$ for each cell (see Figure~\ref{fig:mesh:reconstruct}. This
2984function is allowed to be discontinuous across the edges of the
2985cells, but the slope of this function is limited to avoid
2986artificially introduced oscillations.
2987
2988Godunov's method (see \cite{Toro1992}) involves calculating the
2989numerical flux function $\HH(\cdot, \cdot ; \ \cdot)$ by exactly
2990solving the corresponding one dimensional Riemann problem normal to
2991the edge. We use the central-upwind scheme of \cite{KurNP2001} to
2992calculate an approximation of the flux across each edge.
2993
2994\begin{figure}
2995\begin{center}
2996\includegraphics[width=8.0cm,keepaspectratio=true]{graphics/step-reconstruct}
2997\caption{From the values of the conserved quantities at the centroid
2998of the cell and its neighbouring cells, a discontinuous piecewise
2999linear reconstruction of the conserved quantities is obtained.}
3000\label{fig:mesh:reconstruct}
3001\end{center}
3002\end{figure}
3003
3004In the computations presented in this paper we use an explicit Euler
3005time stepping method with variable timestepping adapted to the
3006observed CFL condition.
3007
3008
3009\section{Flux limiting}
3010
3011The shallow water equations are solved numerically using a
3012finite volume method on unstructured triangular grid.
3013The upwind central scheme due to Kurganov and Petrova is used as an
3014approximate Riemann solver for the computation of inviscid flux functions.
3015This makes it possible to handle discontinuous solutions.
3016
3017To alleviate the problems associated with numerical instabilities due to
3018small water depths near a wet/dry boundary we employ a new flux limiter that
3019ensures that unphysical fluxes are never encounted.
3020
3021
3022Let $u$ and $v$ be the velocity components in the $x$ and $y$ direction,
3023$w$ the absolute water level (stage) and
3024$z$ the bed elevation. The latter are assumed to be relative to the
3025same height datum.
3026The conserved quantities tracked by ANUGA are momentum in the
3027$x$-direction ($\mu = uh$), momentum in the $y$-direction ($\nu = vh$)
3028and depth ($h = w-z$).
3029
3030The flux calculation requires access to the velocity vector $(u, v)$
3031where each component is obtained as $u = \mu/h$ and $v = \nu/h$ respectively.
3032In the presence of very small water depths, these calculations become
3033numerically unreliable and will typically cause unphysical speeds.
3034
3035We have employed a flux limiter which replaces the calculations above with
3036the limited approximations.
3037\begin{equation}
3038  \hat{u} = \frac{\mu}{h + h_0/h}, \bigskip \hat{v} = \frac{\nu}{h + h_0/h},
3039\end{equation}
3040where $h_0$ is a regularisation parameter that controls the minimal
3041magnitude of the denominator. Taking the limits we have for $\hat{u}$
3042\[
3043  \lim_{h \rightarrow 0} \hat{u} =
3044  \lim_{h \rightarrow 0} \frac{\mu}{h + h_0/h} = 0
3045\]
3046and
3047\[
3048  \lim_{h \rightarrow \infty} \hat{u} =
3049  \lim_{h \rightarrow \infty} \frac{\mu}{h + h_0/h} = \frac{\mu}{h} = u
3050\]
3051with similar results for $\hat{v}$.
3052
3053The maximal value of $\hat{u}$ is attained when $h+h_0/h$ is minimal or (by differentiating the denominator)
3054\[
3055  1 - h_0/h^2 = 0
3056\]
3057or
3058\[
3059  h_0 = h^2
3060\]
3061
3062
3063ANUGA has a global parameter $H_0$ that controls the minimal depth which
3064is considered in the various equations. This parameter is typically set to
3065$10^{-3}$. Setting
3066\[
3067  h_0 = H_0^2
3068\]
3069provides a reasonable balance between accurracy and stability. In fact,
3070setting $h=H_0$ will scale the predicted speed by a factor of $0.5$:
3071\[
3072  \left[ \frac{\mu}{h + h_0/h} \right]_{h = H_0} = \frac{\mu}{2 H_0}
3073\]
3074In general, for multiples of the minimal depth $N H_0$ one obtains
3075\[
3076  \left[ \frac{\mu}{h + h_0/h} \right]_{h = N H_0} =
3077  \frac{\mu}{H_0 (1 + 1/N^2)}
3078\]
3079which converges quadratically to the true value with the multiple N.
3080
3081
3082%The developed numerical model has been applied to several test cases as well as to real flows. Numerical tests prove the robustness and accuracy of the model.
3083
3084
3085
3086
3087
3088\section{Slope limiting}
3089A multidimensional slope-limiting technique is employed to achieve second-order spatial accuracy and to prevent spurious oscillations. This is using the MinMod limiter and is documented elsewhere.
3090
3091However close to the bed, the limiter must ensure that no negative depths occur. On the other hand, in deep water, the bed topography should be ignored for the purpose of the limiter.
3092
3093
3094Let $w, z, h$  be the stage, bed elevation and depth at the centroid and
3095let $w_i, z_i, h_i$ be the stage, bed elevation and depth at vertex $i$.
3096Define the minimal depth across all vertices as $\hmin$ as
3097\[
3098  \hmin = \min_i h_i
3099\]
3100
3101Let $\tilde{w_i}$ be the stage obtained from a gradient limiter
3102limiting on stage only. The corresponding depth is then defined as
3103\[
3104  \tilde{h_i} = \tilde{w_i} - z_i
3105\]
3106We would use this limiter in deep water which we will define (somewhat boldly)
3107as
3108\[
3109  \hmin \ge \epsilon
3110\]
3111
3112
3113Similarly, let $\bar{w_i}$ be the stage obtained from a gradient
3114limiter limiting on depth respecting the bed slope.
3115The corresponding depth is defined as
3116\[
3117  \bar{h_i} = \bar{w_i} - z_i
3118\]
3119
3120
3121We introduce the concept of a balanced stage $w_i$ which is obtained as
3122the linear combination
3123
3124\[
3125  w_i = \alpha \tilde{w_i} + (1-\alpha) \bar{w_i}
3126\]
3127or
3128\[
3129  w_i = z_i + \alpha \tilde{h_i} + (1-\alpha) \bar{h_i}
3130\]
3131where $\alpha \in [0, 1]$.
3132
3133Since $\tilde{w_i}$ is obtained in 'deep' water where the bedslope
3134is ignored we have immediately that
3135\[
3136  \alpha = 1 \mbox{ for } \hmin \ge \epsilon %or dz=0
3137\]
3138%where the maximal bed elevation range $dz$ is defined as
3139%\[
3140%  dz = \max_i |z_i - z|
3141%\]
3142
3143If $\hmin < \epsilon$ we want to use the 'shallow' limiter just enough that
3144no negative depths occur. Formally, we will require that
3145\[
3146  \alpha \tilde{h_i} + (1-\alpha) \bar{h_i} > \epsilon, \forall i
3147\]
3148or
3149\begin{equation}
3150  \alpha(\tilde{h_i} - \bar{h_i}) > \epsilon - \bar{h_i}, \forall i
3151  \label{eq:limiter bound}
3152\end{equation}
3153
3154There are two cases:
3155\begin{enumerate}
3156  \item $\bar{h_i} \le \tilde{h_i}$: The deep water (limited using stage)
3157  vertex is at least as far away from the bed than the shallow water
3158  (limited using depth). In this case we won't need any contribution from
3159  $\bar{h_i}$ and can accept any $\alpha$.
3160
3161  E.g.\ $\alpha=1$ reduces Equation \ref{eq:limiter bound} to
3162  \[
3163    \tilde{h_i} > \epsilon
3164  \]
3165  whereas $\alpha=0$ yields
3166  \[
3167    \bar{h_i} > \epsilon
3168  \]
3169  all well and good.
3170  \item $\bar{h_i} > \tilde{h_i}$: In this case the the deep water vertex is
3171  closer to the bed than the shallow water vertex or even below the bed.
3172  In this case we need to find an $\alpha$ that will ensure a positive depth.
3173  Rearranging Equation \ref{eq:limiter bound} and solving for $\alpha$ one
3174  obtains the bound
3175  \[
3176    \alpha < \frac{\epsilon - \bar{h_i}}{\tilde{h_i} - \bar{h_i}}, \forall i
3177  \]
3178\end{enumerate}
3179
3180Ensuring Equation \ref{eq:limiter bound} holds true for all vertices one
3181arrives at the definition
3182\[
3183  \alpha = \min_{i} \frac{\bar{h_i} - \epsilon}{\bar{h_i} - \tilde{h_i}}
3184\]
3185which will guarantee that no vertex 'cuts' through the bed. Finally, should
3186$\bar{h_i} < \epsilon$ and therefore $\alpha < 0$, we suggest setting
3187$\alpha=0$ and similarly capping $\alpha$ at 1 just in case.
3188
3189%Furthermore,
3190%dropping the $\epsilon$ ensures that alpha is always positive and also
3191%provides a numerical safety {??)
3192
3193
3194
3195
3196
3197%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3198%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3199
3200\chapter{Basic \anuga Assumptions}
3201
3202
3203Physical model time cannot be earlier than 1 Jan 1970 00:00:00.
3204If one wished to recreate scenarios prior to that date it must be done
3205using some relative time (e.g. 0).
3206
3207
3208All spatial data relates to the WGS84 datum (or GDA94) and has been
3209projected into UTM with false easting of 500000 and false northing of
32101000000 on the southern hemisphere (0 on the northern).
3211
3212It is assumed that all computations take place within one UTM zone and
3213all locations must consequently be specified in Cartesian coordinates
3214(eastings, northings) or (x,y) where the unit is metres.
3215
3216DEMs, meshes and boundary conditions can have different origins within
3217one UTM zone. However, the computation will use that of the mesh for
3218numerical stability.
3219
3220When generating a mesh it is assumed that polygons do not cross.
3221Having polygons tht cross can cause the mesh generation to fail or bad
3222meshes being produced.
3223
3224
3225%OLD
3226%The dataflow is: (See data_manager.py and from scenarios)
3227%
3228%
3229%Simulation scenarios
3230%--------------------%
3231%%
3232%
3233%Sub directories contain scrips and derived files for each simulation.
3234%The directory ../source_data contains large source files such as
3235%DEMs provided externally as well as MOST tsunami simulations to be used
3236%as boundary conditions.
3237%
3238%Manual steps are:
3239%  Creation of DEMs from argcview (.asc + .prj)
3240%  Creation of mesh from pmesh (.tsh)
3241%  Creation of tsunami simulations from MOST (.nc)
3242%%
3243%
3244%Typical scripted steps are%
3245%
3246%  prepare_dem.py:  Convert asc and prj files supplied by arcview to
3247%                   native dem and pts formats%
3248%
3249%  prepare_pts.py: Convert netcdf output from MOST to an sww file suitable
3250%                  as boundary condition%
3251%
3252%  prepare_mesh.py: Merge DEM (pts) and mesh (tsh) using least squares
3253%                   smoothing. The outputs are tsh files with elevation data.%
3254%
3255%  run_simulation.py: Use the above together with various parameters to
3256%                     run inundation simulation.
3257
3258
3259%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3260%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3261
3262\appendix
3263
3264\chapter{Supporting Tools}
3265\label{ch:supportingtools}
3266
3267This section describes a number of supporting tools, supplied with \anuga, that offer a
3268variety of types of functionality and enhance the basic capabilities of \anuga.
3269
3270\section{caching}
3271\label{sec:caching}
3272
3273The \code{cache} function is used to provide supervised caching of function
3274results. A Python function call of the form
3275
3276      {\small \begin{verbatim}
3277      result = func(arg1,...,argn)
3278      \end{verbatim}}
3279
3280  can be replaced by
3281
3282      {\small \begin{verbatim}
3283      from caching import cache
3284      result = cache(func,(arg1,...,argn))
3285      \end{verbatim}}
3286
3287  which returns the same output but reuses cached
3288  results if the function has been computed previously in the same context.
3289  \code{result} and the arguments can be simple types, tuples, list, dictionaries or
3290  objects, but not unhashable types such as functions or open file objects.
3291  The function \code{func} may be a member function of an object or a module.
3292
3293  This type of caching is particularly useful for computationally intensive
3294  functions with few frequently used combinations of input arguments. Note that
3295  if the inputs or output are very large caching may not save time because
3296  disc access may dominate the execution time.
3297
3298  If the function definition changes after a result has been cached, this will be
3299  detected by examining the functions \code{bytecode (co\_code, co\_consts,
3300  func\_defaults, co\_argcount)} and the function will be recomputed.
3301  However, caching will not detect changes in modules used by \code{func}.
3302  In this case cache must be cleared manually.
3303
3304  Options are set by means of the function \code{set\_option(key, value)},
3305  where \code{key} is a key associated with a
3306  Python dictionary \code{options}. This dictionary stores settings such as the name of
3307  the directory used, the maximum
3308  number of cached files allowed, and so on.
3309
3310  The \code{cache} function allows the user also to specify a list of dependent files. If any of these
3311  have been changed, the function is recomputed and the results stored again.
3312
3313  %Other features include support for compression and a capability to \ldots
3314
3315
3316   \textbf{USAGE:} \nopagebreak
3317
3318    {\small \begin{verbatim}
3319    result = cache(func, args, kwargs, dependencies, cachedir, verbose,
3320                   compression, evaluate, test, return_filename)
3321    \end{verbatim}}
3322
3323
3324\section{ANUGA viewer - animate}
3325\label{sec:animate}
3326 The output generated by \anuga may be viewed by
3327means of the visualisation tool \code{animate}, which takes the
3328\code{SWW} file output by \anuga and creates a visual representation
3329of the data. Examples may be seen in Figures \ref{fig:runupstart}
3330and \ref{fig:runup2}. To view an \code{SWW} file with
3331\code{animate} in the Windows environment, you can simply drag the
3332icon representing the file over an icon on the desktop for the
3333\code{animate} executable file (or a shortcut to it), or set up a
3334file association to make files with the extension \code{.sww} open
3335with \code{animate}. Alternatively, you can operate \code{animate}
3336from the command line, in both Windows and Linux environments.
3337
3338On successful operation, you will see an interactive moving-picture
3339display. You can use keys and the mouse to slow down, speed up or
3340stop the display, change the viewing position or carry out a number
3341of other simple operations. Help is also displayed when you press
3342the \code{h} key.
3343
3344The main keys operating the interactive screen are:\\
3345
3346\begin{center}
3347\begin{tabular}{|ll|}   \hline
3348
3349\code{w} & toggle wireframe \\
3350
3351space bar & start/stop\\
3352
3353up/down arrows & increase/decrease speed\\
3354
3355left/right arrows & direction in time \emph{(when running)}\\
3356& step through simulation \emph{(when stopped)}\\
3357
3358left mouse button & rotate\\
3359
3360middle mouse button & pan\\
3361
3362right mouse button & zoom\\  \hline
3363
3364\end{tabular}
3365\end{center}
3366
3367\vfill
3368
3369The following table describes how to operate animate from the command line:
3370
3371Usage: \code{animate [options] swwfile \ldots}\\  \nopagebreak
3372Options:\\  \nopagebreak
3373\begin{tabular}{ll}
3374  \code{--display <type>} & \code{MONITOR | POWERWALL | REALITY\_CENTER |}\\
3375                                    & \code{HEAD\_MOUNTED\_DISPLAY}\\
3376  \code{--rgba} & Request a RGBA colour buffer visual\\
3377  \code{--stencil} & Request a stencil buffer visual\\
3378  \code{--stereo} & Use default stereo mode which is \code{ANAGLYPHIC} if not \\
3379                                    & overridden by environmental variable\\
3380  \code{--stereo <mode>} & \code{ANAGLYPHIC | QUAD\_BUFFER | HORIZONTAL\_SPLIT |}\\
3381                                    & \code{VERTICAL\_SPLIT | LEFT\_EYE | RIGHT\_EYE |}\\
3382                                     & \code{ON | OFF} \\
3383  \code{-alphamax <float 0-1>} & Maximum transparency clamp value\\
3384  \code{-alphamin <float 0-1>} & Transparency value at \code{hmin}\\
3385\end{tabular}
3386
3387\begin{tabular}{ll}
3388  \code{-cullangle <float angle 0-90>} & Cull triangles steeper than this value\\
3389  \code{-help} & Display this information\\
3390  \code{-hmax <float>} & Height above which transparency is set to
3391                                     \code{alphamax}\\
3392\end{tabular}
3393
3394\begin{tabular}{ll}
3395
3396  \code{-hmin <float>} & Height below which transparency is set to
3397                                     zero\\
3398\end{tabular}
3399
3400\begin{tabular}{ll}
3401  \code{-lightpos <float>,<float>,<float>} & $x,y,z$ of bedslope directional light ($z$ is
3402                                     up, default is overhead)\\
3403\end{tabular}
3404
3405\begin{tabular}{ll}
3406  \code{-loop}  & Repeated (looped) playback of \code{.swm} files\\
3407
3408\end{tabular}
3409
3410\begin{tabular}{ll}
3411  \code{-movie <dirname>} & Save numbered images to named directory and
3412                                     quit\\
3413
3414  \code{-nosky} & Omit background sky\\
3415
3416
3417  \code{-scale <float>} & Vertical scale factor\\
3418  \code{-texture <file>} & Image to use for bedslope topography\\
3419  \code{-tps <rate>} & Timesteps per second\\
3420  \code{-version} & Revision number and creation (not compile)
3421                                     date\\
3422\end{tabular}
3423
3424\section{utilities/polygons}
3425
3426  \declaremodule{standard}{utilities.polygon}
3427  \refmodindex{utilities.polygon}
3428
3429  \begin{classdesc}{Polygon\_function}{regions, default = 0.0, geo_reference = None}
3430  Module: \code{utilities.polygon}
3431
3432  Creates a callable object that returns one of a specified list of values when
3433  evaluated at a point \code{x, y}, depending on which polygon, from a specified list of polygons, the
3434  point belongs to. The parameter \code{regions} is a list of pairs
3435  \code{(P, v)}, where each \code{P} is a polygon and each \code{v}
3436  is either a constant value or a function of coordinates \code{x}
3437  and \code{y}, specifying the return value for a point inside \code{P}. The
3438  optional parameter \code{default} may be used to specify a value
3439  for a point not lying inside any of the specified polygons. When a
3440  point lies in more than one polygon, the return value is taken to
3441  be the value for whichever of these polygon appears later in the
3442  list.
3443  %FIXME (Howard): CAN x, y BE VECTORS?
3444
3445  \end{classdesc}
3446
3447  \begin{funcdesc}{read\_polygon}{filename}
3448  Module: \code{utilities.polygon}
3449
3450  Reads the specified file and returns a polygon. Each
3451  line of the file must contain exactly two numbers, separated by a comma, which are interpreted
3452  as coordinates of one vertex of the polygon.
3453  \end{funcdesc}
3454
3455  \begin{funcdesc}{populate\_polygon}{polygon, number_of_points, seed = None, exclude = None}
3456  Module: \code{utilities.polygon}
3457
3458  Populates the interior of the specified polygon with the specified number of points,
3459  selected by means of a uniform distribution function.
3460  \end{funcdesc}
3461
3462  \begin{funcdesc}{point\_in\_polygon}{polygon, delta=1e-8}
3463  Module: \code{utilities.polygon}
3464
3465  Returns a point inside the specified polygon and close to the edge. The distance between
3466  the returned point and the nearest point of the polygon is less than $\sqrt{2}$ times the
3467  second argument \code{delta}, which is taken as $10^{-8}$ by default.
3468  \end{funcdesc}
3469
3470  \begin{funcdesc}{inside\_polygon}{points, polygon, closed = True, verbose = False}
3471  Module: \code{utilities.polygon}
3472
3473  Used to test whether the members of a list of points
3474  are inside the specified polygon. Returns a Numeric
3475  array comprising the indices of the points in the list that lie inside the polygon.
3476  (If none of the points are inside, returns \code{zeros((0,), 'l')}.)
3477  Points on the edges of the polygon are regarded as inside if
3478  \code{closed} is set to \code{True} or omitted; otherwise they are regarded as outside.
3479  \end{funcdesc}
3480
3481  \begin{funcdesc}{outside\_polygon}{points, polygon, closed = True, verbose = False}
3482  Module: \code{utilities.polygon}
3483
3484  Exactly like \code{inside\_polygon}, but with the words `inside' and `outside' interchanged.
3485  \end{funcdesc}
3486
3487  \begin{funcdesc}{is\_inside\_polygon}{point, polygon, closed=True, verbose=False}
3488  Module: \code{utilities.polygon}
3489
3490  Returns \code{True} if \code{point} is inside \code{polygon} or
3491  \code{False} otherwise. Points on the edges of the polygon are regarded as inside if
3492  \code{closed} is set to \code{True} or omitted; otherwise they are regarded as outside.
3493  \end{funcdesc}
3494
3495  \begin{funcdesc}{is\_outside\_polygon}{point, polygon, closed=True, verbose=False}
3496  Module: \code{utilities.polygon}
3497
3498  Exactly like \code{is\_outside\_polygon}, but with the words `inside' and `outside' interchanged.
3499  \end{funcdesc}
3500
3501  \begin{funcdesc}{point\_on\_line}{x, y, x0, y0, x1, y1}
3502  Module: \code{utilities.polygon}
3503
3504  Returns \code{True} or \code{False}, depending on whether the point with coordinates
3505  \code{x, y} is on the line passing through the points with coordinates \code{x0, y0}
3506  and \code{x1, y1} (extended if necessary at either end).
3507  \end{funcdesc}
3508
3509  \begin{funcdesc}{separate\_points\_by\_polygon}{points, polygon, closed = True, verbose = False}
3510    \indexedcode{separate\_points\_by\_polygon}
3511  Module: \code{utilities.polygon}
3512
3513  \end{funcdesc}
3514
3515  \begin{funcdesc}{polygon\_area}{polygon}
3516  Module: \code{utilities.polygon}
3517
3518  Returns area of arbitrary polygon (reference http://mathworld.wolfram.com/PolygonArea.html)
3519  \end{funcdesc}
3520
3521  \begin{funcdesc}{plot\_polygons}{polygons, figname, verbose = False}
3522  Module: \code{utilities.polygon}
3523
3524  Plots each polygon contained in input polygon list, e.g.
3525 \code{polygons = [poly1, poly2, poly3]} where \code{poly1 = [[x11,y11],[x12,y12],[x13,y13]]}
3526 etc.  Each polygon is closed for plotting purposes and subsequent plot saved to \code{figname}.
3527  Returns list containing the minimum and maximum of \code{x} and \code{y},
3528  i.e. \code{[x_{min}, x_{max}, y_{min}, y_{max}]}.
3529  \end{funcdesc}
3530
3531\section{coordinate\_transforms}
3532
3533\section{geospatial\_data}
3534\label{sec:geospatial}
3535
3536This describes a class that represents arbitrary point data in UTM
3537coordinates along with named attribute values.
3538
3539%FIXME (Ole): This gives a LaTeX error
3540%\declaremodule{standard}{geospatial_data}
3541%\refmodindex{geospatial_data}
3542
3543
3544
3545\begin{classdesc}{Geospatial\_data}
3546  {data_points = None,
3547    attributes = None,
3548    geo_reference = None,
3549    default_attribute_name = None,
3550    file_name = None}
3551Module: \code{geospatial\_data}
3552
3553This class is used to store a set of data points and associated
3554attributes, allowing these to be manipulated by methods defined for
3555the class.
3556
3557The data points are specified either by reading them from a NetCDF
3558or CSV file, identified through the parameter \code{file\_name}, or
3559by providing their \code{x}- and \code{y}-coordinates in metres,
3560either as a sequence of 2-tuples of floats or as an $M \times 2$
3561Numeric array of floats, where $M$ is the number of points.
3562Coordinates are interpreted relative to the origin specified by the
3563object \code{geo\_reference}, which contains data indicating the UTM
3564zone, easting and northing. If \code{geo\_reference} is not
3565specified, a default is used.
3566
3567Attributes are specified through the parameter \code{attributes},
3568set either to a list or array of length $M$ or to a dictionary whose
3569keys are the attribute names and whose values are lists or arrays of
3570length $M$. One of the attributes may be specified as the default
3571attribute, by assigning its name to \code{default\_attribute\_name}.
3572If no value is specified, the default attribute is taken to be the
3573first one.
3574\end{classdesc}
3575
3576
3577\begin{methoddesc}{import\_points\_file}{delimiter = None, verbose = False}
3578
3579\end{methoddesc}
3580
3581
3582\begin{methoddesc}{export\_points\_file}{ofile, absolute=False}
3583
3584\end{methoddesc}
3585
3586
3587\begin{methoddesc}{get\_data\_points}{absolute = True, as\_lat\_long =
3588    False}
3589    If \code{as\_lat\_long} is\code{True} the point information
3590    returned will be in Latitudes and Longitudes.
3591
3592\end{methoddesc}
3593
3594
3595\begin{methoddesc}{set\_attributes}{attributes}
3596
3597\end{methoddesc}
3598
3599
3600\begin{methoddesc}{get\_attributes}{attribute_name = None}
3601
3602\end{methoddesc}
3603
3604
3605\begin{methoddesc}{get\_all\_attributes}{}
3606
3607\end{methoddesc}
3608
3609
3610\begin{methoddesc}{set\_default\_attribute\_name}{default_attribute_name}
3611
3612\end{methoddesc}
3613
3614
3615\begin{methoddesc}{set\_geo\_reference}{geo_reference}
3616
3617\end{methoddesc}
3618
3619
3620\begin{methoddesc}{add}{}
3621
3622\end{methoddesc}
3623
3624
3625\begin{methoddesc}{clip}{}
3626Clip geospatial data by a polygon
3627
3628Inputs are \code{polygon} which is either a list of points, an Nx2 array or
3629a Geospatial data object and \code{closed}(optional) which determines
3630whether points on boundary should be regarded as belonging to the polygon
3631(\code{closed=True}) or not (\code{closed=False}).
3632Default is \code{closed=True}.
3633
3634Returns new Geospatial data object representing points
3635inside specified polygon.
3636\end{methoddesc}
3637
3638
3639\begin{methoddesc}{clip_outside}{}
3640Clip geospatial data by a polygon
3641
3642Inputs are \code{polygon} which is either a list of points, an Nx2 array or
3643a Geospatial data object and \code{closed}(optional) which determines
3644whether points on boundary should be regarded as belonging to the polygon
3645(\code{closed=True}) or not (\code{closed=False}).
3646Default is \code{closed=True}.
3647
3648Returns new Geospatial data object representing points
3649\emph{out}side specified polygon.
3650\end{methoddesc}
3651
3652
3653\section{Graphical Mesh Generator GUI}
3654The program \code{graphical\_mesh\_generator.py} in the pmesh module
3655allows the user to set up the mesh of the problem interactively.
3656It can be used to build the outline of a mesh or to visualise a mesh
3657automatically generated.
3658
3659Graphical Mesh Generator will let the user select various modes. The
3660current allowable modes are vertex, segment, hole or region.  The mode
3661describes what sort of object is added or selected in response to
3662mouse clicks.  When changing modes any prior selected objects become
3663deselected.
3664
3665In general the left mouse button will add an object and the right
3666mouse button will select an object.  A selected object can de deleted
3667by pressing the the middle mouse button (scroll bar).
3668
3669\section{alpha\_shape}
3670\emph{Alpha shapes} are used to generate close-fitting boundaries
3671around sets of points. The alpha shape algorithm produces a shape
3672that approximates to the `shape formed by the points'---or the shape
3673that would be seen by viewing the points from a coarse enough
3674resolution. For the simplest types of point sets, the alpha shape
3675reduces to the more precise notion of the convex hull. However, for
3676many sets of points the convex hull does not provide a close fit and
3677the alpha shape usually fits more closely to the original point set,
3678offering a better approximation to the shape being sought.
3679
3680In \anuga, an alpha shape is used to generate a polygonal boundary
3681around a set of points before mesh generation. The algorithm uses a
3682parameter $\alpha$ that can be adjusted to make the resultant shape
3683resemble the shape suggested by intuition more closely. An alpha
3684shape can serve as an initial boundary approximation that the user
3685can adjust as needed.
3686
3687The following paragraphs describe the class used to model an alpha
3688shape and some of the important methods and attributes associated
3689with instances of this class.
3690
3691\begin{classdesc}{Alpha\_Shape}{points, alpha = None}
3692Module: \code{alpha\_shape}
3693
3694To instantiate this class the user supplies the points from which
3695the alpha shape is to be created (in the form of a list of 2-tuples
3696\code{[[x1, y1],[x2, y2]}\ldots\code{]}, assigned to the parameter
3697\code{points}) and, optionally, a value for the parameter
3698\code{alpha}. The alpha shape is then computed and the user can then
3699retrieve details of the boundary through the attributes defined for
3700the class.
3701\end{classdesc}
3702
3703
3704\begin{funcdesc}{alpha\_shape\_via\_files}{point_file, boundary_file, alpha= None}
3705Module: \code{alpha\_shape}
3706
3707This function reads points from the specified point file
3708\code{point\_file}, computes the associated alpha shape (either
3709using the specified value for \code{alpha} or, if no value is
3710specified, automatically setting it to an optimal value) and outputs
3711the boundary to a file named \code{boundary\_file}. This output file
3712lists the coordinates \code{x, y} of each point in the boundary,
3713using one line per point.
3714\end{funcdesc}
3715
3716
3717\begin{methoddesc}{set\_boundary\_type}{self,raw_boundary=True,
3718                          remove_holes=False,
3719                          smooth_indents=False,
3720                          expand_pinch=False,
3721                          boundary_points_fraction=0.2}
3722Module: \code{alpha\_shape},  Class: \class{Alpha\_Shape}
3723
3724This function sets flags that govern the operation of the algorithm
3725that computes the boundary, as follows:
3726
3727\code{raw\_boundary = True} returns raw boundary, i.e. the regular edges of the
3728                alpha shape.\\
3729\code{remove\_holes = True} removes small holes (`small' is defined by
3730\code{boundary\_points\_fraction})\\
3731\code{smooth\_indents = True} removes sharp triangular indents in
3732boundary\\
3733\code{expand\_pinch = True} tests for pinch-off and
3734corrects---preventing a boundary vertex from having more than two edges.
3735\end{methoddesc}
3736
3737
3738\begin{methoddesc}{get\_boundary}{}
3739Module: \code{alpha\_shape},  Class: \class{Alpha\_Shape}
3740
3741Returns a list of tuples representing the boundary of the alpha
3742shape. Each tuple represents a segment in the boundary by providing
3743the indices of its two endpoints.
3744\end{methoddesc}
3745
3746
3747\begin{methoddesc}{write\_boundary}{file_name}
3748Module: \code{alpha\_shape},  Class: \class{Alpha\_Shape}
3749
3750Writes the list of 2-tuples returned by \code{get\_boundary} to the
3751file \code{file\_name}, using one line per tuple.
3752\end{methoddesc}
3753
3754\section{Numerical Tools}
3755
3756The following table describes some useful numerical functions that
3757may be found in the module \module{utilities.numerical\_tools}:
3758
3759\begin{tabular}{|p{8cm} p{8cm}|}  \hline
3760\code{angle(v1, v2=None)} & Angle between two-dimensional vectors
3761\code{v1} and \code{v2}, or between \code{v1} and the $x$-axis if
3762\code{v2} is \code{None}. Value is in range $0$ to $2\pi$. \\
3763
3764\code{normal\_vector(v)} & Normal vector to \code{v}.\\
3765
3766\code{mean(x)} & Mean value of a vector \code{x}.\\
3767
3768\code{cov(x, y=None)} & Covariance of vectors \code{x} and \code{y}.
3769If \code{y} is \code{None}, returns \code{cov(x, x)}.\\
3770
3771\code{err(x, y=0, n=2, relative=True)} & Relative error of
3772$\parallel$\code{x}$-$\code{y}$\parallel$ to
3773$\parallel$\code{y}$\parallel$ (2-norm if \code{n} = 2 or Max norm
3774if \code{n} = \code{None}). If denominator evaluates to zero or if
3775\code{y}
3776is omitted or if \code{relative = False}, absolute error is returned.\\
3777
3778\code{norm(x)} & 2-norm of \code{x}.\\
3779
3780\code{corr(x, y=None)} & Correlation of \code{x} and \code{y}. If
3781\code{y} is \code{None} returns autocorrelation of \code{x}.\\
3782
3783\code{ensure\_numeric(A, typecode = None)} & Returns a Numeric array
3784for any sequence \code{A}. If \code{A} is already a Numeric array it
3785will be returned unaltered. Otherwise, an attempt is made to convert
3786it to a Numeric array. (Needed because \code{array(A)} can
3787cause memory overflow.)\\
3788
3789\code{histogram(a, bins, relative=False)} & Standard histogram. If
3790\code{relative} is \code{True}, values will be normalised against
3791the total and thus represent frequencies rather than counts.\\
3792
3793\code{create\_bins(data, number\_of\_bins = None)} & Safely create
3794bins for use with histogram. If \code{data} contains only one point
3795or is constant, one bin will be created. If \code{number\_of\_bins}
3796is omitted, 10 bins will be created.\\  \hline
3797
3798\end{tabular}
3799
3800
3801\chapter{Modules available in \anuga}
3802
3803
3804\section{\module{abstract\_2d\_finite\_volumes.general\_mesh} }
3805\declaremodule[generalmesh]{}{general\_mesh}
3806\label{mod:generalmesh}
3807
3808\section{\module{abstract\_2d\_finite\_volumes.neighbour\_mesh} }
3809\declaremodule[neighbourmesh]{}{neighbour\_mesh}
3810\label{mod:neighbourmesh}
3811
3812\section{\module{abstract\_2d\_finite\_volumes.domain} --- Generic module for 2D triangular domains for finite-volume computations of conservation laws}
3813\declaremodule{}{domain}
3814\label{mod:domain}
3815
3816
3817\section{\module{abstract\_2d\_finite\_volumes.quantity}}
3818\declaremodule{}{quantity}
3819\label{mod:quantity}
3820
3821\begin{verbatim}
3822Class Quantity - Implements values at each triangular element
3823
3824To create:
3825
3826   Quantity(domain, vertex_values)
3827
3828   domain: Associated domain structure. Required.
3829
3830   vertex_values: N x 3 array of values at each vertex for each element.
3831                  Default None
3832
3833   If vertex_values are None Create array of zeros compatible with domain.
3834   Otherwise check that it is compatible with dimenions of domain.
3835   Otherwise raise an exception
3836
3837\end{verbatim}
3838
3839
3840
3841
3842\section{\module{shallow\_water} --- 2D triangular domains for finite-volume
3843computations of the shallow water wave equation. This module contains a specialisation
3844of class Domain from module domain.py consisting of methods specific to the Shallow Water
3845Wave Equation
3846}
3847\declaremodule[shallowwater]{}{shallow\_water}
3848\label{mod:shallowwater}
3849
3850
3851
3852
3853%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3854
3855\chapter{Frequently Asked Questions}
3856
3857
3858\section{General Questions}
3859
3860\subsubsection{What is \anuga?}
3861It is a software package suitable for simulating 2D water flows in
3862complex geometries.
3863
3864\subsubsection{Why is it called \anuga?}
3865The software was developed in collaboration between the
3866Australian National University (ANU) and Geoscience Australia (GA).
3867
3868\subsubsection{How do I obtain a copy of \anuga?}
3869See \url{https://datamining.anu.edu.au/anuga} for all things ANUGA.
3870
3871%\subsubsection{What developments are expected for \anuga in the future?}
3872%This
3873
3874\subsubsection{Are there any published articles about \anuga that I can reference?}
3875See \url{https://datamining.anu.edu.au/anuga} for links.
3876
3877
3878\section{Modelling Questions}
3879
3880\subsubsection{Which type of problems are \anuga good for?}
3881General 2D waterflows in complex geometries such as
3882dam breaks, flows amoung structurs, coastal inundation etc.
3883
3884\subsubsection{Which type of problems are beyond the scope of \anuga?}
3885See Chapter \ref{ch:limitations}.
3886
3887\subsubsection{Can I start the simulation at an arbitrary time?}
3888Yes, using \code{domain.set\_time()} you can specify an arbitrary
3889starting time. This is for example useful in conjunction with a
3890file\_boundary, which may start hours before anything hits the model
3891boundary. By assigning a later time for the model to start,
3892computational resources aren't wasted.
3893
3894\subsubsection{Can I change values for any quantity during the simulation?}
3895Yes, using \code{domain.set\_quantity()} inside the domain.evolve
3896loop you can change values of any quantity. This is for example
3897useful if you wish to let the system settle for a while before
3898assigning an initial condition. Another example would be changing
3899the values for elevation to model e.g. erosion.
3900
3901\subsubsection{Can I change boundary conditions during the simulation?}
3902Yes - see example on page \pageref{sec:change boundary code} in Section
3903\ref{sec:change boundary}.
3904
3905\subsubsection{How do I access model time during the simulation?}
3906The variable \code{t} in the evolve for loop is the model time.
3907For example to change the boundary at a particular time (instead of basing this on the state of the system as in Section \ref{sec:change boundary})
3908one would write something like
3909{\small \begin{verbatim}
3910    for t in domain.evolve(yieldstep = 0.2, duration = 40.0):
3911
3912        if Numeric.allclose(t, 15):
3913            print 'Changing boundary to outflow'
3914            domain.set_boundary({'right': Bo})
3915
3916\end{verbatim}}
3917The model time can also be accessed through the public interface \code{domain.get\_time()}, or changed (at your own peril) through \code{domain.set\_time()}.
3918
3919
3920\subsubsection{Why does a file\_function return a list of numbers when evaluated?}
3921Currently, file\_function works by returning values for the conserved
3922quantities \code{stage}, \code{xmomentum} and \code{ymomentum} at a given point in time
3923and space as a triplet. To access e.g.\ \code{stage} one must specify element 0 of the
3924triplet returned by file\_function.
3925
3926\subsubsection{Which diagnostics are available to troubleshoot a simulation?}
3927
3928\subsubsection{How do I use a DEM in my simulation?}
3929You use \code{dem2pts} to convert your DEM to the required .pts format. This .pts file is then called
3930when setting the elevation data to the mesh in \code{domain.set_quantity}
3931
3932\subsubsection{What sort of DEM resolution should I use?}
3933Try and work with the \emph{best} you have available. Onshore DEMs
3934are typically available in 25m, 100m and 250m grids. Note, offshore
3935data is often sparse, or non-existent.
3936
3937\subsubsection{What sort of mesh resolution should I use?}
3938The mesh resolution should be commensurate with your DEM - it does not make sense to put in place a mesh which is finer than your DEM. As an example,
3939if your DEM is on a 25m grid, then the cell resolution should be of the order of 315$m^2$ (this represents half the area of the square grid). Ideally,
3940you need a fine mesh over regions where the DEM changes rapidly, and other areas of significant interest, such as the coast.
3941If meshes are too coarse, discretisation errors in both stage and momentum may lead to unphysical results. All studies should include sensitivity and convergence studies based on different resolutions.
3942
3943
3944\subsubsection{How do I tag interior polygons?}
3945At the moment create_mesh_from_regions does not allow interior
3946polygons with symbolic tags. If tags are needed, the interior
3947polygons must be created subsequently. For example, given a filename
3948of polygons representing solid walls (in Arc Ungenerate format) can
3949be tagged as such using the code snippet:
3950\begin{verbatim}
3951  # Create mesh outline with tags
3952  mesh = create_mesh_from_regions(bounding_polygon,
3953                                  boundary_tags=boundary_tags)
3954  # Add buildings outlines with tags set to 'wall'. This would typically
3955  # bind to a Reflective boundary
3956  mesh.import_ungenerate_file(buildings_filename, tag='wall')
3957
3958  # Generate and write mesh to file
3959  mesh.generate_mesh(maximum_triangle_area=max_area)
3960  mesh.export_mesh_file(mesh_filename)
3961\end{verbatim}
3962
3963Note that a mesh object is returned from \code{create_mesh_from_regions}
3964when file name is omitted.
3965
3966\subsubsection{How often should I store the output?}
3967This will depend on what you are trying to answer with your model and how much memory you have available on your machine. If you need
3968to look in detail at the evolution, then you will need to balance your storage requirements and the duration of the simulation.
3969If the SWW file exceeds 1Gb, another SWW file will be created until the end of the simulation. As an example, to store all the conserved
3970quantities on a mesh with approximately 300000 triangles on a 2 min interval for 5 hours will result in approximately 350Mb SWW file
3971(as for the \file{run\_sydney\_smf.py} example).
3972
3973\subsubsection{How can I set the friction in different areas in the domain?}
3974The model area will typically be estimating the water height and momentum over varying
3975topographies which will have different friction values. One way of assigning
3976different friction values is to create polygons (say \code{poly1, poly2 and poly3}) describing each
3977area and then set the corresponding friction values in the following way
3978
3979\code{domain.set_quantity('friction',Polygon_function([(poly1,f1),(poly2,f2),
3980(poly3,f3))]))}
3981
3982The values of \code{f1,f2} and \code{f3} could be constant or functions
3983as determined by the user.
3984
3985\subsubsection{How can I combine data sets?}
3986
3987A user may have access to a range of different resolution DEMs and raw data points (such
3988as beach profiles, spot heights, single or multi-beam data etc) and will need
3989to combine them to create an overall elevation data set.
3990
3991If there are multiple DEMs, say of 10m and 25m resolution, then the technique is similar to
3992that defined in the Cairns example described earlier, that is
3993
3994{\small \begin{verbatim}
3995convert_dem_from_ascii2netcdf(10m_dem_name, use_cache=True, verbose=True)
3996convert_dem_from_ascii2netcdf(25m_dem_name, use_cache=True, verbose=True)
3997\end{verbatim}}
3998followed by 
3999{\small \begin{verbatim}
4000dem2pts(10m_dem_name, use_cache=True, verbose=True)
4001dem2pts(25m_dem_name, use_cache=True, verbose=True)
4002\end{verbatim}}
4003These data sets can now be combined by
4004{\small \begin{verbatim}
4005from anuga.geospatial_data.geospatial_data import *
4006G1 = Geospatial_data(file_name = 10m_dem_name + '.pts')
4007G2 = Geospatial_data(file_name = 25m_dem_name + '.pts')
4008G = G1 + G2
4009G.export_points_file(combined_dem_name + ‘.pts’)
4010\end{verbatim}}
4011this is the basic way of combining data sets, however, the user will need to
4012assess the boundaries of each data set and whether they overlap. For example, consider
4013if the 10m DEM is describing by \code{poly1} and the 25m DEM is described by \code{poly2} 
4014with \code{poly1} completely enclosed in \code{poly2} as shown in Figure \ref{fig:polydata}
4015\begin{figure}[hbt]
4016  \centerline{\includegraphics{graphics/polyanddata.jpg}}
4017  \caption{Polygons describing the extent of the 10m and 25m DEM.}
4018  \label{fig:polydata}
4019\end{figure}
4020To combine the data sets, the geospatial addition is updated to
4021{\small \begin{verbatim}
4022G = G1 + G2.clip_outside(Geospatial_data(poly1))
4023\end{verbatim}}
4024For this example, we assume that \code{poly2} is the domain, otherwise an additional dataset
4025would be required for the remainder of the domain.
4026
4027This technique can be expanded to handle point data sets as well. In the case
4028of a bathymetry data set available in text format in an \code{.xya} file, then
4029the geospatial addition is updated to
4030{\small \begin{verbatim}
4031G3 = Geospatial_data(file_name = bathy_data_name + '.xya')
4032G = G1 + G2.clip_outside(Geospatial_data(poly1)) + G3
4033\end{verbatim}}
4034The \code{.xya} file has the data stored as \code{x,y,elevation} with the text \code{elevation}
4035on the first line.
4036
4037The coastline could be included
4038as part of the clipping polygon to separate the offshore and onshore datasets if required.
4039Assume that \code{poly1} crosses the coastline
4040In this case, two new polygons could be created out of \code{poly1} which uses the coastline
4041as the divider. As shown in Figure \ref{fig:polycoast}, \code{poly3} describes the
4042onshore data and \code{poly4} describes the offshore data.
4043\begin{figure}[hbt]
4044  \centerline{\includegraphics{graphics/polyanddata2.jpg}}
4045  \caption{Inclusion of new polygons separating the 10m DEM area into an
4046  onshore (poly3) and offshore (poly4) data set.}
4047  \label{fig:polycoast}
4048\end{figure}
4049Let's include the bathymetry
4050data described above, so to combine the datasets in this case,
4051{\small \begin{verbatim}
4052G = G1.clip(Geospatial_data(poly3)) + G2.clip_outside(Geospatial_data(poly1)) + G3
4053\end{verbatim}}
4054
4055Finally, to fit the elevation data to the mesh, the script is adjusted in this way
4056{\small \begin{verbatim}
4057    domain.set_quantity('elevation',
4058                        filename = combined_dem_name + '.pts',
4059                        use_cache = True,
4060                        verbose = True)
4061\end{verbatim}}
4062\subsection{Boundary Conditions}
4063
4064\subsubsection{How do I create a Dirichlet boundary condition?}
4065
4066A Dirichlet boundary condition sets a constant value for the
4067conserved quantities at the boundaries. A list containing
4068the constant values for stage, xmomentum and ymomentum is constructed
4069and used in the function call, e.g. \code{Dirichlet_boundary([0.2,0.,0.])}
4070
4071\subsubsection{How do I know which boundary tags are available?}
4072The method \code{domain.get\_boundary\_tags()} will return a list of
4073available tags for use with
4074\code{domain.set\_boundary\_condition()}.
4075
4076\subsubsection{What is the difference between file_boundary and field_boundary?}
4077The only difference is field_boundary will allow you to change the level of the stage height when you read in the boundary condition.
4078This is very useful when running different tide heights in the same area as you need only to convert
4079one boundary condition to a SWW file, ideally for tide height of 0 m (saving disk space). Then you can
4080use field_boundary to read this SWW file and change the stage height (tide) on the fly depending on the scenario.
4081
4082
4083
4084
4085\section{Analysing Questions}
4086
4087\subsubsection{How do I easily plot "tide gauges" timeseries from the SWW files?}
4088
4089This is two ways to do this.
4090
40911) Create csv files from the sww file using \code{sww2timeseries} and then use
4092\code{anuga.abstract_2d_finite_volumes.util make_plots_from_csv_file} to create
4093the plots
4094
4095Or
4096
40972) Use \code{anuga.abstract_2d_finite_volumes.util sww2timeseries} to do the whole thing
4098however this don't have a much control on the file name and plots....
4099
4100More detail to be added
4101
4102Read the doc string for more information.
4103
4104\chapter{Glossary}
4105
4106\begin{tabular}{|lp{10cm}|c|}  \hline
4107%\begin{tabular}{|llll|}  \hline
4108    \emph{Term} & \emph{Definition} & \emph{Page}\\  \hline
4109
4110    \indexedbold{\anuga} & Name of software (joint development between ANU and
4111    GA) & \pageref{def:anuga}\\
4112
4113    \indexedbold{bathymetry} & offshore elevation &\\
4114
4115    \indexedbold{conserved quantity} & conserved (stage, x and y
4116    momentum) & \\
4117
4118%    \indexedbold{domain} & The domain of a function is the set of all input values to the
4119%    function.&\\
4120
4121    \indexedbold{Digital Elevation Model (DEM)} & DEMs are digital files consisting of points of elevations,
4122sampled systematically at equally spaced intervals.& \\
4123
4124    \indexedbold{Dirichlet boundary} & A boundary condition imposed on a differential equation
4125 that specifies the values the solution is to take on the boundary of the
4126 domain. & \pageref{def:dirichlet boundary}\\
4127
4128    \indexedbold{edge} & A triangular cell within the computational mesh can be depicted
4129    as a set of vertices joined by lines (the edges). & \\
4130
4131    \indexedbold{elevation} & refers to bathymetry and topography &\\
4132
4133    \indexedbold{evolution} & integration of the shallow water wave equations
4134    over time &\\
4135
4136    \indexedbold{finite volume method} & The method evaluates the terms in the shallow water
4137    wave equation as fluxes at the surfaces of each finite volume. Because the
4138    flux entering a given volume is identical to that leaving the adjacent volume,
4139    these methods are conservative. Another advantage of the finite volume method is
4140    that it is easily formulated to allow for unstructured meshes. The method is used
4141    in many computational fluid dynamics packages. & \\
4142
4143    \indexedbold{forcing term} & &\\
4144
4145    \indexedbold{flux} & the amount of flow through the volume per unit
4146    time & \\
4147
4148    \indexedbold{grid} & Evenly spaced mesh & \\
4149
4150    \indexedbold{latitude} & The angular distance on a mericlear north and south of the
4151    equator, expressed in degrees and minutes. & \\
4152
4153    \indexedbold{longitude} & The angular distance east or west, between the meridian
4154    of a particular place on Earth and that of the Prime Meridian (located in Greenwich,
4155    England) expressed in degrees or time.& \\
4156
4157    \indexedbold{Manning friction coefficient} & &\\
4158
4159    \indexedbold{mesh} & Triangulation of domain &\\
4160
4161    \indexedbold{mesh file} & A TSH or MSH file & \pageref{def:mesh file}\\
4162
4163    \indexedbold{NetCDF} & &\\
4164
4165    \indexedbold{node} & A point at which edges meet & \\
4166
4167    \indexedbold{northing} & A rectangular (x,y) coordinate measurement of distance
4168    north from a north-south reference line, usually a meridian used as the axis of
4169    origin within a map zone or projection. Northing is a UTM (Universal Transverse
4170    Mercator) coordinate. & \\
4171
4172    \indexedbold{points file} & A PTS or CSV file & \\  \hline
4173
4174    \end{tabular}
4175
4176    \begin{tabular}{|lp{10cm}|c|}  \hline
4177
4178    \indexedbold{polygon} & A sequence of points in the plane. \anuga represents a polygon
4179    either as a list consisting of Python tuples or lists of length 2 or as an $N \times 2$
4180    Numeric array, where $N$ is the number of points.
4181
4182    The unit square, for example, would be represented either as
4183    \code{[ [0,0], [1,0], [1,1], [0,1] ]} or as \code{array( [0,0], [1,0], [1,1],
4184    [0,1] )}.
4185
4186    NOTE: For details refer to the module \module{utilities/polygon.py}. &
4187    \\     \indexedbold{resolution} &  The maximal area of a triangular cell in a
4188    mesh & \\
4189
4190
4191    \indexedbold{reflective boundary} & Models a solid wall. Returns same conserved
4192    quantities as those present in the neighbouring volume but reflected. Specific to the
4193    shallow water equation as it works with the momentum quantities assumed to be the
4194    second and third conserved quantities. & \pageref{def:reflective boundary}\\
4195
4196    \indexedbold{stage} & &\\
4197
4198%    \indexedbold{try this}
4199
4200    \indexedbold{animate} & visualisation tool used with \anuga &
4201    \pageref{sec:animate}\\
4202
4203    \indexedbold{time boundary} & Returns values for the conserved
4204quantities as a function of time. The user must specify
4205the domain to get access to the model time. & \pageref{def:time boundary}\\
4206
4207    \indexedbold{topography} & onshore elevation &\\
4208
4209    \indexedbold{transmissive boundary} & & \pageref{def:transmissive boundary}\\
4210
4211    \indexedbold{vertex} & A point at which edges meet. & \\
4212
4213    \indexedbold{xmomentum} & conserved quantity (note, two-dimensional SWW equations say
4214    only \code{x} and \code{y} and NOT \code{z}) &\\
4215
4216    \indexedbold{ymomentum}  & conserved quantity & \\  \hline
4217
4218    \end{tabular}
4219
4220
4221%The \code{\e appendix} markup need not be repeated for additional
4222%appendices.
4223
4224
4225%
4226%  The ugly "%begin{latexonly}" pseudo-environments are really just to
4227%  keep LaTeX2HTML quiet during the \renewcommand{} macros; they're
4228%  not really valuable.
4229%
4230%  If you don't want the Module Index, you can remove all of this up
4231%  until the second \input line.
4232%
4233
4234%begin{latexonly}
4235%\renewcommand{\indexname}{Module Index}
4236%end{latexonly}
4237\input{mod\jobname.ind}        % Module Index
4238%
4239%begin{latexonly}
4240%\renewcommand{\indexname}{Index}
4241%end{latexonly}
4242\input{\jobname.ind}            % Index
4243
4244
4245
4246\begin{thebibliography}{99}
4247\bibitem[nielsen2005]{nielsen2005}
4248{\it Hydrodynamic modelling of coastal inundation}.
4249Nielsen, O., S. Roberts, D. Gray, A. McPherson and A. Hitchman.
4250In Zerger, A. and Argent, R.M. (eds) MODSIM 2005 International Congress on
4251Modelling and Simulation. Modelling and Simulation Society of Australia and
4252New Zealand, December 2005, pp. 518-523. ISBN: 0-9758400-2-9.\\
4253http://www.mssanz.org.au/modsim05/papers/nielsen.pdf
4254
4255\bibitem[grid250]{grid250}
4256Australian Bathymetry and Topography Grid, June 2005.
4257Webster, M.A. and Petkovic, P.
4258Geoscience Australia Record 2005/12. ISBN: 1-920871-46-2.\\
4259http://www.ga.gov.au/meta/ANZCW0703008022.html
4260
4261\bibitem[ZR1999]{ZR1999}
4262\newblock {Catastrophic Collapse of Water Supply Reservoirs in Urban Areas}.
4263\newblock C.~Zoppou and S.~Roberts.
4264\newblock {\em ASCE J. Hydraulic Engineering}, 125(7):686--695, 1999.
4265
4266\bibitem[Toro1999]{Toro1992}
4267\newblock Riemann problems and the waf method for solving the two-dimensional
4268  shallow water equations.
4269\newblock E.~F. Toro.
4270\newblock {\em Philosophical Transactions of the Royal Society, Series A},
4271  338:43--68, 1992.
4272 
4273\bibitem{KurNP2001}
4274\newblock Semidiscrete central-upwind schemes for hyperbolic conservation laws
4275  and hamilton-jacobi equations.
4276\newblock A.~Kurganov, S.~Noelle, and G.~Petrova.
4277\newblock {\em SIAM Journal of Scientific Computing}, 23(3):707--740, 2001.
4278\end{thebibliography}{99}
4279
4280\end{document}
Note: See TracBrowser for help on using the repository browser.