From dd9c1efaf5eab342643f363e8bd4ab8012ba9596 Mon Sep 17 00:00:00 2001 From: couturie Date: Mon, 5 Aug 2013 11:53:55 +0200 Subject: [PATCH] new --- BookGPU/Chapters/chapter5/ch5.tex | 2 +- BookGPU/Chapters/chapter7/ch7.tex | 34 +++++++++--------- ...90-p6-vergrid0_Linear-eps-converted-to.pdf | Bin 7331 -> 16917 bytes ...n_Nx30-HL90-p6_Linear-eps-converted-to.pdf | Bin 7859 -> 18865 bytes 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/BookGPU/Chapters/chapter5/ch5.tex b/BookGPU/Chapters/chapter5/ch5.tex index 51a1f4d..dea460f 100644 --- a/BookGPU/Chapters/chapter5/ch5.tex +++ b/BookGPU/Chapters/chapter5/ch5.tex @@ -3,7 +3,7 @@ %\chapterauthor{Allan S. Nielsen}{Technical University of Denmark} %\chapterauthor{Bernd Dammann}{Technical University of Denmark} -\chapter[Development of software components for heterogeneous many-core architectures]{Development of software components for heterogeneous many-core architectures}\label{ch5} +\chapter[Software components for heterogeneous many-core architectures]{Development of software components for heterogeneous many-core architectures}\label{ch5} %Subjects: %\begin{itemize} diff --git a/BookGPU/Chapters/chapter7/ch7.tex b/BookGPU/Chapters/chapter7/ch7.tex index d1918d4..e74681b 100644 --- a/BookGPU/Chapters/chapter7/ch7.tex +++ b/BookGPU/Chapters/chapter7/ch7.tex @@ -393,7 +393,7 @@ The profiles can be reversed by a change of coordinate, i.e., $\Gamma(1-\hat{x}) \includegraphics[width=0.98\textwidth]{Chapters/chapter7/figures/nonlinearwavespenalty-eps-converted-to.pdf} % Nx = 540, 6th order, vertical clustering, Nz=6; } -\caption[Snapshots at intervals $T/8$ over one wave period in time.]{Snapshots at intervals $T/8$ over one wave period in time of computed (a) small-amplitude $(kh,kH)=(0.63,0.005)$ and (b) finite-amplitude $(kh,kH)=(1,0.41)$ stream function waves elevations having reached a steady state after transient startup. Combined wave generation and absorption zones occur in the left relaxation zone of both (a) and (b). In b) an absorption zone is positioned next to the right boundary and causes minor visible reflections. } +\caption[Snapshots at intervals $T/8$ over one wave period in time.]{Snapshots at intervals $T/8$ over one wave period in time of computed (a) small-amplitude $(kh,kH)=(0.63,0.005)$ and (b) finite-amplitude $(kh,kH)=(1,0.41)$ stream function waves elevations having reached a steady state after transient startup. Combined wave generation and absorption zones occur in the left relaxation zone of both (a) and (b). In (b) an absorption zone is positioned next to the right boundary and causes minor visible reflections. } \label{ch7:figstandwave} \end{figure} @@ -412,7 +412,7 @@ it is attractive to use iterative methods for large system sizes $n=N_xN_yN_z$ a \end{align} where $\mathcal{M}$ is a preconditioner with the property that $\mathcal{M}^{-1}\approx \mathcal{A}^{-1}$ can be computed at low cost. -The bottleneck problem in a unified potential flow model is the solution of a discrete $\sigma$-transformed Laplace problem stated in the compact forms \eqref{ch7:linsyscompact} or \eqref{ch7:eq:linsys}. It is attractive to find an efficient iterative strategy where convergence\index{convergence} is understood via a convergence theory, has modest storage requirements, has minimal global communication requirements (in the form of global inner products), and is suitable for flexible-order\index{flexible order} discretizations. The class of geometric Multigrid Methods\index{multigrid} fulfills these requirements and has shown to be among the most efficient iterative strategies for a wide class of problems \cite{ch7:Trottenberg01}. In particular, the time required to solve a system of linear equations to a given accuracy level can be made to scale proportional to the number of unknowns. +The bottleneck problem in a unified potential flow model is the solution of a discrete $\sigma$-transformed Laplace problem stated in the compact forms \eqref{ch7:linsyscompact} or \eqref{ch7:eq:linsys}. It is attractive to find an efficient iterative strategy where convergence\index{convergence} is understood via a convergence theory, has modest storage requirements, has minimal global communication requirements (in the form of global inner products), and is suitable for flexible-order\index{flexible order} discretizations. The class of geometric Multigrid methods\index{multigrid} fulfills these requirements and has been shown to be among the most efficient iterative strategies for a wide class of problems \cite{ch7:Trottenberg01}. In particular, the time required to solve a system of linear equations to a given accuracy level can be made to scale proportional to the number of unknowns. There are several known approaches to multigrid methods \cite{ch7:MR744926} for high-order discretizations. Among these, Defect Correction\index{defect correction} Methods (DCMs) \cite{ch7:Stetter1978,ch7:AuzingerStetter1982,ch7:Hackbusch1982,ch7:Auzinger1987,ch7:Trottenberg01} have been employed successfully, e.g., in computational fluid dynamics \cite{ch7:LaytonEtAl2002}, in numerical simulations since the early 1970s. The fundamental idea of DCMs is to combine the good stability properties of low-order discretizations with high-order accuracy discretizations for explicit residual evaluations. These iterative methods impose low storage requirements, have scalable work effort under suitable choices of preconditioning strategies, and may be accelerated using a multigrid method based on low-order discretizations while still achieving high-order accuracy. @@ -444,7 +444,7 @@ The ratio between necessary data transfers and computational work for the propos {\scriptsize\input{Chapters/chapter7/figures/TeslaK20SpeedupGPUvsCPU3D.tikz}} } \end{center} - \caption[Performance timings per PDC iteration as a function of increasing problem size $N$, for single, mixed and double precision arithmetics.]{Performance timings per PDC iteration as a function of increasing problem size $N$, for single, mixed, and double precision arithmetics. Three-dimensional nonlinear waves, using sixth order finite difference approximations, preconditioned with one multigrid V-cycle and with one pre- and post- red-black Gauss-Seidel smoothing operation. Speedup compared to fastest known serial implementation. Using Test environment 4, CPU timings represent starting points for our investigations and have been obtained using the Fortran 90 code. These references results are based on a single-core (non-parallel) run on a Intel Core i7, 2.80GHz processor.}\label{ch7:fig:perftimings} + \caption[Performance timings per PDC iteration as a function of increasing problem size $N$, for single, mixed, and double precision arithmetics.]{Performance timings per PDC iteration as a function of increasing problem size $N$, for single, mixed, and double precision arithmetics. Three-dimensional nonlinear waves, using sixth order finite difference approximations, preconditioned with one multigrid V-cycle and with one pre- and post- red-black Gauss-Seidel smoothing operation. Speedup compared to fastest known serial implementation. Using test environment 4, CPU timings represent starting points for our investigations and have been obtained using the Fortran 90 code. These references results are based on a single-core (non-parallel) run on a Intel Core i7, 2.80GHz processor.}\label{ch7:fig:perftimings} \end{figure} The parallel domain decomposition solver has been validated against the sequential solvers with respect to algorithmic efficiency to establish that the code produces correct results. An analysis of the numerical efficiency has also been carried out on different GPU systems to identify comparative behaviors as both the problems sizes and number of compute nodes vary. For example, performance scalings on Test environment 1 and Test environment 3 are presented in Figure \ref{ch7:fig:multigpuperformance}. The figure confirms that there is only a limited benefit from using multiple GPUs for small problem sizes, since the computational intensity is simply too low to efficiently hide the latency of message passing. A substantial speedup is achieved compared to the single GPU version, while being able to solve even larger systems. @@ -471,10 +471,10 @@ Future work involves extending the domain decomposition method to include suppor It is described in Chapter \ref{ch5} how we have developed a heterogenous library has for fast prototyping of PDE solvers, utilizing the massively parallel architecture of CUDA-enabled GPUs. The objective is to provide a set of generic components within a single framework, such that software developers can assemble application-specific solvers efficiently at a high abstraction level, requiring a minimum of CUDA specific kernel implementations and parameter tuning. -The CUDA-based numerical wave model has been developed based on all the numerical techniques described in preceding sections. These techniques are a part of the library implemented as generic components, which makes them useful for the numerical solutions of PDE systems. The components of the numeral model as described in Section \ref{ch7:sec:nummodel} include an ERK4 time integrator, flexible-order finite difference approximations on regular grids, and an iterative multigrid PDC solver for the $\sigma$-transformed Laplace equation \eqref{ch7:TransformedLaplace}. Application developers can use either these components directly from the library or are free to combine their own implementations with library components, if they need alternative strategies that are not present in the library. +The CUDA-based numerical wave model has been developed based on all the numerical techniques described in preceding sections. These techniques are a part of the library implemented as generic components, which makes them useful for the numerical solutions of PDE systems. The components of the numeral model as described in Section \ref{ch7:sec:nummodel} include an ERK4 time integrator, flexible-order finite difference approximations on regular grids, and an iterative multigrid PDC solver for the $\sigma$-transformed Laplace equation \eqref{ch7:TransformedLaplace}. Application developers either either can use these components directly from the library or are free to combine their own implementations with library components, if they need alternative strategies that are not present in the library. For the unified potential flow model the user will need to provide implementations of the following components: the right-hand side operator for the semidiscrete free surface variables \eqref{ch7:FSorigin}, the matrix-vector operator for the discretized $\sigma$-transformed Laplace equation \eqref{ch7:TransformedLaplace}, a smoother for the multigrid relaxation step, and the potential flow solver itself, that reads initial data and advances the solution in time. In order to make the library as generic as possible, all components are template-based, which makes it possible to assemble the PDE solver by combining type definitions in the preamble of the application. An excerpt of the potential flow assembling is given in Listing \ref{ch7:lst:solversetup}. - +\pagebreak \lstset{label=ch7:lst:solversetup,caption={generic assembling of the potential flow solver for fully nonlinear free surface water waves} %,basicstyle=\scriptsize } @@ -510,7 +510,7 @@ typedef free_surface::potential_flow_solver_3d potential_f Hereafter, the potential flow solver is aware of all component types that should be used to solve the entire PDE system, and it will be easy for developers to exchange parts at later times. The \texttt{laplace\_sigma\_stencil\_3d} class implements both the matrix-vector and right-hand side operator. The flexible-order finite difference kernel for the matrix-free matrix-vector product for the two-dimensional Laplace problem is presented in Listing \ref{ch7:lst:fd2d}. Library macros and reusable kernel routines are used throughout the implementations to enhance developer productivity and hide hardware specific details. This kernel can be used both for matrix-vector products for the original system and for the preconditioning. -\lstset{label=ch7:lst:fd2d,caption={CUDA kernel implementation for the two dimensional finite difference approximation to the transformed Laplace equation} +\lstset{label=ch7:lst:fd2d,caption={CUDA kernel implementation for the two-dimensional finite difference approximation to the transformed Laplace equation} %,basicstyle=\scriptsize\ttfamily } \begin{lstlisting} @@ -683,7 +683,7 @@ E_c(N_x,N_z,kh,h/L) & = \frac{c^2}{c_s^2}, E_m(N_x,N_z,kh,h/L) &= \frac{1}{h}\int_{-h}^\eta \left( \frac{\phi(z)-\phi_s(z)}{\phi_s(z)} \right)^2 dz, \end{align} \end{subequations} -where $m$ is one of the scalar functions $\phi,u,w$ describing kinematics, $c$ is the numerical phase celerity of regular waves, and $c_s=\sqrt{g\tanh(kh)/k}$ is the exact phase celerity according to linear Stokes Theory \cite{ch7:SJ01}. Measurements of the errors are taken in the vertical below the crest of a wave which is well resolved in the horizontal direction. +where $m$ is one of the scalar functions $\phi,u,w$ describing kinematics; $c$ is the numerical phase celerity of regular waves; and $c_s=\sqrt{g\tanh(kh)/k}$ is the exact phase celerity according to linear Stokes Theory \cite{ch7:SJ01}. Measurements of the errors are taken in the vertical below the crest of a wave which is well resolved in the horizontal direction. % kinematicAnalysis.m \begin{figure}[!htb] @@ -731,11 +731,11 @@ The numerical model detailed has been subject to careful verification and valida \subsection{On precision requirements in engineering applications}\index{precision} -Practical engineering applications are widely used for analysis purposes and give support to decision making in engineering design. For engineering purposes the turn-around time for producing analysis results is of crucial importance as it affects cost-benefit of work efforts. The key interest is often just "engineering accuracy" in computed end results which suggests that we can do with less precision in calculations. One may ask: {\em what are the precision requirements for engineering applications?} +Practical engineering applications are widely used for analysis purposes and give support to decision making in engineering design. For engineering purposes the turn-around time for producing analysis results is of crucial importance as it affects cost-benefit of work efforts. The key interest is often just ``engineering accuracy'' in computed end results which suggests that we can do with less precision in calculations. One may ask: {\em what are the precision requirements for engineering applications?} -In a recent study \cite{ch7:EngsigKarupEtAl2011,ch7:Glimberg2011}, it was shown that the PDC method when executed on GPUs can be utilized to efficiently solve water wave problems. This was done by trading accuracy for speed in parts of the PDC algorithm, e.g., by using either single, or mixed-precision\index{precision!mixed} computations. Without preconditioning the PDC method reduces to a classical iterative refinement technique, which is known to be fault tolerant \cite{ch7:Higham:2002:ASN}. +In a recent study \cite{ch7:EngsigKarupEtAl2011,ch7:Glimberg2011}, it was shown that the PDC method when executed on GPUs can be utilized to efficiently solve water-wave problems. This was done by trading accuracy for speed in parts of the PDC algorithm, e.g., by using either single, or mixed-precision\index{precision!mixed} computations. Without preconditioning the PDC method reduces to a classical iterative refinement technique, which is known to be fault tolerant \cite{ch7:Higham:2002:ASN}. -Previously reported performance results for the wave model can be taken a step further. We seek to demonstrate how single precision computations can be used for engineering analysis without significantly affecting accuracy in final computational results. At the same time improvements in computational speed can be almost a factor of two for large problems as a direct result of reduced data transfer, cf. Figure \ref{ch7:fig:perftimings}. Therefore, in pursue of high performance, it is of interest to exploit the reduced data transfers associated with replacing double-precision with single-precision floating point calculations. In a well-organized code this step can be taken with minimal programming effort. +Previously reported performance results for the wave model can be taken a step further. We seek to demonstrate how single-precision computations can be used for engineering analysis without significantly affecting accuracy in final computational results. At the same time improvements in computational speed can be almost a factor of two for large problems as a direct result of reduced data transfer, cf. Figure \ref{ch7:fig:perftimings}. Therefore, in pursue of high performance, it is of interest to exploit the reduced data transfers associated with replacing double-precision with single-precision floating point calculations. In a well-organized code this step can be taken with minimal programming effort. % \begin{figure}[!htb] \begin{center} @@ -751,7 +751,7 @@ Previously reported performance results for the wave model can be taken a step f \label{ch7:convhist} \end{figure} -Most scientific applications \cite{ch7:lessismore} use double-precision calculations to minimize accumulation of round-off errors, to employ higher precision for ill-conditioned problems, or to stabilize critical sections in the code that require higher precision. Round-off errors tend to accumulate more slowly when higher precision is used, thereby avoiding significant losses of accuracy due to round-off errors. Paradoxically, for many computational tasks, the need for high precision connected with the above-mentioned restrictions does not apply at all, or only applies to a portion of the tasks. In addition, on modern hardware there can be relative differences in peak floating point performance of up to about one order of magnitude in favor of single-precision over double-precision math calculations depending on choice of hardware architecture. However, for bandwidth-bound applications, the key performance metric is not floating-point performance, but rather bandwidth performance. In both cases, data transfer can be effectively halved by switching to single precision storage, in which case bandwidth performance increases and at the same time makes it possible to feed floating point units with data at effectively twice the speed. If maximizing performance is an ultimate goal, such considerations suggests that it can be possible to compute faster by using single- over double-precision arithmetics if accuracy requirements can be fulfilled. +Most scientific applications \cite{ch7:lessismore} use double-precision calculations to minimize accumulation of round-off errors, to employ higher precision for ill-conditioned problems, or to stabilize critical sections in the code that require higher precision. Round-off errors tend to accumulate more slowly when higher precision is used, thereby avoiding significant losses of accuracy due to round-off errors. Paradoxically, for many computational tasks, the need for high precision connected with the above-mentioned restrictions does not apply at all, or only applies to a portion of the tasks. In addition, on modern hardware there can be relative differences in peak floating-point performance of up to about one order of magnitude in favor of single-precision over double-precision math calculations depending on choice of hardware architecture. However, for bandwidth-bound applications, the key performance metric is not floating-point performance, but rather bandwidth performance. In both cases, data transfer can be effectively halved by switching to single-precision storage, in which case bandwidth performance increases and at the same time makes it possible to feed floating-point units with data at effectively twice the speed. If maximizing performance is an ultimate goal, such considerations suggests that it can be possible to compute faster by using single- over double-precision arithmetics if accuracy requirements can be fulfilled. % As a simple illustrative numerical experiment, we can consider the iterative solution of \eqref{ch7:eq:linsys} using the PDC method using single- and double-precision math, respectively. As a simple test case, we consider the solution of periodic stream function waves in two spatial dimensions. Computed convergence histories are presented in Figure \ref{ch7:convhist} where it is clear that the main difference is the attainable accuracy level achievable before stagnation. In both cases, the attainable accuracy, defined in terms of the absolute error for the exact stream function solution to the governing equations, is associated with accuracy of approximately $10^{-4}$ (solid line). In single-precision math, the algebraic and estimated errors measured in the two-norm can reach the level of machine precision. These results suggest that single-precision math is sufficient for calculating accurate solutions at the chosen spatial resolution. We find that the iterative solution of the $\sigma$-transformed Laplace problem by the PDC method does not immediately lead to significant accumulation of round-off errors and further investigations are warranted for unsteady computations. @@ -763,7 +763,7 @@ Elaborating on this example, we examine the propagation of a regular stream func \end{align} where $c_n\in\mathbb{R}$ are the stencil coefficients and $\alpha\in\mathbb{Z}_+$ is the stencil half-width. An active filter can for example be based on employing a Savitzky-Golay smoothening filter \cite{ch7:PT90}, e.g., the mild 7-point SG(6,10) filter, and applying it after every 10th time step to each of the collocation nodes defining the free surface variables. The same procedure can be used for stabilization of nonlinear simulations to remove high-frequency "saw-tooth" instabilities as shown in \cite{ch7:EBL08}. This filtering technique can also remove high-frequency noise resulting from round-off errors in computations that would otherwise potentially pollute the computational results and in the worst case leave them useless. The effect of this type of filtering on the numerical efficiency of the model is insignificant. -Results from numerical experiments are presented in Figure \ref{ch7:filtering}, and most of the errors can be attributed to phase errors resulting from difference in exact versus numerical phase speed. In numerical experiments, we find that while results computed in double-precision are not significantly affected by accumulation of round-off errors, the single-precision results are. In figures \ref{ch7:filtering} (a) and (b), a direct solver based on sparse Gaussian elimination within MATLAB\footnote{\url{http://www.mathworks.com}.} is used to solve the linear system at every stage and a comparison is made between single and unfiltered double-precision calculations. It is shown in Figure \ref{ch7:filtering} a) that without a filter, the single-precision calculations result in "blow-up" after which the solver fails just before 50 wave periods of calculation time. However, in Figure \ref{ch7:filtering} (b) it is demonstrated that invoking a smoothening filter, cf. \eqref{ch7:filter}, stabilizes the accumulation of round-off errors and the calculations continue and achieve reduced accuracy compared to the computed double-precision results. Thus, it is confirmed that such a filter can be used to control and suppress high-frequency oscillations that results from accumulation of round-off errors. In contrast, replacing the direct solver with an iterative PDC method using the GPU-accelerated wave model appears to be much more attractive upon inspection of Figures \ref{ch7:filtering} (c) and (d). The single-precision results are found to be stable with and {\em without} the filter-based strategy for this problem. The calculations show that single-precision math leads to slightly faster error accumulation for this choice of resolution, however, with only small differences in error level during long time integration. This highlights that fault-tolerance of the iterative PDC method contributes to securing robustness of the calculations. +Results from numerical experiments are presented in Figure \ref{ch7:filtering}, and most of the errors can be attributed to phase errors resulting from difference in exact versus numerical phase speed. In numerical experiments, we find that while results computed in double-precision are not significantly affected by accumulation of round-off errors, the single-precision results are. In Figures \ref{ch7:filtering} (a) and (b), a direct solver based on sparse Gaussian elimination within MATLAB\footnote{\url{http://www.mathworks.com}.} is used to solve the linear system at every stage and a comparison is made between single- and unfiltered double-precision calculations. It is shown in Figure \ref{ch7:filtering} a) that without a filter, the single-precision calculations result in ``blow-up'' after which the solver fails just before 50 wave periods of calculation time. However, in Figure \ref{ch7:filtering} (b) it is demonstrated that invoking a smoothening filter, cf. \eqref{ch7:filter}, stabilizes the accumulation of round-off errors and the calculations continue and achieve reduced accuracy compared to the computed double-precision results. Thus, it is confirmed that such a filter can be used to control and suppress high-frequency oscillations that results from accumulation of round-off errors. In contrast, replacing the direct solver with an iterative PDC method using the GPU-accelerated wave model appears to be much more attractive upon inspection of Figures \ref{ch7:filtering} (c) and (d). The single-precision results are found to be stable with and {\em without} the filter-based strategy for this problem. The calculations show that single-precision math leads to slightly faster error accumulation for this choice of resolution, however, with only small differences in error level during long time integration. This highlights that fault-tolerance of the iterative PDC method contributes to securing robustness of the calculations. \begin{figure}[!htb] \begin{center} @@ -781,11 +781,11 @@ Results from numerical experiments are presented in Figure \ref{ch7:filtering}, \includegraphics[width=0.45\textwidth]{Chapters/chapter7/figures/ComparisonDCWithFiltering-eps-converted-to.pdf} } \end{center} -\caption[Comparison of accuracy as a function of time for double-precision calculations vs. single-precision with and without filtering.]{Comparison between accuracy as a function of time for double-precision calculations vs. single-precision with and without filtering. The double-precision result is unfiltered in each comparison and shows to be less sensitive to round-off errors. Medium steep nonlinear stream function wave in intermediate water $(kh,H/L)=(1,0.0502)$. Discretization is based on $(N_x,N_z)=(30,6)$, A courant number of $C_r=0.5$, and sixth order stencils.} +\caption[Comparison of accuracy as a function of time for double-precision calculations vs. single-precision with and without filtering.]{Comparison of accuracy as a function of time for double-precision calculations vs. single-precision with and without filtering. The double-precision result is unfiltered in each comparison and shows to be less sensitive to round-off errors. Medium steep nonlinear stream function wave in intermediate water $(kh,H/L)=(1,0.0502)$. Discretization is based on $(N_x,N_z)=(30,6)$, a courant number of $C_r=0.5$, and sixth order stencils.} \label{ch7:filtering} \end{figure} -Last, we demonstrate using a classical benchmark for propagation of nonlinear waves over a semicircular shoal that single-precision math is likely to be sufficient for achieving engineering accuracy. The benchmark is based on Whalin's experiment~\cite{ch7:Whalin1971} which is often used in validation of dispersive water wave models for coastal engineering applications, e.g., see previous work \cite{ch7:EBL08}. Experimental results exists for incident waves with wave periods $T=1,2,3\,$s and wave heights $H=0.0390, 0.0150, 0.0136\,$m. All three test cases have been discretized with a computational grid of size ($257 \times 41 \times 7$) to resolve the physical dimensions of $L_x=35\,$m, $L_y=6.096\,$m. The still water depth decreases in the direction of the incident waves as a semicircular shoal from $0.4572\,$m to $0.1524\,$m with an illustration of a snapshot of the free surface given in Figure \ref{ch7:fig:whalinsetup}. The time step $\Delta t$ is computed based on a constant Courant number of $Cr=c\Delta x/\Delta t=0.8$, where $c$ is the incident wave speed and $\Delta x$ is the grid spacing. Waves are generated in the generation zone $0 \leq x/L \leq 1.5$, where $L$ is the wave length of incident waves, and absorbed again in the zone $35 - 2L \leq x \leq 35\,$m. +Last, we demonstrate using a classical benchmark for propagation of nonlinear waves over a semicircular shoal that single-precision math is likely to be sufficient for achieving engineering accuracy. The benchmark is based on Whalin's experiment~\cite{ch7:Whalin1971} which is often used in validation of dispersive water wave models for coastal engineering applications, e.g., see previous work \cite{ch7:EBL08}. Experimental results exist for incident waves with wave periods $T=1,2,3\,$s and wave heights $H=0.0390, 0.0150, 0.0136\,$m. All three test cases have been discretized with a computational grid of size ($257 \times 41 \times 7$) to resolve the physical dimensions of $L_x=35\,$m, $L_y=6.096\,$m. The still water depth decreases in the direction of the incident waves as a semicircular shoal from $0.4572\,$m to $0.1524\,$m with an illustration of a snapshot of the free surface given in Figure \ref{ch7:fig:whalinsetup}. The time step $\Delta t$ is computed based on a constant Courant number of $Cr=c\Delta x/\Delta t=0.8$, where $c$ is the incident wave speed and $\Delta x$ is the grid spacing. Waves are generated in the generation zone $0 \leq x/L \leq 1.5$, where $L$ is the wave length of incident waves, and absorbed again in the zone $35 - 2L \leq x \leq 35\,$m. % A harmonic analysis of the wave spectrum at the shoal center line is computed and plotted in Figure \ref{ch7:whalinresults} for comparison with the analogous results obtained from the experiments data. The three harmonic amplitudes are computed via a Fast Fourier Transform (FFT) method using the last three wave periods up to $t=50\,$s. There is a satisfactory agreement between the computed and experimental results and no noticeable loss in accuracy resulting from the use of single-precision math. @@ -797,13 +797,13 @@ A harmonic analysis of the wave spectrum at the shoal center line is computed an \subfigure[Whalin test case at $t=50$s, wave period $T=2$s, and grid dimensions ($257 \times 41 \times 7$)]{\label{ch7:fig:whalinsetup} \includegraphics[width=0.5\textwidth]{Chapters/chapter7/figures/WhalinWaveSol_t50_T2_single.pdf} } - \subfigure[$T=1s$]{ + \subfigure[$T=1$s]{ {\scriptsize\input{Chapters/chapter7/figures/WhalinWaveHarmonics_T1_single.tikz}} } - \subfigure[$T=2s$]{ + \subfigure[$T=2$s]{ {\scriptsize\input{Chapters/chapter7/figures/WhalinWaveHarmonics_T2_single.tikz}} } - \subfigure[$T=3s$]{ + \subfigure[$T=3$s]{ {\scriptsize\input{Chapters/chapter7/figures/WhalinWaveHarmonics_T3_single.tikz}} } % \end{center} diff --git a/BookGPU/Chapters/chapter7/figures/lineardispersion_Nx30-HL90-p6-vergrid0_Linear-eps-converted-to.pdf b/BookGPU/Chapters/chapter7/figures/lineardispersion_Nx30-HL90-p6-vergrid0_Linear-eps-converted-to.pdf index c84ebef783add62f20da256b79e7e72d539a3b5c..25fc16e72407234ce201c7f6cac67d6d7074ffd0 100644 GIT binary patch literal 16917 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 literal 7331 zcmd5h2{@G9_w6!~NGeHhg(=LuvzRreWY0dYC}bI&>V+;h$td)V6Jh@!iMen0y!duV0!^aj@TkxF%My}FfzFm;RrFx z^qQT{Vgs5+<(qdi<$_VlY3w)LQM#q$B#|rk#Bb=JpUk*y?^%>t)({_^e0%-Ewv>z1 zkhM0Rv-|9G>Z~Tu?u0x`wSDf4lz3jYqG-Gn8f8 z=hhz_e(Ao>ZhdU_jgeb|%!}8@H@MB1)T-QfQkth-wKwR3N#+#2Z7pKV+oZm@v;a%$ z`VS#J^DNCrBqv8Ym}lQA*KOn6(SB6;QFix!LtE=+R%B@5>zt2mmzh@;$1594i;A#P zfu80P!HJN_LJT`9QOdAfm-*g%TF?r;FL#aoG)GRV)HANw3w^14I_uNdzWT0raV0^6 z>Z|R&HLS*b@!k_2MsM3cs73$0rbW(8Wwg}|UiloaW%`%7ysa$c;(*B9N*hjBGatyqE6{WrJR1dVHagw;!--kN#ht*o|g z+0N__%rmQXYsf8X>J3^$)6%XmCL~t9o8uj8>e;49V?IjZUmO<2w9(R{JfI^oQ$3oVFRaQTQ~9?yDB z9Y+c{Itf;4`?+cs7Hc-Z=@_r=x36?xn)Ea(nK6xfdRlb3#mv^VxjdhEV*CYbLQDQC z?HQ&9))$r(@11+f(JRC>OjtJLVQACZTIZz|Y8C3^mKnRc9(t>0u5R4>G4HwDs+kifxD1%T}%f^7A0k+U3`du%e2Ka(hjL9I_na`6!ff$r+HfA9NC@4^pzf47` z4|whVnKm3bM<5RUPGW$2S47U?0SH9wANaX8?RNq{w}FA(JzOCoi#5QcYF7hGv1u4| z9{VR5)i%FF=@|O&P_#P$oXe3Rs9<1sPa7w%d1j7?U@0Q!b2%z;*&;HolrNEsr4R!p zp%RA*0>sIe%H%d-94SO5!7iMEHjzYv{rEh2m@E)OqM-}@PcI4u9}I;;h5qiN(*6MK z7aAA>M5Us;{ri_jB0&Uz^KV}OM^^;jg#H%V>*rS0LTRXAr2bYv7b;E(5SdI?!M@W# zS5na-5Kyxdfg71G3I#$CS&L-+AAK)HupG5<)GUA&zuOur)?WU{}6O26m&;s7hO~{{R&V8Bjsh4^G|;*cx_&IWQOI z!3eBc1rC8j_)8Hu1e{Vh4CccTumBdpBEATL#jqHBOJE5i<%@Z+6qdm<0Y?@F%Oo5w z0?Wgs2>6Z^!wNVGj)tQVsd%PJ5+L?L$Pf|L&abwP_6KCxA07P~9D&{ZDtVjl(G-bH zCa_pP;wB%T81J!u`k6!?NjR9YWLSlXwx904RVy&;F`GY((DtzO(A`{YG$#r(ywM@h z%r8q}H{UJ^n#Yf{!v&AiU3SWMxM`iOE`e`;@{}U`%)^?J&R0Rl&cwXWWRN3Yf35it zv+UuqY3hC0TCT;Ia?0AOg&DiSYRnM;6RAHP~e>`>S{1^FW z&)y4u+M9ZPo>t@sJMqox7N7aMTl(Fg zi?df1+b=siGz7^TZ&n(sce(`bdfOd5!NFwR{2E(w;Wd4ejp{s|ozSz%COemK=kD|{ zNl#kr?P5gE;G|8w<`P08uSu(NoH&uZL3_gRTbmy5EKVamBSq8}AZMC(Z0#fQZJ(IV z(@`YF9S;!p6#5*!CF`7WsrnM7CE)s=yA`*jM|28#d$P9dcw2U3RlcA`C8B#o0{GmG1AOl*X5o@~&GKJAgPQ1NQ! zQ29h#i9x2$6-zA#9otpO8y{)Bb2(={Xm!j6?eP_c%O6+f_3@Z#1|4mu2=;2El%V=e zrkAa|l`Dgqt%5EZ$7i@Sx=L4b!djXem+E#yh6ZJ7ddsGU5nZNX)(9*{R`3qmcWLz+ zd*tZE{ZW$aVl2)Ncvg_oZh1hBLvkr&g?Tq!nYJe!?YcJQW`wqA;^Oq#r7@5%#{ zLwE1qX!z~PXTvyKwr5Y@9%15+4f%Gvk3Z~e&18p9Dc!&H!k}3i(+pM$*Hn$)*O;W) zlGJhc@Nkwemtc3`hPWi?rblvJh>?+C^t}|{n0)`To*QZjEWuN&lJMaAv6^D`koV=q znJ>3quVECtwbGBKw@nDoSkk$`x%R#nBjWIr)*;=k={oHlQx6$pChRqQ)Y5*u&Htq< z)3~Z>@zJ+WP82`!ZxN=!ou?;%i40#kT9N+z`O~3T^XH>pSH5QQcMlHFUD?(dI{D(p z`)6(>B-Tc~@z^?~Y)kUmr8=CF!!syeK`F%xPsB`~eXZlmGx-U_&Y{AR&UMq&tIY9Q z51oQw_y{79pt{`%M-;#rQ`@XDQu$1+BYtAZB0@FKC5j@2`9rB)2GON04 zR6A91JLiLr!L+)7(*;F)ddqw{mddQpJe)hlh_UHfeHhe{`<_=&k$UY?L9o{7RXEK% z4+86py?Og5E}uKjC;Qg26xSvf-l}83c@aN&r|$v(Dj)OvI}KJViz!11!(W~5asS** z8-Dx7vDnq03x(&3hJOi6FO1K~AMbFp*?ja$$)2qnQfBEzEE)9v4K_L{e|*^mYD?0x zf}6pqhP^MdT}S+3S=3UNk+1Q_B4XJ51RDPd=}fTuh6p{I$c3*TjXo=ke*BMa3-zy?43lrDH(HnXb`h~etzMhDR-|D3RWH&qTl-{_)}VbW!a7l z{!}-yr|S^M^IPu_wDJ?8SJbmzF*Z8niyj8eH+J3)>T3Uz=^OMcFM4%st>~V6od@Ys zcOlq&VcMBso5xeeK6#saNw16lFx+|Xq1B~i^HsyUs~_lfj0wH%k5d>tyKL3avL!k( zKlG?p(qgLJ2g8JiSF8+HFRn9wPN7C?RNH6tra@}@8B9b2oRXJ%Ovf0I(u z99dgXdeAT{!>X;3=s&1x&FszdJ7)$`cI#rNT5F7Fn6{X8*S@v^P9%IC!P>aA>FOSi zTJNqK4<9Ho_n%rn$;Prtx9T?~UYtaJEljBnGIw^J-$C2z@-0exhV`ct>cdK2O^i;F zmbYoRE9sEN0vC+ByJJA%w0&Pi?hapKhqo7PDJ48e?g`Q#cP4B}!^wU7cKdBOI>PMI z^T!dBW15Gxx$MXLPixTbJ2Pf+ieYTb=kQ`4*K{KsQ;lc;-gpFig4KQOoa%xtKM@Ojc=yo9!Am*_zpU3)k2 zHo;_76OnU0y>N;8way;%ZS0b(?|0m-@S``09^m6BZ@Q!3r>h6JPNO^7X*qZ@+SOl9 zAGJ`su=VP7>uE#%{NE<_8JW%r>b7a2b#-6Ag)JZRCbXw})u^PYFB{K2Jxk~eO^p9z zlzZmJt#;3pdZYF2BxC&4x0@bdumbj*2%H#cK9}=Mg8Ao#Oua822S4Z!tB$zW_cHUO zKK^U7@SF38>^R;W8m7P~(~VX7+Hpd_>Wjy{4s_L@GVTbvI;o^|{A@m}>4xNWbq@ZL z)`R5vhG#xa_E~#TI63W{oZIBq!Wx>lyw4p&8PBm*M6$@d$KTO0E;O`54PqX-9 z5ri(x2^K5lR#=6C&tq~4JQ9@@!oYDuxLh2Oi12U(@Zds-pv~pd5HgMaeL2Z5Z2q<$ z0DuL_Kn|eA1o<*g!9}E2SO*Um$RSKDllP~25Cc!3VBvx7|5IE6-Tb{2fIf5SavmCHyB$pnNdZ22?*mHS~Wm^%u-v zri!KBz$93%*4{4GbIl>|Fa&bt$iw`ALCDM@ClMD9`65yosvkO@0A3oM49#EzHc7!V z@sK;nWH@q=CqZ6OGLSnlAzO|#k}m?O3Z8@~eD66UQV}BfL8%|eguFO%$XXE!kw6`S zz_g$nTey}V{0F?9P0)(aV6V?KG ze?!1W&plJX5rtY|l{g*}!chq1SQhLf1J(m`BuE78|igDx`=E7JxjNBjxdBz_L)YTjZuB6L5|$3<6F<#Vtjop;A7Nu*gM)hDRi_enkuT ztp0|ICHNiVGMZiBCC<_DqL(e})=;y5g?jkE}Bzh_Z<&^nHwKK?Umm zeT)c-#D5thp@qWV@dyMW>Sn?7lOB;|@fSQI#p17PP%S{Y_V>9Y0{O4&Qo!x-Cp;n* zjhp^7mrMoq;@`)>c0pnC`u;*aWCVoX0%@7y$SMztZs8aK^Z+YeQ#eje0G)(^rIEccfawV&2L}KE z=!8tn?G0?7e$9344FnAItn>}wxVho%>}?HnEa04zEe7imyx+e9AK{jF2IV_Mqdlj2 zFDUtO`#m(m+F1-mdKt}iZ-S~mD&|?>P`YL8KnElK)wE= zG+BBelN>!uwZaH9@ZWW&{Hx9ov*B+4MQ6X6`?Jn|_w>L&oYQ~LRAU7I|HZMtOuxS? z?HAYaJg5E}l=jax;D2zYJ+E6Y9{=~5HWyVK4n1o1d5XGDLTHOl@zDRU^RBd~83qsAhHnTRPcR>1+~ioy2uMJ48Au z^h~|6p34iu5^uBm$zh%kD=z2vMtRng49C&oF;^@tt9j^a>#AqdT|8%%n4Q3ADS3PG zvL``>2GkvPW7#M#_WjwowNvBrryT7jM62V2JGO>2v%JJEvNNzq$d7WIkl9p5Y>6U} zdK_#;t*{m71#F^U*k-gd9OW2*}a_^dTW!Ks4G*(vXwXWPZkv=}JNdOf0# z`K2!kqBn{wCWj)2vz2mu<10C#o=d1$IU=NZA|0uVdzVg)zZ2JIa?Fq_zK)OYKWxIa zaBygN;;glG_a~7nO%;$;4$hZkywM9r!4<^5!I(6{_@7YRK2r5+{;||B=WIQ^GVUK-)KZwFQp^T;J9YTTDyoSmC~|Lz zGutiE$aKm>f^*GDR(92sPW0)cMmv~Q$ro30ugd2aA{t5jlgO=8BVae_NeYqOUf*MR zMQ|f|fz~ub3H-}M{cZJonW%rv)IT;y|J9i)^t3Db(+uuwI-Woej9C}^dhygH@jhwhk`sEzj#~GKF?~PqnxB(->jA!GpTx88gILj9sC1)!PUkq! z_@Ro*h@s<|h@meQ5t332EC-v(&ycb_M?8Xfn>%2XTjmcDA} zYi$2~0K}(ClCWBmK9lZC_#7y(ysD4E9PMQ$oL~!SM+Qh$hRq#X%MX!wG1sFV;ol@b_YDy~3XkBTeB z7jy&iES#!VT&If`D@QG>I9s(Vlrd`S#UK{r+upw_kum7{nnaU%IGFNbm+vg zcxe8*wXi-J?Tyi%O@B(^;ktPj*L3-hiJ{kla+KJ<+X7Gt6-t^Pd

L#jUGItcxO`X{LXOPY4)Z&Sps<@HlTKl^ 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 literal 7859 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