From 06ee49ebeb6d34433bbe9a0cf35b7edf7c785158 Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Mon, 18 Feb 2019 10:30:52 +0000 Subject: [PATCH 01/29] Start on DG --- advection/advection-higherorder.tex | 251 +++++++++++++++++++--------- 1 file changed, 174 insertions(+), 77 deletions(-) diff --git a/advection/advection-higherorder.tex b/advection/advection-higherorder.tex index 1d76aa7..c963251 100644 --- a/advection/advection-higherorder.tex +++ b/advection/advection-higherorder.tex @@ -4,8 +4,8 @@ \section{Advection and the finite-volume method} \label{ch:adv:sndorder} -In these notes, we will typically use a {\em finite-volume} discretization. Here we -explore this method for the +In these notes, we will typically use a {\em finite-volume} discretization. Here we +explore this method for the advection equation. First we rewrite the advection equation in {\em conservation form}: \begin{equation} @@ -13,7 +13,7 @@ \section{Advection and the finite-volume method} \label{eq:advect-cons} \end{equation} where $f(a) = ua$ is the flux of the quantity $a$. In conservation form, -the time derivative of a quantity is related to the divergence of +the time derivative of a quantity is related to the divergence of its flux. % figure created with figures/advection/fv-ghost.py @@ -36,9 +36,9 @@ \section{Advection and the finite-volume method} from ${x_{i-\myhalf}}$ to ${x_{i+\myhalf}}$, normalizing by the zone width, $\Delta x$: \begin{align} -\frac{1}{\Delta x} \int_{x_{i-\myhalf}}^{x_{i+\myhalf}} a_t \, dx &= +\frac{1}{\Delta x} \int_{x_{i-\myhalf}}^{x_{i+\myhalf}} a_t \, dx &= - \frac{1}{\Delta x} \int_{x_{i-\myhalf}}^{x_{i+\myhalf}} \frac{\partial}{\partial x} f(a) \, dx \\ -\frac{\partial}{\partial t} a_i &= +\frac{\partial}{\partial t} a_i &= - \frac{1}{\Delta x} \left \{ \left [f(a) \right ]_{i+\myhalf} - \left [f(a) \right ]_{i-\myhalf} \right \} \label{adv:eq:fvadv} \end{align} This is an evolution equation for the zone-average of $a$, and shows @@ -209,7 +209,7 @@ \section{Second-order predictor-corrector scheme} {\label{fig:fvadvect} Second-order finite volume advection showing the result of advecting a tophat profile through five periods with both unlimited and limited slopes. This calculation used 64 zones and -$\cfl=0.7$. \\ +$\cfl=0.7$. \\ \hydroexdoit{\href{https://github.com/zingale/hydro_examples/blob/master/advection/advection.py}{advection.py}}} \end{figure} @@ -235,9 +235,9 @@ \subsection{Limiting} \frac{a_i - a_{i-1}}{\Delta x}, \frac{a_{i+1} - a_i}{\Delta x} \right ) \end{equation} instead of Eq.~\ref{eq:slopecentered}. -with +with \begin{equation} -\mathtt{minmod}(a,b) = \left \{ +\mathtt{minmod}(a,b) = \left \{ \begin{array}{ll} a & \mathit{if~} |a| < |b| \mathrm{~and~} a\cdot b > 0 \\ b & \mathit{if~} |b| < |a| \mathrm{~and~} a\cdot b > 0 \\ @@ -277,7 +277,7 @@ \subsection{Limiting} \includegraphics[width=0.75\linewidth]{rea-nolimit-start_003} \\ \includegraphics[width=0.75\linewidth]{rea-nolimit-start_004} \\ \includegraphics[width=0.75\linewidth]{rea-nolimit-start_005} \\ -\includegraphics[width=0.75\linewidth]{rea-nolimit-start_006} +\includegraphics[width=0.75\linewidth]{rea-nolimit-start_006} %\includegraphics[width=0.55\linewidth]{rea-nolimit-start_007} \\ %\includegraphics[width=0.55\linewidth]{rea-nolimit-start_008} \\ \caption[The effect of no limiting on initially discontinuous data]{\label{fig:limitingex}Initially discontinuous data evolved for several steps with @@ -310,7 +310,7 @@ \subsection{Limiting} \end{equation} Then the limited difference is \begin{equation} -\left . \frac{\partial a}{\partial x} \right |_i = +\left . \frac{\partial a}{\partial x} \right |_i = \left \{ \begin{array}{ll} \min \left [ \frac{| a_{i+1} - a_{i-1} |}{2 \Delta x}, @@ -324,7 +324,7 @@ \subsection{Limiting} % Note that a slightly different form of this limiter is presented in \cite{leveque:2002}, where all quantities are in a {\tt minmod}, which appears to limit a bit less. -This is second-order accurate for smooth flows. +This is second-order accurate for smooth flows. The main goal of a limiter is to reduce the slope near extrema. Figure~\ref{fig:limit} shows a finite-volume grid with the original @@ -372,18 +372,18 @@ \subsection{Limiting} \subsection{Reconstruct-evolve-average} Another way to think about these methods is as a reconstruction, -evolve, and average (R-E-A) process (see Figure~\ref{fig:rea}). +evolve, and average (R-E-A) process (see Figure~\ref{fig:rea}). We can write the conservative update as: \begin{align} -a_i^{n+1} &= a_i^n + \frac{\Delta t}{\Delta x} +a_i^{n+1} &= a_i^n + \frac{\Delta t}{\Delta x} (u a^{n+\myhalf}_{i-\myhalf} - u a^{n+\myhalf}_{i+\myhalf} ) \\ - &= a_i^n + \cfl (a^{n+\myhalf}_{i-\myhalf} - a^{n+\myhalf}_{i+\myhalf} ) + &= a_i^n + \cfl (a^{n+\myhalf}_{i-\myhalf} - a^{n+\myhalf}_{i+\myhalf} ) \end{align} If we take $u > 0$, then the Riemann problem will always choose the left state, so we can write this as: \begin{equation} -a_i^{n+1} = a_i^n + +a_i^{n+1} = a_i^n + \cfl \biggl [\underbrace{\left (a_{i-1}^n + \frac{1}{2} (1-\cfl) \Delta a_{i-1} \right )}_{a_{i-\myhalf,L}} - \underbrace{\left (a_{i}^n + \frac{1}{2} (1-\cfl) \Delta a_{i} \right )}_{a_{i+\myhalf,L}} \biggr ] \label{eq:rea_orig} @@ -394,20 +394,20 @@ \subsection{Reconstruct-evolve-average} \begin{equation} a_i(x) = a_i + \frac{\Delta a_i}{\Delta x} (x - x_i) \end{equation} -Consider zone $i$. +Consider zone $i$. If we are advecting with a CFL number $\cfl$, then that means that the fraction $\cfl$ of the zone immediately to the left of the $i-\myhalf$ interface will advect into zone $i$ over the timestep. And only the fraction $1-\cfl$ in zone $i$ -immediately to the right of the interface will stay in that zone. This -is indicated by the shaded regions in Figure~\ref{fig:rea}. +immediately to the right of the interface will stay in that zone. This +is indicated by the shaded regions in Figure~\ref{fig:rea}. The average of the quantity $a$ from zone $i-1$ that will advect into -zone $i$ is +zone $i$ is \begin{eqnarray} -\mathcal{I}_< &=& \frac{1}{\cfl \Delta x} +\mathcal{I}_< &=& \frac{1}{\cfl \Delta x} \int_{x_{i-\myhalf} - \cfl\Delta x}^{x_{i-\myhalf}} a_{i-1}(x) dx \\ % - &=& \frac{1}{\cfl \Delta x} + &=& \frac{1}{\cfl \Delta x} \int_{x_{i-\myhalf} - \cfl\Delta x}^{x_{i-\myhalf}} \left [ a_{i-1} + \frac{\Delta a_{i-1}}{\Delta x} (x - x_{i-1} ) \right ] dx \\ &=& a_{i-1} + \frac{1}{2} \Delta a_{i-1} (1-\cfl) @@ -416,16 +416,16 @@ \subsection{Reconstruct-evolve-average} And the average of the quantity $a$ in zone $i$ that will remain in zone $i$ is \begin{eqnarray} -\mathcal{I}_> &=& \frac{1}{(1-\cfl) \Delta x} +\mathcal{I}_> &=& \frac{1}{(1-\cfl) \Delta x} \int_{x_{i-\myhalf}}^{x_{i-\myhalf} + (1-\cfl) \Delta x} a_{i}(x) dx \\ % - &=& \frac{1}{(1-\cfl) \Delta x} - \int_{x_{i-\myhalf}}^{x_{i-\myhalf} + (1-\cfl)\Delta x} + &=& \frac{1}{(1-\cfl) \Delta x} + \int_{x_{i-\myhalf}}^{x_{i-\myhalf} + (1-\cfl)\Delta x} \left [ a_{i} + \frac{\Delta a_{i}}{\Delta x} (x - x_{i} ) \right ] dx \\ &=& a_{i} - \frac{1}{2} \Delta a_{i} \cfl \end{eqnarray} -The final part of the R-E-A procedure is to average the over the +The final part of the R-E-A procedure is to average the over the advected profiles in the new cell. The weighted average of the amount brought in from the left of the interface and that that remains in the cell is @@ -435,10 +435,10 @@ \subsection{Reconstruct-evolve-average} + (1-\cfl) \left [ a^n_i - \frac{1}{2} \Delta a_i \cfl \right ] \\ &= a^n_i + \cfl \left [a^n_{i-1} + \frac{1}{2}(1 - \cfl) \Delta a_{i-1} \right ] - \cfl \left [ a^n_i + \frac{1}{2} (1-\cfl) \Delta a_i \right ] -\end{align} +\end{align} This is identical to Eq.~\ref{eq:rea_orig}. This demonstrates that the R-E-A procedure is equivalent to our reconstruction, prediction of the -interface states, solving the Riemann problem, and doing the +interface states, solving the Riemann problem, and doing the conservative flux update. % this figure sequence is created by figures/advection/rea.py @@ -490,7 +490,7 @@ \subsection{Reconstruct-evolve-average} \begin{figure}[ht] \centering \includegraphics[width=0.8\linewidth]{fv-gaussian-limiters} \\[1em] -\includegraphics[width=0.8\linewidth]{fv-tophat-limiters} +\includegraphics[width=0.8\linewidth]{fv-tophat-limiters} \caption[Effect of different limiters on evolution] {\label{fig:limiter_panel} The effect of different limiters on the evolution of a Gaussian initial profile (top) and a tophat initial @@ -566,7 +566,7 @@ \section{Multi-dimensional advection} \caption[A 2-d grid with zone-centered indexes]{\label{fig:2dgrid} A simple 2-d grid with the zone-centered indexes. The $\times$s mark the left and right interface states at the upper edge of the $i,j$ zone in each - coordinate direction. For a finite-volume discretization, $a_{i,j}$ + coordinate direction. For a finite-volume discretization, $a_{i,j}$ represents the average of $a(x,y)$ over the zone.} \end{figure} @@ -581,21 +581,21 @@ \section{Multi-dimensional advection} define the average of $a$ in a zone by integrating it over the volume: \begin{equation} -a_{i,j} = \frac{1}{\Delta x \Delta y} - \int_{x_{i-\myhalf}}^{x_{i+\myhalf}} \int_{y_{j-\myhalf}}^{y_{j+\myhalf}} +a_{i,j} = \frac{1}{\Delta x \Delta y} + \int_{x_{i-\myhalf}}^{x_{i+\myhalf}} \int_{y_{j-\myhalf}}^{y_{j+\myhalf}} a(x,y,t) \, dx \, dy \end{equation} Integrating Eq.~\ref{eq:advect2d-cons} over $x$ and $y$, we have: \begin{align} -\frac{1}{\Delta x \Delta y} - \int_{x_{i-\myhalf}}^{x_{i+\myhalf}} - \int_{y_{j-\myhalf}}^{y_{j+\myhalf}} a_t \, dx \, dy = +\frac{1}{\Delta x \Delta y} + \int_{x_{i-\myhalf}}^{x_{i+\myhalf}} + \int_{y_{j-\myhalf}}^{y_{j+\myhalf}} a_t \, dx \, dy = &- \frac{1}{\Delta x \Delta y} \int_{x_{i-\myhalf}}^{x_{i+\myhalf}} \int_{y_{j-\myhalf}}^{y_{j+\myhalf}} (u a)_x \, dx \, dy \nonumber \\ &- \frac{1}{\Delta x \Delta y} \int_{x_{i-\myhalf}}^{x_{i+\myhalf}} \int_{y_{j-\myhalf}}^{y_{j+\myhalf}} - (v a)_y \, dx \, dy + (v a)_y \, dx \, dy \end{align} or using the divergence theorem, \begin{align} @@ -610,7 +610,7 @@ \section{Multi-dimensional advection} Now we integrate over time---the left side of our expression becomes just the difference between the new and old state. \begin{align} - a_{i,j}^{n+1} - a_{i,j}^n = + a_{i,j}^{n+1} - a_{i,j}^n = &- \frac{1}{\Delta x\Delta y} \int_{t^n}^{t^{n+1}} \int_{y_{j-\myhalf}}^{y_{j+\myhalf}} \left \{ (u a)_{i+\myhalf,j} - (u a)_{i-\myhalf,j} \right \} dy dt \nonumber \\ &- \frac{1}{\Delta x\Delta y} \int_{t^n}^{t^{n+1}} \int_{x_{i-\myhalf}}^{x_{i+\myhalf}} @@ -628,13 +628,13 @@ \section{Multi-dimensional advection} \item y-face \begin{equation} \langle (va)_{i,j+\myhalf}\rangle_{(t)} = \frac{1}{\Delta x \Delta t} - \int_{t^n}^{t^{n+1}} \int_{x_{i-\myhalf}}^{x_{i+\myhalf}} (va)_{i,j+\myhalf}\, dx dt + \int_{t^n}^{t^{n+1}} \int_{x_{i-\myhalf}}^{x_{i+\myhalf}} (va)_{i,j+\myhalf}\, dx dt \end{equation} \end{itemize} where $\langle . \rangle_{(t)}$ denotes the time-average over the face. For a second-order accurate method in time, we replace the average in time with the flux at the midpoint in time and the average over the face -with the flux at the center of the face: +with the flux at the center of the face: \begin{equation} \langle (ua)_{i+\myhalf,j} \rangle_{(t)} \approx (ua)_{i+\myhalf,j}^{n+\myhalf} \end{equation} @@ -647,7 +647,7 @@ \section{Multi-dimensional advection} For the advection problem, since $u$ and $v$ are constant, we need to find the interface states of $a$ alone. -There are two methods for computing these interface states, +There are two methods for computing these interface states, $a_{i\pm\myhalf,j}^{n+\myhalf}$ on $x$-interfaces and $a_{i,j\pm\myhalf}^{n+\myhalf}$ on $y$-interfaces: dimensionally split and unsplit. Dimensionally split methods are easier to code, since each dimension is operated on independent of the @@ -691,17 +691,17 @@ \subsection{Dimensionally split} case (Eq.~\ref{eq:statel} and \ref{eq:stater}). For example, the $a_{i+\myhalf,j,L}^{n+\myhalf}$ state is: \begin{eqnarray} -a_{i+\myhalf,j,L}^{n+\myhalf} &=& a_{i,j}^n + - \frac{\Delta x}{2} \left .\frac{\partial a}{\partial x} \right |_{i,j} + - \frac{\Delta t}{2} \left .\frac{\partial a}{\partial t} \right |_{i,j} + +a_{i+\myhalf,j,L}^{n+\myhalf} &=& a_{i,j}^n + + \frac{\Delta x}{2} \left .\frac{\partial a}{\partial x} \right |_{i,j} + + \frac{\Delta t}{2} \left .\frac{\partial a}{\partial t} \right |_{i,j} + \mathcal{O}(\Delta x^2) + \mathcal{O}(\Delta t^2) \nonumber \\ - &=& a_{i,j}^n + - \frac{\Delta x}{2} \left .\frac{\partial a}{\partial x} \right |_{i,j} + - \frac{\Delta t}{2} \left ( + &=& a_{i,j}^n + + \frac{\Delta x}{2} \left .\frac{\partial a}{\partial x} \right |_{i,j} + + \frac{\Delta t}{2} \left ( - u \left .\frac{\partial a}{\partial x} \right |_{i,j} \right ) + \ldots \nonumber \\ - &=& a_{i,j}^n + - \frac{\Delta x}{2} \left ( 1 - \frac{\Delta t}{\Delta x} u \right ) + &=& a_{i,j}^n + + \frac{\Delta x}{2} \left ( 1 - \frac{\Delta t}{\Delta x} u \right ) \left .\frac{\partial a}{\partial x} \right |_{i,j} + \ldots \label{eq:statels} \end{eqnarray} @@ -736,18 +736,18 @@ \subsection{Unsplit multi-dimensional advection} The construction of the $a_{i+\myhalf,j,L}^{n+\myhalf}$ interface state appears as \begin{eqnarray} -a_{i+\myhalf,j,L}^{n+\myhalf} &=& a_{i,j}^n + - \frac{\Delta x}{2} \left .\frac{\partial a}{\partial x} \right |_{i,j} + - \frac{\Delta t}{2} \left .\frac{\partial a}{\partial t} \right |_{i,j} + +a_{i+\myhalf,j,L}^{n+\myhalf} &=& a_{i,j}^n + + \frac{\Delta x}{2} \left .\frac{\partial a}{\partial x} \right |_{i,j} + + \frac{\Delta t}{2} \left .\frac{\partial a}{\partial t} \right |_{i,j} + \mathcal{O}(\Delta x^2) + \mathcal{O}(\Delta t^2) \nonumber \\ - &=& a_{i,j}^n + - \frac{\Delta x}{2} \left .\frac{\partial a}{\partial x} \right |_{i,j} + - \frac{\Delta t}{2} \left ( - - u \left .\frac{\partial a}{\partial x} \right |_{i,j} + &=& a_{i,j}^n + + \frac{\Delta x}{2} \left .\frac{\partial a}{\partial x} \right |_{i,j} + + \frac{\Delta t}{2} \left ( + - u \left .\frac{\partial a}{\partial x} \right |_{i,j} - v \left .\frac{\partial a}{\partial y} \right |_{i,j} \right ) + \ldots \nonumber \\ - &=& \underbrace{a_{i,j}^n + - \frac{\Delta x}{2} \left ( 1 - \frac{\Delta t}{\Delta x} u \right ) + &=& \underbrace{a_{i,j}^n + + \frac{\Delta x}{2} \left ( 1 - \frac{\Delta t}{\Delta x} u \right ) \left .\frac{\partial a}{\partial x} \right |_{i,j}}_{\hat{a}_{i+\myhalf,j,L}^{n+\myhalf}} \underbrace{- \frac{\Delta t}{2} v \left .\frac{\partial a}{\partial y} \right |_{i,j}}_{\mathrm{``transverse~flux~difference''}} + \ldots \label{eq:statelu} @@ -756,7 +756,7 @@ \subsection{Unsplit multi-dimensional advection} explicitly appearance of the ``transverse flux difference'' in the unsplit interface state. We rewrite this as: \begin{equation} -a_{i+\myhalf,j,L}^{n+\myhalf} = \hat{a}_{i+\myhalf,j,L}^{n+\myhalf} +a_{i+\myhalf,j,L}^{n+\myhalf} = \hat{a}_{i+\myhalf,j,L}^{n+\myhalf} - \frac{\Delta t}{2} v \left .\frac{\partial a}{\partial y} \right |_{i,j} \end{equation} Here, the $\hat{a}_{i+\myhalf,j,L}^{n+\myhalf}$ term is just the normal @@ -768,7 +768,7 @@ \subsection{Unsplit multi-dimensional advection} compute these one-dimensional $\hat{a}$'s at the left and right every interface in both coordinate directions. Note that these states are still one-dimensional, since we have not used any information from the -transverse direction in their computation. +transverse direction in their computation. \item Solve a Riemann problem at each of these interfaces: \begin{eqnarray} @@ -778,13 +778,13 @@ \subsection{Unsplit multi-dimensional advection} \hat{a}_{i,j+\myhalf,R}^{n+\myhalf}) \\ \end{eqnarray} These states are given the `$^T$' superscript since they are the states -that are used in computing the transverse flux difference. +that are used in computing the transverse flux difference. -\item Correct the +\item Correct the previously computed normal interface states (the $\hat{a}$'s) with the transverse flux difference: \begin{equation} -a_{i+\myhalf,j,L}^{n+\myhalf} = \hat{a}_{i+\myhalf,j,L}^{n+\myhalf} +a_{i+\myhalf,j,L}^{n+\myhalf} = \hat{a}_{i+\myhalf,j,L}^{n+\myhalf} - \frac{\Delta t}{2} v \frac{a^T_{i,j+\myhalf} - a^T_{i,j-\myhalf}}{\Delta y} \end{equation} Notice that the @@ -793,11 +793,11 @@ \subsection{Unsplit multi-dimensional advection} right state, it would be those that are transverse, but to the right of the interface: \begin{equation} -a_{i+\myhalf,j,R}^{n+\myhalf} = \hat{a}_{i+\myhalf,j,R}^{n+\myhalf} +a_{i+\myhalf,j,R}^{n+\myhalf} = \hat{a}_{i+\myhalf,j,R}^{n+\myhalf} - \frac{\Delta t}{2} v \frac{a^T_{i+1,j+\myhalf} - a^T_{i+1,j-\myhalf}}{\Delta y} \end{equation} \end{itemize} -A similar procedure happens at the $y$-interfaces. +A similar procedure happens at the $y$-interfaces. Figure~\ref{fig:unsplitstates} illustrates the steps involved in the construction of the $a_{i+\myhalf,j,L}^{n+\myhalf}$ state. \MarginPar{more panels illustrating the sequence?} @@ -821,7 +821,7 @@ \subsection{Unsplit multi-dimensional advection} Once all of the full states (normal prediction $+$ transverse flux difference) are computed to the left and right of all the interfaces -($x$ and $y$), we solve another Riemann problem to find the final +($x$ and $y$), we solve another Riemann problem to find the final state on each interface. \begin{equation} a_{i+\myhalf,j}^{n+\myhalf} = \mathcal{R}(a_{i+\myhalf,j,L}^{n+\myhalf}, @@ -829,7 +829,7 @@ \subsection{Unsplit multi-dimensional advection} \end{equation} The final conservative update is then done via Eq.~\ref{eq:update2du}. -See \cite{colella:1990} for more details on this unsplit method, +See \cite{colella:1990} for more details on this unsplit method, and \cite{saltzman:1994} for details of the extension to 3-d. Figures~\ref{fig:adv:gaussian-2d} and \ref{fig:adv:tophat-2d} show the @@ -916,12 +916,12 @@ \subsection{Method-of-lines in multi-dimensions} \item x-face: \begin{equation} \langle (ua)_{i+\myhalf,j} \rangle = \frac{1}{\Delta y} - \int_{y_{j-\myhalf}}^{y_{j+\myhalf}} (ua)_{i+\myhalf,j}\, dy + \int_{y_{j-\myhalf}}^{y_{j+\myhalf}} (ua)_{i+\myhalf,j}\, dy \end{equation} \item y-face \begin{equation} \langle (va)_{i,j+\myhalf} \rangle = \frac{1}{\Delta x} - \int_{x_{i-\myhalf}}^{x_{i+\myhalf}} (va)_{i,j+\myhalf}\, dx + \int_{x_{i-\myhalf}}^{x_{i+\myhalf}} (va)_{i,j+\myhalf}\, dx \end{equation} \end{itemize} These are similar to the expressions above, except there is no @@ -979,7 +979,7 @@ \subsection{Method-of-lines in multi-dimensions} \begin{equation} a^n_{i,j} = A^n e^{Ii\theta}e^{Ij\phi} \end{equation} -Next, to simplify things, we'll assume that $u = v$, and $\Delta x = \Delta y$, +Next, to simplify things, we'll assume that $u = v$, and $\Delta x = \Delta y$, then $\cfl = u \Delta t/ \Delta x = v \Delta t / \Delta y$. Inserting this into our difference equation gives: \begin{equation} @@ -1004,7 +1004,7 @@ \subsection{Method-of-lines in multi-dimensions} method in \cite{mccorquodalecolella} allows for $\Delta t \sum_{i=1}^d (|\Ub \cdot \mathbf{e}_d|)/\Delta x_d \lesssim 1.4$. Total variation diminishing Runge-Kutta methods are popular for this application~\cite{gottliebshu:1996}. -% run as: +% run as: % ./pyro.py advection_rk tophat inputs.tophat % ./plot.py -W 7.7 -H 6 -o tophat_rk4_cfl08.pdf advection_rk tophat_0040 % @@ -1019,7 +1019,7 @@ \subsection{Method-of-lines in multi-dimensions} the method-of-lines approach with 4th-order Runge-Kutta time integration. We use $u = v = 1$ for one period on a $32\times 32$ grid. On the left is $\cfl = 0.8$---this is clearly unstable. On the right is $\cfl = 0.4$, - which is stable. + which is stable. This was run as {\tt ./pyro.py advection\_rk tophat inputs.tophat}} \end{figure} @@ -1315,6 +1315,104 @@ \subsubsection{Implementation issues with WENO schemes} \end{figure} % +\subsection{Discontinuous Galerkin methods} +\label{sec:dg} + +In addition to the issues with higher order schemes noted above, there is one +wasteful step that is worth noting. Each time a higher order scheme reconstructs +the data it constructs a high-order piecewise polynomial representation of the +data everywhere. Then, in the time update, most of this information is thrown +away. At the beginning of each timestep we only know the value of the function +(for finite difference approaches) or its integral average (for finite volume +approaches). + +Some alternative methods store the \emph{moments} or \emph{modes} of the +solution, and update all of them. In these methods all of the information +needed to evaluate the solution is available at all times and locations, and +all the information is updated at every step. This should make the methods more +efficient and more local (with a smaller stencil, and hence better on parallel +machines). Their disadvantages will come in the timestep and with discontinuous +data. + +\subsubsection{Function basis and weak form} +\label{sec:dg_basis} + +Recall that in this chapter we are looking at the advection equation +% +\begin{equation} + \tag{\ref{eq:ho-advect}} + a_t + u a_x = 0. +\end{equation} +% +We want to be able to compute the value of the function $a(t, x)$ at any point. +We can do this by writing $a$ in terms of a \emph{function basis} $\psi_n(t, x)$ +as +% +\begin{equation} + \label{eq:dg_fn_basis} + a(t, x) = \sum_n \hat{a}_n \psi_n(t, x). +\end{equation} +% +Here the \emph{modes} or \emph{modal coefficients} $\hat{a}_n$ are constants. An +example of a function basis would be +% +\begin{align*} + \psi_{0}(t, x) &= 1, & \psi_{1}(t, x) &= x, & \psi_{2}(t, x) &= t, \\ + \psi_{3}(t, x) &= \tfrac{1}{2} x^2, & \psi_{4}(t, x) &= \tfrac{1}{2} t^2, & + \psi_{5}(t, x) &= x t. +\end{align*} +% +These six modes will perfectly describe any function that remains quadratic for +all space and time. + +It is often more convenient the explicitly separate space and time, as we saw +using the Method of Lines in section~\ref{adv:sec:mol_2d}. In this case we can +represent the solution using a purely spatial function basis, as +% +\begin{equation} + \label{eq:dg_fn_basis_split} + a(t, x) = \sum_n \hat{a}_n(t) \psi_n(x). +\end{equation} +% +Now the modes depend on time, and there will only be three basis functions +needed to describe quadratic data. + +Let us take our solution written in terms of a function basis from equation~\ref{eq:dg_fn_basis_split} +and plug it into the advection equation~\ref{eq:ho-advect}. Unless we use an +infinite number of basis functions $\psi_n$ we will not have a perfect solution +to the advection equation in general, and so the equation will not be perfectly +satisfied. There will be some resulting error, $\epsilon(t, x)$. As our function +basis can describe any function, we expand the error in terms of the $\psi_n$ as +well, as +% +\begin{equation} + \label{eq:dg_error} + \epsilon(t, x) = \sum_n \hat{\epsilon}_n(t) \psi_n(x). +\end{equation} +% +Therefore our advection equation, including the error term, becomes +% +\begin{equation} + \label{eq:dg_advection} + \sum_n \left[ \left( \ddt{\hat{a}_n} - \hat{\epsilon}_n \right) \psi_n(x) + + \hat{a}_n \ddx{\psi_n}(x) \right] = 0. +\end{equation} +% + +This looks like a mess. However, the whole point of having a function \emph{basis} +is to use linear algebra techniques on the basis functions $\psi_n$. By using +the appropriate inner product we can split any equation like~\ref{eq:dg_advection} +into individual equations for each basis function separately. The standard inner +product to use is to multiply by another basis function, $\psi_m(x)$, and then +integrate over the domain. Here that gives, after integration by parts, +% +\begin{equation} + \label{eq:dg_advection2} + \sum_n \left[ \left( \int_V \psi_m(x) \psi_n(x) \right) \left( \ddt{\hat{a}_n} - \hat{\epsilon}_n \right) + \left( \int_{\partial V} \hat{a}_n \psi_m(x) \psi_n(x) \right) - \left( \int_V \hat{a}_n \psi_n(x) \ddx{\psi_m}(x) \right) \right] = 0. +\end{equation} +% + + \section{Going further} @@ -1341,18 +1439,18 @@ \section{Going further} \end{equation} The solution procedure is largely the same as described above. We write: \begin{align} -\phi_{i+\myhalf,j,L}^{n+\myhalf} &= \phi_{i,j}^n + +\phi_{i+\myhalf,j,L}^{n+\myhalf} &= \phi_{i,j}^n + \frac{\Delta x}{2} \frac{\partial \phi}{\partial x} + \frac{\Delta t}{2} \frac{\partial \phi}{\partial t} + \ldots \nonumber \\ % - &= \phi_{i,j}^n + + &= \phi_{i,j}^n + \frac{\Delta x}{2} \frac{\partial \phi}{\partial x} + \frac{\Delta t}{2} \left [ -(\phi u)_x -(\phi v)_y \right ]_{i,j} \nonumber\\ % - &= \underbrace{\phi_{i,j}^n + + &= \underbrace{\phi_{i,j}^n + \frac{\Delta x}{2} \left ( 1 - \frac{\Delta t}{\Delta x} u_{i,j} \right ) \frac{\partial \phi}{\partial x}}_{\hat{\phi}_{i+\myhalf,j,L}^{n+\myhalf}} - - \frac{\Delta t}{2} \left [\phi u_x \right ]_{i,j} + - \frac{\Delta t}{2} \left [\phi u_x \right ]_{i,j} - \frac{\Delta t}{2} \left [ (\phi v)_y \right ]_{i,j} \end{align} and upwinding is used to resolve the Riemann problem for both the @@ -1361,7 +1459,7 @@ \section{Going further} according to the velocity field in much the fashion shown here, and is described in \S~\ref{sec:lm:density}. - + For compressible hydrodynamics, we often have density-weighted quantities that we advect. This extension is described in \S~\ref{sec:euler:further}. @@ -1370,7 +1468,7 @@ \section{Going further} \section{\pyro\ experimentation} -To gain some experiences with these ideas, we can use the advection +To gain some experiences with these ideas, we can use the advection solver in \pyro\ (see Appendix~\ref{app:pyro} to get started). The \pyro\ advection solver implements the second-order unsplit advection algorithm described in the previous sections. To run @@ -1402,4 +1500,3 @@ \section{\pyro\ experimentation} and compare the results to the unsplit version. Pick a suitable norm and measure the convergence of the methods.} \end{exercise} - From 9699afe390fbcc270cc0d8e58806ef9fce8a320b Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Mon, 18 Feb 2019 11:45:11 +0000 Subject: [PATCH 02/29] More on DG. Need to fix the flux terms. --- advection/advection-higherorder.tex | 123 ++++++++++++++++++++++++++-- 1 file changed, 114 insertions(+), 9 deletions(-) diff --git a/advection/advection-higherorder.tex b/advection/advection-higherorder.tex index c963251..d4af180 100644 --- a/advection/advection-higherorder.tex +++ b/advection/advection-higherorder.tex @@ -1356,11 +1356,14 @@ \subsubsection{Function basis and weak form} Here the \emph{modes} or \emph{modal coefficients} $\hat{a}_n$ are constants. An example of a function basis would be % -\begin{align*} - \psi_{0}(t, x) &= 1, & \psi_{1}(t, x) &= x, & \psi_{2}(t, x) &= t, \\ - \psi_{3}(t, x) &= \tfrac{1}{2} x^2, & \psi_{4}(t, x) &= \tfrac{1}{2} t^2, & - \psi_{5}(t, x) &= x t. -\end{align*} +\begin{equation} + \label{eq:dg_monomial_basis} + \begin{aligned} + \psi_{0}(t, x) &= 1, & \psi_{1}(t, x) &= x, & \psi_{2}(t, x) &= t, \\ + \psi_{3}(t, x) &= \tfrac{1}{2} x^2, & \psi_{4}(t, x) &= \tfrac{1}{2} t^2, & + \psi_{5}(t, x) &= x t. + \end{aligned} +\end{equation} % These six modes will perfectly describe any function that remains quadratic for all space and time. @@ -1399,20 +1402,122 @@ \subsubsection{Function basis and weak form} \end{equation} % -This looks like a mess. However, the whole point of having a function \emph{basis} -is to use linear algebra techniques on the basis functions $\psi_n$. By using +We will now restrict our function basis to be finite, so we only work with a +finite number of modes. This is of course necessary in order to solve it on a +computer. We will also choose, or enforce, that the error does not appear in the +modes that we choose. In other words, +% +\begin{align} + a(t, x) &= \sum_{n=0}^N \hat{a}(t) \psi_n(x), \\ + \epsilon(t, x) &= \sum_{n=N+1}^{\infty} \hat{\epsilon}(t) \psi_n(x). +\end{align} +% +We can construct an exact solution to the resulting equation: however, this +equation is no longer exactly the original problem (although it approaches it +rapidly as $N \to \infty$). We now have +% +\begin{equation} + \label{eq:dg_advection2} + \sum_{n=0}^{N} \left[ \ddt{\hat{a}_n} \psi_n(x) + \hat{a}_n \ddx{\psi_n}(x) \right] = 0. +\end{equation} +% +We can now use linear algebra techniques on the basis functions $\psi_n$. By using the appropriate inner product we can split any equation like~\ref{eq:dg_advection} into individual equations for each basis function separately. The standard inner product to use is to multiply by another basis function, $\psi_m(x)$, and then integrate over the domain. Here that gives, after integration by parts, % \begin{equation} - \label{eq:dg_advection2} - \sum_n \left[ \left( \int_V \psi_m(x) \psi_n(x) \right) \left( \ddt{\hat{a}_n} - \hat{\epsilon}_n \right) + \left( \int_{\partial V} \hat{a}_n \psi_m(x) \psi_n(x) \right) - \left( \int_V \hat{a}_n \psi_n(x) \ddx{\psi_m}(x) \right) \right] = 0. + \label{eq:dg_advection3} + \sum_n \left[ \left( \int_V \psi_m(x) \psi_n(x) \right) \ddt{\hat{a}_n} + \left( \int_{\partial V} \psi_m(x) \psi_n(x) \right) \hat{a}_n - \left( \int_V \psi_n(x) \ddx{\psi_m}(x) \right) \hat{a}_n \right] = 0. +\end{equation} +% +We will, for now, restrict to one dimension and set $V = [-1, 1]$. This can be +rescaled to cover any cell in one dimension. This simplifies the general form to +% +\begin{equation} + \label{eq:dg_advection4} + \sum_n \left[ \left( \int_{-1}^1 \psi_m(x) \psi_n(x) \right) \ddt{\hat{a}_n} - \left( \int_{-1}^1 \psi_n(x) \ddx{\psi_m}(x) \right) \hat{a}_n \right] = \sum_n -\left[ \psi_m(x) \psi_n(x) \hat{a}_n \right]_{-1}^1. \end{equation} % +We can write this result as a matrix equation. Define the state vector +% +\begin{equation} + \label{eq:dg_state_vector} + \mathbf{\hat{a}} = (\hat{a}_0, \dots, \hat{a}_N). +\end{equation} +% +Then define the matrices +% +\begin{align} + \label{eq:dg_mass_matrix} + \hat{M}_{mn} &= \int_V \psi_m(x) \psi_n(x), \\ + \label{eq:dg_stiffness_matrix} + \hat{S}_{mn} &= \int_V \psi_n(x) \ddx{\psi_m}(x), +\end{align} +% +which can be pre-calculated and stored for repeated use. These are typically +referred to (building on finite \emph{element} work) as the \emph{mass} matrix +($\hat{M}$) and the \emph{stiffness} matrix ($\hat{S}$). We therefore finally +have +% +\begin{equation} + \label{eq:dg_advection5} + \hat{M} \ddt \mathbf{\hat{a}} + \hat{S} \mathbf{\hat{a}} = -\left[ \dots \right]_{-1}^1. +\end{equation} +% +The right hand side term is not yet expanded as it requires coupling to +neighbouring cells, or boundary conditions. Focus on the other terms first. + +We see that, once we have evaluated the mass and stiffness matrices, we can then +update \emph{all} modes $\mathbf{\hat{a}}$ by evaluating the boundary flux term +on the right hand side and solving a linear system. This illustrates the small +stencil of discontinuous Galerkin schemes: the only coupling to the other cells +is through that boundary integral, which only couples to direct neighbours. + +We also see that the behaviour of the scheme will crucially depend on the mass +matrix $\hat{M}$. If it is singular the scheme cannot work. If it is poorly +conditioned then the scheme will rapidly lose accuracy. Crucially, with the +monomial basis of equation~\ref{eq:dg_monomial_basis}, the condition number of +the mass matrix grows very rapidly, and the scheme loses accuracy for moderate +$N$. Instead, it is sensible to pick as a function basis something from the class +of \emph{orthogonal polynomials}, where +% +\begin{equation} + \label{eq:dg_orthog_polys} + \int_V w(x) \psi_m(x) \psi_n(x) \propto \delta_{mn}. +\end{equation} +% +The Kronecker delta $\delta_{mn}$ ensures that the mass matrix is diagonal, and +hence always easy to invert. +When the \emph{weight function} $w(x)$ is identically $1$, as needed for the +mass matrix in equation~\ref{eq:dg_mass_matrix}, this suggests we should use the +\emph{Legendre polynomials} $\psi_n(x) = P_n(x)$, which obey +% +\begin{equation} + \label{eq:dg_legendre_poly} + \int_{-1}^1 P_m(x) P_n(x) = \frac{2}{2 n + 1} \delta_{mn}. +\end{equation} +% +A further simplification comes from choosing the normalized Legendre polynomials +% +\begin{equation} + \label{eq:dg_legendre_poly_norm} + \tilde{P}_n(x) = \sqrt{\frac{2 n + 1}{2}} P_n(x) +\end{equation} +% +which ensures that the mass matrix $\hat{M}$ is the identity matrix. +Now that we have fixed a choice of basis functions we can evaluate the mass +matrix (which will be the identity here) and the stiffness matrix $\hat{S}$. We +still need to evaluate the boundary flux. If we explicitly write out equation~\ref{eq:dg_advection5} +in index form we have +% +\begin{equation} + \label{eq:dg_advection6} + \hat{M}_{mn} \ddt \hat{a}_n + \hat{S}_{mn} \hat{a}_n = -\left[ \right]_{-1}^1. +\end{equation} \section{Going further} From 2307fb84c6bafa08ea10776f33e2c968af19a87a Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Mon, 18 Feb 2019 15:42:39 +0000 Subject: [PATCH 03/29] Correct TeX issue. --- advection/advection-higherorder.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/advection/advection-higherorder.tex b/advection/advection-higherorder.tex index d4af180..9b78097 100644 --- a/advection/advection-higherorder.tex +++ b/advection/advection-higherorder.tex @@ -1464,7 +1464,7 @@ \subsubsection{Function basis and weak form} % \begin{equation} \label{eq:dg_advection5} - \hat{M} \ddt \mathbf{\hat{a}} + \hat{S} \mathbf{\hat{a}} = -\left[ \dots \right]_{-1}^1. + \hat{M} \ddt{\mathbf{\hat{a}}} + \hat{S} \mathbf{\hat{a}} = -\left[ \dots \right]_{-1}^1. \end{equation} % The right hand side term is not yet expanded as it requires coupling to @@ -1516,7 +1516,7 @@ \subsubsection{Function basis and weak form} % \begin{equation} \label{eq:dg_advection6} - \hat{M}_{mn} \ddt \hat{a}_n + \hat{S}_{mn} \hat{a}_n = -\left[ \right]_{-1}^1. + \hat{M}_{mn} \ddt{\hat{a}_n} + \hat{S}_{mn} \hat{a}_n = -\left[ \right]_{-1}^1. \end{equation} \section{Going further} From d152b4379af57b271b83abb7cdfc87f89bd3fc7f Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Mon, 18 Feb 2019 15:58:24 +0000 Subject: [PATCH 04/29] Correct fluxes, stiffness matrix. --- advection/advection-higherorder.tex | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/advection/advection-higherorder.tex b/advection/advection-higherorder.tex index 9b78097..ed0921a 100644 --- a/advection/advection-higherorder.tex +++ b/advection/advection-higherorder.tex @@ -1398,7 +1398,7 @@ \subsubsection{Function basis and weak form} \begin{equation} \label{eq:dg_advection} \sum_n \left[ \left( \ddt{\hat{a}_n} - \hat{\epsilon}_n \right) \psi_n(x) + - \hat{a}_n \ddx{\psi_n}(x) \right] = 0. + u \hat{a}_n \ddx{\psi_n}(x) \right] = 0. \end{equation} % @@ -1418,7 +1418,7 @@ \subsubsection{Function basis and weak form} % \begin{equation} \label{eq:dg_advection2} - \sum_{n=0}^{N} \left[ \ddt{\hat{a}_n} \psi_n(x) + \hat{a}_n \ddx{\psi_n}(x) \right] = 0. + \sum_{n=0}^{N} \left[ \ddt{\hat{a}_n} \psi_n(x) + u \hat{a}_n \ddx{\psi_n}(x) \right] = 0. \end{equation} % We can now use linear algebra techniques on the basis functions $\psi_n$. By using @@ -1429,7 +1429,7 @@ \subsubsection{Function basis and weak form} % \begin{equation} \label{eq:dg_advection3} - \sum_n \left[ \left( \int_V \psi_m(x) \psi_n(x) \right) \ddt{\hat{a}_n} + \left( \int_{\partial V} \psi_m(x) \psi_n(x) \right) \hat{a}_n - \left( \int_V \psi_n(x) \ddx{\psi_m}(x) \right) \hat{a}_n \right] = 0. + \sum_n \left[ \left( \int_V \psi_m(x) \psi_n(x) \right) \ddt{\hat{a}_n} + \left( \int_{\partial V} \psi_m(x) \psi_n(x) \right) u \hat{a}_n - \left( \int_V \psi_n(x) \ddx{\psi_m}(x) \right) u \hat{a}_n \right] = 0. \end{equation} % We will, for now, restrict to one dimension and set $V = [-1, 1]$. This can be @@ -1437,7 +1437,7 @@ \subsubsection{Function basis and weak form} % \begin{equation} \label{eq:dg_advection4} - \sum_n \left[ \left( \int_{-1}^1 \psi_m(x) \psi_n(x) \right) \ddt{\hat{a}_n} - \left( \int_{-1}^1 \psi_n(x) \ddx{\psi_m}(x) \right) \hat{a}_n \right] = \sum_n -\left[ \psi_m(x) \psi_n(x) \hat{a}_n \right]_{-1}^1. + \sum_n \left[ \left( \int_{-1}^1 \psi_m(x) \psi_n(x) \right) \ddt{\hat{a}_n} - \left( \int_{-1}^1 \psi_n(x) \ddx{\psi_m}(x) \right) u \hat{a}_n \right] = \sum_n -\left[ \psi_m(x) \psi_n(x) u \hat{a}_n \right]_{-1}^1. \end{equation} % @@ -1454,7 +1454,7 @@ \subsubsection{Function basis and weak form} \label{eq:dg_mass_matrix} \hat{M}_{mn} &= \int_V \psi_m(x) \psi_n(x), \\ \label{eq:dg_stiffness_matrix} - \hat{S}_{mn} &= \int_V \psi_n(x) \ddx{\psi_m}(x), + \hat{S}_{mn} &= \int_V \psi_m(x) \ddx{\psi_n}(x), \end{align} % which can be pre-calculated and stored for repeated use. These are typically @@ -1464,7 +1464,7 @@ \subsubsection{Function basis and weak form} % \begin{equation} \label{eq:dg_advection5} - \hat{M} \ddt{\mathbf{\hat{a}}} + \hat{S} \mathbf{\hat{a}} = -\left[ \dots \right]_{-1}^1. + \hat{M} \ddt{\mathbf{\hat{a}}} + \hat{S}^T u \mathbf{\hat{a}} = -\left[ \dots \right]_{-1}^1. \end{equation} % The right hand side term is not yet expanded as it requires coupling to @@ -1516,7 +1516,7 @@ \subsubsection{Function basis and weak form} % \begin{equation} \label{eq:dg_advection6} - \hat{M}_{mn} \ddt{\hat{a}_n} + \hat{S}_{mn} \hat{a}_n = -\left[ \right]_{-1}^1. + \hat{M}_{mn} \ddt{\hat{a}_n} + \hat{S}^T_{mn} u \hat{a}_n = -\left[ \right]_{-1}^1. \end{equation} \section{Going further} From fead422d45bfa3ca831677cbb2fd2fc41d673a4a Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Mon, 18 Feb 2019 16:51:14 +0000 Subject: [PATCH 05/29] End of modal part. --- advection/advection-higherorder.tex | 46 +++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/advection/advection-higherorder.tex b/advection/advection-higherorder.tex index ed0921a..895bd32 100644 --- a/advection/advection-higherorder.tex +++ b/advection/advection-higherorder.tex @@ -1512,12 +1512,54 @@ \subsubsection{Function basis and weak form} Now that we have fixed a choice of basis functions we can evaluate the mass matrix (which will be the identity here) and the stiffness matrix $\hat{S}$. We still need to evaluate the boundary flux. If we explicitly write out equation~\ref{eq:dg_advection5} -in index form we have +in index form (using Einstein summation convention over $n$) we have % \begin{equation} \label{eq:dg_advection6} - \hat{M}_{mn} \ddt{\hat{a}_n} + \hat{S}^T_{mn} u \hat{a}_n = -\left[ \right]_{-1}^1. + \hat{M}_{mn} \ddt{\hat{a}_n} + \hat{S}^T_{mn} u \hat{a}_n = -\left[ u P_m(x) P_n(x) \hat{a}_n \right]_{-1}^1. \end{equation} +% +We can now directly use that $P_n(1) = 1$ and $P_n(-1) = (-1)^n$ to get the +boundary flux term as +% +\begin{equation} + \label{eq:dg_boundary_flux_modal} + -\left[ u P_m(x) P_n(x) \hat{a}_n \right]_{-1}^1 = u \left\{ (-1)^{m+n} A_n(-1) - A_n(1) \right\}. +\end{equation} +% +Here $A_n(1)$, for example, is the $n^{\text{th}}$ mode of the solution at the +boundary. As there are two solutions at the boundary of the element - the +solution at $x = 1_{-}$ from the interior of the element, and the solution at +$x = 1_{+}$ from the exterior (either another element, or from the boundary +conditions), we need a Riemann solver to give us a single solution at $x=1$. In +the case of linear advection, as here, we can use the upwind solver for the +modes as well as for the solution, so +% +\begin{equation} + \label{eq:dg_riemann_solver} + A_n(x; a^{-}_n, a^{+}_n) = \begin{cases} + a^{-}_n & \text{if } u \ge 0 \\ a^{+}_n & \text{otherwise.} +\end{cases} +\end{equation} +% + +Two points should be immediately noted about this discontinuous Galerkin method. +First, if we restrict to only one mode ($N=0$), then the only basis function we +have is $\tilde{P}_0(x) = 1 \ sqrt{2}$, the mass matrix $\hat{M} = 1$, the +stiffness matrix vanishes, and the boundary flux term reduces to the standard +finite volume update. In general, the zero mode corresponds to the integral +average over the cell or element. + +Second, we note that the boundary flux term always couples different modes (when +including more than just one), and only in the linear case will it be simple to +give a flux formula that works for all modes. As the boundary flux term is +crucial in many cases, we need to change approach to simplify the calculation of +this term using (possibly approximate) solutions to the Riemann problem. + +\subsubsection{Nodal Discontinuous Galerkin} +\label{sec:dg_nodal} + + \section{Going further} From 2f6e7b40bde4ae6943ed84a0e37128c9f04f9c00 Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Mon, 18 Feb 2019 17:12:38 +0000 Subject: [PATCH 06/29] Typo --- advection/advection-higherorder.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advection/advection-higherorder.tex b/advection/advection-higherorder.tex index 895bd32..e8d6073 100644 --- a/advection/advection-higherorder.tex +++ b/advection/advection-higherorder.tex @@ -1545,7 +1545,7 @@ \subsubsection{Function basis and weak form} Two points should be immediately noted about this discontinuous Galerkin method. First, if we restrict to only one mode ($N=0$), then the only basis function we -have is $\tilde{P}_0(x) = 1 \ sqrt{2}$, the mass matrix $\hat{M} = 1$, the +have is $\tilde{P}_0(x) = 1 / \sqrt{2}$, the mass matrix $\hat{M} = 1$, the stiffness matrix vanishes, and the boundary flux term reduces to the standard finite volume update. In general, the zero mode corresponds to the integral average over the cell or element. From 299c9000ad1563b150522dddfdb9e73077a68e3d Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Mon, 18 Feb 2019 17:17:44 +0000 Subject: [PATCH 07/29] Fix state vector defn. --- advection/advection-higherorder.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advection/advection-higherorder.tex b/advection/advection-higherorder.tex index e8d6073..a17611c 100644 --- a/advection/advection-higherorder.tex +++ b/advection/advection-higherorder.tex @@ -1445,7 +1445,7 @@ \subsubsection{Function basis and weak form} % \begin{equation} \label{eq:dg_state_vector} - \mathbf{\hat{a}} = (\hat{a}_0, \dots, \hat{a}_N). + \mathbf{\hat{a}} = (\hat{a}_0, \dots, \hat{a}_N)^T. \end{equation} % Then define the matrices From ab488ff0b89b9740cf91ce324d655f0887648b31 Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Tue, 19 Feb 2019 16:46:02 +0000 Subject: [PATCH 08/29] Start on nodal DG. --- advection/advection-higherorder.tex | 66 ++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/advection/advection-higherorder.tex b/advection/advection-higherorder.tex index a17611c..e992d2e 100644 --- a/advection/advection-higherorder.tex +++ b/advection/advection-higherorder.tex @@ -1452,9 +1452,9 @@ \subsubsection{Function basis and weak form} % \begin{align} \label{eq:dg_mass_matrix} - \hat{M}_{mn} &= \int_V \psi_m(x) \psi_n(x), \\ + \hat{M}_{mn} &= \int_{-1}^1 \psi_m(x) \psi_n(x), \\ \label{eq:dg_stiffness_matrix} - \hat{S}_{mn} &= \int_V \psi_m(x) \ddx{\psi_n}(x), + \hat{S}_{mn} &= \int_{-1}^1 \psi_m(x) \ddx{\psi_n}(x), \end{align} % which can be pre-calculated and stored for repeated use. These are typically @@ -1559,6 +1559,68 @@ \subsubsection{Function basis and weak form} \subsubsection{Nodal Discontinuous Galerkin} \label{sec:dg_nodal} +A problem with the modal form used above is with the boundary flux term. In +standard finite volume schemes we need the value of the function either side of +the interface. This suggests that, rather than using a modal expansion as above, +we should use a \emph{nodal} expansion where the values of the functions are +known at particular points. If two of those points are at the boundaries of the +cell then those values can be used to compute the flux. + +Let us denote these nodal locations by $\xi_i$, and the values of the solution +at these locations by $a_i$. We therefore have our solution in the form +% +\begin{equation} + \label{eq:dg_nodal_interp} + a(t, x) = \sum_{i=0}^N a_i(t) \ell_i(x) +\end{equation} +% +where the $\ell_i(x)$ are the standard indicator interpolating polynomials that +obey +% +\begin{equation} + \label{eq:dg_nodal_interp_indicator} + \ell_i(\xi_j) = \delta_{ij}. +\end{equation} +% +Our \emph{modal} form of the solution writes +% +\begin{equation} + \tag{\ref{eq:dg_fn_basis_split}} + a(t, x) = \sum_n \hat{a}_n(t) \psi_n(x), +\end{equation} +% +so by evaluating both forms at a node $\xi_j$ we get +% +\begin{equation} + \label{eq:dg_nodal_vandermonde1} + a_j = \sum_n \psi_n(\xi_j) \hat{a}_n. +\end{equation} +% +By defining a (generalized) \emph{Vandermonde} matrix $\hat{V}$ as +% +\begin{equation} + \label{eq:dg_nodal_vandermonde2} + \hat{V}_{nj} = \psi_n(\xi_j) +\end{equation} +% +we see that we can translate from the modal state vector +$\mathbf{\hat{a}} = (\hat{a}_0, \dots, \hat{a}_N)^T$ to the nodal state vector +$\mathbf{a} = (a_0, \dots, a_N)^T$ via the matrix equation +% +\begin{equation} + \label{eq:dg_nodal_vandermonde3} + \hat{V} \mathbf{\hat{a}} = \mathbf{a}. +\end{equation} + +We have constructed the modal scheme to be well conditioned by looking at the +mass matrix. This suggests that to make the nodal scheme well behaved we should +ensure good conditioning of the Vandermonde matrix. This requires carefully +choosing the nodes $\xi_i$. We also want to ensure that two of the nodes are at +$x = \pm 1$, and that the accuracy of the scheme is as good as possible. All +these conditions combine to suggest that the nodes $\xi_i$ should be given by +the \emph{Legendre-Gauss-Lobatto} points, which are the zeros of $P_N'(x)$ +combined with $\pm 1$. + \section{Going further} From 20aa00186df2c333d8f53d2c87970d72d31b9abd Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Tue, 19 Feb 2019 17:08:42 +0000 Subject: [PATCH 09/29] More on Vandermonde matrix. --- advection/advection-higherorder.tex | 50 +++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/advection/advection-higherorder.tex b/advection/advection-higherorder.tex index e992d2e..fb7366a 100644 --- a/advection/advection-higherorder.tex +++ b/advection/advection-higherorder.tex @@ -1600,7 +1600,7 @@ \subsubsection{Nodal Discontinuous Galerkin} % \begin{equation} \label{eq:dg_nodal_vandermonde2} - \hat{V}_{nj} = \psi_n(\xi_j) + \hat{V}_{jn} = \psi_n(\xi_j) \end{equation} % we see that we can translate from the modal state vector @@ -1612,14 +1612,46 @@ \subsubsection{Nodal Discontinuous Galerkin} \hat{V} \mathbf{\hat{a}} = \mathbf{a}. \end{equation} -We have constructed the modal scheme to be well conditioned by looking at the -mass matrix. This suggests that to make the nodal scheme well behaved we should -ensure good conditioning of the Vandermonde matrix. This requires carefully -choosing the nodes $\xi_i$. We also want to ensure that two of the nodes are at -$x = \pm 1$, and that the accuracy of the scheme is as good as possible. All -these conditions combine to suggest that the nodes $\xi_i$ should be given by -the \emph{Legendre-Gauss-Lobatto} points, which are the zeros of $P_N'(x)$ -combined with $\pm 1$. +We can also connect the basis functions $\psi_n$ to the interpolating polynomials +$\ell_i$ via the Vandermonde matrix. Note that +% +\begin{subequations} + \label{eq:dg_nodal_vandermonde4} + \begin{align} + && a(t, x) &= \sum_n \hat{a}_n \psi_n(x) \\ + && &= \sum_i a_i \ell_i(x) \\ + && &= \sum_i \sum_n \hat{V}_{in} \hat{a}_n \ell_i(x) \\ + && &= \sum_n \sum_i \hat{V}_{in} \hat{a}_n \ell_i(x) \\ + \implies && 0 &= \sum_n \hat{a}_n \left( \sum_i \left[ \hat{V}_{in} \ell_i(x) - \psi_n(x) \right] \right). + \end{align} +\end{subequations} +% +This immediately gives +% +\begin{equation} + \label{eq:dg_nodal_vandermonde5} + \hat{V}_{in} \ell_i(x) = \psi_n(x) +\end{equation} +% +or, by thinking of the basis functions and interpolating polynomials as vectors, +% +\begin{equation} + \label{eq:dg_nodal_vandermonde6} + \hat{V}^T \mathbf{\ell}(x) = \mathbf{\psi}(x). +\end{equation} +% +This allows us to convert the modal approach to deriving a scheme to a nodal +approach directly through the Vandermonde matrix. + +Before constructing the nodal scheme we should fix the location of the nodal +points. We have constructed the modal scheme to be well conditioned by looking +at the mass matrix. This suggests that to make the nodal scheme well behaved we +should ensure good conditioning of the Vandermonde matrix. This requires +carefully choosing the nodes $\xi_i$. We also want to ensure that two of the +nodes are at $x = \pm 1$, and that the accuracy of the scheme is as good as +possible. All these conditions combine to suggest that the nodes $\xi_i$ should +be given by the \emph{Legendre-Gauss-Lobatto} points, which are the zeros of +$P_N'(x)$ combined with $\pm 1$. From 0b6cdbd66588369ead2f90011c2961a75ea1cf9b Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Mon, 25 Feb 2019 11:27:56 +0000 Subject: [PATCH 10/29] Refactor to make modal/nodal clearer. --- advection/advection-higherorder.tex | 153 ++++++++++++++++++---------- 1 file changed, 99 insertions(+), 54 deletions(-) diff --git a/advection/advection-higherorder.tex b/advection/advection-higherorder.tex index fb7366a..1247e61 100644 --- a/advection/advection-higherorder.tex +++ b/advection/advection-higherorder.tex @@ -1380,13 +1380,24 @@ \subsubsection{Function basis and weak form} Now the modes depend on time, and there will only be three basis functions needed to describe quadratic data. -Let us take our solution written in terms of a function basis from equation~\ref{eq:dg_fn_basis_split} -and plug it into the advection equation~\ref{eq:ho-advect}. Unless we use an -infinite number of basis functions $\psi_n$ we will not have a perfect solution -to the advection equation in general, and so the equation will not be perfectly -satisfied. There will be some resulting error, $\epsilon(t, x)$. As our function -basis can describe any function, we expand the error in terms of the $\psi_n$ as -well, as +Clearly we cannot store an infinite number of modes. By restricting our sum to +the $m+1$ modes by writing +% +\begin{equation} + \label{eq:dg_fn_basis_split} + a(t, x) = \sum_{n=0}^{m} \hat{a}_n(t) \psi_n(x) +\end{equation} +% +we are restricting out solution to live in a finite dimensional function space +(denoted $\mathbb{V}$) with basis $\{ \psi_n \}, \ n = 0, \dots, m$. +That means that, in general, any solution $a(t, x)$ will have an error when +plugged into the advection equation~\ref{eq:ho-advect}. +We can pick out \emph{a} solution by insisting that this error is orthogonal to +$\mathbb{V}$. + +To see how this works, write the error term as $\epsilon(t, x)$. +As our (infinite dimensional) function basis can describe any function, we +expand the error in terms of the $\psi_n$ as well, as % \begin{equation} \label{eq:dg_error} @@ -1401,45 +1412,38 @@ \subsubsection{Function basis and weak form} u \hat{a}_n \ddx{\psi_n}(x) \right] = 0. \end{equation} % - -We will now restrict our function basis to be finite, so we only work with a -finite number of modes. This is of course necessary in order to solve it on a -computer. We will also choose, or enforce, that the error does not appear in the -modes that we choose. In other words, -% -\begin{align} - a(t, x) &= \sum_{n=0}^N \hat{a}(t) \psi_n(x), \\ - \epsilon(t, x) &= \sum_{n=N+1}^{\infty} \hat{\epsilon}(t) \psi_n(x). -\end{align} -% -We can construct an exact solution to the resulting equation: however, this -equation is no longer exactly the original problem (although it approaches it -rapidly as $N \to \infty$). We now have +As our solution is finite dimensional this can be written as % \begin{equation} \label{eq:dg_advection2} - \sum_{n=0}^{N} \left[ \ddt{\hat{a}_n} \psi_n(x) + u \hat{a}_n \ddx{\psi_n}(x) \right] = 0. + \sum_{n=0}^{m} \left[ \ddt{\hat{a}_n} \psi_n(x) + + u \hat{a}_n \ddx{\psi_n}(x) \right] = \sum{n=m+1}^{\infty} \hat{\epsilon}_n \psi_n(x). \end{equation} % -We can now use linear algebra techniques on the basis functions $\psi_n$. By using -the appropriate inner product we can split any equation like~\ref{eq:dg_advection} -into individual equations for each basis function separately. The standard inner -product to use is to multiply by another basis function, $\psi_m(x)$, and then -integrate over the domain. Here that gives, after integration by parts, +We have used here that the orthogonality of the error requires $\hat{\epsilon}_n$ +does not contribute for $n = 0, \dots, m$. +Using standard linear algebra techniques (as $\psi_n$ is a \emph{basis}), we can +get individual equations by taking the inner product with another member of the +basis. If we were dealing with vectors in $\mathbb{R}^n$ then the inner product +would be a vector dot product. As we are dealing with functions the inner +product requires multiplication and integration over the domain, % \begin{equation} - \label{eq:dg_advection3} - \sum_n \left[ \left( \int_V \psi_m(x) \psi_n(x) \right) \ddt{\hat{a}_n} + \left( \int_{\partial V} \psi_m(x) \psi_n(x) \right) u \hat{a}_n - \left( \int_V \psi_n(x) \ddx{\psi_m}(x) \right) u \hat{a}_n \right] = 0. + \label{eq:dg_inner_product} + \langle f(x), \psi_l(x) \rangle = \int_V \text{d} x \, f(x) \psi_l(x). \end{equation} % -We will, for now, restrict to one dimension and set $V = [-1, 1]$. This can be -rescaled to cover any cell in one dimension. This simplifies the general form to +This will also write the conservation law in the integral, weak, form. +This leads to, after integrating by parts, % \begin{equation} - \label{eq:dg_advection4} - \sum_n \left[ \left( \int_{-1}^1 \psi_m(x) \psi_n(x) \right) \ddt{\hat{a}_n} - \left( \int_{-1}^1 \psi_n(x) \ddx{\psi_m}(x) \right) u \hat{a}_n \right] = \sum_n -\left[ \psi_m(x) \psi_n(x) u \hat{a}_n \right]_{-1}^1. + \label{eq:dg_advection2} + \sum_{n=0}^{m} \left[ \ddt{\hat{a}_n} \left( \int_V \text{d} x \ \psi_n(x) \psi_l(x) \right) + \left\{ \int_{\partial V} u \hat{a}_n \psi_n(x) \psi_l(x) \right\} - + u \hat{a}_n \int_V \text{d} x \, \psi_n \ddx{\psi_l }(x) \right] = \sum{n=m+1}^{\infty} \hat{\epsilon}_n \int_V \text{d} x\, \psi_n(x) \psi_l(x). \end{equation} % +Restricting ourselves to the first $m+1$ modes we see only the left hand side +contributes. We can write this result as a matrix equation. Define the state vector % @@ -1448,13 +1452,14 @@ \subsubsection{Function basis and weak form} \mathbf{\hat{a}} = (\hat{a}_0, \dots, \hat{a}_N)^T. \end{equation} % -Then define the matrices +For now, restrict to one dimension and set $V = [-1, 1]$: we can use a +coordinate transformation to covert to other domains. Then define the matrices % \begin{align} \label{eq:dg_mass_matrix} - \hat{M}_{mn} &= \int_{-1}^1 \psi_m(x) \psi_n(x), \\ + \hat{M}_{ln} &= \int_{-1}^1 \psi_l(x) \psi_n(x), \\ \label{eq:dg_stiffness_matrix} - \hat{S}_{mn} &= \int_{-1}^1 \psi_m(x) \ddx{\psi_n}(x), + \hat{S}_{ln} &= \int_{-1}^1 \psi_l(x) \ddx{\psi_n}(x), \end{align} % which can be pre-calculated and stored for repeated use. These are typically @@ -1464,32 +1469,50 @@ \subsubsection{Function basis and weak form} % \begin{equation} \label{eq:dg_advection5} - \hat{M} \ddt{\mathbf{\hat{a}}} + \hat{S}^T u \mathbf{\hat{a}} = -\left[ \dots \right]_{-1}^1. + \hat{M} \ddt{\mathbf{\hat{a}}} + \hat{S}^T u \mathbf{\hat{a}} = -\left[ \mathbf{\psi F} \right]_{-1}^1. \end{equation} % -The right hand side term is not yet expanded as it requires coupling to -neighbouring cells, or boundary conditions. Focus on the other terms first. +The right hand side term is the \emph{boundary flux} and requires coupling to +neighbouring cells, or boundary conditions. It requires evaluating a product of +basis functions $\psi_l(x) \psi_n(x)$ at the boundary of the domain. We see that, once we have evaluated the mass and stiffness matrices, we can then update \emph{all} modes $\mathbf{\hat{a}}$ by evaluating the boundary flux term on the right hand side and solving a linear system. This illustrates the small stencil of discontinuous Galerkin schemes: the only coupling to the other cells is through that boundary integral, which only couples to direct neighbours. +However, if the flux terms couple different modes (as evaluating them requires +evaluating a product of basis functions $\psi_l(x) \psi_n(x)$), then the amount +of information communicated may still be large. Therefore the communication cost +of the scheme is linked to the properties of the basis functions at the domain +boundary. We also see that the behaviour of the scheme will crucially depend on the mass matrix $\hat{M}$. If it is singular the scheme cannot work. If it is poorly conditioned then the scheme will rapidly lose accuracy. Crucially, with the monomial basis of equation~\ref{eq:dg_monomial_basis}, the condition number of the mass matrix grows very rapidly, and the scheme loses accuracy for moderate -$N$. Instead, it is sensible to pick as a function basis something from the class +$m$. + +The choice of whether to prioritize the behaviour of the mass matrix or the +flux terms leads to two different schemes. + +\subsubsection{Modal Discontinuous Galerkin} +\label{sec:dg_modal} + +If we prioritize the behaviour of the mass matrix as the most important starting +point for our scheme we are led to the \emph{modal} Discontinuous Galerkin +approach. We noted above that the choice of a monomial basis led to a poorly +conditioned mass matrix. +Instead, it is sensible to pick as a function basis something from the class of \emph{orthogonal polynomials}, where % \begin{equation} \label{eq:dg_orthog_polys} - \int_V w(x) \psi_m(x) \psi_n(x) \propto \delta_{mn}. + \int_V w(x) \psi_l(x) \psi_n(x) \propto \delta_{ln}. \end{equation} % -The Kronecker delta $\delta_{mn}$ ensures that the mass matrix is diagonal, and +The Kronecker delta $\delta_{ln}$ ensures that the mass matrix is diagonal, and hence always easy to invert. When the \emph{weight function} $w(x)$ is identically $1$, as needed for the mass matrix in equation~\ref{eq:dg_mass_matrix}, this suggests we should use the @@ -1497,7 +1520,7 @@ \subsubsection{Function basis and weak form} % \begin{equation} \label{eq:dg_legendre_poly} - \int_{-1}^1 P_m(x) P_n(x) = \frac{2}{2 n + 1} \delta_{mn}. + \int_{-1}^1 P_l(x) P_n(x) = \frac{2}{2 n + 1} \delta_{ln}. \end{equation} % A further simplification comes from choosing the normalized Legendre polynomials @@ -1516,7 +1539,7 @@ \subsubsection{Function basis and weak form} % \begin{equation} \label{eq:dg_advection6} - \hat{M}_{mn} \ddt{\hat{a}_n} + \hat{S}^T_{mn} u \hat{a}_n = -\left[ u P_m(x) P_n(x) \hat{a}_n \right]_{-1}^1. + \hat{M}_{ln} \ddt{\hat{a}_n} + \hat{S}^T_{ln} u \hat{a}_n = -\left[ u P_l(x) P_n(x) \hat{a}_n \right]_{-1}^1. \end{equation} % We can now directly use that $P_n(1) = 1$ and $P_n(-1) = (-1)^n$ to get the @@ -1524,7 +1547,7 @@ \subsubsection{Function basis and weak form} % \begin{equation} \label{eq:dg_boundary_flux_modal} - -\left[ u P_m(x) P_n(x) \hat{a}_n \right]_{-1}^1 = u \left\{ (-1)^{m+n} A_n(-1) - A_n(1) \right\}. + -\left[ u P_l(x) P_n(x) \hat{a}_n \right]_{-1}^1 = u \left\{ (-1)^{l+n} A_n(-1) - A_n(1) \right\}. \end{equation} % Here $A_n(1)$, for example, is the $n^{\text{th}}$ mode of the solution at the @@ -1559,19 +1582,23 @@ \subsubsection{Function basis and weak form} \subsubsection{Nodal Discontinuous Galerkin} \label{sec:dg_nodal} -A problem with the modal form used above is with the boundary flux term. In -standard finite volume schemes we need the value of the function either side of -the interface. This suggests that, rather than using a modal expansion as above, -we should use a \emph{nodal} expansion where the values of the functions are -known at particular points. If two of those points are at the boundaries of the -cell then those values can be used to compute the flux. +A problem with the modal form used above is with the boundary flux term. +The solution (for nonlinear equations) of the flux for higher order modes is +complex. The mode coupling at the boundary also means the amount of information +communicated could be large, meaning the scheme is not as efficient as it could +be. Instead we note that in standard finite volume schemes we need the value of +the function either side of the interface. This suggests that, rather than using +a modal expansion as above, we should use a \emph{nodal} expansion where the +values of the functions are known at particular points. If two of those points +are at the boundaries of the cell then those values can be used to compute the +flux. Let us denote these nodal locations by $\xi_i$, and the values of the solution at these locations by $a_i$. We therefore have our solution in the form % \begin{equation} \label{eq:dg_nodal_interp} - a(t, x) = \sum_{i=0}^N a_i(t) \ell_i(x) + a(t, x) = \sum_{i=0}^m a_i(t) \ell_i(x) \end{equation} % where the $\ell_i(x)$ are the standard indicator interpolating polynomials that @@ -1582,14 +1609,32 @@ \subsubsection{Nodal Discontinuous Galerkin} \ell_i(\xi_j) = \delta_{ij}. \end{equation} % -Our \emph{modal} form of the solution writes +This directly matches the \emph{modal} form of the solution, % \begin{equation} \tag{\ref{eq:dg_fn_basis_split}} a(t, x) = \sum_n \hat{a}_n(t) \psi_n(x), \end{equation} % -so by evaluating both forms at a node $\xi_j$ we get +with the basis functions $\psi_n$ being the indicator polynomials $\ell_n$. We +immediately see that the boundary flux term will simplify hugely, as the only +term that is non-zero at $x=-1$ comes from the product of $\ell_0(-1) \ell_0(-1)$, +using the convention that $\xi_0 = -1$, as $\ell_n(-1) = 0$ for $n \ne 0$. +Similarly the only term that is non-zero at $x=+1$ comes from the product of +$\ell_m(-1) \ell_m(-1)$. Therefore, for any number of modes $m$, we only need to +communicate one piece of information from the neighbouring element in order to +solve the Riemann problem, and this is the value of the solution at that interface. + +However, by choosing as a basis the indicator polynomials $\ell_n(x)$, the +resulting mass matrix will not be the identity, as the indicator polynomials are +not orthogonal. The properties of the mass matrix will now crucially depend on +how we choose the locations of the nodes, $\xi_i$. This is most easily done by +linking the nodal form of equation~\eqref{eq:dg_nodal_interp} to the modal +form~\eqref{eq:dg_fn_basis_split}, where here we are thinking of $\psi_n$ as +being a different basis ($\psi_n \ne \ell_n$) which is known to be well behaved. +This implicitly allows us to restrict $\xi_j$. + +By evaluating both forms at a node $\xi_j$ we get % \begin{equation} \label{eq:dg_nodal_vandermonde1} From 3c663528e1b18733943aa779c1921d1aad6c7b41 Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Mon, 25 Feb 2019 11:43:44 +0000 Subject: [PATCH 11/29] Correct bold math. Note: adds new package. --- CompHydroTutorial.tex | 5 ++++- advection/advection-higherorder.tex | 27 +++++++++++++++------------ 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/CompHydroTutorial.tex b/CompHydroTutorial.tex index d4380f7..72c55e1 100644 --- a/CompHydroTutorial.tex +++ b/CompHydroTutorial.tex @@ -21,7 +21,7 @@ % code listings \usepackage[procnames]{listings} -\lstset{basicstyle=\ttfamily\small, +\lstset{basicstyle=\ttfamily\small, keywordstyle=\color{keywords}, commentstyle=\color{comments}, stringstyle=\color{red}, @@ -36,6 +36,9 @@ % AMS symbols \usepackage{amsmath,amssymb} +% Bold math symbols +\usepackage{bm} + % for forcing a figure to appear on a single page % see http://tex.stackexchange.com/questions/109219/force-position-of-full-page-sized-figure \usepackage{afterpage} diff --git a/advection/advection-higherorder.tex b/advection/advection-higherorder.tex index 1247e61..e9cc006 100644 --- a/advection/advection-higherorder.tex +++ b/advection/advection-higherorder.tex @@ -1416,8 +1416,9 @@ \subsubsection{Function basis and weak form} % \begin{equation} \label{eq:dg_advection2} - \sum_{n=0}^{m} \left[ \ddt{\hat{a}_n} \psi_n(x) + - u \hat{a}_n \ddx{\psi_n}(x) \right] = \sum{n=m+1}^{\infty} \hat{\epsilon}_n \psi_n(x). + \sum_{n=0}^{m} \left[ \ddt{\hat{a}_n} \psi_n(x) + + u \hat{a}_n \ddx{\psi_n}(x) \right] = + \sum_{n=m+1}^{\infty} \hat{\epsilon}_n \psi_n(x). \end{equation} % We have used here that the orthogonality of the error requires $\hat{\epsilon}_n$ @@ -1437,9 +1438,11 @@ \subsubsection{Function basis and weak form} This leads to, after integrating by parts, % \begin{equation} - \label{eq:dg_advection2} - \sum_{n=0}^{m} \left[ \ddt{\hat{a}_n} \left( \int_V \text{d} x \ \psi_n(x) \psi_l(x) \right) + \left\{ \int_{\partial V} u \hat{a}_n \psi_n(x) \psi_l(x) \right\} - - u \hat{a}_n \int_V \text{d} x \, \psi_n \ddx{\psi_l }(x) \right] = \sum{n=m+1}^{\infty} \hat{\epsilon}_n \int_V \text{d} x\, \psi_n(x) \psi_l(x). + \label{eq:dg_advection3} + \begin{split} + \sum_{n=0}^{m} & \left[ \ddt{\hat{a}_n} \left( \int_V \text{d} x \ \psi_n(x) \psi_l(x) \right) + \left\{ \int_{\partial V} u \hat{a}_n \psi_n(x) \psi_l(x) \right\} - + u \hat{a}_n \int_V \text{d} x \, \psi_n \ddx{\psi_l }(x) \right] = \\ \sum_{n=m+1}^{\infty} & \hat{\epsilon}_n \int_V \text{d} x\, \psi_n(x) \psi_l(x). + \end{split} \end{equation} % Restricting ourselves to the first $m+1$ modes we see only the left hand side @@ -1449,7 +1452,7 @@ \subsubsection{Function basis and weak form} % \begin{equation} \label{eq:dg_state_vector} - \mathbf{\hat{a}} = (\hat{a}_0, \dots, \hat{a}_N)^T. + \bm{\hat{a}} = (\hat{a}_0, \dots, \hat{a}_N)^T. \end{equation} % For now, restrict to one dimension and set $V = [-1, 1]$: we can use a @@ -1469,7 +1472,7 @@ \subsubsection{Function basis and weak form} % \begin{equation} \label{eq:dg_advection5} - \hat{M} \ddt{\mathbf{\hat{a}}} + \hat{S}^T u \mathbf{\hat{a}} = -\left[ \mathbf{\psi F} \right]_{-1}^1. + \hat{M} \ddt{\bm{\hat{a}}} + \hat{S}^T u \bm{\hat{a}} = -\left[ \bm{\psi F} \right]_{-1}^1. \end{equation} % The right hand side term is the \emph{boundary flux} and requires coupling to @@ -1477,7 +1480,7 @@ \subsubsection{Function basis and weak form} basis functions $\psi_l(x) \psi_n(x)$ at the boundary of the domain. We see that, once we have evaluated the mass and stiffness matrices, we can then -update \emph{all} modes $\mathbf{\hat{a}}$ by evaluating the boundary flux term +update \emph{all} modes $\bm{\hat{a}}$ by evaluating the boundary flux term on the right hand side and solving a linear system. This illustrates the small stencil of discontinuous Galerkin schemes: the only coupling to the other cells is through that boundary integral, which only couples to direct neighbours. @@ -1649,12 +1652,12 @@ \subsubsection{Nodal Discontinuous Galerkin} \end{equation} % we see that we can translate from the modal state vector -$\mathbf{\hat{a}} = (\hat{a}_0, \dots, \hat{a}_N)^T$ to the nodal state vector -$\mathbf{a} = (a_0, \dots, a_N)^T$ via the matrix equation +$\bm{\hat{a}} = (\hat{a}_0, \dots, \hat{a}_N)^T$ to the nodal state vector +$\bm{a} = (a_0, \dots, a_N)^T$ via the matrix equation % \begin{equation} \label{eq:dg_nodal_vandermonde3} - \hat{V} \mathbf{\hat{a}} = \mathbf{a}. + \hat{V} \bm{\hat{a}} = \bm{a}. \end{equation} We can also connect the basis functions $\psi_n$ to the interpolating polynomials @@ -1682,7 +1685,7 @@ \subsubsection{Nodal Discontinuous Galerkin} % \begin{equation} \label{eq:dg_nodal_vandermonde6} - \hat{V}^T \mathbf{\ell}(x) = \mathbf{\psi}(x). + \hat{V}^T \bm{\ell}(x) = \bm{\psi}(x). \end{equation} % This allows us to convert the modal approach to deriving a scheme to a nodal From 9127f9bf776b0d4b826131fc0ccdf061ad97e64e Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Mon, 25 Feb 2019 13:39:04 +0000 Subject: [PATCH 12/29] Finish nodal DG description --- advection/advection-higherorder.tex | 98 ++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) diff --git a/advection/advection-higherorder.tex b/advection/advection-higherorder.tex index e9cc006..9e03f05 100644 --- a/advection/advection-higherorder.tex +++ b/advection/advection-higherorder.tex @@ -1691,7 +1691,7 @@ \subsubsection{Nodal Discontinuous Galerkin} This allows us to convert the modal approach to deriving a scheme to a nodal approach directly through the Vandermonde matrix. -Before constructing the nodal scheme we should fix the location of the nodal +To construct the nodal scheme we need to fix the location of the nodal points. We have constructed the modal scheme to be well conditioned by looking at the mass matrix. This suggests that to make the nodal scheme well behaved we should ensure good conditioning of the Vandermonde matrix. This requires @@ -1701,6 +1701,102 @@ \subsubsection{Nodal Discontinuous Galerkin} be given by the \emph{Legendre-Gauss-Lobatto} points, which are the zeros of $P_N'(x)$ combined with $\pm 1$. +With these restrictions, we can now construct the nodal scheme. As noted above, +this scheme remains a modal scheme as generally introduced in section~\ref{sec:dg_basis}, +but the basis functions are the indicator polynomials $\ell_n(x)$. Thus the +scheme can be written in the mass matrix form +% +\begin{equation} + \tag{\ref{eq:dg_advection5}} + \hat{M} \ddt{\bm{\hat{a}}} + \hat{S}^T u \bm{\hat{a}} = -\left[ \bm{\psi F} \right]_{-1}^1, +\end{equation} +% +but now the two matrices are given by +% +\begin{align} + \label{eq:dg_nodal_mass_matrix} + \hat{M}_{ln} &= \int_{-1}^1 \ell_l(x) \ell_n(x), \\ + \label{eq:dg_nodal_stiffness_matrix} + \hat{S}_{ln} &= \int_{-1}^1 \ell_l(x) \ddx{\ell_n}(x). +\end{align} +% +By using the Vandermonde matrix to link the nodal basis to an orthogonal basis +such as the Legendre polynomials we can simplify the mass matrix to +% +\begin{equation} + \label{eq:dg_nodal_mass_matrix_from_V} + \hat{M} = \left( \hat{V} \hat{V}^T \right)^{-1}. +\end{equation} +% +The stiffness matrix can also be simplified, by re-writing $\ddx{\ell_n}(x)$ as +an expansion in terms of $\ell_n(x)$. Defining the \emph{differentiation matrix} +$\hat{D}$ as +% +\begin{equation} + \label{eq:dg_nodal_differentiation} + \hat{D}_{ln} = \left. \ddx{\ell_n}(x) \right|_{x = \xi_l} +\end{equation} +% +we have $\ddx{\ell_n}(x) = \sum_k \hat{D}_{kn} \ell_k(x)$ +% +\begin{subequations} + \label{eq:dg_nodal_stiffness_matrix_from_D_steps} + \begin{align} + \hat{S}_{ln} &= \int_{-1}^1 \ell_l(x) \ddx{\ell_n}(x) \\ + &= \int_{-1}^1 \ell_l(x) \sum_k \hat{D}_{kn} \ell_k(x) \\ + &= \sum_k \left( \ell_l(x) \ell_k(x) \right) \hat{D}_{kn} \\ + &= \hat{M}_{lk} \hat{D}_kn. + \end{align} +\end{subequations} +% +This shows that the stiffness matrix simplifies to +% +\begin{equation} + \label{eq:dg_nodal_stiffness_matrix_from_V} + \hat{S} = \hat{M} \hat{D}. +\end{equation} +% +Finally, using similar methods to the steps above, we can link the differentiation +matrix back to the Vandermonde matrix, via +% +\begin{equation} + \label{eq:dg_nodal_D_matrix_from_V} + \hat{D} = \left( \ddx{V} \right) \hat{V}^{-1}. +\end{equation} +% +This is primarily useful when the modal function basis is a standard library +function such as the (normalized) Legendre polynomials. This means that the +basis functions and their derivatives, and hence the Vandermonde matrix and its +derivatives, can be written solely in terms of library functions. For example, +in Python the \texttt{numpy} package contains (in \texttt{numpy.polynomial.legendre}) +the functions \texttt{legval} (which evaluates the Legendre polynomials), +\texttt{legder} (which links the derivatives of the Legendre polynomials back to +the Legendre polynomials themselves), and \texttt{legvander} (which evaluates +the Vandermonde matrix directly, but in un-normalized form). + +There is one final step needed to construct the full scheme. So far, the method +has been built assuming a single element with the coordinates $x \in [-1, 1]$. +For most cases we will want to use a ``small'' number of modes, say $m \le 5$, +and split the domain into $N$ elements, like the cells in a finite volume scheme. +If we assume a general element has coordinates $x \in [x_{j-1/2}, x_{j+1/2}]$ +with width $\Delta x$, then the \emph{form} of the scheme remains the same: +% +\begin{equation} + \label{eq:dg_nodal_final} + M \ddt{\bm{\hat{a}}} + S^T u \bm{\hat{a}} = -\left[ \bm{\psi F} \right]_{x_{j-1/2}}^{x_{j+1/2}}. +\end{equation} +% +However, the change of coordinates needs to be factored in. We can see how this +works by looking at the integral definitions, such as~\eqref{eq:dg_nodal_mass_matrix} +and~\eqref{eq:dg_nodal_stiffness_matrix}. We see that the mass matrix transforms +as +% +\begin{equation} + \label{eq:dg_nodal_mass_matrix_with_h} + M = \frac{\Delta x}{2} \hat{M}, +\end{equation} +% +but that the stiffness matrix is unchanged. \section{Going further} From e62b8566356adca2e37d6eb873996d49d0648d87 Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Tue, 26 Feb 2019 13:38:29 +0000 Subject: [PATCH 13/29] Some DG exercises --- advection/advection-higherorder.tex | 44 +++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/advection/advection-higherorder.tex b/advection/advection-higherorder.tex index 9e03f05..bca25d7 100644 --- a/advection/advection-higherorder.tex +++ b/advection/advection-higherorder.tex @@ -1701,6 +1701,25 @@ \subsubsection{Nodal Discontinuous Galerkin} be given by the \emph{Legendre-Gauss-Lobatto} points, which are the zeros of $P_N'(x)$ combined with $\pm 1$. +\begin{exercise}[Vandermonde matrices] +{Construct the Vandermonde matrix converting modal coefficients, based on +orthonormal Legendre polynomials, to nodal coefficients, based on Gauss-Lobatto +nodal points, on the interval $x \in [-1, 1]$. For example, for $m=2$ the result +is, to $4$ significant figures, +% +\begin{equation*} + V = \begin{pmatrix} + 0.7071 & -1.225 & 1.581 \\ + 0.7071 & 0 & -0.7906 \\ + 0.7071 & 1.225 & 1.581 + \end{pmatrix}. +\end{equation*} +% +Using the Vandermonde matrix and its inverse, check that you can convert from +nodes to modes and vice versa. Check that the condition number grows slowly with +$m$ (roughly as $m^{1/2}$ for large $m$).} +\end{exercise} + With these restrictions, we can now construct the nodal scheme. As noted above, this scheme remains a modal scheme as generally introduced in section~\ref{sec:dg_basis}, but the basis functions are the indicator polynomials $\ell_n(x)$. Thus the @@ -1798,6 +1817,31 @@ \subsubsection{Nodal Discontinuous Galerkin} % but that the stiffness matrix is unchanged. +\begin{exercise}[Mass and stiffness matrices] +{From the Vandermonde matrices constructed above, build the mass, differentiation +and stiffness matrices $\hat{M}, \hat{D}, \hat{S}$, on the interval +$x \in [-1, 1]$. For example, for $m=2$ the results are, to $4$ significant +figures, +% +\begin{align*} + \hat{M} &= \begin{pmatrix} + 0.2667 & 0.1333 & -0.0667 \\ + 0.1333 & 1.067 & 0.1333 \\ + -0.06667 & 0.1333 & 0.2667 + \end{pmatrix}, \\ + \hat{D} &= \begin{pmatrix} + -1.5 & 2 & -0.5 \\ + -0.5 & 0 & 0.5 \\ + 0.5 & -2 & 1.5 + \end{pmatrix}, \\ + \hat{S} &= \begin{pmatrix} + -0.5 & 0.6667 & -1.667 \\ + -0.6667 & 0 & 0.6667 \\ + 1.667 & -0.6667 & 0.5 + \end{pmatrix}. +\end{align*} +} +\end{exercise} \section{Going further} From 04b90f4d7a779b87b1b4b5ecb31d407cb81fe7a8 Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Mon, 4 Mar 2019 13:19:48 +0000 Subject: [PATCH 14/29] Some figures for DG --- higher-order/dg_convergence_sine.pdf | Bin 0 -> 31256 bytes higher-order/dg_weno_efficiency.pdf | Bin 0 -> 25915 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 higher-order/dg_convergence_sine.pdf create mode 100644 higher-order/dg_weno_efficiency.pdf diff --git a/higher-order/dg_convergence_sine.pdf b/higher-order/dg_convergence_sine.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ac9823d6a2f395b27bcf0ce3aef3a8d3a2a3e2a6 GIT binary patch literal 31256 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 literal 0 HcmV?d00001 From 9d6e285e5d2872a3644dca5ad9c85f3d089fc017 Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Mon, 4 Mar 2019 13:22:46 +0000 Subject: [PATCH 15/29] More DG figures --- higher-order/dg_grid.pdf | Bin 0 -> 16687 bytes higher-order/dg_limiter.pdf | Bin 0 -> 16745 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 higher-order/dg_grid.pdf create mode 100644 higher-order/dg_limiter.pdf diff --git a/higher-order/dg_grid.pdf b/higher-order/dg_grid.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6d5b6ce9d48b4b26caf1396eee9808f9eeee1b1c GIT binary patch literal 16687 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 LL_{ Date: Mon, 4 Mar 2019 13:29:46 +0000 Subject: [PATCH 16/29] Fixed figure --- higher-order/dg_grid.pdf | Bin 16687 -> 19154 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/higher-order/dg_grid.pdf b/higher-order/dg_grid.pdf index 6d5b6ce9d48b4b26caf1396eee9808f9eeee1b1c..ad99fbe74635f67a6dc9d026ba94dc22908ac63e 100644 GIT binary patch delta 9084 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 AcK`qY From 8b197bc918272c497eac4b58a59df2b2dceb56ea Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Mon, 4 Mar 2019 16:53:51 +0000 Subject: [PATCH 17/29] Put in figures and text explaining it. Needs other branch WENO correction --- advection/advection-higherorder.tex | 140 ++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) diff --git a/advection/advection-higherorder.tex b/advection/advection-higherorder.tex index bca25d7..ff8e026 100644 --- a/advection/advection-higherorder.tex +++ b/advection/advection-higherorder.tex @@ -1701,6 +1701,28 @@ \subsubsection{Nodal Discontinuous Galerkin} be given by the \emph{Legendre-Gauss-Lobatto} points, which are the zeros of $P_N'(x)$ combined with $\pm 1$. +\begin{figure}[t] +\centering +% figure generated by hydro_examples/advection/dg.py +\includegraphics[width=0.8\linewidth]{dg_grid} +\caption[The grid for a Discontinuous Galerkin method] +{\label{fig:dg_grid} The grid for a Discontinuous Galerkin method is split into +cells or elements as indicated by the vertical dashed lines -- here there are +only $4$ cells. Within each cell the solution is represented by an +$m^{\text{th}}$ order polynoial, as shown by the dashed lines. This +representation is central to the modal DG method. Equivalent information can be +stored at specific nodes, as shown by the markers. Note how the number and +location of the nodes varies with $m$. \\ +\hydroexdoit{\href{https://github.com/zingale/hydro_examples/blob/master/advection/dg.py}{dg.py}}} +\end{figure} +% +Figure~\ref{fig:dg_grid} shows the nodes and modes for a sine wave represented +by a Discontinuous Galerkin method on a grid with only $4$ cells. We see how +rapidly the representation appears to converge to the smooth sine wave with +increasing $m$. Note also how the locations of the nodes varies with $m$, as the +optimal nodes changes with the order of the method. However, in all cases there +are nodes at the boundaries of each cell. + \begin{exercise}[Vandermonde matrices] {Construct the Vandermonde matrix converting modal coefficients, based on orthonormal Legendre polynomials, to nodal coefficients, based on Gauss-Lobatto @@ -1843,6 +1865,124 @@ \subsubsection{Nodal Discontinuous Galerkin} } \end{exercise} +\begin{figure}[t] +\centering +% figure generated by hydro_examples/advection/dg.py +\includegraphics[width=0.8\linewidth]{dg_limiter} +\caption[Discontinuous Galerkin methods in action] +{\label{fig:dg_limiter} The left panel shows a Discontinuous Galerkin method +with $m=3$ and $16$ elements applied to the advection equation, where a sine +wave is advected once around the domain. Even at this low resolution the result +without limiting is visually exact, and using moment limiting is very accurate. +In the right panel the same methods are applied to the ``top hat'' initial data, +again advected once the periodic domain. The unlimited method shows the expected +Gibbs oscillations, which are confined to the elements next to the +discontinuities. The moment limited method shows no oscillations. \\ +\hydroexdoit{\href{https://github.com/zingale/hydro_examples/blob/master/advection/dg.py}{dg.py}}} +\end{figure} +% +By combining the nodal DG update described above with a time integrator we can +look at the performance of the scheme. Figure~\ref{fig:dg_limiter} advects two +initial profiles one period around a periodic domain. In the left panel we see +the excellent performance when applied to a smooth profile. The unlimited method +is essentially indistinguishable from the exact solution. However, the right +panel shows that when the unlimited method is applied to a discontinuous initial +profile then Gibbs oscillations result. The only ``nice'' feature of the +Discontinuous Galerkin method here is that these oscillations are confined to +the elements next to the discontinuities, and do not spread to cover the entire +grid. + +As with finite difference schemes, there are a range of modifications that can +be made to limit or eliminate these oscillations. In Discontinuous Galerkin +methods it is typical to do this in two steps: first, identify which elements +need limiting, and second, modify the data in the required cells. The +identification step can be done using the nodal values: construct limited slopes +from cell average values and compare the predicted values at cell boundaries to +the nodal values actually stored. The modification step can be done in many +ways. Here we show a method that modifies the modal values, rather than the +nodal values (\textbf{see Hesthaven, refs in there}). This +\emph{moment limiting} approach removes the oscillations, as seen in +Figure~\ref{fig:dg_limiter}. + +\begin{figure}[t] +\centering +% figure generated by hydro_examples/advection/dg.py +\includegraphics[width=0.8\linewidth]{dg_convergence_sine} +\caption[Convergence of Discontinuous Galerkin methods] +{\label{fig:dg_convergence_sine} Each panel shows the convergence of the +Discontinuous Galerkin methods for $m = 1, \dots, 5$, when using different time +integrators (the left panel uses RK3, the other panels an $8^{\text{th}}$ order +RK method) or using limiters (the right panel uses moment limiting, whilst the +other panels use no limiting). The expected convergence rate should be $m+1$, +which is seen only for the low order methods when the time integrator is RK3. +For higher $m$ schemes the error from the time integrator dominates, but using +a higher order time integrator shows that the expected convergence rate can be +recovered, as seen in the central and right panel. Comparing the central and +right panel we see that it is possible, with moment limiting, to retain the high +order convergence, but that moment limiting increase the absolute error by +roughly an order of magnitude. \\ +\hydroexdoit{\href{https://github.com/zingale/hydro_examples/blob/master/advection/dg.py}{dg.py}}} +\end{figure} +% +The Discontinuous Galerkin methods are constructed to have high-order accuracy. +In principle, the convergence rate should be $\propto (\Delta x)^{m+1}$. As with +the WENO schemes above this can be difficult to see in reality. +Figure~\ref{fig:dg_convergence_sine} shows the convergence rate when advecting +a sine wave once around a periodic domain. In the left panel the third order +SSP RK3 time integrator has been used. The expected $2^{\text{nd}}$ and +$3^{\text{rd}}$ order convergence is seen for $m=1$ and $m=2$. However, for +higher orders the limitations of the third-order time integrator reduce the +convergence rate. + +In the central panel of Figure~\ref{fig:dg_convergence_sine} an $8^{\text{th}}$ +order time integrator is used. This reduces the time integrator error far below +what is needed, and we now see that every scheme converges at the expected rate. +In more complex systems in multiple dimensions the error from the spatial terms +will be much larger, and so the RK3 method can be used without compromising the +accuracy. The right panel shows that the moment limiter does not affect the +convergence rate of the method, although it does increase the absolute error in +nearly all cases. + +\begin{figure}[t] +\centering +% figure generated by hydro_examples/advection/compare_schemes.py +\includegraphics[width=0.8\linewidth]{dg_weno_efficiency} +\caption[Efficiency of high order methods] +{\label{fig:dg_weno_efficiency} Comparing a Discontinuous Galerkin scheme to a +finite difference or finite volume scheme needs some care, as the number of +cells used stops being a fair comparison: the DG method stores $m+1$ times more +information per cell than a typical finite difference scheme. Instead, it is +better to compare the efficiency of the methods -- for example, by comparing +the runtime required to get a solution with a certain accuracy. This figure +shows the efficiency for high order DG and WENO schemes, by advecting a sine +wave once around a periodic domain and comparing the errors. We see that, for +the particular implementations here, the DG schemes are typically more +efficient. We might expect the WENO schemes to be more competitive when the data +is less smooth.\\ +\hydroexdoit{\href{https://github.com/zingale/hydro_examples/blob/master/advection/compare_schemes.py}{compare\_schemes.py}}} +\end{figure} +% +When comparing the errors produced by a second order scheme (as shown in +Figure~\ref{fig:advnorm}) or a WENO scheme (as shown in +Figure~\ref{fig:weno-converge-sine}) with those produced by a Discontinuous +Galerkin scheme (as shown in Figure~\ref{fig:dg_convergence_sine}), we need to +be careful to interpret the results fairly. Leave aside that the results for the +second order schemes come from advecting different profiles for longer times. +More importantly we should note that Discontinuous Galerkin schemes use far more +resources for each cell: $m+1$ nodes of information are stored per cell, rather +than the single value used for a finite volume or finite difference scheme. + +Instead it is better to compare the efficiency of the method, by measuring how +long it takes, and how much resources (e.g., memory) it requires, to reach a +certain accuracy. This can be very implementation specific, so should also be +done carefully. An example of this, comparing WENO and DG schemes, is given in +Figure~\ref{fig:dg_weno_efficiency}. We see that higher-order schemes increase +in efficiency with more resources, as expected (the WENO7 scheme converges at +$13^{\text{th}}$ order, compared to the DG4 scheme which converges at +$5^{\text{th}}$ order). However, for this problem where the data remains very +smooth, the Discontinuous Galerkin methods are clearly better, even with +limiting on. This advantage may not remain when discontinuities appear. + \section{Going further} \begin{itemize} From 2784b0ecd4d1ffeffaaf2e40786c0a69310ca00e Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Tue, 5 Mar 2019 10:04:54 +0000 Subject: [PATCH 18/29] Add references. --- advection/advection-higherorder.tex | 36 ++++++++++++++++++----------- refs.bib | 20 ++++++++++++++++ 2 files changed, 43 insertions(+), 13 deletions(-) diff --git a/advection/advection-higherorder.tex b/advection/advection-higherorder.tex index ff8e026..55fcd87 100644 --- a/advection/advection-higherorder.tex +++ b/advection/advection-higherorder.tex @@ -1334,6 +1334,9 @@ \subsection{Discontinuous Galerkin methods} machines). Their disadvantages will come in the timestep and with discontinuous data. +The presentation here closely follows~\cite{hesthaven2018numerical} -- check +there for considerably more details, particularly on the theoretical results. + \subsubsection{Function basis and weak form} \label{sec:dg_basis} @@ -1882,15 +1885,22 @@ \subsubsection{Nodal Discontinuous Galerkin} \end{figure} % By combining the nodal DG update described above with a time integrator we can -look at the performance of the scheme. Figure~\ref{fig:dg_limiter} advects two -initial profiles one period around a periodic domain. In the left panel we see -the excellent performance when applied to a smooth profile. The unlimited method -is essentially indistinguishable from the exact solution. However, the right -panel shows that when the unlimited method is applied to a discontinuous initial -profile then Gibbs oscillations result. The only ``nice'' feature of the -Discontinuous Galerkin method here is that these oscillations are confined to -the elements next to the discontinuities, and do not spread to cover the entire -grid. +look at the performance of the scheme. We need to take care in choosing the +timestep. From the nodal point of view we can see that the width of the cell, +$\Delta x$, is not going to be the limiting factor. Instead, the smallest +distance between the (unequally spaced!) nodes is going to be crucial. General +results (see e.g.~\cite{hesthaven2018numerical}) suggest that reducing the +timestep by a factor of $2 m + 1$ is sufficient to ensure stability, but it does +increase computational cost. + +Figure~\ref{fig:dg_limiter} advects two initial profiles one period around a +periodic domain. In the left panel we see the excellent performance when applied +to a smooth profile. The unlimited method is essentially indistinguishable from +the exact solution. However, the right panel shows that when the unlimited +method is applied to a discontinuous initial profile then Gibbs oscillations +result. The only ``nice'' feature of the Discontinuous Galerkin method here is +that these oscillations are confined to the elements next to the +discontinuities, and do not spread to cover the entire grid. As with finite difference schemes, there are a range of modifications that can be made to limit or eliminate these oscillations. In Discontinuous Galerkin @@ -1899,10 +1909,10 @@ \subsubsection{Nodal Discontinuous Galerkin} identification step can be done using the nodal values: construct limited slopes from cell average values and compare the predicted values at cell boundaries to the nodal values actually stored. The modification step can be done in many -ways. Here we show a method that modifies the modal values, rather than the -nodal values (\textbf{see Hesthaven, refs in there}). This -\emph{moment limiting} approach removes the oscillations, as seen in -Figure~\ref{fig:dg_limiter}. +ways. A number are outlined in~\cite{hesthaven2018numerical}, but here we show a +method that modifies the modal values, rather than the nodal values, as +developed by~\cite{burbeau2001problem}. This \emph{moment limiting} approach +removes the oscillations, as seen in Figure~\ref{fig:dg_limiter}. \begin{figure}[t] \centering diff --git a/refs.bib b/refs.bib index 889dc78..6503f80 100644 --- a/refs.bib +++ b/refs.bib @@ -1154,3 +1154,23 @@ @techreport{Shu1997 url = {https://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19980007543.pdf}, year = {1997} } + +@book{hesthaven2018numerical, + title={Numerical methods for conservation laws: From analysis to algorithms}, + author={Hesthaven, Jan S}, + volume={18}, + year={2018}, + publisher={SIAM}, + url={https://books.google.co.uk/books?id=uyZKDwAAQBAJ&lpg=PR2&ots=udFqVc-kcT} +} + +@article{burbeau2001problem, + title={{A problem-independent limiter for high-order Runge--Kutta discontinuous Galerkin methods}}, + author={Burbeau, Anne and Sagaut, Pierre and Bruneau, Ch-H}, + journal={Journal of Computational Physics}, + volume={169}, + number={1}, + pages={111--150}, + year={2001}, + publisher={Elsevier} +} From 96e76a923fe68816f01a072bf612b53e283a69ef Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Tue, 5 Mar 2019 10:17:13 +0000 Subject: [PATCH 19/29] Typo --- advection/advection-higherorder.tex | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/advection/advection-higherorder.tex b/advection/advection-higherorder.tex index 55fcd87..1295ec7 100644 --- a/advection/advection-higherorder.tex +++ b/advection/advection-higherorder.tex @@ -1459,7 +1459,7 @@ \subsubsection{Function basis and weak form} \end{equation} % For now, restrict to one dimension and set $V = [-1, 1]$: we can use a -coordinate transformation to covert to other domains. Then define the matrices +coordinate transformation to convert to other domains. Then define the matrices % \begin{align} \label{eq:dg_mass_matrix} @@ -1475,7 +1475,8 @@ \subsubsection{Function basis and weak form} % \begin{equation} \label{eq:dg_advection5} - \hat{M} \ddt{\bm{\hat{a}}} + \hat{S}^T u \bm{\hat{a}} = -\left[ \bm{\psi F} \right]_{-1}^1. + \hat{M} \ddt{\bm{\hat{a}}} + \hat{S}^T \left( u \bm{\hat{a}} \right) = + -\left[ \bm{\psi F} \right]_{-1}^1. \end{equation} % The right hand side term is the \emph{boundary flux} and requires coupling to From b82d2ae6b9546f855c7ca23a33282494a20076cf Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Tue, 5 Mar 2019 13:37:37 +0000 Subject: [PATCH 20/29] Update figure with fixed legend --- higher-order/dg_weno_efficiency.pdf | Bin 25915 -> 25533 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/higher-order/dg_weno_efficiency.pdf b/higher-order/dg_weno_efficiency.pdf index 9eb7853006c3a8b72940f394f5bafd560e0e3f7c..57c7feef5efc6a333c0f689ad600db867291fc23 100644 GIT binary patch delta 6327 zcmZWrX&_Wl8*WI2khRD%_8CiNU#!{J5DI1A36n7d7k&a=TGS*5A;vQ+Ic7uxY1&5?O2sbe0;79EdK(7l`* znG@5#u=?xEKZBP1moh1o0~4oPvpi+%A5~i-{O9pe!aqZcpH-#5w6h!>R&46~K*=;U zGh2M>mTFDeTdkhqa-i>Xv&}>P*lNo%kNLYoBS}lgV?cy zBvoy~@wUUS(u=V<)Wb27rmb_C->GuXGQ+Wzs z`Amob!OQid{nq3%kKpC``IJA+(@U=`>-N8TUMZ(Xu~J9Qafu7K5+7WfcMX`VSJm}L z+M#u^di#wJC3&_WO)NFeo((1WtYnt?m_V&~RaVQFDpv3Ux1o`C5{~v$POZ=tQO?wR zV*MZCdc4?hubESSrg5s!9`n_*b7Pf~&PNfhdpZl+LUQuFFRPfksR+4hFJx3D`ge?9 zxr} zO-;TZYK^ecpVIDAs1+dWDm$I;Mh(!6!7>{O=0cx1hD-MqTASQ!Bw!B5{07C%``jC! zbi91>i|U=Bp_ieG{d@Ot@2i>!o2v*$f-l1N_%fXNzSw{Mk{L`eizZy8A?p;9=IHiupzte*Yv*f*jfP8H0j(eT{th`pbB=&qVV2 z$b8m|<2O|>yCDr!Vjtc3CAQh<6BjtaNVg@b=_4*amMe-NR)ej`b@M(i&5Fh-t=n^O8iRraIPy? znieA4IIdn*w^foH5nHYlz&IN6J_xW7QOYep3ox&aD{hVtRM6mp+kb0zG*9horwt|6)-? z!aKC5&HW3mS!|bNlr1wj4xKg08oFAmP8L19xqtZy8`{a#>{ZgymnXj0pLi`+5KDVK+ShJCZLfv2acCjqXjo~Wx)Ze+j zkP!8VjK8u!F5j@enen~V$GqThRgK6V~{TF3dL&E3iY2&{O(yV1~p@eUL zb@9k6x%4qE|M(RtdkUW|?s!h!qXL134t~c%bjoB=qXC&Lup*y(iu&9-ock>6gOaxE z?_26Q&c=r-%?iEr1w2JxUW4aK9hH${&*c20C#qM!{DReV^~Lvawdxs*6Mr1vI(p1E z-K45uj8`9pk^-@xeisXhE|ZQcN_KO~>|)NZzO5GFaB#n`iAoctGVT^{O+^C#lP0If z%F(_}{`$Qm@Q5O>lnlkoRhDG|cYCUGTM>0XjU-~6AjxGmoe2_inbPNDZ<>N{xVX=v zJVt+aLx@vxgGV19X6@Qp^+^7;Hh6WmChtfHDHOG==X8YY*VkX=OsBk_C&tNtt$W%Y z+3OY&G;U&WS6X*>KgC4YF9^-%7Z~?vdZ(+~08;%jRKqaKnPV?s`t*Cx(BmJbwd0C4 z6L}S9ZEEIpzs~qRnGsLWC~2Kdc+P`w#r8d*@tpgdyh?NkK!?DGeSY2!s0emFJAeEM z-GZZCtA`V$P<}Dd=vx>WdOgWVG&?dJRSH~~hNHU{EL>%39aUd=Iqn)_# zUgn3{Si05)*%hEIoGZfbwDgZI`i>moJm`X(Jr-N`JStnzmn@keY}srKy}q+Zr{Z(N zzTG*4plQQ+O+gyv?P19!aIh2S?5)KTd2gEThsUymtTaAlnVFl(m685|QY9=cIdQXu z8D(olZzDM#D*9H6Ssu9)T^ddx(_|uq%HY_9WH6PMR+UR>_W3>W8r^o;?uBgjj?RbK z-UJWmx9)ws)h`4tK$X#_>GK^^*KV_F4shs5KD*|O=T~PngPp_sers}LEjuOEkRmYW z=QGma_T}&-z(Q7l()7BkSvX9)*&s!3SNLQ|_Tju-4wk`bi4d_bs- ziTiT@L{grfI;R`mHf^Vlj&eac1?fU}#9YZ5*qK7n2-0)xhXv}A5Y`>)afVA ze4c6b#wdrIh2(KOL0mFHH1PG*^^`{DrK9y@6bOI&o%adeof>ZX^i;L=JUZ0 zvGLH3iB`_N3V|vX_vJ-=l6Q99ZGT^;uuL#|pDi9c>1~`}lG1AA&eEz=Ydy)8?D10A zZ1%$;e@b-J81-Vw<9$346L$3+Eaw;GFX>$q2k}05up<+kAIHU%!zOPQixX5LG+**! z{dqZVq-R=ZiJvDnYI^4)r7OGD$CI5ET|=_HX=TyB?J z>MzM7`&){QVk8c*B|^G~^^|N1KHuzD^tfr~UwbUbU)eS=_V5L{!EUQbh>jgSFFiieBtV=*R-X9cPE~C?$z|HnI_;ZQot{?RJ6J$ zi>OY|GbX;5baRSl@0W*7+>ZSjZ{=w_pV6bsM2YvcJJHT!R4CIv{+OJoO*2gB*>RJw zM7uS-^B@y!;?@aB1Xzl<=_9ABnsZMah(`03%oAbr@4O!!!k2tw4a~WaixbDOpFOc4-k*owcL7=NnfPc- ze}?caL6TczaWT1xJG;s^Oo8@sQTy#j4(mJ$QEusReknAKt{psQkG5a@JY@Rzi?m3k$Kvg`eS^AUdNq^wIl9MUDU&s)9G~jGqR#bF z3}yB2&nCV!(AT3|tfqhJyY)4J+81S(rT#2rh2GdoiOS0498h2G9f(@35fZgiQj(uK zH~Pi2jacDxkK+E+CWtMOrNG#VXv*JH%#>XE%Xmg{2v+x-oyCLym5_B`mo*Q*w){;I zR#sZT|Qp))R0h4QR)k|e5PN7^L1#}4gJ|*I@a;2_-xQf<^HU5 z)?9Wsz0c$m=-<2leEDvp;>)Ac5;C0*uhjp_6mp`6ntxskU)#AOD8Otb5*X)AsE(WU z!O)XTBQuZEa?ZHkLG>D@=Jj$Iu!3^-J;(^=U1=<@7-r9p=`W^*6#- z@n_8Y*0$u(%RN4NYN*YqA_bc*xm*eQISbnP1^64CL3zCh)67EElHw>IwW7*;HvObm zq@KtLqXEI+DR&RUKOVr4g9nrNR^Hhv&QG^#D|U|Od>J1bP3bg}SE)L8^mwtomFTa& zAJfGm98d3jxjB9)tisxOUaB3UZbb>Hn!hm8%b!@PF6IzEc#{+qlDaC?V*H!X#zKEP zgiXJD=E@oO4C5Dr3SF-QCX_C-{mKrI8Ob3L!kN!p4asy;v6H-%dZ#SmP~@W1t6?wS zs};=Ei;_Xr3z*=L{FE5!H=Bce2OZtwW0d&1k3 zcBQj@7yod+!4%>` zrld}`drkEYRXtk;wNvX*c^Y+HaGrn zUvK~Wd|@J0My+%3isRQPYsiyyp-g>M+m_hAP+|M%kddIO#bY*P_lG@A?B!m=A*gf)rc`~-_^y?>u3Eb3jO8~mF4xkE7Ir^=-$qaBq(=m*iMJmlP5;MplYzSUJ; zmM8<&y%+1bcN?fiQ?+#{(Nr!WPnFWAoC7DnnK%DVGN4iFV=f=6Y}3>=`pr-K`X{=B zHh>mrFNmHWxyDBkgzo1b_0yIXwaULWAZbMkGTPng0~NI@SQ71oh8LM;6}5{A1gfaD z@vxL~JUMNiQRkjj-m>`B+RWbf=fyEPSCJ*I&~#9(2w1hsSV>Rd>A&w7T5KM$yOUa83kDC5avY0Vbjlpj^xfxF!YxU|=_34;TW}fR6w-zz`~2 z91H?j#UVh5L>+Kc0z!3_bOr$`k`Q1*Y7uCVf&lC?r-5N<2#_mN%lHX_Qm@MTfdFUO zwN(3nLr^PV0RjPvpm5*<6bkH=%LRI&5b9gGKoC$M2LXH(S^zBt2;iXT1z;2*z<0%B z;H4sj`r^GBI z$Z0Qke=rKRG4%$c;2R@fFbc6YVpH-1qmUah#yZsI$lKo?j6!cr2w>DYBv^^y&%j4* zA`-!G8nxM z$)*$nMsGrfx)TXt^aiB5IvcCIzZ=2DhYf?EYT}rfK`=l^1pz7Lo3Xtouo4aFm^-T|L4W7 zRU;5?`je45*bKs8kYg4BLag&}F_+`n(EqRX2nG*6;Gy|_5S;3KRA?vvn*RS4!o`{B z=Hd&+qJj8ha{D(u(nEqVo7JF)0%Ks*_s6{VFb=KaAh8<_M$EQY~mYYfK#-x9;Y7!~qQj4@dw2?L@XF{()X zb~rp@>lOq8j$;V@PZ|UQc<#tY!NRw3L*TI679(M6U(~+|kO_Nj^S| zN3QkYe}VC+?JD50h^+<3xG<1^`?;0`4nttK$B>w<1mQ3=hO!kH4#Q)&o)`{CAhuRD zoKb~at%JiitNJfX;Aq4)i{WSn$i{&w|ML#csLZVu496hXuC#xYfumq+m*KxL9D1#F zZiykWTWx|fy2-!FF!X1X41C*(G05!_GVI(&27}wyv*1|t_Wl7wZ6k1uC)(5FzzP&-+SDGKp?H(evBUnOYcy3Fcu4D+z){yXCf(>=HGd;Hd0Pl|P$N&HU delta 6677 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 Date: Tue, 5 Mar 2019 15:50:03 +0000 Subject: [PATCH 21/29] Update efficiency figure --- advection/advection-higherorder.tex | 14 +++++++++----- higher-order/dg_weno_efficiency.pdf | Bin 25533 -> 28662 bytes 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/advection/advection-higherorder.tex b/advection/advection-higherorder.tex index 1295ec7..1672228 100644 --- a/advection/advection-higherorder.tex +++ b/advection/advection-higherorder.tex @@ -1966,10 +1966,10 @@ \subsubsection{Nodal Discontinuous Galerkin} better to compare the efficiency of the methods -- for example, by comparing the runtime required to get a solution with a certain accuracy. This figure shows the efficiency for high order DG and WENO schemes, by advecting a sine -wave once around a periodic domain and comparing the errors. We see that, for -the particular implementations here, the DG schemes are typically more -efficient. We might expect the WENO schemes to be more competitive when the data -is less smooth.\\ +wave once around a periodic domain and comparing the errors. By comparing the +plain Python WENO implementation to one optimized using \texttt{numba} we see +the importance of the specific implementation. The impact of higher order +schemes is also apparent.\\ \hydroexdoit{\href{https://github.com/zingale/hydro_examples/blob/master/advection/compare_schemes.py}{compare\_schemes.py}}} \end{figure} % @@ -1992,7 +1992,11 @@ \subsubsection{Nodal Discontinuous Galerkin} $13^{\text{th}}$ order, compared to the DG4 scheme which converges at $5^{\text{th}}$ order). However, for this problem where the data remains very smooth, the Discontinuous Galerkin methods are clearly better, even with -limiting on. This advantage may not remain when discontinuities appear. +limiting on. The importance of the specific implementation is also shown by +comparing to an optimized WENO code using the just-in-time \texttt{numba} +module. The structure of the DG code makes it harder to optimize. The advantage +that the DG code has over the plain Python WENO implementation may also depend +on the initial data, and may not remain when discontinuities appear. \section{Going further} diff --git a/higher-order/dg_weno_efficiency.pdf b/higher-order/dg_weno_efficiency.pdf index 57c7feef5efc6a333c0f689ad600db867291fc23..6930b78c8ebc8a053a1901d4784fd3ba7679f121 100644 GIT binary patch delta 8958 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 delta 6828 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 cUwnZyH!3ZdO7!AGu Date: Wed, 6 Mar 2019 09:45:57 +0000 Subject: [PATCH 22/29] Updated efficiency figure --- higher-order/dg_weno_efficiency.pdf | Bin 28662 -> 23879 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/higher-order/dg_weno_efficiency.pdf b/higher-order/dg_weno_efficiency.pdf index 6930b78c8ebc8a053a1901d4784fd3ba7679f121..4e957babfc9ea28a8e51bb623830d04868d272d8 100644 GIT binary patch delta 6479 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 XW3u9zv>+iI4v(h_si~RUTL}FZR5s67 delta 10122 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 B_$UAX From 3c1c3d641871a1a369c560d0f9c078e63d3e8337 Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Wed, 6 Mar 2019 09:57:21 +0000 Subject: [PATCH 23/29] Update text for latest efficiency figure. --- advection/advection-higherorder.tex | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/advection/advection-higherorder.tex b/advection/advection-higherorder.tex index 1672228..23a97d9 100644 --- a/advection/advection-higherorder.tex +++ b/advection/advection-higherorder.tex @@ -1966,10 +1966,10 @@ \subsubsection{Nodal Discontinuous Galerkin} better to compare the efficiency of the methods -- for example, by comparing the runtime required to get a solution with a certain accuracy. This figure shows the efficiency for high order DG and WENO schemes, by advecting a sine -wave once around a periodic domain and comparing the errors. By comparing the -plain Python WENO implementation to one optimized using \texttt{numba} we see -the importance of the specific implementation. The impact of higher order -schemes is also apparent.\\ +wave once around a periodic domain and comparing the errors. The two +implementations here are comparable, particularly when the order of the schemes +match (both WENO with $r=3$ and DG with $m=4$ should converge at $5^{}\text{th}}$ +order).\\ \hydroexdoit{\href{https://github.com/zingale/hydro_examples/blob/master/advection/compare_schemes.py}{compare\_schemes.py}}} \end{figure} % @@ -1990,13 +1990,16 @@ \subsubsection{Nodal Discontinuous Galerkin} Figure~\ref{fig:dg_weno_efficiency}. We see that higher-order schemes increase in efficiency with more resources, as expected (the WENO7 scheme converges at $13^{\text{th}}$ order, compared to the DG4 scheme which converges at -$5^{\text{th}}$ order). However, for this problem where the data remains very -smooth, the Discontinuous Galerkin methods are clearly better, even with -limiting on. The importance of the specific implementation is also shown by -comparing to an optimized WENO code using the just-in-time \texttt{numba} -module. The structure of the DG code makes it harder to optimize. The advantage -that the DG code has over the plain Python WENO implementation may also depend -on the initial data, and may not remain when discontinuities appear. +$5^{\text{th}}$ order). The implementations here are both optimized using +\texttt{numba}, and the DG scheme is using moment limiting. We see that results +are comparable, particularly when the orders of convergence match. In particular, +the WENO($r=3$) scheme should be compared to the DG($m=4$), and the WENO($r=5$) +scheme should be compared to the DG($m=8$). Note that whilst the efficiency +comparison may be comparable, the number of grid points is not. The closest +comparable single point between WENO($r=3$) and DG($m=4$) uses $54$ grid points +for the WENO scheme and $8$ for the DG (hence $40 = 8 \times (4 + 1)$ total +nodal values). These results are likely to depend heavily on the implementation +and the initial data. \section{Going further} From f1a440cb4076a2e53810ba55e62ca3aa445c08be Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Wed, 6 Mar 2019 09:59:00 +0000 Subject: [PATCH 24/29] Typo --- advection/advection-higherorder.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advection/advection-higherorder.tex b/advection/advection-higherorder.tex index 23a97d9..81ea305 100644 --- a/advection/advection-higherorder.tex +++ b/advection/advection-higherorder.tex @@ -1968,7 +1968,7 @@ \subsubsection{Nodal Discontinuous Galerkin} shows the efficiency for high order DG and WENO schemes, by advecting a sine wave once around a periodic domain and comparing the errors. The two implementations here are comparable, particularly when the order of the schemes -match (both WENO with $r=3$ and DG with $m=4$ should converge at $5^{}\text{th}}$ +match (both WENO with $r=3$ and DG with $m=4$ should converge at $5^{\text{th}}$ order).\\ \hydroexdoit{\href{https://github.com/zingale/hydro_examples/blob/master/advection/compare_schemes.py}{compare\_schemes.py}}} \end{figure} From 95517afd69bcad5709fcd0e5aee239706a714ab6 Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Wed, 6 Mar 2019 10:43:20 +0000 Subject: [PATCH 25/29] Update annotated plot --- higher-order/dg_weno_efficiency.pdf | Bin 23879 -> 25327 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/higher-order/dg_weno_efficiency.pdf b/higher-order/dg_weno_efficiency.pdf index 4e957babfc9ea28a8e51bb623830d04868d272d8..7586e8fc854ec1e4914fb5ce308f43fe68c5e6b5 100644 GIT binary patch delta 6376 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 Date: Thu, 7 Mar 2019 10:25:56 +0000 Subject: [PATCH 26/29] Correct reference for moment limiting --- advection/advection-higherorder.tex | 2 +- refs.bib | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/advection/advection-higherorder.tex b/advection/advection-higherorder.tex index 81ea305..85d9f72 100644 --- a/advection/advection-higherorder.tex +++ b/advection/advection-higherorder.tex @@ -1912,7 +1912,7 @@ \subsubsection{Nodal Discontinuous Galerkin} the nodal values actually stored. The modification step can be done in many ways. A number are outlined in~\cite{hesthaven2018numerical}, but here we show a method that modifies the modal values, rather than the nodal values, as -developed by~\cite{burbeau2001problem}. This \emph{moment limiting} approach +developed by~\cite{biswas1994parallel}. This \emph{moment limiting} approach removes the oscillations, as seen in Figure~\ref{fig:dg_limiter}. \begin{figure}[t] diff --git a/refs.bib b/refs.bib index 6503f80..07e6104 100644 --- a/refs.bib +++ b/refs.bib @@ -1174,3 +1174,14 @@ @article{burbeau2001problem year={2001}, publisher={Elsevier} } + +@article{biswas1994parallel, + title={Parallel, adaptive finite element methods for conservation laws}, + author={Biswas, Rupak and Devine, Karen D and Flaherty, Joseph E}, + journal={Applied Numerical Mathematics}, + volume={14}, + number={1-3}, + pages={255--283}, + year={1994}, + publisher={Elsevier} +} From f93d305bdba0c5d835396241b88130a55b67079b Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Thu, 7 Mar 2019 17:55:21 +0000 Subject: [PATCH 27/29] DG Euler figures --- higher-order/dg_sod_128.pdf | Bin 0 -> 36269 bytes higher-order/dg_sod_32.pdf | Bin 0 -> 33267 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 higher-order/dg_sod_128.pdf create mode 100644 higher-order/dg_sod_32.pdf diff --git a/higher-order/dg_sod_128.pdf b/higher-order/dg_sod_128.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ac2666a10be3c4df616bd182071e83777186185f GIT binary patch literal 36269 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 literal 0 HcmV?d00001 diff --git a/higher-order/dg_sod_32.pdf b/higher-order/dg_sod_32.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1d1cf6e73878cbf2807f381441d8b42853dc74ab GIT binary patch literal 33267 zcma%ib9A5G(spCpw)KmhG`8K?HXGYXW224L*mfG*wrziT4%T;`^LCxpzizC1@0qza z=Gt@5kjV>+(lOGrK$DfN5SBJWGZF#_Z4E4-d3XpJLB9SNB}-Y60>D1WsxCS(xO zcha}AH6`TZgEqD?`s+iE|7alM<|L-%r0--*$nwudqP8|pgv|fEm)Cc4GIp>bWc}+A znnB*d)=6zGA zm>4A8`Jq-M`fr zHMjaejF3Up>H|_?V?$e`j}eeIwlQ@wBV_z*pcMaV=;-8NtZxnNmeHm?SWTy9pSfPq zD8$)~d)kiW_6dm6-;V?k$ZO~38x#{nrcYA&;`qj1k(jE|QrsMck8slIZL3g`wrW&v zb;tGgcrW+%IBa_V;_ts&w>*BnjQVU7(gLGHvemr&)wPMe1}IjfBDZAf0&E=bv~~x{KNAspV#NY>{sl2 zdxQbaO`mW48|yw#(+uA4={|4Q72emUuKZ7XrMB-ctJiYx7dKKb6`q|+4BwV4ul2uf zLV4W=X}Tv^2|cf2!22x1Jj)ZT=1(nM^)q{V?e1o_o`1{oqTdG`M{u?;FzbxqCvdNY zC;vo9+i1W~cXb1uoMjfQDg@@M)c->Ro_M4VRDE&;)}e? z${z1tug&d8TfN%27YP?^84A%t`>o4!{@1USg`QVF1N6_k(?0yVKXb+(V{^+!@Taz(=XU_Uy$hCxAmarDhY>;K#9xSR?x; zcY;8m1*@fuR}sysgroP3Dw0U0yR~dRSy(6 z3Eyso{7JnrymbJ6tPZ?2ay*5l)f$C|uOtE>(1~|;t|jAdn4O32kt`7PlLaHp(4VWH za*HoIKKlXzRIW0t+;P2!C-_Y3(0^ZSI0c1%HqzQxTb#pCp!UlUSRaYw(SmR$3Hpv^ zm5*U?gc$}$3%FEdDh+0SiWcK|qQ}{#_QiBXmiOa}(A+0*6&{>7&5=QpOnP{j%foEG z<$2NWeU*`T-T8jwNa;2oghLR0}@ zLtmjbNeA#C&#{$}$VgJ^iQ5NU=ML;~>yJ2F@)d@@2G^n2IJ(*utGJj32;8(8-V1xn zUOJqkjjiZZFKT(BVjws0-GM#ejGUpJ*Im?wHi&iepLSNsRRIAQ)K*wm2p3JFiMGap z)OM7cx>Otad(D0+@unD%03n5dY-cGh+P@b8-6`K`cIGPjTTjZs+@)T@WmOKN5@c+% zwmLCPhgieKC-L%fNkdA@-5-WilmU6Ys}m4XH6_kpW_-a=N~qM-v{#T(u&n&F8J?^j z&XXiflsJRDanpHs#I%cpuSw5Eg=HAZ8lr!vu8CG!z0w(!C3x{cHkCh8238Z04xzXJk9()^gFDdC~qfh5av*H{P1JmxYa`5!fjpgkMbi3 zSIl^s1it!Vf7Q~gobr4a{23X2e{P-XEIyJO&j_(5elM+_^vx)Q3Zi(gkP3n6L!&ER z`eYAmh*qI54DafE68^#Wk9pA9%3Uy>(sAAD*i>3k02ljs>p44#aE(`lNN+`_s;&iW zI}~=i8v|%;odvSw1SpXup`3*dfOa1Kf+ZdsQ&I$82t!enQXq%#d(0g4x{3p3wA=|H zMCGBA!NPjzoD-0=3odP`@7Bp4o?Rbx5}C|(pjv=&fOAi}?+K(z0N4TD^sY#mWXNe8 zd+9fA4T*-{F9GhXt*{ITxbp=xX`<}Y$lXWm?R0njXK;EIQiC@4$gvH*-U_yz^0;el z;rHU-J!L8?7F6^gTRYr*a}uoX@HfEVln^U8TE)gCsqB$>)sa><&n-%L_^VxIOG1dG zXF~!M(^@Vcw93kl80;*+!yZ{9^CLy8LYn>Bqc){Ts5DRvKdP@uSjMF5w#J84Coy+@

udspADHak8}3!}$7u8p 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 literal 0 HcmV?d00001 From 9a0f0cee93dc706ae6a05d557f4eb76a33d9342d Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Fri, 8 Mar 2019 16:04:24 +0000 Subject: [PATCH 28/29] Brief text on DG methods for Euler. --- higher-order/dg_shock_entropy_m3_N128.pdf | Bin 0 -> 35313 bytes higher-order/dg_shock_entropy_m3_N256.pdf | Bin 0 -> 38704 bytes higher-order/higher-order-euler.tex | 113 ++++++++++++++++++++++ 3 files changed, 113 insertions(+) create mode 100644 higher-order/dg_shock_entropy_m3_N128.pdf create mode 100644 higher-order/dg_shock_entropy_m3_N256.pdf diff --git a/higher-order/dg_shock_entropy_m3_N128.pdf b/higher-order/dg_shock_entropy_m3_N128.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d9df0acbd157372c9aa274db1d20a3e427bef2c8 GIT binary patch literal 35313 zcma&NWmH^Cur^F^cXtWy4DL>FcS3N21O^{GI0SbI?jGFT-QC?~kl^y=Tv^{e_dV;b z^Q))#?Cz?1x^`9V-ThFjNJ=xavv49(m#>kRwIH&Svyt1ISR)DwlC!E9TbetObNsoY zM$W3?4m2lcl`wWTwzan;7Zye|w=?_eM&AE1Knmn6qwZ|%Y);PkpM#|B?VQO0|M^?R z*xA|K(T<$!uP!31ile=$y16sC{vSD#(tqYR2RW0o%6|JJQ~bYLiT`S4$v=~`s(&>$ zv$C@!=l;*(I?5*2=BCc%JpVEI|E~@^+n)>nZGf1aoxQWu9}$1XOZ-vA-0n}0?>{Gy zakO^c1{2f*Iza@sr@z3$=T7| z_!}Z9z1@2>j(XT(y`y7?g#wU+emN+P)I--3ft2bOsEU+|I|qb^JR^vK5c@<{JM7%sBq=5uvDGh?%9mEbc< z)mb?{+Tl6u*}jlzoq_i-i^J01e$jO79?eJ?&EPZli`}+u-y~>@> z-0?AL zjw5BHzq9A^?d+GF;1=!sJ^H|xj+fJOA)L5puMF==gC=@6?|viS_w)14&5q9fMHZ5& zY6QFedR+n)pZ8auO|NI3&WFeIpCUS}#^GnKy;Bae^LjZ0^1n>Srb9Nq?OyUBVD%b$ zA5c5j*ROE5t*(_Ikd_s)BSbHzUk^;S@XKZ)uz2U!d`Mp8@GO&FWKzjVb4B!J38bK} zukY5EP~LB5>->&)pzMbK3v?grjAUD#VRIgQ_%$^k7*_|&a}79nUY+{E(qP^3Cc_~- zk(VEyYp=kC^_?YV$sDu|*-japJaXc{YBN!vkJ+R4#My#7rv$TN=y~eo=v8Kld7vi& z^yi>!AvCQhK(F}4ywA;R&18OVdSgD~5mZBzc7hTspW?EV$zcdLXLK;yMOh$>bPluC z;;7dT-hpQAb~-a`a&Yt~uM~2*8BQG&FbbVH(Vq+?U1^7nQiPa>=%_Y%xW`1r2$-8I zO|(rZfhxq`ui!cPNhr-*X=VDcQ)HuJoSqmjF;j0^PLxgV&XnlZ=vTYPcDAG!kpd?) zK+>dP-JAof{-9?99^d3>ltK)BPbkRrU<6E;Q=^8+>lPNj&BxG?xacd|>)>BKveasI zdbjVgSP)_{Vn**lJ$78&dXz&TXNH5U3*goxl>e26x8TjB3??*X6{-`p{FP{P!~ZQp zJlRx6yh)n5hp3@xvtE>!Tf=V=CrX@gfI_Qz(Ux5Y-Ab7NIL1|Z<6#Q#qr265Q4M37 zmqdR>_gc?coL6Yv5K&U%$J!zPTi-Z}+AC#xQ4oo<(jupFeiYeD14O@ogyN&l>}QW( z++JZoj@QD03i=t1c~dT9Pr*RK`#24x zZ!isSb9<&rRr^hv^`SPFqu7?{+6^qzeYr+=fu@z*>I#%Fz#4mWlifF`7>5LW65r{BEyx0e8J}e0vRbyJkL0V2V5y>5A zG1@Q4eut%7KbB9g>$cY^27gj+kOwR^8h)NY2rjp>(MxnS`1P%M_em&3i-Z!w9P%?_ z8)VjS4KndS&Nd0(_>yN%6rq+ka1|J$b%c>hB}tazcotgF_)TSHy|=rTpQK2CScey% zcM=k4`z%|A1hbfv+SYR!J5< z)Gbggrd_1L`*SM6ef~fQ+G{e9ZxBo^$V`ePw;wLZ*mG3^@S9h zTfwORt5z3SoAyj_TUryBP0L9Q1v7Y*RvAKxU3ysT=%N$fHXlg4TdgdPu0ZA_>)$0&4TAwMQqs0meP+{r0R^+Kz{$UI@#nF z-DrrAyhSb>5{puOl5Vn~o-`deifT!Ug7J` z@KIX4!m4NcNN599l}SJh8XtN$x|f{nnzh^DOA9ax_r$gFgG+*{FfKe_+fx?fmDMDreE^bOq_yPEwz^2Dri2eOtMcKpNQX`mIoNh+ zC?TUpnvKWx-E&$fo!#ngI(3K<+31`&9Y`BUu6aXO-8k?=r9EuCGARef zZs9fLM8A{qy}Iw3`<5p@x9ncHA%sB@FfJaYFhZfDJg3COcQj!26Hi$XOf12eTh8!w zIllpk(%K|+wwNBjJNLq5M}0&-CRW>s7)K{$>E%R8v+A=z7Y(6F^wA>h1%}iTD51W! z*3VZ-kS}r8IPbtVJb?mCUev@yuNK`sHLEs$JXIwd!K&30i|XILpc+WKu@!rXTkwjp zI*r&sD^zF*Q7qZ2nEZgb0;7(m2lW^tmrT$$0me8YIwy^((E~m6GnW}TC|EcI0LQC?Zq~SL4|IV zx7`}wRh}Hmfzb`NAc!>GRP!wS;1iKtjNJoj8}&0{ms?2w!jd3hZ6-Y>ZWU3UQK<0S zmpzOkuDPVi)Hmb!JgpK(tp=jZRJTvehK-^e`Ky4JYF%t>h>%V}p^Qmhar#Xkwodks z@92U|TA%%9FQ#pZ=DHSaWro!&`PGRhu)B8FiSNa!FL6G6wdZd9{%jy&g>(jo7!V@c zspKz4oYYPN+*3i&2G!khkU4xU+V58*SGil8_|Y}yIgK={6l&&ZCSS!DT}8;qVwt(^ z`o%eAv-?UU;`=e2ubPy6Pv2sm^GP?h#Ycd2#{H#BXL~ z0QxkWla69HpPO6m0c!d#iD6HT+>&w>#I#B^qCS*ZX;O?T*MMkpJA*#^AqXyHR5$vR zh}*A*-yl9NYKyos%D^jFBUIV@chW*39umH)Hoy2e`wa%NL}+b>j$Zcq&j#8|<)VRZ zW-~&uv<4y?nX0N z+^Kr!Gao}`a?B67QCs=WlX^|RGtQ^QPr|nc_e1d}xbr(Q1{fZX`_V2mG3}yf9juY& z$(?Bq%p$|-MLuw_qa2j$=8lp~i^glF8SA5$;R=Lw!8Ks~M&}WBeH*#lQh2QIVn681 zXPRYgYW+>Uvl4|;pYGvLV7DLYhH-q^5(r?lxkUNE`n{ta#&~FiA5!1;z3>Qb0suW? zkHnRcnyZZo$&g0^JeMLU>=EqG5yg+@00;)6(Mh$=MaUS_rhdoGwC&BjGHk_x#Ntx` z@*BwD3!eCC(>&XHF|MIrns2Fma}H|KL7)3n$4>cKsyTC{7q969YA${`r&LuJZGQi9 zm=YX_pOV@6l~NIcIQeo1L};kyj%Hyu&Q8*R!;?Du24mqM*c(QQpLBmP6kp=CB3{mH zCM4h;8j7K|STj4MaJFzA!O9=EN{JNW0sagmOObCv9u~OhBj6;*9=S63iV9*9jLsDZ zQK8te-@snQ5q|0e9mw5uu|FzyZ<_^|uU|S1mS{LdJ+qM|q`qlstclIxiFK%uEi1|(NG5-Y+%BR_0CnkM$xk&o!B z?d?RN#`FuV5XtO>EOziCW*@Eh_|8gN!Wk* zFJ)NQDt_i~Q(6|Y3c|AvF+EQ9bOonwjrMz|XnjvUYCasUnvMAhS>6|&t5&RQ1B-}% zt8o(B(3QaZ)OXj*|52ta5kXldH6nr}j%5H{rnrSCgLWH?(`e~)lVH6=l3*tq%5BOv zWG%*rY@w9?h9J~r=pg1P8sTK#H!Wmx*Xt{!=#_-*WZ=)H7vPDwE6-EpU zGoAf9Z$HujL3A!f<9VfMj6$S$h+{AYA>~|)7_Wdgu}2sHq~Lk7NV!Z&@LC#h^u;DaqJSM1Z1MV1;p}W@s%zK*UwOM|3X)X<~O>`Nk zf=djHwAxl$TCW4F=`7sZ+nn^rB8Ywl3-ybXp6%^dbay|`_J5Y6?`bSTLaBYsI6ykc za$lS|!n0VOhoovfo3+@lc{__8;BHZ(Dm^ zg}M&PvYv%uLYm*uVR7sSm^FER_My58^JC-K7b6&j=S@y5;l^#i-UhBWR?-^kt6^gI zmV`oMt76J@b+|kXP(|=6m4(4={EX#Ci$L%B7Ub2Z``pErdpyQ)JoSr))RuANpst$D z{Gl0Gp`~7FF#Y9f+FDT&wM>P-EbRrcdvH=8u386E(Bt8xdnby&oeu0?tsQEaNrh_h zfse2)jznxn&|y)XC;;gh$hBKxJqx4Yc{52a-ZN<_pXSJsXg0C8A);FPV`b0UpYej&VZG(G%*|( ze_Hpzt{DV&3es8Ft|iOR}wu zX>wVws$W8}Poj*{Hq20`v7fOFW5uh5eoJwMRhpDYs^mCs(13;q0le9uEQ}?igL?Xh z1B`nTH{4Bw(bKBne$ZL6>5Kd3X)iu&E(lI#;EhpfW=v`%2_k3u>m_BsCh$^4Nqy7P z8WNnPfi)(j)5V2fk`Ci4J zoz~!1@;NwsoG-Cas6i3WT|zJ8k}v>4IXF=uGyi3;OxJU-cM>bvROyK&Bdb+o;4fG= zDRam&O~zZ))C5j33dUr;b|>jDb-O2aaF46*b_$cd0zXZB5O4qeAm*8yku85K55F>! zKC~+8pkLw#!2lpTX1dy8Oc*P?dIJrV&KZINO=UKiiCArz@MT9y{u+JnE|9@9eAOdS zQ!^liIRQz$oRi8Tys*%DRV}T+5NdE`>InD%wu)md(q@Z9T{$2;>LPMJrOEt0NbWv? zCR_8PH!#uU(&{L?&2t3(+SUAbrUP&9`2F_dry7r)u}KRu`zzu=U5jNFcn^ZhE|>l? zyQHp!0|o+xlbAcuz;<8xu1CwQ!o7S5i)Bo8LU|LNqcg2?eT!rM?JJmpiJwY1#T5(L ze8Jt0xdL+1i9z)xP+8iP3;2L#qmT5huXnVAtS!ICxzO3bbr@Qxr_BRFGmQO#^AaIs zR0kCfGrS!%G&pJuKe8<{VFd;Mn!aC{trqdLcH0SbhJxZFF_(^XTyvx_3&UqAcCd!W(rlRd6ff z&LB-b#YP16S5BeBLv+kSssXNMiWrH#!;41^!)Tp#fttT zbH^4J!!q0{?0fbvyDvyd^a?HqWVxlx;^CAn8{nNHKG(|OcB9@k$VO+uk^CCdw6e9=IX94 z|5am{d6-?((bx@7q~UL0zU1#z6nU+aXKI(BehK$9XC{>)_9#UX^*D}*HQ~hj%(Jy~Cf)B2 z8Ah6X(1HS|{XyHmdl`c#RJ>u(y475yARLw+^v+egsDW7@)^~yhut$ZQcz$;s9--PY zL|e;SU2bm#0&|^C7)P`Z?~Z}y>>ms+&We$LlIuIJv9Ou2CfDpZUJNeu#%vWnUg(=f z7ZXb8Hx#9B_U>wGCbxTDV|U>Ib?Gv81ZTE2x(7$v+XHsBd+`pZVeT@{@%%q6cF%?@ zkw{bh@I1C`?BeTPmgk^B3-5_Mu=3(i5&*gVIySfm!V(f+VnlHoQWpSQtC7z4J`BQ= ztw-JCmn4FJRm0ghKJXl&%@(Dmfx`{`|(cE^CTxboqj+wCiRNol;gv>S}~CXnt+_=i}AVe*HOkHV4i%g#lMg z-%vA+m^;|U^f7)y{^TG>yYq9nG^loIR0_rN<2R`g=aPiD4SS$#c|P8w(J7~B zP*BdBmKe(>!IuUEDXdUi!0!F8Y)(%Bv^1EgP2C!j+U`FG3X za?2u@pFBZ*Pvjma)=VZ8>r@kS*JFY`$i!M{>ke$LOdF#UQs5y0t{`({9BTp6QI_CL zP0!JVMAd7+M4CnD%BwI`sZ{-NxP#MLFf~y?y=X)&;%P$^T@;>7T?0)(X(K3addbhU zubfpYVTeeUy2`c{5WZLZtEA5F!DQcC>6~8f1>W*m|KJh4xGl0}b{ha_N1HeX?%pds zcRX*^p(Vd(19}Hff63&LZM-|t<}G4zCf0Nl^tci&#!ufg8I9kRi&~b5JlgX!8o^LP z3zSrIJ;r$$Tz`p@Z>ob|JaBj@G>uEX0%E(pSbctX&Rl=n6G8f=+UD%Lrff&Hk{&w!*M)woz z_3bt1MSl%i?{J%@6D?gh&1~m}>OFb)!j`)!@10hK*ED(Y@hj$L=O7yK(7VSyP1a5< zFtwQV@UZBl^~UVP(pU9Y$dy~_fN)gaLlQp!Tt2Gy1IZ3By8zE70R5UbL3?1a0%oq< z$wjvQP=rhrKX#Re6)!(IK7HGtd%y!cZoeqA#&cl)(e3PK2!#kxn609a@M4rit<%s` z@a#v@Xr!`^J@^=dfAjX5ZgTL3$){H?FpDe^eun;%JGG2>ySdM7^Rj;|3{hbOfXjcn zNT%g*lu$EoYM{Uye921j_|yLVYIW21`OlsPDQ&Jjz%z>gFAvAQaj-h$AztZqw*6vf zB>sw%e}Vm}QQ2HCx+Z>fx(r5;R%_t1Yhj&L%U5*^-K9=9dh_DN_N#sI#M-uC>Q?(Q zn~S5O5WeVYB|`v)=J}hb zd2UBs6uw}Sg7x^A7`hS?%TCMZW`(5;|0_w-Tdz7IbPD2z#lA*o+3=kDvj;!qkpkFy|$BI#*rCAvL1mlSDUB?`=ND zXXkEn%0f8v>`Dz9Nf{Ok2%R(gRi=DqCbbgb8?n0O`EwS0PY)@qb%-Ih#CA^RL;?kx zrCSBMnCV<9V#R6PMh+8~9=T#%bGGGnZg%!H2ixGEcGO$b{X4pYk?BM>6S-#TN^~4( z)d!&))Vc^JwmJCW}Xr?DsW}$)0`ju2b0X_`@J(XWMZdna-c?h9H@{_!OsLLKw*L zo=+pLVQTPEId+-6pPY5N&o>yf&g_#4u3+F2eughCAEKR)^}LTgKz)jcIqurv9;7poB@Vb7Gn5x2U!}Le;HYz7D_kk%L%}TQ9t$ zRv--d5aKEfO@;L%M;ZsmS=0Kt5@j#Fmht5DCGJO#^bW0N0Z24Vf<~mcw7mnL#*O7u zdetG&LWUI0WP@8MHl8~yDHBI}OrQ)5&qRilbS}dE*g6qyIPzxO4fyy7goI156OIfG z_gSH82s~fSJ8kT8-D!rAyLD%`)pFB`KDZin*Y{5871z6acPzKo^K7rM0dNSv!WI|T zE{QRee;^m>ou-Ck%?c#a<6p`A9&jkd)@M$VT-#KzlEl7Rjh30rH7rtK^*tO{ApF~! z?Hjl*(Tg)JLy$H7AW_D-G_#G_fQ8gOD&UYBq#s(#-E$ss24xUtBT1YrIcVHp(_33O zhkKEz=3f-dJpaA0KY#pam^aL@ZG0pmm_tiU3Af4}@0a6c7E&(Ww00qy9#NW*xu?bfmuA)}~mtg3d$ z9>v_OyTfag^Ro-xUwRenG}-wbKp*UC_6QJ=8Tx<76<+b4A51jP9iv;3q63ic-@(XG zaj|E6JqJ9Dwt?h70~JT#^hn)Fglx*$OBPU>aGlV`hksDA2ew57-~`p^orzVCJ3+54 z$Ku>EEt32353A)vgIeOC&}y*d=H=Wl69x1UZIEQ&r#eMKQI36;N#P3BV$?6 zi;$~V<7(o(_!=&*< zeFSa7H@67A8q&bE6`GbOSTMVEBY=l@nRcwz#nFPUG`QvVIdcs^K_9bi{t?&mezguy zsj;d?R16uz8oz}v^pjnQRux-rwqJM_hKoikbX%n7_9Zcqzp;d3&jUPOaJT;@Hc`!| zytBHjtMTkAsjtpO8$i(5Okr1mhlI!sS!)Po;l@xdh{%d0ffz_zO9G=Mx`M_>z=!>@ zTH^^`)jv++p#uO~qvzWLk`r@F^ad@aEFLz@V%-M^H3YGx8xXEw$ZXCA$xE=Kr+V6K zbrlfrk*z-iGjJS-{@6kGNPZ z2?-IVM5wbV?3!rJNQ-3BJeQty{^p8`11Xu5M=^4Z0)C3@o9zSVq;ade#z%5S z+5J_iH0UIZgQ+r1AId|QN(tsTMGJW29j_fh9&w{@N|2~h)5PRE<-D<-UmV zOUNyL@67Jg)~U)|W((hmQVXh;EXN$_w8E6jkaN<)v%sIz2w&hL;o4g0)kljfLlCvS zc|9W%9*y5;sUkxF*kWeD8W3G!aRm%28L3DJ#=t>2MhnWq>PT~P39on=9KNxuq8p}M zyeImkRh@ev6I0t~F1uN@>llIK5a}=^N=eTy**Wtd-#EXe^n2XN_IN+KZ$azFr^+1Y zQYr99FD=oai?tBH+5ip0RAJRHVq9@*cq(E9qBH~l_Ir$wPNKHJ3|4@S5L0ab864km zhOMNP;RF3EIR%0i1_4aNRib73%b*aGm?b4J+_I|pwlo0>tp$UxR?}P79_+9;r$erl zUGpa-cC^Uu^e9oX!n3>aQ;N1_W5Fj36qkB-(WjMzP>H)mI}d3`geirN(yhq&W6yWO zoloZ;Ak9F-5^XkELr2FlqVguWW zP^OAB%caal?{8xUue5+=clTMaBUYml21{Z*#=j`4Uk;v{zUgE~@1nw_g1{_;*#_0% z{4u=^=ZmB-c5?rIG5Gc7M1~>!ezGU4^8JI%VRReb{i@f+#XVZ^iwp7A`|)Sju+hB9 zo?oN!tn;SH&tK%nedcmrgCuu2{28B`O~JGlVIq^wuR-EF{Ch}G%M>Elaxd;t7p&e0 zi!Of-QHh-Tm?S=c&)&qz9K0uBUVEHK`KW~jTRUT946>ZWI>G5O(qWTX>o@!Nx`PjS zXqT*>K?sJ0pE8%|l^$$95rI9!sZn>VJnfTM(1?+xvia|Kp_CtNNO_mK#%p9SxqUKy z1Nab`A9rv5+@2{ToDUm5j7sbK&D=|&BL@ninJjvbi1tl$kH~f|=Mru-@lKcTNtZHW zKYoo>uCFm`xBH=*8i_S4uiHq^yml0v-Mz*4F}fA2_2{RB9Csj1oHyPVkw&jVq|KnM z^U`~y^&sKs*p^X6r52}Wa6$G#2O@@nK4|u=&2T>OoZR5SkMiXG5VRi-JjGvQ zCcIlzzq2!2O$w$`nHpS3GwvzdDBL<->qlL<$IY|ZTYFi=f3Jl@?QTXi19?I-?jJ>( zTG+WO>MX^sI}Zq&D)-xSQAoWS#Tiv|gtIr%)VG3yc?lMSjTBrQWU#U5tGHI3hLO$D zHEjF7HSUo04#n*IxwwTSKj(y(qHM()HLSmQ_AP- zs^mv!dz8-Wenx{ZW|}Bkc1zx-}OY}1L%h`TjWM_cr z>dPnxeK^;v2@yNxV9!_NtHfhIo5v^^I~BMKlYq^n^@B0vPsWylAOmdghO-8n(T!qi zGm#f$-VJ(aViHEI`)x8`@D>`x1SUH8p$$C+dPl|Q9nnoii4KZuKV4a&-K`p*-*WL- zbS|%ZfX$sVOEjhGm@>odxZ_H10F1)S;(LUFxPo#vrqbL#m0vr|Hc6wKe^9PZJk{i7 zMZY<@tprpkUbI@suV7!%hc|nGgz-ot$9qD~#L4Q{s1r%R0+25=^N1jEb4P~6T~5|g z{;QOXi$HpHyKGYn*eho4=E};q{K%&pHaC!v*3F?E;?T;AG3}UubPrVW*Lh68`Mx@P z(%O0*4K+3tRnhBReKTaI8)DMFmzr>(N9yuruh|c@zK^Xh$xLb_?LD zh4l|YNRc91*VqbsZ(IG2c!NNgK&OK({${6e6Lvb-nJz6od%fV;$FJJb~N( z3O2RWHCDlxiUcOJLzJO`7G)pv664lQ1-?)+PZ=;&FVp-=T{%p(R}e=<}QYFd-2G;REIp+6(>KqLkR3MTC1>l@$_5?-;nPF6rbt{9(!_6Oc;iK(=gG~uKcs1 zNZgYi$iwMyRZ=MvWA6Fb#Jyy<7hQyN%R##udG;}yo5Zq8=||E$FB-bSx+867ERXi_ z<_2k~C9kyFG|H|UB|)Tj{Lb+KFKmOs=6=p4;%S=KYX)TSg9%(VpWYHHhb0KicHVp3 zO50Z5^=L7IucP=pMhV96o^dRSpxAf_qWR)`_&rB{LYxG~GUEO)$<43+Y&Rm#|5PeU zNI&9Pzb!GFt}~_!{*aasRjbR$PZh;6n19HRQ3p(?erc?i3H+orRSgcz($GfrbPcDu zkLL<5>%Vm&y4)&{yK=g;<@nJs^bsiOw6{Z#F)JRhzHC{^J7%-x94Ey<=XLoNelT0s zHA`F4UA2UDqx;Xv75m67r95b59B`Sx$0ew&gz$WA=YsL;CaHs3sElp%t#`GLAeZoy z3q`eRU(ZR~Z(Op$MHbdG?iSz4%G!>qCAun;&qm(i5`?vu?`DmvUfcm~$2}&y?Hux+ zXqP2$d1D#t(w;Cs@BP-Kb67^7o&a(j)B;Ad&5@Kw542H#K5Y{r9t5ZINUX@(?dCon zM5BsqB@PHQT`SEHNwrjAYTeQvN6sKG7lq;35%mBf9b#ruR;0Iit-PeW3LB>T*U3J$ ztD(@6WH-Lz(lmOw-j41hmNbRfYsmL$D)VO9i>EQ&wI48-Maw=t31CF|-(z?04+lsz zT?b(AleEo{;rSd6h7Gceb`3{M5DT|PH?h9(_PE_v2ySzFpALOU;i0u*m1gr0BPcG% z4NPV$yV~brn69u6Ro3Pvp;x`waRV+TsaVpEMw!J~w)&I=kjXfrC|(-*;ShWOxQl8c zBnd71>ZNHVLUUm~R?q>+aQxc2Fs}X#Z8{R%_$pgVr5=>>G*N^lD8T)#{+>3IWIxTq zD{LFZ@b%kg3rNg#B+~6`VaBNJGU3#G2)(-&dgljc>WS&!-gQRRZCHoAk+q)^(>?`uJ9!^Ca8cFb~l!sVvan1$WMT9c(=<=VH&!wut${oZ9@1 zGPwxP`q3Z~0ey3;HY5`$fM-SV13)cqTCU;5Jhfs>MHXJMexe- z%DQ}1pBt9(_<)M%I&aeKH-nZ{nZO@^1@fvog1oPQG^QO_$|aeP&L@xHcX!2akNzg% zS#!*`Vtyt}YOIFRofVnf=5!XiYRhjTOz)cFw6tFF1&@ZL6h`{?5hcRgD0cuUItsDI z6`d~@!}mBy%0Vct{=^6u%G!RTkMzgX904M!E0YhoW?;Z7nMeT1B0KU6VYN{~_HF7i zjGrbJjOD7&8PgM;hITNd$&s3f1zi=Rj_^Qw@19tW(Lyjv5)@F@9k&)L*s??edX-h~ z6SHzHruqqXxZ~G2G!^fYjQHUR)WTh_L;5JEGmdY5+2NKe{+l=c9Y)hwo#`doUj&z} zkd21gWJpbl00||=T1m}H`^my^wYuM5E=NeG`-qPts&z>x%`Nd-^ZgPa3*zPCPDj^5 z2W0$$f8&q1v%~0LE=Oc&r1ieMgi2sQ2L{-FR|>n`&uvCChUU%)@`?q4SBQMBlg zailr15eZy|EZuRHBQ)U>&?M^(_|jpBEgCn^Mt4L950s5e3}@|eBk$P)MI;xb(izM0M~au=Ny zC>gd@_<^@w-X@fJxU~Mi`a)m}dOw0~aRNQrmN6Uy_n;MnYXUwxprF7O^c0$=UJe(! z%*d6uP5Ugnaav?J|6rC1aiw@a{7t!*w?%kLAc$tfKC~iNaF)uZXI@x&U3^qeHoGl^ zCRx_M{~NXvyduL>LdPI~@+RrVx%3v>_)NM5`TK~F6wGL*Ge2zslEZHy}mszXev_D?zf7^hYO_M1tN4$zL zbuy!}`ivztct7Pai84(e0R6NUNQ_><=YbRVwt}`;KYg~aGL~74N}7r}LOX8#RjDY2 zqBe)Lu|#K>ZmpPu;X<9jN@!@6cN9V?3Tx!6&~kNJ=(T#5fw-YUA42QdnNFx8lP&R# zkH%Bq^-TrOu6<#BlK22j*c5j1#v~~EQe<66zwRHv`=6w@|BIu=!NK!4@T6koqo63z z|9DA{O!gZvGpgof%~ybhf7-T+nr;!$429)+HKdSW*JjovFou)0O~B^#AeUm>r*NcX zK$TF5y{(Z2A2qtscAOpNDLIjs38Ondfnxo^GVZ|t+@Iwz0*7Z}xI%h={5Ee9y~E0l zY|%aB?$ho@uSUlN-~2@D4|ppi-TAtX7+dUNR2vZn#np*X^y)2JLaig>4fs}VH(Ggo zpU!JGYAg}7^(R%Y&pdgj*p{@~G&Ym&N3zFXevjm#^*hiX;Z>iHeZ2otq#jqI?rC{x z^;*<4_>2}~r^WXVSp8c*8-VTajwTc*5ZB9wEa92qk2e(Y5Wjb0Mw@v5b}q~@to2F4!GKaBmP3o~GHL|6KzrVDXEkpmd zI6XXAF+S~(LH^J7LS}D$*kO`)9~uv5F`P@Jd=JX{{8wGXaiGh)K)cMc8NHZAW=ah@cH#4x7ddo=PQgwDy4Pe>thDtRpl9a_c?gtzStGBRErOyyWKHh6y06 zgllBOZsq643<{%I=o<55ZT3<;;`HL-SOxPhlLD2SSk{t9{VjWvy0kTt-P&0{FMslO z3n}%nF!QYaG#-|lMBL_wM5V#+o65Uxb&I=K5*&UUK$F>b~Z zZry<X z%6~xZe-dE-Z`A&t0J#3d#Xs)ac8YW32eHG_IVh%l{{D+(2EoYat9<%61`!bkD6D%@ zY;Qn+AtLSJ=kVvNRzVz6ghqc_RcOOt&t(J_d;H{A-Z3w*p&nm6p)vyuI z^r-8MaL)Lr741`S;AGS%E+So}FY;6JW$1Lu%RWU&a&;9aljpT8b>}w9yvye$w28{( znff)5$&uO$xTXZRlKU+Ew_>HWL79Qqxn8I>kHr+2pL5gwXkp>d5r?@ydHQ6{gRM8`jQ@=$9GqN#Q$! zP7gCBv`ZejI>CNNMp{e=sS__~2hcZ(7bG?jm@k_Cn*co(6ucsBcjOA3XzK+;@Im7B z>j4XAQ|}Cx_R`^K(I>toTt$et$ZFs?XkLMlSjl)Z5n1#-33`2FlA)(oXj!NMTid+VhK7`PDY+S7S>i-{Fg4`#cA`27m6xO=fG$g$Vc4AMw$&Q5edVw&KSt{8^#b1cqLzREA# z?Mpgx?YZ)x9A}eIlq3lHjxv<6l;Y*=kif*aQj(dgh zBnIGon!rI9!$w5tI8T+MUX=h%(bDT`okQ(r`p>j8L+c|FmXqSNMjsDkQx1Vt+nK9k zNbI)`zmk+~?^EctV!<#1BOjpJUpL|+Cq1{AA`Di~6llTIRz<{E6&<7|uK^;q@;?m* z8AGJ7i`(eneHO*A9K3Y;@6GZg-ReFpP+`q~rA9}_?3p-cy9N!oFK^(~9o$NO&66aZ zi^341tLfiQ$EhlMDIc#U&P1c}w6BX!7#k}N#F=yTC~lZEC7E-}e13ZQzygs&@DGo} zUo`uFv!Lt%z~2^BFmkl23(kCeMd-aE#OlJ?dH(%x$?hBani0`q%Z1936$fs=7 zZ643tn)&iT?x;s<0x3awYos+i4Hy~I9~loz>p5oyJIC0H;ini*vvv8-JgN-e+B1e8 zy1cVC$TS;1X84opp9Hc@f4r80bXwA2n>-nimya$wU)~_I5C$y%gEjxQEa%|-doEK{ zZT%+s=i%POHrRqVwQDd9^h!hQx| z5*pr{6FF!e*1+z-DgBwEf@iY*`W3nj*O`@)aRhEN+8o(w;(jX+J=utc)2Q5DmIiOW z4Pe$2mJ`)0_EQ7jO%a=^5@#GRbgsoy!(U5o3!=u_8Gw+4UdD?VH_D5sPK@byBrQga zgV8fuJSI{N_h(F4Kyc1o=xZ6Izb&cRx&Q93QZdag(Co+(PMUt0 zpzr)A1R^rEuSG~!Z5yIbpg>Tl5JIox=l-B+6p@XFG0wIqj+i7^zzxv&lQgR}*f_XV*|<3&O|XKnC0MfILlZ|~utq=Bik3PyWsf)+{b^<(juBA0 z{$JUEe_IuD^ZqR?05}@|B8Wlu!!`*2BIA$Va?(!c%P8_Mn2Rcf3KrX z_Yc(<=M+ou*Fi6^ps_%g<%Ob5hJ_fe!`c4_UH)yY#moLTU4+J3alW&`!%PXQw_%8T zeLvf+o_W>pmLzKOnuj8xAeck3BMGT1mv@WzKJlmz%OCnaqi$_Ls1#9bz$V z=9y=<`<{Dd?)x+M8Mo5DUy|oc-6b%%+fC?u-PCjAqTxc;%$T6fS2=b+`*?8X)P=Sf zzTRhr(uH4gQN(w{Y`(qQ2ea>}=RHuV5y=o?5KbLzSjhPF?SVi;1*boX!s<0)2hOg) z$lw}%(sNB0|3&GLyP@exz0M(4bH1T96%B0+50r3=Biu~eE_x+UotRRLce;GEZ-CF8 zNcDBn{^9h|`^9Bc$ySsf>*%iSka(z+?QK8$t^21)Rm@-qjaIPBIsE;%vws=Ynp1I%HC6U_vZU5*j?a8aA0UPjfwJIaIbWe*QQV4~F z3u3_9fy5Iqa3l)sdf$@69n=qV>v6Fe_KjtiE}r4}}p@6T)FN z>iSW5+~#~@r2wY`C!CrqP+!8hWfPem47Nc}|9X$ct(^b>M)(CbeU{yN9zvTY9%ZpB z=KI{uJ-XF}cT0L91^r73gtbB`^${JarW)5FoDFu@$1P4in#q0UVXB@bPc6b7C(UsV z{M1?WY^FQh!;+Ze=|mX1#}hviQ$ID$%i4X>`y!kB>CW@&O5^?=mrTF#eL5e_rlQ+r z?ET8f=C!3a!`F=a1@}_=FLgHQqT{!GN@pGaPLb{)a%lrf|9byMt^)y1KHMpVqy)-2 z^~a|3Z`rW~b?N zxO(Qj92YxTlT@3=;E&GSD)sS$mzlhe(+&eavQafdrz>MqDT=omP;Lxq{mPv`RcJQb z{CrU-QBZs>#&BTQ>!(k+MEfzEEWB?7_Fq4&%wp|g7Vy-uso)2@TdU1o3cO!5eW1*J8(@iRQ34Nchj<#Jp6*66QAX%4o(2$_ob)Rx1xAvvW z&-6X>@&&e=1pRZk)iU<;a-_a{V?HC~wj)lFTT`H&rzmtUk%du09(mhU37MHxoDk{X zI{F|jp@K)MHd;~?N2H(f2&8J(QB0$K~+L97m}v& zJIqUe)9BP>?7kDNi$5LZG$<%CtQti>604-Sy#zu!RV;ho95ao7@;N8-ncu|m&N`6* z%Q~4e^$}0Zqy;`At3|6XPIS&O@0-8(tUiBR4dU%Av*uVjRik80AiALHU~tvJx?KHH zjtmc1wdAUFuJ*pbpGTfL?77HT!D(KJm>PZB*v-!)_7u zDM~VP%pOHsw#W31ytRzISd(V??FerbkP@$1)MGvd0Km?-K`AE&~LeuR>p0SR3=fLsBC0_pf zf=49}A+%p9c(rnOrc`~@+CR&kD|zJlc+@l1r?ZUtyPE}bWSe&u3&OUj(2LEXco{fa zn_GuOTn%m=A02)P(wnT~o|Q(*4_F+kfPY3Pnjs&Pi|_o)n_IH$8=W z@$~b{#47v`TwA75xWN8WcU4W=;Sm3_DTb34LMqjM+9%kg44Q5?)J33*Sw0jg`rfk& zSI_cw7Tro)bk`)4(ktECU_@Y&=84AH2esS9Llm-H$~7vyCDnv(Z9vOvE$!dbFcfC3 zAtI@=IwPQJ71eHB}a$XT)V`n$gX-kVT30gEfKOMDN`jW zi1n%0a3g1ofd=O}n#D5;oo^iIoAzQ3GiHhsQe?I6G}b?*=HK?c?0Kb(`rb@Yx?OgU zI;Fnf8T*LuepQnHbY||XLtdE>!>P%ELY5H4!Z|#mcTTKtbp9K8T8a+i1`Pab*u1oA7M**@6zy0!sHf2;bTz|EGcNy46N+zyuPhh{LwwB4I87{_XsJN>k@esS1f z=TFH~bzzil>Ge%~!wN@4PS6$|dX&pSo#n(m)({1c<)281%*%b*-m7o7m*=bxBVK>V zB4{tx@x#T`L*bGao^pSVJn!T&RH4l5dXAasyk)0Uy*|~sQbxs71)^~wN@Tr1y{bM5 zeoVMI-4M$%&vIw{^Wl7(54`7`IbISOP_6lxS|&<*nSG*eGO2dG`LA8tFuPh!sg)wg zvX#WI?bxKxaaP-BEL)nO@G3YZ&bF*}miFi-wT(_$S1%Eg1`Z~q+e8u4Cg%(^oz%b$ zo#5(Da|0rDk*EV4xqPjtj19OX6S^lW+c zCKhJqj&J~vAf(}7Y9VCd!XT$AoPdWTK!t{&YB*8|d;n!kK@7BI4o6sk7|37=M_9oT zz?8HBEx{0W;1*Bt9kc<60oR{80m~GWbc5@zTn_q+9x(R6TqQanQ}l{yyfi{u7RHX|U`U{SkaR)mip$07{Y%2Z2)Y`TfFgilG_X6q#8yBT z)M4n0AY@cPH=mk0fT3IJ^aoSLJF zwI;;RrOQ|$3RbZUaq3sczyPe!v9iJIz;QxC|1SdUzpV$26ozBK_+fxMiZEF8aA+Ki zfE9w{fu)E7chI5%pbG^o=qL0Y%8v$U0_h3PeL?I6g-6mUSWp|V&&_);ApFKCw(M`NHXc}W3_Cy<^5 zJm@b-$01RGz@>IEpj|AOd(in7^bHH1!hl)OlN3-;J{*Y&&=YE(G-wb5K_37^VNjb` zP=>^mmCiv=lB7W`VW1Zwh(%DhA=02H2&D0Vnp+Am?DClXs%j|$I=EB?3Q!D+VWD1u zo)dF=&NC-yywp;-L zM}V&cND!7}0Fr~Xfy8Sd7m!S>3M6@eWMU56tOSU1oDdd_ zA?Pb40~-VaSe!|60X7KSs<0vxD^G|iVBBG(Clp^5NMpV99m?}7Kym?%D)iL-wK%NS z%cS8XhcZ=YmjK#6v>bw+0SH+dr;854HgVPaB(o*EkC2;XOZ~r@&mq-A#k|E31*Zpr$fWQta6;jPw!alr>+dCyXRvi zZ$&2ZO$RU^NwjKI&E>RgXr0=L@iR*eye=YsedM5&?$ZldM4ZiG_UN(+qZ_Amtk{H} z*2oxME=<{Wz4NKAUpDp%8@xoyq;{_Hil2WG$I)%dJtvW0DwL~IUmy1vw)V{Z)Ft{l zclw@J|Fl(CqTT!v19q>1tZI2GuJ+c4r@9KUx1@97ne9EXxV?pDZ$}G@@0O<(DqH3z zCBA3D^F}MyzIpJi>=}BXQM7Nt{f@D&fD9^A(#_T2uyFU)m_BxGdOMFGQ3S4HEc4EiKo^9fVwmr3I30d1d={VI#1%`}i%^o`W zf(vgrgK%fdLgR=BPZ65+d3QVSaqnul{mm?2R_b~V&FzCaTKvaKG!~c{v~8q_&aEfY zU0x@;6yY3#FQ0WYI%s_QN>e?{crs1;mvN>%&4=IFJ>z~pvKmR+|EFe*U9Bzrn}xXE zB>@}SXwM}JX-ujKUZa^Okl7IXEYMu3^9Jf! z)cBTNTUow*;@IXM)cskYuH||dqo=IWT_@q9j&m=kkIk{Fq*8tjs2ACB7BSX$-pZ^a zFrstk@w&y4`Z-B~j}qv|yCZz+@R`?pXHT?mZ@NIqN<%Av2oakZP&x-`tz7QIG^!kR5p#vbxSjSF>UtMjeIB_Rwy=`ees1Z;g4=>2gG5vgOv$bE) z$FK*+sI(~7cs(w}7_b`bpOcNIOn=z_`R&Z;{0}kq8NdRRq%t{@OYVdoadrF^`^s-)wlNJ6P# zWr&trTJ>jhL~g8ixrhC$#KLE9@p-*0yy^1xH|r8Eap#lew;V;3Cm|IkOYfuvw5omN z%F&o+x!cNFpeS|opv%GF(!93Rhwz%snbXDvG9CAF6|%16KCZS1+$$h`|HXC{bC#Lg z*6jN`)VNfYKaPB!@n?!Rq>S4&rS@G{$Fs{!g}T;1?U)pv?_0Uiep#_cHzkA1X(@`u_E+ZDS}50T zEjf)7JWXD&Sjv9a^;#yOZS;g66D3pLV`sFJ_gCK0y2NNZZwuJaGM!L;eN zn5fk!gyd|Ir1Ud^%a{FGJ>o1)_v3#4pxqb3=DoobSgjoV+Z2FQmeo^0CbTj43^*H@ z#lv>pK1jAugFciKJKeK@iOSW2AN^L!ESU9{zvZmgs|EW}v9Vj?IYV#04!W5<90}@N z%*1%~IkpnU80byjUvmzhomM%MUQ<9>U#Y^pSahaN^mTti@8Tp{M_W zF~#tOyMtQxr%7{+R~1ZhvshltVoZC5dk>DtVqF74GVQ8(i0XS|x=H`7~@ACz{=S?iyr zR&){h?92O+YS1BxHAmEuK5+h$q+`)mS2DVC>%FJr#O2EJjJrkV>x0dDu3nwUXo7dq z#y0V|S4kFKJzbYB;>q74keFP2GdDa7!(M+xH=p5Cc#!M1Yu%}QAB;n#z8LIS6zip> z_S=5**)FY?f}FGUu+wyOub-TJvFEJh8FiY3{)P8)x(N4vEoKHSgZ?PJ*o7Y* zMOKy0;r;!)JvGV`+kI~9xx{C;3ZR7#XK>mN@b`cJdD&}Iz)xSJs|>1}`MZ-BV+(28 zsYEWRC{<57r`L%{VFtXn+4y`BxhR@=*=N_z0Y6W3wHOcTj@`|w@8xU0#5*DBSTA#w zeXeZL%vIm5=uRIQrj42Owin6zc=}VW$$0_Awh6_4KFU$`VTEF$vV|5E>USO&RfVDk?^$D_A4q~5j-E{yFR5TAI#CwbAEdQSLHAN(Zyma9}LNJag&3}SlcjHk(V$*oP+ zMy*7{!Y31l?vIW><7JHDrS?8}GBy_c{vf|L?aovo-FXKF@-k`dUHAo7Ls?C^k1Q{I z7rBVclxf;A5+;HE7-yy0k?cKrl_ExTYKiynL^$d99PmvPoJnDO+owEGR&(IeOWZ{} z?KjNMVL_VvjdtrvNp!w@Vf1)U^6H@z43*1cg;okr*rE57NOO^97gv)W@6lUndl*j2lgV8i z3ELiM{pkFuENcymN8kI5qCGku4cb4hMdtKko@uo=*Lp_AJ+8+-g5O{?qPk-8;azjy z0h`v;V^rEzs?2=hDtetrkJC*rnH{{xEw<#;jUK+I?hso9pBLLXztcJN1y%f+)-&H0 ziwJ_j8OoG5twgNqay!4BCl*c5(igLp2K6;t*%4fPc#T8n^3Jq;%_~c^ua}`6DU~0& zR%Cc~{As0p;3oU}os#niG^Zy<&(n|3 zeKpsZi0)t%_jVRFe*0SE){#TQrK0K@yhG&LFY36>efqc*Pdwj-X*GD25SW{B?uc*v z4S0%O_8twXt9AP{B5p~^zhEwIn5U)E-K{L5iW`@FCHpno;$Hn$3v{xUPANm;TP@nN z594Ffn^HgQ9$|>iEIh>2sLK0@*QrF}-I?dKm%?9W5A%I2Y5wH@ez+n+J~FjP@}2x* z!8b*bFcq~^S!5$F$E?t9IWqj))OJanK_HkOjJ4>+*5FTf45XxS2rA2Vco&W zI+h!_ff)Sl2|RAyF$p$Ifyf1kffMY|i=CSjdfY@mXf%H>p5E0a@J>JBB9|N{LMQ*z z*GW^(RFli!C(Wz_jlAPpo?Ul~9;gy6de+>h9o%ek;cZu5aC0s};CSH`;r%5J`&tCQ z79qNe_B}WBb2=E#mVS7OaVPPs;?2j;^TD5OC^CBK&rKjdnwL@BIPGLRmmIEk!!d75 zfWH&G#ASq`riM+4cF*Y!o*qq4FGF9Q+ePV~KfGcIjq^wH!^tz+y@D$1FL3r!1zH5U zdun}U)=(PXq|%D>;d;;RL;1{1d5BHM{n9OsstGD}F2zjM%N#LQ=L#H(Gq<8grVrdK zC{(@?nL!o9%<+g^S$ifX&-AArZ;uGU$@jo}zkq-W_E~d$qn%X{k7otkOQP(xDvV9nZ+)SZ2)I$YHLmSXu#)SfabmOibv?7fB$?o;fV9=nOA zdBAl=UpYdXTbq^Ym|Wz3%at@Oi>OeCT>`D>A(!zy7n`XHS9>E_7k#NgBL2Yt-9=MN*(WKs)W*dA|@Byxof1bVgK zz;94r%G%lj9B`}x^s&o`!7l(D`cqwN0et}LA(Q}wMZ(&VLI6m%26#FOPJ-3JH)jAr zgF0OS-~zr8&29fvSRJ4qf+(Pg0T3S`P#^-ijI9NTF(kO-zsJ;<2>&ZQ9rR%>{6T7a zWsg|K)A2$8H2;mKlU{!#>Hq-y2Soj!NL_-{SBB>wp>zla{#z&=13(|JV=aT}B&r}H zbVwYAxcq+^VE=7-fFc684Fi6vf+Zlqsg5uV3qU(G4xoHk;4=u(xb8m`9uH79{4XRL zLQVf6{K8?O?vngPr30AUvfC>;h(fMG#@gu(FR z0L)JSx|=YBqC@=zCmMJF9pka!8$d&`Bs3Nvpu%W40pM$ZCJ+a70#p<&42}YX0cs7N zzsbS?z!D2`VE{&m0Z1Sg%peR7AlG0DVW8gP0R|3gTEfc#CBRk}1``pW(J%~X4GVe# zsU#RMe=*>Y3<8<4c)(Tg4G+W*3-DtM=pj@m8gLs8^$=i+5LZ@>+kZWVtLj*(??0*w zLXxq7&&&J-zM^=*Q;6?)Jm5RvBM!(1gbx2|2~dXvs3#Us1j!2q;*JpD7(hoc1i%S^ zl%oNd1?4A|7XsWMU|`U9EEqee42dhyJHSk_&`Ah{>jMr#a`LO4f1Vlt5rzLlegCU< z{X)@6tN+TgGP zGzj_nL3h^&RoRO?{c-XX=K>?&hb*)MH#=4-JS zYf_Wo^PlH>45(*RHorMHa{L3A^=889cw}}*!^?e?bhGv73gqK&4UdiOyp=P~w+&ej z5(~v%n%XQT2_{!bIOV-*CVPG9f#3T#dIqP=&K~|cUGS)4QG3RLdC*h&=H)bHT)mvS z$MG8dt}i@xB0ua8H4n(&BsMd*j(!tqm!B}YXDNh8dv9vZk$>%klS!?OnRKe1_Rb0` zCdSjFu|n#Wm3nSGj04jmBAX(eGT&^u9L(E2fv%j1n;x8Bq#ccJKL4ktgZo>!69pEF z)j}qC^6^ga3#>&C*fGi*7ffSk7UXAtGG3{m+e%fhVd5_nMXq_5C2wpzQxee=e(Pu+ zt-=KHZF%A|y!1On_@+3j(g_R6PC*w$USrVdHZ#fovrb2cEY#7&H>Pgi()(`}3VMcCZj2K z{Pg5vnppSZp_d<9>U5)LMAS>~M*OHq(QvX1;on~#faXhkWs}k|;52xzUiS07W?G9A zrzAJv%HJYj;LLO_SFV>Z02dyTcPwk8M)LyU^lY4ar4mNZaEmXRUX43g!H?tOSz?FX z&uh0^9Jq{*rVK5}adnwh>eQY*7OP~a7`%63{`98DqXDN?jbPYUt!$SMF(}ZcMHKK- zZZ+__6m*x3%k{#W#hhq^1B2*IAD$5tn+}C6(g-y?eCg1whw&EF*?^qCMObiPA6-4j zz&^XV4^DY$_9tIirFy+o>oiw*+s7ZB=Yv8S!pzAP`=T74-8fS5?pU^1#<_1r&ALVt zle0#qM*a6c@APOFsj~dG(Eh<{dodHv-z-{hzc>%?KwIHw?CXBvS2Yy+iarDRoeUu^ z1UWmm-BhV@alEk}(sruU_rxwKRd0GEJ;0ps5r3s(41Qsve?s?&LdnC9#hU1GZK_4l zXkgQ64k>w5I~ETe&rv85qfr*#!8dh&TlJPgmG9#V1AEiY-aD3|LmR+gks&zD&QaT| z+4&}`>{Zv^(U9%0Ek}ZS_C8IY+D%W_mM3jhY^KHA-4+q3;aiMS`u0TJQz*RV>YJpWBw2EUE(g0Z5`KQM6|F*#%FfbZWSNb?qPeJucg-AX*=ae5ubc; z6V~t8K5dTa7$GIyqxusRvKP}j15h!NP3LZ82!A}?Qc7#fNOLT6kUI2jWV6J(G;$o* zlxbd6pL=X*{%2oso1R>yzM$pPh*oudY2`>hhCBVO$+v~0?+2SkHVL%31jOv`RI{-? z*O_=&v8CZkU;N|N8rJsPsw}66KBc^DSJ!_V_Ob3@*6=xU z>nq&g$*^4Dr9sXXg(-tb(5@_;WqHruY5*LU8rruZf*rxka_ z*!J$5vztR46OLQUpZ}Un&Bikf(^Yvpt5IhpXqA4@W@usrQ;FJ_MVF|yAeh%9JO6!t znihU>p<@G~{cCIq9I&qzTEWo9a3cs*K)@vF^yDTVDCf9O^)&en`fc9|W1wg%G?x3S zRUMvjbHC@n>?2%JzwOvC$KBRy#Ut0V1dA@-+lhT>_&!U4f9_89+im(+b+<*G$Gumq zQGA;2!kcfw{H>ymIWfT)rN29;D-%85CH4Sg7aWA{`i$GTU9LNiMRnA~N7mYbU(0o* zy*cSkjT+A(^h-OTx6Ego^JQ)+Xu_VqipGGu#<+gTT79JiRH2LAy&@YFr#hcy8AM(&n?%5=g=Ps_|@~kYRTGvmJpT%{tCVba-+L7*t^slNfYKqjZ zz7?%vbRuh3Nqu7P1r75`@TaMAq{a(okZJDS?9PXqDB{g~28YwhpHun~u@UH~Pt$Di z<&StD<9;0-}X)hR{yDS4bti7wULHc zazI)HC4?jhfg9|Q0I0*_`Gt_YLPETJu%&#!=lg)Qfuo(3t)rENAsl^3=nzT(Ztm!4 zCxSry{&2{aXa(j6hHngrRgfRY*MgRi2CLef# z#CcsB1}qHg(@^Q~CJnR!7Q6Ln z!hi4&iGeO{S(gu>>VKvQL$bBD4J>pfvOWz1IhU@>_b0tbtT6DPUY8Fz#IEN7AQzhP zYwN=a1FUmh8eRzUHC>wzkAmcVT^i)#w>}NKL0QP9dVN0OKgJg+4DNhfpHCPKBy?R_ zVJtL}p?|+*7bz?ZIq0rSBjEqw9{~k0_I3FPfcbx<5g^ClHT9vugx(+xV9D$AK|bK? z(+Gd`4}}CHvOXUY4UqhGWx?^l`td~x3;n@+uzN!4G4$^jUr+=znDy(@(0Iu2cWpil z3UYs5mxlX8?on6_1n{oShZFi^&Y*w>_eWoVT&<@AoHhKB4~-J~W3GZ<#sXjAwe5nR zFhiT&+P)B=6Oy%QK!U(o!TL1N${%TvrnW90a)bV%afDTEI1&vktW1b7Xp5AyF$Fs? sv@w9aS=H7S+D}MvH4AsJX%nDD+QHF)=tx?k(P$vaFm7%c{x?NnR&sGPRW)}b)BT4dChwvI>gQJ`4KZt+wqW?@WclbBs{T~IAE{^U_ zWdFG-s!GNzX6|8aYOW&r5BlFs&BfTk)yde!+`$y|zn=fk{(nHs^5$mN#v+cue|rA| z7oFI-31E137aCOE)Vr*8h%5+YMQK^*a8jyHQn zc^l&|vBdNW#lc9-TGK9*p{Tc)%+$A+ip9GZ!nfO!#n0;(q3cio&kRHVK!3mcgsW9g zX8X&g?8nKc^V$6-wnbeBcaPu4+fDvHpy%+^+;`}VC&-TjTxMp*j{9th<7&`eQ{(fJ zCo`zJX+^d27Q(-^x2UO!IA&wDIsdwRNAn$FeXyjxa%|`~Kj{yYX4VM=BL+| zHSxEPM`j`G&+U6h|J$3~PaNc;rv5)yo41f3FP8q#=Z+s2UGLXjAM1{vSF@LX@2f%| z+xN`=k2kV!nub?(R1#kIt)yN)!d*+dq1PuZ4|;#?Hk*d_KdXm$FPpejb)TK{nXg_2 zh3;q$uQfa}+G1M@7SFUyh74wEfyz^kWl0(G za6hp>9xVOUcc6uyyCm`apKq9}Ny~n%9j=~vAM}d1oD%ZAzB(FyzMeW7-s+~J9BDyS z?^kN$EBSq%FK+t0a(6vFpK|-x81!N+pJVGw7F0Bf#H4NvrWK(2t`2q`lF7Mw->0We z&o9`lUOBjyPyxXigWmxgE~A7(r^nxYshaQNM`83fM$ak<^y`0w+APt&wV;I+&Mm-X zhUJX98vA@@j?UG=b9{P;pMy$Snr!swb8Q$`5Jdz>aym2@fEX;g@fDla*4Q$%B0GYW zL=AKv?=B%C^}}#Urm6G2%fL*{9s7E+bmR<0iUqd9=W4&tE1LwVUz_+~jH@`IsA+=p zOJ){z5N2K$R2+gk2Gte>xrB7*tN`rwzVT(U+(r zF{4~z0ER9?5vi%+c2-nl6l2XczKSMkYjkVWgya17)9ifhC>Pedc=y2r|;_s8I_^kTBB45J1o`G$oc$=JoI&t!SuYi@?dPW zN|t#dX+-5t8gEwFb4HduX_)S)PQtE%BSnytdHhw2WQ%jqz{@&t(tv*P0JL%xN-`7` z;uND3!p-39ZyV@jR|+vjPZX*VEedw2UN)&A`%A*Mg=Y&me3rm{tL^q&H$@y2VN~5w ze$lm7l9XS!!xvSBG<-`rsqV#-ePYRX1mRfe#fa!vq~br7Ua5d_3EqlzAU0W)ymecC z5d6u_)f=bRbwId_YYP^ppWc;!%HZ9L^wq`tumc5sZQWMV#6dOfreqAa-dvfEQpSHZaVX}co< z8VQ@PmY234^E(j6z-$(-PhjP>8`(GLFJ)}Y+06S(SlIw|9zWh?{Hc>C!D50MqCIrV z$J~~wT+Lpy8fT=fjheT))G7*BSLl>@$qm~8zoJa+)_Mohx$1uHL zShuUjRsWegXzA+w*RDLe<1b;b?iAAyl>R~u=Y$OZl&$s!&~GYFI~?vu`j1qI>Tb(A z2FP${t0xH*_638|f-r4TJubaGY%j3`xEa_mB6^c!Tf!s{PtU6=g`wj{GdUupEXl7t zDer~zp+Tq9ayjc^+G6xT+-tt(V#siTWg_D37H#FPj^?}24zPW*3jFmuuJ1ZxCz3A9Fosn97wE(_Svf|ekrS1L7nF&}-fnfxWV2pVn<6L$Nu^+}V-@aG^ev~m zR*A|!Irj>RrvfD{%-evf`gE-IT#gUK1o+SZ9P&rl@Zcb=1s;i&Q&Mzj4ptNP?dd03 zmrZ;x%M2=kN#^fJ{&;mr_mpX)Gaf)J0)GUuXc&W}pYo%nj%sqrQ>OP6({-jCM>mv% z3Yd%va0MHDR~n@dVI9G>hifj?PiShg6mlb>RV+yA$YX*reUo?t{IyyywnZB`=Q7udRtk!u$f8v%CRv6Q0YqOXN&R`vqn-a6`A^5O}BvYteV} zc~N~@nP>J;;_iR!0=wKPCB@;Ie&4da3!7O6bmo>XkRlIZVU1MEaZ9aH6s;!+$k_lNFf?hSE7JIRfC#Ycj}5L z5wTK$I6`u=xl4v{^!>S9ItBpAF2dr^%{2*gw+V8c*< z9$K0E=5D&AaL&q7HOB{JOH5&`#1}&pNMDz{$Q$_f$}B)aSLbySd+-LpHiA6rz&yiP zi>>x?RHZ`%E_<2L)vp98GO0{3(N4Ck7|=+l$e-kE$7SXcpK$so2N+axpMU;FP0xqA z#^Q4!c@nAM_Tcw6nFHqqzKJkT{9`cj_c6sdsZ-PmEK5qXR|op2iTqO2#ap=)f*m1( zKn&+T4f-}9#j0ZUJ$OEv2f&IB2!E|}1>Qy9Y;TA3_XW9oU&QgaQ3lm&hCfq!S_ zCtZCBps+EB-Puy2f(?%NsNEQHNkVljOeNr1h*8iX=m4(dhfd zm5v3rrq4*D>{)Tw3M0K*wJn6+GE*x-Ov^f9!<2^KPI7UB4dQ{^Y{RCGXCYko0|v#L zrZpB_8l|=gahWn~3yd=rK|q_KPvEmg#1wI2&KV#QktpsnnZjybw}f3{U6Y)vx6SNfk79!wTf3CC50I1&Y!af=rxCDR+T1 z@{%o2su5kGP)`o0<|CE>3eUp_)WyN+w!dT zHvk)Bh9XZ^tM2VsERJ(?jX>^q+}?qSWbv#F2bc{jbZ`eA2QQk4R;+r53Swo-7;-M0 zdtr3snQ3f0B(CFJ_te8mrtLir~Qn|}#kQAAZeWe?fk&!Fv##TGms%&%9YKAcL*!;4K z7hx;}&n$rXke(<&qfVF^^-QlZ)*QAOg%z`j2sr#q{0MkXK7{~{MqKCO@iR-I)3RD*S91;WO&4G(mwe37c)#*_tMFtQzE8+ zcaTq5%4Q^x(D}RltX=UA1EQP#Idwe@IROZ;TLZ2!)Ime?&qJ5p!mG$R$7A8IQ?RHM z=42h2AR_M^V}l^_`vVJ&`^X{=f)E$3x_~N5P9Q^^hU8oTBGd9_)7wJ-xp1aJJrUcJO9ZeE`v~{Moh^~e4C&pt#$(Rn5iYVLTp2eH&{@(+f5F%3rhE8Pj*;}ovSlGdC8(@6E;^9WZkYW z;mG3(&~XbQVpUe+cqhT!dezIGBAC`sN~cx)u{pCzmmSqjua(^w3`_@r@gh>y?sZeQi6^JJ(6UIW$9; z87x=1fTthf)dnKiX00))snPShw6VXor40pEbYpS2wmJ2DYeKXSTw+%l;+PG*O|4Dl zJMe&$i+^chWn@8&&p3E+{cbB1?&?F=w3IZ(Y`UuCpu-=cqHv)A=u~8C-W`x}riLyR z@c$ZT$1>Y?tUt4E8uqw*(-nvKGJO{A9=PdS#f0X66+DVan$yL7SM-qBIWrLYoY!!r z*_2V*n?Si#J(t&#s=`VkPQeiQGG_R>ow@n`VCer}9OEL+ANW47>HG5V_<47_nZs8` zlk!%I$1cu#@YCa2#-Ai*^jS~fKD@fUV9~LK<9auW2C>mSA02qqhy7uqYy$5X#vA!^ zSYE(jt74z@p_L2_?OL<8O6oXj@C-xr&rumgpw{3zsO`N*@GrWkVG{^Rmu5lPMQlv^ z1!`7EM1Sea{1^Dx5Hs|2QN+n}|MX!r-s@NJpvzJ*Cb`&fRXo*jewYHwyuBB!~r7_4o#B1fS2yOVpaJEGva7IAzG;Ut^lB$_`Su83LXKAmXRkC$>-ZN|UR)a$C6qs)M+M;RXt*8NPcRUWh4qT-eK3{5NM z%Gm1L6F2#^1k1!Qosf(*T&gTC_K+!^mIz_W*qs&{jw_u=(6edjm0F-xY&C?5#-8hJ zQ*FYu4#9c|PFmT;N2D12dzS_z#L*(Iw{+x;3E4GE}Fe%UfHH8=TTGP!-`Ar#jWB537Dl7AFatfMtKkCi^kJ<8-$7RrfUbn1$m zNVefn!O+=1HJg}Iu3|JuUZ@K(<^spfro}sKqwGh&?m7kkGvJV6c?@ksYtsR$yk^2c zM5H;76Vh=*^e{rW==g7w%3o2Df1PPr9`?L_A2P1ZYcaTw6_tcsHpT zINpj4@v@Z@d%E(26H9oo#joQH4s~_;$Q5t8m-0pxdN8(2B<-KVS`TNA3%!=?9RdCw z!c!K5HdDmbaw@_^WApyBZi*>9e%tzV>n7D)RcskY)Q%I~6{ph`ZL?7Y(S=q*;r0Q2 zKU*SzPHPvuYm1r%D)4bfAG()8;4Fv6g7Bv^32vUJ!hMoTD#15|b(ZEBF@H#%xtRL$ zUl;9LG4~F~M#|e;o?1!2m2BaOTvs?M5cB+OnhuS98>HddXZx;hLzBhnTfSq@W|uf4 zaUmg`qs^L6kIiHkn-3L9#FJ9eCspgk3fOYT$U^!3I1OYz5E)WV9k?BGWY(T1mPxfY z4}<4k*6;AJ)MUimSfg*mAs!ovlZiPoAK71*RJoQmzb2;atw;7=#C~3!lpD}sg$xbj zM}ysTf^IWMwHSJadFpeVwq2Qw*AOG}bxK2&#Z=s@(V%rYI`ZP$*F1y5uzcn`jls(h zmEH?B)vhTO&J)^`^^-HdfXQCrRDo9V) zzM}AZQl(0p1g<{2s%HNdo1_u&Yk)ItkIxAt%g(xvyp)mR2t2P;Ox>!F%@!6r^ zuw$XqyY$N$SXp5q6Espyx~IsoTvrKTxV5~w7ue9-k#KWhAh4woyY{%vF>1b>!8cEJ zCkgtKlvyte^qw`wZ*zq=-ogv4|FF>t{{CdClhv;s*m#z!%pCsu7|^7j57LlPD5ffE zYUp@DQ8=?e&AL}w$9`4{rf(OITHmlHIdoxqOn62-(X5b_TI5lnwk_4jg6iI^ekNgN zFqqhOuVX526H-!dyzAEfH6y@BnCH#AL5~I9!F*3TwR%KN`2s>2`BTn)sEwgoH9?I} zW3yZieRWhO1;Nj)8YNHIF_Ry~_Doh|v0xSHZ7N=*l;o4*zIP>|tuP-qW4Ilae^|7q z)HYjWHO12u)r)JcttKdFW6kLw!G8^Z8BDuRkOOo2giVRQ30H11&t=iN_E@AtLl~H& z=c1E{Qn-JWgGO~%3tC0^t}@z#-iw6e*Fd9mx{Y5Sq);Bq z>m;>^LL|iKO+}YH{B_n^(T@>OVCG30%RyiM5)qkTYDrYbnW~Quo~imRAIm+J(c-J6 zcDaWkc@_WdZE2cuySqNX>QoO^eN3Yk*IE7Q03(W+WHBqSFL6E(YA9vK=a32nY;6)W z=vl6ej;xEQz$-DRSIkvMXN^k65jAORNhf4+=k{JKD!m$E70olf0PBwc9&mxSk)aPR zzyBUTL5`PxI|zPdE5m(NN1jP|&l~sbd1#1u9gK+F5tNnx+XDU);JUZSgdHrN1t-b> zW_|%A*RUSUyVB7KH2pYndi}{(c$nN;T8=*dV0O7(LXB-3b2SCjnwf!uDq(fGPAAtY zbQdAikc=VtAfgw5uymiR+mWFQ@$M~i+R|^uCs8~Sh$W%a&`$0q%NbOrvI0I8usohDsX6{7kpDfpMKy80Z^_w7i=z_`@^b~sXHYW zrA1;<_42z3QEv(xztx$=IBrdM-u2J>hf0KP6Hj>f49>q=!`Rb#O1t)!Zb4O{L1+6= zPP)op2<|BM53kPV+dt_3kVReZ3w|Cs-g>&p7RZ95@p8O$rrWrELNYF8uzbwA-6F}> z;Lm~k@ZnN7X0;vN71R5ff8-Twwi?m%b*(8t+cLu59B+0qxZcc}m-4HmkHjn3NSp3x z|F}*?WDwt|q%m=d;=04&K=BDYDTQHquGJ5Zx43_=*W#I>$}`N+G)es}JaZ|bFGg9b z;GQIWyEXJArh@0q0&WEmH|vfnLrnhh&YZ9Ln=o1 z%fIkee}_-V1$+)sX7H}MZZQ#`_<`Wn2wRfUHehxuBKMg5=)s;C#nk40$?BU+R6FhY zc;IstSMTp1FpBwK{bDB{W?7skb+`BeNOGQa-cziM|&KL z$&ymPzbprg$Ze0)3CDY)WUlPG7-TOlaD)I1rTw^613$Te2hrx-AmFQ%z~# z&%}9!tDF?~ITM>Q!CeM`RUeAsVNU`ph39yE>4#1Vzp;GiP-n}^0{cdKFm0A48q^&2}3fwBf>X)*5H zHYK)@Z8^1f`)Kx$1SWck%*Bc7^i8CR7L+W5n`^i|JwseeZJMt2Oxu1Wu~?YN<3gY6 z8G#0^8|u@=BI@Z_{`QdWhNgE2C=|!u2aWEr(J$*iRv~SW$azL`e$8p9pTz~RGpx{O zA8J!bU}vUPf#TiFIj&coBktbWdtK2$DEPDIoMpGA`bh{Om&5t|Z_y_7c*dr!W>=(zQKMv6 zYWkaMcP9M%>#Ptq(iEX^TGLL9zqgLze$dCmZq=JDNB;2T&C@01=2a{urs2i2Q0_uY zrJLxd;&0ylu|ppRG$DswSdTq_-=*Oapt<=<>ALPSu(Y#nk>%}-`J~b6lxkLMNV#r4 zO(qx}Z4qref9dWBl2#90M53dY$k3XR4B{|e<}w9-pB`@F>1ARJI0n9SmQI9EuDDVA@8 z!CdmV_M;8Ds%M_Mg!ipnod(lD=03CL*G`1nFh8%-{k@*r_i=cTxIYs0UJ)#A&GoOv zN0Shq5pACJE9f|vqzG`?~<#T_?* zjhX6cz@!*=$NmIycxKZbxv%+w#FEj-Jf!bF@yB?@(fSC>Efm)dH1M#3DV6-djkG|Q z_#3xu!x1ibaHk~nj*yTBncwfg4`Nqw>m%jl7mzdESD}j90|UD%ua8KwA1xjiqd;^92@Q4f%kFClr;+p8`84vnUeAaDz! zJpWb$6D@$%H@)4FCUB|-Zw>#zOPAX0qOxOV;(L%1ymX}CNbBAKv=h48YMMJb7)CRE zVsw|t=KV?SC#!Hr_MAgY@9>s_^({KB0*whO6@&M{X(FO$lG9~K8;c^+!?;s3cs3f-%v0 zQcDCjQ&5rQQK3`dOH7|TwblI8m*r2a+-N3COWHK}yH^`|m`-$3pl#@+*+qNCUzg&(FXq~%A>ZV*G)5MXl>mwST`vhWN&MDhL|c0d4ZO3h zFI6oECG%ADD>AIbBx2Qld^^Ib<9g31!uiYTYm~+iUVq(QuL0Ewkm6RyPiGw0LKg;l zl-zOPO4$o~OSxhd++m;KIq)jE+e^F83Q9UtI38i8 z!aWpZfEGS3Gd7o2K?KkUa8`v9Xf@ZVCKiZxMriMX0o+{VJ^W@T5?`DS@AiHmkEbcZ zZtx0FW*$w)l#uZVaH=qL`|jLfJzMK~egtjZapXa^g79F1VpI{bWd=(&9qqDoT#que z@h|MM2zvQY?Du0N5`md!xrhKOj+puc4Iss~J+T8UMsv`7BIxJHI&GysO_wMo8aOj# zM6n4)!7F6Nqzsmlh_;z(B!JVVhIF=0P9!^J^iO3!u%xh)`!(+QHQDCpx(Sm`$U-aZJkTC~}tQn(% zIOnM~Mm*GR60SRxJ<4@*&#kifr`VU7b?(2-B_5P){ql!Fse3pje=wL z?sSh5Ev*@O+Ei3xTR0f%CV#YURwAu9kJvS(7r7ZzQwDkuq(HeDLI13imd&E;c_8CJ z{Y%mnhNwT;EbM4xU9S)Q2BB)-qvj6si8yoX(YePTE`4iYsT^o!={l&9fU^cW z4DPoD1z}C8OYapdms|~*YXwa!szRKkaPC%-at#c;!$+2%zH)w3P>PkcFkC^|7)~{K zbU)C97WtE8{o4&%koPAiPNMDy1a1v(t}`k|q#csNAF3UuV0OusY0NLJ89(%-_3fnX z*UjR%2SvmEmc=1G2So+4wPoJD%mGO;QtAqi*;h(5?aeP<`}~FLTQTUATU-1|^|R?E z{;1rEjgZ7(5qGRc>0E5AFyUC5PplhnqeO}*2)mwJ!fH(qG0>mgNJ8b~;9AXf#TvSW zK?IEc@!>LQUev$Gf-V%J`O0KN{LQ@(nXU2S+LX5E3ACP|L2Vd)sf@jdUj)F;U=UzG zo?RKWK0*(*KE-l;*y$IkUSnMxOT(X{gUK4HG))VzWSIE#ntQs`EC_nm=UIwX*{>J?&`GfMcb#yq@)U^&$VSkpjk<7`S0^J_~8lG5T;b~GFK;E^GtDh zDiF^Ssd#RicpeZAjXn>pg+quM#qioxco(^^SQ--0vY{&PF|TalQCV&QGDxsp8=34D0zg{1x7hP^e>IT{Fqql%OnGI znyNJoo697XORm3Srzdud6n8tG;r2r3XFl92VqtQwI)kQmCm%{{Fvd2ryXpm^#N!&h z!{=F-NcJsFgqc7)+z#=YX5Ht75VRK32X;Qw5YUsD!2^Ly`4apsX}zx$UU&&un&YKr6ui-U zd8sOgm;;5bR+W-;#}bsswYh@7uTdO(cs)we)OwueZ%A2LHF0O}ef_y~?90O&uN#LoifJIhNDbXDvKK+~J1e+7Lj3H?2VcQ9h{T$O zb199(HlH847>4j#dVDwrW){D8#@;gbiX+(iQX#I)4SlaTi{CVeMD;1F2WyaVRT(Q` z46m2y;gM%*RiZbvUnfxsRggE>UqUWUnC!J+R?^sYc7XKYuXXvVpXz?`7Sf+ z5O`+RHDr7<$e4=Lp5?>%_U1Cy0nJ>(Z8S+K?+Kv*-)Gh1rM_$C10*V1ORxj`GEE8@ z9mjb&v>TthdUgg;$60n462~&Mq5RHT2;NZbNS_bia2Hlskx`vJ{L!Ag*%wS#4n<=3 zTOnr-fQk~sYYF~S>HAAjW?p@;b3@An`hMxsnPk6fGgI_p%t?8WW{M-Pbs}o-8S@qn`FW?VWtCfvrc=)UN5AN}QZ54)veL%u?6bhG-d z0zF->X=QVx=t#Pb-5c!fShxVkk_2|y@j?rA^Xc8exmPY3xjGUoy0hcO_d=8Ajq{oq zi)1(Ywy9y77~NN41sjR8lZd-s1-k59MZR|lQMzPQVj_H@3$@5At+>Se$!3KbS2Obf zwjy$;x}|EC+m8M{gX`Y4F&%1hgsJw!VIsDz8>5XQIde4WzkD0JX0q1Qssv&s{p|Gi z0Bvp&RcKRMSVDeO3-#pT(a9-{0;gSe%2<3-U;lt6gIp_x-OAeEmu|&g^u;|6m)VnZ z9fzS%f%TKT%Zx^(jvVD+S0)d{;TAvJ&mhl@9+wqV9W{^o23PW*lfHAO1C{qL zs$B^uvvJjd77*l4IzbnEF3gslLzjmfrGH(EO`9xMLLSgVnKN07%nBsl#`=x zpsU}q^SAA?RqaFRacwgd84}4hUpv-sBPG-)X^5KRbDdr!qRAmF_PafN2C~O}v@~0g zb%=}xSf{9yd?b$>FtREThNMcL`&;PRug0CXdMa%``4r#;~l(%|XPRxv3H>I$N z%KZdGiG+4QmvH-+d*wHe+gN`jJ=9~CH^N)*2dl~%dke?-Hn!1Tuy8GB0I8k5O~L$* z)$fz7bk)I0$ou%zxC$o*Ii6e^AZBq`>WytMpt-gRhLHXhwept(uGzYiZK}(XF0SI& zt&T`BZpxr%enNU#hArdGVJ%21aSP^&jjQYe_3&(&H7;O@Rq{m^=N~%bnhrxZ_ z@ThWjf`iN(r@-3(&({=ES19sMO}ulda-nMTNOQ*r$5h;3#}$C&u5C+#go;vVsb zpjbk5Gh53KF^20N8hwLdOdZ!s>Vr|j7hePJ=EsQ%XcF{K1o9(`_wb8rKj7v+0p_)K z?O^rvnB(PD=e)S(AL)DrZQQv>KQ5mhcObFlL6#Hbh-lA~_v#LlMe>c+xPyMLls1#3 zxVQjCs-5&g`Ks#X#-)_+qQ&M>CmqfaD`g1i@?QHr-g^fZclAMK&1!T z*R-9)e)V>yHaN$2iM0?_vr{9j3Puv24kCnxA1dGGA8p($n8Ux*;_epznoH;dkeo;sl# zJ8q4uIiU-$lD9J)O9^@{ypq@-j0g;lOLHa3$A!`^A3Qj+G*F@^vPZF(C<9U5No)b? zI{@?y6q8hiY*;V{R6!M-yI~KG;Eqq6?_uOlv!Z-X~?23hIYe9VO8aF z!c$#P)IpJ5(zAAHO^&P%-vq;(N}1h~SLE$R^6cib4*{7K2iwfls(fnpa6f0$J$K@9 z=aF#QWlPyh3g!2=D=!E%^Gp@~;8DvuC0bqLI13uPti_1>e)|jMP=83c2u@rt^0c&$6YLm?>?QAJqm3@R#xj!v=A< zUkG#$f|ocV0b-UXM2vvRY}_mH^K=*sAQSuUAZMfhn{WcK?x?JY2Y!7mJ9P+QXZmc#f>K`e9)XXQhVA|`m zRUo{V!)eKz6_Tf7PmEZwrJMMn0HLP!g#d?YOna-~BgV`o zJpa$)-8owgwPS;=t~D~%usj?)&;jZJt{U9BDYoj8ycqVA{Y-tFU5nf=V<4nD zXcqTQV*`ppB0`h3oZ}Egrx;%}E&xG-7lvN{Ekk?X&542!)p>3!HG7S~9;|!3l0d&g zRi=vX@j(mQ=`0WDP#)T6XCs)Q*xcEeprb-}%d zl{2!`HvOCyHLNh)S|{#BH2T4@Oyx=2$3SgWr)!Vvo*>Ft=|^YZUcf2&ANN?Y;+2Ky zUgOR3XC}uucv+;prSQKRU>;V~5uFt&f&@$+va!+N`@m_2tg-RwG1x@9pRaPVG{|ki zw10Jew|w`k{$04yE@)BzMHLrelI-!ozNZFRu0nl(Kt7;pKy{Mt%gGhW^%{b77V*J?txm`ScS7DE|^yG3{O62lPBB z)iYLlY-BAa8C$>lK6kWEbHh&R9GnC|BTz{9u^JhN(r{8LYHU{y@KmtZvDx)+NAb=9 z`|}(pEMKGTfG66k=~?{KfjIaPVqygLNYNro&WxY^Cg9IAN8uX zy-&J5k~p5_a)eX=CL2vl&=pnX0+GDNDf++-%AMj#T`V57zgEEugr&tKqK(XWRC;hg zN5n@tRd)-PRK@|sdv+ALlzIdQX`;imXxyGc&R2;-5#Cetu#Y*@09$6!CPZBp0JywR zu+`ttn&m0{1DH3ENuQjSL!7L-_NsS0TJON4q}nRwBRdl+BW%6;56v*oB0UxVe&Y5| z@#|rWP!oj;6bLc-xL{DF0wjOCe&8pJ+09*%v)}%LWzJ*52J`hT?Za0menaVZ)lQYfSw3ykDo`tmkimR zCkeJy_|39`0c>spgYBb$=eY}xc4b(Cv-a@NMFdEp%-ko5riw{ZI63vf3ALlLy=M8& zcGFA3$|@7Ph)&sB>c6l&>@REJdi!?h}@(429Jwtf*m=)OA3eQHa)ok zb$%P2OXDZO9u82+cCrIG;}H_T3K*HXsty_5U+18#y#J814L*q=wiOCJ#P+npzW(#y{}2jF{dB!dh2nr)D_d=Z*4Yck3Jk2BM ztsYJ>V|D3l^Ew!GD!pMGHqP7z?r45|!R{qLL}oJFZh>j3yl^?>axE<}FbQz{-qj1D z?d}QQ({#)ZCw@`5sd$i`y8m?!lV1IX23L7MojtDk61@mP3K;g`OzMFC$!SX%zDR1j z=_4S%pCUD%{!%ElUkGC2*`3=L5#M2`w4X$(b1BKn!jrWvLUsGtWq}adW^$q)4?gs( zKw!P)Z)UHgNQz6!Yt-MP8Q^zh=$RR^ss5P606X@!$|*AR=qosisciS5b4q z*4LDEA*jxS`+I1w_Z)T(-^=1&KAi2Z2iIjDTa?9wJy$-1m?g}P`2m(IC;WKIVotX8 z0fiF9IiAjEmcJ~c?Z-!8{)o|)Lo}D&uk5`Hauurlz56&Ke70LxN zL?rSPOpYOaZc_#~841UsJpdqJsvuE5oJTxURYvF$6@U;SHz(!X=4V3PtAq6Rj@^pkrXOLVFb~ms zIZ}bi1oj#rPnoUC{>wU8=MpH34~%#NGwY^u$yA*SXV@DGK3csvK#y1p|CXDviUj0s zXEK5Z<7en&YVX>iu~)~;tHbhyv+W)VdyAuh7xlZj!gt(DID=;2{h)hS&mnB)mr*jo z4(E@kuSIc*xB^6-bejlKfrymVo}9hX{vowILws?ts?|S7iXnRuRjaSDqi;Qn4Vq>j z*;jlgrls#;0;{=%xh`!`0B}C)UY)Zo;1h|t(|QVeCW7`IdABj=$oZHa&BjB(nfD5O zv4Q%>eY4?9l;v?10413TNj#F6?M8Jmc&a`XAZ3PS@RIGN>4!Hvap@#cXx}87u3HHW za^XS7#MV#q#O3DotWXr|D5wo$T?cvvdp0HZ_>ki45_U12dKjw&<-JIx%HF^_Oo0Oi zQpO-`bI=<@)`wlnta(u!Kow7}nZg0yRwo-$bW>&!D)@AUM|UVF!aE%Ytv2HCTY<(x z`oM;q(6QDf<0mg~s&dP1;WthF)u!;&@gq9OkQ(Js;~tpwOG~5j5)sEF!2TW?`RLCE zcJ=d$r|e8b)btXC@m%hM1j4EC0-B4lZS1qTmr2!ni<_S;C5|e{bjuz3 zaT9lqQRVAg+7^XO#Rz90qyTMuEs|=+^;PxZTJht7C2-q(NOsU2ZVV(AZ_12p?Ba+8XH z@z>z4gp?3Y>=n$sq&1fY5|Nbw^hu zQ!-~JL*^m#JY}c|70DPGGGz*xBTAVwC6u|MGABdPAisTX>5aTUKi|*q|2*Hn=h@D= z>+G}lT5GSf_u8+$&OX8JtZU<+*@n{J9Gqqnr8E+19+1zRiHDyxzgw`7JyCX~`>hzI zbY8>z&wC3#4aj11j`Au@{gn1V_5HkA@%`}YBk|_K9NUNw?NzW7K@lj_CP9@{ z6c4}C|EML1z1QHSay5Bi?VN(h0Y%Cy2XseiJh-`vKNSa6F^I67!z{@6QT#Yu`k}rv zgnq3H!hRA;glYaSGCB~T8heP$)rUz8BCpq`>HX{cCF`fz4OCq#+Q zmgR+?#<%)~#eD3T!`-r2$ws2k=X7x+ot`)5#D{hCO1DuSv}MAMl!w4>Ql3nNLO3BS z6|j=0vUh$uCWjYK4f!7z5b3hL&w2C}vXYS2XTDi6+P>QC!SOcwl($T9mlgS2w)Kh= z%KGfl1$1vUQb@vEN2(|9g!)K#q$d;U_IB($zsoZ6!=>3v0^`@|u^lb>r{1?OrN5$j zWbJX}l~?eW(_QZRChk zSxU*mp3Qz?2}@ov{*wV$Er^h}e zE4Sw?uG#P*<&+tWY=o>YUgY--Wqn!Oc2ThMg3<))0v0j&Nu>XSLuAV+W1M=W;oNCtvOTqoaBO0#h;N z%E!YZ@37Oob%KuSeugDoJa(K!`{@N1D5_)A{*WR<;y3Q*_hHHDxyU zrm>&*;M1xckuNNXhn=|6m0}GDag|=V_qBL&AtwyG8Uv?Xb1#}!zbap%wSH6i<=k81 z6TWLV4t%Q|5pVpc&$f-$Htsp|pS8Am06>F&5twWBH2va5f>D9TO%f`zYlVkikQy0T zDI~U2Gc!|rhCb<(c-N@+@_NF`?G}Uihoba{Nh>aKtL`zp;?qwm;BX*rRk-cKC&RP2 zsDmm97-Rp^C+TLRxRVpLGY5N&Z(DPJyAs$Lej3fJt9(x3xk4V*QI&qbEOPnM{He~_ z5`ofL8!!u*&EbwwfhFq|?~V)8R%9?`T9SS*(6A(tTN0EUxR7>XfAQCBRvLq}#EaZ} ziPKLWzdv4{5~>|^$IUIJJS_Df&momH3<@pB_Kub_vH!&by_KKIKC3?n?`o*0Y@;q{ zL!O=Vgc!`Gju43{Jp(@j$7(-EqfnY~1mX-Fg-|^$^bQO+#7LJ)qf0oW*w9@O#v~k1 z4mv+DI_pv^0xLd~kJGm%P!gv8ybUMN&OSTg1c5?tVnyc6!!Ri!ifJ(-MiQe{KA&Wd z(=mgO#pF*p2C<$Mk336rE2LI|qA1#7RQ8mF82MwypiyLfCu5LAM_|Uu#LrAr@t#)( zPT5bmJ9bppA+O_hGd7%cyxSfBMZfP|A~82rhh6mib;&9@4SFYy6eq>`+~Ur#R~IwO zY)iUt&aj3BD#&qi#rdi8u9foW@lFiL(B41&?qZY@>MftRRHRAUooLl%cv<+8Q}In% zx92VWi8%iF{*PI+iWew#xZ+jc^CXQUPH^We>MQ$xEIHKmE-h2@d*bTI&DaIDvcc5e zNo`Km_^{rrhzFu;*Hh+y5{BQ=#c!9i*&9MYdnD~ddq^B&llH{a6zqwFNCrE39-Pel zq~x5OGxBlRU+;FCMlP8kVYyIr97PVN_*7&FQqk|Tv%#q9LXGWt%MYv{1u%D4bezvs zUFmb~N-!x>VQCR;F4fRU)f!Hhnh!ckOG&{0<|5JCM=WdejM-0K-4AlE^D*0PB;R9y zvQesw>9no{wek0x^b;9p3T@xc9ffK4+zU!|H3``lOThCeZ(r!G?EX8!fiaP}hhEHI z&-kSG#30o8jGo@$9#4zsRQ)42!>Ez7T})28)HdQ`lj*96GF2u@CCdx*!w9v-E>P@? z=HX{jmYtH^MjRjHZjC##zfB&LAQxJ4DvVXJUB1Pmb@LO^@n^dTYgR`h!#aK5@Lks* zoKfWd)McH;LYx2Su*vFWaa)Dk`c21zW$3c2kCOPklAv|EpwqBymM-m4y6Yu7ZLbw4 z6$Q=Hj#>DEXQNmD2z}{?C26a4>BBwY)M7`A8{Q|<-_QDSuf2#RnUc%Lq4Y*{TU&M@ zeUH0$c6q1ip&pOq@85px5+F!r+U9Y9cDC9{g9;&$n;KNzguiM6;YD>C$1nsX&1)js=L=A(x^c3mROJS(Yu?PQvQdDw;E~oG&D85PU5!40S_fQz5@DoWb>>RwpgSD zX6wmGJK9Jfy{DfsqTML{dQnV7gY)5RvPhz{Mz1EBRj*w-7X6acHSJ}6Rok1q@h|RJ zDZzy|*;Sst6w?a#pH5`@@Led7JkqwLc-%vdz2?(hT51bQBDMIWn=v9{CcYIX*HX-n zt$c6kTwEomKdR5WjsAA(?c+8NYD!@eG_^2b4ApEZXQZF6xq81?JD1n9zou4scPN9* zr6u%v1^CAY2zr|{Jh!6bYBk~da-}svVi{xzVpWm5_Ra_n6J$^8=4b z9jL?>Jp(551BtG^oEMJca9SVH!<04!`M!}nk}xx zwn~bn(h^`)6dw@ zhl?lgS5%W`*pj?!rnU$jPM6+`Xsye0)#frJ-5$39t&B0NXf@x;2J0Btc`J;|G4g!c zLl*nJqtlu0P>Ilw%%;6_zWcG`tE}VabDw34J|?!;*P6ZGA87HJ=i`Ojhg1!Q&HP`O z+P}2%r~i_Bzw}<_`@q2t1LU1OA9Gk{SBY|5L;|;wbjRbj&=wHj%tLA^Arj!6lfUb@ zFpKSM&20T?$B~#JiIJpT;OgM__GTDPUKzot`<%x1S zKhP}?_r{h;q2jD?e&k5rT;@aF3YY{(UfQZVLv_e+`|Ml^wSo^9>A{|77`-ZoIX6)r zpm-8bdyS1kUTN=IzVou$(3}{HLt03*>!*UR@0VIT`Ky)1!lkQfzFxI)x+_8^?Re_^ z!c|w}hT>+ajNUzHF+!U%f`Sq6uUIQtSEhg&+R!mnCX3YC%Lh%X7Qy9RE33RHre^d*y)tY0AlB&BN2`CT^iK3zbo@DZY=4HcE4$=20c4qEZd`E5^S7EjYYOD_%OA=r*N@3WA){AMsh_e&Ho~(*E zSdm*YVs?gtZA!A8I7%Qft1B)9mz-@R@4;0T!K{CxH9r__dKTT(TI1)6 zPA|{xdYRo)tlJEeyTaPxo9+`$7MA_Y>lpo0%BWQ8&sTcy?2V}mO3Qg4`Qy;QZa7i- zb+<_h`HQ&(PhRt8`99vo5oVyiO=IqKbQeNz_Emu=1KGN?i>3rA&3%%oqNXm7wH(H; z@}&+0{K18s>bXa_+3pU#vRZBko_sA@C%>XgNur=JS*+Jfdz4>pU0*fh)N zx5PfRl;(RUR4-b8X>M?Z>G0QkZ7n6lje`BlOjKS!89DQTg)=o6IFkWJK#BNn9_;oyw-Sbg~%z&81V5uHuthHyFlU3e$Yr zO=DkSU_N$S^1OCH8r-ANOCTI!XD)4HYyz8jf)3?>@QGlX}4jpuzzD4)<~ zn+E&YJjt4cpt@TyDbHP@O7Ah%qF+*3og|0QTb8-nPS-L0H2$;4Eks`Xaj#g~Ol6rB zCZF;>`;x|{`fcKaPF3KZ9OJxzarbs!s7cVJY{@x&n!dY=OgX)oPN6S$CE;qqi=Ng` zuj7`P{MU9NM=$K!rcrk4P$7jjn;u$C!5Ns|;A3^iiygNf`zE^rURvk7f#4a*EAbe;T#vYpfw{A7DnX~k9$-1KZcojnsG zp2l$}2n(r{c^Ev2qX_mEzCGs|t$exmI5T2|I_l;@Dvl=!3fGiQM~lh*IQIT?Mhwc; zkL#GrS0Cpby7TERB=j(y%0A+ZV?2jBXvIQL7dzKrwL(TBv?H4=Ik}jqhPjHAN^8f4 zVoC$!Z%Gn;&w|O^4@nt!+P3JTds8Zo^6aq{$+R3 zy_Dry=6NK3Id;ZVeDf4fH4Ps$?Guks$oHtxeB>{w4v*VLmW^K8e{#bRsLc}*epOr~ zp#(|mIK8)|OZQw+>&@l0NwR0VE?<#?iSRp}X;h(#JvOq?tXcYYF8;t1k0+_GpSdwJ z;Hc+*DXtu(M8uwSut*=q(%?7Q z%ARDb$$p;VyS~EUD;L_1gQ(*Sd7`*XS?$EumIm@;#H-cqwK5t9^F*m=93Kx#ttQUA z!;ZYDENNI;F?1=ehSTfJe<)*)P%2x&3XZObjZJ_3L71JX$FPk8ckDc3HyeXegwlRV zR;tU(iD``R)J4J@i&pxRs}=5_zK&j6Qec(Jsv|rkJ9rf{T8A9)#L~+!?4Aa z>(dqI>rOi88){Z&?#5}U)%P%t|Z^>vHwAEN1)OW=B}!NYW0IGR#}@n&&9X;5~iNu0W-)%8&= zvAJu8vtM^T`EvaGHZt$jjT8cVpKo-}#coLKClmrWhF6d{6_2~5&Pa(Sa5v5=Bn%rq zC%G=fASvaLeSZJ#OZ%FxWh!L9{KRuLRDOSRywU#5j2DM2Z+e>u9~e4Z%G@zpH2IDC zVWgJt^AD%0IIS+p&Zt`t#X8Z}6QYTxc&7BztEnnea2e}Lb7_deY)?o+Hu5T~h z6^N0%*ueQI{(_sL0Z&+|;q?t7@ET8v1~S1~B*l!~TADDN6w^Q-&F|1LFh@mVtS zSLVdoPsdB_-*TUKXX|pNNA#4SnhucA${ZH;lDX?RTJqAP7e&)!L9QITt3X-&`hEf< zHbdQjnF48?!i(_C6o=}jWy+HT>f5cdZtNl?ja|&~8~B6W@y{D;xv7Iq@xgBSR>scI z-u*5xq2D|C%h-c`>7lLpMMcR3rL8S2%%P3*!7lfDFyM#?f{pY|!3P0QFhNrXJ3C{T zpp}=SmAO3(bTWe8=FSca++zXGKwVZaL2GaZGT6WbZDE37DrpaD zA`^538|Q=Tpbj96D@@Q0%uK0fFEazPA3 zSNNex1@y52OBc{|zqsCkyjxiXpKSnNiLf@6u(z}|hrz)Y6O29a3<7naK*OoKn%ikX z`uz3%14x1mDihTC!x(6Qbvf1tcs&>f4*&lmk^Q&jAccfsDA0Z=5RM`YIz0>$Lxw}c zVOTIzM1apeAOWBYB{bj@x(?+>0yF`C1na&a|9?tk>(`MWFO;A%))N|d8A5PK0m3Md zKtVWR7#0hDgC`9QD#tup&_mS z=g{qt8LT(g`Vll4**YWm5>TMW0%GIYhwR`_`A{xMCcH6$lAzyzN`aVy!^!a1eiwkl z;9%*#G z5bz4wz%~g7I%m9HfB^!tA+6iQ`VmqJXm>LF5jx+H@NNC;I+W*6g6slnRp@B&r*qio zmr29$0cC2?C;_~Es5=BB1yCpc%orvFVFiF@0>ejZfHPAVXk$Pl`#nG*es!W?Fab@D z&-<&R#4p%_{1z}^0(d%pltMrr5=4duE)aZ#FUbmq_+8`g(GK*v_*~X7{Bi)uZv#x| z7tIzLC-GP9fU*BNvj>k8bVeo!UOD+)12j&84gsIj5e8Zaf94DxpkHS$z?6QUfpG@) zTd3dT@9!F1VW{6VKm#rqmGNb`!2qm|Kl1|p+OISG*bLV8Ao4#QF?il~w#bRv5?h3h zl8EJC1(3NHSvc(IrSTlElH5mY<>I$$j$W3GfWcf8nGl!RU7med279Ef`6r`44(Cc` zT}YOUi%;WO3}HHvX4|S(#BTGfXMq|OWO?`64H5AhQ@m0J4HxsBG4{t)nu2c z*c7Fwym#6V@;gPFJW30Ngj?R~#`8m9K zDvA)8dzaZNK3RD0=-s2#j`P)Il`OYxwXO_gEAF3SBo;4oc-@4QkaZZ7PEmVYYQm7+ z>7!S||Lqlf7{;(VD#e*s2iIxDP3O+&J^bv}56co+sT+k9w|MomkDaR2{KiDDYcJ*O z-g73$<7JvhImRXYilLV&ui4qqjuz(G42qo3vj>W`9!G z8RFKE1awrZ6Ndze^qd{hep~5XGQKliSCk+AJoh>B@F8y)>>|gt_&nRb#4k-kJlL5+ zaiMCdwIk;$#8RZ64q*#?#jyKU1oBE_+!J+nF>B9?s@xVM8QWuC#;4WCM3;Mc@wUrF zgV^u8M=-}}mEDG}Ts!054U4LL9fFWsjmNB>Z_X}AR<4LDH0NOQDj2C7Ww9{6t;2`CY4{A570FpQsKL?%n8d{XFUnZh-pnQK_A-C|$VTiPHu8zDx%);mgRiV|mYZ<-!1=DlQ!6a0cS*j4w216C6r35m zU~4&WEq0Llbo2MAmK909cM`}abg===*t{E~%Zh#bIxdp1P*Cy-Mu;taP=6X;KvYu7 z=I$a+^ZE4s9uDtG3N^Oo*p;#h47Jn6=F#sx0gt`S`qIsn`@1`NHA70}VWmZd7N1V- zwhIb-7yZBtk)6PD=NyON445@IweOnFTzq@vQ~%QR*Ppwr`EM<6)1Vvu`Tx|QkRP#e zs>2^G7cPy%KdtBPa3Bv1j^}6<=FUByWfacTc#6eHQ8|8La#=Ynj%m`xAbfwArql$_ z&ZlGyKKI{W;2rk*M*e{(%SQ$dKOxM+nGAD#Ozc0a%v>I!RrmC)Ns)(h6uFS{!l>gT zRY!f2<)W94ijPyYR+Q^mT3bF(>Byzr91k5HU8c>8d8{IROuE;1+=JqH(6^hUswzv! zOKSFKwJ&!c)usv$HMpiYUaR6fx$I)f@$(@S{gDy1+MeU8@++m+P(+SiDI6-ND{U(W zB1KZG_-iAyy|U{+SqT;;``7q5y+|u->&F(4GIQt1J4H6926C3{D(OBcSd%WKFkh9J z8PcQvj-ya>kvXe}y;MmmlGlSbysEhO?n7AP?z}~_Qkj8!MGE<$MNjIjuN~x*zW;om zsulCnEj!jD1L_=VD(|K~Ed?LAV?vTbv!K3epyxYmsY>1yT--(ZmFa_2N35M=4fiGO zCNUvB6V<}!Kc6r34`9RJ1Z1}!`WYtJe#O`qF~}B%^{spSVn8tAfs&cg8H-fK@&goX zBi-ebA@AyR&k7NWk1{`rIrlb<=Gupdi}fGN1FydE+4rW06B(4Be3Br8X#ahp3b7-# zB~8{U&3h})V))MzwkTDxW_e!E!}U%lO26)1%)K|VCvGC3{A2n|u9dT7<{R{qZpM+? zMD0KZ9WU0^)S_43$$DQnvhF^gl*m;X0dJpWPsqwx%l?QMV@$i#Kv~-7U`-_blIXx! z+M3-bZ=_z_z51FZZgj2(t@;_G`)#J-&Kt86=yK1Vf=JuIvxKRSoJQ`51*(w~1dg6C z8*LMmyxPrucHc8qHzo5~?aOTFK7;q zxOsr!mYAsRM?uNua!KhnzAIOPS$tA#ERJB-eo`KeIOM<0Be2mq_)m`jdUy7 z`NOHO!S8t}pE1`S+zdUf`J3zRG0Tgp`Z$Z$ zQERCaUhSM|^4!}+z2IYaqC3a@N?D@Z$${h_XV`7Du7=(TE#fP`8uP-|mHg>99tn@U z=oD^Q9v<=bJzaheZzM6)tEWo)vOg4@ZXv#kYR%DQ67}e-?@qXRhjz)Y0~VRnBlK38 zTF%bMkX*?_e?@Ace8RbzMXY>K#Cb+Orq$k&!|%hy-0 z&gFK%hAERfxV-Bm%deho&JpoF*3FleQ4v`blaFF;Ibl#j|1l=allc0`U7ojQQBt3c z_kR}~r6dp97uiOm-CbH}*g|%eit6RlGtU_fCG|BZQr~}jBWED!{a%}iUfZlbcHa1X z!nx#cKL^TfYu#hszo+xntV!z&xOL9sPC*YJQuuf-yVHkb?^oBZ_z{GxT{gW+ueSTx zNXGZ%GKxM@kw8`D`g!-9W)UgW2Y+JwfX^bAMANPW&`^H}^0iV=@*y9f>r{Iq-}w2C zn-CSt6}IY6wcT1p8gxqDwDHlpsCj=Uk^FaOKNgu^;8W_IQ+m%sGOaPGPyw(0)~!lD z!cOPWupo`%xhm5h#Z;YHhhp{m2NTyN!vKW09v z9-Ch1>5yckKe-@fDAqOH(|Z9h)KvoJG&=WM!~GMi zYEI75O&kEAC5ki<>y&wD008N7c`(v+RJP)2pZg`TilT9*d^UL2koS8_nb(18_uLYyrm7Ast7>jE~OsUkm;kJk&p?@}au% zXkZuSlB4b`Cimztts|y%=cFVChn|~0VQl^8+MCXdm;sO2BkBaF2D*#scB+ZvQj+v9 zj!+xEniCItbe(IPrh|OloirT^xX2rujz3DSm<8%7e8~jfkO*0cbb5H2zxJPw%VwlM zBfm@T(p2=mYj%$>=;YgJT0dSLGrjFI@Oa$mNt00FD5_1nud~TFKIKUZ`Z4S#gDGjK z`P-q+;-mIGcTbV()~PY^#HgMd6!JOS(Z%HAKWn|GuzC9UJq?%Sa@bcf>aW!9QO`;5 z==bRV_+F0V56@L0iL@25Z7v%8alyHKahbN_P*vDir>!H-BY@j1YNc4e`%7_knp2Am zP&<0#I~ zO<$m$UHM|AId^-2LEPV6)U5xdX50yZ$tqC|P3{Ro-RI4mRsmxiN{a2os2<}Nsn?2f z&!4z_=O!%Ev4Bxi>T2_0&Dc08`R7a(&%RQU8qleTs9|O$U&wwbu)f!_*BY6jtye{# z)~`)z`0!3rPRHH1bW`-V^U4Gcw5oAG=60);7}9U2427nMnyG(EciRoG+aKyg%iB7~bi+H%FZK@?hj$j?_)eFF3LmL- zIo!?vrCe~N{BXNTkQ;Bzp`7Cj4AjnFlp>$Bm(Zo^l$&-1bK(e37Ux#9F1k6aWW=c7 zbS>T!66^-6^q8V=Y&@h)$#`~v>$R4zpUGvtTje>vKmC$%tzS=+#1Q88`GwWCTx1_5 zy=HyQ+gJMwlcw@4focyXfa48o07;vr%ETcV@4z_Cx;at}4y8P`D{M)&=Sy8G^7bO9 z7LP`jmZ{u~&m~P_VtY)eqPvt-Y_WEZ`?Uzp?eft#K_MZJSeLD^t&X-~&LrlGk@A)q z=Gq#294M4e?oLn@_Aob%zRpu2%vK`(W)#*`#hpW|kx@i{yq`%Y+rRj;mtDuzH}s>` z23!n8yv!r4tr`_WI!isd>O!PHS@QR!j}!#f$A~(`Db*|`FjkW?k7@T795i`wpNM90 zCK5^UfFsmMC03VHmxc6{T>KH6E}t+;`nU+$852O{lX(pCsSDuBe`3$K3S=&N@s9220mGSxrILLhIu(z-^`{G zhI-%!UYS!8)#|=nOvU-0FBqP?%(nZ)A=V?uIcKKC9|R9wvapeTn(07(O0$qOM6)NS zzUgVU{=l8v!>?ybmvkF3e&2>QLKKcYt8tg?nYK&k_LEKW%AY`mS#)X0dC=FT(R)sn zVaD}kkIfW3o_}O{xOQ~jagX<@cmoG=WlmBtDsLC(SIjUaCR)|c-a7utul+^R2^F?6 z=#6m$|A6{Zc6Qcafnx)pkN%Aq`~kqBuj6h8^Z~3Vs0<)1Jk~A*2SBnNz|#>hJgg3` zxdR9ql<5fo7jVtl%He+ss{_=79|1fu0OA7#3YHq-y7exKvMEwP)uQ$)XLg^3;yi+J01wbD#V*Liw z@lruT=;1XCY5D&#k^Q�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 WV`o=<7mdV%E%L}XIb~E%k^LXduh1a? literal 0 HcmV?d00001 diff --git a/higher-order/higher-order-euler.tex b/higher-order/higher-order-euler.tex index 54653ba..1b0a70c 100644 --- a/higher-order/higher-order-euler.tex +++ b/higher-order/higher-order-euler.tex @@ -98,3 +98,116 @@ \subsection{Extensions} by maximising over the characteristic speed within the stencil at that point, is less diffusive but slightly more expensive. Roe-style flux splittings are possible but not always stable. + + +\section{Discontinuous Galerkin methods for the Euler equations} +\label{sec:dg_euler} + +The Discontinuous Galerkin methods introducted in section~\ref{sec:dg} extend to +nonlinear systems directly. For a nonlinear scalar conservation law, +% +\begin{equation} + q_t + f(q)_x = 0, +\end{equation} +% +the Discontinuous Galerkin method becomes +% +\begin{equation} + \label{eq:dg_nodal_scalar_nonlinear} + M \ddt{\bm{\hat{q}}} + S^T f (\bm{\hat{q}}) = -\left[ \bm{\psi F} \right]_{x_{j-1/2}}^{x_{j+1/2}}. +\end{equation} +% +This should be compared with equation~\eqref{eq:dg_nodal_final} +% +\begin{equation} + \tag{\ref{eq:dg_nodal_final}} + M \ddt{\bm{\hat{a}}} + S^T u \bm{\hat{a}} = -\left[ \bm{\psi F} \right]_{x_{j-1/2}}^{x_{j+1/2}} +\end{equation} +% +for the advection equation with advection speed $u$. The crucial change is that +the stiffness matrix $S$ is now multiplying the nonlinear flux term, and the +boundary flux on the right hand side now needs a nonlinear Riemann solver or an +appropriate approximation. The Lax-Friedrichs flux is often used here. Extending +to a system of nonlinear conservation laws means applying the above scheme +component-by-component, either directly to the conserved variables, or by +transforming to the characteristic variables. + +\begin{figure}[t] +\centering +% figure generated by hydro_examples/compressible/dg_euler.py +\includegraphics[width=0.8\linewidth]{dg_sod_32} +\caption[Discontinuous Galerkin methods applied to the Sod problem, low resolution] +{\label{fig:dg-euler-sod32} Various Discontinuous Galerkin methods, using moment +limiting, applied to the Sod problem with $N=32$. We see that the method +struggles near discontinuities, and that increasing $m$ alone does not improve +the results.\\ +\hydroexdoit{\href{https://github.com/zingale/hydro_examples/blob/master/compressible/dg_euler.py}{dg\_euler.py}}} +\end{figure} +% + +\begin{figure}[t] +\centering +% figure generated by hydro_examples/compressible/dg_euler.py +\includegraphics[width=0.8\linewidth]{dg_sod_128} +\caption[Discontinuous Galerkin methods applied to the Sod problem, high resolution] +{\label{fig:dg-euler-sod128} Various Discontinuous Galerkin methods, using moment +limiting, applied to the Sod problem with $N=128$. We see that the method +now has enough resolution to produce good results, but that increasing $m$ alone +still does not improve the results.\\ +\hydroexdoit{\href{https://github.com/zingale/hydro_examples/blob/master/compressible/dg_euler.py}{dg\_euler.py}}} +\end{figure} +% + +The strength of the Discontinuous Galerkin method is its high order accuracy and +minimal coupling to neighbouring cells. Its weakness is its behaviour near +discontinuities. As many tests of the Euler equations seen above focus on +results involving shocks, we will not see the DG methods at their best. For +example, in Figures~\ref{fig:dg-euler-sod32} and \ref{fig:dg-euler-sod128} the +Sod problem is solved. The DG method and limiting is applied directly to the +conserved variables. At low resolution the method struggles. There are so few +cells covering the shock and contact that it has difficulty clearly resolving +the jumps, although the oscillations are not large enough to be problematic. As +the resolution is increased the results are much improved, but in both cases it +is the increased resolution through the number of grid cells $N$ rather than the +number of modes $m$ that is important. The is in complete contrast with the +smooth solutions seen for the advection equation, where the larger gains were +seen by increasing $m$. + +\begin{figure}[t] +\centering +% figure generated by hydro_examples/compressible/dg_euler.py +\includegraphics[width=0.8\linewidth]{dg_shock_entropy_m3_N128} +\caption[Discontinuous Galerkin methods applied to the shock-entropy problem, low resolution] +{\label{fig:dg-euler-shockentropy-m3-N128} The shock-entropy interaction problem, +solve using Discontinuous Galerkin methods with moment limiting, with $m=3$ and +$N=128$. We see that the method is excellent at resolving the smooth features to +the right, which have not interacted with the shock. The finer features just +after the shock are not well captured. Modifying $m$ has little effect here. The +reference solution uses a WENO method with $r=4$ and $N=1024$.\\ +\hydroexdoit{\href{https://github.com/zingale/hydro_examples/blob/master/compressible/dg_euler.py}{dg\_euler.py}}} +\end{figure} +% + +\begin{figure}[t] +\centering +% figure generated by hydro_examples/compressible/dg_euler.py +\includegraphics[width=0.8\linewidth]{dg_shock_entropy_m3_N256} +\caption[Discontinuous Galerkin methods applied to the shock-entropy problem, high resolution] +{\label{fig:dg-euler-shockentropy-m3-N256} The shock-entropy interaction problem, +solve using Discontinuous Galerkin methods with moment limiting, with $m=3$ and +$N=256$. The results are similar to Figure~\ref{fig:dg-euler-shockentropy-m1-N128} +but there is now sufficient resolution to capture the finer features after the +shock.\\ +\hydroexdoit{\href{https://github.com/zingale/hydro_examples/blob/master/compressible/dg_euler.py}{dg\_euler.py}}} +\end{figure} +% + +A test that better captures the advantages as well as the disadvantages of these +methods is the shock-entropy interaction test. A right-going shock interacts +with an entropy wave, with the final results showing both smooth features (that +should be captured well by high order schemes) and shocks (which are more +problematic). Results are shown in Figures~\ref{fig:dg-euler-shockentropy-m3-N128} +and \ref{fig:dg-euler-shockentropy-m3-N256}. The smooth features are mostly +extremely well captured even at these low resolutions, \emph{except} immediately +after the shock. Here again varying $m$ has limited impact, and the crucial +thing is to increase $N$ until the features are resolvable. From 186492a82118cf28b2491af0bc0bca7b876a491c Mon Sep 17 00:00:00 2001 From: Ian Hawke Date: Fri, 8 Mar 2019 16:05:36 +0000 Subject: [PATCH 29/29] Typo in figure ref. --- higher-order/higher-order-euler.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/higher-order/higher-order-euler.tex b/higher-order/higher-order-euler.tex index 1b0a70c..a932522 100644 --- a/higher-order/higher-order-euler.tex +++ b/higher-order/higher-order-euler.tex @@ -195,7 +195,7 @@ \section{Discontinuous Galerkin methods for the Euler equations} \caption[Discontinuous Galerkin methods applied to the shock-entropy problem, high resolution] {\label{fig:dg-euler-shockentropy-m3-N256} The shock-entropy interaction problem, solve using Discontinuous Galerkin methods with moment limiting, with $m=3$ and -$N=256$. The results are similar to Figure~\ref{fig:dg-euler-shockentropy-m1-N128} +$N=256$. The results are similar to Figure~\ref{fig:dg-euler-shockentropy-m3-N128} but there is now sufficient resolution to capture the finer features after the shock.\\ \hydroexdoit{\href{https://github.com/zingale/hydro_examples/blob/master/compressible/dg_euler.py}{dg\_euler.py}}}