source: documentation/user_manual/anuga_user_manual.tex @ 3119

Last change on this file since 3119 was 3119, checked in by howard, 18 years ago

Modified the description of symbolic tags in 3.1.7

  • Property svn:keywords set to LastChangedDate LastChangedRevision LastChangedBy HeadURL Id
File size: 103.1 KB
Line 
1% Complete documentation on the extended LaTeX markup used for Python
2% documentation is available in ``Documenting Python'', which is part
3% of the standard documentation for Python.  It may be found online
4% at:
5%
6%     http://www.python.org/doc/current/doc/doc.html
7
8
9%labels
10%Sections and subsections \label{sec: }
11%Chapters \label{ch: }
12%Equations \label{eq: }
13%Figures \label{fig: }
14
15
16
17\documentclass{manual}
18
19\usepackage{graphicx}
20\usepackage{datetime}
21
22\input{definitions}
23
24\title{\anuga User Manual}
25\author{Geoscience Australia and the Australian National University}
26
27% Please at least include a long-lived email address;
28% the rest is at your discretion.
29\authoraddress{Geoscience Australia \\
30  Email: \email{ole.nielsen@ga.gov.au}
31}
32
33%Draft date
34
35% update before release!
36% Use an explicit date so that reformatting
37% doesn't cause a new date to be used.  Setting
38% the date to \today can be used during draft
39% stages to make it easier to handle versions.
40
41
42\longdate       % Make date format long using datetime.sty
43%\settimeformat{xxivtime} % 24 hour Format
44\settimeformat{oclock} % Verbose
45\date{\today, \ \currenttime}
46%\hyphenation{set\_datadir}
47
48\ifhtml
49\date{\today} % latex2html does not know about datetime
50\fi
51
52
53
54
55
56\release{1.0}   % release version; this is used to define the
57                % \version macro
58
59\makeindex          % tell \index to actually write the .idx file
60\makemodindex       % If this contains a lot of module sections.
61
62\setcounter{tocdepth}{3}
63\setcounter{secnumdepth}{3}
64
65
66\begin{document}
67\maketitle
68
69
70% This makes the contents more accessible from the front page of the HTML.
71\ifhtml
72\chapter*{Front Matter\label{front}}
73\fi
74
75%Subversion keywords:
76%
77%$LastChangedDate: 2006-06-08 04:53:26 +0000 (Thu, 08 Jun 2006) $
78%$LastChangedRevision: 3119 $
79%$LastChangedBy: howard $
80
81\input{copyright}
82
83
84\begin{abstract}
85\label{def:anuga}
86
87\noindent \anuga\index{\anuga} is a hydrodynamic modelling tool that
88allows users to model realistic flow problems in complex geometries.
89Examples include dam breaks or the effects of natural hazards such
90as riverine flooding, storm surges and tsunami.
91
92The user must specify a study area represented by a mesh of triangular
93cells, the topography and bathymetry, frictional resistance, initial
94values for water level (called \emph{stage}\index{stage} within \anuga),
95boundary
96conditions and forces such as windstress or pressure gradients if
97applicable.
98
99\anuga tracks the evolution of water depth and horizontal momentum
100within each cell over time by solving the shallow water wave equation
101governing equation using a finite-volume method.
102
103\anuga cannot model details of breaking waves, flow under ceilings such
104as pipes, turbulence and vortices, vertical convection or viscous
105flows.
106
107\anuga also incorporates a mesh generator, called \code{pmesh}, that
108allows the user to set up the geometry of the problem interactively as
109well as tools for interpolation and surface fitting, and a number of
110auxiliary tools for visualising and interrogating the model output.
111
112Most \anuga components are written in the object-oriented programming
113language Python and most users will interact with \anuga by writing
114small Python programs based on the \anuga library
115functions. Computationally intensive components are written for
116efficiency in C routines working directly with the Numerical Python
117structures.
118
119
120\end{abstract}
121
122\tableofcontents
123
124
125\chapter{Introduction}
126
127
128\section{Purpose}
129
130The purpose of this user manual is to introduce the new user to the
131inundation software, describe what it can do and give step-by-step
132instructions for setting up and running hydrodynamic simulations.
133
134\section{Scope}
135
136This manual covers only what is needed to operate the software after
137installation and configuration. It does not includes instructions
138for installing the software or detailed API documentation, both of
139which will be covered in separate publications and by documentation
140in the source code.
141
142\section{Audience}
143
144Readers are assumed to be familiar with the operating environment
145and have a general understanding of the subject matter, as well as
146enough programming experience to adapt the code to different
147requirements and to understand the basic terminology of
148object-oriented programming.
149
150\pagebreak
151\chapter{Background}
152
153
154Modelling the effects on the built environment of natural hazards such
155as riverine flooding, storm surges and tsunami is critical for
156understanding their economic and social impact on our urban
157communities.  Geoscience Australia and the Australian National
158University are developing a hydrodynamic inundation modelling tool
159called \anuga to help simulate the impact of these hazards.
160
161The core of \anuga is the fluid dynamics module, called pyvolution,
162which is based on a finite-volume method for solving the shallow water
163wave equation.  The study area is represented by a mesh of triangular
164cells.  By solving the governing equation within each cell, water
165depth and horizontal momentum are tracked over time.
166
167A major capability of pyvolution is that it can model the process of
168wetting and drying as water enters and leaves an area.  This means
169that it is suitable for simulating water flow onto a beach or dry land
170and around structures such as buildings.  Pyvolution is also capable
171of modelling hydraulic jumps due to the ability of the finite-volume
172method to accommodate discontinuities in the solution.
173
174To set up a particular scenario the user specifies the geometry
175(bathymetry and topography), the initial water level (stage)
176,
177boundary conditions such as tide, and any forcing terms that may
178drive the system such as wind stress or atmospheric pressure
179gradients. Gravity and frictional resistance from the different
180terrains in the model are represented by predefined forcing terms.
181
182A mesh generator, called pmesh, allows the user to set up the geometry
183of the problem interactively and to identify boundary segments and
184regions using symbolic tags.  These tags may then be used to set the
185actual boundary conditions and attributes for different regions
186(e.g. the Manning friction coefficient) for each simulation.
187
188Most \anuga components are written in the object-oriented programming
189language Python.  Software written in Python can be produced quickly
190and can be readily adapted to changing requirements throughout its
191lifetime.  Computationally intensive components are written for
192efficiency in C routines working directly with the Numerical Python
193structures.  The animation tool developed for \anuga is based on
194OpenSceneGraph, an Open Source Software (OSS) component allowing high
195level interaction with sophisticated graphics primitives.
196
197See \cite{nielsen2005} and \cite{roberts1999} for more background on \anuga.
198%FIXME (Ole): Add bibliography
199
200\chapter{Getting Started}
201\label{ch:getstarted}
202
203This section is designed to assist the reader to get started with
204\anuga by working through some examples. Two examples are discussed;
205the first is a simple example to illustrate many of the ideas, and
206the second is a more realistic example.
207
208\section{A Simple Example}
209\label{sec:simpleexample}
210
211\subsection{Overview}
212
213What follows is a discussion of the structure and operation of a
214script called \file{runup.py}.
215
216This example carries out the solution of the shallow-water wave
217equation in the simple case of a configuration comprising a flat
218bed, sloping at a fixed angle in one direction and having a
219constant depth across each line in the perpendicular direction.
220
221The example demonstrates the basic ideas involved in setting up a
222complex scenario. In general the user specifies the geometry
223(bathymetry and topography), the initial water level, boundary
224conditions such as tide, and any forcing terms that may drive the
225system such as wind stress or atmospheric pressure gradients.
226Frictional resistance from the different terrains in the model is
227represented by predefined forcing terms. In this example, the
228boundary is reflective on three sides and a time dependent wave on
229one side.
230
231The present example represents a simple scenario and does not
232include any forcing terms, nor is the data taken from a file as it
233would typically be.
234
235The conserved quantities involved in the
236problem are stage (absolute height of water surface),
237$x$-momentum and $y$-momentum. Other quantities
238involved in the computation are the friction and elevation.
239
240Water depth can be obtained through the equation
241
242\begin{tabular}{rcrcl}
243  \code{depth} &=& \code{stage} &$-$& \code{elevation}
244\end{tabular}
245
246
247%\emph{[More details of the problem background]}
248
249\subsection{Outline of the Program}
250
251In outline, \file{runup.py} performs the following steps:
252
253\begin{enumerate}
254
255   \item Sets up a triangular mesh.
256
257   \item Sets certain parameters governing the mode of
258operation of the model-specifying, for instance, where to store the model output.
259
260   \item Inputs various quantities describing physical measurements, such
261as the elevation, to be specified at each mesh point (vertex).
262
263   \item Sets up the boundary conditions.
264
265   \item Carries out the evolution of the model through a series of time
266steps and outputs the results, providing a results file that can
267be visualised.
268
269\end{enumerate}
270
271\subsection{The Code}
272
273%FIXME: we are using the \code function here.
274%This should be used wherever possible
275For reference we include below the complete code listing for
276\file{runup.py}. Subsequent paragraphs provide a
277`commentary' that describes each step of the program and explains it
278significance.
279
280\verbatiminput{examples/runup.py}
281%\verbatiminput{examples/bedslope.py}
282
283\subsection{Establishing the Mesh}
284
285The first task is to set up the triangular mesh to be used for the
286scenario. This is carried out through the statement:
287
288{\small \begin{verbatim}
289    points, vertices, boundary = rectangular(10, 10)
290\end{verbatim}}
291
292The function \function{rectangular} is imported from a module
293\module{mesh\_factory} defined elsewhere. (\anuga also contains
294several other schemes that can be used for setting up meshes, but we
295shall not discuss these now.) The above assignment sets up a $10
296\times 10$ rectangular mesh, triangulated in a regular way. The assignment
297
298{\small \begin{verbatim}
299    points, vertices, boundary = rectangular(m, n)
300\end{verbatim}}
301
302returns:
303
304\begin{itemize}
305
306   \item a list \code{points} giving the coordinates of each mesh point,
307
308   \item a list \code{vertices} specifying the three vertices of each triangle, and
309
310   \item a dictionary \code{boundary} that stores the edges on
311   the boundary and associates each with one of the symbolic tags \code{`left'}, \code{`right'},
312   \code{`top'} or \code{`bottom'}. (For more details on symbolic tags,
313   see page \pageref{ref:tagdescription}.)
314
315\end{itemize}
316
317An example of a general unstructured mesh and the associated data
318structures \code{points}, \code{vertices} and \code{boundary} is
319given in Section \ref{sec:meshexample}.
320
321
322
323
324\subsection{Initialising the Domain}
325
326These variables are then used to set up a data structure
327\code{domain}, through the assignment:
328
329{\small \begin{verbatim}
330    domain = Domain(points, vertices, boundary)
331\end{verbatim}}
332
333This creates an instance of the \class{Domain} class, which
334represents the domain of the simulation. Specific options are set at
335this point, including the basename for the output file and the
336directory to be used for data:
337
338{\small \begin{verbatim}
339    domain.set_name('bedslope')
340\end{verbatim}}
341
342{\small \begin{verbatim}
343    domain.set_datadir('.')
344\end{verbatim}}
345
346In addition, the following statement now specifies that the
347quantities \code{stage}, \code{xmomentum} and \code{ymomentum} are
348to be stored:
349
350{\small \begin{verbatim}
351    domain.set_quantities_to_be_stored(['stage', 'xmomentum',
352    'ymomentum'])
353\end{verbatim}}
354
355
356\subsection{Initial Conditions}
357
358The next task is to specify a number of quantities that we wish to
359set for each mesh point. The class \class{Domain} has a method
360\method{set\_quantity}, used to specify these quantities. It is a
361flexible method that allows the user to set quantities in a variety
362of ways---using constants, functions, numeric arrays, expressions
363involving other quantities, or arbitrary data points with associated
364values, all of which can be passed as arguments. All quantities can
365be initialised using \method{set\_quantity}. For a conserved
366quantity (such as \code{stage, xmomentum, ymomentum}) this is called
367an \emph{initial condition}. However, other quantities that aren't
368updated by the equation are also assigned values using the same
369interface. The code in the present example demonstrates a number of
370forms in which we can invoke \method{set\_quantity}.
371
372
373\subsubsection{Elevation}
374
375The elevation, or height of the bed, is set using a function,
376defined through the statements below, which is specific to this
377example and specifies a particularly simple initial configuration
378for demonstration purposes:
379
380{\small \begin{verbatim}
381    def f(x,y):
382        return -x/2
383\end{verbatim}}
384
385This simply associates an elevation with each point \code{(x, y)} of
386the plane.  It specifies that the bed slopes linearly in the
387\code{x} direction, with slope $-\frac{1}{2}$,  and is constant in
388the \code{y} direction.
389
390Once the function \function{f} is specified, the quantity
391\code{elevation} is assigned through the simple statement:
392
393{\small \begin{verbatim}
394    domain.set_quantity('elevation', f)
395\end{verbatim}}
396
397
398\subsubsection{Friction}
399
400The assignment of the friction quantity (a forcing term) demonstrates another way we
401can use \method{set\_quantity} to set quantities---namely, assign
402them to a constant numerical value:
403
404{\small \begin{verbatim}
405    domain.set_quantity('friction', 0.1)
406\end{verbatim}}
407
408This specifies that the Manning friction coefficient is set to 0.1
409at every mesh point.
410
411\subsubsection{Stage}
412
413The stage (the height of the water surface) is related to the
414elevation and the depth at any time by the equation
415
416
417{\small \begin{verbatim}
418    stage = elevation + depth
419\end{verbatim}}
420
421
422For this example, we simply assign a constant value to \code{stage},
423using the statement
424
425{\small \begin{verbatim}
426    domain.set_quantity('stage', -.4)
427\end{verbatim}}
428
429which specifies that the surface level is set to a height of $-0.4$,
430i.e. 0.4 units (m) below the zero level.
431
432%FIXME (Howard): Can we put this para somewhere else?
433Although it is not necessary for this example, it may be useful to
434digress here and mention a variant to this requirement, which allows
435us to illustrate another way to use \method{set\_quantity}---namely,
436incorporating an expression involving other quantities. Suppose,
437instead of setting a constant value for the stage, we wished to
438specify a constant value for the \emph{depth}. For such a case we
439need to specify that \code{stage} is everywhere obtained by adding
440that value to the value already specified for \code{elevation}. We
441would do this by means of the statements:
442
443{\small \begin{verbatim}
444    h = 0.05 # Constant depth
445    domain.set_quantity('stage', expression = 'elevation + %f' %h)
446\end{verbatim}}
447
448That is, the value of \code{stage} is set to $\code{h} = 0.05$ plus
449the value of \code{elevation} already defined.
450
451The reader will probably appreciate that this capability to
452incorporate expressions into statements using \method{set\_quantity}
453greatly expands its power.) See Section \ref{sec:Initial Conditions} for more
454details.
455
456\subsection{Boundary Conditions}
457
458The boundary conditions are specified as follows:
459
460{\small \begin{verbatim}
461    Br = Reflective_boundary(domain)
462
463    Bt = Transmissive_boundary(domain)
464
465    Bd = Dirichlet_boundary([0.2,0.,0.])
466
467    Bw = Time_boundary(domain=domain,
468                f=lambda t: [(0.1*sin(t*2*pi)-0.3), 0.0, 0.0])
469\end{verbatim}}
470
471The effect of these statements is to set up a selection of different
472alternative boundary conditions and store them in variables that can be
473assigned as needed. Each boundary condition specifies the
474behaviour at a boundary in terms of the behaviour in neighbouring
475elements. The boundary conditions introduced here may be briefly described as
476follows:
477
478\begin{itemize}
479    \item \textbf{Reflective boundary}\label{def:reflective boundary} Returns same \code{stage} as
480      as present in its neighbour volume but momentum vector
481      reversed 180 degrees (reflected).
482      Specific to the shallow water equation as it works with the
483      momentum quantities assumed to be the second and third conserved
484      quantities. A reflective boundary condition models a solid wall.
485    \item \textbf{Transmissive boundary}\label{def:transmissive boundary} Returns same conserved quantities as
486      those present in its neighbour volume. This is one way of modelling
487      outflow from a domain, but it should be used with caution if flow is
488      not steady state as replication of momentum at the boundary
489      may cause occasional spurious effects. If this occurs,
490      consider using e.g. a Dirichlet boundary condition.
491    \item \textbf{Dirichlet boundary}\label{def:dirichlet boundary} Specifies
492      constant values for stage, $x$-momentum and $y$-momentum at the boundary.
493    \item \textbf{Time boundary}\label{def:time boundary} Like a Dirichlet
494      boundary but with behaviour varying with time.
495\end{itemize}
496
497\label{ref:tagdescription}Before describing how these boundary
498conditions are assigned, we recall that a mesh is specified using
499three variables \code{points}, \code{vertices} and \code{boundary}.
500In the code we are discussing, these three variables are returned by
501the function \code{rectangular}; however, the example given in
502Section \ref{sec:realdataexample} illustrates another way of
503assigning the values, by means of the function
504\code{create\_mesh\_from\_regions}.
505
506These variables store the data determining the mesh as follows. (You
507may find that the example given in Section \ref{sec:meshexample}
508helps to clarify the following discussion, even though that example
509is a \emph{non-rectangular} mesh.)
510
511\begin{itemize}
512\item The variable \code{points} stores a list of 2-tuples giving the
513coordinates of the mesh points.
514
515\item The variable \code{vertices} stores a list of 3-tuples of
516numbers, representing vertices of triangles in the mesh. In this
517list, the triangle whose vertices are \code{points[i]},
518\code{points[j]}, \code{points[k]} is represented by the 3-tuple
519\code{(i, j, k)}.
520
521\item The variable \code{boundary} is a Python dictionary that
522not only stores the edges that make up the boundary but also assigns
523symbolic tags to these edges to distinguish different parts of the
524boundary. An edge with endpoints \code{points[i]} and
525\code{points[j]} is represented by the 2-tuple \code{(i, j)}. The
526keys for the dictionary are the 2-tuples \code{[i, j]} corresponding
527to boundary edges in the mesh, and the values are the tags are used
528to label them. In the present example, the value \code{boundary[i,
529j]} assigned to \code{[i, j]} is one of the four tags \code{`left'},
530\code{`right'}, \code{`top'} or \code{`bottom'}, depending on
531whether the boundary edge represented by \code{(i, j)} occurs at the
532left, right, top or bottom of the rectangle bounding the mesh. The
533function \code{rectangular} automatically assigns these tags to the
534boundary edges when it generates the mesh.
535\end{itemize}
536
537The tags provide the means to assign different boundary conditions
538to an edge depending on which part of the boundary it belongs to.
539(In Section \ref{sec:realdataexample} we describe an example that
540uses different boundary tags---in general, the possible tags are not
541limited to `left', `right', `top' and `bottom', but can be selected
542by the user.)
543
544Using the boundary objects described above, we assign a boundary
545condition to each part of the boundary by means of a statement like
546
547{\small \begin{verbatim}
548    domain.set_boundary({'left': Br, 'right': Bw, 'top': Br, 'bottom': Br})
549\end{verbatim}}
550
551This statement stipulates that, in the current example, the right
552boundary varies with time, as defined by the lambda function, while the other
553boundaries are all reflective.
554
555The reader may wish to experiment by varying the choice of boundary
556types for one or more of the boundaries. (In the case of \code{Bd}
557and \code{Bw}, the three arguments in each case represent the
558\code{stage}, $x$-momentum and $y$-momentum, respectively.)
559
560{\small \begin{verbatim}
561    Bw = Time_boundary(domain=domain,
562                       f=lambda t: [(0.1*sin(t*2*pi)-0.3), 0.0, 0.0])
563\end{verbatim}}
564
565
566
567\subsection{Evolution}
568
569The final statement \nopagebreak[3]
570{\small \begin{verbatim}
571    for t in domain.evolve(yieldstep = 0.1, duration = 4.0):
572        print domain.timestepping_statistics()
573\end{verbatim}}
574
575causes the configuration of the domain to `evolve', over a series of
576steps indicated by the values of \code{yieldstep} and
577\code{duration}, which can be altered as required.  The value of
578\code{yieldstep} controls the time interval between successive model
579outputs.  Behind the scenes more time steps are generally taken.
580
581
582\subsection{Output}
583
584The output is a NetCDF file with the extension \code{.sww}. It
585contains stage and momentum information and can be used with the
586\code{swollen} (see Section \ref{sec:swollen})
587visualisation package to generate a visual display.
588See Section \ref{sec:file formats} (page \pageref{sec:file formats})
589for more on NetCDF and other file formats.
590
591The following is a listing of the screen output seen by the user
592when this example is run:
593
594\verbatiminput{examples/runupoutput.txt}
595
596
597\section{How to Run the Code}
598
599The code can be run in various ways:
600
601\begin{itemize}
602  \item{from a Windows or Unix command line} as in\ \code{python runup.py}
603  \item{within the Python IDLE environment}
604  \item{within emacs}
605  \item{within Windows, by double-clicking the \code{runup.py}
606  file.}
607\end{itemize}
608
609
610\section{Exploring the Model Output}
611
612The following figures are screenshots from the \anuga visualisation
613tool \code{swollen}. Figure \ref{fig:runupstart} shows the domain
614with water surface as specified by the initial condition, $t=0$.
615Figure \ref{fig:bedslope2} shows later snapshots for $t=2.3$ and
616$t=4$ where the system has been evolved and the wave is encroaching
617on the previously dry bed.  All figures are screenshots from an
618interactive animation tool called Swollen which is part of \anuga.
619Swollen is described in more detail is Section \ref{sec:swollen}.
620
621\begin{figure}[hbt]
622
623  \centerline{\includegraphics[width=75mm, height=75mm]
624    {examples/runupstart.eps}}
625
626  \caption{Bedslope example viewed with Swollen}
627  \label{fig:runupstart}
628\end{figure}
629
630
631\begin{figure}[hbt]
632
633  \centerline{
634    \includegraphics[width=75mm, height=75mm]{examples/runupduring.eps}
635    \includegraphics[width=75mm, height=75mm]{examples/runupend.eps}
636   }
637
638  \caption{Bedslope example viewed with Swollen}
639  \label{fig:bedslope2}
640\end{figure}
641
642
643
644
645\clearpage
646
647%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
648
649\section{An Example with Real Data}
650\label{sec:realdataexample} The following discussion builds on the
651concepts introduced through the \file{runup.py} example and
652introduces a second example, \file{run\_sydney.py}.  This refers to
653a real-life scenario, in which the domain of interest surrounds the
654Sydney region, and predominantly covers Sydney Harbour. A
655hypothetical tsunami wave is generated by a submarine mass failure
656situated on the edge of the continental shelf.
657
658\subsection{Overview}
659As in the case of \file{runup.py}, the actions carried
660out by the program can be organised according to this outline:
661
662\begin{enumerate}
663
664   \item Set up a triangular mesh.
665
666   \item Set certain parameters governing the mode of
667operation of the model---specifying, for instance, where to store the
668model output.
669
670   \item Input various quantities describing physical measurements, such
671as the elevation, to be specified at each mesh point (vertex).
672
673   \item Set up the boundary conditions.
674
675   \item Carry out the evolution of the model through a series of time
676steps and output the results, providing a results file that can be
677visualised.
678
679\end{enumerate}
680
681
682
683\subsection{The Code}
684
685Here is the code for \file{run\_sydney\_smf.py}:
686
687\verbatiminput{examples/runsydney.py}
688
689In discussing the details of this example, we follow the outline
690given above, discussing each major step of the code in turn.
691
692\subsection{Establishing the Mesh}
693
694One obvious way that the present example differs from
695\file{runup.py} is in the use of a more complex method to
696create the mesh. Instead of imposing a mesh structure on a
697rectangular grid, the technique used for this example involves
698building mesh structures inside polygons specified by the user,
699using a mesh-generator referred to as \code{pmesh}.
700
701In its simplest form, \code{pmesh} creates the mesh within a single
702polygon whose vertices are at geographical locations specified by
703the user. The user specifies the \emph{resolution}---that is, the
704maximal area of a triangle used for triangulation---and a triangular
705mesh is created inside the polygon using a mesh generation engine.
706On any given platform, the same mesh will be returned. Figure
707\ref{fig:pentagon} shows a simple example of this, in which the
708triangulation is carried out within a pentagon.
709
710
711\begin{figure}[hbt]
712
713  \caption{Mesh points are created inside the polygon}
714  \label{fig:pentagon}
715\end{figure}
716
717Boundary tags are not restricted to \code{`left'}, \code{`right'},
718\code{`bottom'} and \code{`top'}, as in the case of
719\file{runup.py}. Instead the user specifies a list of
720tags appropriate to the configuration being modelled.
721
722In addition, \code{pmesh} provides a way to adapt to geographic or
723other features in the landscape, whose presence may require an
724increase in resolution. This is done by allowing the user to specify
725a number of \emph{interior polygons}, each with a specified
726resolution, see Figure \ref{fig:interior meshes}. It is also
727possible to specify one or more `holes'---that is, areas bounded by
728polygons in which no triangulation is required.
729
730\begin{figure}[hbt]
731
732
733
734  \caption{Interior meshes with individual resolution}
735  \label{fig:interior meshes}
736\end{figure}
737
738In its general form, \code{pmesh} takes for its input a bounding
739polygon and (optionally) a list of interior polygons. The user
740specifies resolutions, both for the bounding polygon and for each of
741the interior polygons. Given this data, \code{pmesh} first creates a
742triangular mesh with varying resolution.
743
744The function used to implement this process is
745\function{create\_mesh\_from\_regions}. Its arguments include the
746bounding polygon and its resolution, a list of boundary tags, and a
747list of pairs \code{[polygon, resolution]}, specifying the interior
748polygons and their resolutions.
749
750In practice, the details of the polygons used are read from a
751separate file \file{project.py}. Here is a complete listing of
752\file{project.py}:
753
754\verbatiminput{examples/project.py}
755
756The resulting mesh is output to a \emph{mesh file}\index{mesh
757file}\label{def:mesh file}. This term is used to describe a file of
758a specific format used to store the data specifying a mesh. (There
759are in fact two possible formats for such a file: it can either be a
760binary file, with extension \code{.msh}, or an ASCII file, with
761extension \code{.tsh}. In the present case, the binary file format
762\code{.msh} is used. See Section \ref{sec:file formats} (page
763\pageref{sec:file formats}) for more on file formats.)
764
765The statements
766
767{\small \begin{verbatim}
768    interior_res = 5000%
769    interior_regions = [[project.harbour_polygon_2, interior_res],
770                    [project.botanybay_polygon_2, interior_res]]
771\end{verbatim}}
772
773are used to read in the specific polygons \code{project.harbour\_polygon\_2} and
774\code{botanybay\_polygon\_2} from \file{project.py} and assign a
775common resolution of 5000 to each. The statement
776
777{\small \begin{verbatim}
778    create_mesh_from_regions(project.diffpolygonall,
779                         boundary_tags= {'bottom': [0],
780                                         'right1': [1],
781                                         'right0': [2],
782                                         'right2': [3],
783                                         'top': [4],
784                                         'left1': [5],
785                                         'left2': [6],
786                                         'left3': [7]},
787                         maximum_triangle_area=100000,
788                         filename=meshname,
789                         interior_regions=interior_regions)
790\end{verbatim}}
791
792is then used to create the mesh, taking the bounding polygon to be
793the polygon \code{diffpolygonall} specified in \file{project.py}.
794The argument \code{boundary\_tags} assigns a dictionary, whose keys
795are the names of the boundary tags used for the bounding
796polygon---\code{`bottom'}, \code{`right0'}, \code{`right1'},
797\code{`right2'}, \code{`top'}, \code{`left1'}, \code{`left2'} and
798\code{`left3'}--- and whose values identify the indices of the
799segments associated with each of these tags. (The value associated
800with each boundary tag is a one-element list.)
801
802
803\subsection{Initialising the Domain}
804
805As with \file{runup.py}, once we have created the mesh, the next
806step is to create the data structure \code{domain}. We did this for
807\file{runup.py} by inputting lists of points and triangles and
808specifying the boundary tags directly. However, in the present case,
809we use a method that works directly with the mesh file
810\code{meshname}, as follows:
811
812
813{\small \begin{verbatim}
814    domain = Domain(meshname, use_cache=True, verbose=True)
815\end{verbatim}}
816
817Providing a filename instead of the lists used in \file{runup.py}
818above causes \code{Domain} to convert a mesh file \code{meshname}
819into an instance of \code{Domain}, allowing us to use methods like
820\method{set\_quantity} to set quantities and to apply other
821operations.
822
823%(In principle, the
824%second argument of \function{pmesh\_to\_domain\_instance} can be any
825%subclass of \class{Domain}, but for applications involving the
826%shallow-water wave equation, the second argument of
827%\function{pmesh\_to\_domain\_instance} can always be set simply to
828%\class{Domain}.)
829
830The following statements specify a basename and data directory, and
831identify quantities to be stored. For the first two, values are
832taken from \file{project.py}.
833
834{\small \begin{verbatim}
835    domain.set_name(project.basename)
836    domain.set_datadir(project.outputdir)
837    domain.set_quantities_to_be_stored(['stage', 'xmomentum',
838        'ymomentum'])
839\end{verbatim}}
840
841
842\subsection{Initial Conditions}
843Quantities for \file{runsydney.py} are set
844using similar methods to those in \file{runup.py}. However,
845in this case, many of the values are read from the auxiliary file
846\file{project.py} or, in the case of \code{elevation}, from an
847ancillary points file.
848
849
850
851\subsubsection{Stage}
852
853For the scenario we are modelling in this case, we use a callable
854object \code{tsunami\_source}, assigned by means of a function
855\function{slump\_tsunami}. This is similar to how we set elevation in
856\file{runup.py} using a function---however, in this case the
857function is both more complex and more interesting.
858
859The function returns the water displacement for all \code{x} and
860\code{y} in the domain. The water displacement is a double Gaussian
861function that depends on the characteristics of the slump (length,
862thickness, slope, etc), its location (origin) and the depth at that
863location.
864
865
866\subsubsection{Friction}
867
868We assign the friction exactly as we did for \file{runup.py}:
869
870{\small \begin{verbatim}
871    domain.set_quantity('friction', 0.0)
872\end{verbatim}}
873
874
875\subsubsection{Elevation}
876
877The elevation is specified by reading data from a file:
878
879{\small \begin{verbatim}
880    domain.set_quantity('elevation',
881                        filename = project.combineddemname + '.pts',
882                        use_cache = True,
883                        verbose = True)
884\end{verbatim}}
885
886However, before this step can be executed, some preliminary steps
887are needed to prepare the file from which the data is taken. Two
888source files are used for this data---their names are specified in
889the file \file{project.py}, in the variables \code{coarsedemname}
890and \code{finedemname}. They contain `coarse' and `fine' data,
891respectively---that is, data sampled at widely spaced points over a
892large region and data sampled at closely spaced points over a
893smaller subregion. The data in these files is combined through the
894statement
895
896{\small \begin{verbatim}
897combine_rectangular_points_files(project.finedemname + '.pts',
898                                 project.coarsedemname + '.pts',
899                                 project.combineddemname + '.pts')
900\end{verbatim}}
901
902The effect of this is simply to combine the datasets by eliminating
903any coarse data associated with points inside the smaller region
904common to both datasets. The name to be assigned to the resulting
905dataset is also derived from the name stored in the variable
906\code{combinedname} in the file \file{project.py}.
907
908\subsection{Boundary Conditions}
909
910Setting boundaries follows a similar pattern to the one used for
911\file{runup.py}, except that in this case we need to associate a
912boundary type with each of the
913boundary tag names introduced when we established the mesh. In place of the four
914boundary types introduced for \file{runup.py}, we use the reflective
915boundary for each of the
916eight tagged segments defined by \code{create_mesh_from_regions}:
917
918{\small \begin{verbatim}
919    Br = Reflective_boundary(domain)
920    domain.set_boundary( {'bottom': Br, 'right1': Br, 'right0': Br,
921                          'right2': Br, 'top': Br, 'left1': Br,
922                          'left2': Br, 'left3': Br} )
923\end{verbatim}}
924
925\subsection{Evolution}
926
927With the basics established, the running of the `evolve' step is
928very similar to the corresponding step in \file{runup.py}. Here,
929the simulation is run for five hours (18000 seconds) with
930the output stored every two minutes (120 seconds).
931
932{\small \begin{verbatim}
933    import time t0 = time.time()
934
935    for t in domain.evolve(yieldstep = 120, duration = 18000):
936        print domain.timestepping_statistics()
937        print domain.boundary_statistics(tags = 'bottom')
938
939    print 'That took %.2f seconds' %(time.time()
940\end{verbatim}}
941
942%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
943%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
944
945\chapter{\anuga Public Interface}
946\label{ch:interface}
947
948This chapter gives an overview of the features of \anuga available
949to the user at the public interface. These are grouped under the
950following headings, which correspond to the outline of the examples
951described in Chapter \ref{ch:getstarted}:
952
953\begin{itemize}
954    \item Establishing the Mesh
955    \item Initialising the Domain
956    \item Specifying the Quantities
957    \item Initial Conditions
958    \item Boundary Conditions
959    \item Forcing Functions
960    \item Evolution
961\end{itemize}
962
963The listings are intended merely to give the reader an idea of what
964each feature is, where to find it and how it can be used---they do
965not give full specifications; for these the reader
966may consult the code. The code for every function or class contains
967a documentation string, or `docstring', that specifies the precise
968syntax for its use. This appears immediately after the line
969introducing the code, between two sets of triple quotes.
970
971Each listing also describes the location of the module in which
972the code for the feature being described can be found. All modules
973are in the folder \file{inundation} or one of its subfolders, and the
974location of each module is described relative to \file{inundation}. Rather
975than using pathnames, whose syntax depends on the operating system,
976we use the format adopted for importing the function or class for
977use in Python code. For example, suppose we wish to specify that the
978function \function{create\_mesh\_from\_regions} is in a module called
979\module{mesh\_interface} in a subfolder of \module{inundation} called
980\code{pmesh}. In Linux or Unix syntax, the pathname of the file
981containing the function, relative to \file{inundation}, would be
982
983\begin{center}
984%    \code{pmesh/mesh\_interface.py}
985    \code{pmesh}$\slash$\code{mesh\_interface.py}
986\end{center}
987
988while in Windows syntax it would be
989
990\begin{center}
991    \code{pmesh}$\backslash$\code{mesh\_interface.py}
992\end{center}
993
994Rather than using either of these forms, in this chapter we specify
995the location simply as \code{pmesh.mesh\_interface}, in keeping with
996the usage in the Python statement for importing the function,
997namely:
998\begin{center}
999    \code{from pmesh.mesh\_interface import create\_mesh\_from\_regions}
1000\end{center}
1001
1002Each listing details the full set of parameters for the class or
1003function; however, the description is generally limited to the most
1004important parameters and the reader is again referred to the code
1005for more details.
1006
1007The following parameters are common to many functions and classes
1008and are omitted from the descriptions given below:
1009
1010%\begin{center}
1011\begin{tabular}{ll}  %\hline
1012%\textbf{Name } & \textbf{Description}\\
1013%\hline
1014\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\\
1015\emph{verbose} & If \code{True}, provides detailed terminal output
1016to the user\\  % \hline
1017\end{tabular}
1018%\end{center}
1019
1020\section{Mesh Generation}
1021
1022Before discussing the part of the interface relating to mesh
1023generation, we begin with a description of a simple example of a
1024mesh and use it to describe how mesh data is stored.
1025
1026\label{sec:meshexample} Figure \ref{fig:simplemesh} represents a
1027very simple mesh comprising just 11 points and 10 triangles.
1028
1029
1030\begin{figure}[h]
1031  \begin{center}
1032    \includegraphics[width=90mm, height=90mm]{triangularmesh.eps}
1033  \end{center}
1034
1035  \caption{A simple mesh}
1036  \label{fig:simplemesh}
1037\end{figure}
1038
1039
1040The variables \code{points}, \code{vertices} and \code{boundary}
1041represent the data displayed in Figure \ref{fig:simplemesh} as
1042follows. The list \code{points} stores the coordinates of the
1043points, and may be displayed schematically as in Table
1044\ref{tab:points}.
1045
1046
1047\begin{table}
1048  \begin{center}
1049    \begin{tabular}[t]{|c|cc|} \hline
1050      index & \code{x} & \code{y}\\  \hline
1051      0 & 1 & 1\\
1052      1 & 4 & 2\\
1053      2 & 8 & 1\\
1054      3 & 1 & 3\\
1055      4 & 5 & 5\\
1056      5 & 8 & 6\\
1057      6 & 11 & 5\\
1058      7 & 3 & 6\\
1059      8 & 1 & 8\\
1060      9 & 4 & 9\\
1061      10 & 10 & 7\\  \hline
1062    \end{tabular}
1063  \end{center}
1064
1065  \caption{Point coordinates for mesh in
1066    Figure \protect \ref{fig:simplemesh}}
1067  \label{tab:points}
1068\end{table}
1069
1070The list \code{vertices} specifies the triangles that make up the
1071mesh. It does this by specifying, for each triangle, the indices
1072(the numbers shown in the first column above) that correspond to the
1073three points at its vertices, taken in an anti-clockwise order
1074around the triangle. Thus, in the example shown in Figure
1075\ref{fig:simplemesh}, the variable \code{vertices} contains the
1076entries shown in Table \ref{tab:vertices}. The starting point is
1077arbitrary so triangle $(0,1,3)$ is considered the same as $(1,3,0)$
1078and $(3,0,1)$.
1079
1080
1081\begin{table}
1082  \begin{center}
1083    \begin{tabular}{|c|ccc|} \hline
1084      index & \multicolumn{3}{c|}{\code{vertices}}\\ \hline
1085      0 & 0 & 1 & 3\\
1086      1 & 1 & 2 & 4\\
1087      2 & 2 & 5 & 4\\
1088      3 & 2 & 6 & 5\\
1089      4 & 4 & 5 & 9\\
1090      5 & 4 & 9 & 7\\
1091      6 & 3 & 4 & 7\\
1092      7 & 7 & 9 & 8\\
1093      8 & 1 & 4 & 3\\
1094      9 & 5 & 10 & 9\\  \hline
1095    \end{tabular}
1096  \end{center}
1097
1098  \caption{Vertices for mesh in Figure \protect \ref{fig:simplemesh}}
1099  \label{tab:vertices}
1100\end{table}
1101
1102Finally, the variable \code{boundary} identifies the boundary
1103triangles and associates a tag with each.
1104
1105\refmodindex[pmesh.meshinterface]{pmesh.mesh\_interface}\label{sec:meshgeneration}
1106
1107\begin{funcdesc}  {create\_mesh\_from\_regions}{bounding_polygon,
1108                             boundary_tags,
1109                             maximum_triangle_area,
1110                             filename=None,
1111                             interior_regions=None,
1112                             poly_geo_reference=None,
1113                             mesh_geo_reference=None,
1114                             minimum_triangle_angle=28.0}
1115Module: \module{pmesh.mesh\_interface}
1116
1117This function allows a user to initiate the automatic creation of a
1118mesh inside a specified polygon (input \code{bounding_polygon}).
1119Among the parameters that can be set are the \emph{resolution}
1120(maximal area for any triangle in the mesh) and the minimal angle
1121allowable in any triangle. The user can specify a number of internal
1122polygons within each of which a separate mesh is to be created,
1123generally with a smaller resolution. \code{interior_regions} is a
1124paired list containing the interior polygon and its resolution.
1125Additionally, the user specifies a list of boundary tags, one for
1126each edge of the bounding polygon.
1127\end{funcdesc}
1128
1129
1130
1131
1132\begin{classdesc}  {Mesh}{userSegments=None,
1133                 userVertices=None,
1134                 holes=None,
1135                 regions=None,
1136                 geo_reference=None}
1137Module: \module{pmesh.mesh}
1138
1139A class used to store a representation of a two-dimensional
1140triangular mesh. The user may initialise the class by specifying
1141lists of segments and/or vertices, using the parameters
1142\code{userSegments} and \code{userVertices}, and may also specify
1143lists of regions and/or holes, using the parameters \code{regions}
1144and \code{holes}.
1145\end{classdesc}
1146
1147
1148\subsection{Key Methods of Class Mesh}
1149
1150\begin{methoddesc} {add\_region}{}
1151
1152\end{methoddesc}
1153
1154\begin{methoddesc} {add\_hole}{}
1155
1156\end{methoddesc}
1157
1158
1159\begin{methoddesc}  {add\_region\_from\_polygon}{self, polygon, tags=None,
1160                                max_triangle_area=None, geo_reference=None}
1161Module: \module{pmesh.mesh}  Class: \class{Mesh}
1162
1163This method is used to add a region to a \class{Mesh} instance.  The
1164region is described by the input \code{polygon}.  Additionally, the
1165user specifies a list of boundary tags, one for each edge of the
1166bounding polygon.
1167
1168\end{methoddesc}
1169
1170
1171\begin{methoddesc}  {add\_hole\_from\_polygon}{self, polygon, tags=None,
1172    geo_reference=None}
1173Module: \module{pmesh.mesh}  Class: \class{Mesh}
1174
1175% Translate following into layman's language
1176This method is used to add a `hole' within a region ---that is, to
1177define a interior region where the triangular mesh will not be
1178generated---to a \class{Mesh} instance. The region is described by
1179the polygon passed in.  Additionally, the user specifies a list of
1180boundary tags, one for each edge of the bounding polygon.
1181\end{methoddesc}
1182
1183\begin{methoddesc}  {generate\_mesh}{self,
1184                      maximum_triangle_area=None,
1185                      minimum_triangle_angle=28.0,
1186                      verbose=False}
1187Module: \module{pmesh.mesh}  Class: \class{Mesh}
1188
1189% Translate following into layman's language
1190This method is used to generate the triangular mesh.  The  maximal
1191area of any triangle in the mesh can be specified, along with the
1192minimum angle in any triangle.
1193\end{methoddesc}
1194
1195
1196\begin{methoddesc}  {export\_mesh_file}{self,ofile}
1197Module: \module{pmesh.mesh}  Class: \class{Mesh}
1198
1199% Translate following into layman's language
1200This method is used to save the mesh to a file. \code{ofile} is the
1201name of the mesh file to be written, including the extension.  Use
1202the extension \code{.msh} for the file to be in NetCDF format and
1203\code{.tsh} for the file to be ASCII format.
1204\end{methoddesc}
1205
1206
1207\begin{methoddesc}  {import_ungenerate_file}{self,ofile, tag=None}
1208Module: \module{pmesh.mesh}  Class: \class{Mesh}
1209
1210% Translate following into layman's language
1211This method is used to import a polygon file in the ungenerate
1212format, which is used by arcGIS. The polygons are converted to
1213vertices and segments. \code{ofile} is the name of the polygon file.
1214\code{tag} is the tag given to all the polygon's segments.
1215
1216This function can be used to import building footprints.
1217\end{methoddesc}
1218
1219%%%%%%
1220\section{Initialising the Domain}
1221
1222%Include description of the class Domain and the module domain.
1223
1224%FIXME (Ole): This is also defined in a later chapter
1225%\declaremodule{standard}{pyvolution.domain}
1226
1227\begin{classdesc} {Domain} {source=None,
1228                 triangles=None,
1229                 boundary=None,
1230                 conserved_quantities=None,
1231                 other_quantities=None,
1232                 tagged_elements=None,
1233                 geo_reference=None,
1234                 use_inscribed_circle=False,
1235                 mesh_filename=None,
1236                 use_cache=False,
1237                 verbose=False,
1238                 full_send_dict=None,
1239                 ghost_recv_dict=None,
1240                 processor=0,
1241                 numproc=1}
1242Module: \refmodule{pyvolution.domain}
1243
1244This class is used to create an instance of a data structure used to
1245store and manipulate data associated with a mesh. The mesh is
1246specified either by assigning the name of a mesh file to
1247\code{source} or by
1248\end{classdesc}
1249
1250\begin{funcdesc}  {pmesh\_to\_domain\_instance}{file_name, DomainClass, use_cache = False, verbose = False}
1251Module: \module{pyvolution.pmesh2domain}
1252
1253Once the initial mesh file has been created, this function is
1254applied to convert it to a domain object---that is, to a member of
1255the special Python class \class{Domain} (or a subclass of
1256\class{Domain}), which provides access to properties and methods
1257that allow quantities to be set and other operations to be carried
1258out.
1259
1260\code{file\_name} is the name of the mesh file to be converted,
1261including the extension. \code{DomainClass} is the class to be
1262returned, which must be a subclass of \class{Domain} having the same
1263interface as \class{Domain}---in practice, it can usually be set
1264simply to \class{Domain}.
1265
1266This is now superseded by Domain(mesh_filename).
1267\end{funcdesc}
1268
1269
1270\subsection{Key Methods of Domain}
1271
1272\begin{methoddesc} {set\_name}{name}
1273    Module: \refmodule{pyvolution.domain}, page \pageref{mod:pyvolution.domain}  %\code{pyvolution.domain}
1274
1275    Assigns the name \code{name} to the domain.
1276\end{methoddesc}
1277
1278\begin{methoddesc} {get\_name}{}
1279    Module: \module{pyvolution.domain}
1280
1281    Returns the name assigned to the domain by \code{set\_name}. If no name has been
1282    assigned, returns \code{`domain'}.
1283\end{methoddesc}
1284
1285\begin{methoddesc} {set\_datadir}{name}
1286    Module: \module{pyvolution.domain}
1287
1288    Specifies the directory used for data, assigning it to the pathname \code{name}. The default value, before
1289    \code{set\_datadir} has been run, is the value \code{default\_datadir}
1290    specified in \code{config.py}.
1291
1292    Since different operating systems use different formats for specifying pathnames,
1293    it is necessary to specify path separators using the Python code \code{os.sep}, rather than
1294    the operating-specific ones such as `$\slash$' or `$\backslash$'.
1295    For this to work you will need to include the statement \code{import os}
1296    in your code, before the first appearance of \code{set\_datadir}.
1297
1298    For example, to set the data directory to a subdirectory
1299    \code{data} of the directory \code{project}, you could use
1300    the statements:
1301
1302    {\small \begin{verbatim}
1303        import os
1304        domain.set_datadir{'project' + os.sep + 'data'}
1305    \end{verbatim}}
1306\end{methoddesc}
1307
1308\begin{methoddesc} {get\_datadir}{}
1309    Module: \module{pyvolution.domain}
1310
1311    Returns the data directory set by \code{set\_datadir} or,
1312    if \code{set\_datadir} has not
1313    been run, returns the value \code{default\_datadir} specified in
1314    \code{config.py}.
1315\end{methoddesc}
1316
1317\begin{methoddesc} {set\_time}{time=0.0}
1318    Module: \module{pyvolution.domain}
1319
1320    Sets the initial time, in seconds, for the simulation. The
1321    default is 0.0.
1322\end{methoddesc}
1323
1324\begin{methoddesc} {set\_default\_order}{n}
1325    Sets the default (spatial) order to the value specified by
1326    \code{n}, which must be either 1 or 2. (Assigning any other value
1327    to \code{n} will cause an error.)
1328\end{methoddesc}
1329
1330
1331%%%%%%
1332\section{Initial Conditions}
1333\label{sec:Initial Conditions}
1334In standard usage of partial differential equations, initial conditions
1335refers to the values associated to the system variables (the conserved
1336quantities here) for \code{time = 0}. In setting up a scenario script
1337as described in Sections \ref{sec:simpleexample} and \ref{sec:realdataexample},
1338\code{set_quantity} is used to define the initial conditions of variables
1339other than the conserved quantities, such as friction. Here, we use the terminology
1340of initial conditions to refer to initial values for variables which need
1341prescription to solve the shallow water wave equation. Further, it must be noted
1342that \code{set_quantity} does not necessarily have to be used in the initial
1343condition setting; it can be used at any time throughout the simulation.
1344
1345\begin{methoddesc}{set\_quantity}{name,
1346    numeric = None,
1347    quantity = None,
1348    function = None,
1349    geospatial_data = None,
1350    filename = None,
1351    attribute_name = None,
1352    alpha = None,
1353    location = 'vertices',
1354    indices = None,
1355    verbose = False,
1356    use_cache = False}
1357  Module: \module{pyvolution.domain}
1358  (see also \module{pyvolution.quantity.set\_values})
1359
1360This function is used to assign values to individual quantities for a
1361domain. It is very flexible and can be used with many data types: a
1362statement of the form \code{domain.set\_quantity(name, x)} can be used
1363to define a quantity having the name \code{name}, where the other
1364argument \code{x} can be any of the following:
1365
1366\begin{itemize}
1367\item a number, in which case all vertices in the mesh gets that for
1368the quantity in question.
1369\item a list of numbers or a Numeric array ordered the same way as the mesh vertices.
1370\item a function (e.g.\ see the samples introduced in Chapter 2)
1371\item an expression composed of other quantities and numbers, arrays, lists (for
1372example, a linear combination of quantities, such as
1373\code{domain.set\_quantity('stage','elevation'+x))}
1374\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.
1375\item a geospatial dataset (See ?????). Optional argument attribute\_name applies here as with files.
1376\end{itemize}
1377
1378
1379Exactly one of the arguments
1380  numeric, quantity, function, points, filename
1381must be present.
1382
1383
1384Set quantity will look at the type of the second argument (\code{numeric}) and
1385determine what action to take.
1386
1387Values can also be set using the appropriate keyword arguments.
1388If 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)}
1389are all equivalent.
1390
1391
1392Other optional arguments are
1393\begin{itemize}
1394\item \code{indices} which is a list of ids of triangles to which set\_quantity should apply its assignment of values.
1395\item \code{location} determines which part of the triangles to assign to. Options are 'vertices' (default), 'edges', and 'centroids'.
1396\end{itemize}
1397
1398
1399\end{methoddesc}
1400
1401
1402
1403
1404
1405
1406
1407%%%
1408\anuga provides a number of predefined initial conditions to be used
1409with \code{set\_quantity}.
1410
1411\begin{funcdesc}{slump_tsunami}{length, depth, slope, width=None, thickness=None,
1412                x0=0.0, y0=0.0, alpha=0.0,
1413                gravity=9.8, gamma=1.85,
1414                massco=1, dragco=1, frictionco=0, psi=0,
1415                dx=None, kappa=3.0, kappad=0.8, zsmall=0.01,
1416                domain=None,
1417                verbose=False}
1418Module: \module{pyvolution.smf}
1419
1420This function returns a callable object representing an initial water
1421displacement generated by a submarine sediment failure. These failures can take the form of
1422a submarine slump or slide. In the case of a slide, use \code{slide_tsunami} instead.
1423
1424The arguments include as a minimum, the slump or slide length, the water depth to the centre of sediment
1425mass, and the bathymetric slope. Other slump or slide parameters can be included if they are known.
1426\end{funcdesc}
1427
1428
1429%%%
1430\begin{funcdesc}{file\_function}{filename,
1431    domain = None,
1432    quantities = None,
1433    interpolation_points = None,
1434    verbose = False,
1435    use_cache = False}
1436Module: \module{pyvolution.util}
1437
1438Reads the time history of spatial data for
1439specified interpolation points from a NetCDF file (\code{filename})
1440and returns
1441a callable object. \code{filename} could be a \code{sww} file.
1442Returns interpolated values based on the input
1443file using the underlying \code{interpolation\_function}.
1444
1445\code{quantities} is either the name of a single quantity to be
1446interpolated or a list of such quantity names. In the second case, the resulting
1447function will return a tuple of values---one for each quantity.
1448
1449\code{interpolation\_points} is a list of absolute UTM coordinates
1450for points at which values are sought.
1451
1452The model time stored within the file function can be accessed using
1453the method \code{f.get\_time()}
1454\end{funcdesc}
1455
1456%%%
1457\begin{classdesc}{Interpolation\_function}{self,
1458    time,
1459    quantities,
1460    quantity_names = None,
1461    vertex_coordinates = None,
1462    triangles = None,
1463    interpolation_points = None,
1464    verbose = False}
1465Module: \module{pyvolution.least\_squares}
1466
1467Given a time series, either as a sequence of numbers or defined at
1468the vertices of a triangular mesh (such as those stored in SWW
1469files), \code{Interpolation\_function} is used to create a callable
1470object that interpolates a value for an arbitrary time \code{t}
1471within the model limits and possibly a point \code{(x, y)} within a
1472mesh region.
1473
1474The actual time series at which data is available is specified by
1475means of an array \code{time} of monotonically increasing times. The
1476quantities containing the values to be interpolated are specified in
1477an array---or dictionary of arrays (used in conjunction with the
1478optional argument \code{quantity\_names}) --- called
1479\code{quantities}. The optional arguments \code{vertex\_coordinates}
1480and \code{triangles} represent the spatial mesh associated with the
1481quantity arrays. If omitted the function created by
1482\code{Interpolation\_function} will be a function of \code{t} only.
1483
1484Since, in practice, values need to be computed at specified points,
1485the syntax allows the user to specify, once and for all, a list
1486\code{interpolation\_points} of points at which values are required.
1487In this case, the function may be called using the form \code{f(t,
1488id)}, where \code{id} is an index for the list
1489\code{interpolation\_points}.
1490
1491\end{classdesc}
1492
1493%%%
1494%\begin{funcdesc}{set\_region}{functions}
1495%[Low priority. Will be merged into set\_quantity]
1496
1497%Module:\module{pyvolution.domain}
1498%\end{funcdesc}
1499
1500
1501
1502%%%%%%
1503\section{Boundary Conditions}
1504
1505\anuga provides a large number of predefined boundary conditions,
1506represented by objects such as \code{Reflective\_boundary(domain)} and
1507\code{Dirichlet\_boundary([0.2, 0.0, 0.0])}, described in the examples
1508in Chapter 2. Alternatively, you may prefer to ``roll your own'',
1509following the method explained in Section \ref{sec:roll your own}.
1510
1511These boundary objects may be used with the function \code{set\_boundary} described below
1512to assign boundary conditions according to the tags used to label boundary segments.
1513
1514\begin{methoddesc}{set\_boundary}{boundary_map}
1515Module: \module{pyvolution.domain}
1516
1517This function allows you to assign a boundary object (corresponding to a
1518pre-defined or user-specified boundary condition) to every boundary segment that
1519has been assigned a particular tag.
1520
1521This is done by specifying a dictionary \code{boundary\_map}, whose values are the boundary objects
1522and whose keys are the symbolic tags.
1523
1524\end{methoddesc}
1525
1526\begin{methoddesc} {get\_boundary\_tags}{}
1527Module: \module{pyvolution.mesh}
1528
1529Returns a list of the available boundary tags.
1530\end{methoddesc}
1531
1532%%%
1533\subsection{Predefined boundary conditions}
1534
1535\begin{classdesc}{Reflective\_boundary}{Boundary}
1536Module: \module{pyvolution.shallow\_water}
1537
1538Reflective boundary returns same conserved quantities as those present in
1539the neighbouring volume but reflected.
1540
1541This class is specific to the shallow water equation as it works with the
1542momentum quantities assumed to be the second and third conserved quantities.
1543\end{classdesc}
1544
1545%%%
1546\begin{classdesc}{Transmissive\_boundary}{domain = None}
1547Module: \module{pyvolution.generic\_boundary\_conditions}
1548
1549A transmissive boundary returns the same conserved quantities as
1550those present in the neighbouring volume.
1551
1552The underlying domain must be specified when the boundary is instantiated.
1553\end{classdesc}
1554
1555%%%
1556\begin{classdesc}{Dirichlet\_boundary}{conserved_quantities=None}
1557Module: \module{pyvolution.generic\_boundary\_conditions}
1558
1559A Dirichlet boundary returns constant values for each of conserved
1560quantities. In the example of \code{Dirichlet\_boundary([0.2, 0.0, 0.0])},
1561the \code{stage} value at the boundary is 0.2 and the \code{xmomentum} and
1562\code{ymomentum} at the boundary are set to 0.0. The list must contain
1563a value for each conserved quantity.
1564\end{classdesc}
1565
1566%%%
1567\begin{classdesc}{Time\_boundary}{domain = None, f = None}
1568Module: \module{pyvolution.generic\_boundary\_conditions}
1569
1570A time-dependent boundary returns values for the conserved
1571quantities as a function \code{f(t)} of time. The user must specify
1572the domain to get access to the model time.
1573\end{classdesc}
1574
1575%%%
1576\begin{classdesc}{File\_boundary}{Boundary}
1577Module: \module{pyvolution.generic\_boundary\_conditions}
1578
1579This method may be used if the user wishes to apply a SWW file or
1580a time series file to a boundary segment or segments.
1581The boundary values are obtained from a file and interpolated to the
1582appropriate segments for each conserved quantity.
1583\end{classdesc}
1584
1585
1586
1587%%%
1588\begin{classdesc}{Transmissive\_Momentum\_Set\_Stage\_boundary}{Boundary}
1589Module: \module{pyvolution.shallow\_water}
1590
1591This boundary returns same momentum conserved quantities as
1592those present in its neighbour volume but sets stage as in a Time\_boundary.
1593The underlying domain must be specified when boundary is instantiated
1594
1595This type of boundary is useful when stage is known at the boundary as a
1596function of time, but momenta (or speeds) aren't.
1597
1598This class is specific to the shallow water equation as it works with the
1599momentum quantities assumed to be the second and third conserved quantities.
1600\end{classdesc}
1601
1602
1603
1604\subsection{User-defined boundary conditions}
1605\label{sec:roll your own}
1606[How to roll your own] TBA
1607
1608
1609
1610
1611
1612\section{Forcing Functions}
1613
1614\anuga provides a number of predefined forcing functions to be used with .....
1615
1616%\begin{itemize}
1617
1618
1619%  \item \indexedcode{}
1620%  [function, arguments]
1621
1622%  \item \indexedcode{}
1623
1624%\end{itemize}
1625
1626
1627
1628\section{Evolution}
1629
1630  \begin{methoddesc}{evolve}{yieldstep = None, finaltime = None, duration = None, skip_initial_step = False}
1631
1632  Module: \module{pyvolution.domain}
1633
1634  This function (a method of \class{domain}) is invoked once all the
1635  preliminaries have been completed, and causes the model to progress
1636  through successive steps in its evolution, storing results and
1637  outputting statistics whenever a user-specified period
1638  \code{yieldstep} is completed (generally during this period the
1639  model will evolve through several steps internally
1640  as the method forces the water speed to be calculated
1641  on successive new cells). The user
1642  specifies the total time period over which the evolution is to take
1643  place, by specifying values (in seconds) for either \code{duration}
1644  or \code{finaltime}, as well as the interval in seconds after which
1645  results are to be stored and statistics output.
1646
1647  You can include \method{evolve} in a statement of the type:
1648
1649  {\small \begin{verbatim}
1650      for t in domain.evolve(yieldstep, finaltime):
1651          <Do something with domain and t>
1652  \end{verbatim}}
1653
1654  \end{methoddesc}
1655
1656
1657
1658\subsection{Diagnostics}
1659
1660
1661  \begin{funcdesc}{statistics}{}
1662  Module: \module{pyvolution.domain}
1663
1664  \end{funcdesc}
1665
1666  \begin{funcdesc}{timestepping\_statistics}{}
1667  Module: \module{pyvolution.domain}
1668
1669
1670  \end{funcdesc}
1671
1672
1673  \begin{funcdesc}{boundary\_statistics}{quantities = None, tags = None}
1674  Module: \module{pyvolution.domain}
1675
1676
1677  \end{funcdesc}
1678
1679
1680  \begin{funcdesc}{get\_quantity}{name, location='vertices', indices = None}
1681  Module: \module{pyvolution.domain}
1682  Allow access to individual quantities and their methods
1683
1684  \end{funcdesc}
1685
1686
1687  \begin{funcdesc}{get\_values}{location='vertices', indices = None}
1688  Module: \module{pyvolution.quantity}
1689
1690  Extract values for quantity as an array
1691
1692  \end{funcdesc}
1693
1694
1695  \begin{funcdesc}{get\_integral}{}
1696  Module: \module{pyvolution.quantity}
1697
1698  Return computed integral over entire domain for this quantity
1699
1700  \end{funcdesc}
1701
1702
1703\section{Other}
1704
1705  \begin{funcdesc}{domain.create\_quantity\_from\_expression}{???}
1706
1707  Handy for creating derived quantities on-the-fly.
1708  See \file{Analytical\_solution\_circular\_hydraulic\_jump.py} for an example of use.
1709  \end{funcdesc}
1710
1711
1712  \begin{classdesc}{Geospatial\_data}{data_points = None,
1713                 attributes = None,
1714                 geo_reference = None,
1715                 default_attribute_name = None,
1716                 file_name = None}
1717    Module: \module{geospatial\_data.geo\_spatial\_data}
1718    Creates a georeferenced geospatial data object from either arrays or
1719    a file (pts or xya).
1720
1721    Objects of this class can be used with \method{set\_quantity}.
1722
1723    FIXME (Ole): Describe methods such as get\_attributes() etc
1724  \end{classdesc}
1725
1726
1727
1728
1729
1730%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1731%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1732
1733\chapter{\anuga System Architecture}
1734
1735From pyvolution/documentation
1736
1737\section{File Formats}
1738\label{sec:file formats}
1739
1740\anuga makes use of a number of different file formats. The
1741following table lists all these formats, which are described in more
1742detail in the paragraphs below.
1743
1744\bigskip
1745
1746\begin{center}
1747
1748\begin{tabular}{|ll|}  \hline
1749
1750\textbf{Extension} & \textbf{Description} \\
1751\hline\hline
1752
1753\code{.sww} & NetCDF format for storing model output
1754\code{f(t,x,y)}\\
1755
1756\code{.tms} & NetCDF format for storing time series \code{f(t)}\\
1757
1758\code{.xya} & ASCII format for storing arbitrary points and
1759associated attributes\\
1760
1761\code{.pts} & NetCDF format for storing arbitrary points and
1762associated attributes\\
1763
1764\code{.asc} & ASCII format of regular DEMs as output from ArcView\\
1765
1766\code{.prj} & Associated ArcView file giving more metadata for
1767\code{.asc} format\\
1768
1769\code{.ers} & ERMapper header format of regular DEMs for ArcView\\
1770
1771\code{.dem} & NetCDF representation of regular DEM data\\
1772
1773\code{.tsh} & ASCII format for storing meshes and associated
1774boundary and region info\\
1775
1776\code{.msh} & NetCDF format for storing meshes and associated
1777boundary and region info\\
1778
1779\code{.nc} & Native ferret NetCDF format\\
1780
1781\code{.geo} & Houdinis ASCII geometry format (?) \\  \par \hline
1782%\caption{File formats used by \anuga}
1783\end{tabular}
1784
1785
1786\end{center}
1787
1788The above table shows the file extensions used to identify the
1789formats of files. However, typically, in referring to a format we
1790capitalise the extension and omit the initial full stop---thus, we
1791refer, for example, to `SWW files' or `PRJ files'.
1792
1793\bigskip
1794
1795A typical dataflow can be described as follows:
1796
1797\subsection{Manually Created Files}
1798
1799\begin{tabular}{ll}
1800ASC, PRJ & Digital elevation models (gridded)\\
1801TSH & Triangular meshes (e.g. created from \code{pmesh})\\
1802NC & Model outputs for use as boundary conditions (e.g. from MOST)
1803\end{tabular}
1804
1805\subsection{Automatically Created Files}
1806
1807\begin{tabular}{ll}
1808ASC, PRJ  $\rightarrow$  DEM  $\rightarrow$  PTS & Convert
1809DEMs to native \code{.pts} file\\
1810
1811NC $\rightarrow$ SWW & Convert MOST boundary files to
1812boundary \code{.sww}\\
1813
1814PTS + TSH $\rightarrow$ TSH with elevation & Least squares fit\\
1815
1816TSH $\rightarrow$ SWW & Convert TSH to \code{.sww}-viewable using
1817Swollen\\
1818
1819TSH + Boundary SWW $\rightarrow$ SWW & Simulation using
1820\code{pyvolution}
1821\end{tabular}
1822
1823
1824
1825
1826\bigskip
1827
1828\subsection{SWW and TMS Formats}
1829
1830The SWW and TMS formats are both NetCDF formats, and are of key
1831importance for \anuga.
1832
1833An SWW file is used for storing \anuga output and therefore pertains
1834to a set of points and a set of times at which a model is evaluated.
1835It contains, in addition to dimension information, the following
1836variables:
1837
1838\begin{itemize}
1839    \item \code{x} and \code{y}: coordinates of the points, represented as Numeric arrays
1840    \item \code{elevation}, a Numeric array storing bed-elevations
1841    \item \code{volumes}, a list specifying the points at the vertices of each of the
1842    triangles
1843    % Refer here to the example to be provided in describing the simple example
1844    \item \code{time}, a Numeric array containing times for model
1845    evaluation
1846\end{itemize}
1847
1848
1849The contents of an SWW file may be viewed using the visualisation
1850tool \code{swollen}, which creates an on-screen geometric
1851representation. See section \ref{sec:swollen} (page
1852\pageref{sec:swollen}) in Appendix \ref{ch:supportingtools} for more
1853on \code{swollen}.
1854
1855Alternatively, there are tools, such as \code{ncdump}, that allow
1856you to convert an NetCDF file into a readable format such as the
1857Class Definition Language (CDL). The following is an excerpt from a
1858CDL representation of the output file \file{bedslope.sww} generated
1859from running the simple example \file{runup.py} of
1860Chapter \ref{ch:getstarted}:
1861
1862\verbatiminput{examples/bedslopeexcerpt.cdl}
1863
1864The SWW format is used not only for output but also serves as input
1865for functions such as \function{file\_boundary} and
1866\function{file\_function}, described in Chapter \ref{ch:interface}.
1867
1868A TMS file is used to store time series data that is independent of
1869position.
1870
1871
1872\subsection{Mesh File Formats}
1873
1874A mesh file is a file that has a specific format suited to
1875specifying mesh data for \anuga. A mesh file can have one of two
1876formats: it can be either a TSH file, which is an ASCII file, or an
1877MSH file, which is a NetCDF file. A mesh file can be generated from
1878the function \function{create\_mesh\_from\_regions} (see Section
1879\ref{sec:meshgeneration}) and used to initialise a domain.
1880
1881A mesh file describes the outline of the mesh---the vertices and
1882line segments that enclose the region in which the mesh is
1883created---and the triangular mesh itself, which is specified by
1884listing the triangles and their vertices, and the segments, which
1885are those sides of the triangles that are associated with boundary
1886conditions.
1887
1888In addition, a mesh file may contain `holes' and/or `regions'. A
1889hole or region is defined by specifying a point and a number of
1890segments that enclose that point. A hole represents an area where no
1891mesh is to be created, while a region is a labelled area used for
1892defining properties of a mesh, such as friction values.
1893
1894A mesh file can also contain a georeference, which describes an
1895offset to be applied to $x$ and $y$ values---eg to the vertices.
1896
1897
1898\subsection{Formats for Storing Arbitrary Points and Attributes}
1899
1900An XYA file is used to store data representing arbitrary numerical
1901attributes associated with a set of points.
1902
1903The format for an XYA file is:\\
1904%\begin{verbatim}
1905
1906            first line:     \code{[attribute names]}\\
1907            other lines:  \code{x y [attributes]}\\
1908
1909            for example:\\
1910            \code{elevation, friction}\\
1911            \code{0.6, 0.7, 4.9, 0.3}\\
1912            \code{1.9, 2.8, 5, 0.3}\\
1913            \code{2.7, 2.4, 5.2, 0.3}
1914
1915        The first two columns are always implicitly assumed to be $x$, $y$ coordinates.
1916        Use the same delimiter for the attribute names and the data.
1917
1918        An XYA file can optionally end with a description of the georeference:
1919
1920            \code{\#geo reference}\\
1921            \code{56}\\
1922            \code{466600.0}\\
1923            \code{8644444.0}
1924
1925        Here the first number specifies the UTM zone (in this case zone 56)  and other numbers specify the
1926        easting and northing
1927        coordinates (in this case (466600.0, 8644444.0)) of the lower left corner.
1928
1929A PTS file is a NetCDF representation of the data held in an XYA
1930file. If the data is associated with a set of $N$ points, then the
1931data is stored using an $N \times 2$ Numeric array of float
1932variables for the points and an $N \times 1$ Numeric array for each
1933attribute.
1934
1935%\end{verbatim}
1936
1937\subsection{ArcView Formats}
1938
1939Files of the three formats ASC, PRJ and ERS are all associated with
1940data from ArcView.
1941
1942An ASC file is an ASCII representation of DEM output from ArcView.
1943It contains a header with the following format:
1944
1945\begin{tabular}{l l}
1946\code{ncols}      &   \code{753}\\
1947\code{nrows}      &   \code{766}\\
1948\code{xllcorner}  &   \code{314036.58727982}\\
1949\code{yllcorner}  & \code{6224951.2960092}\\
1950\code{cellsize}   & \code{100}\\
1951\code{NODATA_value} & \code{-9999}
1952\end{tabular}
1953
1954The remainder of the file contains the elevation data for each grid point
1955in the grid defined by the above information.
1956
1957A PRJ file is an ArcView file used in conjunction with an ASC file
1958to represent metadata for a DEM.
1959
1960
1961\subsection{DEM Format}
1962
1963A DEM file is a NetCDF representation of regular DEM data.
1964
1965
1966\subsection{Other Formats}
1967
1968
1969
1970
1971\subsection{Basic File Conversions}
1972
1973  \begin{funcdesc}{sww2dem}{basename_in, basename_out = None,
1974            quantity = None,
1975            timestep = None,
1976            reduction = None,
1977            cellsize = 10,
1978            NODATA_value = -9999,
1979            easting_min = None,
1980            easting_max = None,
1981            northing_min = None,
1982            northing_max = None,
1983            expand_search = False,
1984            verbose = False,
1985            origin = None,
1986            datum = 'WGS84',
1987            format = 'ers'}
1988  Module: \module{pyvolution.data\_manager}
1989
1990  Takes data from an SWW file \code{basename_in} and converts it to DEM format (ASC or
1991  ERS) of a desired grid size \code{cellsize} in metres.
1992  The easting and northing values are used if the user wished to clip the output
1993  file to a specified rectangular area. The \code{reduction} input refers to a function
1994  to reduce the quantities over all time step of the SWW file, example, maximum.
1995  \end{funcdesc}
1996
1997
1998  \begin{funcdesc}{dem2pts}{basename_in, basename_out=None,
1999            easting_min=None, easting_max=None,
2000            northing_min=None, northing_max=None,
2001            use_cache=False, verbose=False}
2002  Module: \module{pyvolution.data\_manager}
2003
2004  Takes DEM data (a NetCDF file representation of data from a regular Digital
2005  Elevation Model) and converts it to PTS format.
2006  \end{funcdesc}
2007
2008
2009
2010%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2011%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2012
2013\chapter{Basic \anuga Assumptions}
2014
2015(From pyvolution/documentation)
2016
2017
2018Physical model time cannot be earlier than 1 Jan 1970 00:00:00.
2019If one wished to recreate scenarios prior to that date it must be done
2020using some relative time (e.g. 0).
2021
2022
2023All spatial data relates to the WGS84 datum (or GDA94) and has been
2024projected into UTM with false easting of 500000 and false northing of
20251000000 on the southern hemisphere (0 on the northern).
2026
2027It is assumed that all computations take place within one UTM zone.
2028
2029DEMs, meshes and boundary conditions can have different origins within
2030one UTM zone. However, the computation will use that of the mesh for
2031numerical stability.
2032
2033
2034%OLD
2035%The dataflow is: (See data_manager.py and from scenarios)
2036%
2037%
2038%Simulation scenarios
2039%--------------------%
2040%%
2041%
2042%Sub directories contain scrips and derived files for each simulation.
2043%The directory ../source_data contains large source files such as
2044%DEMs provided externally as well as MOST tsunami simulations to be used
2045%as boundary conditions.
2046%
2047%Manual steps are:
2048%  Creation of DEMs from argcview (.asc + .prj)
2049%  Creation of mesh from pmesh (.tsh)
2050%  Creation of tsunami simulations from MOST (.nc)
2051%%
2052%
2053%Typical scripted steps are%
2054%
2055%  prepare_dem.py:  Convert asc and prj files supplied by arcview to
2056%                   native dem and pts formats%
2057%
2058%  prepare_pts.py: Convert netcdf output from MOST to an sww file suitable
2059%                  as boundary condition%
2060%
2061%  prepare_mesh.py: Merge DEM (pts) and mesh (tsh) using least squares
2062%                   smoothing. The outputs are tsh files with elevation data.%
2063%
2064%  run_simulation.py: Use the above together with various parameters to
2065%                     run inundation simulation.
2066
2067
2068%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2069%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2070
2071\appendix
2072
2073\chapter{Supporting Tools}
2074\label{ch:supportingtools}
2075
2076This section describes a number of supporting tools, supplied with \anuga, that offer a
2077variety of types of functionality and enhance the basic capabilities of \anuga.
2078
2079\section{caching}
2080
2081  The \code{cache} function is used to provide supervised caching of function results. A Python
2082  function call of the form
2083
2084      {\small \begin{verbatim}
2085      result = func(arg1,...,argn)
2086      \end{verbatim}}
2087
2088  can be replaced by
2089
2090      {\small \begin{verbatim}
2091      from caching import cache
2092      result = cache(func,(arg1,...,argn))
2093      \end{verbatim}}
2094
2095  which returns the same output but reuses cached
2096  results if the function has been computed previously in the same context.
2097  \code{result} and the arguments can be simple types, tuples, list, dictionaries or
2098  objects, but not unhashable types such as functions or open file objects.
2099  The function \code{func} may be a member function of an object or a module.
2100
2101  This type of caching is particularly useful for computationally intensive
2102  functions with few frequently used combinations of input arguments. Note that
2103  if the inputs or output are very large caching may not save time because
2104  disc access may dominate the execution time.
2105
2106  If the function definition changes after a result has been cached, this will be
2107  detected by examining the functions \code{bytecode (co\_code, co\_consts,
2108  func\_defaults, co\_argcount)} and the function will be recomputed.
2109  However, caching will not detect changes in modules used by \code{func}.
2110  In this case cache must be cleared manually.
2111
2112  Options are set by means of the function \code{set\_option(key, value)},
2113  where \code{key} is a key associated with a
2114  Python dictionary \code{options}. This dictionary stores settings such as the name of
2115  the directory used, the maximum
2116  number of cached files allowed, and so on.
2117
2118  The \code{cache} function allows the user also to specify a list of dependent files. If any of these
2119  have been changed, the function is recomputed and the results stored again.
2120
2121  %Other features include support for compression and a capability to \ldots
2122
2123
2124   \textbf{USAGE:} \nopagebreak
2125
2126    {\small \begin{verbatim}
2127    result = cache(func, args, kwargs, dependencies, cachedir, verbose,
2128                   compression, evaluate, test, return_filename)
2129    \end{verbatim}}
2130
2131
2132\section{swollen}
2133\label{sec:swollen}
2134 The output generated by \anuga may be viewed by
2135means of the visualisation tool \code{swollen}, which takes the
2136\code{SWW} file output by \anuga and creates a visual representation
2137of the data. Examples may be seen in Figures \ref{fig:runupstart}
2138and \ref{fig:bedslope2}. To view an \code{SWW} file with
2139\code{swollen} in the Windows environment, you can simply drag the
2140icon representing the file over an icon on the desktop for the
2141\code{swollen} executable file (or a shortcut to it), or set up a
2142file association to make files with the extension \code{.sww} open
2143with \code{swollen}. Alternatively, you can operate \code{swollen}
2144from the command line, in both Windows and Linux environments.
2145
2146On successful operation, you will see an interactive moving-picture
2147display. You can use keys and the mouse to slow down, speed up or
2148stop the display, change the viewing position or carry out a number
2149of other simple operations. Help is also displayed when you press
2150the \code{h} key.
2151
2152The main keys operating the interactive screen are:\\
2153
2154\begin{center}
2155\begin{tabular}{|ll|}   \hline
2156
2157\code{w} & toggle wireframe \\
2158
2159space bar & start/stop\\
2160
2161up/down arrows & increase/decrease speed\\
2162
2163left/right arrows & direction in time \emph{(when running)}\\
2164& step through simulation \emph{(when stopped)}\\
2165
2166left mouse button & rotate\\
2167
2168middle mouse button & pan\\
2169
2170right mouse button & zoom\\  \hline
2171
2172\end{tabular}
2173\end{center}
2174
2175\vfill
2176
2177The following table describes how to operate swollen from the command line:
2178
2179Usage: \code{swollen [options] swwfile \ldots}\\  \nopagebreak
2180Options:\\  \nopagebreak
2181\begin{tabular}{ll}
2182  \code{--display <type>} & \code{MONITOR | POWERWALL | REALITY\_CENTER |}\\
2183                                    & \code{HEAD\_MOUNTED\_DISPLAY}\\
2184  \code{--rgba} & Request a RGBA colour buffer visual\\
2185  \code{--stencil} & Request a stencil buffer visual\\
2186  \code{--stereo} & Use default stereo mode which is \code{ANAGLYPHIC} if not \\
2187                                    & overridden by environmental variable\\
2188  \code{--stereo <mode>} & \code{ANAGLYPHIC | QUAD\_BUFFER | HORIZONTAL\_SPLIT |}\\
2189                                    & \code{VERTICAL\_SPLIT | LEFT\_EYE | RIGHT\_EYE |}\\
2190                                     & \code{ON | OFF} \\
2191  \code{-alphamax <float 0-1>} & Maximum transparency clamp value\\
2192  \code{-alphamin <float 0-1>} & Transparency value at \code{hmin}\\
2193\end{tabular}
2194
2195\begin{tabular}{ll}
2196  \code{-cullangle <float angle 0-90>} & Cull triangles steeper than this value\\
2197  \code{-help} & Display this information\\
2198  \code{-hmax <float>} & Height above which transparency is set to
2199                                     \code{alphamax}\\
2200\end{tabular}
2201
2202\begin{tabular}{ll}
2203
2204  \code{-hmin <float>} & Height below which transparency is set to
2205                                     zero\\
2206\end{tabular}
2207
2208\begin{tabular}{ll}
2209  \code{-lightpos <float>,<float>,<float>} & $x,y,z$ of bedslope directional light ($z$ is
2210                                     up, default is overhead)\\
2211\end{tabular}
2212
2213\begin{tabular}{ll}
2214  \code{-loop}  & Repeated (looped) playback of \code{.swm} files\\
2215
2216\end{tabular}
2217
2218\begin{tabular}{ll}
2219  \code{-movie <dirname>} & Save numbered images to named directory and
2220                                     quit\\
2221
2222  \code{-nosky} & Omit background sky\\
2223
2224
2225  \code{-scale <float>} & Vertical scale factor\\
2226  \code{-texture <file>} & Image to use for bedslope topography\\
2227  \code{-tps <rate>} & Timesteps per second\\
2228  \code{-version} & Revision number and creation (not compile)
2229                                     date\\
2230\end{tabular}
2231
2232\section{utilities/polygons}
2233
2234  \declaremodule{standard}{utilities.polygon}
2235  \refmodindex{utilities.polygon}
2236
2237  \begin{classdesc}{Polygon\_function}{regions, default = 0.0, geo_reference = None}
2238  Module: \code{utilities.polygon}
2239
2240  Creates a callable object that returns one of a specified list of values when
2241  evaluated at a point \code{x, y}, depending on which polygon, from a specified list of polygons, the
2242  point belongs to. The parameter \code{regions} is a list of pairs
2243  \code{(P, v)}, where each \code{P} is a polygon and each \code{v}
2244  is either a constant value or a function of coordinates \code{x}
2245  and \code{y}, specifying the return value for a point inside \code{P}. The
2246  optional parameter \code{default} may be used to specify a value
2247  for a point not lying inside any of the specified polygons. When a
2248  point lies in more than one polygon, the return value is taken to
2249  be the value for whichever of these polygon appears later in the
2250  list.
2251  %FIXME (Howard): CAN x, y BE VECTORS?
2252
2253  \end{classdesc}
2254
2255  \begin{funcdesc}{read\_polygon}{filename}
2256  Module: \code{utilities.polygon}
2257
2258  Reads the specified file and returns a polygon. Each
2259  line of the file must contain exactly two numbers, separated by a comma, which are interpreted
2260  as coordinates of one vertex of the polygon.
2261  \end{funcdesc}
2262
2263  \begin{funcdesc}{populate\_polygon}{polygon, number_of_points, seed = None, exclude = None}
2264  Module: \code{utilities.polygon}
2265
2266  Populates the interior of the specified polygon with the specified number of points,
2267  selected by means of a uniform distribution function.
2268  \end{funcdesc}
2269
2270  \begin{funcdesc}{point\_in\_polygon}{polygon, delta=1e-8}
2271  Module: \code{utilities.polygon}
2272
2273  Returns a point inside the specified polygon and close to the edge. The distance between
2274  the returned point and the nearest point of the polygon is less than $\sqrt{2}$ times the
2275  second argument \code{delta}, which is taken as $10^{-8}$ by default.
2276  \end{funcdesc}
2277
2278  \begin{funcdesc}{inside\_polygon}{points, polygon, closed = True, verbose = False}
2279  Module: \code{utilities.polygon}
2280
2281  Used to test whether the members of a list of points
2282  are inside the specified polygon. Returns a Numeric
2283  array comprising the indices of the points in the list that lie inside the polygon.
2284  (If none of the points are inside, returns \code{zeros((0,), 'l')}.)
2285  Points on the edges of the polygon are regarded as inside if
2286  \code{closed} is set to \code{True} or omitted; otherwise they are regarded as outside.
2287  \end{funcdesc}
2288
2289  \begin{funcdesc}{outside\_polygon}{points, polygon, closed = True, verbose = False}
2290  Module: \code{utilities.polygon}
2291
2292  Exactly like \code{inside\_polygon}, but with the words `inside' and `outside' interchanged.
2293  \end{funcdesc}
2294
2295  \begin{funcdesc}{is\_inside\_polygon}{point, polygon, closed=True, verbose=False}
2296  Module: \code{utilities.polygon}
2297
2298  Returns \code{True} if \code{point} is inside \code{polygon} or
2299  \code{False} otherwise. Points on the edges of the polygon are regarded as inside if
2300  \code{closed} is set to \code{True} or omitted; otherwise they are regarded as outside.
2301  \end{funcdesc}
2302
2303  \begin{funcdesc}{is\_outside\_polygon}{point, polygon, closed=True, verbose=False}
2304  Module: \code{utilities.polygon}
2305
2306  Exactly like \code{is\_outside\_polygon}, but with the words `inside' and `outside' interchanged.
2307  \end{funcdesc}
2308
2309  \begin{funcdesc}{point\_on\_line}{x, y, x0, y0, x1, y1}
2310  Module: \code{utilities.polygon}
2311
2312  Returns \code{True} or \code{False}, depending on whether the point with coordinates
2313  \code{x, y} is on the line passing through the points with coordinates \code{x0, y0}
2314  and \code{x1, y1} (extended if necessary at either end).
2315  \end{funcdesc}
2316
2317  \begin{funcdesc}{separate\_points\_by\_polygon}{points, polygon, closed = True, verbose = False}
2318    \indexedcode{separate\_points\_by\_polygon}
2319  Module: \code{utilities.polygon}
2320
2321  \end{funcdesc}
2322
2323  \begin{funcdesc}{polygon\_area}{polygon}
2324  Module: \code{utilities.polygon}
2325
2326  Returns area of arbitrary polygon (reference http://mathworld.wolfram.com/PolygonArea.html)
2327  \end{funcdesc}
2328
2329  \begin{funcdesc}{plot\_polygons}{polygons, figname, verbose = False}
2330  Module: \code{utilities.polygon}
2331
2332  Plots each polygon contained in input polygon list, e.g.
2333 \code{polygons = [poly1, poly2, poly3]} where \code{poly1 = [[x11,y11],[x12,y12],[x13,y13]]}
2334 etc.  Each polygon is closed for plotting purposes and subsequent plot saved to \code{figname}.
2335  Returns list containing the minimum and maximum of \code{x} and \code{y},
2336  i.e. \code{[x_{min}, x_{max}, y_{min}, y_{max}]}.
2337  \end{funcdesc}
2338
2339\section{coordinate\_transforms}
2340
2341\section{geospatial\_data}
2342
2343This describes a class that represents arbitrary point data in UTM
2344coordinates along with named attribute values.
2345
2346%FIXME (Ole): This gives a LaTeX error
2347%\declaremodule{standard}{geospatial_data}
2348%\refmodindex{geospatial_data}
2349
2350
2351
2352\begin{classdesc}{Geospatial\_data}
2353  {data_points = None,
2354    attributes = None,
2355    geo_reference = None,
2356    default_attribute_name = None,
2357    file_name = None}
2358Module: \code{geospatial\_data}
2359
2360This class is used to store a set of data points and associated
2361attributes, allowing these to be manipulated by methods defined for
2362the class.
2363
2364The data points are specified either by reading them from a NetCDF
2365or XYA file, identified through the parameter \code{file\_name}, or
2366by providing their \code{x}- and \code{y}-coordinates in metres,
2367either as a sequence of 2-tuples of floats or as an $M \times 2$
2368Numeric array of floats, where $M$ is the number of points.
2369Coordinates are interpreted relative to the origin specified by the
2370object \code{geo\_reference}, which contains data indicating the UTM
2371zone, easting and northing. If \code{geo\_reference} is not
2372specified, a default is used.
2373
2374Attributes are specified through the parameter \code{attributes},
2375set either to a list or array of length $M$ or to a dictionary whose
2376keys are the attribute names and whose values are lists or arrays of
2377length $M$. One of the attributes may be specified as the default
2378attribute, by assigning its name to \code{default\_attribute\_name}.
2379If no value is specified, the default attribute is taken to be the
2380first one.
2381\end{classdesc}
2382
2383
2384\begin{methoddesc}{import\_points\_file}{delimiter = None, verbose = False}
2385
2386\end{methoddesc}
2387
2388
2389\begin{methoddesc}{export\_points\_file}{ofile, absolute=False}
2390
2391\end{methoddesc}
2392
2393
2394\begin{methoddesc}{get\_data\_points}{absolute = True}
2395
2396\end{methoddesc}
2397
2398
2399\begin{methoddesc}{set\_attributes}{attributes}
2400
2401\end{methoddesc}
2402
2403
2404\begin{methoddesc}{get\_attributes}{attribute_name = None}
2405
2406\end{methoddesc}
2407
2408
2409\begin{methoddesc}{get\_all\_attributes}{}
2410
2411\end{methoddesc}
2412
2413
2414\begin{methoddesc}{set\_default\_attribute\_name}{default_attribute_name}
2415
2416\end{methoddesc}
2417
2418
2419\begin{methoddesc}{set\_geo\_reference}{geo_reference}
2420
2421\end{methoddesc}
2422
2423
2424\begin{methoddesc}{add}{}
2425
2426\end{methoddesc}
2427
2428
2429\section{pmesh GUI}
2430
2431\section{alpha\_shape}
2432\emph{Alpha shapes} are used to generate close-fitting boundaries
2433around sets of points. The alpha shape algorithm produces a shape
2434that approximates to the `shape formed by the points'---or the shape
2435that would be seen by viewing the points from a coarse enough
2436resolution. For the simplest types of point sets, the alpha shape
2437reduces to the more precise notion of the convex hull. However, for
2438many sets of points the convex hull does not provide a close fit and
2439the alpha shape usually fits more closely to the original point set,
2440offering a better approximation to the shape being sought.
2441
2442In \anuga, an alpha shape is used to generate a polygonal boundary
2443around a set of points before mesh generation. The algorithm uses a
2444parameter $\alpha$ that can be adjusted to make the resultant shape
2445resemble the shape suggested by intuition more closely. An alpha
2446shape can serve as an initial boundary approximation that the user
2447can adjust as needed.
2448
2449The following paragraphs describe the class used to model an alpha
2450shape and some of the important methods and attributes associated
2451with instances of this class.
2452
2453\begin{classdesc}{Alpha\_Shape}{points, alpha = None}
2454Module: \code{alpha\_shape}
2455
2456To instantiate this class the user supplies the points from which
2457the alpha shape is to be created (in the form of a list of 2-tuples
2458\code{[[x1, y1],[x2, y2]}\ldots\code{]}, assigned to the parameter
2459\code{points}) and, optionally, a value for the parameter
2460\code{alpha}. The alpha shape is then computed and the user can then
2461retrieve details of the boundary through the attributes defined for
2462the class.
2463\end{classdesc}
2464
2465
2466\begin{funcdesc}{alpha\_shape\_via\_files}{point_file, boundary_file, alpha= None}
2467Module: \code{alpha\_shape}
2468
2469This function reads points from the specified point file
2470\code{point\_file}, computes the associated alpha shape (either
2471using the specified value for \code{alpha} or, if no value is
2472specified, automatically setting it to an optimal value) and outputs
2473the boundary to a file named \code{boundary\_file}. This output file
2474lists the coordinates \code{x, y} of each point in the boundary,
2475using one line per point.
2476\end{funcdesc}
2477
2478
2479\begin{methoddesc}{set\_boundary\_type}{self,raw_boundary=True,
2480                          remove_holes=False,
2481                          smooth_indents=False,
2482                          expand_pinch=False,
2483                          boundary_points_fraction=0.2}
2484Module: \code{alpha\_shape}  Class: \class{Alpha\_Shape}
2485
2486This function sets flags that govern the operation of the algorithm
2487that computes the boundary, as follows:
2488
2489\code{raw\_boundary = True} returns raw boundary, i.e. the regular edges of the
2490                alpha shape.\\
2491\code{remove\_holes = True} removes small holes (`small' is defined by
2492\code{boundary\_points\_fraction})\\
2493\code{smooth\_indents = True} removes sharp triangular indents in
2494boundary\\
2495\code{expand\_pinch = True} tests for pinch-off and
2496corrects---preventing a boundary vertex from having more than two edges.
2497\end{methoddesc}
2498
2499
2500\begin{methoddesc}{get\_boundary}{}
2501Module: \code{alpha\_shape}  Class: \class{Alpha\_Shape}
2502
2503Returns a list of tuples representing the boundary of the alpha
2504shape. Each tuple represents a segment in the boundary by providing
2505the indices of its two endpoints.
2506\end{methoddesc}
2507
2508
2509\begin{methoddesc}{write\_boundary}{file_name}
2510Module: \code{alpha\_shape}  Class: \class{Alpha\_Shape}
2511
2512Writes the list of 2-tuples returned by \code{get\_boundary} to the
2513file \code{file\_name}, using one line per tuple.
2514\end{methoddesc}
2515
2516\section{Numerical Tools}
2517
2518The following table describes some useful numerical functions that
2519may be found in the module \module{utilities.numerical\_tools}:
2520
2521\begin{tabular}{|p{8cm} p{8cm}|}  \hline
2522\code{angle(v1, v2=None)} & Angle between two-dimensional vectors
2523\code{v1} and \code{v2}, or between \code{v1} and the $x$-axis if
2524\code{v2} is \code{None}. Value is in range $0$ to $2\pi$. \\
2525
2526\code{normal\_vector(v)} & Normal vector to \code{v}.\\
2527
2528\code{mean(x)} & Mean value of a vector \code{x}.\\
2529
2530\code{cov(x, y=None)} & Covariance of vectors \code{x} and \code{y}.
2531If \code{y} is \code{None}, returns \code{cov(x, x)}.\\
2532
2533\code{err(x, y=0, n=2, relative=True)} & Relative error of
2534$\parallel$\code{x}$-$\code{y}$\parallel$ to
2535$\parallel$\code{y}$\parallel$ (2-norm if \code{n} = 2 or Max norm
2536if \code{n} = \code{None}). If denominator evaluates to zero or if
2537\code{y}
2538is omitted, absolute error is returned.\\
2539
2540\code{norm(x)} & 2-norm of \code{x}.\\
2541
2542\code{corr(x, y=None)} & Correlation of \code{x} and \code{y}. If
2543\code{y} is \code{None} returns autocorrelation of \code{x}.\\
2544
2545\code{ensure\_numeric(A, typecode = None)} & Ensure that sequence is
2546a Numeric array. If \code{A} is already a Numeric array it will be
2547returned unaltered. Otherwise, an attempt is made to convert it to a
2548Numeric array. (Needed because \code{array(A)} can
2549cause memory overflow.)\\
2550
2551\code{histogram(a, bins, relative=False)} & Standard histogram. If
2552\code{relative} is \code{True}, values will be normalised against
2553the total and thus represent frequencies rather than counts.\\
2554
2555\code{create\_bins(data, number\_of\_bins = None)} & Safely create
2556bins for use with histogram. If \code{data} contains only one point
2557or is constant, one bin will be created. If \code{number\_of\_bins}
2558is omitted, 10 bins will be created.\\  \hline
2559
2560\end{tabular}
2561
2562
2563\chapter{Modules available in \anuga}
2564
2565
2566\section{\module{pyvolution.general\_mesh} }
2567\declaremodule[pyvolution.generalmesh]{}{pyvolution.general\_mesh}
2568\label{mod:pyvolution.generalmesh}
2569
2570\section{\module{pyvolution.neighbour\_mesh} }
2571\declaremodule[pyvolution.neighbourmesh]{}{pyvolution.neighbour\_mesh}
2572\label{mod:pyvolution.neighbourmesh}
2573
2574\section{\module{pyvolution.domain} --- Generic module for 2D triangular domains for finite-volume computations of conservation laws}
2575\declaremodule{}{pyvolution.domain}
2576\label{mod:pyvolution.domain}
2577
2578
2579\section{\module{pyvolution.quantity}}
2580\declaremodule{}{pyvolution.quantity}
2581\label{mod:pyvolution.quantity}
2582
2583
2584Class Quantity - Implements values at each triangular element
2585
2586To create:
2587
2588   Quantity(domain, vertex_values)
2589
2590   domain: Associated domain structure. Required.
2591
2592   vertex_values: N x 3 array of values at each vertex for each element.
2593                  Default None
2594
2595   If vertex_values are None Create array of zeros compatible with domain.
2596   Otherwise check that it is compatible with dimenions of domain.
2597   Otherwise raise an exception
2598
2599
2600
2601\section{\module{pyvolution.shallow\_water} --- 2D triangular domains for finite-volume
2602computations of the shallow water wave equation. This module contains a specialisation
2603of class Domain from module domain.py consisting of methods specific to the Shallow Water
2604Wave Equation
2605}
2606\declaremodule[pyvolution.shallowwater]{}{pyvolution.shallow\_water}
2607\label{mod:pyvolution.shallowwater}
2608
2609
2610
2611
2612%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2613
2614\chapter{Frequently Asked Questions}
2615
2616
2617\section{General Questions}
2618
2619\subsubsection{What is \anuga?}
2620
2621\subsubsection{Why is it called \anuga?}
2622
2623\subsubsection{How do I obtain a copy of \anuga?}
2624
2625\subsubsection{What developments are expected for \anuga in the future?}
2626
2627\subsubsection{Are there any published articles about \anuga that I can reference?}
2628
2629\section{Modelling Questions}
2630
2631\subsubsection{Which type of problems are \anuga good for?}
2632
2633\subsubsection{Which type of problems are beyond the scope of \anuga?}
2634
2635\subsubsection{Can I start the simulation at an arbitrary time?}
2636Yes, using \code{domain.set\_time()} you can specify an arbitrary
2637starting time. This is for example useful in conjunction with a
2638file\_boundary, which may start hours before anything hits the model
2639boundary. By assigning a later time for the model to start,
2640computational resources aren't wasted.
2641
2642\subsubsection{Can I change values for any quantity during the simulation?}
2643Yes, using \code{domain.set\_quantity()} inside the domain.evolve
2644loop you can change values of any quantity. This is for example
2645useful if you wish to let the system settle for a while before
2646assigning an initial condition. Another example would be changing
2647the values for elevation to model e.g. erosion.
2648
2649\subsubsection{Can I change boundary conditions during the simulation?}
2650Not sure, but it would be nice :-)
2651
2652\subsubsection{Why does a file\_function return a list of numbers when evaluated?}
2653Currently, file\_function works by returning values for the conserved
2654quantities \code{stage}, \code{xmomentum} and \code{ymomentum} at a given point in time
2655and space as a triplet. To access e.g.\ \code{stage} one must specify element 0 of the
2656triplet returned by file\_function.
2657
2658\subsubsection{Which diagnostics are available to troubleshoot a simulation?}
2659
2660\subsubsection{How do I use a DEM in my simulation?}
2661You use \code{dem2pts} to convert your DEM to the required .pts format. This .pts file is then called
2662when setting the elevation data to the mesh in \code{domain.set_quantity}
2663
2664\subsubsection{What sort of DEM resolution should I use?}
2665Try and work with the \emph{best} you have available. Onshore DEMs
2666are typically available in 25m, 100m and 250m grids. Note, offshore
2667data is often sparse, or non-existent.
2668
2669\subsubsection{What sort of mesh resolution should I use?}
2670The 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,
2671if 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,
2672you need a fine mesh over regions where the DEM changes rapidly, and other areas of significant interest, such as the coast.
2673
2674
2675\subsubsection{How do I tag interior polygons?}
2676At the moment create_mesh_from_regions does not allow interior
2677polygons with symbolic tags. If tags are needed, the interior
2678polygons must be created subsequently. For example, given a filename
2679of polygons representing solid walls (in Arc Ungenerate format) can
2680be tagged as such using the code snippet:
2681\begin{verbatim}
2682  # Create mesh outline with tags
2683  mesh = create_mesh_from_regions(bounding_polygon,
2684                                  boundary_tags=boundary_tags)
2685  # Add buildings outlines with tags set to 'wall'. This would typically
2686  # bind to a Reflective boundary
2687  mesh.import_ungenerate_file(buildings_filename, tag='wall')
2688
2689  # Generate and write mesh to file
2690  mesh.generate_mesh(maximum_triangle_area=max_area)
2691  mesh.export_mesh_file(mesh_filename)
2692\end{verbatim}
2693
2694Note that a mesh object is returned from \code{create_mesh_from_regions}
2695when file name is omitted.
2696
2697\subsubsection{How often should I store the output?}
2698This 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
2699to look in detail at the evolution, then you will need to balance your storage requirements and the duration of the simulation.
2700If 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
2701quantities on a mesh with approximately 300000 triangles on a 2 min interval for 5 hours will result in approximately 350Mb SWW file
2702(as for the \file{run\_sydney\_smf.py} example).
2703
2704\subsection{Boundary Conditions}
2705
2706\subsubsection{How do I create a Dirichlet boundary condition?}
2707
2708A Dirichlet boundary condition sets a constant value for the
2709conserved quantities at the boundaries. A list containing
2710the constant values for stage, xmomentum and ymomentum is constructed
2711and used in the function call, e.g. \code{Dirichlet_boundary([0.2,0.,0.])}
2712
2713\subsubsection{How do I know which boundary tags are available?}
2714The method \code{domain.get\_boundary\_tags()} will return a list of
2715available tags for use with
2716\code{domain.set\_boundary\_condition()}.
2717
2718
2719
2720
2721
2722\chapter{Glossary}
2723
2724\begin{tabular}{|lp{10cm}|c|}  \hline
2725%\begin{tabular}{|llll|}  \hline
2726    \emph{Term} & \emph{Definition} & \emph{Page}\\  \hline
2727
2728    \indexedbold{\anuga} & Name of software (joint development between ANU and
2729    GA) & \pageref{def:anuga}\\
2730
2731    \indexedbold{bathymetry} & offshore elevation &\\
2732
2733    \indexedbold{conserved quantity} & conserved (stage, x and y
2734    momentum) & \\
2735
2736%    \indexedbold{domain} & The domain of a function is the set of all input values to the
2737%    function.&\\
2738
2739    \indexedbold{Digital Elevation Model (DEM)} & DEMs are digital files consisting of points of elevations,
2740sampled systematically at equally spaced intervals.& \\
2741
2742    \indexedbold{Dirichlet boundary} & A boundary condition imposed on a differential equation
2743 that specifies the values the solution is to take on the boundary of the
2744 domain. & \pageref{def:dirichlet boundary}\\
2745
2746    \indexedbold{edge} & A triangular cell within the computational mesh can be depicted
2747    as a set of vertices joined by lines (the edges). & \\
2748
2749    \indexedbold{elevation} & refers to bathymetry and topography &\\
2750
2751    \indexedbold{evolution} & integration of the shallow water wave equations
2752    over time &\\
2753
2754    \indexedbold{finite volume method} & The method evaluates the terms in the shallow water
2755    wave equation as fluxes at the surfaces of each finite volume. Because the
2756    flux entering a given volume is identical to that leaving the adjacent volume,
2757    these methods are conservative. Another advantage of the finite volume method is
2758    that it is easily formulated to allow for unstructured meshes. The method is used
2759    in many computational fluid dynamics packages. & \\
2760
2761    \indexedbold{forcing term} & &\\
2762
2763    \indexedbold{flux} & the amount of flow through the volume per unit
2764    time & \\
2765
2766    \indexedbold{grid} & Evenly spaced mesh & \\
2767
2768    \indexedbold{latitude} & The angular distance on a mericlear north and south of the
2769    equator, expressed in degrees and minutes. & \\
2770
2771    \indexedbold{longitude} & The angular distance east or west, between the meridian
2772    of a particular place on Earth and that of the Prime Meridian (located in Greenwich,
2773    England) expressed in degrees or time.& \\
2774
2775    \indexedbold{Manning friction coefficient} & &\\
2776
2777    \indexedbold{mesh} & Triangulation of domain &\\
2778
2779    \indexedbold{mesh file} & A TSH or MSH file & \pageref{def:mesh file}\\
2780
2781    \indexedbold{NetCDF} & &\\
2782
2783    \indexedbold{northing} & A rectangular (x,y) coordinate measurement of distance
2784    north from a north-south reference line, usually a meridian used as the axis of
2785    origin within a map zone or projection. Northing is a UTM (Universal Transverse
2786    Mercator) coordinate. & \\
2787
2788    \indexedbold{points file} & A PTS or XYA file & \\  \hline
2789
2790    \end{tabular}
2791
2792    \begin{tabular}{|lp{10cm}|c|}  \hline
2793
2794    \indexedbold{polygon} & A sequence of points in the plane. \anuga represents a polygon
2795    either as a list consisting of Python tuples or lists of length 2 or as an $N \times 2$
2796    Numeric array, where $N$ is the number of points.
2797
2798    The unit square, for example, would be represented either as
2799    \code{[ [0,0], [1,0], [1,1], [0,1] ]} or as \code{array( [0,0], [1,0], [1,1],
2800    [0,1] )}.
2801
2802    NOTE: For details refer to the module \module{utilities/polygon.py}. &
2803    \\     \indexedbold{resolution} &  The maximal area of a triangular cell in a
2804    mesh & \\
2805
2806
2807    \indexedbold{reflective boundary} & Models a solid wall. Returns same conserved
2808    quantities as those present in the neighbouring volume but reflected. Specific to the
2809    shallow water equation as it works with the momentum quantities assumed to be the
2810    second and third conserved quantities. & \pageref{def:reflective boundary}\\
2811
2812    \indexedbold{stage} & &\\
2813
2814%    \indexedbold{try this}
2815
2816    \indexedbold{swollen} & visualisation tool used with \anuga & \pageref{sec:swollen}\\
2817
2818    \indexedbold{time boundary} & Returns values for the conserved
2819quantities as a function of time. The user must specify
2820the domain to get access to the model time. & \pageref{def:time boundary}\\
2821
2822    \indexedbold{topography} & onshore elevation &\\
2823
2824    \indexedbold{transmissive boundary} & & \pageref{def:transmissive boundary}\\
2825
2826    \indexedbold{vertex} & A point at which edges meet. & \\
2827
2828    \indexedbold{xmomentum} & conserved quantity (note, two-dimensional SWW equations say
2829    only \code{x} and \code{y} and NOT \code{z}) &\\
2830
2831    \indexedbold{ymomentum}  & conserved quantity & \\  \hline
2832
2833    \end{tabular}
2834
2835
2836%The \code{\e appendix} markup need not be repeated for additional
2837%appendices.
2838
2839
2840%
2841%  The ugly "%begin{latexonly}" pseudo-environments are really just to
2842%  keep LaTeX2HTML quiet during the \renewcommand{} macros; they're
2843%  not really valuable.
2844%
2845%  If you don't want the Module Index, you can remove all of this up
2846%  until the second \input line.
2847%
2848
2849%begin{latexonly}
2850%\renewcommand{\indexname}{Module Index}
2851%end{latexonly}
2852\input{mod\jobname.ind}        % Module Index
2853%
2854%begin{latexonly}
2855%\renewcommand{\indexname}{Index}
2856%end{latexonly}
2857\input{\jobname.ind}            % Index
2858
2859
2860
2861\end{document}
Note: See TracBrowser for help on using the repository browser.