1 
ahallam 
3003 

2 
jfenwick 
3989 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
3 
jfenwick 
4154 
% Copyright (c) 20032013 by University of Queensland 
4 
jfenwick 
3989 
% http://www.uq.edu.au 
5 
ahallam 
3003 
% 
6 


% Primary Business: Queensland, Australia 
7 


% Licensed under the Open Software License version 3.0 
8 


% http://www.opensource.org/licenses/osl3.0.php 
9 


% 
10 
jfenwick 
3989 
% Development until 2012 by Earth Systems Science Computational Center (ESSCC) 
11 


% Development since 2012 by School of Earth Sciences 
12 


% 
13 


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
14 
ahallam 
3003 

15 


The acoustic wave equation governs the propagation of pressure waves. Wave 
16 


types that obey this law tend to travel in liquids or gases where shear waves 
17 
ahallam 
3004 
or longitudinal style wave motion is not possible. An obvious example is sound 
18 
ahallam 
3003 
waves. 
19 



20 
ahallam 
3004 
The acoustic wave equation is defined as; 
21 
ahallam 
3003 
\begin{equation} 
22 


\nabla ^2 p  \frac{1}{c^2} \frac{\partial ^2 p}{\partial t^2} = 0 
23 


\label{eqn:acswave} 
24 


\end{equation} 
25 
ahallam 
3370 
where $p$ is the pressure, $t$ is the time and $c$ is the wave velocity. In this 
26 


chapter the acoustic wave equation is demonstrated. Important steps include the 
27 


translation of the Laplacian $\nabla^2$ to the \esc general form, the stiff 
28 
ahallam 
3373 
equation stability criterion and solving for the displacement or acceleration solution. 
29 
ahallam 
3003 

30 
ahallam 
3004 
\section{The Laplacian in \esc} 
31 
ahallam 
3373 
The Laplacian operator which can be written as $\Delta$ or $\nabla^2$, is 
32 
ahallam 
3370 
calculated via the divergence of the gradient of the object, which in this 
33 


example is the scalar $p$. Thus we can write; 
34 
ahallam 
3004 
\begin{equation} 
35 
ahallam 
3029 
\nabla^2 p = \nabla \cdot \nabla p = 
36 
jfenwick 
3308 
\sum_{i}^n 
37 


\frac{\partial^2 p}{\partial x^2_{i}} 
38 
ahallam 
3004 
\label{eqn:laplacian} 
39 


\end{equation} 
40 
ahallam 
3232 
For the two dimensional case in Cartesian coordinates \autoref{eqn:laplacian} 
41 
ahallam 
3004 
becomes; 
42 


\begin{equation} 
43 


\nabla^2 p = \frac{\partial^2 p}{\partial x^2} 
44 


+ \frac{\partial^2 p}{\partial y^2} 
45 


\end{equation} 
46 
ahallam 
3003 

47 
ahallam 
3004 
In \esc the Laplacian is calculated using the divergence representation and the 
48 
ahallam 
3370 
intrinsic functions \textit{grad()} and \textit{trace()}. The function 
49 
ahallam 
3004 
\textit{grad{}} will return the spatial gradients of an object. 
50 


For a rank 0 solution, this is of the form; 
51 


\begin{equation} 
52 


\nabla p = \left[ 
53 
jfenwick 
3308 
\frac{\partial p}{\partial x _{0}}, 
54 


\frac{\partial p}{\partial x _{1}} 
55 
ahallam 
3004 
\right] 
56 


\label{eqn:grad} 
57 


\end{equation} 
58 


Larger ranked solution objects will return gradient tensors. For example, a 
59 
jfenwick 
3308 
pressure field which acts in the directions $p _{0}$ and $p 
60 


_{1}$ would return; 
61 
ahallam 
3004 
\begin{equation} 
62 


\nabla p = \begin{bmatrix} 
63 
jfenwick 
3308 
\frac{\partial p _{0}}{\partial x _{0}} & 
64 


\frac{\partial p _{1}}{\partial x _{0}} \\ 
65 


\frac{\partial p _{0}}{\partial x _{1}} & 
66 


\frac{\partial p _{1}}{\partial x _{1}} 
67 
ahallam 
3004 
\end{bmatrix} 
68 


\label{eqn:gradrank1} 
69 


\end{equation} 
70 
ahallam 
3003 

71 
ahallam 
3232 
\autoref{eqn:grad} corresponds to the Linear PDE general form value 
72 
ahallam 
3373 
$X$. Notice however, that the general form contains the term $X 
73 
jfenwick 
3308 
_{i,j}$\footnote{This is the first derivative in the $j^{th}$ 
74 
ahallam 
3029 
direction for the $i^{th}$ component of the solution.}, 
75 
ahallam 
3370 
hence for a rank 0 object there is no need to do more then calculate the 
76 
ahallam 
3004 
gradient and submit it to the solver. In the case of the rank 1 or greater 
77 
ahallam 
3373 
object, it is also necessary to calculate the trace. This is the sum of the 
78 
ahallam 
3232 
diagonal in \autoref{eqn:gradrank1}. 
79 
ahallam 
3004 

80 


Thus when solving for equations containing the Laplacian one of two things must 
81 
ahallam 
3392 
be completed. If the object \verb!p! is less than rank 1 the gradient is 
82 
ahallam 
3004 
calculated via; 
83 
ahallam 
3025 
\begin{python} 
84 
ahallam 
3063 
gradient=grad(p) 
85 
ahallam 
3025 
\end{python} 
86 
ahallam 
3370 
and if the object is greater then or equal to a rank 1 tensor, the trace of 
87 
ahallam 
3004 
the gradient is calculated. 
88 
ahallam 
3025 
\begin{python} 
89 
ahallam 
3004 
gradient=trace(grad(p)) 
90 
ahallam 
3025 
\end{python} 
91 
ahallam 
3370 
These values can then be submitted to the PDE solver via the general form term 
92 
ahallam 
3004 
$X$. The Laplacian is then computed in the solution process by taking the 
93 


divergence of $X$. 
94 



95 
ahallam 
3025 
Note, if you are unsure about the rank of your tensor, the \textit{getRank} 
96 


command will return the rank of the PDE object. 
97 


\begin{python} 
98 


rank = p.getRank() 
99 


\end{python} 
100 



101 



102 


\section{Numerical Solution Stability} \label{sec:nsstab} 
103 
ahallam 
3004 
Unfortunately, the wave equation belongs to a class of equations called 
104 


\textbf{stiff} PDEs. These types of equations can be difficult to solve 
105 
ahallam 
3373 
numerically as they tend to oscillate about the exact solution, which can 
106 
ahallam 
3370 
eventually lead to a catastrophic failure. To counter this problem, explicitly 
107 
ahallam 
3373 
stable schemes like the backwards Euler method, and correct parameterisation of 
108 
ahallam 
3370 
the problem are required. 
109 



110 


There are two variables which must be considered for 
111 


stability when numerically trying to solve the wave equation. For linear media, 
112 


the two variables are related via; 
113 
ahallam 
3004 
\begin{equation} \label{eqn:freqvel} 
114 


f=\frac{v}{\lambda} 
115 


\end{equation} 
116 
ahallam 
3025 
The velocity $v$ that a wave travels in a medium is an important variable. For 
117 
ahallam 
3370 
stability the analytical wave must not propagate faster then the numerical wave 
118 


is able to, and in general, needs to be much slower then the numerical wave. 
119 
ahallam 
3003 
For example, a line 100m long is discretised into 1m intervals or 101 nodes. If 
120 


a wave enters with a propagation velocity of 100m/s then the travel time for 
121 


the wave between each node will be 0.01 seconds. The time step, must therefore 
122 
caltinay 
4285 
be significantly less than this. Of the order $10E4$ would be appropriate. 
123 
ahallam 
3392 
This stability criterion is known as the Courant\textendash 
124 


Friedrichs\textendash Lewy condition given by 
125 
ahallam 
3384 
\begin{equation} 
126 


dt=f\cdot \frac{dx}{v} 
127 


\end{equation} 
128 


where $dx$ is the mesh size and $f$ is a safety factor. To obtain a time step of 
129 


$10E4$, a safety factor of $f=0.1$ was used. 
130 
ahallam 
3003 

131 
ahallam 
3004 
The wave frequency content also plays a part in numerical stability. The 
132 
ahallam 
3392 
Nyquistsampling theorem states that a signals bandwidth content will be 
133 
jfenwick 
3308 
accurately represented when an equispaced sampling rate $f _{n}$ is 
134 
ahallam 
3370 
equal to or greater then twice the maximum frequency of the signal 
135 
jfenwick 
3308 
$f_{s}$, or; 
136 
ahallam 
3004 
\begin{equation} \label{eqn:samptheorem} 
137 
jfenwick 
3308 
f_{n} \geqslant f_{s} 
138 
ahallam 
3004 
\end{equation} 
139 
ahallam 
3384 
For example, a 50Hz signal will require a sampling rate greater then 100Hz or 
140 
ahallam 
3004 
one sample every 0.01 seconds. The wave equation relies on a spatial frequency, 
141 
ahallam 
3373 
thus the sampling theorem in this case applies to the solution mesh spacing. 
142 


This relationship confirms that the frequency content of the input signal 
143 


directly affects the time discretisation of the problem. 
144 
ahallam 
3004 

145 


To accurately model the wave equation with high resolutions and velocities 
146 


means that very fine spatial and time discretisation is necessary for most 
147 
ahallam 
3384 
problems. This requirement makes the wave equation arduous to 
148 
ahallam 
3003 
solve numerically due to the large number of time iterations required in each 
149 
ahallam 
3004 
solution. Models with very high velocities and frequencies will be the worst 
150 
ahallam 
3029 
affected by this problem. 
151 
ahallam 
3003 

152 


\section{Displacement Solution} 
153 


\sslist{example07a.py} 
154 



155 


We begin the solution to this PDE with the centred difference formula for the 
156 


second derivative; 
157 


\begin{equation} 
158 


f''(x) \approx \frac{f(x+h  2f(x) + f(xh)}{h^2} 
159 


\label{eqn:centdiff} 
160 


\end{equation} 
161 
ahallam 
3232 
substituting \autoref{eqn:centdiff} for $\frac{\partial ^2 p }{\partial t ^2}$ 
162 


in \autoref{eqn:acswave}; 
163 
ahallam 
3003 
\begin{equation} 
164 
jfenwick 
3308 
\nabla ^2 p  \frac{1}{c^2h^2} \left[p_{(t+1)}  2p_{(t)} + 
165 


p_{(t1)} \right] 
166 
ahallam 
3003 
= 0 
167 


\label{eqn:waveu} 
168 


\end{equation} 
169 


Rearranging for $p_{(t+1)}$; 
170 


\begin{equation} 
171 
jfenwick 
3308 
p_{(t+1)} = c^2 h^2 \nabla ^2 p_{(t)} +2p_{(t)}  
172 


p_{(t1)} 
173 
ahallam 
3003 
\end{equation} 
174 


this can be compared with the general form of the \modLPDE module and it 
175 
jfenwick 
3308 
becomes clear that $D=1$, $X_{i,j}=c^2 h^2 \nabla ^2 p_{(t)}$ and 
176 
ahallam 
3004 
$Y=2p_{(t)}  p_{(t1)}$. 
177 
ahallam 
3003 

178 
ahallam 
3025 
The solution script is similar to others that we have created in previous 
179 
ahallam 
3004 
chapters. The general steps are; 
180 


\begin{enumerate} 
181 


\item The necessary libraries must be imported. 
182 


\item The domain needs to be defined. 
183 


\item The time iteration and control parameters need to be defined. 
184 


\item The PDE is initialised with source and boundary conditions. 
185 


\item The time loop is started and the PDE is solved at consecutive time steps. 
186 
ahallam 
3370 
\item All or select solutions are saved to file for visualisation later on. 
187 
ahallam 
3004 
\end{enumerate} 
188 



189 


Parts of the script which warrant more attention are the definition of the 
190 


source, visualising the source, the solution time loop and the VTK data export. 
191 



192 


\subsection{Pressure Sources} 
193 


As the pressure is a scalar, one need only define the pressure for two 
194 


time steps prior to the start of the solution loop. Two known solutions are 
195 


required because the wave equation contains a double partial derivative with 
196 


respect to time. This is often a good opportunity to introduce a source to the 
197 


solution. This model has the source located at it's centre. The source should 
198 


be smooth and cover a number of samples to satisfy the frequency stability 
199 
ahallam 
3370 
criterion. Small sources will generate high frequency signals. Here, when using 
200 


a rectangular domain, the source is defined by a cosine function. 
201 
ahallam 
3025 
\begin{python} 
202 
ahallam 
3004 
U0=0.01 # amplitude of point source 
203 


xc=[500,500] #location of point source 
204 


# define small radius around point xc 
205 


src_radius = 30 
206 


# for first two time steps 
207 
ahallam 
3025 
u=U0*(cos(length(xxc)*3.1415/src_radius)+1)*\ 
208 


whereNegative(length(xxc)src_radius) 
209 
ahallam 
3004 
u_m1=u 
210 
ahallam 
3025 
\end{python} 
211 
ahallam 
3004 

212 
ahallam 
3025 
\subsection{Visualising the Source} 
213 


There are two options for visualising the source. The first is to export the 
214 


initial conditions of the model to VTK, which can be interpreted as a scalar 
215 
ahallam 
3370 
surface in Mayavi2. The second is to take a cross section of the model which 
216 


will require the \textit{Locator} function. 
217 
ahallam 
3063 
First \verb!Locator! must be imported; 
218 
ahallam 
3025 
\begin{python} 
219 


from esys.escript.pdetools import Locator 
220 


\end{python} 
221 


The function can then be used on the domain to locate the nearest domain node 
222 


to the point or points of interest. 
223 



224 


It is now necessary to build a list of $(x,y)$ locations that specify where are 
225 
ahallam 
3370 
model slice will go. This is easily implemented with a loop; 
226 
ahallam 
3025 
\begin{python} 
227 


cut_loc=[] 
228 


src_cut=[] 
229 


for i in range(ndx/2ndx/10,ndx/2+ndx/10): 
230 


cut_loc.append(xstep*i) 
231 


src_cut.append([xstep*i,xc[1]]) 
232 


\end{python} 
233 
ahallam 
3063 
We then submit the output to \verb!Locator! and finally return the appropriate 
234 


values using the \verb!getValue! function. 
235 
ahallam 
3025 
\begin{python} 
236 
ahallam 
3373 
src=Locator(mydomain,src_cut) 
237 
ahallam 
3025 
src_cut=src.getValue(u) 
238 


\end{python} 
239 
ahallam 
3370 
It is then a trivial task to plot and save the output using \mpl 
240 


(\autoref{fig:cxsource}). 
241 
ahallam 
3025 
\begin{python} 
242 
ahallam 
3373 
pl.plot(cut_loc,src_cut) 
243 
ahallam 
3025 
pl.axis([xc[0]src_radius*3,xc[0]+src_radius*3,0.,2*U0]) 
244 


pl.savefig(os.path.join(savepath,"source_line.png")) 
245 


\end{python} 
246 


\begin{figure}[h] 
247 
ahallam 
3029 
\centering 
248 
ahallam 
3063 
\includegraphics[width=6in]{figures/sourceline.png} 
249 
ahallam 
3025 
\caption{Cross section of the source function.} 
250 


\label{fig:cxsource} 
251 


\end{figure} 
252 



253 



254 


\subsection{Point Monitoring} 
255 


In the more general case where the solution mesh is irregular or specific 
256 


locations need to be monitored, it is simple enough to use the \textit{Locator} 
257 


function. 
258 


\begin{python} 
259 


rec=Locator(mydomain,[250.,250.]) 
260 


\end{python} 
261 
ahallam 
3029 
When the solution \verb u is updated we can extract the value at that point 
262 
ahallam 
3025 
via; 
263 


\begin{python} 
264 


u_rec=rec.getValue(u) 
265 


\end{python} 
266 
ahallam 
3063 
For consecutive time steps one can record the values from \verb!u_rec! in an 
267 


array initialised as \verb!u_rec0=[]! with; 
268 
ahallam 
3025 
\begin{python} 
269 


u_rec0.append(rec.getValue(u)) 
270 


\end{python} 
271 



272 


It can be useful to monitor the value at a single or multiple individual points 
273 


in the model during the modelling process. This is done using 
274 
ahallam 
3063 
the \verb!Locator! function. 
275 
ahallam 
3025 

276 



277 
ahallam 
3003 
\section{Acceleration Solution} 
278 


\sslist{example07b.py} 
279 



280 
ahallam 
3373 
An alternative method to the displacement solution, is to solve for the 
281 


acceleration $\frac{\partial ^2 p}{\partial t^2}$ directly. The displacement can 
282 


then be derived from the acceleration after a solution has been calculated 
283 


The acceleration is given by a modified form of \autoref{eqn:waveu}; 
284 
ahallam 
3003 
\begin{equation} 
285 


\nabla ^2 p  \frac{1}{c^2} a = 0 
286 


\label{eqn:wavea} 
287 


\end{equation} 
288 
jfenwick 
3308 
and can be solved directly with $Y=0$ and $X=c^2 \nabla ^2 p_{(t)}$. 
289 
ahallam 
3003 
After each iteration the displacement is reevaluated via; 
290 


\begin{equation} 
291 
jfenwick 
3308 
p_{(t+1)}=2p_{(t)}  p_{(t1)} + h^2a 
292 
ahallam 
3003 
\end{equation} 
293 



294 
ahallam 
3029 
\subsection{Lumping} 
295 
caltinay 
4286 
For \esc, the acceleration solution is preferred as it allows the use of matrix 
296 
ahallam 
3004 
lumping. Lumping or mass lumping as it is sometimes known, is the process of 
297 


aggressively approximating the density elements of a mass matrix into the main 
298 
caltinay 
4286 
diagonal. The use of Lumping is motivated by the simplicity of diagonal matrix 
299 
ahallam 
3004 
inversion. As a result, Lumping can significantly reduce the computational 
300 
ahallam 
3029 
requirements of a problem. Care should be taken however, as this 
301 


function can only be used when the $A$, $B$ and $C$ coefficients of the 
302 


general form are zero. 
303 
ahallam 
3003 

304 
ahallam 
3384 
More information about the lumping implementation used in \esc and its accuracy 
305 


can be found in the user guide. 
306 



307 
ahallam 
3004 
To turn lumping on in \esc one can use the command; 
308 
ahallam 
3025 
\begin{python} 
309 
ahallam 
3384 
mypde.getSolverOptions().setSolverMethod(mypde.getSolverOptions().HRZ_LUMPING) 
310 
ahallam 
3025 
\end{python} 
311 
ahallam 
3004 
It is also possible to check if lumping is set using; 
312 
ahallam 
3025 
\begin{python} 
313 
ahallam 
3004 
print mypde.isUsingLumping() 
314 
ahallam 
3025 
\end{python} 
315 
ahallam 
3004 

316 


\section{Stability Investigation} 
317 


It is now prudent to investigate the stability limitations of this problem. 
318 
ahallam 
3025 
First, we let the frequency content of the source be very small. If we define 
319 
ahallam 
3370 
the source as a cosine input, then the wavlength of the input is equal to the 
320 
ahallam 
3025 
radius of the source. Let this value be 5 meters. Now, if the maximum velocity 
321 
ahallam 
3373 
of the model is $c=380.0ms^{1}$, then the source 
322 
jfenwick 
3308 
frequency is $f_{r} = \frac{380.0}{5} = 76.0 Hz$. This is a worst case 
323 
ahallam 
3025 
scenario with a small source and the models maximum velocity. 
324 



325 
ahallam 
3232 
Furthermore, we know from \autoref{sec:nsstab}, that the spatial sampling 
326 
ahallam 
3025 
frequency must be at least twice this value to ensure stability. If we assume 
327 


the model mesh is a square equispaced grid, 
328 


then the sampling interval is the side length divided by the number of samples, 
329 


given by $\Delta x = \frac{1000.0m}{400} = 2.5m$ and the maximum sampling 
330 


frequency capable at this interval is 
331 
jfenwick 
3308 
$f_{s}=\frac{380.0ms^{1}}{2.5m}=152Hz$ this is just equal to the 
332 
ahallam 
3232 
required rate satisfying \autoref{eqn:samptheorem}. 
333 
ahallam 
3004 

334 
ahallam 
3232 
\autoref{fig:ex07sampth} depicts three examples where the grid has been 
335 
ahallam 
3025 
undersampled, sampled correctly, and over sampled. The grids used had 
336 


200, 400 and 800 nodes per side respectively. Obviously, the oversampled grid 
337 


retains the best resolution of the modelled wave. 
338 
ahallam 
3004 

339 
ahallam 
3025 
The time step required for each of these examples is simply calculated from 
340 


the propagation requirement. For a maximum velocity of $380.0ms^{1}$, 
341 


\begin{subequations} 
342 


\begin{equation} 
343 


\Delta t \leq \frac{1000.0m}{200} \frac{1}{380.0} = 0.013s 
344 


\end{equation} 
345 


\begin{equation} 
346 


\Delta t \leq \frac{1000.0m}{400} \frac{1}{380.0} = 0.0065s 
347 


\end{equation} 
348 


\begin{equation} 
349 


\Delta t \leq \frac{1000.0m}{800} \frac{1}{380.0} = 0.0032s 
350 


\end{equation} 
351 


\end{subequations} 
352 
ahallam 
3373 
Observe that for each doubling of the number of nodes in the mesh, we halve 
353 


the time step. To illustrate the impact this has, consider our model. If the 
354 
ahallam 
3025 
source is placed at the center, it is $500m$ from the nearest boundary. With a 
355 


velocity of $380.0ms^{1}$ it will take $\approx1.3s$ for the wavefront to 
356 


reach that boundary. In each case, this equates to $100$, $200$ and $400$ time 
357 


steps. This is again, only a best case scenario, for true stability these time 
358 
ahallam 
3373 
values may need to be halved and possibly halved again. 
359 
ahallam 
3004 

360 
ahallam 
3025 
\begin{figure}[ht] 
361 


\centering 
362 


\subfigure[Undersampled Example]{ 
363 
caltinay 
3386 
\includegraphics[width=0.45\textwidth,trim=0cm 6cm 5cm 6cm,clip]{figures/ex07usamp.png} 
364 
ahallam 
3025 
\label{fig:ex07usamp} 
365 


} 
366 


\subfigure[Just sampled Example]{ 
367 
caltinay 
3386 
\includegraphics[width=0.45\textwidth,trim=0cm 6cm 5cm 6cm,clip]{figures/ex07jsamp.png} 
368 
ahallam 
3025 
\label{fig:ex07jsamp} 
369 


} 
370 


\subfigure[Over sampled Example]{ 
371 
caltinay 
3386 
\includegraphics[width=0.45\textwidth,trim=0cm 6cm 5cm 6cm,clip]{figures/ex07nsamp.png} 
372 
ahallam 
3025 
\label{fig:ex07nsamp} 
373 


} 
374 
caltinay 
3386 
\caption{Sampling Theorem example for stability investigation} 
375 
ahallam 
3373 
\label{fig:ex07sampth} 
376 
ahallam 
3025 
\end{figure} 
377 
ahallam 
3004 
