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

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

Manual updates from Ted Rigby.

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