 # Diff of /trunk/doc/cookbook/example07.tex

revision 3004 by ahallam, Wed Apr 14 05:27:30 2010 UTC revision 3025 by ahallam, Thu May 6 01:20:46 2010 UTC
75  Thus when solving for equations containing the Laplacian one of two things must  Thus when solving for equations containing the Laplacian one of two things must
76  be completed. If the object \verb p   is less than rank 1 the gradient is  be completed. If the object \verb p   is less than rank 1 the gradient is
77  calculated via;  calculated via;
78  \begin{verbatim}  \begin{python}
80  \end{verbatim}  \end{python}
81  and if the object is greater thank or equal to a rank 1 tensor, the trace of  and if the object is greater thank or equal to a rank 1 tensor, the trace of
83  \begin{verbatim}  \begin{python}
85  \end{verbatim}  \end{python}

86  These valuse can then be submitted to the PDE solver via the general form term  These valuse can then be submitted to the PDE solver via the general form term
87  $X$. The Laplacian is then computed in the solution process by taking the  $X$. The Laplacian is then computed in the solution process by taking the
88  divergence of $X$.  divergence of $X$.
89
90  \section{Numerical Solution Stability}  Note, if you are unsure about the rank of your tensor, the \textit{getRank}
91    command will return the rank of the PDE object.
92    \begin{python}
93     rank = p.getRank()
94    \end{python}
95
96
97    \section{Numerical Solution Stability} \label{sec:nsstab}
98  Unfortunately, the wave equation belongs to a class of equations called  Unfortunately, the wave equation belongs to a class of equations called
99  \textbf{stiff} PDEs. These types of equations can be difficult to solve  \textbf{stiff} PDEs. These types of equations can be difficult to solve
100  numerically as they tend to oscilate about the exact solution and can  numerically as they tend to oscilate about the exact solution which can
101  eventually fail. To counter this problem, explicitly stable schemes like  eventually lead to a catastrophic failure in the solution. To counter this
102    problem, explicitly stable schemes like
103  the backwards Euler method are required. There are two variables which must be  the backwards Euler method are required. There are two variables which must be
104  considered for stability when numerically trying to solve the wave equation.  considered for stability when numerically trying to solve the wave equation.
105    For linear media, the two variables are related via;
106  \begin{equation} \label{eqn:freqvel}  \begin{equation} \label{eqn:freqvel}
107  f=\frac{v}{\lambda}  f=\frac{v}{\lambda}
108  \end{equation}  \end{equation}
109    The velocity $v$ that a wave travels in a medium is an important variable. For
110    stability the analytical wave must not propagate faster than the numerical wave
111  Velocity is one of these variables. For stability the  is able to, and in general, needs to be much slower than the numerical wave.
analytical wave must not propagate faster than the numerical wave is able to,
and in general, needs to be much slower than the numerical wave.
112  For example, a line 100m long is discretised into 1m intervals or 101 nodes. If  For example, a line 100m long is discretised into 1m intervals or 101 nodes. If
113  a wave enters with a propagation velocity of 100m/s then the travel time for  a wave enters with a propagation velocity of 100m/s then the travel time for
114  the wave between each node will be 0.01 seconds. The time step, must therefore  the wave between each node will be 0.01 seconds. The time step, must therefore
# Line 157  this can be compared with the general fo Line 162  this can be compared with the general fo
162  becomes clear that $D=1$, $X\hackscore{i,j}=-c^2 h^2 \nabla ^2 p_{(t)}$ and  becomes clear that $D=1$, $X\hackscore{i,j}=-c^2 h^2 \nabla ^2 p_{(t)}$ and
163  $Y=2p_{(t)} - p_{(t-1)}$.  $Y=2p_{(t)} - p_{(t-1)}$.
164
165  The solution script is similar to other that we have created in previous  The solution script is similar to others that we have created in previous
166  chapters. The general steps are;  chapters. The general steps are;
167  \begin{enumerate}  \begin{enumerate}
168   \item The necessary libraries must be imported.   \item The necessary libraries must be imported.
# Line 180  solution. This model has the source loca Line 185  solution. This model has the source loca
185  be smooth and cover a number of samples to satisfy the frequency stability  be smooth and cover a number of samples to satisfy the frequency stability
186  criterion. Small sources will generate high frequency signals. Here, the source  criterion. Small sources will generate high frequency signals. Here, the source
187  is defined by a cosine function.  is defined by a cosine function.
188  \begin{verbatim}  \begin{python}
189  U0=0.01 # amplitude of point source  U0=0.01 # amplitude of point source
190  xc=[500,500] #location of point source  xc=[500,500] #location of point source
191  # define small radius around point xc  # define small radius around point xc
193  # for first two time steps  # for first two time steps
196  u_m1=u  u_m1=u
197  \end{verbatim}  \end{python}
198  When using a rectangular domain  When using a rectangular domain
199
200    \subsection{Visualising the Source}
201    There are two options for visualising the source. The first is to export the
202    initial conditions of the model to VTK, which can be interpreted as a scalar
203    suface in mayavi. The second is to take a cross section of the model.
204
205    For the later, we will require the \textit{Locator} function.
206    First \verb Locator  must be imported;
207    \begin{python}
208     from esys.escript.pdetools import Locator
209    \end{python}
210    The function can then be used on the domain to locate the nearest domain node
211    to the point or points of interest.
212
213    It is now necessary to build a list of $(x,y)$ locations that specify where are
214    model slice will go. This is easily implemeted with a loop;
215    \begin{python}
216    cut_loc=[]
217    src_cut=[]
218    for i in range(ndx/2-ndx/10,ndx/2+ndx/10):
219        cut_loc.append(xstep*i)
220        src_cut.append([xstep*i,xc])
221    \end{python}
222    We then submit the output to \verb Locator  and finally return the appropriate
223    values using the \verb getValue  function.
224    \begin{python}
225     src=Locator(mydomain,src_cut)
226    src_cut=src.getValue(u)
227    \end{python}
228    It is then a trivial task to plot and save the output using \mpl.
229    \begin{python}
230     pl.plot(cut_loc,src_cut)
232    pl.savefig(os.path.join(savepath,"source_line.png"))
233    \end{python}
234    \begin{figure}[h]
235     \includegraphics[width=5in]{figures/sourceline.png}
236     \caption{Cross section of the source function.}
237     \label{fig:cxsource}
238    \end{figure}
239
240
241    \subsection{Point Monitoring}
242    In the more general case where the solution mesh is irregular or specific
243    locations need to be monitored, it is simple enough to use the \textit{Locator}
244    function.
245    \begin{python}
246     rec=Locator(mydomain,[250.,250.])
247    \end{python}
248     When the solution \verb u  is update we can extract the value at that point
249    via;
250    \begin{python}
251     u_rec=rec.getValue(u)
252    \end{python}
253    For consecutive time steps one can record the values from \verb u_rec  in an
254    array initialised as \verb u_rec0=[]  with;
255    \begin{python}
256      u_rec0.append(rec.getValue(u))
257    \end{python}
258
259    It can be useful to monitor the value at a single or multiple individual points
260    in the model during the modelling process. This is done using
261    the \verb Locator  function.
262
263
264  \section{Acceleration Solution}  \section{Acceleration Solution}
265  \sslist{example07b.py}  \sslist{example07b.py}
266
# Line 216  diagonal. The use of Lumping is motivaed Line 285  diagonal. The use of Lumping is motivaed
285  requirements of a problem.  requirements of a problem.
286
287  To turn lumping on in \esc one can use the command;  To turn lumping on in \esc one can use the command;
288  \begin{verbatim}  \begin{python}
289   mypde.getSolverOptions().setSolverMethod(mypde.getSolverOptions().LUMPING)   mypde.getSolverOptions().setSolverMethod(mypde.getSolverOptions().LUMPING)
290  \end{verbatim}  \end{python}
291  It is also possible to check if lumping is set using;  It is also possible to check if lumping is set using;
292  \begin{verbatim}  \begin{python}
293    print mypde.isUsingLumping()    print mypde.isUsingLumping()
294  \end{verbatim}  \end{python}
295
296  \section{Stability Investigation}  \section{Stability Investigation}
297  It is now prudent to investigate the stability limitations of this problem.  It is now prudent to investigate the stability limitations of this problem.
298  First, we let the frequency content of the source be very small. If the radius  First, we let the frequency content of the source be very small. If we define
299  of the source which equals the wavelength is 5 meters, than the frequency is  the source as a cosine input, than the wavlength of the input is equal to the
300  the inverse of the wavelength  The velocity is $c=380.0ms^{-1}$ thus the source  radius of the source. Let this value be 5 meters. Now, if the maximum velocity
301  frequency is $f\hackscore{r} = \frac{380.0}{5} = 76.0 Hz$. The sampling  of the model is $c=380.0ms^{-1}$ then the source
302  frequency must be at least twice this. Assuming a rectangular equispaced grid,  frequency is $f\hackscore{r} = \frac{380.0}{5} = 76.0 Hz$. This is a worst case
303  the sampling interval is $\Delta x = \frac{1000.0}{400} = 2.5$ and the sampling  scenario with a small source and the models maximum velocity.
304  frequency $f\hackscore{s}=\frac{380.0}{2.5}=152$ this is just equal to the
305    Furthermore, we know from \refSec{sec:nsstab}, that the spatial sampling
306    frequency must be at least twice this value to ensure stability. If we assume
307    the model mesh is a square equispaced grid,
308    then the sampling interval is the side length divided by the number of samples,
309    given by $\Delta x = \frac{1000.0m}{400} = 2.5m$ and the maximum sampling
310    frequency capable at this interval is
311    $f\hackscore{s}=\frac{380.0ms^{-1}}{2.5m}=152Hz$ this is just equal to the
312  required rate satisfying \refeq{eqn:samptheorem}.  required rate satisfying \refeq{eqn:samptheorem}.
313
314    \reffig{fig:ex07sampth} depicts three examples where the grid has been
315    undersampled, sampled correctly, and over sampled. The grids used had
316    200, 400 and 800 nodes per side respectively. Obviously, the oversampled grid
317    retains the best resolution of the modelled wave.
318
319    The time step required for each of these examples is simply calculated from
320    the propagation requirement. For a maximum velocity of $380.0ms^{-1}$,
321    \begin{subequations}
322     \begin{equation}
323      \Delta t \leq \frac{1000.0m}{200} \frac{1}{380.0} = 0.013s
324     \end{equation}
325     \begin{equation}
326      \Delta t \leq \frac{1000.0m}{400} \frac{1}{380.0} = 0.0065s
327     \end{equation}
328     \begin{equation}
329      \Delta t \leq \frac{1000.0m}{800} \frac{1}{380.0} = 0.0032s
330     \end{equation}
331    \end{subequations}
332    We can see, that for each doubling of the number of nodes in the mesh, we halve
333    the timestep. To illustrate the impact this has, consider our model. If the
334    source is placed at the center, it is $500m$ from the nearest boundary. With a
335    velocity of $380.0ms^{-1}$ it will take $\approx1.3s$ for the wavefront to
336    reach that boundary. In each case, this equates to $100$,  $200$ and $400$ time
337    steps. This is again, only a best case scenario, for true stability these time
338    values may need to be halved and possibly havled again.
339
340    \begin{figure}[ht]
341    \centering
342    \subfigure[Undersampled Example]{
343    \includegraphics[width=3in]{figures/ex07usamp.png}
344    \label{fig:ex07usamp}
345    }
346    \subfigure[Just sampled Example]{
347    \includegraphics[width=3in]{figures/ex07jsamp.png}
348    \label{fig:ex07jsamp}
349    }
350    \subfigure[Over sampled Example]{
351    \includegraphics[width=3in]{figures/ex07nsamp.png}
352    \label{fig:ex07nsamp}
353    }
354    \label{fig:ex07sampth}
355    \caption{Sampling Theorem example for stability
356    investigation.}
357    \end{figure}
358
359
360
361
362

Legend:
 Removed from v.3004 changed lines Added in v.3025