· 9 years ago · Nov 05, 2016, 11:50 AM
1{
2 "cells": [
3 {
4 "cell_type": "markdown",
5 "metadata": {},
6 "source": [
7 "# s48: WENO-based convected scheme part 1 - derivative treatment\n",
8 "\n",
9 "In this notebook, we survey shock-capturing methods and work towards developing a WENO prescription for high order convected scheme.\n",
10 "\n",
11 "## Motivation and background\n",
12 "\n",
13 "Vlasov simulations are challenged by inevitable unrestrained sharpening of the phase space fluid (so-called filamentation). For smooth regions, designed high order solvers are able to perform at their targetted order of accuracy; however, the fidelity is challenged in the presence of shocks or discontinuities (mathematical singularities, i.e. there exists no unique solution and the derivatives are therefore unbounded). In hyperbolic PDEs such as the split Vlasov problem, shock capturing methods have furnished significant success including MUSCL/flux or slope limiters (typically 2nd order; Van Leer 1979), TVD (Harten 1983), ENO (Harten 1987; Shu 1989) and WENO (Liu 1994; Jiang 1996). Since all monotone-preseving numerical solutions to PDEs can be at most first order (Godunov), all high order schemes are non-monotone preserving whose spurious side is spotlighted whenever an aliasing circumstance is forced on the method (e.g. near discontinuities). To remove these oscillations must invariably be two step: (1) we detect a discontinuity by some proxy function or measurement, then (2) we apply a strategem to remove the wiggles. As concerns (2), this involve flux/slope limiting (i.e. low order filtering), or being careful of which points are used as representatives (ENO or WENO). ENO/WENO are prescriptions developed for interpolation methods (e.g. finite volume or backward semi-Lagrangian methods) whose methods intrinsically rely on the estimation of the solution between integral grid points. Both methods acknowledge that a higher order interpolation of a large stencil can be equivalently represented as a convex combination of lower ordser interpolations each with small substencils (thus, the union of all substencils is the large stencil). Under this acknowledgement, an ENO method uses the large stencil for smooth regions or exactly one substencil (of possibly many whose union is the large stencil) in non-smooth regions. ENO then requires significant logic to be coded and can be cost-wise prohibitive for large grids. WENO sidesteps expense by trading the logic requirements for diagnostics that are used to construct nonlinear weights whose target aim is to autoselect the large stencil for smooth regions, and in non-smooth regions to weight the contribution from the smoother substencils far more than the substencils which contain the discontinuity. Note the tradeoff for removing the straightforward logic requirements of ENO to use the autoselection procedure of WENO is that we have made a compromise that substencils around the discontinuity are not completely nixed inasmuch as their contribution in the overall nonlinear combination of all substencils is significantly lowered (in ideal circumstances, the nonlinar weight would dynamically take on the value of zero in such a circumstance)\n",
14 "\n",
15 "Caution: a problem-dependent concern that can come up is that using shock-capturing methods may overcompensate and mistakenly treat truly high frequency structures as discontinuities. That is, the removal of spurious oscillations can remove physical oscillations whenever the solver falls victim to this confusion! If a problem turns out to suffer from this overcorrection, more intelligent discontinuity detectors should be considered (not discussed in this notebook)"
16 ]
17 },
18 {
19 "cell_type": "markdown",
20 "metadata": {},
21 "source": [
22 "# Where convected scheme fits in among semi-Lagrangian (SL) schemes\n",
23 "\n",
24 "As shown in notebook TN-12, high order convected scheme is equivalent to applying to forward SL (FSL) schemes that use high order interpolation polynomials with a monomial basis in the sense that the CS remap operator of any order from the Lagrangian grid to the Eulerian grid is identical to an interpolation operator from such an FSL scheme of the same order. The difference between CS and such FSL schemes is the means by which this operator is calculated. In the FSL scheme we design a high order interpolation operator to interpolate the values at the grid points themselves using the Lagrangian grid function data as the basis for the construction of the interpolant. In convected scheme, we achieve the same effect by adding correction terms to a linear interpolation operator (this defines CS); these corrective factors are proportional to derivatives of the grid function, and if unfolded into finite differences we can see the equivalence between the CS operator and the FSL interpolation operator of the same order directly. We make note that the derivatives are taken at the previous time, not the future time and that it is through the final step of establishing the correspondence of grid function values from foot-to-head of the characteristics that we see that the interpolation operator on the Lagrangian grid to the Eulerian grid of the FSL scheme is the same as the CS remap operator using the linear interpolation operator corrected with information from derivatives at the previous time, i.e. the information that is used in the differencing are carried forward along the characteristics so the derivatives effectively sample the Lagrangian grid points, which is what the interpolant in an FSL scheme does. Thus, a WENO-based approach for FSL schemes vs. CS will take on different perspectives given the means by which they achieve the same end. For an FSL scheme, the WENO treatment improves the interpolation procedure, whereas in CS the WENO treatment will improve the derivative estimates which constitute the correction terms on the CS interpolation operator. \n",
25 "\n",
26 "WENO as most often used and as first developed [Shu, 1996, 2009, etc.] is an interpolation procedure which acknowledges that wider stencils that produce higher order are a linear combination of smaller substencils (i.e. subinterpolants constitute a full interpolant of higher order). By dynamically assessing local smoothness, WENO is designed to approach the behavior of using the full stencil (all substencils) in smooth regions, while in regions where there exist local non-smooth regions WENO will decrease the contribution of any subinterpolant whose interval contains it. This decrease of contribution is calculated commensurately with the aforementioned measure of smoothness.\n",
27 "\n",
28 "A conventional FSL scheme that uses a high order interpolation operator fits this model problem. In this case, the interpolation operator that can be subdivided into subinterpolants, and applying WENO ideas is thus straightforward.\n",
29 "\n",
30 "In a CS scheme, we use a linear interpolation and obtain the same operator as FSL schemes by adding on contributions that are proportional to derivatives. Our \"interpolation operator\" is already as small as it can be (two grid points are required to construct a linear interpolant), there exist no concept of small substencils by which WENO ideas can be used to refine this initial estimate, thus the focus is solely on the improving the derivative calculations when challenged by regions containing shock or discontinuity. These derivatives, as mentioned, are what are added to the linear interpolation estimate to bring it to higher order anyway, so a WENO-based convected scheme naturally focuses on shock capturing in the derivatives, not on the interpolation. In particular, a WENO-based CS can be achieved by partitioning finite differences on the derivatives into substencils, and designing the relevant WENO weights that permit recovering the full scheme as a convex combination of each subscheme based on a measure of local smoothness."
31 ]
32 },
33 {
34 "cell_type": "markdown",
35 "metadata": {},
36 "source": [
37 "# Review and example of the WENO interpolation problem\n",
38 "\n",
39 "(note that our problem will be a differentiation problem; convected scheme requires high fidelity derivative computations to correct its first order interpolation, in contrast to other semi-Lagrangian methods whose order is intimately tied to the order of an interpolation operator, convected scheme's order is in turn tied to the accuracy of derivative estimations)\n",
40 "\n",
41 "## Example from Shu [1996] :: details\n",
42 "\n",
43 "We present the missing details in the motivating example from Shu's paper, using previously derived results when possible. The case considered is the convex combination of three stencils \n",
44 "\n",
45 "$$S_0 = \\{-2, -1, 0\\}, S_1 = \\{-1, 0, 1\\}, S_2 = \\{0, 1, 2\\}$$\n",
46 "\n",
47 "constructing interpolation polynomials using each of these stencils produces interpolation in smooth regions with truncation error $O(\\Delta x^3)$. We find these from the interpolation polynomial of order $s$ (odd) with stencil size $2S+1$, framed in s29 as (note that $s = 2S+1$ for $s$ odd which is the only case we consider here:\n",
48 "\n",
49 "$$p_{s-1} = p_{2S} = \\frac{1}{\\Delta x^{2S}} \\sum_{j = -S}^S f(x_j) \\frac{(-1)^{S+j}}{(S+j)!(S-j)!} \\prod_{\\substack{ k= -S \\\\ k \\neq j}}^S (x - x_k) + O(\\Delta x^{2S+1})$$\n",
50 "\n",
51 "or in terms of the natural index $m = S + j$, $m = 0, 1, \\ldots 2S$ we can write:\n",
52 "\n",
53 "$$p_{s-1} = p_{2S} = \\frac{1}{\\Delta x^{2S}} \\sum_{m = 0}^{2S} f(x_m) \\frac{(-1)^{m}}{m!(2S - m)!} \\prod_{\\substack{ k= 0 \\\\ k \\neq m}}^{2S} (x - x_k) + O(\\Delta x^{2S+1})$$\n"
54 ]
55 },
56 {
57 "cell_type": "markdown",
58 "metadata": {},
59 "source": [
60 "Note that as is custom, we subscript the interpolating polynomial by the degree $s-1$ (not the truncation error, $s$), and we call this an $s$th order interpolation polynomial. It is the case (see s29) that for odd $s$ the order $s$ is the size of the stencil. Thus, we choose $s = 3$ since we are interested in substencils $S_0, S_1, S_2$ whose cardinality is 3.\n",
61 "\n",
62 "In the latter form, we choose $s = 2S + 1 = 3$, thus $2S = 2$, we have the general third order interpolant given by:\n",
63 "\n",
64 "\n",
65 "$$p_{2}(x) = \\frac{1}{\\Delta x^{2}} \\sum_{m = 0}^{2} f(x_m) \\frac{(-1)^{m}}{m!(2 - m)!} \\prod_{\\substack{ k= 0 \\\\ k \\neq m}}^{2} (x - x_k) + O(\\Delta x^3)$$\n"
66 ]
67 },
68 {
69 "cell_type": "markdown",
70 "metadata": {},
71 "source": [
72 "We show how to obtain the weights here for all stencils $S_0, S_1, S_2$. \n",
73 "\n",
74 "Unfolding the notation above, we have the following interpolant which we now choose to represent an arbitrary grid point as $i$ and combine this with an auxillary index $j$ that labels the stencil $S_j$ ($S_0$ corresponds to $j = 0$, $S_2$ corresponds to $j = 1$, $S_3$ corresponds to $j = 2$\n",
75 "\n",
76 "$$p_{2}(x) = \\frac{1}{\\Delta x^{2}}\\left[ \\frac{1}{2}f_{i - j} (x - x_{i - j + 1}) (x - x_{i - j + 2}) - f_{i - j +1} (x - x_{i - j})(x-x_{i-j+2}) + \\frac{1}{2} f_{i-j+2} (x - x_{i-j})(x - x_{i-j+1})\\right]$$\n",
77 "\n",
78 "We show this for directness here, \n",
79 "\n",
80 "$j = 0$ corresponds to $S_0 = \\{0, 1, 2\\}$:\n",
81 "\n",
82 "$$p_{2}(x) = \\frac{1}{\\Delta x^{2}}\\left[ \\frac{1}{2}f_{i} (x - x_{i + 1}) (x - x_{i + 2}) - f_{i +1} (x - x_{i})(x-x_{i+2}) + \\frac{1}{2} f_{i+2} (x - x_{i})(x - x_{i+1})\\right]$$\n",
83 "\n",
84 "$j = 1$ corresponds to $S_1= \\{-1, 0, 1\\}$:\n",
85 "\n",
86 "$$p_{2}(x) = \\frac{1}{\\Delta x^{2}}\\left[ \\frac{1}{2}f_{i - 1} (x - x_{i}) (x - x_{i +1}) - f_{i} (x - x_{i - 1})(x-x_{i+1}) + \\frac{1}{2} f_{i+1} (x - x_{i-1})(x - x_{i})\\right]$$\n",
87 "\n",
88 "$j = 2$ corresponds to $S_2 = \\{-2, -1, 0\\}$:\n",
89 "\n",
90 "$$p_{2}(x) = \\frac{1}{\\Delta x^{2}}\\left[ \\frac{1}{2}f_{i - 2} (x - x_{i - 1}) (x - x_{i}) - f_{i - 1} (x - x_{i - 2})(x-x_{i}) + \\frac{1}{2} f_{i} (x - x_{i-2})(x - x_{i-1})\\right]$$\n"
91 ]
92 },
93 {
94 "cell_type": "markdown",
95 "metadata": {},
96 "source": [
97 "Suppose we want to interpolate the point $\\Delta x / 2$ from the left-most point, this is the point $x_{i+1/2}$, it is easy to show that (i.e. uniform mesh spacing $\\Delta x$ between integral grid points).\n",
98 "\n",
99 "$$p_2^{(0)}(x_{i+1/2}) = \\frac{3}{8}f_i + \\frac{3}{4}f_{i+1} - \\frac{1}{8}f_{i+2}$$\n",
100 "\n",
101 "$$p_2^{(1)}(x_{i+1/2}) = -\\frac{1}{8}f_{i-1} + \\frac{3}{4}f_i + \\frac{3}{8}f_{i+1}$$\n",
102 "\n",
103 "$$p_2^{(2)}(x_{i+1/2}) = \\frac{3}{8}f_{i-2} - \\frac{5}{4}f_{i-1} + \\frac{15}{8}f_{i}$$\n",
104 "\n",
105 "where we have invoked the uniform grid width $\\Delta x = x_k - x_{k-1}$, e.g. $x_{i+1/2} - x_{i-1} = \\Delta x ((i+1/2) - (i-1)) = \\frac{3}{2}\\Delta x$. Also, note that technically the third stencil is an extrapolation in this context.\n",
106 "\n",
107 "The union of all stencils $S = \\bigcup_j S_j = \\{-2, -1, 0, 1, 2\\}$ can be combined to give fifth order accuracy. The straightforward way of deriving this is from the interpolation polynomial itself where $s = 5$ ($S = 2$). Since we are after the central stencil, it is easy to just the centered indexing form shown above (index $j$), here we include a grid index $i$ for generality:\n",
108 "\n",
109 "$$p_{s-1} = p_{2S} = \\frac{1}{\\Delta x^{2S}} \\sum_{j = -S}^S f(x_{i+j}) \\frac{(-1)^{S+j}}{(S+j)!(S-j)!} \\prod_{\\substack{ k= -S \\\\ k \\neq j}}^S (x - x_{i+k}) + O(\\Delta x^{2S+1})$$"
110 ]
111 },
112 {
113 "cell_type": "markdown",
114 "metadata": {},
115 "source": [
116 "$$p_{4} = \\frac{1}{\\Delta x^{4}} \\sum_{j = -2}^2 f(x_{i+j}) \\frac{(-1)^{2+j}}{(2+j)!(2-j)!} \\prod_{\\substack{ k= -2 \\\\ k \\neq j}}^2 (x - x_{i+k}) + O(\\Delta x^{5})$$\n",
117 "\n"
118 ]
119 },
120 {
121 "cell_type": "markdown",
122 "metadata": {},
123 "source": [
124 "or\n",
125 "\n",
126 "\\begin{eqnarray*}\n",
127 "p_4(x) & = & \\frac{1}{\\Delta x^4} \\left[\\frac{1}{24}f_{i-2} (x - x_{i-1})(x - x_{i})(x - x_{i+1})(x - x_{i+2})\\right] \\\\\n",
128 "&& - \\frac{1}{\\Delta x^4} \\left[\\frac{1}{6}f_{i-1} (x - x_{i-2})(x - x_{i})(x - x_{i+1})(x - x_{i+2})\\right] \\\\\n",
129 "&& + \\frac{1}{\\Delta x^4} \\left[\\frac{1}{4}f_{i} (x - x_{i-2})(x - x_{i-1})(x - x_{i+1})(x - x_{i+2})\\right] \\\\\n",
130 "&& - \\frac{1}{\\Delta x^4} \\left[\\frac{1}{6}f_{i+1} (x - x_{i-2})(x - x_{i-1})(x - x_{i})(x - x_{i+2})\\right] \\\\\n",
131 "&& + \\frac{1}{\\Delta x^4} \\left[\\frac{1}{24}f_{i+2} (x - x_{i-2})(x - x_{i-1})(x - x_{i})(x - x_{i+1})\\right] \\\\\n",
132 "\\end{eqnarray*}"
133 ]
134 },
135 {
136 "cell_type": "markdown",
137 "metadata": {},
138 "source": [
139 "Evaluating at the point $x_{i+1/2}$:\n",
140 "\n",
141 "$$p_4(x) = \\frac{1}{\\Delta x^4}\\frac{1}{24}f_{i-2}\\left(\\frac{9}{16} (\\Delta x)^4\\right) - \\frac{1}{\\Delta x^4} \\frac{1}{6}f_{i-1}\\left(\\frac{15}{16}(\\Delta x)^4\\right) + \\frac{1}{\\Delta x^4} \\frac{1}{4}f_{i} \\left(\\frac{45}{16}(\\Delta x)^4\\right) - \\frac{1}{\\Delta x^4} \\frac{1}{6}f_{i+1} \\left(-\\frac{45}{16}(\\Delta x)^4\\right) + \\frac{1}{\\Delta x^4} \\frac{1}{24}f_{i+2}\\left(-\\frac{15}{16}(\\Delta x)^4\\right)$$"
142 ]
143 },
144 {
145 "cell_type": "markdown",
146 "metadata": {
147 "collapsed": true
148 },
149 "source": [
150 "or,\n",
151 "\n",
152 "$$p_4(x) = \\left[\\frac{3}{128}f_{i-2} - \\frac{5}{32}f_{i-1} + \\frac{45}{64}f_{i} + \\frac{15}{32}f_{i+1} - \\frac{5}{128}f_{i+2}\\right] + O(\\Delta x^5)$$\n",
153 "\n"
154 ]
155 },
156 {
157 "cell_type": "markdown",
158 "metadata": {},
159 "source": [
160 "As noted by Shu, the key is to notice this can be represented as a linear combination of the schemes on the substencils\n",
161 "\n",
162 "$$p_4(x) = \\gamma_0 (x) p_2^{(0)}(x) + \\gamma_1 (x) p_2^{(1)}(x) + \\gamma_2 (x) p_2^{(2)}(x), \\quad x\\in [x_{i-2}, x_{i+2}], \\qquad \\sum_j \\gamma_j = 1$$\n",
163 "\n",
164 "Evaluating at any common point $x_k$ permits us to find the unique linear weights $\\gamma_j(x_k)$ for the interpolation at point $x_k$. We address the weights that are required for interpolation at the same point as above, i.e. at $x_{i+1/2}$, and for brevity will reduce the notation by assigning $\\gamma_0(x_{i+1/2}) \\equiv \\gamma_0, \\gamma_1(x_{i+1/2}) \\equiv \\gamma_1, \\gamma_2(x_{i+1/2}) \\equiv \\gamma_2$ now that this understanding has been made clear. \n",
165 "\n",
166 "For reference we repeat the lower order interpolants here:\n",
167 "\n",
168 "\\begin{eqnarray*}\n",
169 "p_2^{(0)}(x_{i+1/2}) & = & \\phantom{frac{3}{8}f_{i-2} -\\frac{1}{8}f_{i-1} } \\frac{3}{8}f_i + \\frac{3}{4}f_{i+1} - \\frac{1}{8}f_{i+2} \\\\\n",
170 "p_2^{(1)}(x_{i+1/2}) & = & \\phantom{frac{3}{8}} -\\frac{1}{8}f_{i-1} + \\frac{3}{4}f_i + \\frac{3}{8}f_{i+1} \\\\\n",
171 "p_2^{(2)}(x_{i+1/2}) & = & \\frac{3}{8}f_{i-2} - \\frac{5}{4}f_{i-1} + \\frac{15}{8}f_{i}\n",
172 "\\end{eqnarray*}"
173 ]
174 },
175 {
176 "cell_type": "markdown",
177 "metadata": {},
178 "source": [
179 "We determine in Mathematica by evaluating at the point $x_{i+1/2}$ the coefficients in $p_4(x_{i+1/2}) = \\sum_{j=1}^3 \\gamma_j p_{2}^{(j)}(x_{i+1/2})$ and $\\sum_j \\gamma_j = 1$ are given by\n",
180 "\n",
181 "$$\\gamma_0(x_{i+1/2}) \\equiv \\gamma_0 = \\frac{1}{16}, \\gamma_1(x_{i+1/2}) \\equiv \\gamma_1 = \\frac{5}{8}, \\gamma_2(x_{i+1/2}) \\equiv \\gamma_2 = \\frac{5}{16}$$\n",
182 "\n",
183 "these are in agreement with Shu [2009]. We now address the WENO problem:\n",
184 "\n",
185 "<table \"width = 95%\">\n",
186 "<tr><td><b>WENO problem</b></td></tr>\n",
187 "<tr><td>Construct \"nonlinear\" weights $w_j$ ($\\sum_j w_j = 1$) such that \n",
188 "$${}$$\n",
189 "$$p^{WENO}_4(x_{i+1/2}) = w_0 p_2^{(0)}(x_{i+1/2}) + w_1 p_2^{(1)}(x_{i+1/2}) + w_2 p_2^{(2)}(x_{i+1/2})$$\n",
190 "$${}$$\n",
191 "whose values diminishes commensurately with however not smoooth a subinterval may be. Also, the weights should be designed so that in smooth regions the stencils combine as consistently with the linear weights $p^{WENO}_4(x_{i+1/2}) = \\sum_j w_j p^{(j)}_2(x_{i+1/2})\\simeq\\sum_j \\gamma_j p^{(j)}_2(x_{i+1/2}) = p_4(x_{i+1/2})$, i.e. the WENO interpolation should perform at the level (has the same truncation error) as the full interpolant in smooth regions.</td><tr>\n",
192 "</table>"
193 ]
194 },
195 {
196 "cell_type": "markdown",
197 "metadata": {},
198 "source": [
199 "## Design of WENO weights $w_j$\n",
200 "\n",
201 "It can be shown that the following requirement guarantees the order requirement in smooth regions:\n",
202 "\n",
203 "$$w_j = \\gamma_j + O(\\Delta x^2) \\quad \\Rightarrow \\quad p^{WENO}_4(x_{i+1/2}) = p_4(x_{i+1/2}) = u(x_{i+1/2}) + O(\\Delta x^{4+1})$$\n",
204 "\n",
205 "Thus, resolved enough meshes (defined such that sharp changes are observable within a few cell widths, i.e. the mesh is resolved enough to the point where it is not possible for all substencils to have perceived discontinuous due to rapid variation, such a situation indicates the grid is not resolved enough to keep up with the solution and the simulation setup should be revised) are guaranteed to have at least $O(\\Delta x^3)$ accuracy in the event that only one or two subinterpolants of three are effectively available (due to the diminishing of importance assigned to the one or two subinterpolants that contain discontinuities).\n",
206 "\n",
207 "Shu proposed in 1996 to use the following measure of smoothness over a cell $[x_{i-1/2}, x_{i+1/2}]$:\n",
208 "\n",
209 "$$\\beta_j = \\sum_{\\ell = 1}^k \\Delta x^{2\\ell - 1} \\int_{x_{i-1/2}}^{x_{i+1/2}} dx \\, \\left( \\frac{d^{\\ell}p_k^{(j)}}{dx^{\\ell}}\\right)^2$$\n",
210 "\n",
211 "where $k$ is the degree of the interpolant (e.g. $p_2$ is a quadratic polynomial that uses 3 grid values, $p_4$ is a quartic polynomial that uses 5 grid values). Of course, the upper bound on the summation operator can be extended, but all derivatives $\\ell > k$ are zero.\n",
212 "\n",
213 "The prefactor is chosen to remove all traces of $\\Delta x$ from the denominators of the derivatives of the subinterpolants $p^{(j)}$ so that the measure of smoothness is designed to not depend on mesh size, and are transferrable to any mesh size."
214 ]
215 },
216 {
217 "cell_type": "markdown",
218 "metadata": {},
219 "source": [
220 "We have verified in Mathematica that the following smoothness factors are obtained:\n",
221 "\n",
222 "\\begin{eqnarray*}\n",
223 "\\beta_1 & = & \\frac{1}{3}\\left(4u_{i-1}^2 - 19 u_{i-2}u_{i-1} + 25 u_{i-1}^2 + 11 u_{i-2}u_i - 31 u_{i-1}u_i + 10u_i^2\\right) \\\\\n",
224 "\\beta_2 & = & \\frac{1}{3}\\left( 4u_{i-1}^2 - 13u_{i-1}u_i + 13u_i^2 + 5u_{i-1}u_{i+1} - 13 u_i u_{i+1} + 4 u_{i+1}^2 \\right) \\\\\n",
225 "\\beta_3 & = & \\frac{1}{3}\\left(10 u_i^2 - 31 u_i u_{i+1} + 25 u_{i+1}^2 + 11 u_i u_{i+2} - 19 u_{i+1} u_{i+2} + 4 u_{i+2}^2\\right)\n",
226 "\\end{eqnarray*}\n",
227 "\n",
228 "Note that the smoothness indicators $\\beta_j$ are quadratic functions of the grid function values; clearly this is always the case for any stencil size given the definition of $\\beta_j$.\n",
229 "\n",
230 "Shu designs the nonlinear weights $w_j$ to take the following form:\n",
231 "\n",
232 "$$w_j = \\frac{\\tilde{w}_j}{\\sum_j \\tilde{w}_j}, \\qquad \\tilde{w}_j = \\frac{\\gamma_j}{(\\varepsilon + \\beta_j)^2}$$\n",
233 "\n",
234 "where $\\varepsilon$ is a small number chosen to evade numerical overflow. Shu remarks there is little, if any, effect of different choices of this parameter on the smoothness indications provided by the $\\beta_j$ factors. In most literature, $\\varepsilon = 10^{-6}$ is chosen. As noted by Shu [2009], different functions that exhibit the same behavior can be chosen, e.g. instead of $w_j \\sim \\beta_j^{-2}$ we could choose $w_j \\sim e^{-\\alpha \\beta_j}$ for some $\\alpha > 0$. A survey of different candidate functions was presented in the seminal paper [G. Jiang and C.-W. Shu, Efficient implementation of weighted ENO schemes, J. Comput. Phys., 126 (1996), pp. 202–228, hereafter referred to as Jiang and Shu [1996]] weighting cost and performance and the above was selected and is the choice by all WENO literature and WENO-based methods this author has encountered.\n",
235 "\n",
236 "We can see from the design of $w_j$ that when $\\beta_j$ is large, the WENO (nonlinear) weight $w_j$ is correspondingly small. Also, the construction is normalized. Thus, these weights create the desired behavior of a dynamic weight $w_j$ whose value diminishes whenever non-smooth subintervals may be encountered. The weighted sum of $L^2$ norms of the derivatives of the function provide the natural measure of smoothness. In subsequent sections, we address WENO derivatives, which seek weights $w_j$ (and associated $\\gamma_j$) on the finite difference subschemes. The smoothness indicator for the $q$th order derivative should be based <i>its</i> derivatives, not the derivative itself. Thus, in that section we will modify the limit on the summation in the definition of $\\beta_j$ to be from $\\ell = q+1$ to $\\ell = k$"
237 ]
238 },
239 {
240 "cell_type": "markdown",
241 "metadata": {},
242 "source": [
243 "## The number of ordered substencils in a full stencil that contain the grid point $i$\n",
244 "\n",
245 "tl;dr : a full stencil of size $s = 2r - 1$ where $r = \\lceil s / 2 \\rceil$ has $N_s = s_j - 2m$ substencils of size $s_j = r + m$, where $m = 0, 1, \\ldots r-1$, note that the $m = r-1$ case corresponds to $s_j = s \\Rightarrow N_s = 1$ (if the substencil is the same size as the full stencil, tehre exists only one \"substencil\"). The substencil size is restricted by the requirement $s_j \\geq r$ since the union of substencils must equal the full stencil by design."
246 ]
247 },
248 {
249 "cell_type": "markdown",
250 "metadata": {},
251 "source": [
252 "<hr>\n",
253 "\n",
254 "Note for the context of interpolation or finite differencing, we are considering several candidate stecils that estimate the value of the quantity at a particular grid point $i$, hence it is required that each subinterval contain this grid point. We consider only centered full centered, as centered stencils outperform their non-central counterparts.\n",
255 "\n",
256 "Consider a full stencil $S$ of size $s$ (odd),\n",
257 "\n",
258 "$$S = \\{-r+1, -r+2, \\ldots , 0, \\ldots r-2, r-1\\}, \\qquad r = \\lceil s / 2 \\rceil$$\n",
259 "\n",
260 "or, equivalently, $S = \\{k - r + 1\\}$ for $k = 0, 1, \\ldots s - 1$, $r = \\lceil s / 2 \\rceil$."
261 ]
262 },
263 {
264 "cell_type": "markdown",
265 "metadata": {},
266 "source": [
267 "We partitioning this full stencil into substencils $S_j$ of size $s_j$, such that $S = \\bigcup_j S_j$.\n",
268 "\n",
269 "The basic questions are:\n",
270 "\n",
271 "<ul>\n",
272 "<li>what restrictions are on the substencil size $s_j$\n",
273 "<li>how many substencils are there?\n",
274 "</ul>\n",
275 "\n",
276 "It is easy to understand that minimum substencil size is the half-width $r$. This simultaneously guarantees (1) every point in the full stencil has representation in at least one of the set of substencils, and (2) that the stencil center $\\{0\\}$ is in every stencil, even the most non-centered stencils. As concerns point (1), if we tried to make small stencils, so that there exists at least one full stencil point that was not represented in any substencil, then our decomposition fails: $\\sum_j \\gamma_j p_j(x_G) = p_S(x_G)$ is not consistent as there would be at least one equation $0 \\cdot\\gamma_k = c_{\\ell}$ for some $c_{\\ell} \\neq 0$ (weight on the full scheme). \n",
277 "\n",
278 "We can write any substencil labelled by the left-shift parameter $j$ as $S_j$, where\n",
279 "\n",
280 "$$S_j = \\{k-j-m\\}, \\qquad k = 0, 1, \\ldots , s_j-1, j = 0, 1, \\ldots , N_s-1, s_j = r + m, r = \\lceil s/2\\rceil $$\n",
281 "\n",
282 "where $N_s = s_j - 2m$ is the total numbef of substencils of size $s_j \\equiv |S_j|$.\n",
283 "\n",
284 "e.g. for full stencil $S$ of size $s = 5$, the substencil size $s_j = r = 3$\n",
285 "\n",
286 "\\begin{eqnarray*}\n",
287 "S & = & \\{-2, -1, 0, 1, 2\\} \\\\\n",
288 "&&\\\\\n",
289 "S_0 & = & \\{0, 1, 2\\} \\\\\n",
290 "S_1 & = & \\{-1, 0, 1\\} \\\\\n",
291 "S_2 & = & \\{-2, -1, 0\\} \\\\\n",
292 "\\end{eqnarray*}\n",
293 "\n",
294 "which span intervals $I$ and $I_j$ containing the cell centers:\n",
295 "\n",
296 "$$I = \\bigcup_{k=0}^{s-1} \\{x_{i+k-r+1}\\}, \\qquad r = \\lceil s/2\\rceil$$\n",
297 "$$I_j = \\bigcup_{k=0}^{s_j-1} \\{x_{i+k-j-m}\\}, \\qquad s_j = r + m$$\n",
298 "\n",
299 "It is easy to see that there for any full stencil of size $s = 2r - 1$ where $r = \\lceil s / 2 \\rceil$, the number of substencils of size $s_j = r + m$ is given by $N_s = r - m$ for $m = 0, 1, \\ldots r-2$. For the same example above ($s = 5$ full stencil), we see $r = 3$, thus $m = 0, 1$ gives two possible substencil sizes $s_j = r + m = \\{3, 4\\}$. We have $N_s = r - 0 = 3$ substencils of size $s_j = r + 0 = 3$, or we could have $N_s = r - 1 = 2$ substencils of size $s_j = r + 1 = 4$. Note that the substencil size $s_j = r + m$ for $m = r-1$ corresponds to $s_j = 2r - 1 = s$, the size of the full stencil. Consistently, this would predict there is $N_s = 1$ substencil of the full stencil when $s = s_j$.\n",
300 "\n",
301 "Lastly, note that substencils of size $s_j < r$ would not represent all stencil points in the full stencil as can be seen from the above example if we consider, say $s_j = 2$. We would have in this case substencils $\\{-1, 0\\}, \\{0, 1\\}$, but have no inclusion of stencil points $\\{2\\}$ and $\\{-2\\}$, so the decomposition is not permissible and sekeing linear weights $\\gamma_j$ is quixotic. Such weights cannot exist. If we decide to use such a $s_j < r$ substencil and consider extending the range so that the substencil no longer contains the grid point (i.e. the interpolant becomes an extrapolant) we could proceed, but we should not fall back on extrapolants over interpolants, especially when the full stencil size gets too large so that $s_j$ is quite small compared to $r$."
302 ]
303 },
304 {
305 "cell_type": "markdown",
306 "metadata": {
307 "collapsed": true
308 },
309 "source": [
310 "# <font color = \"red\">WENO derivatives</font>\n",
311 "\n",
312 "The key ideas carry forward from the interpolation problem to the derivative scheme construction:\n",
313 "\n",
314 "For a derivative of order $q$, we consider the a central finite difference scheme with truncation order $k+1$ on a \"full\" stencil $S = \\bigcup_j S_j$ of size $s$ made up of associated $N_s = s_j - m$ substencils $S_j$ (need not be central) of size $s_j = r + m < s$ whose truncation order is at greatest order $s_j$, where the half-width $r = \\lceil s / 2 \\rceil$, and $m = 0, 1, \\ldots , r - 1$ ($m = r-1$ corresponds to the substencil being identical to the full stencil)\n",
315 "\n",
316 "<table \"width = 95%\">\n",
317 "<tr><td><b>WENO derivative prescription</b></td></tr>\n",
318 "<tr><td>\n",
319 "$${}$$\n",
320 "<ol>\n",
321 "<li>Select a full stencil $S = \\bigcup_j S_j$ of size $s$ and substencil size $s_j = r + m \\geq r$ ($m = 0, 1, \\ldots r-1$, $r = \\lceil r \\rceil $) to be used for all substencils $S_j$ whose union $\\bigcup_j S_j = S$\n",
322 "<li>Obtain a full interpolant $P_S$ that interpolates the grid function values $u_k$ corresponding to the full interval $I = \\bigcup_j I_j$ belonging to the full stencil $S$ and obtain all subinterpolants $p_{s,j} \\equiv p_j$ that interpolate the grid function values $u_{k'}$ corresponding to the subintervals $I_j$ circumscribed by each substencil $S_j$, where $j = 0, 1, 2, \\ldots , N_s$ ($N_s = s_j - m$) enumerates all substencils and corresponds to the total number of ordered subsets of size $s_j = r + m$ of a full set of size $s$.\n",
323 "<li>Obtain all $q$th order finite difference schemes for the full stencil $S$ and all substencils $S_j$ by evaluating the $q$th derivative of the interpolating polynomial at the node $x_i$ of each scheme. We refer to the scheme belonging to the full stencil as simply the finite difference scheme (or, the \"full\" scheme), whereas the schemes belonging to the substencils are referred to as finite difference subschemes. The finite difference scheme of the full stencil $\\Delta^{(q)}_S[u_i] = (\\Delta x)^q \\partial_x P_S(x_i)$, whereas the finite difference subschemes $\\delta^{(q)}_j[u_i] = (\\Delta x)^q \\partial_x p_j(x_i)$ correspond to the substencils $S_j$.$^{\\text{1}}$. Note that each finite difference scheme or subscheme is not a function of $x$, but as usual is a linear combination of grid function values $u_{k}$. It is easy to verify that the difference schemes and subschemes are given by the following form:\n",
324 "$${}$$\n",
325 "$$\\delta_j^{(q)}[u_i] = \\sum_{k = 0}^{s_j - 1} W^{(q),j}_{k-j-m} u_{i+k-j-m}, \\qquad s_j = r + m, r = \\lceil s / 2 \\rceil$$\n",
326 "\n",
327 "and\n",
328 "\n",
329 "$$\\Delta_S^{(q)}[u_i] = \\sum_{k=0}^{s - 1} W_{k-r+1} u_{k-r+1}, \\qquad r = \\lceil s/2\\rceil$$\n",
330 "\n",
331 "<li>Seek linear weights $\\gamma^{(q)}_j$ by solving the system of equations:\n",
332 "\n",
333 "\\begin{eqnarray*}\n",
334 "\\sum_{j=0}^{s_j-m-1} \\gamma^{(q)}_j \\delta^{(q)}_j[u_i] & = & \\Delta^{(q)}_S[u_i] \\\\\n",
335 "\\sum_{j=0}^{s_j-m-1} \\gamma_j^{(q)} & = & 1\n",
336 "\\end{eqnarray*}\n",
337 "\n",
338 "these may turn out to be negative$^{\\text{2}}$ since we have evaluated not on half-grid points, but on the grid points themselves $i$ to obtain the finite difference schemes. The linear weights $\\gamma_j \\neq \\gamma_j (x_i)$ since each such constraint $\\sum_{j=0}^{s_j-m-1} \\gamma^{(q)} \\delta^{(q)}_j[u_i] = \\Delta^{(q)}_S[u_i]$ produces the identical set of undetermined coefficient equations as any $\\sum_{j=0}^{s_j-m-1} \\gamma^{(q)} \\delta^{(q)}_j[u_{\\ell}] = \\Delta^{(q)}_S[u_{\\ell}]$ where $\\ell \\neq i$.\n",
339 "<li>The smoothness indicator $\\beta_j$ for the $q$th derivative in a subinterval $I_j$ should be based not on all derivatives, but on the derivatives of the $q$th derivative, i.e. smoothness is based on all derivatives greater than order $q$:\n",
340 "$${}$$\n",
341 "$$\\beta^q_j = \\sum_{\\ell = q+1}^{s_j-1} \\Delta x^{2\\ell - 1} \\int_{x_{i-1/2}}^{x_{i+1/2}} dx \\, \\left( \\frac{d^{\\ell}p_{j}}{dx^{\\ell}}\\right)^2, \\qquad j = 1, 2, \\ldots , s - s_j + 1$$\n",
342 "$${}$$\n",
343 "Note that if the substencil size $s_j$ is not large enough (if the degree $s_j-1$ of the polynomial is not large enough), $\\beta_j \\equiv 0$.$^{\\text{3}}$ ($\\partial_x^{\\ell} p_j \\equiv 0$)\n",
344 "<li>Construct the nonlinear (WENO) weights $w_j$:\n",
345 "$${}$$\n",
346 "$$w_j = \\frac{\\tilde{w}_j}{\\sum_j \\tilde{w}_j}, \\qquad \\tilde{w}_j = \\frac{\\gamma_j}{(\\varepsilon + \\beta_j)^2}, \\qquad j = 1, 2, \\ldots s - s_j + 1,\\,\\, \\varepsilon = 10^{-6}$$\n",
347 "$${}$$\n",
348 "The choice of $\\varepsilon$ can be selected by the user, its role is solely in choosing a small number that prevents numerical overflow whenever then $\\beta_j \\simeq 0$ since the polynomial is not of high enough degree to have any nonzero derivatives.\n",
349 "<li>The $q$th derivative at the point $x_i$ is calculated as:\n",
350 "$${}$$\n",
351 "$$\\partial_x^q u(x_i) = \\frac{1}{(\\Delta x)^q} \\sum_{j=0}^{s_j - m - 1} w_j \\delta_j^{(q)}[u_i] + O(\\Delta x^{N})$$\n",
352 "$${}$$\n",
353 "where the mesh should be chosen to be sufficiently resolved so that it is not the case that all subintervals have a measured discontinuity. the order $N$ depends on the order of the derivative and the smoothness of the region. The scheme should approach the same truncation error as the full scheme in smooth regions, whereas in unsmooth regions the order will drop down commensurately.\n",
354 "</ol>\n",
355 "</td></tr>\n",
356 "</table>\n",
357 "\n",
358 "\n",
359 "$^{\\text{1}}$ : we elect to remove all dependence of the mesh size here as the information required to apply a finite difference scheme only requires weights, stencil, and order of derivative, the mesh size is a global value which can be accessed as needed and does not change what the scheme is. To wit, the value of each linear weight $\\gamma_j^{(q)}$ is independent of the mesh size as the mesh size term that appears is common to all terms in the equation.\n",
360 "\n",
361 "\n",
362 "$^{\\text{2}}$ : should the linear weights $\\gamma_j^q$ turn out to be negative, the combination of linear weights on the FD subschemes will no longer be a convex combination and thus introduces non-monoticity in the solution where previously there was none. In such cases, WENO can perform worse than a non-WENO estimate (using the full stencil without discrimination). In such cases, techniques have been explored to not discard any negative weights, but to revise them in a way that permits them to outperform non-WENO estimates, though notwithstanding in such cases they have been seen to underperform as compared to a WENO scheme with only positive linear weights [1,2]. Refs: [1] On the Construction, Comparison, and Local Characteristic Decomposition for High-Order Central WENO Schemes. Jianxian Qiu and Chi-Wang Shu; [2] A Technique of Treating Negative Weights in WENO Schemes. Jing Shi, Changqing Hu,2 and Chi-Wang Shu\n",
363 "\n",
364 "$^{\\text{3}}$ : Notice that if the substencil size is not large enough ($s_j - 1 < q + 1 \\Rightarrow s_j < q + 2$), $\\beta_j = 0$ (equivalently, this says the construction subinterpolant of $C^{s_j-1}(I_j)$ has a degree which has no more nonzero derivatives). This means there is no proxy available to infer which stencil to be used. The linear combination of WENO weights $\\sum_j w_j^{(q)} \\delta_j^{(q)}$ on the finite difference schemes will become approximately equal to $\\sum_j \\gamma_j^{(q)} \\delta_j^{(q)}$, which is (with some latitude acknowledged in the statement), \"as if we did not use WENO\". Any code implementing a WENO derivative scheme should be mindful of this to either ensure the substencil size $s_j$ is big enough to provide a nonzero $\\beta_j$ indication, or if this is not desirable then the developer would be advised to forego WENO implementation for any derivative $q$ where this is the case as the calcuations of $\\beta_j$, construction of WENO weights $w_j$ are a source of wasted computational cost given $w_j \\simeq \\gamma_j$ in such circumstances which is the same as using the full stencil without discrimination."
365 ]
366 },
367 {
368 "cell_type": "markdown",
369 "metadata": {},
370 "source": [
371 "## Suggestions for solving the linear system for the weights $\\gamma_j$\n",
372 "\n",
373 "As concerns the solution of step (4) above, it is easiest to solve the matrix version of this requirement. We have an overdetermined system (the coefficient matrix is not square, hence no inverse exists), the suggestion is to solve the matrix problem using a numerical algebra routine, e.g. <code>LinearSolve</code> in <i>Mathematica</i>. \n",
374 "\n",
375 "We set up the matrix problem\n",
376 "\n",
377 "$$\\left\\{\\begin{array}{c}\n",
378 "\\sum_j \\gamma_j \\delta_j^{(q)}[u_i] = \\Delta_S^{(q)}[u_i] \\\\\n",
379 "\\sum_j \\gamma_j = 1\n",
380 "\\end{array}\\right\\} \\quad \\Rightarrow \\quad \\left(\\begin{array}{c}\n",
381 "\\sum_j \\gamma_j \\delta_j^{(q)} \\\\\n",
382 "\\sum_j \\gamma_j \n",
383 "\\end{array}\\right) = \\left(\\begin{array}{c}\n",
384 "\\Delta_S^{(q)} \\\\\n",
385 "1 \n",
386 "\\end{array}\\right) \n",
387 "\\quad \\Rightarrow\\quad m\\gamma = b$$\n",
388 "\n",
389 "Recalling that \n",
390 "\n",
391 "$$\\delta_j^{(q)}[u_i] = \\sum_{k = 0}^{s_j - 1} W^{(q),j}_{k-j-m} u_{i+k-j-m}, \\qquad s_j = r + m, r = \\lceil s / 2 \\rceil$$\n",
392 "\n",
393 "or, in terms of a vector dot product:\n",
394 "\n",
395 "$$(\\underline{\\delta}_j^{(q)})_{1\\times s_j} \\cdot (\\underline{u}_{i+S_j})_{s_j\\times 1} = \\sum_{k = 0}^{s_j - 1} W^{(q),j}_{k-j-m} u_{i+k-j-m}$$\n",
396 "\n",
397 "where the vector slice $\\underline{u}_{i+S_j}$ constructs the vector of grid function values for all indices in the set $\\{i+S_j\\}$ where $S_j = \\{k-j-m\\}$ for $k = 0, 1, \\ldots r-1$ ($r = \\lceil s / 2\\rceil$).\n",
398 "\n",
399 "We can see the correspondence of the operator object: $(\\underline{\\delta}_j^{(q)})_{1\\times s_j} = (W_{k-j-m})$ \n",
400 "\n",
401 "or element-wise, $(\\delta_j^{(q)})_k = W_{k-j-m}$. Similarly, recall we have the representation for the full scheme\n",
402 "\n",
403 "$$\\Delta_S^{(q)}[u_i] = \\sum_{k=0}^{s - 1} W_{k-r+1} u_{k-r+1}, \\qquad r = \\lceil s/2\\rceil$$\n",
404 "\n",
405 "or equivalently,\n",
406 "\n",
407 "$$\\underline{\\Delta_S}^{(q)}\\cdot \\underline{u}_{i+S} = \\sum_{k=0}^{s - 1} W_{k-r+1} u_{k-r+1}$$. Again, we can represent this element-wise if desirable as $(\\Delta_S^{(q)})_k = W_{k-r+1}$\n"
408 ]
409 },
410 {
411 "cell_type": "markdown",
412 "metadata": {},
413 "source": [
414 "It can be noticed that the matrix system $m\\gamma = b$ is expressed as:\n",
415 "\n",
416 "$$m = \\left( \\begin{array}{ccccc}\n",
417 " & & & & (\\underline{\\delta}^{(q)}_{N_s-1})_{s_j\\times 1} \\\\\n",
418 " & & & (\\underline{\\delta}^{(q)}_{N_s-2})_{s_j\\times 1} & \\\\\n",
419 " & & & & \\\\\n",
420 " & (\\underline{\\delta}^{(q)}_{1})_{s_j\\times 1} & & & \\\\ \n",
421 " (\\underline{\\delta}^{(q)}_{0})_{s_j\\times 1} & & & & \\\\ \n",
422 "1 & 1 &\\cdots &\\cdots & 1 \n",
423 "\\end{array}\n",
424 "\\right)_{(s+1)\\times N_s}, \\quad \\gamma_{N_s\\times 1} = \\left( \\begin{array}{c}\n",
425 "\\gamma_0\\\\\n",
426 "\\gamma_1 \\\\\n",
427 "\\vdots \\\\\n",
428 "\\gamma_{N_s-1}\n",
429 "\\end{array}\\right)_{N_s\\times 1}, \\quad b_{(s+1)\\times 1} = \\left(\\begin{array}{c}\n",
430 "(\\underline{\\Delta}_S^{(q)})_{s\\times 1} \\\\\n",
431 "1\n",
432 "\\end{array}\n",
433 "\\right)\n",
434 "$$"
435 ]
436 },
437 {
438 "cell_type": "markdown",
439 "metadata": {},
440 "source": [
441 "Thus in the matrix multiplication $m\\gamma = b$, every weight $W^{(q),N_s-1}_k$ is multiplied by $\\gamma_{N_s-1}$, every weight $W^{(q),N_s-2}_k$ is multiplied by $\\gamma_{N_s-2}$, and so on, and the $i$th row of the product $m\\gamma$ must be consistent with the $i$th row (entry) of the vector $b$, i.e. $\\sum_j \\gamma_j\\delta_j^{(q)} = \\Delta_S^{(q)}$ "
442 ]
443 },
444 {
445 "cell_type": "markdown",
446 "metadata": {},
447 "source": [
448 "For example, the vector of $\\gamma_j$ values can be found in <i>Mathematica</i> as\n",
449 "\n",
450 " gammas = LinearSolve[ m, b ]\n"
451 ]
452 },
453 {
454 "cell_type": "markdown",
455 "metadata": {},
456 "source": [
457 "# WENO derivative algorithm considerations\n",
458 "\n",
459 "Several steps in the above prescription should be computed ahead of time and stored (e.g. the finite difference schemes themselves, the integrals that define the smoothness indicators $\\beta_j$, the linear weights $\\gamma_j$) to save computational cost, so that in a larger application, the WENO derivatives can be carried out with minimal evaluations.\n",
460 "\n",
461 "What can be computed beforehand:\n",
462 "\n",
463 "<ul>\n",
464 "<li> the weights/stencils for the finite difference schemes $\\Delta_S^{(q)}$ and all subschemes $\\delta_j^{(q)}$\n",
465 "<li> the form of the smoothness factors $\\beta_j$, $\\beta_j$ is a function of grid function values\n",
466 "<li> the linear weights $\\gamma_j$\n",
467 "</ul>\n",
468 "\n",
469 "What must be computed during evaluation:\n",
470 "\n",
471 "<ul>\n",
472 "<li>the specific value of each finite difference estimate at each node $x_i$, all $\\delta_j^{(q)}u(x_i)$. Note that the full stencil $\\Delta_S^{(q)}u(x_i)$ does not need to be computed, it is produced by the convex combination of $\\delta_j^{(q)}u(x_i)$ terms if the best case scenario is encountered (local smoothness)\n",
473 "<li>the value of the smoothness indicators $\\beta_j$\n",
474 "<li>the nonlinear (WENO) weights $w_j$\n",
475 "<li>the WENO estimate for the derivative: $\\partial_x^q u(x_i) = \\frac{1}{(\\Delta x)^q} \\sum_{j=1}^{s_j - m} w_j \\delta_j^{(q)}$\n",
476 "</ul>"
477 ]
478 },
479 {
480 "cell_type": "markdown",
481 "metadata": {},
482 "source": [
483 "# <font color = \"red\">WENO Derivative performance tests</font>\n",
484 "\n",
485 "Note, a <i>Mathematica</i> script was written to do all the algebra, systems of equation solving, integration, differentiation, etc. required from the WENO derivative prescription. Thus, we do not show the proofing, but quote our output."
486 ]
487 },
488 {
489 "cell_type": "markdown",
490 "metadata": {},
491 "source": [
492 "## Case 1: all positive linear weights $\\gamma_j > 0$\n",
493 "\n",
494 "In the subsequent section we analyze the problems that will develop when negative linear weights. In the sequel to that section, we incorporate a strategy by Shi to deal with negative linear weights by partitioning them into positive and negative parts."
495 ]
496 },
497 {
498 "cell_type": "markdown",
499 "metadata": {},
500 "source": [
501 "\n",
502 "### Example 1: $\\partial_x^1 u$ ($q = 1$), full stencil sizse $s = 5$, substencil size $s_j = 3$\n",
503 "\n",
504 "#### Setup\n",
505 "\n",
506 "For this case, we identify the constitutive parameters in the above selection $s = 5, s_j = 3$ as $r = \\lceil s/2 \\rceil = 3, s_j = 3 = r + m = 3 + 0$\n",
507 "\n",
508 "There are $N_s = s_j - m = 3 - 0 = 3$ such ordered subsets of size $s_j = 3$ of the full stencil of size $s = 5$:\n",
509 "\n",
510 "$$S = \\{-2,-1, 0, 1, 2\\} = \\{-2, -1, 0\\}\\cup \\{-1, 0, 1\\} \\cup \\{0,1, 2\\} = S_2\\cup S_1 \\cup S_0$$\n",
511 "\n",
512 "We find the following subinterpolants $p_j$ where $j$ is the left-shift parameter:\n",
513 "\n",
514 "\\begin{eqnarray*}\n",
515 "p_0 & = & \\left(1 + \\frac{x^2}{2 (\\Delta x)^2} - \\frac{3x}{2\\Delta x}\\right)u_{i} + \\left(-\\frac{x^2}{(\\Delta x)^2} + \\frac{2x}{\\Delta x}\\right)u_{i+1} + \\left(\\frac{x^2}{2 (\\Delta x)^2} + \\frac{x}{2\\Delta x}\\right)u_{i+2}\\\\\n",
516 "p_1 & = & \\left(\\frac{x^2}{2 (\\Delta x)^2} - \\frac{x}{2\\Delta x}\\right)u_{i-1} + \\left(1-\\frac{x^2}{(\\Delta x)^2}\\right)u_{i} + \\left(\\frac{x^2}{2 (\\Delta x)^2} + \\frac{x}{2\\Delta x}\\right)u_{i+1}\\\\\n",
517 "p_2 & = & \\left(\\frac{x^2}{2 (\\Delta x)^2} + \\frac{x}{2\\Delta x}\\right)u_{i-2} + \\left(-\\frac{x^2}{(\\Delta x)^2} + \\frac{2x}{\\Delta x}\\right)u_{i-1} + \\left(1 + \\frac{x^2}{2 (\\Delta x)^2} + \\frac{3x}{2\\Delta x}\\right)u_{i} \n",
518 "\\end{eqnarray*}\n",
519 "\n",
520 "the following finite difference schemes are obtained by differentiating the above $q = 1$ times, and evaluating at $x = x_i$\n",
521 "\n",
522 "\\begin{eqnarray*}\n",
523 "\\Delta^{(1)}_5 u_i & = & \\frac{1}{12}u_{i-2} -\\frac{2}{3}u_{i-1} + \\frac{2}{3}u_{i+1} -\\frac{1}{12}u_{i+2} \\\\\n",
524 "&&\\\\\n",
525 "\\delta_0^{(1)}u_i & = & -\\frac{3}{2}u_{i} + 2u_{i+1} - \\frac{1}{2}u_{i+2} \\\\\n",
526 "\\delta_1^{(1)}u_i & = & -\\frac{1}{2}u_{i-1} + \\frac{1}{2}u_{i+1} \\\\\n",
527 "\\delta_2^{(1)}u_i & = & \\frac{1}{2}u_{i-2} - 2u_{i-1} + \\frac{3}{2}u_{i} \\\\\n",
528 "\\end{eqnarray*}\n",
529 "\n",
530 "Note that while the interpolants these operators came from were 5th and 3rd order accurate, the <b>derivative schemes are necessarily 4th and 2nd order accurate for the scheme and subschemes, respectively.</b>\n",
531 "\n",
532 "We solve for the linear weights $m\\gamma = b$, where\n",
533 "\n",
534 "$$m = \\left(\\begin{array}{ccc}\n",
535 "0 & 0 & \\frac{1}{2} \\\\\n",
536 "0 & -\\frac{1}{2} & -2 \\\\\n",
537 "-\\frac{3}{2} & 0 & \\frac{3}{2} \\\\\n",
538 "2 & -\\frac{1}{2} & 0 \\\\\n",
539 "-\\frac{1}{2} & 0 & 0 \\\\\n",
540 "1 & 1 & 1\n",
541 "\\end{array}\n",
542 "\\right), \\quad \\gamma = \\left(\\begin{array}{c}\n",
543 "\\gamma_0 \\\\\n",
544 "\\gamma_1 \\\\\n",
545 "\\gamma_2 \n",
546 "\\end{array}\\right), \\quad b = \\left(\\begin{array}{c}\n",
547 "\\frac{1}{12} \\\\\n",
548 "-\\frac{2}{3} \\\\\n",
549 "0\\\\\n",
550 "\\frac{2}{3} \\\\\n",
551 "-\\frac{1}{12} \\\\\n",
552 "1\n",
553 "\\end{array}\\right)\n",
554 "$$\n",
555 "\n",
556 "Whose solution gives:\n",
557 "\n",
558 "$$\\gamma_0 = \\frac{1}{6}, \\gamma_1 = \\frac{2}{3}, \\gamma_2 = \\frac{1}{6} $$\n"
559 ]
560 },
561 {
562 "cell_type": "markdown",
563 "metadata": {},
564 "source": [
565 "Using the above interpolants, we evaluate the smoothness indicators $\\beta_j$ as:\n",
566 "\n",
567 "\\begin{eqnarray*}\n",
568 "\\beta_0 & = & u_i^2 - 4 u_i u_{i+1} + 4 u_{i+1}^2 + 2u_i u _{i+2} - 4 u_{i+1} u_{i+1} + u_{i+2}^2 \\\\\n",
569 "\\beta_1 & = & u_{i-1}^2 - 4 u_{i-1}u_i + 4 u_0^2 + 2 u_{i-1}u_1 - 4 u_iu_{i+1} + u_{i+1}^2 \\\\\n",
570 "\\beta_2 & = & u_{i-2}^2 - 4 u_{i-2} u_{i-1} + 4 u_{i-1}^2 + 2 u_{i-2}u_0 - 4 u_{i-1}u_i + u_i^2 \n",
571 "\\end{eqnarray*}\n",
572 "\n",
573 "We apply our finite difference scheme as a sum of matrix products:\n",
574 "\n",
575 "$$\\underline{\\underline{\\partial_x u }} = \\sum_j \\gamma_j \\underline{\\underline{W}}^{(q),j}\\cdot \\underline{u} \\quad \\text{(non-WENO)} \\qquad \\text{ or } \\qquad \\underline{\\underline{\\partial_x u }}= \\sum_j w_j \\underline{\\underline{W}}^{(q),j}\\cdot \\underline{u} , \\quad\\text{(WENO)}$$\n",
576 "\n",
577 "for a grid function of dimension $N\\times 1$, and the weight matrix $\\underline{\\underline{W}}^{(q),j}$ contains the weights for the finite difference subscheme loaded at the stencil positions $S_j$ along columns at row $i$, centered column $i$, i.e. the stencil position 0 corresponds to $(i,i)$."
578 ]
579 },
580 {
581 "cell_type": "markdown",
582 "metadata": {},
583 "source": [
584 "For example, for a periodic problem, the weight arrays have the following forms:\n",
585 "\n",
586 "$$\\underline{\\underline{W}}^{per}_0 = \\left(\\begin{array}{ccccccc}\n",
587 "-\\frac{3}{2} & 2 & -\\frac{1}{2} & & &&& \\\\\n",
588 "0 & -\\frac{3}{2} & 2 & -\\frac{1}{2} & & \\\\\n",
589 "\\\\ \n",
590 "\\\\\n",
591 "\\\\\n",
592 "&& && -\\frac{3}{2} & 2 & -\\frac{1}{2} \\\\\n",
593 "-\\frac{1}{2} & && && -\\frac{3}{2} & 2 \\\\\n",
594 "2 & -\\frac{1}{2} & && && -\\frac{3}{2} \\\\\n",
595 "\\end{array}\\right)\n",
596 "$$\n",
597 "\n",
598 "$$\\underline{\\underline{W}}^{per}_1 = \\left(\\begin{array}{ccccccc}\n",
599 "0 & \\frac{1}{2} & & & & & -\\frac{1}{2} \\\\\n",
600 "-\\frac{1}{2} & 0 & \\frac{1}{2} & & & \\\\\n",
601 "\\\\ \n",
602 "\\\\\n",
603 "\\\\\n",
604 "&& && -\\frac{1}{2} & 0 & \\frac{1}{2} \\\\\n",
605 "\\frac{1}{2} & && && -\\frac{1}{2} & 0 \\\\\n",
606 "\\end{array}\\right)\n",
607 "$$\n",
608 "\n",
609 "$$\\underline{\\underline{W}}^{per}_2 = \\left(\\begin{array}{ccccccc}\n",
610 "\\frac{3}{2} & & &&&\\frac{1}{2} & -2 \\\\\n",
611 "-2 & \\frac{3}{2} & & && &\\frac{1}{2} \\\\\n",
612 " \\frac{1}{2} & -2 & \\frac{3}{2} & & & &\\\\\n",
613 "\\\\ \n",
614 "\\\\\n",
615 "\\\\\n",
616 "&& &&\\frac{1}{2} & -2 & \\frac{3}{2} \\\\\n",
617 "\\end{array}\\right)\n",
618 "$$"
619 ]
620 },
621 {
622 "cell_type": "markdown",
623 "metadata": {},
624 "source": [
625 "### Test problem (non-WENO): first derivative computation demo on a smooth, periodic function $f_1$\n",
626 "\n",
627 "We show the linear combination of these weight matrices compute the correct derivative on the test function \n",
628 "\n",
629 "$$f_1(x) = \\sin (2\\pi x) \\longrightarrow f_1'(x) = 2\\pi \\cos (2\\pi x)$$\n",
630 "\n",
631 "on the domain $x\\in [0,1]$"
632 ]
633 },
634 {
635 "cell_type": "code",
636 "execution_count": 4,
637 "metadata": {
638 "collapsed": true
639 },
640 "outputs": [],
641 "source": [
642 "import numpy as np\n",
643 "\n",
644 "def assemble_Wj(N):\n",
645 " W0, W1, W2 = np.zeros( (N, N) ), np.zeros( (N, N) ), np.zeros( (N, N) )\n",
646 "\n",
647 " # fill vals for W1\n",
648 " w2m2, w2m1, w20 = 1/2., -2., 3/2. # paired with stencil pos: {-2, -1, 0}\n",
649 " # fill vals for W2\n",
650 " w1m1, w1p1 = -1/2., 1/2. # paired with stencil pos: {-1, 1}\n",
651 " # fill vals for W3\n",
652 " w00, w0p1, w0p2 = -3/2., 2., -1/2. # paired with stencil pos: {0, 1, 2}\n",
653 "\n",
654 " for i in range(N):\n",
655 " W2[i,i] = w20\n",
656 " W2[i, i-1] = w2m1\n",
657 " W2[i, i-2] = w2m2\n",
658 " \n",
659 " W1[i, np.mod(i-1, N)] = w1m1\n",
660 " W1[i, np.mod(i+1, N)] = w1p1\n",
661 "\n",
662 " W0[i, np.mod(i, N)] = w00\n",
663 " W0[i, np.mod(i+1, N)] = w0p1\n",
664 " W0[i, np.mod(i+2, N)] = w0p2\n",
665 " \n",
666 " \n",
667 " return W0, W1, W2"
668 ]
669 },
670 {
671 "cell_type": "code",
672 "execution_count": null,
673 "metadata": {
674 "collapsed": true
675 },
676 "outputs": [],
677 "source": []
678 },
679 {
680 "cell_type": "code",
681 "execution_count": 5,
682 "metadata": {
683 "collapsed": false
684 },
685 "outputs": [],
686 "source": [
687 "import numpy as np\n",
688 "\n",
689 "def create_grid(N, a = 0., b = 1.):\n",
690 " x, dx = np.linspace(a, b, num = N, retstep = True, endpoint = False)\n",
691 " x += 0.5 * dx\n",
692 " \n",
693 " return x, dx"
694 ]
695 },
696 {
697 "cell_type": "markdown",
698 "metadata": {},
699 "source": [
700 "#### grid setup and FD derivative computation"
701 ]
702 },
703 {
704 "cell_type": "code",
705 "execution_count": 10,
706 "metadata": {
707 "collapsed": false
708 },
709 "outputs": [],
710 "source": [
711 "import numpy as np\n",
712 "\n",
713 "N = 100\n",
714 "a, b = 0., 1.\n",
715 "x, dx = create_grid(N, a, b)\n",
716 "\n",
717 "W0, W1, W2 = assemble_Wj(N)\n",
718 "g0, g1, g2 = 1/6., 2/3., 1/6. # linear weights\n",
719 "\n",
720 "def f1(x):\n",
721 " return np.sin(2 * np.pi * x)\n",
722 "\n",
723 "def df1(x):\n",
724 " return 2 * np.pi * np.cos(2 * np.pi * x)\n",
725 "\n",
726 "f = f1(x)\n",
727 "df = df1(x)\n",
728 "\n",
729 "df_approx = g0 * W0.dot(f) + g1 * W1.dot(f) + g2 * W2.dot(f)\n",
730 "df_approx /= dx"
731 ]
732 },
733 {
734 "cell_type": "markdown",
735 "metadata": {},
736 "source": [
737 "#### plot exact vs. numerical solution"
738 ]
739 },
740 {
741 "cell_type": "code",
742 "execution_count": 11,
743 "metadata": {
744 "collapsed": false
745 },
746 "outputs": [
747 {
748 "data": {
749 "text/plain": [
750 "<matplotlib.text.Text at 0x4c1f690>"
751 ]
752 },
753 "execution_count": 11,
754 "metadata": {},
755 "output_type": "execute_result"
756 },
757 {
758 "data": {
759 "image/png": "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\n+5aY1Mdj5uWRRtu3E6/27UkCtHhAhF+VtV06Nzb2dZYt7Z5gyVbV5e+Reviv1YABAy5yudxewm0z\nM7PXubm5jcV50tK0c5KXksbX5H1eSbOlmxOD27Ujzz4/9sbGhsT/7vcmZO+l6Kkl5VUatbnvGh5f\n4WLMiwGbNwvmOTuTKAUFwhPef1N9Qbbr8i1XYp6nO9LuAZZsVl3+Hhl5ttrdu3fPzMrKar5y5coV\nL1++bOvq6nrt3bt3LT+/DZ6tVoTL5ToLP4oyUUO+JpLuBSHAunULeu7eDTMjIsCttBQ0od8iAKdN\nADxl0Ci1LeMoO6aa6Jqm9DIczO1oYvFIWxuKhb9fWQmql15e75+UnWz9ruhdq9dlT8wK1R/rgUox\nwPZkgI+WoKgIPGdn4E6fDnuGD4fTyspQLYnsTH9fNCTshUhd/h4ZuYYxderUfVOnTt3Xvn37RGVl\n5eqDBw9Oop0JyScWC0ivXnCzVy+4WVUFKlFR0Nv/mu7K+GJzu2rtF8plug81kuGhVXI1WEVuajEE\nkiz+907GbQZoewFAGUB4mCC7tAW/69CX9736WO4cNAgu6OpCYYM+MYRqgZGfMMSBnzCkh6y+Ju9y\nioxP3nk8+uaLWOeM4gwj/YwZ2aUpllplZaAhvI2yMlRXtt+pImicpGCg2fx9Z077mFFOHU/amRnG\n08yO5Fdd/h5xwED1Dl8ThJgDL6Ak5778Sqk8w16IYC9EsBeSgQMGguDgYJ8ZM2aE1eU+UlNTOWw2\nWyAQCPA9hZCMwikpJBGpqakcU1PTtzweT5HNZgs+/xm+JggxB05JoVrj8/kKtDMghKQDDhgNiMPh\npG7atGmhra1tvK6ubqG7u/vxqqoqlfDwcI8ePXrc/vy2bDZb8PbtW1OAT6dA8fLy2jFo0KALWlpa\nJT169Lj94cMHA29v7616enoFrVq1ShOe+gDg65eBFf4sICAgYNSoUacmTpx4SEdHpyg8PNwjICAg\nYOLEiYeEt7lz5073Ly/5CvDjS8UyAc5Vi2AvRLAXkiGXAwZrJYt8rX7m9rV6XBaLnDx5cvTly5f7\np6SkmCQkJNiEh4d7iHPdipMnT45es2bNstzc3CbKysrVXbp0ie7YsePD/Pz8Rr169bq5YMGCzQAA\nAoGA7ebmFmFvbx+blZXV/Pr16y5btmyZd+XKlX7C+zp37tzQ0aNHnywqKtIZP378kc8fPy0trdWg\n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\nDIQQQmL5P4y2C0M/R5zrAAAAAElFTkSuQmCC\n",
760 "text/plain": [
761 "<matplotlib.figure.Figure at 0x47ff1d0>"
762 ]
763 },
764 "metadata": {},
765 "output_type": "display_data"
766 }
767 ],
768 "source": [
769 "%matplotlib inline\n",
770 "import matplotlib.pyplot as plt\n",
771 "\n",
772 "plt.plot(x, df, lw = 2, label = 'exact')\n",
773 "plt.plot(x, df_approx, lw = 2, linestyle = '--', label = 'numerical')\n",
774 "plt.legend(loc = 'best')\n",
775 "plt.grid()\n",
776 "plt.xlabel(r'$x$', fontsize = 14)\n",
777 "plt.ylabel(r'$\\partial_x f$', fontsize = 14)"
778 ]
779 },
780 {
781 "cell_type": "markdown",
782 "metadata": {},
783 "source": [
784 "Figure: non-WENO 4th order central FD estimate of the first (smooth) derivative "
785 ]
786 },
787 {
788 "cell_type": "markdown",
789 "metadata": {},
790 "source": [
791 "Visually, we see the numerical solution lies right on top of the exact derivative. After we set up the WENO framework, we verify the numerical order of convergence for this is the expected order 4."
792 ]
793 },
794 {
795 "cell_type": "markdown",
796 "metadata": {},
797 "source": [
798 "## Test problem (non-WENO): periodic $f_2$ with a discontinuity in the derivative $\\partial_x f_2$\n",
799 "\n",
800 "We consider a periodic function on a domain $[a,b] = [0,1]$ whose first derivative has a discontinuity:\n",
801 "\n",
802 "$$f_2(x) = \\begin{cases}\n",
803 "\\cos (2\\pi x / T) - c & 0 \\leq x < x_L \\\\[.5em]\n",
804 "|x - \\frac{1}{2}| & x_L \\leq x < x_R \\\\[.5em]\n",
805 "\\cos (2\\pi (x - 1) / T) - c & x_R \\leq x \\leq 1\n",
806 "\\end{cases}, \\qquad T = 4\n",
807 "$$\n",
808 "\n",
809 "We design this function by joining the cosine function with the absolute value part at abscissa values that correspond to the two functions having equal slopes $\\partial_x f$.\n",
810 "\n",
811 "That is, we begin with functions $f_{2a}$, $f_{2b}$, $f_{2c}$\n",
812 "\n",
813 "\\begin{eqnarray*}\n",
814 "f_{2a}(x) & = & \\cos (2\\pi x / T) - b \\\\\n",
815 "f_{2b}(x) & = & |x - \\frac{1}{2}|\\\\\n",
816 "f_{2c}(x) & = & \\cos (2\\pi (x - 1) / T) - b\\\\\n",
817 "\\end{eqnarray*}\n",
818 "\n",
819 "Insisting the derivatives are equal fix the value to the abscissa where they should be joined; on the left side we call this coordinate $x_L$:\n",
820 "\n",
821 "\\begin{eqnarray*}\n",
822 "\\partial_x f_1(x_L) & = & \\partial_xf_2(x_L) \\\\\n",
823 "-\\frac{2\\pi}{T} \\sin \\left(\\frac{2\\pi x_L}{T}\\right) & = & -1 \\\\\n",
824 "\\Rightarrow x_L & = & \\frac{T}{2\\pi} \\sin^{-1}\\frac{T}{2\\pi}\n",
825 "\\end{eqnarray*}\n",
826 "\n",
827 "We can proceed similarly on the right-hand side; however, by design we have the right-hand joining coordinate $x_R = 1 - x_L$.\n",
828 "\n",
829 "Finally, we find the offset $c$ on functions $f_1$ and $f_2$ by insisting the function values are equal:\n",
830 "\n",
831 "$$f_{2a}(x_L) = f_{2b}(x_L) \\longrightarrow b = \\cos(2\\pi x_L / T) - |x_L - \\frac{1}{2}|$$\n",
832 "\n",
833 "Again, this turns out to be symmetric about $x = 0.5$, so that the offset $b$ is the same for functions $f_3$"
834 ]
835 },
836 {
837 "cell_type": "markdown",
838 "metadata": {},
839 "source": [
840 "We show two periods for the sake of example [-0.5, 1.5], but will consider one period (i.e. in the domain [0,1]) when assessing the accuracy of the derivative. We plot two periods here just to show that it is a periodic function so periodic boundaries is permissible."
841 ]
842 },
843 {
844 "cell_type": "code",
845 "execution_count": 12,
846 "metadata": {
847 "collapsed": false
848 },
849 "outputs": [
850 {
851 "data": {
852 "text/plain": [
853 "<matplotlib.text.Text at 0x591b0d0>"
854 ]
855 },
856 "execution_count": 12,
857 "metadata": {},
858 "output_type": "execute_result"
859 },
860 {
861 "data": {
862 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZQAAAEMCAYAAADj8ECOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnXlcVXX+/18X7gUERFzY5KJXAQWVTUFQ08hdU9Ixy5ns\nq5ZKi8209+3XTNlMU9m0zWQlmWZaU5ZNLqm4kyuLCiKihgoKyKIoIKJs9/37wzlfyUDvcu79nHvv\n+/l4vB8PD57ldd73cz7v83l/lqMiIjAMwzCMuTiJFsAwDMPYBxxQGIZhGFnggMIwDMPIAgcUhmEY\nRhY4oDAMwzCywAGFYRiGkQWhASU1NXV8WFjYidDQ0IJFixa9dOv/r1u37r6oqKgjMTEx2YMGDTq0\nc+fOkYYeyzAMw1gZIhJizc3NzsHBwacKCwt1jY2NmqioqJz8/Pzw1vvU1dV5SP/Ozc2NCA4OPmXo\nsWxsbGxs1jVhLZTMzMzBISEhp3Q6XZFGo2maMWPGt+vWrbuv9T4eHh5XpX/X1dV5duvW7aKhxzIM\nwzDWRS3qwqWlpYFBQUHF0rZWqy3JyMiIv3W/tWvXTnn55ZffKisrC9i6detYQ49VqVS8BADDMIwJ\nEJHKlOOEtVAMrfCnTJmy9vjx4+EbNmyY/PDDD68y5kaJSMUmj7322muvi9ZgT8b+ZF8q1Uyv1QUG\nlMDAwNLi4uIgabu4uDhIq9WWtLf/8OHD9zQ3N6svXbrURavVlhhzLGM+RUVFOtEa7An2p3ywL5WD\nsIASGxt7sKCgILSoqEjX2Njosnr16geTkpLWt97n9OnTwVLEPHz48EAA6Nq1a5UhxzIMwzDWRVgf\nilqtbl68ePGCcePGbWlpaXF+9NFHl4WHhx9PSUlJBoDk5OSUH374YdrKlSv/R6PRNHl6etZ9++23\nM253rKh7cQRmz569QrQGe4L9KR/sS+WgIrLPvmuVSkXm5gMZhmEcDXPqTp4pzxhEWlpaomgN9gT7\nUz7Yl8pBWMqLUTZEUBUWold6OhLOnEHvwkL02rsXdzk7o6VfP+QnJCDdzw8VonUyjklNDTplZSEu\nOxsxJ04gbO9e3AUAfn6oSEhAer9+yHd2RotonY4Gp7yY/4MIqj17MPzjj/Hkrl2458IF+Nxuf50O\nRRMmYPNTT+Gj8HBwHxZjUcrL4f/pp3j8hx8wLT8f/YjQ7vPt6Ym6oUOxf948LJ0yBWvVajRbU6st\nY07dyQGFQXMz1N98g99/8AGeyc5GjPR3Hx9ckN72pAfy+nW4ZWcjJjMTg+vq4CntO348Up99Fu+P\nHo3tKhXss1AxQsjNReR77+G5b77B75uaoAEAjQZNMTHIjotDlrc3qoEbL0RnzqB3ejoSioqgk47v\n0QPnnnoKHyUnI6VjR1wRdBs2g1l1Jylg/RdL2I1bE69D6ZabSxGDBtFBgAgg8vGhyldfpdcLCihE\nryeVtN+uXbsSWx/X3EzOhw7RwORkWtKhA9VLx//ud/RDWRn5i74vpdut/mT7rV29Su7PPUfvOjlR\nC0CkUpF+6lT6z/btNOraNXK7nS/Lysh/8WJ6MjSUfpHKplZLxZs303jR96V0M6fuFC5eiU5xBGto\nIJeFC+k1jYYaAaKgIDq3bBk90vpBbW23qwAvXqSuf/87/T9PT7oCEHXpQlWrVtHM1gGJzXB/shF+\n/plGhIRQAUDk5EQtTz5Ji0+fpt7G+rKlhZx++onujY2lLCmwzJ5NX1y6RJ1F36NSjQOKzE6xd6uo\nIN+EBDogPWCPP06f1NSQl7nnPXuWeowdS1uk886cSasaGshF9P2y2Y7p9aR66y36X6kM9e9PeZmZ\nFGfueZuaSL1oEb3o6krXpdZKbi5FiL5fJRoHFJmdYs928iT16d2bTgNEPXrQ2Z076R45z6/Xk2r5\ncprj4UF1ANE999DOy5fJW/R9synfmppIPX8+pUjprVdeoTeuXydXOa9x4gT1HTyYMgAiLy+q2b6d\nRom+b6UZBxSZnWKvtncvDevShaoAooED6ZAxfR3GpmgOHaKB/v5UBhD160fHzp6lHqLvX0nGKa9f\n25Ur5DlxIm0EiNzc6NqaNTTNUr68do3cpk+n7wAitZqaVqygWaLvX0nGAUVmp9ijpaXR3W5udA0g\nuvde+unKFfI05nhTKsCiIurZrx8dk1IMRUXUU7QflGIcUG5aXR15DB1K+wCirl3p4r59NNTSvmxp\nIafnn6d/SKm1Tz6hx0X7QSnGAUVmp9ibZWdTtJcX1QBEc+bQ8qYmUlvr2pcvk/ewYbQXIOrTh05W\nVpKPaH+wKccaG0kzYQJtkgaGnDxJfax5/Q8/pD9JKbbvvqPpov2hBOOAIrNT7MlOnaJgPz8qB4ju\nv5++b24mZ2truHyZvCMj6QhAFBtLWbW11FG0X9jEW0sLOc2cSauklsnx4xQmQscbb9ArAJFGQ43b\nttFo0X4RbRxQZHaKvVhZGflLHfCjRtF2czo4zU3RnD9PAb160RmAaPRo2uboo7845UV45hl6HyDy\n8KA6c0ZymetLvZ5Uf/oTfSiHFnswc+pOXhzSTmlqgmb6dHx/5gx6x8bi4I8/YqqrKxpE6QkIQNnW\nrRjr54eK7dsx+vnn8a4oLYx4vvgCcz74AM9oNGhauxZT4uKQJUqLSgV6/308+9BD+PrqVXhMnYof\n77TsENMOoqOhEqOsPdgLL9A7AFH37lRaXk5+ovVIlpFBg6XJlN9+Sw+K1sNmfTtyhCKlASLLltEj\novVI1thIGqm/b8wY2ioiPawEM6fuFC5eiU6xdfvxR5oCEDk7U/OePXSXaD232uLF9CRA5OlJV06c\noL6i9bBZz2pqyEtaDmXOHFouWs+tVlJCgT4+VAkQvfYaLRStR4RxQJHZKbZsp05RcKdOVA0Q/eMf\n9Lxc55Uz56/Xk2rGDPpGmgldV0ceov1mbXPEPhS9nlT330/fA0SRkXTk6lVyV6Ivt22j0SoV6VUq\n0qem0jjRfrO2mVN3ch+KHdHcDPWMGfi2pgadpkzB2ueew3uiNbWFSgX67DPM79sXJ48dQ/+nn8aH\nojUxliclBclr1uD+jh1xZc0a3O/ujnrRmtpi9GhsX7gQC4mgmjkTX1VUwE+0JptBdDRUYpS1VZPW\nQOrRg87awnInR4/SABcXagCItm6lMaL1sFnOioqop7R46Dff0AzReu5kLS3kNGoUbQeIpk+n70Tr\nsaaZU3cKF69Ep9ii5edTuLTw3ZYtNFa0HkPtzTfpZYCoZ08q4vkp9ml6PamkRUOnTaM1ovUYaoWF\npJPWpDNmKRhbNw4oMjvF1qy5mZyHDKH9ANEjj9AyS1zDUjn/xkbSDBxIhwCiJ5+kxaJ9aS1zpD6U\n5ctpjvRZA0t8K8eSvpQGkPj5UfnFi9RVtC+tYebUndyHYgd89BGeOnAAQ7p3x/n33sNzovUYg0aD\npuXL8YhajeaPP8aTu3djhGhNjHycP4/uzzyDDwDgn//En/z9US5akzE8/jg+HTECuysq4CfdB3Mb\nREdDJUZZW7LCQtJJX0zcsIEmidZjqr36Kr0OEIWEUIHcS5azibOpU+k/ANGkSbTBVj+4VlBAIdIz\n5ghffDSn7hQuXolOsSWThmHOmEHfiNZijjU0kEt4OOUDRG+/TS+J1sNmvm3dSmOk+UbFxaQVrccc\ne+cdegEg6tuXTtj7skEcUGR2iq1YWhrdDRC5u9NVSz+w1sj5b9lCY6UK6Px5ChDtX1v3p0hraiJ1\n//6UBxC99Rb9r637sqGBXPr0oZMA0fvv0zOi/WtJM6fu5D4UG6WlBc5/+hP+CQAvvYRFWi1KRGsy\nl7FjsXXyZGyoq4PnK6/g76L1MKaTkoLkY8fQv3dvnLGHeUYuLmiU+idffx2v8Vpf7SA6GioxytqC\npaTQfGnOiVwzjpVgv/xCodJaX1lZFCtaD5vxVlVFXaQvg/74I00RrUcu0+tJNW4cpQJEycm0RLQe\nS5k5dadw8Up0itKtupo6SesN2eMCi9KX9IYNo7222pHryPbUU/QvgGjkSNphb7/fsWPUz9mZmp2c\nqOXIEYoUrccSZrMBZfPmzeP79u17IiQkpODtt9/+TUfsV1999VBkZOSRiIiI3KFDh+47cuTI//2A\nPXv2LIqIiMiNjo7OjouLy5TTKUq3F1+kRQDRXXfRHms9sNbM+VdXUydfX6oAiOz1K3r22ody8iT1\nkSrc3FyKsEdf/vGP9E/puz6i/W0Js8mA0tzc7BwcHHyqsLBQ19jYqImKisrJz88Pb73P/v37h1RX\nV3ciuhF84uPj06X/0+l0hVVVVV0s4RQlW1kZ+UtDGK35ISBrP7SffkqPAUTh4ZRvj8uI22tA+f3v\n6d8A0dy5tNRefVlVRV2kBVjT0uhu0T6X22wyoOzfv3/IuHHjUqXtt95663/feuutdkeDXLp0qXNg\nYGCJtK3T6QovXrzY7sxVew0o0pfl7ruP1orWYklraCAXnY4KAaJVq2imaD1sd7ajR2mASkV6Fxdq\nOHuWeojWY0l7/XV6FSAaPpx221taz5y6U23dIQA3KS0tDQwKCiqWtrVabUlGRkZ8e/svW7bs0YkT\nJ26StlUqFY0ePXq7s7NzS3Jycsq8efOW3nrM7NmzV+h0uiIA8Pb2ro6Ojs5JTExMA4C0tLREALCl\n7QsX4PPpp4mPA8DkyWnr09KQqCR9cm7v35829IEHsPqddxJfWrgQC/3908rUarQoRR9v/3b71Vfx\nOlGiav58fHbmTFrvM2fQW0n65NweNCjtYMeOqN2zJ3H4tm0Y4+KS1qgkfcZsp6WlJa5YsWI2AEj1\npcmIioJr1qyZNnfu3P9rFq9atWrmggULPmpr3507d94THh6ef+nSpc7S386fPx9ARKisrPSJiorK\n2b1793C5oqxS7bHH6FOA6IEHaLW1ry0iRdPURGrpY0yff06Piva/rfvTknboEA0EiNzc6Jq15xCJ\n8uXbb9NLANHgwZRhT60Uc+pOYfNQAgMDS4uLi4Ok7eLi4iCtVvubuRS5ubmR8+bNW7p+/fqkzp07\nX5b+HhAQUAYAPj4+F6ZOnfpjZmbmYOsoF0NhIXotW4ZHnZygX7gQC0XrsQZqNZqle/3rX/FqQwNc\nBUti2uHVV/FXAHjySXwcEIAy0XqswYIFWOzri8rMTAzeuBH3itajCERFwaamJnXv3r1PFxYW6hoa\nGlza6pQ/e/Zsj+Dg4FMHDhxIaP33q1evutfW1nYkItTV1XkMHTp035YtW361ZDvsrIUyZw4tB4ge\nfphWitZiTWtuJmdpxvXHH9MTovWw/dYOHKAEgMjDg+oqK8lHtB5r2gcf0NMAUXQ0Zbe0kJNoPXKY\nOXWnUOGbNm2a0KdPn5PBwcGn3nzzzZeJCEuWLElesmRJMhHh0Ucf/bxLly5V0dHR2a2HB58+fbp3\nVFRUTlRUVE7//v3zpGPlcorS7OxZ6qFWU5OzMzUXFFCIaD3WtjVraJo0ibOxkTSi9bD92iZNog0A\n0csv05uitVjbrl0jt+7dqRQg+uknule0HjnMZgOKUp2iNJNGdv3hD/S1KA0ic/4tLeQUFkbH7WnE\nl730oRw9SgOkvpOKCvJ1RF+++y49J434Ev17yGHm1J28lpfCqapC16VLMQ8AXnwR74jWIwInJ+hf\neAH/AIB33sGLRFCJ1sTc4N138TwAPPIIlvv6olK0HhHMn4/POnVCzZ49GH7gAIaI1iMU0dFQiVFW\nSfbXv9JfAKJx4yhVtBaRdv06uUqphU2baIJoPWyEc+coSK2mJicnajl9mnqL1iPSXn6Z3gSIpkyh\nH0VrMdfMqTuFi1eiU5RiV6+Se7dudAEg2rmT7hGtR7RJ36S4+25KE62FjfDMM/Q+QPTgg/StaC2i\nrbyc/Fxd6bpKRfrjxylMtB5zjAOKzE5Riknfs46Lo0zR49xF56mJCDU15OXlRTUAUXo6xYvWY+v+\nNMeqqqiLhwfVAUSHD1MM+5KQnExLAKJHHqFlorWYY+bUndyHolCam6GWvr/w4ot4R6UCidYkGi8v\n1D7+OD4FbvSliNbjyHz6KR6/ehUeY8ZgW0wMskXrUQLPPYf3VCrQqlV4+Px5dBetRwiio6ESo6wS\n7Pvv6X7pG+v2uDiiqXb+PAW4uFCDSkX6U6coWLQeR7SGBnLx86NygGjbNhotWo+STPokty0PoTan\n7uQWikJZvBgLAOBPf8I/nZ3RIlqPUggIQNnvf49viKD69FM8LlqPI7JmDe6vqIBfRASOjhqFHaL1\nKIlnnsEHALB0KeZdvw430XqsjuhoqMQoK9pycylC+rZ6TQ15idZDpJw8NREhK4tiASJvb7psq1+r\nVJI/jbUhQ2g/QJSSQvNFa1GaL/V6UsXE0GGAaMUKmiVajylmTt3JLRQFIrVOZs3Cl15eqBWtR2nE\nxuJgfDwyqqvh/fXXeEi0Hkfi0CEMOnAAQzp1Qs1DD+Fr0XqUhkoFWrAAiwHgo4/wFDnanCnR0VCJ\nUVakXbpEnd3d6SpAZOvDDy1pX31FDwFEkZF0RPQIOEey2bPpC4DomWfofdFalGr19dShSxeqstXR\niObUndxCURgrVmB2fT3cR4/G9rAwnBCtR6ncfz/W+PqiMjcXkXv34i7RehyBixfR7Ztv8HuVCvTE\nE/hEtB6l0qEDrs2di8+BG60U0XqsCQcUBaHXw+njj/EkcGNpbNF6WiN9kEcpuLqiYf58fAbcTBHa\nEkrzpyEsW4ZHGxrgOmECNoeE4JRoPRJK9OXjj+NTJyfov/sOD1RUwE+0HmvBAUVBbNmCcadPI7hn\nT5ydNAk/idajdB57DEucndHyn//gd6WlCBStx55paYHzJ5/gCUB5LztKRKdD0eTJ2NDUBI20Fp9D\nIDpfp8Q8oCibPJnWA0Rvv00vidZiKzZ9On0HEC1cSK+J1mLPtmEDTQKIgoPplL1898PStm0bjQaI\ntFoqtqW5ZObUndxCUQjnz6P7xo24V61G85w5+EK0HltBSnt98QXm6PVcni3F559jLgDMm4elTk7Q\ni9ZjC4wciZ29e+NMSQm0W7dirGg91oAfQIXw5ZeYpdfD6b77sE6Jy4ArMU8N3HhodToUnT2Lnjt2\nYJRoPYaiVH+2RXk5/H/6CZOcndEyaxa+FK3nVpTqSycn6B99FMuAG/1PovVYAw4oCkCvh5NU4KQC\nyBiGkxP0jzyC5cDNt2hGXr78ErNaWuA8eTI2+PujXLQeW2L2bKxwcoJ+3TrcV1kJX9F6LI7ofJ0S\n84DWtp076R5bzLUqxc6doyAnJ2rRaKjxwgXqJlqPPZleT6rQUPoFINqwgSaJ1mOLJn0i+d136TnR\nWgwxc+pObqEoAKl1MmcOvuB1u4wnKAjF48ZhS1MTNF99hZmi9dgTe/ZgeEEBQrt3x/nx45EqWo8t\nIs1J+fxzzCU7nznPAUUwly+j85o1uF+lAkmpGyWi1Dy1hK09tEr3p4SURpwzB1+o1WgWractlO7L\niROxyd8f5SdOIMzePxHMAUUwX3+Nhxoa4DpqFHbodCgSrcdWmTQJP/n6ovLYMfTPyEC8aD32QHU1\nvL//HtOBG9+MF63HVtFo0CQNZrD7fj7R+Tol5gGtadHRlA0QffstPShai63b88/TPwCiRx+lz0Vr\nsQf75BN6HCAaOZJ2iNZi6/bLLxQKELm709XaWuooWs/tzJy6k1soAsnNRWRODqI7d8blKVOwVrQe\nW0d6i/7+e0y/dg0dROuxdVauxP8A3DqRg9BQFAwfjj319XD/z3/wO9F6LAUHFIFIHcgPPIDvXF3R\nIFrP7VB6nhoAwsNxfNAgHKqthdeGDZgsWs/tULo/CwoQmp6OBA8PXFX6y47SfSnx8MNYBQCrVuFh\n0VosBQcUQbS0wPnf/8YfgJsFjTEfyZc82ss8pO/MTJuGHzw8cFW0Hntg+nR87+KCxp07MdJu154T\nna9TYh7QGrZjB40EiHr1ojP8PQ/5rLyc/JydqVmtpiaek2Ka6fWkCg6mUwDR1q00RrQee7Jp02gN\nQPSPf9DzorW0Z+bUndxCEYTU7J05E1+pVCDReuwFPz9UjBmDbc3NUK9ejQdF67FF0tORcPo0ggMC\nUDZyJHaK1mNPzJyJrwD7TXtxQBFAfT3cf/gB0wDAVj6jait5asA20l5K9qfktz/8Af+2hYm2Svbl\nrUyciE1duuBSbi4ic3MRKVqP3AgNKKmpqePDwsJOhIaGFixatOilW///66+/figqKupIZGRk7rBh\nw/bl5uZGGnqsktmwAZOvXEHHuDhk9e2Lk6L12Bv33Yd1Hh64mp6OhFOnECJajy3R2AgXqWUnvU0z\n8uHigsYHHsB3wM1+KrtCVJ6uubnZOTg4+FRhYaGusbFRExUVlZOfnx/eep/9+/cPqa6u7kRE2Lx5\n8/j4+Ph0Q4+FgvtQpLV9/vUvekq0Fnu1hx+mlfydFONt/XqaDBD170953LdnGdu7l4YBRIGBVKLE\nb8uYU3cKa6FkZmYODgkJOaXT6Yo0Gk3TjBkzvl23bt19rfcZMmTIgU6dOtUAQHx8fEZJSYnW0GOV\nyoUL8ElNxXhnZ7Q8+CBWi9Zjr7Qeokk2sBSLUpBy+w8/jFXct2cZhg7F/l69UFhaisC0NCSK1iMn\nalEXLi0tDQwKCiqWtrVabUlGRka7S2YsW7bs0YkTJ24y5tjZs2ev0Ol0RQDg7e1dHR0dnZOYmJgG\n3My7Wnv7+PHE8OZmqOPj09Lz89HP1zexUqQeQ7c//PDDp5XgP0O3nZ3TWrp0waXTpxODs7IQV1+f\n5q4kfUr0Z309OmzYkDgZAHS6tMK0NCQqSV972637UJSg507bKhXorrvS9hYWote//534h5EjsVO0\n/1asWDEbAKT60mRENavWrFkzbe7cuUul7VWrVs1csGDBR23tu3PnznvCw8PzL1261NnQY6HQlFdi\nIu0CiFaupIdFazHGdu3alShag7H21FP0L4Do+efpH6K12II///1v+j1ANGwY7RWtxdZ9eSfLy6P+\nAFGXLlTV2Ega0Xpamzl1p7CUV2BgYGlxcXGQtF1cXByk1WpLbt0vNzc3ct68eUvXr1+f1Llz58vG\nHKs0ysvh//PPuNvFBY1JSVgvWo8xSG82toTU+fndd3iAFJb2UqI/v/sODwA3/WYrKNGXd6J/fxzr\n1w/5ly6hy86dGClaj2yIioJNTU3q3r17ny4sLNQ1NDS4tNWxfvbs2R7BwcGnDhw4kGDssVBgC2Xx\nYnoSIEpKonWitTiCtbSQU2AglQBE6ekUL1qPkq2mhrxcXem6SkX60lLqLlqPI9jChfQaQPTII7RM\ntJbWZk7dKVT4pk2bJvTp0+dkcHDwqTfffPNlIsKSJUuSlyxZkkxEePTRRz/v0qVLVXR0dHZ0dHR2\nXFxc5u2OlcsplrLhw2k3QPTVV/SQaC3Gmi2mFYgITz9NHwBEzzxD74vWomR/fvUVPQQQjRhBP4vW\nYuu+NNTy8ykcIPL2pssNDeQiWo9kNhtQlOoUS1hJCQWqVKR3daXrSl++ui2z1Yd2/34aIn1eWUlD\nNJXmz6QkWgcQLV5MT4rWYuu+NMYiIigXINq4kSaK1iKZOXUnz5S3Ej/8gGlEUE2ciE0dO+KKaD3G\nYot5agCIj0dGUBCKS0qgTU9Hgmg9EkryZ00NOqWmYrxKBZo2DT+I1mMsSvKlsbTu5xOtRQ44oFgJ\nW+3wtHWcnKCfPh3fA/bz0MrN+vVIamyEy91342d/f5SL1uNISGVz7VpMaWiAq2g95sIBxQqUlEC7\nbx+Gubnh+qRJ+Em0HlNoPdbf1pAmkH7/Pabr9coo80rypxRobXWirZJ8aSx9++JkVBSO1NSg07Zt\nGCNaj7ko4uGyd9aswf0AcO+92OjpiTrRehyNuDhk9eyJs+fPo/u+fRgmWo+SqK6G95YtGOfkBP3v\nfof/iNbjiEhZC3tYHZsDihWQAorUvLVFbDlPrVKBJN9LqzyLRin+3LABk5uaoElMRJqvLypF6zEF\npfjSVKSyuWEDJjc2wkW0HnPggGJhKirgt38/hrq6omHiRGwSrcdRkd6+f/wRU0lhkxxF8uOPmArc\n9A9jfUJDUTBgAPJqatBp1y7cI1qPOXBAsTDr1yOJCKrRo7HdFkd3Sdhynhq4MdrL3x/l586hR04O\nokXrUYI/6+vhnpqK8cCNJf9F6zEVJfjSXKZOxY/Ajc550VrMgQOKhZHeAKUCw4jByQl6qdKUfhNH\nZ9s2jLl2DR3i4pCl1ULxSxfZM1L9sG4d7lPKwBGTED2JRomTc+SymhrycnGhBicnaqmoIF/Rehzd\nUlNpHEA0YAAdFa1FCTZrFq0AiN58k36z0gSbdU2vJ1XPnlQEEO3fT0NEajGn7rTdSGgDbN6MCY2N\ncBk2DPtstcPTnrjnHuzy8kJtXh4GOPqXHJubod6wAZMBbj0rAZUKNGUK1gK2nfbigGJB7CndZQ95\nahcXNN57LzYC4h9a0f7cvRsjLl1Cl759cTIsDCdEajEX0b6UC6mesOWBIxxQLERDA1w3bcJEAJDe\nPBjxtH5oRWsRiT297NgLw4ZhX7duuFhQgND8fPQTrcckROcOlZgHlMM2bqSJAFFUFOWI9gXbTaut\npY7SMu1lZeQvWo8I0+tJpdVSMUCUkUGDRethu2lz5tBygOhvf6M/i9JgTt3JLRQLIaVU+A1QWXTs\niCujR2M7EVTr1yNJtB4RHDqEQSUl0HbvjvOxsTgoWg9zE1sfPswBxQLo9XBatw73AfYTUOwlTw0o\nI+0l0p9SZTVlCtY6OUEvSodc2FPZHDMG2zw8cPXQIQw6dw49ROsxFg4oFiArC3GVlfDV6VAUEYGj\novUwv2byZGxQqUA7d2JkXR08ReuxNtLoLluezGivuLnh+rhx2AIAGzfiXtF6jIUDigX46SdMAm5W\nXKL1yIGtr5fUGl9fVMbHI6OxES47dmCUCA2i/HnuHHrk5iLS0xN1d9+Nn0VokBt7KpvAjXoDuBn4\nbQkOKBZAKgi2ulS9IyD9Nrb40JqD9LIzdiy2urqiQbQe5rdMmIDNUgv66lV4iNZjDBxQZKa4GEFH\njiDKwwPJ1t64AAAgAElEQVRX7eUNELCvPDVwM6Bs3Ih7RSx1IcqfUkCxp5cdeyubfn6oGDwYmQ0N\ncBXVgjYVDigyI+U9+Q1Q2URGIlerRUl5OfwPH8ZA0XqswdWr8Ni5EyMBgFe+VjZSwJdeAGwFDigy\nY49vgID95alVKpDIh1aEP3fswKiGBrgOHoxMPz9UWPv6lsLeyibw64BCNjRr3uSAcvny5c4VFRV+\ner2eg9J/qa+Hu9RE5TdA5WOrb4GmYq8vO/ZIVBSOaLUoKStDgC21oI0KBmvWrLk/KSlp/YABA/JG\njRq1Y9q0aT9EREQcjYuLy3rhhRf+cebMmd6WEmoL7NyJkdevw23wYGT6+6NctB45sbc8NQCMHImd\nHTrg2qFDGHT+PLpb89rW9icRVK1HH1rz2pbGHsum6Ba0qRgUUAoLC3s99NBDX1++fLnzkiVLHsvL\nyxtw+PDhgXv37r3r2LFj/dPT0xMeeOCB7z799NPHX3/99dcsLVqp8BugbdGhA66NHo3tACCtu2av\nZGcjpqwMAYGBKI2KwhHRepg7Y4sB5Y5rs5w9e7bHW2+99b/Nzc3Ohqzlcvr06d7vvffes6LXxIGV\n1/LS60kVGEglANHhwxQj+v7ZDLOUFJoPEN13H60VrcWS9vrr9CpAlJxMS0RrYTPM6uupQ4cOVA8Q\nnT9PAda6rjl1pwE3Vd/B2JNeu3bNTfSPYe2Akp1N0QBR9+5UqteTSvT9sxlmJSUUCBC5u9PVa9dI\neLm1lMXFUSZAtGEDTRKthc1wmzSJNgBES5fSXGtd05y6844prw4dOly79W+FhYW9Kioq/No7xs3N\n7bqpLSZbRUqZ3HsvNtrL7PjW2GOeGgACA1EaHY2c+nq4796NEda6rjX9WVkJ36wsxLm6omHkSOy0\n1nWthb2WTeBGfQLc+FifaC2GYNIIrWefffb955577j0AqK2t9frXv/71xwsXLvjIK822SE3FeODG\nLFfRWhjjkH4z6Te0N7ZuxVgASExEmrs76kXrYQxn/HikAsD27Rjd1ASNaD13xJRmTUpKyvzW23q9\nXvXxxx8/Yex5Nm/ePL5v374nQkJCCt5+++2Xbv3/48ePhyUkJBxwdXW9/u677z7X+v969uxZFBER\nkRsdHZ0dFxeXKWezzVirrqZOzs7UrFZTU3U1dbLWddnksZ9/phEAUXg45YvWYgl76CH6CiD64AN6\nWrQWNuMtLIyOA0S7d9Nwa1zPnLrTpBaKl5dXbUJCQvo777zz4qFDhwYRker69etuxpyjpaXFecGC\nBYtTU1PH5+fn9/vmm29+f/z48fDW+3Tt2rXqo48+eur5559/99bjVSoVpaWlJWZnZ8dkZmYONuU+\n5GLHDoxqaYHz0KHY36kTakRqYYxnyBAc6NgRV44fR/jZs+gpWo+c6PVw2rIF44Cbb7uMbSH9brbQ\ngjYpoKSnpye88sorf6+trfV6/PHHP3V3d683doJjZmbm4JCQkFM6na5Io9E0zZgx49t169bd13of\nHx+fC7GxsQc1Gk1TW+cgIkXMIJXym/b8wNpznlqjQZM0fFiqfC2Ntfx5+DAGXryIbj174mzfvjhp\njWtaG3sum4BtBRS1KQdFRkbmTp48ecPkyZM3vPHGG38uKirS/fTTT0aNlS4tLQ0MCgoqlra1Wm1J\nRkZGvKHHq1QqGj169HZnZ+eW5OTklHnz5i29dZ/Zs2ev0Ol0RQDg7e1dHR0dnSMt0yAVQnO37747\n8ecbP3QaunXDBSARcp5fKds5OTnRStIj93avXmlnACA1NXH8/Pn4zF78uXdv4l0AEBmZlvvzz7hb\nKf7mbcO3R4zAbheXtMbDhzGwoiLRz88PFXKePy0tLXHFihWzAUCqL03GlDzZvn37hi5fvnxOY2Oj\nhojwwQcfPL1gwYKPjDnHmjVrps2dO3eptL1q1aqZ7Z1j4cKFr93ah3L+/PkAIkJlZaVPVFRUzu7d\nu3+VX4SV+lDy8qg/QOTnR+UtLeRkjWuyyW9nz1IPgKhjR6ptbCSNaD1y2bBhtBcg+vFHmiJaC5vp\nNn48bQaIVq6khy19LXPqTpNSXkOHDt0/ffr071taWpwBIDg4+PSgQYMOGXOOwMDA0uLi4iBpu7i4\nOEir1ZYYenxAQEAZcCMtNnXq1B9F9aNIzdBx47DFyQ4+p+qo9OiBc/36If/KFXQ8cABDROuRg8uX\n0fnAAQxRq9Fsj8OFHQlbSXuZvLCjp6dnnTTfZPLkyRtmz569wpjjY2NjDxYUFIQWFRXpGhsbXVav\nXv1gUlLS+rb2pVv6Surr692vXLnSEQCuXr3qsXXr1rERERFCPrUr/cD23H8C2H+eGrDuQ2sNf+7Y\ngVF6PZyGDcM+Ly/UWvp6onCksrllC8a1tMBZtJ72uGNAKSgoCC0oKAg15qSG9Keo1ermxYsXLxg3\nbtyWfv365T/44IOrw8PDj6ekpCSnpKQkA0B5ebl/UFBQ8QcffPDMG2+88ecePXqcq6ur8ywvL/cf\nPnz4nujo6Jz4+PiMSZMm/TR27NitxmiUg6tX4bF7N0aoVKAxY7DN2tdn5MVW3gINxVFedhyBPn3w\ni06HoqoqdFX06sOG5MU+/vjjJ1auXPlwS0vLbfsIysrK/P/f//t/fz9y5Eik6JwjrNCH8tNPdC9A\nNHgwZYi+Xzbz7do1cpPWTiorI3/Resyx1mvLZWdTtGg9bObbY4/RpwDRX/9Kf7HkdcypOw0a5fXE\nE098smPHjlFTpkxZGxgYWBoXF5fl6+tb6ebmdv3y5cudz50712Pfvn3D/P39y1999dW/+vv729XS\n7e3Bb4D2hZsbrt9zD3Zt2oSJW7Zg3KxZ+FK0JlM5dgz9S0sR6O+Pcl5d2D4YPx6pS5bgsc2bMeEv\nf8HfROtpC4P7UPbs2TP8lVde+fsTTzzxSW1trVdaWlrimjVr7s/NzY0MCAgoW7Zs2aOffPLJE44S\nTICbS1qMG4ctorVYGkfIUwM3f8tt2zDGktextD+lsjl2LLba49pyrXGUsjlyJHaq1WjOyEB8TQ06\nidbTFgbPQ6mrq/NsamrSREREHD148GDs008//aElhSmdc+fQ45df0KdjR1wZPBiZovUw8iD1hW3f\njtFEUNlqZSwFRO7bsx86dsSVhASk792Lu3btwj1TpmCtaE23YnALpbm5Wb1kyZLHli9f/siJEyfC\nSCGz1EWxfTtGA8A992CXWo1m0XosjTQhyt4JC8OJ7t1xvqICfnl5GGCp61jSnw0NcJVWTh41Cjss\ndR2l4ChlEwCkFR2k+kdpGBxQ3n333ecnTZr00549e4YvXbp0nre3d3VCQkL6Y489tiQlJSU5Kysr\nzpGCjPSD8hugfdF6xJ5SH9o7kZ6OhPp6uA8YgLyAAJSJ1sPIh9LLpsEBRa1WN8+YMePbL774Ys6z\nzz77fkVFhd/HH3/85ODBgzOPHTvW/9lnn31fp9MVPfHEE59cvHixmyVFi0avh5P0g0pvDPaOo+Sp\ngZu/qSX7USzpT0k3l037Iy4OWR074srJk+hbXIygOx9hZUwZGnblyhXPtv7e0tLilJ6eHv/KK6+8\nIXqIHSw4bDgnh6IAosBAKnGUrzPu2rUrUbQGa9n58xQgfcWxoYFcbM2f8fGUDhBt3EgTRfvSGuZI\nZZOIMHkyrQeIli+nOZY4vzl1p0kz5T09Peva+ruTk5N+8uTJGyorK31ND3HKp3W6y1Y7bY3FkfLU\nAQEoGzAAefX1cLfUMiyW8ufly+iclYU4jQZNI0ZgtyWuoTQcqWwCN9Nelh6JaAomrTZ8Ow4fPjzQ\n1dW1Qe7zKglHSyk4IqNHY3teHgZs347Rd9+Nn0XrMZS0NCTq9XC66y7s9fREmy9+jG3TumNer4eT\nktYQNHktr/bQarUlPj4+F+Q+r1JoPYLGkQKKI+WpAcu/BVrKn474suNoZTMsDCcCA1F64QJ8jh5F\nhGg9rZE9oNg7Bw5gyLVr6BARgaN+fqgQrYexDCNGYLdajeasLMRVV8NbtB5D4dGH9o9KBVLq8GEO\nKEbiiG+AgOPlqT09UTdkCA7o9XDatQv3yH1+S/jz7Fn0LChAaKdOqImNxUG5z69UHK1sAtYZiWgK\nHFCMhN8AHQelj/m/FUebbOvISAFl926MaGiAq2g9EhxQjKC6Gt4HDyJWo0HT8OHYI1qPNXG0PDVg\n2VnJlvCno82NknDEsunvj/IBA5B37Ro6KOmDcBxQjGD3bozQ6+EUH48MHkFj/8TG4qCnJ+p++QV9\nSksRKFrP7SCCSkrN8dcZHQNpWR1LpGRNhQOKEezciZGAYz6wjpinbj2XQ+6HVm5/Hj+O8IoK+Pn7\nozwsDCfkPLfSccSyCdxIbQIcUGwW6YeTfkjG/lHiQ9sWrcumo0y2dXRGjMBulQokrd0mWg/AAcVg\nLl5Et9xcRLq6oiEhAemi9VgbR8xTA5YLKHL705Ffdhy1bHbujMsxMchuaoJm3z4ME60H4IBiMD//\njLsBYOhQ7Hdzw3XRehjrEB2NHG9vVBcWoldREXSi9bSFXg+ntDQkAo4ZUBwZKf2ulBY0BxQDceT+\nE8Bx89TOzmiRll6R86GV059HjyKiqgpdg4JQHByM03Kd11Zw1LIJKC8lywHFQBw5peDoKO2hvRXu\nP3Fchg/HHmdntGRlIe7KFXQUrYcDigGUl8P/+HGEu7ujPi4OWaL1iMBR89TArwMKEWT5iJyc/nT0\nlx1HLpsdO+JKXByyWlrgvGcPhovWwwHFAKT89F13Ya+LCxoFy2GszIAByOvaFVUlJdCePo1g0Xpa\n09ICZ6l/z1EDiqOjpBY0BxQDkPpPHPmBdeQ8tZMT9ImJSANulgVzkcuf2dmIqalBp169UNizJ87K\ncU5bw5HLJsABxebgGciM0kbTSHDZZIYNwz6NBk3Z2YgRvTI2B5Q7UFIC7alTCOnYEVcGDsRh0XpE\n4ch5akD+fhS5/Ono/ScAl013d9QnJCBdr4eT9K0mUXBAuQPSAyt9H0O0HkYMYWE44e+P8ooK+J04\ngTDRegCguRlqqSNWSskxjolS0l4cUO6A1OHp6A+so+epVSqQNB9FKhPmIIc/Dx/GwLo6eIaGoiAw\nEKXmns9WcfSyCdysn+Qom+YgNKCkpqaODwsLOxEaGlqwaNGil279/xMnToQNGTLkgJub2/X33nvv\nOWOOlQupCSktEsg4LlIZEJ1WkOCyyUjExyNDo0FTTg6ia2rQSZgQIhJizc3NzsHBwacKCwt1jY2N\nmqioqJz8/Pzw1vtUVlb6ZGVlxb7yyitvvPvuu88Zc+yNWzNP4/nzFAAQeXhQXVMTqUX5Sgm2a9eu\nRNEaRFteHvUHiAIDqUSvJ5Vof06eTOsBopUr6WHRvhFpXDZv2LBhtBcg2riRJppzHnPqTmEtlMzM\nzMEhISGndDpdkUajaZoxY8a369atu6/1Pj4+PhdiY2MPajSaJmOPlQPpDXDYMOzj/hMmPBzHu3ZF\nVWkpAs+cQW+RWlpPZOMWCgPcLAci015qURcuLS0NDAoKKpa2tVptSUZGRrycx86ePXuFTqcrAgBv\nb+/q6OjoHCnfKo0Mud32N99gBpCIu+/Gz4bsb8/b0t+UokfU9ogRibt//BFTP/ssbd6ECUgV5c8V\nK9JmV1fDu0ePxHM9e+KsUvwjYjsxMTFNSXpEbXt7oxpIxO7dGGHM8WlpaYkrVqyYDQBSfWkyoppn\na9asmTZ37tyl0vaqVatmLliw4KO29l24cOFrrVNehhwLGVJe/ftTHkC0Zw/dJbo5y6YM++ADehog\nmjWLVojU8c9/0h8BoocfppWifcKmDKutpY5OTtSiVlNTXR15mHoec+pOYSmvwMDA0uLi4iBpu7i4\nOEir1ZZY+lhDuXgR3Y4dQ383N1x31PW7WiO90Tg60kgvczvmzfUnd8jfhMvmDaS5cs3NUIv6zryw\ngBIbG3uwoKAgtKioSNfY2OiyevXqB5OSkta3tS8RqUw91lSk/HRCAtJdXdEg57kZ2yUyErleXqgt\nLESv4mIE3fkI+SGCigMK0xbC+1FENtE2bdo0oU+fPieDg4NPvfnmmy8TEZYsWZK8ZMmSZCJCWVmZ\nv1arLfby8qrx9va+HBQUdO7KlSue7R0rV7ONiPD00/QBQPTqq/S66KYsm7Js4kTaCBB99RU9JOL6\n+fkUDhD5+1OZuaPN2OzL1q2jJIBoxAj62dRzmFN3CneApczcgDJwIB0CiHbsoJGi74VNWbZoEb0I\nEM2fTykirr9kCSUDRA88QKtF+4JNWVZVRV1UKtK7utL1a9fIzZRzmFN38kz5NqipQaecHERrNGhy\nxO/HtwXnqW8iR1rBHH9K15X6cxwdLps36dIFlyIicLShAa6ZmRhs7etzQGmDffswTK+HU1wcstzd\nUS9aD6MsBg3CIXd31J88ib4VFfCz5rWJ+0+YOyByRQcOKG0gvQHyA3uT1vMnHB2NBk1Dh2I/YPpD\na6o/z5xB79JSBHbpgkv9+iHflHPYG1w2f43IjnkOKG3AM5CZOyHX8GFjkcrm8OHY4+QEvTWvzdgG\nUr21fz+GNjVBY81rc0C5hWvX0OHgQcSqVCDpLZThPPWt3HUX9gI30qOmHG+qP/fuxV3AjYBiyvH2\nCJfNX+Pnh4rQUBTU18P9yBFEWfPaHFBuISsLcU1N0ERGIrdTJ9SI1sMok8GDkalWo/nIEUTV1sLL\nWteVAooU0BimLaTyIZUXa8EB5Rb4gW0bzlP/Gnd31A8ahEN6PZzS05Fg7PGm+PPCBficPIm+HTrg\nWkwMso093l7hsvlbOKAoBOkHGDYM+0RrYZSNVEZMTXsZy/79GArc+PaFiwsarXFNxjZpHVBIhk9W\nGwoHlFbo9XCSHlpuofwazlP/FnPeAk3xJ7/stA2Xzd8SGooCHx9cqKiAnzU/tcABpRXHjqF/TQ06\n9eiBc0FBKL7zEYwjI1Xs6elIsMZoGk7HMoaiUoGk8mnNtBcHlFbwA9s+nKf+Lb6+qOzTB7/U18M9\nJwfRxhxrrD+vXUOHQ4cwSKUCDRmCA0YJtXO4bLaNiH4UDiit4IDCGIu1+lF49CFjLBxQBMM56vbh\nPHXbmPrQGutPftlpHy6bbRMTg+wOHXDtxAmEXbgAH2tckwPKfzl3Dj3OnUOPTp1Q078/jonWw9gG\n1hpNwwGFMRYXFzTGxyMDuDlC0NJwQPkvUspi6FDsd3ZGi2g9SoPz1G3TejTN6dMINvQ4Y/zZ0gJn\nqULg1vNv4bLZPtZOe3FA+S9SQOE3QMYYrDGahkcfMqZi7hJBxsIB5b9w/8nt4Tx1+5jy0BrjT37Z\nuT1cNtsnIQHpKhXo4EHEXruGDpa+HgcU3PigVm4uIjUaNMXFIUu0Hsa2kCp6aSVgueH+E8ZUOnVC\nTWQkcpuaoLHGB7c4oADIyEA8EVQxMcjmD2q1Deep2ycmBtlubrh+8iT6VlWhqyHHGONPqf+EV79u\nGy6bt0fKuhw4gCGWvhYHFNx0ND+wjCm4uKBRatmaslDk7Th/Ht2LiqDr2BFXBgxAnpznZhwDaSIs\nBxQrwW+Ad4bz1LdHKjuGDs801J9SJZCQgHQefdg2XDZvT+uyaemFIh0+oLRefpyXtGBMRSo7co/3\nl87HZZMxlV69UOjri8qLF9HNmKHtpuDwASU/H/1qa+EVFIRirRYlovUoFc5T3x6pws/MxGBDFoo0\n1J+cjr0zXDZvT+uvz1p6gqPDBxR+YBk58PVFZUgITtXXwz03F5FynPP6dbhJC0JKM54ZxhSs1Y/i\n8AGFUwqGwXnqOyO9lBjy0Briz8OHMbCxES79++OYtzeqZZBol3DZvDPcQrES3EJh5ELuh5YHizBy\nMWgQDqnVaM7Lw4DaWnhZ6joOHVCqqtD15En0dXPD9agoHBGtR8lwnvrOGBNQDPEnBxTD4LJ5Zzp0\nwLWBA3FYr4eTJSc4OnRAkUZ3xcUhi7/RzZhLv37I9/JC7dmz6FlaikBzzkUEFbeeGTmxRj+KQwcU\n7j8xHM5T3xlnZ7RIned3emjv5M+iIujKy+HfrRsuhoTglIwy7Q4um4ZhjX4UoQElNTV1fFhY2InQ\n0NCCRYsWvdTWPn/84x//FRoaWhAVFXUkOzs7Rvq7TqcrioyMzI2JickePHhwpinX5zdARm7kemhb\nv+yoVCA5tDGOjfTinJ6OBL3eQnU/EQmx5uZm5+Dg4FOFhYW6xsZGTVRUVE5+fn546302btw4ccKE\nCZuICOnp6fHx8fHp0v/pdLrCqqqqLu2d/8attX/9piZSu7vTVYCoooJ8RfmBzb5syxYaCxDFx1O6\nOed54gn6GCB66y36X9H3xGY/ptVSMUB07Bj1a2+fO9WdtzNhLZTMzMzBISEhp3Q6XZFGo2maMWPG\nt+vWrbuv9T7r169PmjVr1pcAEB8fn1FdXe1dUVHhJ/0/EZm8jMDRo4ior4d7cDBO+/qi0vQ7YZib\nxMcjQ6UCHT6MgeYsF84d8owlsHQ/itoSJzWE0tLSwKCgoP/7WJBWqy3JyMiIv9M+paWlgX5+fhUq\nlYpGjx693dnZuSU5OTll3rx5S2+9xuzZs1fodLoiAPD29q6Ojo7OkUaEfPll2v8AwJAhiQeAm3lY\n6f95+9fbH3744dOt/Sdaj5K3BwxA3tGjaRGff465Tz2V+JGx/qyrg+eRI2mRzs5oiY1NPCj6fpS+\n3boPRQl6lLw9dGji/u+/x/Qffkj7XXAwTkv+W7FixWzgRlcCzEFU02vNmjXT5s6du1TaXrVq1cwF\nCxZ81HqfSZMmbdi7d+8waXvUqFHbDx06NJCIUFpa2p2IUFlZ6RMVFZWze/fu4cY02x5+mFYCRB9/\nTE+Ibobagu3atStRtAZbsfnzKQUgeucdesEUf+7YQSMBothYyhJ9L7ZgXDYNtwMHKAEg6t+f8trb\n50515+1MWMorMDCwtLi4OEjaLi4uDtJqtSW326ekpEQbGBhYCgDdu3c/DwA+Pj4Xpk6d+mNmZqZR\nY6ulIcO8pIVhSG86zJ0xpGP+dv7kdJdxcNk0nOho5Gg0aJLWMJT7/MICSmxs7MGCgoLQoqIiXWNj\no8vq1asfTEpKWt96n6SkpPUrV678HwBIT09P8Pb2rvbz86uor693v3LlSkcAuHr1qsfWrVvHRkRE\nHDX02lVV6FpQgFA3N1yPjESuvHfGODqtl2AhE5YL54DCWAo3N1yPiUE2EVRZWYiT+/zCAoparW5e\nvHjxgnHjxm3p169f/oMPPrg6PDz8eEpKSnJKSkoyAEycOHFT7969z4SEhJxKTk5O+eSTT54AgPLy\ncv/hw4fviY6OzomPj8+YNGnST2PHjt1q6LWlmaKDBuGQRoMmy9yhfdE6T83cnpAQnOrWDRcrKuBX\nWIhebe3Tnj/5cwrGw2XTOKSsjNwfgwMEdsoDwIQJEzZPmDBhc+u/JScnp7TeXrx48YJbj+vdu/eZ\nnJycaFOvm5GBeODGR4tMPQfDtIdKBRoyBAc2bMDk/fsxtHdvnDH02JMn0ffyZXQODERpUBCK73wE\nwxhHQgLSP/oIT0n1oJw45Ex57j8xHs5TG8edhme250+e0Gg8XDaNo3ULxZSU7O1wuIDSenE0bqEw\nlsLUGfO8egNjaXr3xplu3XDxwgX4FBVBJ+e5HS6gFBQg9PJldA4IQBl/odFwOE9tHHFxyHJ2Rktu\nLiLr6uB56/+350/ukDceLpvG0fqDbXL3ozhcQGndf8IpBcZSuLujPjoaOcYsF37pErocP45wV1c0\nxMQg29IaGcdFys7I3Y/icAGF+09Mg/PUxnO7tFdb/pQe7thYHHThzykYDJdN4+EWikzwCC/GWhi7\nbhJ/ToGxFoMHI1OlAmVnI6ahAa5yndehAkp9PdxzcxHp5AT9oEE4JFqPLcF5auNpPcHx1uXC2/In\nd8ibBpdN4+nUCTVhYTjR2AiXI0cQJdd5HSqgHD6Mgc3NUA8YgDxPT9SJ1sPYNz164Fz37jh/+TI6\n//IL+txu3+ZmqKXWM7dQGGtgibSXQwUUTneZDuepjUea4Aj8th/lVn/m5WFAXR08e/VCob8/yq0o\n0+bhsmkaluiYd6iAwh3yjLUxdD6KlO7i1gljLbiFYibS8E0OKMbDeWrTaK9j/lZ/8vwT0+GyaRoD\nBiDP3R31Z86g98WL6CbHOR0moFRUwO/cOfTw9ERdWBhOiNbDOAYDB+Kwiwsa8/PR7/JldG5vPw4o\njLVRq9E8cCAOA4BcKw87TECRHBYbi4POzmgRrcfW4Dy1abi6oiE2FgeBX+eqW/uzogJ+Z86gt4cH\nrkZEwODPMDA34LJpOoMHIxPggGI0UrorLg5ZorUwjkV7HfMSUjps8GBkqtVotqY2xrGR6kNDV3O4\nEw4TUKQILEVkxjg4T206reejSH9r7U+ef2IeXDZNp3ULRY6Vhx0ioBBBxS0URhRSCyU9HQktLXC+\n9f95hjwjil69UNi1K6oqK+F77hx6mHs+1X8/Sm93qFQqIiIVAJw5g97BwTjt64vK8nL486KQjLXp\n1QuFRUXQ5eQgOioKR6S/NzbCxcsLtQ0NcL14Ed26dkWVSJ2M4zFhAjanpmL8d9/hgenT8X3rutNY\nHKKF0rp1wsGEEUFbaS8AyMlBdEMDXMPCcIKDCSMCKWsjR8e8QwUU7j8xHc5Tm8etHfOSPzndZT5c\nNs1Dqhfl6Jh3iIDCHfKMaNproXCHPCMaqYVy6BAGtdXHZwx234fS3Ay1lxdqr11DhwsX4NOtGy6K\n1sY4Hs3NUHfqhJr6erhXVMDP1xeVABAUhOKSEmjz8jCgf38cE62TcUx69sTZc+fQIy8PAwYMUOVx\nH0o75Oej37Vr6CB9R1m0HsYxUavRLLWQpVZJcTGCSkqg7dQJNeHhOC5WIePIyDXB0e4DCg8XlgfO\nU5tP67RXWlpaYusFIZ2coBerznbhsmk+ck1wVMsjR7lw/wmjFKSO96++wsxDhzCoshK+rf/OMKKQ\nqwRMUywAAAd+SURBVIVi930oMTHIzslB9O7dGDF8OPaI1sU4LpcuoUtgIEqvX4db67/v2YPhd92F\nvaJ0McyVK+jYqRNq1Go0NzWpNKb2odh1QKmvJ/eOHXGFCKraWnh5eOCqaF2MY5OdjZhjx9Bf2g4I\nQNmoUdghUhPDAED//jiWn49+gArcKd8GeXkY0NIC5/79cYyDiXlwnloeYmKQPXMmvtJq00pmzsRX\nHEzMh8umPMjRz2zXASUuDlmVlfD9+ms8JFqLrZOTkxMtWoM9wf6UD/alPPzlL/hbURF05pxDaEBJ\nTU0dHxYWdiI0NLRg0aJFL7W1zx//+Md/hYaGFkRFRR3Jzs6OMeZYAPDxwQX+xoT5VFdXe4vWYE+w\nP+WDfSkPwcE43bMnzppzDmEBpaWlxXnBggWLU1NTx+fn5/f75ptvfn/8+PHw1vts2rRp4qlTp0IK\nCgpCP/vss/mPP/74p4YeyzAMw1gXYQElMzNzcEhIyCmdTlek0WiaZsyY8e26devua73P+vXrk2bN\nmvUlAMTHx2dUV1d7l5eX+xtyLCMvRUVFOtEa7An2p3ywL5WDsHkopaWlgUFBQcXStlarLcnIyIi/\n0z6lpaWB58+f736nY4EbI70spd8R+fLLL2eJ1mBPsD/lg32pDIQFFEMre1OHr5l6HMMwDGMawgJK\nYGBgaXFxcZC0XVxcHKTVaktut09JSYlWq9WWNDU1ae50LMMwDGNdhPWhxMbGHiwoKAgtKirSNTY2\nuqxevfrBpKSk9a33SUpKWr9y5cr/AYD09PQEb2/vaj8/vwpDjmUYhmGsi7AWilqtbl68ePGCcePG\nbWlpaXF+9NFHl4WHhx9PSUlJBoDk5OSUiRMnbtq0adPEkJCQUx4eHle/+OKLObc7VtS9MAzDMACI\nyG6sqqqqy+jRo7eFhob+MmbMmK2XL1/2bmu/nj17FkVERORGR0dnx8XFZYrWrSTbvHnz+L59+54I\nCQkpePvtt19qa5+nnnrqXyEhIQWRkZFHDh8+HCNas5LtTv7ctWtXopeXV010dHR2dHR09t/+9rc/\ni9asVJszZ85yX1/figEDBhxtbx8um/L505SyKfym5LQXXnjhnUWLFr1IRHj77bdfeumll95uaz+d\nTldYVVXVRbRepVlzc7NzcHDwqcLCQl1jY6MmKioqJz8/P7z1Phs3bpw4YcKETUSE9PT0+Pj4+HTR\nupVqhvhz165diZMnT14vWqst2O7du4cfPnw4pr0KkMumvP40pWza1dIrreetzJo168u1a9dOaW9f\n4lFgv8HUuUEVFRV+YhQrG0PnS3FZNIzhw4fv6dy58+X2/p/LpnHcyZ+A8WXTrgJKRUWFn5+fXwUA\n+Pn5VbRXmFQqFY0ePXp7bGzswaVLl86zrkrl0t68nzvtU1JSorWmTlvBEH+qVCrav3//0KioqCMT\nJ07clJ+f38/6Su0DLpvyYkrZtLkPbI0ZM2ZbeXm5/61///vf//5K622VSkXtzXXZt2/fsICAgLIL\nFy74jBkzZltYWNiJ4cOHO/y3UkydG8QTSNvGEL8MHDjwcHFxcZC7u3v95s2bJ0yZMmXtL7/80sca\n+uwRLpvyYUrZtLkWyrZt28YcPXo04lZLSkpa7+fnVyEFm7KysgBfX9/Kts4REBBQBgA+Pj4Xpk6d\n+mNmZqZZn720F0ydGxQYGFhqTZ22giH+7Nix4xV3d/d6AJgwYcLmpqYmzaVLl7pYW6s9wGVTXkwp\nmzYXUG5HUlLSemkJhi+//HLWlClT1t66T319vfuVK1c6AsDVq1c9tm7dOjYiIoJXI4Z5c4PEKFY2\nhvizoqLCT3qrzszMHExEqi5dulwSo9i24bIpLyaVTdEjDeS0qqqqLqNGjdp+67Dh0tLS7hMnTtxI\nRDh9+nTvqKionKioqJz+/fvnvfnmmy+L1q0k27Rp04Q+ffqcDA4OPiX5ZsmSJclLlixJlvZ58skn\nFwcHB5+KjIw8cujQoYGiNSvZ7uTPxYsXP9m/f/+8qKionCFDhuw/cOBAgmjNSrUZM2Z8ExAQcF6j\n0TRqtdriZcuWPcJl03L+NKVs2u0ngBmGYRjrYlcpL4ZhGEYcHFAYhmEYWeCAwjAMw8gCBxSGYRhG\nFjigMAzDMLLAAYVhGIaRBZtbeoVhbJX9+/cPPXHiRFhubm5kQkJCem1trdfmzZsnvP/++8/26tWr\nULQ+hjEXbqEwjBWoq6vzPHnyZN9HHnlk+ahRo3Z8+OGHT8+fP/8zDw+Pq9LyFgxj6/DERoaxAtev\nX3dzdnZu0Wg0TX/+85/f8PLyqn3xxRffEa2LYeSEWygMYwXc3NyuazSaJgDYunXr2FGjRu0AgNra\nWi+xyhhGPjigMIwV2LBhw+QPP/zw6aKiIl1ubm5kTExMNhGpVqxYMVu0NoaRC055MYwVWLFixexD\nhw4N6tu378nr16+7OTk56d3c3K5Pnz79ex8fnwui9TGMHHBAYRiGYWSBU14MwzCMLHBAYRiGYWSB\nAwrDMAwjCxxQGIZhGFnggMIwDMPIAgcUhmEYRhY4oDAMwzCywAGFYRiGkYX/Dwp5yzqpQCcsAAAA\nAElFTkSuQmCC\n",
863 "text/plain": [
864 "<matplotlib.figure.Figure at 0x3c7f110>"
865 ]
866 },
867 "metadata": {},
868 "output_type": "display_data"
869 }
870 ],
871 "source": [
872 "%matplotlib inline\n",
873 "import matplotlib.pyplot as plt\n",
874 "import numpy as np\n",
875 "\n",
876 "def f2(x, T = 4.):\n",
877 " #cutoffs\n",
878 " xL = np.arcsin(T / (2* np.pi)) * T / (2 * np.pi)\n",
879 " xR = 1. - xL\n",
880 " yoffset = np.cos(2 * np.pi * xL / T) - np.abs(xL - 0.5)\n",
881 "\n",
882 " # function does not if x is contained within [0, 1]\n",
883 " \n",
884 " data = np.zeros(len(x))\n",
885 " for i in range(len(x)):\n",
886 " if x[i] < xL:\n",
887 " data[i] = np.cos(2 * np.pi * x[i] / T) - yoffset\n",
888 " elif xL <= x[i] <= xR:\n",
889 " data[i] = np.abs(x[i] - 0.5)\n",
890 " elif x[i] > xR:\n",
891 " data[i] = np.cos(2 * np.pi * (x[i] - 1) / T) - yoffset\n",
892 " \n",
893 " return data\n",
894 "\n",
895 "def df2(x, T = 4.):\n",
896 " #cutoffs\n",
897 " xL = np.arcsin(T / (2* np.pi)) * T / (2 * np.pi)\n",
898 " xR = 1. - xL\n",
899 " \n",
900 " # function does not if x is contained within [0, 1]\n",
901 " \n",
902 " data = np.zeros(len(x))\n",
903 " for i in range(len(x)):\n",
904 " if x[i] < xL:\n",
905 " data[i] = -2* np.pi / T * np.sin(2 * np.pi * x[i] / T) \n",
906 " elif xL <= x[i] < 0.5:\n",
907 " data[i] = -1.\n",
908 " elif 0.5 <= x[i] < xR:\n",
909 " data[i] = 1.\n",
910 " elif x[i] > xR:\n",
911 " data[i] = -2 * np.pi / T * np.sin(2 * np.pi * (x[i] - 1) / T)\n",
912 " \n",
913 " return data \n",
914 "\n",
915 "# cell-centered grid\n",
916 "a, b = -0.5, 1.5\n",
917 "N = 100\n",
918 "x, dx = create_grid(N, a, b)\n",
919 "\n",
920 "plt.plot(x, f2(x), lw = 2)\n",
921 "plt.grid()\n",
922 "plt.xlabel(r'$x$', fontsize = 14)\n",
923 "plt.ylabel(r'$f(x)$', fontsize = 14) "
924 ]
925 },
926 {
927 "cell_type": "markdown",
928 "metadata": {},
929 "source": [
930 "The derivative of the function\n",
931 "\n",
932 "$$f(x) = \\begin{cases}\n",
933 "\\cos (2\\pi x / T) - c & 0 \\leq x < x_L \\\\[.5em]\n",
934 "|x - \\frac{1}{2}| & x_L \\leq x < x_R \\\\[.5em]\n",
935 "\\cos (2\\pi (x - 1) / T) - c & x_R \\leq x \\leq 1\n",
936 "\\end{cases}, \\qquad T = 4\n",
937 "$$\n",
938 "\n",
939 "is given by\n",
940 "\n",
941 "\n",
942 "$$f'(x) = \\begin{cases}\n",
943 "-\\frac{2\\pi}{T}\\sin (2\\pi x / T) & 0 \\leq x < x_L \\\\[.5em]\n",
944 "-1 &x_L \\leq x < \\frac{1}{2} \\\\[.5em]\n",
945 "+1 & \\frac{1}{2} \\leq x < x_R \\\\[.5em]\n",
946 "-\\frac{2\\pi}{T} \\sin (2\\pi (x - 1) / T) & x_R \\leq x \\leq 1\n",
947 "\\end{cases}, \\qquad T = 4\n",
948 "$$"
949 ]
950 },
951 {
952 "cell_type": "code",
953 "execution_count": 13,
954 "metadata": {
955 "collapsed": false
956 },
957 "outputs": [
958 {
959 "data": {
960 "text/plain": [
961 "<matplotlib.text.Text at 0x4bf0a50>"
962 ]
963 },
964 "execution_count": 13,
965 "metadata": {},
966 "output_type": "execute_result"
967 },
968 {
969 "data": {
970 "image/png": "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\ntrcAAAAASUVORK5CYII=\n",
971 "text/plain": [
972 "<matplotlib.figure.Figure at 0x5912250>"
973 ]
974 },
975 "metadata": {},
976 "output_type": "display_data"
977 }
978 ],
979 "source": [
980 "import numpy as np\n",
981 "\n",
982 "# cell-centered grid\n",
983 "a, b = 0., 1.\n",
984 "N = 150\n",
985 "x, dx = create_grid(N, a, b)\n",
986 "W0, W1, W2 = assemble_Wj(N)\n",
987 "g0, g1, g2 = 1/6., 2/3., 1/6. # linear weights\n",
988 "\n",
989 "f_data = f2(x)\n",
990 "\n",
991 "# exact solution\n",
992 "df_data = df2(x)\n",
993 "\n",
994 "# numerical solution\n",
995 "df_approx = g0 * W0.dot(f_data) + g1 * W1.dot(f_data) + g2 * W2.dot(f_data)\n",
996 "df_approx /= dx\n",
997 "\n",
998 "plt.plot(x, df_data, lw = 2, label = 'exact')\n",
999 "plt.plot(x, df_approx, lw = 2, label = 'numerical')\n",
1000 "plt.grid()\n",
1001 "plt.xlabel(r'$x$', fontsize = 14)\n",
1002 "plt.ylabel(r'$f(x)$', fontsize = 14) "
1003 ]
1004 },
1005 {
1006 "cell_type": "markdown",
1007 "metadata": {},
1008 "source": [
1009 "Figure: non-WENO 4th order central FD estimate of the first derivative"
1010 ]
1011 },
1012 {
1013 "cell_type": "markdown",
1014 "metadata": {},
1015 "source": [
1016 "Visually, this looks quite ok; however, we do see spurious oscillations at the edge."
1017 ]
1018 },
1019 {
1020 "cell_type": "markdown",
1021 "metadata": {},
1022 "source": [
1023 "## Test problem : nonperiodic function, $f_3$ with discontinuity in $\\partial_x f_3$\n",
1024 "\n",
1025 "Note: since the function we construct will not be periodic, to deal with \"edges\" of the grid function data, we just decide to take a derivative in a subset of the domain (i.e. the weight arrays $W_j$ will have zeroes in rows $i$ which correspond to $x_i$ outside of this range).\n",
1026 "\n",
1027 "The most elementary example of a function with a discontinuity in its derivative is a linear combination of linear functions with different slopes that are patched at any point for continuity in the function itself.\n",
1028 "\n",
1029 "$$f_{3a}(x) = -3x + 10$$\n",
1030 "\n",
1031 "$$f_{3b}(x) = x + E$$\n",
1032 "\n",
1033 "we choose to join the functions at $x = 3$, which fixes the value of $E$\n",
1034 "\n",
1035 "$$f_{3a}(3) = f_{3b}(3) \\longrightarrow E = -2$$\n",
1036 "\n",
1037 "Thus, we consider the function:\n",
1038 "\n",
1039 "$$f_3(x) = \\begin{cases}\n",
1040 "-3x + 10 & 0 \\leq x < 3 \\\\\n",
1041 "&\\\\\n",
1042 "x - 2 & 3 \\leq x \\leq 5\n",
1043 "\\end{cases}\n",
1044 "$$\n",
1045 "\n",
1046 "where the domain has been now chosen as $x\\in [0, 5]$$. We plot this function below:"
1047 ]
1048 },
1049 {
1050 "cell_type": "code",
1051 "execution_count": 14,
1052 "metadata": {
1053 "collapsed": false,
1054 "scrolled": true
1055 },
1056 "outputs": [
1057 {
1058 "data": {
1059 "text/plain": [
1060 "<matplotlib.text.Text at 0x58f4090>"
1061 ]
1062 },
1063 "execution_count": 14,
1064 "metadata": {},
1065 "output_type": "execute_result"
1066 },
1067 {
1068 "data": {
1069 "image/png": "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\nAAAAAElFTkSuQmCC\n",
1070 "text/plain": [
1071 "<matplotlib.figure.Figure at 0x5925050>"
1072 ]
1073 },
1074 "metadata": {},
1075 "output_type": "display_data"
1076 }
1077 ],
1078 "source": [
1079 "def f3(x):\n",
1080 " # function does not if x is contained within [0, 5]\n",
1081 " data = np.zeros(len(x))\n",
1082 " xmatch = 3.\n",
1083 " for i in range(len(x)):\n",
1084 " if x[i] < xmatch:\n",
1085 " data[i] = -3 * x[i] + 10. \n",
1086 " elif xmatch <= x[i] < 5.:\n",
1087 " data[i] = x[i] - 2\n",
1088 " \n",
1089 " return data \n",
1090 "\n",
1091 "# cell-centered grid\n",
1092 "a, b = 0, 5\n",
1093 "N = 100\n",
1094 "x, dx = create_grid(N, a, b)\n",
1095 "\n",
1096 "plt.plot(x, f3(x), lw = 2)\n",
1097 "plt.grid()\n",
1098 "plt.xlabel(r'$x$', fontsize = 14)\n",
1099 "plt.ylabel(r'$f(x)$', fontsize = 14) "
1100 ]
1101 },
1102 {
1103 "cell_type": "markdown",
1104 "metadata": {},
1105 "source": [
1106 "Figure: showing the form of the function $f_{34}$, the slope is discontinuous at $x = 3$"
1107 ]
1108 },
1109 {
1110 "cell_type": "markdown",
1111 "metadata": {},
1112 "source": [
1113 "The derivative is given by\n",
1114 "\n",
1115 "$$\\partial_xf_{3}(x) = \\begin{cases}\n",
1116 "-3 & 0 \\leq x < 3 \\\\\n",
1117 "&\\\\\n",
1118 "1 & 3 \\leq x \\leq 5\n",
1119 "\\end{cases}\n",
1120 "$$\n",
1121 "\n",
1122 "We see how the finite difference operators perform on this derivative and plot the numerical result as well as the above exact derivative below:"
1123 ]
1124 },
1125 {
1126 "cell_type": "markdown",
1127 "metadata": {},
1128 "source": [
1129 "This function is not periodic, we decide to find the derivative in the subset of the domain so that we can examine the derivative properly without worrying about how to handle edges (i.e. we pad our derivative operators with zeros outside of the region of interest, and plot only the region of interest). The constructors for the $W_j$ arrays are provided below"
1130 ]
1131 },
1132 {
1133 "cell_type": "code",
1134 "execution_count": 15,
1135 "metadata": {
1136 "collapsed": false
1137 },
1138 "outputs": [],
1139 "source": [
1140 "def assemble_restricted_Wj(N, x, x_left = 2, x_right = 4):\n",
1141 " # assembles Wj in a restricted range of x_left <= x <= x_right\n",
1142 " \n",
1143 " W0, W1, W2 = np.zeros( (N, N) ), np.zeros( (N, N) ), np.zeros( (N, N) )\n",
1144 "\n",
1145 " # fill vals for W1\n",
1146 " w2m2, w2m1, w20 = 1/2., -2., 3/2. # paired with stencil pos: {-2, -1, 0}\n",
1147 " # fill vals for W2\n",
1148 " w1m1, w1p1 = -1/2., 1/2. # paired with stencil pos: {-1, 1}\n",
1149 " # fill vals for W3\n",
1150 " w00, w0p1, w0p2 = -3/2., 2., -1/2. # paired with stencil pos: {0, 1, 2}\n",
1151 "\n",
1152 " for i in range(N):\n",
1153 " \n",
1154 " if x_left <= x[i] <= x_right:\n",
1155 " \n",
1156 " W2[i,i] = w20\n",
1157 " W2[i, i-1] = w2m1\n",
1158 " W2[i, i-2] = w2m2\n",
1159 " \n",
1160 " W1[i, i-1] = w1m1\n",
1161 " W1[i, i+1] = w1p1\n",
1162 "\n",
1163 " W0[i, i] = w00\n",
1164 " W0[i, i+1] = w0p1\n",
1165 " W0[i, i+2] = w0p2\n",
1166 " \n",
1167 " \n",
1168 " return W0, W1, W2"
1169 ]
1170 },
1171 {
1172 "cell_type": "markdown",
1173 "metadata": {},
1174 "source": [
1175 "Compare the numerical derivative to the exact derivative"
1176 ]
1177 },
1178 {
1179 "cell_type": "code",
1180 "execution_count": 17,
1181 "metadata": {
1182 "collapsed": false,
1183 "scrolled": true
1184 },
1185 "outputs": [
1186 {
1187 "data": {
1188 "text/plain": [
1189 "[2.1, 3.9, -3.2666666666666746, 1.2666666666666662]"
1190 ]
1191 },
1192 "execution_count": 17,
1193 "metadata": {},
1194 "output_type": "execute_result"
1195 },
1196 {
1197 "data": {
1198 "image/png": "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\n",
1199 "text/plain": [
1200 "<matplotlib.figure.Figure at 0x633f310>"
1201 ]
1202 },
1203 "metadata": {},
1204 "output_type": "display_data"
1205 }
1206 ],
1207 "source": [
1208 "import numpy as np\n",
1209 "\n",
1210 "def df3(x):\n",
1211 " data = np.zeros(len(x))\n",
1212 " xmatch = 3.\n",
1213 " for i in range(len(x)):\n",
1214 " if x[i] < xmatch:\n",
1215 " data[i] = -3. \n",
1216 " elif xmatch <= x[i] < 5.:\n",
1217 " data[i] = 1.\n",
1218 " \n",
1219 " return data \n",
1220 "\n",
1221 "# cell-centered grid\n",
1222 "a, b = 0., 5.\n",
1223 "N = 50\n",
1224 "x, dx = create_grid(N, a, b)\n",
1225 "\n",
1226 "# find derivative in a restricted range x_left <= x <= x_right\n",
1227 "x_left, x_right = 2., 4.\n",
1228 "W0, W1, W2 = assemble_restricted_Wj(N, x, x_left = x_left, x_right = x_right)\n",
1229 "g0, g1, g2 = 1/6., 2/3., 1/6. # linear weights\n",
1230 "\n",
1231 "f_data = f3(x)\n",
1232 "\n",
1233 "# exact solution\n",
1234 "df_data = df3(x)\n",
1235 "\n",
1236 "# numerical solution\n",
1237 "df_approx = g0 * W0.dot(f_data) + g1 * W1.dot(f_data) + g2 * W2.dot(f_data)\n",
1238 "df_approx /= dx\n",
1239 "\n",
1240 "plt.plot(x, df_data, lw = 2, label = 'exact')\n",
1241 "plt.plot(x, df_approx, 'o', linestyle = '--', lw = 2, label = 'numerical')\n",
1242 "plt.grid()\n",
1243 "plt.xlabel(r'$x$', fontsize = 14)\n",
1244 "plt.ylabel(r'$f(x)$', fontsize = 14) \n",
1245 "plt.axis([x_left + dx, x_right - dx, np.min(df_approx) - .1, np.max(df_approx) + .1])"
1246 ]
1247 },
1248 {
1249 "cell_type": "markdown",
1250 "metadata": {},
1251 "source": [
1252 "Figure: non-WENO FD estimate of the derivative of function $f_{34}$"
1253 ]
1254 },
1255 {
1256 "cell_type": "markdown",
1257 "metadata": {},
1258 "source": [
1259 "Next, we attempt to assuage this issue by using nonlinear (WENO) weights."
1260 ]
1261 },
1262 {
1263 "cell_type": "markdown",
1264 "metadata": {},
1265 "source": [
1266 "### <font color = \"purple\"> WENO first derivative tests</font>\n",
1267 "\n",
1268 "We need to calculate the smoothness indicators $\\beta_j$, which were quoted earlier:\n",
1269 "\n",
1270 "\\begin{eqnarray*}\n",
1271 "\\beta_0 & = & u_i^2 - 4 u_i u_{i+1} + 4 u_{i+1}^2 + 2u_i u _{i+2} - 4 u_{i+1} u_{i+1} + u_{i+2}^2 \\\\\n",
1272 "\\beta_1 & = & u_{i-1}^2 - 4 u_{i-1}u_i + 4 u_0^2 + 2 u_{i-1}u_1 - 4 u_iu_{i+1} + u_{i+1}^2 \\\\\n",
1273 "\\beta_2 & = & u_{i-2}^2 - 4 u_{i-2} u_{i-1} + 4 u_{i-1}^2 + 2 u_{i-2}u_0 - 4 u_{i-1}u_i + u_i^2 \n",
1274 "\\end{eqnarray*}"
1275 ]
1276 },
1277 {
1278 "cell_type": "code",
1279 "execution_count": 53,
1280 "metadata": {
1281 "collapsed": false,
1282 "scrolled": true
1283 },
1284 "outputs": [],
1285 "source": [
1286 "def smoothness_indicator(u, j):\n",
1287 " # SPECIAL CASE FOR q = 1, sj = 3, s = 5\n",
1288 " # u is a grid function array\n",
1289 " \n",
1290 " Nx = len(u)\n",
1291 " beta = np.zeros( Nx )\n",
1292 " \n",
1293 " s = 5 # size of full stencil \n",
1294 " sj = 3 # size of substencils = r + m\n",
1295 " r = int(np.ceil(s/2.)) # half-width of full stencil\n",
1296 " Ns = sj - m # number of substencils \n",
1297 " \n",
1298 " substencil = np.zeros( sj, dtype = int )\n",
1299 " substencil[:] = np.arange(-j + m, -j + m + sj) # substencil S_j = {k-j+m}, k is iterated using np.arange \n",
1300 " \n",
1301 " # FOR PERIODIC GRIDS\n",
1302 " for i in range(Nx):\n",
1303 " beta[i] = u[np.mod(i + substencil[0],Nx) ] ** 2 - 4 * u[np.mod(i + substencil[0], Nx) ] * u[np.mod(i + substencil[1],Nx) ] + 4 * u[np.mod(i+ substencil[1],Nx) ] ** 2 + 2 * u[np.mod(i+ substencil[0], Nx) ] * u[np.mod(i + substencil[2], Nx) ] - 4 * u[np.mod(i + substencil[1], Nx) ] * u[np.mod(i + substencil[2], Nx) ] + u[np.mod(i + substencil[2], Nx) ] ** 2\n",
1304 " \n",
1305 " return beta"
1306 ]
1307 },
1308 {
1309 "cell_type": "markdown",
1310 "metadata": {},
1311 "source": [
1312 "### Test problem : WENO estimate of a first derivative with a discontuity, $\\partial_xf_2$"
1313 ]
1314 },
1315 {
1316 "cell_type": "code",
1317 "execution_count": 66,
1318 "metadata": {
1319 "collapsed": false,
1320 "scrolled": true
1321 },
1322 "outputs": [
1323 {
1324 "data": {
1325 "text/plain": [
1326 "<matplotlib.legend.Legend at 0x6896c90>"
1327 ]
1328 },
1329 "execution_count": 66,
1330 "metadata": {},
1331 "output_type": "execute_result"
1332 },
1333 {
1334 "data": {
1335 "image/png": "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\nAwAA9PL/31gx9rwom8gAAAAASUVORK5CYII=\n",
1336 "text/plain": [
1337 "<matplotlib.figure.Figure at 0x68afad0>"
1338 ]
1339 },
1340 "metadata": {},
1341 "output_type": "display_data"
1342 }
1343 ],
1344 "source": [
1345 "import numpy as np\n",
1346 "\n",
1347 "\n",
1348 "# cell-centered grid\n",
1349 "a, b = 0., 1.\n",
1350 "N = 150\n",
1351 "x, dx = create_grid(N, a, b)\n",
1352 "W0, W1, W2 = assemble_Wj(N)\n",
1353 "f_data = f2(x)\n",
1354 "\n",
1355 "# store linear weights\n",
1356 "g0, g1, g2 = 1/6., 2/3., 1/6.\n",
1357 "\n",
1358 "# construct WENO weights\n",
1359 "\n",
1360 "# smoothness indicators\n",
1361 "b0 = smoothness_indicator(f_data, j = 0)\n",
1362 "b1 = smoothness_indicator(f_data, j = 1)\n",
1363 "b2 = smoothness_indicator(f_data, j = 2)\n",
1364 "\n",
1365 "# construct wt (\"w tilde\")\n",
1366 "eps = 1.e-6 # small number to evade numerical overflow\n",
1367 "\n",
1368 "wt0 = g0 / (eps + b0) ** 2\n",
1369 "wt1 = g1 / (eps + b1) ** 2\n",
1370 "wt2 = g2 / (eps + b2) ** 2\n",
1371 "\n",
1372 "# WENO weights w\n",
1373 "wtsum = wt0 + wt1 + wt2\n",
1374 "\n",
1375 "w0 = wt0 / wtsum\n",
1376 "w1 = wt1 / wtsum\n",
1377 "w2 = wt2 / wtsum\n",
1378 "\n",
1379 "# numerical solutions\n",
1380 "df_nonWENO = g0 * W0.dot(f_data) + g1 * W1.dot(f_data) + g2 * W2.dot(f_data)\n",
1381 "df_nonWENO /= dx\n",
1382 "\n",
1383 "df_WENO = w0 * W0.dot(f_data) + w1 * W1.dot(f_data) + w2 * W2.dot(f_data)\n",
1384 "df_WENO /= dx\n",
1385 "\n",
1386 "# exact solution\n",
1387 "df_data = df2(x)\n",
1388 "\n",
1389 "plt.plot(x, df_data, lw = 2, marker = 'o', markersize = 10, linestyle = '', color = 'b', label = 'exact')\n",
1390 "plt.plot(x, df_nonWENO, linestyle = '', marker = 'p', color = 'g', label = 'non-WENO')\n",
1391 "plt.plot(x, df_WENO, linestyle = '', marker = 'D', color = 'r', label = 'WENO')\n",
1392 "plt.grid()\n",
1393 "plt.xlabel(r'$x$', fontsize = 14)\n",
1394 "plt.ylabel(r'$f(x)$', fontsize = 14) \n",
1395 "plt.axis([0.4, 0.6, -1.2, 1.2])\n",
1396 "plt.legend(loc = 'best')"
1397 ]
1398 },
1399 {
1400 "cell_type": "markdown",
1401 "metadata": {},
1402 "source": [
1403 "The plot shows the WENO estimate outperforms the non-WENO estimate, and diminishes the oscillations that appear in the non-WENO scheme near this discontinuity"
1404 ]
1405 },
1406 {
1407 "cell_type": "markdown",
1408 "metadata": {},
1409 "source": [
1410 "We plot the WENO weights $w_j$ alongside the linear weights $\\gamma_j$ to see the action of the WENO approach:"
1411 ]
1412 },
1413 {
1414 "cell_type": "code",
1415 "execution_count": 67,
1416 "metadata": {
1417 "collapsed": false
1418 },
1419 "outputs": [
1420 {
1421 "data": {
1422 "text/plain": [
1423 "<matplotlib.legend.Legend at 0xb9e85d0>"
1424 ]
1425 },
1426 "execution_count": 67,
1427 "metadata": {},
1428 "output_type": "execute_result"
1429 },
1430 {
1431 "data": {
1432 "image/png": "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\nRET/D6v1ngnveP/rAAAAAElFTkSuQmCC\n",
1433 "text/plain": [
1434 "<matplotlib.figure.Figure at 0x50368d0>"
1435 ]
1436 },
1437 "metadata": {},
1438 "output_type": "display_data"
1439 }
1440 ],
1441 "source": [
1442 "import numpy as np\n",
1443 "\n",
1444 "plt.plot(x, w0, lw = 2, marker = 'o', markersize = 10, linestyle = '', color = 'b', label = r'$w_0$')\n",
1445 "plt.plot(x, w1, linestyle = '', marker = 'p', color = 'g', label = r'$w_1$')\n",
1446 "plt.plot(x, w2, linestyle = '', marker = 'D', color = 'r', label = r'$w_2$')\n",
1447 "\n",
1448 "plt.plot(x, g0 * np.ones(N), lw = 2, marker = '', markersize = 10, linestyle = '--', color = 'b', label = r'$\\gamma_0$')\n",
1449 "plt.plot(x, g1 * np.ones(N), linestyle = '-', marker = '', color = 'g', label = r'$\\gamma_1$')\n",
1450 "plt.plot(x, g2 * np.ones(N), linestyle = '-', marker = '', color = 'r', label = r'$\\gamma_2$')\n",
1451 "\n",
1452 "plt.grid()\n",
1453 "plt.xlabel(r'$x$', fontsize = 14)\n",
1454 "plt.ylabel(r'$w_j, \\gamma_j$', fontsize = 14) \n",
1455 "plt.xlim((0.4,0.6))\n",
1456 "#plt.axis([0.4, 0.6, -0.02])\n",
1457 "plt.legend(loc = 'best')"
1458 ]
1459 },
1460 {
1461 "cell_type": "markdown",
1462 "metadata": {},
1463 "source": [
1464 "Note that here we plot the solid lines as $\\gamma_j$ (red and blues lie on top of each other, $\\gamma_0 = \\gamma_2$), and the markers show the WENO calculations in the same color for correspondence. Around the discontinuity we see the WENO behavior. Recall the substencils \n",
1465 "\n",
1466 "$$S_0 = \\{0,1,2\\}$$\n",
1467 "$$S_1 = \\{-1, 0,1\\}$$\n",
1468 "$$S_2 = \\{-2, -1, 0\\}$$\n",
1469 "\n",
1470 "On the left as we approach rightward, the first substencil to hit the discontinuity is $S_0$, we see the blue markers drop down to essentially zero first, and commensurately, more importance is assigned to the red and green weights. As we continuing moving towards and through the discontinuity, next the stencil $S_1$ encounters a discontinuity (we see the green marker on the second dot in this region near zero); only one substencil is used in this region, the red stencil $(S_2)$ which shows its weight at approximately 1 (i.e. stencil $S_2$ is prioritized above all others). Moving forward, the reverse happens. As stencil $S_0$ moves into territory to the right of the discontinuity, it's importance in the contribution is increased, meanwhile the stencil $S_2$ contains the discontinuity and its weight drops down to nearly zero, and so on. After the discontinuity when all stencils are in smooth regions, they take on approximately their ideal weights ($\\gamma_j$)."
1471 ]
1472 },
1473 {
1474 "cell_type": "markdown",
1475 "metadata": {},
1476 "source": [
1477 "### Convergence of $\\partial_x f_2$ WENO vs. non-WENO"
1478 ]
1479 },
1480 {
1481 "cell_type": "code",
1482 "execution_count": 73,
1483 "metadata": {
1484 "collapsed": false
1485 },
1486 "outputs": [
1487 {
1488 "name": "stdout",
1489 "output_type": "stream",
1490 "text": [
1491 "non-WENO first derivative convergence\n",
1492 "-------------------------------------\n",
1493 "Nx6 error = 2.75347e-01 ----\n",
1494 "Nx12 error = 1.79794e-01 order = 0.615\n",
1495 "Nx24 error = 1.21029e-01 order = 0.571\n",
1496 "Nx48 error = 8.67595e-02 order = 0.480\n",
1497 "Nx96 error = 6.13319e-02 order = 0.500\n",
1498 "Nx192 error = 4.33682e-02 order = 0.500\n",
1499 "Nx384 error = 3.06659e-02 order = 0.500\n",
1500 "Nx768 error = 2.16840e-02 order = 0.500\n",
1501 "Nx1536 error = 1.53329e-02 order = 0.500\n",
1502 "\n",
1503 "WENO first derivative convergence\n",
1504 "----------------------------------\n",
1505 "Nx6 error = 6.23000e-02 ----\n",
1506 "Nx12 error = 1.31899e-02 order = 2.240\n",
1507 "Nx24 error = 8.91719e-03 order = 0.565\n",
1508 "Nx48 error = 7.90974e-04 order = 3.495\n",
1509 "Nx96 error = 1.73325e-04 order = 2.190\n",
1510 "Nx192 error = 3.40939e-04 order = -0.976\n",
1511 "Nx384 error = 2.75500e-03 order = -3.014\n",
1512 "Nx768 error = 1.04240e-02 order = -1.920\n",
1513 "Nx1536 error = 1.29389e-02 order = -0.312\n"
1514 ]
1515 }
1516 ],
1517 "source": [
1518 "import numpy as np\n",
1519 "import numpy.linalg as LA\n",
1520 "\n",
1521 "Nx = [6,12, 24, 48, 96, 192, 384, 768, 1536]\n",
1522 "num_grids = len(Nx)\n",
1523 "\n",
1524 "error_norm = np.zeros(num_grids)\n",
1525 "orders = np.zeros(num_grids)\n",
1526 "\n",
1527 "# non-WENO convergence\n",
1528 "print \"non-WENO first derivative convergence\"\n",
1529 "print \"-------------------------------------\"\n",
1530 "for grid in range(num_grids):\n",
1531 "\n",
1532 " # grid dependent parameters\n",
1533 " a,b = 0., 1.\n",
1534 " x, dx = create_grid(Nx[grid], a, b)\n",
1535 " \n",
1536 " W0, W1, W2 = assemble_Wj(Nx[grid])\n",
1537 " f_data = f2(x)\n",
1538 "\n",
1539 " # store linear weights\n",
1540 " g0, g1, g2 = 1/6., 2/3., 1/6.\n",
1541 " \n",
1542 " # numerical solutions\n",
1543 " df_nonWENO = g0 * W0.dot(f_data) + g1 * W1.dot(f_data) + g2 * W2.dot(f_data)\n",
1544 " df_nonWENO /= dx\n",
1545 "\n",
1546 " # exact solution\n",
1547 " df_data = df2(x)\n",
1548 "\n",
1549 " error_norm[grid] = LA.norm(df_data - df_nonWENO,2) * np.sqrt(dx / 1.) # domain length L = 1\n",
1550 "\n",
1551 " if grid == 0:\n",
1552 " print \"Nx%d error = %1.5e ----\" % (Nx[grid], error_norm[grid])\n",
1553 " else:\n",
1554 " orders[grid] = np.log2(error_norm[grid-1] / error_norm[grid])\n",
1555 " print \"Nx%d error = %1.5e order = %1.3f\" % (Nx[grid], error_norm[grid], orders[grid])\n",
1556 "\n",
1557 "# WENO convergence\n",
1558 "print \"\\nWENO first derivative convergence\"\n",
1559 "print \"----------------------------------\"\n",
1560 "for grid in range(num_grids):\n",
1561 "\n",
1562 " # grid dependent parameters\n",
1563 " a,b = 0., 1.\n",
1564 " x, dx = create_grid(Nx[grid], a, b)\n",
1565 " \n",
1566 " W0, W1, W2 = assemble_Wj(Nx[grid])\n",
1567 " f_data = f2(x)\n",
1568 "\n",
1569 " # store linear weights\n",
1570 " g0, g1, g2 = 1/6., 2/3., 1/6.\n",
1571 "\n",
1572 " ## construct WENO weights\n",
1573 " # smoothness indicators\n",
1574 " b0 = smoothness_indicator(f_data, j = 0)\n",
1575 " b1 = smoothness_indicator(f_data, j = 1)\n",
1576 " b2 = smoothness_indicator(f_data, j = 2)\n",
1577 "\n",
1578 " # construct wt (\"w tilde\")\n",
1579 " eps = 1.e-6 # small number to evade numerical overflow\n",
1580 "\n",
1581 " wt0 = g0 / (eps + b0) ** 2\n",
1582 " wt1 = g1 / (eps + b1) ** 2\n",
1583 " wt2 = g2 / (eps + b2) ** 2\n",
1584 "\n",
1585 " # WENO weights w\n",
1586 " wtsum = wt0 + wt1 + wt2\n",
1587 " \n",
1588 " w0 = wt0 / wtsum\n",
1589 " w1 = wt1 / wtsum\n",
1590 " w2 = wt2 / wtsum\n",
1591 " \n",
1592 " df_WENO = w0 * W0.dot(f_data) + w1 * W1.dot(f_data) + w2 * W2.dot(f_data)\n",
1593 " df_WENO /= dx\n",
1594 "\n",
1595 " # exact solution\n",
1596 " df_data = df2(x)\n",
1597 " \n",
1598 " error_norm[grid] = LA.norm(df_data - df_WENO,2) * np.sqrt(dx / 1.) # domain length L = 1\n",
1599 " \n",
1600 " if grid == 0:\n",
1601 " print \"Nx%d error = %1.5e ----\" % (Nx[grid], error_norm[grid])\n",
1602 " else:\n",
1603 " orders[grid] = np.log2(error_norm[grid-1] / error_norm[grid])\n",
1604 " print \"Nx%d error = %1.5e order = %1.3f\" % (Nx[grid], error_norm[grid], orders[grid])\n"
1605 ]
1606 },
1607 {
1608 "cell_type": "markdown",
1609 "metadata": {},
1610 "source": [
1611 "error terms due to finite machine precision ($O(\\epsilon \\Delta x^{-1})$) begin competing with the truncation error $O(\\Delta x^4)$ when $\\Delta x$ becomes too small, a ballpark estimate of the grid point size when this error increase becomes competitive with the error decrease (due to mesh refinement) becomes significant is (see notebook s02):\n",
1612 "\n",
1613 "$$N_{x,crit} = \\frac{L}{\\epsilon^{ (q + p+1)^{-1}} } \\simeq 406$$\n",
1614 "\n",
1615 "This roughly agrees with the above (observed order becomes negative, i.e. is overtaken by this numerical error)"
1616 ]
1617 },
1618 {
1619 "cell_type": "code",
1620 "execution_count": 266,
1621 "metadata": {
1622 "collapsed": false
1623 },
1624 "outputs": [
1625 {
1626 "name": "stdout",
1627 "output_type": "stream",
1628 "text": [
1629 "406.374669304\n"
1630 ]
1631 }
1632 ],
1633 "source": [
1634 "meps = 7./3 - 4./3 - 1 # machine eps\n",
1635 "q, p, L = 1., 4., 1.\n",
1636 "\n",
1637 "print L / meps ** (1 / (q + p + 1))\n"
1638 ]
1639 },
1640 {
1641 "cell_type": "markdown",
1642 "metadata": {},
1643 "source": [
1644 "(self note: we have taken $p \\rightarrow p+1$ in the denominator here as compared to what was framed in notebook s02. THis is because in that notebook we did not acknowledge that central schemes outperform non-central schemes by exactly one order for the same size stencil. The factor of one appended here accounts for that and improves the estimates in s02)\n",
1645 "\n",
1646 "Here, we have taken $q = 1, p = 4, L = 1$ in the critical $N_x$ value calculation where each corespond to the derivative order, highest LTE order, and system size, respectively.\n",
1647 "\n",
1648 "Note, that the WENO scheme will only drop down to 2nd order in a very small region, most everywehre else the 4th order scheme is used so this is the controller, not the 2rd order LTE which would incidentally predict a higher $N_{x,crit}$ threshold). Thus, for $N_x > N_{x,crit}$ the finite difference estimates will be worse than on coarser grids (as usual)"
1649 ]
1650 },
1651 {
1652 "cell_type": "markdown",
1653 "metadata": {},
1654 "source": [
1655 "Reviewing the results, the non-WENO scheme's performance is capped by the oscillations at the discontinuity which cannot be undone by resolving the mesh, we observe a numerical order of accuracy of order 0.5 (further mesh refinement shows this value holding constant)\n",
1656 "\n",
1657 "the WENO scheme's performance is abotu to drop the error down at a rate that approaches order $\\sim 3.5$. The WENO scheme uses the order 4 LTE scheme in most of the domain, but near the disconinuity the weights assigned to one or more substencils are significantly lower so we effectively drop down to using an order 2 LTE scheme in these regions. Observing an order somewhere between 2 and 4, is expected which is obesrved above. This shows the WENO scheme works well in unsmooth regions. We now do a quick check to verify that the WENO scheme will prodcue the order 5 LTE for a totally smooth function. We use the same function we started with, $f_1(x) = \\sin (2\\pi x)$ over the domain $x\\in [0,1]$"
1658 ]
1659 },
1660 {
1661 "cell_type": "markdown",
1662 "metadata": {},
1663 "source": [
1664 "## WENO convergence on a smooth derivative: $\\partial_xf_1$"
1665 ]
1666 },
1667 {
1668 "cell_type": "code",
1669 "execution_count": 76,
1670 "metadata": {
1671 "collapsed": false,
1672 "scrolled": false
1673 },
1674 "outputs": [
1675 {
1676 "name": "stdout",
1677 "output_type": "stream",
1678 "text": [
1679 "non-WENO first derivative convergence\n",
1680 "-------------------------------------\n",
1681 "Nx6 error = 1.56276e-01 ----\n",
1682 "Nx12 error = 1.07736e-02 order = 3.859\n",
1683 "Nx24 error = 6.90040e-04 order = 3.965\n",
1684 "Nx48 error = 4.33923e-05 order = 3.991\n",
1685 "Nx96 error = 2.71617e-06 order = 3.998\n",
1686 "Nx192 error = 1.69825e-07 order = 3.999\n",
1687 "Nx384 error = 1.06151e-08 order = 4.000\n",
1688 "\n",
1689 "WENO first derivative convergence\n",
1690 "----------------------------------\n",
1691 "Nx6 error = 2.69624e-01 ----\n",
1692 "Nx12 error = 2.74415e-01 order = -0.025\n",
1693 "Nx24 error = 1.44418e-02 order = 4.248\n",
1694 "Nx48 error = 8.39692e-05 order = 7.426\n",
1695 "Nx96 error = 2.76954e-06 order = 4.922\n",
1696 "Nx192 error = 1.69991e-07 order = 4.026\n",
1697 "Nx384 error = 1.06157e-08 order = 4.001\n"
1698 ]
1699 }
1700 ],
1701 "source": [
1702 "import numpy as np\n",
1703 "import numpy.linalg as LA\n",
1704 "\n",
1705 "Nx = [6,12, 24, 48, 96, 192, 384]\n",
1706 "num_grids = len(Nx)\n",
1707 "\n",
1708 "error_norm = np.zeros(num_grids)\n",
1709 "orders = np.zeros(num_grids)\n",
1710 "\n",
1711 "# non-WENO convergence\n",
1712 "print \"non-WENO first derivative convergence\"\n",
1713 "print \"-------------------------------------\"\n",
1714 "for grid in range(num_grids):\n",
1715 "\n",
1716 " # grid dependent parameters\n",
1717 " a,b = 0., 1.\n",
1718 " x, dx = create_grid(Nx[grid], a, b)\n",
1719 " \n",
1720 " W0, W1, W2 = assemble_Wj(Nx[grid])\n",
1721 " \n",
1722 " f_data = f1(x)\n",
1723 " df_data = df1(x)\n",
1724 " \n",
1725 " # store linear weights\n",
1726 " g0, g1, g2 = 1/6., 2/3., 1/6.\n",
1727 " \n",
1728 " # numerical solutions\n",
1729 " df_nonWENO = g0 * W0.dot(f_data) + g1 * W1.dot(f_data) + g2 * W2.dot(f_data)\n",
1730 " df_nonWENO /= dx\n",
1731 "\n",
1732 " error_norm[grid] = LA.norm(df_data - df_nonWENO, 2) * np.sqrt(dx / 1.) # domain length L = 1\n",
1733 "\n",
1734 " if grid == 0:\n",
1735 " print \"Nx%d error = %1.5e ----\" % (Nx[grid], error_norm[grid])\n",
1736 " else:\n",
1737 " orders[grid] = np.log2(error_norm[grid-1] / error_norm[grid])\n",
1738 " print \"Nx%d error = %1.5e order = %1.3f\" % (Nx[grid], error_norm[grid], orders[grid])\n",
1739 "\n",
1740 "# WENO convergence\n",
1741 "print \"\\nWENO first derivative convergence\"\n",
1742 "print \"----------------------------------\"\n",
1743 "for grid in range(num_grids):\n",
1744 "\n",
1745 " # grid dependent parameters\n",
1746 " a,b = 0., 1.\n",
1747 " x, dx = create_grid(Nx[grid], a, b)\n",
1748 " \n",
1749 " W0, W1, W2 = assemble_Wj(Nx[grid])\n",
1750 " f_data = f1(x)\n",
1751 " df_data = df1(x)\n",
1752 "\n",
1753 " # store linear weights\n",
1754 " g0, g1, g2 = 1/6., 2/3., 1/6.\n",
1755 "\n",
1756 " ## construct WENO weights\n",
1757 " # smoothness indicators\n",
1758 " b0 = smoothness_indicator(f_data, j = 0)\n",
1759 " b1 = smoothness_indicator(f_data, j = 1)\n",
1760 " b2 = smoothness_indicator(f_data, j = 2)\n",
1761 "\n",
1762 " # construct wt (\"w tilde\")\n",
1763 " eps = 1.e-3# small number to evade numerical overflow\n",
1764 "\n",
1765 " wt0 = g0 / (eps + b0) ** 2\n",
1766 " wt1 = g1 / (eps + b1) ** 2\n",
1767 " wt2 = g2 / (eps + b2) ** 2\n",
1768 "\n",
1769 " # WENO weights w\n",
1770 " wtsum = wt0 + wt1 + wt2\n",
1771 " \n",
1772 " w0 = wt0 / wtsum\n",
1773 " w1 = wt1 / wtsum\n",
1774 " w2 = wt2 / wtsum\n",
1775 " \n",
1776 " df_WENO = w0 * W0.dot(f_data) + w1 * W1.dot(f_data) + w2 * W2.dot(f_data)\n",
1777 " df_WENO /= dx\n",
1778 "\n",
1779 " error_norm[grid] = LA.norm(df_data - df_WENO,2) * np.sqrt(dx / 1.) # domain length L = 1\n",
1780 " \n",
1781 " if grid == 0:\n",
1782 " print \"Nx%d error = %1.5e ----\" % (Nx[grid], error_norm[grid])\n",
1783 " else:\n",
1784 " orders[grid] = np.log2(error_norm[grid-1] / error_norm[grid])\n",
1785 " print \"Nx%d error = %1.5e order = %1.3f\" % (Nx[grid], error_norm[grid], orders[grid])\n"
1786 ]
1787 },
1788 {
1789 "cell_type": "markdown",
1790 "metadata": {},
1791 "source": [
1792 "We view a few plots to see the nonlinear convergence of WENO below. Note that non-WENO steadily approaches the convergence order as is well-known."
1793 ]
1794 },
1795 {
1796 "cell_type": "markdown",
1797 "metadata": {},
1798 "source": [
1799 "The non-WENO convergence reaches the expected order of 4.\n",
1800 "\n",
1801 "The WENO convergence, on the other hand, can be described as erratic; however, notice the errors themselves between non-WENO and WENO are very similar. Essentially, this happens because the nonlinear weights $w_j$ don't collapse to the linear weights $\\gamma_j$, they only do so approximately. This is in part because in ideal circumstances, carrying around a factor of $\\epsilon \\sim 10^{-6}$ \"just in case\" we divide by zero is a purely numerical motivation and it causes deviation from thew formal limit $\\tilde{w}_j \\rightarrow \\gamma_j$ enough to be noticeable when vieweing a sensitive enough diagnostic, e.g. viewable when seeing the order calculations, but distinguishable when viewing just the error itself.\n",
1802 "\n",
1803 "In this smooth case, since we know we have smooth derivatives (therefor $\\beta_j \\simeq 0$ for all $j$), we can choose a contrived value as the \"small parameter\" $\\epsilon$ so that terms \"cancel\" and we collapse to $\\gamma_j$ in the definitions of $\\tilde{w}_j$ independently. Doing so, we get the following convergence\n",
1804 "\n",
1805 " WENO first derivative convergence\n",
1806 " ----------------------------------\n",
1807 " Nx6 error = 2.25501e-01 ----\n",
1808 " Nx12 error = 1.19404e-02 order = 4.239\n",
1809 " Nx24 error = 6.92942e-04 order = 4.107\n",
1810 " Nx48 error = 4.34029e-05 order = 3.997\n",
1811 " Nx96 error = 2.71621e-06 order = 3.998\n",
1812 " Nx192 error = 1.69826e-07 order = 3.999\n",
1813 " Nx384 error = 1.06151e-08 order = 4.000\n",
1814 " \n",
1815 "which agreeably shows the convergence to 4th order. Note that this is a special case, choosing $\\epsilon = 1$ (a large value) generally ruins required sensitivity of the WENO weights $w_j$ since small deviations in the value of $\\beta_j$ will be washed away by a large $\\epsilon = O(1)$ so that each weight $\\tilde{w}_j$ will be regarded as mostly the same as the effect of differences in the $\\beta_j$ terms are blocked. For example, choosing $\\epsilon = 1$ or similar in the previous derivative test that had a discontinuity would produce convergence that caps at order 0.5 and the errors are very similar to the errors from not using WENO. What would have happened in such a case is that the information about smoothness communicated by the parameters $\\beta_j$ were washed away with the large value of $\\epsilon$ chosen. This informed the WENO scheme that all subintervals were roughly the same degree of smoothness, so we use all of them (this is what the non-WENO scheme does, but does so with exact values of $\\gamma_1, \\gamma_2, \\gamma_3$)"
1816 ]
1817 },
1818 {
1819 "cell_type": "code",
1820 "execution_count": 293,
1821 "metadata": {
1822 "collapsed": false
1823 },
1824 "outputs": [
1825 {
1826 "data": {
1827 "image/png": "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\n",
1828 "text/plain": [
1829 "<IPython.core.display.Image object>"
1830 ]
1831 },
1832 "execution_count": 293,
1833 "metadata": {},
1834 "output_type": "execute_result"
1835 }
1836 ],
1837 "source": [
1838 "from IPython.display import Image\n",
1839 "Image(filename = 'case1_test1_Nx12.png')"
1840 ]
1841 },
1842 {
1843 "cell_type": "code",
1844 "execution_count": 294,
1845 "metadata": {
1846 "collapsed": false
1847 },
1848 "outputs": [
1849 {
1850 "data": {
1851 "image/png": "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\ngg==\n",
1852 "text/plain": [
1853 "<IPython.core.display.Image object>"
1854 ]
1855 },
1856 "execution_count": 294,
1857 "metadata": {},
1858 "output_type": "execute_result"
1859 }
1860 ],
1861 "source": [
1862 "from IPython.display import Image\n",
1863 "Image(filename = 'case1_test1_Nx48.png')"
1864 ]
1865 },
1866 {
1867 "cell_type": "markdown",
1868 "metadata": {},
1869 "source": [
1870 "# <font color = \"red\">non-WENO and WENO derivative performance tests: negative linear weights $\\gamma_j$ </font>\n",
1871 "\n",
1872 "In this section we see issues that develop by trying to use the WENO procedure when negative linear weights show up. In the following section we work to implement a strategy analogous to Shi to use the negative linear weights.\n"
1873 ]
1874 },
1875 {
1876 "cell_type": "markdown",
1877 "metadata": {},
1878 "source": [
1879 "The function is not periodic, hence we use our weight matrices that are designed for restricted domains (we look at one small part) to examine the numerical approximation to the second derivative, the construction of this set of weight arrays is implemented in the function below:"
1880 ]
1881 },
1882 {
1883 "cell_type": "markdown",
1884 "metadata": {},
1885 "source": [
1886 "This isn't distinguishable from the expected oscillations that would happen if this truly were a convex combination. It is the WENO construction where the negative linear weights can conspire to cause noticeable damage. We show this next."
1887 ]
1888 },
1889 {
1890 "cell_type": "markdown",
1891 "metadata": {},
1892 "source": [
1893 "## Example: $\\partial_x^2 u = \\Delta_7^{(2)}u + O(\\Delta x^6)$ $S = 7, s_j = 5, q = 2$ : negative linear weights\n",
1894 "\n",
1895 "Note we have chosen the substencil size to be large enough so that $\\beta_j \\neq 0$, so that we have a measure of smoothness for the basis of the WENO weighting.\n",
1896 "\n",
1897 "We quote the following Mathematica output, here we have taken $i = 0$ without loss of generality:\n",
1898 "\n",
1899 "$$\\left\\{\\begin{array}{c}\n",
1900 "\\delta_0^{(2)} \\\\\n",
1901 "\\delta_1^{(2)} \\\\\n",
1902 "\\delta_2^{(2)} \n",
1903 "\\end{array}\\right\\} = \\left\\{\\begin{array}{c}\n",
1904 "\\frac{11 u_{-1}}{12}+\\frac{u_1}{2}+\\frac{u_2}{3}-\\frac{5 u_0}{3}-\\frac{u_3}{12}\\\\\n",
1905 "-\\frac{u_{-2}}{12}+\\frac{4 u_{-1}}{3}+\\frac{4 u_1}{3}-\\frac{5 u_0}{2}-\\frac{u_2}{12} \\\\\n",
1906 "-\\frac{u_{-3}}{12}+\\frac{u_{-2}}{3}+\\frac{u_{-1}}{2}+\\frac{11 u_1}{12}-\\frac{5 u_0}{3} \n",
1907 "\\end{array}\\right\\}$$\n",
1908 "\n",
1909 "and\n",
1910 "\n",
1911 "$$\\{\\gamma_0, \\gamma_1, \\gamma_2\\} = \\left\\{-\\frac{2}{15},\\frac{19}{15},-\\frac{2}{15}\\right\\}$$\n",
1912 "\n",
1913 "$$\n",
1914 "\\left\\{\\begin{array}{c}\n",
1915 "\\beta_0^{(2)} \\\\\n",
1916 "\\beta_1^{(2)} \\\\\n",
1917 "\\beta_2^{(2)} \n",
1918 "\\end{array}\\right\\}\n",
1919 "= \\left\\{\\begin{array}{c}\n",
1920 "\\frac{1}{3} \\left(10 u_{-1}^2-71 u_0 u_{-1}+93 u_1 u_{-1}-53 u_2 u_{-1}+11 u_3 u_{-1}+127 u_0^2+225 u_1^2+79 u_2^2+4 u_3^2-336 u_0 u_1+194 u_0 u_2-264 u_1 u_2-41 u_0 u_3+57 u_1 u_3-35 u_2 u_3\\right)\\\\[.2em]\n",
1921 "\\frac{1}{3} \\left(4 u_{-2}^2-29 u_{-1} u_{-2}+39 u_0 u_{-2}-23 u_1 u_{-2}+5 u_2 u_{-2}+55 u_{-1}^2+117 u_0^2+55 u_1^2+4 u_2^2-156 u_{-1} u_0+98 u_{-1} u_1-156 u_0 u_1-23 u_{-1} u_2+39 u_0 u_2-29 u_1 u_2\\right) \\\\[.2em]\n",
1922 "\\frac{1}{3} \\left(4 u_{-3}^2-35 u_{-2} u_{-3}+57 u_{-1} u_{-3}-41 u_0 u_{-3}+11 u_1 u_{-3}+79 u_{-2}^2+225 u_{-1}^2+127 u_0^2+10 u_1^2-264 u_{-2} u_{-1}+194 u_{-2} u_0-336 u_{-1} u_0-53 u_{-2} u_1+93 u_{-1} u_1-71 u_0 u_1\\right) \n",
1923 "\\end{array}\\right\\}\n",
1924 "$$"
1925 ]
1926 },
1927 {
1928 "cell_type": "markdown",
1929 "metadata": {},
1930 "source": [
1931 "We apply the scheme without any treatment of the negative linear weights, \n",
1932 "\n",
1933 "$$w_j \\frac{\\tilde{w}_j}{\\sum_k \\tilde{w}_k}, \\qquad \\tilde{w}_j = \\frac{\\gamma_j}{(\\varepsilon + \\beta_j)^2}$$\n",
1934 "\n",
1935 "In smooth regions we this would have a 6th order truncation error, in this case with negative linear weights we approximate with question:\n",
1936 "\n",
1937 "$$\\partial_x^2 u \\stackrel{?}{=} \\sum_j w_j \\delta_j^{(2)}u + O(\\Delta x^6)$$"
1938 ]
1939 },
1940 {
1941 "cell_type": "code",
1942 "execution_count": 85,
1943 "metadata": {
1944 "collapsed": true
1945 },
1946 "outputs": [],
1947 "source": [
1948 "import numpy as np\n",
1949 "\n",
1950 "def assemble_restricted_Wj_d2f(N, x, x_left = 2, x_right = 4):\n",
1951 " # assembles Wj in a restricted range of x_left <= x <= x_right\n",
1952 " \n",
1953 " W0, W1, W2 = np.zeros( (N, N) ), np.zeros( (N, N) ), np.zeros( (N, N) )\n",
1954 "\n",
1955 " # fill vals for W1\n",
1956 " w2m3, w2m2, w2m1, w20, w2p1 = -1/12., 1/3., 1/2., -5/3., 11/12.\n",
1957 " # fill vals for W2\n",
1958 " w1m2, w1m1, w10, w1p1, w1p2 = -1/12., 4./3, -5./2, 4./3, -1./12\n",
1959 " # fill vals for W3\n",
1960 " w0m1, w00, w0p1, w0p2, w0p3 = 11./12, -5./3, 1./2, 1./3, -1./12\n",
1961 " \n",
1962 " for i in range(N): \n",
1963 " if x_left <= x[i] <= x_right:\n",
1964 " \n",
1965 " W2[i,i-3] = w2m3\n",
1966 " W2[i, i-2] = w2m2\n",
1967 " W2[i, i-1] = w2m1\n",
1968 " W2[i,i] = w20\n",
1969 " W2[i,i+1] = w2p1\n",
1970 " \n",
1971 " W1[i,i-2] = w1m2\n",
1972 " W1[i,i-1] = w1m1\n",
1973 " W1[i, i] = w10\n",
1974 " W1[i,i+1] = w1p1\n",
1975 " W1[i,i+2] = w1p2\n",
1976 " \n",
1977 " W0[i,i-1] = w0m1\n",
1978 " W0[i, i] = w00\n",
1979 " W0[i, i+1] = w0p1\n",
1980 " W0[i,i+2] = w0p2\n",
1981 " W0[i,i+3] = w0p3 \n",
1982 " \n",
1983 " return W0, W1, W2"
1984 ]
1985 },
1986 {
1987 "cell_type": "markdown",
1988 "metadata": {},
1989 "source": [
1990 "We demonstrate how well WENO vs. non-WENO methods calculate a second derivative on the test function whose second derivative is discontinuous:\n",
1991 "\n",
1992 "$$f_5(x) = \\begin{cases}\n",
1993 "-4 x^2 & x < 0 \\\\\n",
1994 "4 x^2 & \\text{else}\n",
1995 "\\end{cases}\n",
1996 "$$\n",
1997 "\n",
1998 "$$\\partial_x^2 f_5 = \\begin{cases}\n",
1999 "-8 & x < 0 \\\\\n",
2000 "8 & \\text{else}\n",
2001 "\\end{cases}\n",
2002 "$$\n"
2003 ]
2004 },
2005 {
2006 "cell_type": "code",
2007 "execution_count": 1,
2008 "metadata": {
2009 "collapsed": false,
2010 "scrolled": true
2011 },
2012 "outputs": [],
2013 "source": [
2014 "%matplotlib inline\n",
2015 "import numpy as np\n",
2016 "import matplotlib.pyplot as plt\n",
2017 "\n",
2018 "def f5(x): \n",
2019 " Nx = len(x)\n",
2020 " f = np.zeros(Nx)\n",
2021 " for i in range(Nx): \n",
2022 " if x[i] < 0:\n",
2023 " f[i] = -x[i] ** 2\n",
2024 " else:\n",
2025 " f[i] = x[i] ** 2\n",
2026 " \n",
2027 " return f\n",
2028 "\n",
2029 "def d2f5(x):\n",
2030 " Nx = len(x)\n",
2031 " d2f = np.zeros(Nx)\n",
2032 " for i in range(Nx):\n",
2033 " \n",
2034 " if x[i] < 0:\n",
2035 " d2f[i] = -2.\n",
2036 " else:\n",
2037 " d2f[i] = 2.\n",
2038 " \n",
2039 " return d2f"
2040 ]
2041 },
2042 {
2043 "cell_type": "markdown",
2044 "metadata": {},
2045 "source": [
2046 "### WENO vs. non-WENO : $\\partial_x^2 f_5$"
2047 ]
2048 },
2049 {
2050 "cell_type": "code",
2051 "execution_count": 3,
2052 "metadata": {
2053 "collapsed": false,
2054 "scrolled": false
2055 },
2056 "outputs": [
2057 {
2058 "data": {
2059 "image/png": "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\nvFl//OMf1a5dO9WuXVtNmjTRueeeq7///e+SpNzcXIVCIW3atEl5eXkKhULFj4yMjDj+VIBgi0aj\ntkuAZcyA2+g//PCMMcZ2ETgkGo0qNTVVkUjkmBekneh2kpSRMUbTp18q6ZelrH1Xw4fP1lNP3f3T\nCrd0vGnTpum6665T7dq1FQ6H1aZNG61bt06vvvqqWrRooeXLl+vkk09WQUGBunbtqm+++Ubvvvuu\nzj77bEnSwoULlZ6erjPPPFPvv/++atasKUnasmWL2rRpo/PPP1+nn366mjVrpq+++kqvvPKKduzY\noccee0zXXnttTC0rVqzQr371KxUUFKhnz54699xz9f3332v16tVaunSp9u3bpy+++ELTp0/X/fff\nL0m64YYbivc/++yzFQ6H4/JzCTo/8wsAQGXE37o4MgiUSCRiJJlIJBKX7YwxpmPHfkY6aCRTyuOA\n6dixX7zKr9DjffrppyYhIcGcfvrpZsuWLTHrFi5caKpVq2YuueSS4mXvvPOOSUhIMO3btze7du0y\nW7ZsMS1btjR169Y1a9asidl/79695n//939LHLOgoMB07NjRNG7c2OzevTtm++TkZBMKhcyMGTNK\n7Ld58+aYf59yyimmbdu2ZXrdVYGf+QUAoDLib1388JEwB+zfX03S0S7wDv1nfeU73j//+U/t379f\n999/v1q0aBGzrlevXhowYIDmzp2rXbt2SZK6deum22+/XevXr9fvf/97XXXVVfrmm2/00EMP6Ywz\nzojZv0aNGmrdunWJYzZs2FCZmZkqKCjQv//97+Llc+fO1RdffKFwOKzBgweX2O+kk06Kx0sGAABw\nTnXbBaD8Va9+QJJR6SHi4H/WV77jvfvuu5KkxYsXa/ny5SXWb926VQcPHtS6deuKT8WOGzdOixcv\n1gsvvCBJGjZsmIYPH17q869evVp33323li5dqi1btmjPnj0x67/66qvi/y46ft++fX/y6wIAAMAh\nBBYHnHNOR33yyXsq/ZqS93TOOR0r5fG2bdsmSbr77qNfD+N5nr7//vuYZQMHDtSCBQvkeZ7++Mc/\nlrrf8uXL1atXLx08eFC9e/fWJZdcovr16ysUCmnlypV65ZVXtHfv3uLtd+zYIYkzKcCJCofDevXV\nV22XAYuYAbfRf/hBYHHA5Mlj9dZbg/XZZ3dIOlc/3hzuoKT3dOqpf9XkyS9WyuM1aNBAnudp586d\n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\nJI0aNcp2CbCMGXAb/YcfBBbHvL98uf5y3XW66/HHdc4vf1nljhdUvXr10iuvvKJFixaVCCyLFi1S\n3bp1deGFF2rx4sUl9l26dKkOHDig7t27KxQqeVL0tttu81XLaaedpg0bNuiWW2456hmdI33//ffq\n27evVq9ereHDh+uRRx5RrcO+pXz37t36wx/+oKefflp9+/bV8uXLVbt2bV91wS3p6em2S4BlzIDb\n6D/84CNhjjDG6P5Jk3Tfb36j7FWrdO9vfqMHbr9dxphKe7y8vDyFQiFlZGQoLy9PV1xxhZo2barE\nxET9/Oc/19y5c0vss2fPHt15550666yzVKdOHTVo0EDdu3fXiy++GJfnP5revXtL+jGcHGnRokW6\n8MILdfHFF+uLL77Q559/XmL94c/xU11++eXq2rWrcnJyFIlETmif++67T6tXr9b555+vadOmxYQV\nSUpMTNS0adPUrVs3ffzxx5oyZUpcagUAACCwOKCgoECD09Lk3XOPcrZuVVtJM7Zule6+W1f06qWC\ngoJKfbwvvvhC5557rjZt2qTf/e53Gjx4sFavXq1LLrkkJiD88MMPSk9P11//+ldJP56Ovuqqq/Tp\np59qyJAh+stf/vKTnv9YOnbsqObNm+ujjz7S9u3bi5d/9tln2rRpk9LS0pSWlibp0EfEihT9O16B\nJRQK6Z577pExRjfddNMJ7fPEE09IUvHPrjSe5xWvL9oeAADgJzMIlEgkYiSZSCQSl+2MMaZn585m\nmecZI5V4LPM8k9alS7zKr9Djbdy40XieZzzPM5MmTYpZ9/rrrxvP80zfvn2Ll91xxx3G8zwTDofN\ngQMHipd/88035pRTTjGe55lly5aV+fmPZ+jQocbzPDNr1qziZY8//rjxPM+sWLHCHDhwwDRp0sRc\nccUVxeu3bdtmPM8zLVq0KPF8RbVNmDDBjB8/vsTjrrvuitn+qaeeMp7nmb/97W/GGGP69+9vPM8z\nr776avE2ixcvNp7nmauuuqp42RdffGE8zzMJCQlmz549x3yNhYWFplq1aiYUCpnNmzcfdTs/84uq\n6eWXX7ZdAixjBtzmQv/5Wxc/nGFxwLCrr9baIz7CU2RNrVoadvXVlfp4bdu21a233hqzLD09XSef\nfLJWrFhRvGzatGkKhUK69957Y64Fad68uf72t78Vb1PW5z+e0j4WtmjRIjVo0EApKSkKhULq0aNH\nzHUsRf9ddPalNBMnTtSkSZNKPLKyso5Zz+TJk1WtWjWNGzfumHf32rJliySpadOmqlmz5jGfMzEx\nUU2aNJGtrkw/AAAgAElEQVT0493PgKPJycmxXQIsYwbcRv/hB4HFAf81YoSeb9FC+45Y/oOkF1q0\n0H+NGFGpj3f22WeXelerk08+ufjjZ999950+//xznXTSSTrttNNKbFsUJlauXFmm55d+vOZlwoQJ\nMY+JEycWr+/Vq5ek2MCyePFide/evfj5e/bsqa1bt+qTTz6J2fZoHwfzPE8HDx4s9XH4R89K06FD\nB1199dVau3atHn/88WNuW3SsE3Gi28FtpV03BrcwA26j//CDwOKAGjVqaOgNN+iZxMSY5c8kJmrY\njTcqISGhUh+vQYMGpS6vXr26Dh48KEnauXOnJKlly5alblu0vGg7v88v/RhYSjvTUSQ5OVnJycla\nt26dvvrqK3388cfaunVrcZCRVOI6loULF8rzvLhdv3KkSZMmqW7dupo4cWKp3xEjSa1atZIk5efn\na+/evcd8vt27d2vbtm2SpNatW8e3WAAA4CQCiyN+N3KkZp5xhsLt2xc/Zp1xRtzPdtg63vEUhY6i\njzcdqejjS0cLJyeiZ8+eJc5yHPlRq969e8sYo0WLFhWfPTn8416dOnVS06ZNtWjRIn399ddat26d\nTjnlFLVt27bMdR1L8+bNNWbMGG3dulV33XXXUc8knXzyydq3b59yc3OP+XxLlizRgQMHlJSURGAB\nAABxQWBxREJCgv4VjerVTz8tfvwrGo372Q5bxzueevXq6dRTT9XmzZu1YcOGEuuLrhVJSUkp1zoO\nv45l0aJFatKkiTp37ly83vM89ezZU7m5uXrjjTdi9ikvN910k1q3bq0pU6Zo8+bNpW5zzTXXSJL+\n8Y9/HPV5Dh48qDvuuEOSdN1118W/UFRZeXl5SjkvRXl5ebZLAQAEEIEFzsjMzJQxRmPGjIn5KFd+\nfr5uv/12eZ6nzMzMcq2h6ONfb775ppYuXaoePXqU2CYtLU07d+7UvffeK6n8A0tiYqJuv/127d69\nO+aam8PdeOON6tChg9566y1dc8012rNnT8z63bt369prr9Xbb7+ts846SzfccEO51ozKLyMjQ9KP\nYSVtUJpWnr5SaYPSCC0OKZoBuIn+ww++6R5VmjnsiypvuukmzZ8/X6+88oq6dOmivn37qrCwUDNn\n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\n",
2060 "text/plain": [
2061 "<IPython.core.display.Image object>"
2062 ]
2063 },
2064 "execution_count": 3,
2065 "metadata": {},
2066 "output_type": "execute_result"
2067 }
2068 ],
2069 "source": [
2070 "from IPython.display import Image\n",
2071 "Image(filename = 'WENO_vs_nonWENO_q2.png')"
2072 ]
2073 },
2074 {
2075 "cell_type": "markdown",
2076 "metadata": {},
2077 "source": [
2078 "The WENO estimates does worse than the non-WENO estimate; this is reason negative weights should be dealt with rather than ignored. They can produce nonlinear weights whose combination produces the non-convex result of non-monotonicity where there used to be monotonicty. The oscillations still happen in the non-WENO case, this is well known, but what is disappointing is that it is exacerbated in the WENO case. A procedure that outperforms non-WENO when the weights are positive and a scheme that is designed to handle cases like this (discontinuity) evidently doesn't handle cases like this when the particular situation happens where one or more weights are negative."
2079 ]
2080 },
2081 {
2082 "cell_type": "markdown",
2083 "metadata": {},
2084 "source": [
2085 "Comparing the two estimates, the WENO estimate has more severe oscillations, at greater magnitude and also with greater extent in the abscissa."
2086 ]
2087 },
2088 {
2089 "cell_type": "markdown",
2090 "metadata": {},
2091 "source": [
2092 "\n",
2093 "## <font color = \"purple\">Strategies to repurpose negative linear weights $\\partial_x^{q}u(x_i) = \\sum_j \\gamma_j \\delta_j^{(q)}u(x_i) \\longrightarrow \\sum_j \\tilde{\\gamma}_j \\delta_j^{(q)}u(x_i)$ to retain the convex combination</font>"
2094 ]
2095 },
2096 {
2097 "cell_type": "markdown",
2098 "metadata": {},
2099 "source": [
2100 "### <font color = \"blue\">1. The interpolation problem</font>\n",
2101 "\n",
2102 "We present here a thought process for designing a means of using negative weights without discarding them. The main issue apprehended is the undesired introduction of non-monotonicity into the interpolation whenever negative weights are involved, which makes the WENO interplation a non-convex combination. The negative nonlinear weights themselves \" can become extremely large or small due to the lack of convexity\"[Shi et al. JCP 175, 108–127 (2002) doi:10.1006/jcph.2001.6892]. The strategy to include these weights in the contribution can be done so carefully by decomposing negative weights into positive and negative parts, and individually scaling them so that they are separately bounded by fixed constants.\n",
2103 "\n",
2104 "In this section, we will arrive at the same conclusions as Shi and Shu; however, we provide details of how and why decisions are made. As can be seen in this section, there is some latitude here in the decisions made that can be decided differently if desired.\n",
2105 "\n",
2106 "For ease of comparison, in this section we adopt some notation from Shi and Shu. We also repeat key parameters for a reminder:\n",
2107 "\n",
2108 "<ul>\n",
2109 "<li> $x_G$ : the interpolation point of consideration\n",
2110 "<li> $\\gamma_j$ : linear weights\n",
2111 "<li> $w_j$ : nonlinear (WENO) weights\n",
2112 "<li> $\\beta_j$ : smoothness indicators\n",
2113 "<li> $p$ : full interpolant over the full stencil $S = \\bigcup_j S_j$\n",
2114 "<li> $p_j$ : subinterpolants over the substencils $S_j$\n",
2115 "<li> $Q$ : the non-WENO interpolation polynomial (i.e. linear combination of linear weights $\\gamma_j$), which satisfies the <i>equality</i> $Q(x_G) = \\sum_j \\gamma_j p_j = p(x_G)$\n",
2116 "<li> $R$ : the WENO interpolation polynomial, ideally we aim to design our polynomials so that $R(x_G) \\simeq Q(x_G)$ in smooth regions. The interpolation polynomial $R$ is constructed based on the WENO weights, $R(x_G) =\\sum_j w_j p_j(x_G)$\n",
2117 "</ul>\n",
2118 "\n",
2119 "any other parameters will be motivated in the development."
2120 ]
2121 },
2122 {
2123 "cell_type": "markdown",
2124 "metadata": {},
2125 "source": [
2126 "\n",
2127 "### non-WENO construction when $\\gamma_j < 0$\n",
2128 "\n",
2129 "If $\\gamma_j > 0$, proceed as before, we compute the reconstruction with linear weights $\\gamma_j$ as $Q(x_G) = \\sum_j \\gamma_j p_j(x_G)$.\n",
2130 "\n",
2131 "If any weight is negative, then we decompose all weights into positive and negative parts.\n",
2132 "\n",
2133 "\\begin{eqnarray*}\n",
2134 "Q(x_G) & = & \\sum_j \\gamma_j p_j(x_G) , \\qquad \\sum_j \\gamma_j = 1\\\\[.1em]\n",
2135 " & = & \\sum_j \\left[ \\gamma_j + \\frac{1}{2}\\theta |\\gamma_j| - \\frac{1}{2}\\theta |\\gamma_j|\\right]p_j(x_G), \\quad \\theta\\in\\mathbb{R}, \\theta > 1 \\\\[.1em]\n",
2136 " & = & \\sum_j \\left[ \\frac{1}{2}\\left(\\gamma_j + \\theta |\\gamma_j|\\right) - \\frac{1}{2}\\left(\\theta |\\gamma_j| - \\gamma_j\\right)\\right]p_j(x_G)\\\\[.1em]\n",
2137 " & = & \\sum_j \\left[ \\tilde{\\gamma}_j^+ - \\tilde{\\gamma}_j^-\\right]p_j(x_G), \\qquad \\text{ where } \\tilde{\\gamma}_j^{\\pm} = \\frac{1}{2}\\left(\\theta |\\gamma_j| \\pm \\gamma_j\\right), \\tilde{\\gamma}_j^+ - \\gamma_j^- = \\gamma_j \\\\[.1em]\n",
2138 " & = & \\sum_j \\tilde{\\gamma}_j^+p_j(x_G) - \\sum_j \\tilde{\\gamma}_j^-p_j(x_G) , \\qquad \\text{ but } \\sum_j \\tilde{\\gamma}_j^{\\pm} = \\frac{1}{2}\\left(\\theta \\sum_j|\\gamma_j| \\pm 1\\right) \\neq 1\\\\[.1em]\n",
2139 "\\end{eqnarray*}\n",
2140 "\n",
2141 "The issue with convexity is present on the first line, where the expression of the combination $\\sum_j \\gamma_j p_j(x_G)$ has the property that while $\\sum_j \\gamma_j = 1$, we have $\\gamma_j \\lessgtr 0$. Thus, we start with a non-convex combination, and choose to rewrite the sum in as a partition of two positive and negative parts ($\\tilde{\\gamma}_j^+, \\tilde{\\gamma}_j^-$). These affine combinations are not convex,\n",
2142 "\n",
2143 "$$\\sigma^{\\pm} = \\sum_j \\tilde{\\gamma}_j^{\\pm} = \\frac{1}{2}\\left(\\theta\\sum_j |\\gamma_j| \\pm 1\\right)$$\n",
2144 "\n",
2145 "Note that since $\\gamma_j \\lessgtr 0$, then $\\sum_j |\\gamma_j| > 1 \\Rightarrow \\theta\\sum_j |\\gamma_j| > 1$ for $\\theta > 1$. Thus, to guarantee convexity we understand this requires a decision above that $\\theta > 1$ as claimed. The restore convexity, we normalize the set of coefficients $\\tilde{\\gamma}_j^{\\pm}$ by exactly $\\sigma^{\\pm}$, i.e. we define\n",
2146 "\n",
2147 "$$\\gamma_j^{\\pm} = \\frac{\\tilde{\\gamma}_j^{\\pm}}{\\sigma^{\\pm}}, \\qquad \\sigma^{\\pm} = \\sum_j \\tilde{\\gamma}_j^{\\pm} = \\frac{1}{2}\\left(\\theta\\sum_j |\\gamma_j| \\pm 1\\right) \\Rightarrow \\tilde{\\gamma}_j^{\\pm} = \\sigma^{\\pm} \\gamma_j^{\\pm}$$\n",
2148 "\n",
2149 "thus we make progress on the form of the interpolation polynomial $Q(x_G)$ by writing:\n",
2150 "\n",
2151 "$$\\boxed{Q(x_G) = \\sigma^+ \\sum_j \\gamma_j^+p_j(x_G) - \\sigma^- \\sum_j \\gamma_j^-p_j(x_G)} \\qquad \\text{non-WENO interpolation}$$\n",
2152 "\n",
2153 "or, if we define positive and negative contributions to the interpolant, we quote as in Shi et al.\n",
2154 "\n",
2155 "$$\\boxed{Q(x_G) = \\sigma^+ Q^+(x_G) - \\sigma^- Q^-(x_G)}$$\n",
2156 "\n",
2157 "for $Q^{\\pm}(x_G) = \\sum_j \\gamma_j^{\\pm} p_j(x_G)$"
2158 ]
2159 },
2160 {
2161 "cell_type": "markdown",
2162 "metadata": {},
2163 "source": [
2164 "### WENO construction when $\\gamma_j < 0$\n",
2165 "\n",
2166 "It is straightforward to generalize this to a WENO reconstruction $R(x_G)$. We aim to have $R(x_G) \\simeq Q(x_G)$ in smooth regions. Recalling the non-WENO interpolant $Q(x_G) = \\sigma^+ \\sum_j \\gamma_j^+p_j(x_G) - \\sigma^- \\sum_j \\gamma_j^-p_j(x_G)$\n",
2167 "\n",
2168 "Just as would be done for a WENO design for $\\gamma_j > 0 \\, \\forall j$ cases, we define WENO nonlinear weights for each convex combination above separately, that is\n",
2169 "\n",
2170 "$$w_j^{\\pm} = \\frac{\\tilde{w}_j^{\\pm}}{\\sum_k \\tilde{w}_k^{\\pm}}, \\qquad \\text{ where } \\tilde{w}_j^{\\pm} = \\frac{\\gamma_j^{\\pm}}{(\\varepsilon + \\beta_j)^2}, \\quad \\beta_j = \\sum_{\\ell = 1}^k \\Delta x^{2\\ell - 1} \\int_{x_{i-1/2}}^{x_{i+1/2}} dx \\, \\left( \\frac{d^{\\ell}p_j^{(j)}}{dx^{\\ell}}\\right)$$\n",
2171 "\n",
2172 "so that we have $Q(x_G) \\rightarrow R(x_G)$,\n",
2173 "\n",
2174 "$$\\boxed{R(x_G) = \\sigma^+ \\sum_j w_j^+ p_j(x_G) - \\sigma^- \\sum_j w_j^- p_j(x_G)}$$\n",
2175 "\n",
2176 "where the smoothness indicators $\\beta_j$ have the same definition as before, and \n",
2177 "\n"
2178 ]
2179 },
2180 {
2181 "cell_type": "markdown",
2182 "metadata": {},
2183 "source": [
2184 "### <font color = \"blue\">2. The derivative problem</font>\n",
2185 "\n",
2186 "The conclusions from the $\\gamma_j > 0$ cases as applied to derivatives carry over here. We review our derivative notation as a reminder:\n",
2187 "\n",
2188 "\n",
2189 "<ul>\n",
2190 "<li> $q$ : order of derivative\n",
2191 "<li> $S$ : full stencil with size $s$, $S = \\bigcup_j S_j$\n",
2192 "<li> $S_j$ : substencil with size $s_j < s$\n",
2193 "<li> $j$ : substencil label, $j = 1, 2, \\ldots s - s_j + 1$, $j = 1$ corresponds to the leftmost stencil\n",
2194 "<li> $\\gamma_j$ : linear weights, decomposed as $\\gamma_j = \\tilde{\\gamma}_j^+ - \\tilde{\\gamma}_j^-$ (see previous section for definitions)\n",
2195 "<li> $w_j$ : nonlinear weights, \n",
2196 "<li> $\\Delta_S^{(q)}$ : finite difference expression on full stencil $S$ (normalized by $(\\Delta x)^q$), i.e. $\\Delta_S^{(q)} = \\sum_{k=1}^s W_k u_{i + S_k}$ where $W_k$ and $S_k$ are the $k$th finite difference weight and stencil point, respectively\n",
2197 "<li> $\\delta_j^{(q)}$ : finite difference expression on substencil $S_j$ (normalized by $(\\Delta x)^q$), i.e. $\\delta_j^{(q)} = \\sum_{k=1}^s W_{j,k} u_{i + S_{j,k}}$ where $W_{j,k}$ and $S_{j,k}$ are the $k$th finite difference weight and stencil point for the substencil $j$, respectively\n",
2198 "<li>\n",
2199 "</ul>\n",
2200 "\n",
2201 "The only difference as before is the definition of smoothness, which for the $q$th derivatives should be based on its derivatives (i.e. $q' > q + 1$), so the smoothness indicator is defind as before:\n",
2202 "\n",
2203 "$$\\beta^q_j = \\sum_{\\ell = q+1}^{s_j-1} \\Delta x^{2\\ell - 1} \\int_{x_{i-1/2}}^{x_{i+1/2}} dx \\, \\left( \\frac{d^{\\ell}p_{j}}{dx^{\\ell}}\\right)^2, \\qquad j = 1, 2, \\ldots , s - s_j + 1$$\n"
2204 ]
2205 },
2206 {
2207 "cell_type": "markdown",
2208 "metadata": {},
2209 "source": [
2210 "With this one change, we compute $w_j^{\\pm}$, $\\sigma^{\\pm}$ as in the interpolation problem (previous section), and we have the WENO derivative construction:\n",
2211 "\n",
2212 "$$\\boxed{\\Delta^{(q),WENO}_S [u_i] = \\sigma^+ \\sum_j w_j^+ \\delta^{(q),+}_j [u_i] - \\sigma^- \\sum_j w_j^- \\delta^{(q),-}_j[u_i]}, \\qquad q\\text{th order WENO derivative calculation}$$\n",
2213 "\n",
2214 "For some $M$ (depends on $q$ and stencil size)"
2215 ]
2216 },
2217 {
2218 "cell_type": "markdown",
2219 "metadata": {},
2220 "source": [
2221 "This recovers the exact same result as before, thus showing the partition is equivalent."
2222 ]
2223 },
2224 {
2225 "cell_type": "markdown",
2226 "metadata": {
2227 "collapsed": true
2228 },
2229 "source": [
2230 "## WENO with negative linear weights, splitting vs. non-splitting on $\\partial_x^2 f_5$\n",
2231 "\n",
2232 "we call the above repurposing of linear coefficients into positive and negative parts as splitting. This is allegedly a procedure to use the negative weights in a way that will not produce as signfiicant oscillations."
2233 ]
2234 },
2235 {
2236 "cell_type": "code",
2237 "execution_count": 4,
2238 "metadata": {
2239 "collapsed": false
2240 },
2241 "outputs": [
2242 {
2243 "data": {
2244 "image/png": "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\ns2nTJt1///1q2LCh9uzZo9tuu03vv/9+2cX2pR555BH98MMPys3N1WWXXRaw7LHHHtOCBQsCxuLi\n4iQdvksYgOMbMmSI7RBgGTXgbeQf4eAaFg9o0qSJ3n33ZQ0cmKX27XspKSlD7dv30sCBWXr33ZfV\npEmTqJyva9euMsZo2bJlJ7R+cXGx+vXrp/3792vOnDkaOXKkPvnkk4A7dZX63//+p0aNGgU1K5K0\ndOnSkLFI0htvvHFCsVSrVk0//hjZr+IB0aRnz562Q4Bl1IC3kX+EgzMsHtGkSZOI3rrYDfMNGTJE\n//znP3XvvfeqdevWat26dcDyAwcO6P3339ell14qSbr//vv18ccfa+TIkUpPT1daWppyc3P17LPP\nKj09XX379i3btlWrVtq4caM+/fRTdejQoWx8ypQpWrJkSVAsvXr1UmJioubPn6+5c+fq17/+dcDy\nLVu2qHnz5mV/b9SokT799FMVFxcHnd0BAADAETQsiFpt2rTR1KlTNWjQIJ177rm66qqr1Lp1ax08\neFCbN2/W8uXL1bRpU61du1bz5s3T008/rYsvvlh/+ctfJEk+n0+zZs1Sp06ddNttt+mCCy5Qy5Yt\nJUlDhw7VG2+8oW7duumGG25Q/fr19dFHH+mdd97R9ddfr1deeSUgltjYWM2dO1c9e/ZUv3799Oyz\nz+rCCy/U/v37tW7dOuXk5OjgwYNl619++eX66KOP9Mtf/lLdunVT9erV1alTJ1177bWVdwABAACi\nAF8JQ1QbMGCA8vLyNGDAAH3yySd6+umnNXPmTH3++ee64YYb9I9//ENffvmlbr31VjVs2FCzZs2S\nz3ek7Js3b66pU6dq9+7d6t+/vw4dOiRJuvLKK7Vw4UK1b99eL7/8sqZNm6ZatWopNzdX11xzjRwn\n+A5oKSkp+vjjjzV48GDl5+dr4sSJmjlzpr7//vuyJqnUgw8+qDvvvFObNm3SY489ptGjRysrK6ti\nDxbgIvPnz7cdAiyjBryN/CMcPOneZSriSfcAKhc/n8fXr18/vfxyZG/4gehCDXibF/LPe0HkcIYF\nAFDpqvoHFRwfNeBt5B/hoGEBAAAA4Fo0LAAAAABci4YFAAAAgGvRsAAAKl1mZuZx1ykoKFDyxckq\nKCg4oXE3b2N7fjfGXFoD0RRzRWxje35bMR/9O8ALxwynyMBV8vLyjCSTl5cXkfUAVD5+Po9v5syZ\n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\n",
2245 "text/plain": [
2246 "<IPython.core.display.Image object>"
2247 ]
2248 },
2249 "execution_count": 4,
2250 "metadata": {},
2251 "output_type": "execute_result"
2252 }
2253 ],
2254 "source": [
2255 "from IPython.display import Image\n",
2256 "Image(filename = 'WENO-negative-weights_q2.png')"
2257 ]
2258 },
2259 {
2260 "cell_type": "markdown",
2261 "metadata": {},
2262 "source": [
2263 "However, this splitting does not appear to have any effect"
2264 ]
2265 }
2266 ],
2267 "metadata": {
2268 "kernelspec": {
2269 "display_name": "Python 2",
2270 "language": "python",
2271 "name": "python2"
2272 },
2273 "language_info": {
2274 "codemirror_mode": {
2275 "name": "ipython",
2276 "version": 2
2277 },
2278 "file_extension": ".py",
2279 "mimetype": "text/x-python",
2280 "name": "python",
2281 "nbconvert_exporter": "python",
2282 "pygments_lexer": "ipython2",
2283 "version": "2.7.3"
2284 }
2285 },
2286 "nbformat": 4,
2287 "nbformat_minor": 0
2288}