"
]
From df64f00a2cf75ad16ddeb041b76ad1af038bbdc3 Mon Sep 17 00:00:00 2001
From: Rini Banerjee <26858592+rbanerjee20@users.noreply.github.com>
Date: Thu, 27 Aug 2020 15:29:39 +0100
Subject: [PATCH 06/19] Added explanation for Neumann condition and removed
unnecessary substitution description.
---
.../02_wave/src-wave/wave1D/wave1D_n0.py | 55 +++++
fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb | 218 ++----------------
2 files changed, 74 insertions(+), 199 deletions(-)
diff --git a/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_n0.py b/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_n0.py
index 16569d37..443b26ef 100644
--- a/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_n0.py
+++ b/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_n0.py
@@ -28,6 +28,61 @@
solution on the screen (as an animation).
"""
import numpy as np
+from devito import Constant, Grid, TimeFunction, SparseTimeFunction, SparseFunction, Eq, solve, Operator, Buffer
+
+def solver(I, V, f, c, L, dt, C, T, user_action=None):
+ """Solve u_tt=c^2*u_xx + f on (0,L)x(0,T]."""
+ Nt = int(round(T/dt))
+ t = np.linspace(0, Nt*dt, Nt+1) # Mesh points in time
+ dx = dt*c/float(C)
+ Nx = int(round(L/dx))
+ x = np.linspace(0, L, Nx+1) # Mesh points in space
+ C2 = C**2 # Help variable in the scheme
+ # Make sure dx and dt are compatible with x and t
+ dx = x[1] - x[0]
+ dt = t[1] - t[0]
+
+ if f is None or f == 0 :
+ f = lambda x, t: 0
+ if V is None or V == 0:
+ V = lambda x: 0
+
+ grid = Grid(shape=(Nx+1), extent=(L))
+ t_s = grid.stepping_dim
+
+ u = TimeFunction(name='u', grid=grid, time_order=2, space_order=2)
+ # Initialise values
+ for i in range(Nx+1):
+ u.data[:,i] = I(x[i])
+
+ x_dim = grid.dimensions[0]
+ t_dim = grid.time_dim
+
+ pde = (1/c**2)*u.dt2-u.dx2
+ stencil = Eq(u.forward, solve(pde, u.forward))
+
+ # Source term and injection into equation
+ dt_symbolic = grid.time_dim.spacing
+ src = SparseTimeFunction(name='f', grid=grid, npoint=Nx+1, nt=Nt+1)
+ for i in range(Nt):
+ src.data[i] = f(x, t[i])
+ src.coordinates.data[:, 0] = x
+ src_term = src.inject(field=u.forward, expr=src * (dt_symbolic**2))
+
+ v = SparseFunction(name='v', grid=grid, npoint=Nx+1, nt=1)
+ v.data[:] = V(x[:])
+ stencil_init = stencil.subs(u.backward, u.forward - 2*dt_symbolic*v)
+
+ # Boundary condition
+ bc = [Eq(u[t_s+1, 0], u[t_s+1, 1])]
+
+ op_init = Operator([stencil_init]+bc)
+ op = Operator([stencil]+src_term+bc)
+
+ op_init.apply(time_M=1, dt=dt)
+ op.apply(time_m=1,time_M=Nt, dt=dt)
+
+ return u.data[-1], x, t, 0
def python_solver(I, V, f, c, L, dt, C, T, user_action=None):
"""
diff --git a/fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb b/fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb
index 46869e3a..33153c0e 100644
--- a/fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb
+++ b/fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb
@@ -91,10 +91,7 @@
"\n",
"\n",
"How can we incorporate the condition ([1](#wave:pde1:Neumann:0))\n",
- "in the finite difference scheme? Since we have used central\n",
- "differences in all the other approximations to derivatives in the\n",
- "scheme, it is tempting to implement ([1](#wave:pde1:Neumann:0)) at\n",
- "$x=0$ and $t=t_n$ by the difference"
+ "in the finite difference scheme? We can see that, on the boundary"
]
},
{
@@ -106,7 +103,7 @@
"\n",
"$$\n",
"\\begin{equation}\n",
- "[D_{2x} u]^n_0 = \\frac{u_{-1}^n - u_1^n}{2\\Delta x} = 0\n",
+ "u_x \\approx \\frac{u_1^n - u_0^n}{\\Delta x} = 0\n",
"\\thinspace .\n",
"\\label{wave:pde1:Neumann:0:cd} \\tag{2}\n",
"\\end{equation}\n",
@@ -117,137 +114,17 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "The problem is that $u_{-1}^n$ is not a $u$ value that is being\n",
- "computed since the point is outside the mesh. However, if we combine\n",
- "([2](#wave:pde1:Neumann:0:cd)) with the scheme\n",
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "\n",
- "\n",
- "$$\n",
- "\\begin{equation}\n",
- "u^{n+1}_i = -u^{n-1}_i + 2u^n_i + C^2\n",
- "\\left(u^{n}_{i+1}-2u^{n}_{i} + u^{n}_{i-1}\\right),\n",
- "\\label{wave:pde1:Neumann:0:scheme} \\tag{3}\n",
- "\\end{equation}\n",
- "$$"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "for $i=0$, we can eliminate the fictitious value $u_{-1}^n$. We see that\n",
- "$u_{-1}^n=u_1^n$ from ([2](#wave:pde1:Neumann:0:cd)), which\n",
- "can be used in ([3](#wave:pde1:Neumann:0:scheme)) to\n",
- "arrive at a modified scheme for the boundary point $u_0^{n+1}$:"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "\n",
- "\n",
- "$$\n",
- "\\begin{equation}\n",
- "u^{n+1}_i = -u^{n-1}_i + 2u^n_i + 2C^2\n",
- "\\left(u^{n}_{i+1}-u^{n}_{i}\\right),\\quad i=0 \\thinspace . \\label{_auto1} \\tag{4}\n",
- "\\end{equation}\n",
- "$$"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "[Figure](#wave:pde1:fig:Neumann:stencil) visualizes this equation\n",
- "for computing $u^3_0$ in terms of $u^2_0$, $u^1_0$, and\n",
- "$u^2_1$.\n",
- "\n",
- "\n",
- "\n",
- "\n",
- "\n",
- "
Modified stencil at a boundary with a Neumann condition.
\n",
- "\n",
- "\n",
- "\n",
- "\n",
- "\n",
- "Similarly, ([1](#wave:pde1:Neumann:0)) applied at $x=L$\n",
- "is discretized by a central difference"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "\n",
- "\n",
- "$$\n",
- "\\begin{equation}\n",
- "\\frac{u_{N_x+1}^n - u_{N_x-1}^n}{2\\Delta x} = 0\n",
- "\\thinspace .\n",
- "\\label{wave:pde1:Neumann:0:cd2} \\tag{5}\n",
- "\\end{equation}\n",
- "$$"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Combined with the scheme for $i=N_x$ we get a modified scheme for\n",
- "the boundary value $u_{N_x}^{n+1}$:"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "\n",
- "\n",
- "$$\n",
- "\\begin{equation}\n",
- "u^{n+1}_i = -u^{n-1}_i + 2u^n_i + 2C^2\n",
- "\\left(u^{n}_{i-1}-u^{n}_{i}\\right),\\quad i=N_x \\thinspace . \\label{_auto2} \\tag{6}\n",
- "\\end{equation}\n",
- "$$"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The modification of the scheme at the boundary is also required for\n",
- "the special formula for the first time step. How the stencil moves\n",
- "through the mesh and is modified at the boundary can be illustrated by\n",
- "an animation in a [web page](mov-wave/N_stencil_gpl/index.html)\n",
- "or a [movie file](mov-wave/N_stencil_gpl/movie.ogg).\n",
- "\n",
- "\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Solvers (testing purposes)\n"
+ "Therefore, we can pass the following equation as a boundary condition to the Devito `Operator`:\n",
+ "```python\n",
+ "bc = [Eq(u[t_s+1, 0], u[t_s+1, 1])]\n",
+ "```\n",
+ "## Solver\n",
+ "Now, let's take a look at the full Devito solver function. The solver is very similar to the one in the waves [Implementation](wave1D_prog.ipynb) section, except for the boundary condition."
]
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": 34,
"metadata": {},
"outputs": [],
"source": [
@@ -259,7 +136,7 @@
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
@@ -337,7 +214,7 @@
},
{
"cell_type": "code",
- "execution_count": 20,
+ "execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
@@ -398,7 +275,7 @@
},
{
"cell_type": "code",
- "execution_count": 21,
+ "execution_count": 33,
"metadata": {},
"outputs": [
{
@@ -447,69 +324,6 @@
"plt.show()"
]
},
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "\n",
- "## Implementation of Neumann conditions\n",
- "\n",
- "\n",
- "We have seen in the preceding section\n",
- "that the special formulas for the boundary points\n",
- "arise from replacing $u_{i-1}^n$ by $u_{i+1}^n$ when computing\n",
- "$u_i^{n+1}$ from the stencil formula for $i=0$. Similarly, we\n",
- "replace $u_{i+1}^n$ by $u_{i-1}^n$ in the stencil formula\n",
- "for $i=N_x$. This observation can conveniently\n",
- "be used in the coding: we just work with the general stencil formula,\n",
- "but write the code such that it is easy to replace `u[i-1]` by\n",
- "`u[i+1]` and vice versa. This is achieved by\n",
- "having the indices `i+1` and `i-1` as variables `ip1` (`i` plus 1)\n",
- "and `im1` (`i` minus 1), respectively.\n",
- "At the boundary we can easily define `ip1=i+1` while we use\n",
- "`im1=i-1` in the internal parts of the mesh. Here are the details\n",
- "of the implementation (note that the updating formula for `u[i]`\n",
- "is the general stencil formula):"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "```python\n",
- "i = 0\n",
- "ip1 = i+1\n",
- "im1 = ip1 # i-1 -> i+1\n",
- "u[i] = u_n[i] + C2*(u_n[im1] - 2*u_n[i] + u_n[ip1])\n",
- "\n",
- "i = Nx\n",
- "im1 = i-1\n",
- "ip1 = im1 # i+1 -> i-1\n",
- "u[i] = u_n[i] + C2*(u_n[im1] - 2*u_n[i] + u_n[ip1])\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "We can in fact create one loop over both the internal and boundary\n",
- "points and use only one updating formula:"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "```python\n",
- "for i in range(0, Nx+1):\n",
- " ip1 = i+1 if i < Nx else i-1\n",
- " im1 = i-1 if i > 0 else i+1\n",
- " u[i] = u_n[i] + C2*(u_n[im1] - 2*u_n[i] + u_n[ip1])\n",
- "```"
- ]
- },
{
"cell_type": "markdown",
"metadata": {},
@@ -528,7 +342,13 @@
"with a plug wave at rest and see that the initial condition is\n",
"reached again perfectly after one period of motion, but such\n",
"a test requires $C=1$ (so the numerical solution coincides with\n",
- "the exact solution of the PDE, see the section [Numerical dispersion relation](wave_analysis.ipynb#wave:pde1:num:dispersion)).\n",
+ "the exact solution of the PDE, see the section [Numerical dispersion relation](wave_analysis.ipynb#wave:pde1:num:dispersion)).\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
"\n",
"\n",
"## Index set notation\n",
From b7da7a10364f5e3a6691e020b1b614a763ea552d Mon Sep 17 00:00:00 2001
From: Rini Banerjee <26858592+rbanerjee20@users.noreply.github.com>
Date: Thu, 27 Aug 2020 16:34:52 +0100
Subject: [PATCH 07/19] Removed more unnecessary text sections.
---
.../02_wave/src-wave/wave1D/wave1D_n0.py | 4 +-
fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb | 538 +-----------------
2 files changed, 14 insertions(+), 528 deletions(-)
diff --git a/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_n0.py b/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_n0.py
index 443b26ef..4c3891ef 100644
--- a/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_n0.py
+++ b/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_n0.py
@@ -109,7 +109,7 @@ def python_solver(I, V, f, c, L, dt, C, T, user_action=None):
u_n = np.zeros(Nx+1) # Solution at 1 time level back
u_nm1 = np.zeros(Nx+1) # Solution at 2 time levels back
- import time; t0 = time.clock() # CPU time measurement
+ import time; t0 = time.perf_counter() # CPU time measurement
# Load initial condition into u_n
for i in range(0, Nx+1):
@@ -151,7 +151,7 @@ def python_solver(I, V, f, c, L, dt, C, T, user_action=None):
# Wrong assignment u = u_nm1 must be corrected before return
u = u_n
- cpu_time = time.clock() - t0
+ cpu_time = time.perf_counter() - t0
return u, x, t, cpu_time
from wave1D_u0 import viz
diff --git a/fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb b/fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb
index 33153c0e..26a5c45b 100644
--- a/fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb
+++ b/fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb
@@ -124,7 +124,7 @@
},
{
"cell_type": "code",
- "execution_count": 34,
+ "execution_count": 65,
"metadata": {},
"outputs": [],
"source": [
@@ -136,89 +136,12 @@
},
{
"cell_type": "code",
- "execution_count": 31,
+ "execution_count": 66,
"metadata": {},
"outputs": [],
"source": [
- "# %load -s python_solver, src-wave/wave1D/wave1D_n0.py\n",
- "def python_solver(I, V, f, c, L, dt, C, T, user_action=None):\n",
- " \"\"\"\n",
- " Solve u_tt=c^2*u_xx + f on (0,L)x(0,T].\n",
- " u(0,t)=U_0(t) or du/dn=0 (U_0=None), u(L,t)=U_L(t) or du/dn=0 (u_L=None).\n",
- " \"\"\"\n",
- " Nt = int(round(T/dt))\n",
- " t = np.linspace(0, Nt*dt, Nt+1) # Mesh points in time\n",
- " dx = dt*c/float(C)\n",
- " Nx = int(round(L/dx))\n",
- " x = np.linspace(0, L, Nx+1) # Mesh points in space\n",
- " C2 = C**2; dt2 = dt*dt # Help variables in the scheme\n",
- " # Make sure dx and dt are compatible with x and t\n",
- " dx = x[1] - x[0]\n",
- " dt = t[1] - t[0]\n",
- "\n",
- " # Wrap user-given f, V\n",
- " if f is None or f == 0:\n",
- " f = (lambda x, t: 0)\n",
- " if V is None or V == 0:\n",
- " V = (lambda x: 0)\n",
- "\n",
- " u = np.zeros(Nx+1) # Solution array at new time level\n",
- " u_n = np.zeros(Nx+1) # Solution at 1 time level back\n",
- " u_nm1 = np.zeros(Nx+1) # Solution at 2 time levels back\n",
- "\n",
- " import time; t0 = time.perf_counter() # CPU time measurement\n",
- "\n",
- " # Load initial condition into u_n\n",
- " for i in range(0, Nx+1):\n",
- " u_n[i] = I(x[i])\n",
- "\n",
- " if user_action is not None:\n",
- " user_action(u_n, x, t, 0)\n",
- "\n",
- " # Special formula for the first step\n",
- " for i in range(0, Nx+1):\n",
- " ip1 = i+1 if i < Nx else i-1\n",
- " im1 = i-1 if i > 0 else i+1\n",
- " u[i] = u_n[i] + dt*V(x[i]) + \\\n",
- " 0.5*C2*(u_n[im1] - 2*u_n[i] + u_n[ip1]) + \\\n",
- " 0.5*dt2*f(x[i], t[0])\n",
- "\n",
- " if user_action is not None:\n",
- " user_action(u, x, t, 1)\n",
- "\n",
- " # Update data structures for next step\n",
- " #u_nm1[:] = u_n; u_n[:] = u # safe, but slower\n",
- " u_nm1, u_n, u = u_n, u, u_nm1\n",
- "\n",
- " for n in range(1, Nt):\n",
- " for i in range(0, Nx+1):\n",
- " ip1 = i+1 if i < Nx else i-1\n",
- " im1 = i-1 if i > 0 else i+1\n",
- " u[i] = - u_nm1[i] + 2*u_n[i] + \\\n",
- " C2*(u_n[im1] - 2*u_n[i] + u_n[ip1]) + \\\n",
- " dt2*f(x[i], t[n])\n",
- "\n",
- " if user_action is not None:\n",
- " if user_action(u, x, t, n+1):\n",
- " break\n",
- "\n",
- " # Update data structures for next step\n",
- " #u_nm1[:] = u_n; u_n[:] = u # safe, but slower\n",
- " u_nm1, u_n, u = u_n, u, u_nm1\n",
- "\n",
- " # Wrong assignment u = u_nm1 must be corrected before return\n",
- " u = u_n\n",
- " cpu_time = time.perf_counter() - t0\n",
- " return u, x, t, cpu_time\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 32,
- "metadata": {},
- "outputs": [],
- "source": [
- "def devito_solver(I, V, f, c, L, dt, C, T, user_action=None):\n",
+ "# %load -s solver, src-wave/wave1D/wave1D_n0.py\n",
+ "def solver(I, V, f, c, L, dt, C, T, user_action=None):\n",
" \"\"\"Solve u_tt=c^2*u_xx + f on (0,L)x(0,T].\"\"\"\n",
" Nt = int(round(T/dt))\n",
" t = np.linspace(0, Nt*dt, Nt+1) # Mesh points in time\n",
@@ -270,12 +193,12 @@
" op_init.apply(time_M=1, dt=dt)\n",
" op.apply(time_m=1,time_M=Nt, dt=dt)\n",
" \n",
- " return u.data[-1], x, t, 0"
+ " return u.data[-1], x, t, 0\n"
]
},
{
"cell_type": "code",
- "execution_count": 33,
+ "execution_count": 67,
"metadata": {},
"outputs": [
{
@@ -290,7 +213,7 @@
},
{
"data": {
- "image/png": "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\n",
+ "image/png": "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\n",
"text/plain": [
"
"
]
@@ -302,6 +225,7 @@
}
],
"source": [
+ "# NBVAL_IGNORE_OUTPUT\n",
"import matplotlib.pyplot as plt\n",
"L = 1.0\n",
"I = lambda y: 0 if abs(y-L/2.0) > 0.1 else 1\n",
@@ -313,14 +237,11 @@
"nperiods = 4\n",
"T = L/c*nperiods # One period: c*T = L\n",
"\n",
- "u_correct, x_arr_correct, t_arr_correct, cpu_time_corr = python_solver(I, None, None, c, L, dt, C, T)\n",
- "u_mine, x_arr, t_arr, cpu_time = devito_solver(I, None, None, c, L, dt, C, T)\n",
+ "u_mine, x_arr, t_arr, cpu_time = solver(I, None, None, c, L, dt, C, T)\n",
"\n",
- "plt.plot(x_arr_correct, u_correct, label='NumPy', linewidth=4)\n",
- "plt.plot(x_arr, u_mine, 'm:', label='Devito', linewidth=6)\n",
+ "plt.plot(x_arr, u_mine, linewidth=4)\n",
"plt.xlabel('x')\n",
"plt.ylabel('u')\n",
- "plt.legend(loc='best')\n",
"plt.show()"
]
},
@@ -329,8 +250,7 @@
"metadata": {},
"source": [
"The program [`wave1D_n0.py`](src-wave/wave1D/wave1D_n0.py)\n",
- "contains a complete implementation of the 1D wave equation with\n",
- "boundary conditions $u_x = 0$ at $x=0$ and $x=L$.\n",
+ "also contains this solver function.\n",
"\n",
"It would be nice to modify the `test_quadratic` test case from the\n",
"`wave1D_u0.py` with Dirichlet conditions, described in the section on [verification](wave1D_prog.ipynb#wave:pde1:impl:vec:verify:quadratic). However, the Neumann\n",
@@ -345,166 +265,6 @@
"the exact solution of the PDE, see the section [Numerical dispersion relation](wave_analysis.ipynb#wave:pde1:num:dispersion)).\n"
]
},
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "\n",
- "## Index set notation\n",
- "\n",
- "\n",
- "\n",
- "To improve our mathematical writing and our implementations,\n",
- "it is wise to introduce a special notation for index sets. This means\n",
- "that we write\n",
- "$x_i$, followed by $i\\in\\mathcal{I}_x$, instead of $i=0,\\ldots,N_x$.\n",
- "Obviously, $\\mathcal{I}_x$ must be the index set $\\mathcal{I}_x =\\{0,\\ldots,N_x\\}$, but it\n",
- "is often advantageous to have a symbol for this set rather than\n",
- "specifying all its elements (all the time, as we have done up to\n",
- "now). This new notation saves writing and makes\n",
- "specifications of algorithms and their implementation as computer code\n",
- "simpler.\n",
- "\n",
- "The first index in the set will be denoted $\\mathcal{I}_x^0$\n",
- "and the last $\\mathcal{I}_x^{-1}$. When we need to skip the first element of\n",
- "the set, we use $\\mathcal{I}_x^{+}$ for the remaining subset\n",
- "$\\mathcal{I}_x^{+}=\\{1,\\ldots,N_x\\}$. Similarly, if the last element is\n",
- "to be dropped, we write $\\mathcal{I}_x^{-}=\\{0,\\ldots,N_x-1\\}$ for the\n",
- "remaining indices.\n",
- "All the\n",
- "indices corresponding to inner grid points are specified by\n",
- "$\\mathcal{I}_x^i=\\{1,\\ldots,N_x-1\\}$. For the time domain we find it\n",
- "natural to explicitly use 0 as the first index, so we will usually\n",
- "write $n=0$ and $t_0$ rather than $n=\\mathcal{I}_t^0$. We also avoid notation\n",
- "like $x_{\\mathcal{I}_x^{-1}}$ and will instead use $x_i$, $i={\\mathcal{I}_x^{-1}}$.\n",
- "\n",
- "The Python code associated with index sets applies the following\n",
- "conventions:\n",
- "\n",
- "\n",
- "
\n",
- "\n",
- "
Notation
Python
\n",
- "\n",
- "\n",
- "
$\\mathcal{I}_x$
Ix
\n",
- "
$\\mathcal{I}_x^0$
Ix[0]
\n",
- "
$\\mathcal{I}_x^{-1}$
Ix[-1]
\n",
- "
$\\mathcal{I}_x^{-}$
Ix[:-1]
\n",
- "
$\\mathcal{I}_x^{+}$
Ix[1:]
\n",
- "
$\\mathcal{I}_x^i$
Ix[1:-1]
\n",
- "\n",
- "
\n",
- "\n",
- "### Why index sets are useful\n",
- "\n",
- "An important feature of the index set notation is that it\n",
- "keeps our formulas and code independent of how\n",
- "we count mesh points. For example, the notation $i\\in\\mathcal{I}_x$ or $i=\\mathcal{I}_x^0$\n",
- "remains the same whether $\\mathcal{I}_x$ is defined as above or as starting at 1,\n",
- "i.e., $\\mathcal{I}_x=\\{1,\\ldots,Q\\}$. Similarly, we can in the code define\n",
- "`Ix=range(Nx+1)` or `Ix=range(1,Q)`, and expressions\n",
- "like `Ix[0]` and `Ix[1:-1]` remain correct. One application where\n",
- "the index set notation is convenient is\n",
- "conversion of code from a language where arrays has base index 0 (e.g.,\n",
- "Python and C) to languages where the base index is 1 (e.g., MATLAB and\n",
- "Fortran). Another important application is implementation of\n",
- "Neumann conditions via ghost points (see next section).\n",
- "\n",
- "\n",
- "\n",
- "For the current problem setting in the $x,t$ plane, we work with\n",
- "the index sets"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "\n",
- "\n",
- "$$\n",
- "\\begin{equation}\n",
- "\\mathcal{I}_x = \\{0,\\ldots,N_x\\},\\quad \\mathcal{I}_t = \\{0,\\ldots,N_t\\},\n",
- "\\label{_auto3} \\tag{7}\n",
- "\\end{equation}\n",
- "$$"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "defined in Python as"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "```python\n",
- "Ix = range(0, Nx+1)\n",
- "It = range(0, Nt+1)\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "A finite difference scheme can with the index set notation be specified as"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "$$\n",
- "\\begin{align*}\n",
- "u_i^{n+1} &= u^n_i - \\frac{1}{2}\n",
- "C^2\\left(u^{n}_{i+1}-2u^{n}_{i} + u^{n}_{i-1}\\right),\\quad,\n",
- "i\\in\\mathcal{I}_x^i,\\ n=0,\\\\ \n",
- "u^{n+1}_i &= -u^{n-1}_i + 2u^n_i + C^2\n",
- "\\left(u^{n}_{i+1}-2u^{n}_{i}+u^{n}_{i-1}\\right),\n",
- "\\quad i\\in\\mathcal{I}_x^i,\\ n\\in\\mathcal{I}_t^i,\\\\ \n",
- "u_i^{n+1} &= 0,\n",
- "\\quad i=\\mathcal{I}_x^0,\\ n\\in\\mathcal{I}_t^{-},\\\\ \n",
- "u_i^{n+1} &= 0,\n",
- "\\quad i=\\mathcal{I}_x^{-1},\\ n\\in\\mathcal{I}_t^{-}\\thinspace .\n",
- "\\end{align*}\n",
- "$$"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The corresponding implementation becomes"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "```python\n",
- "# Initial condition\n",
- "for i in Ix[1:-1]:\n",
- " u[i] = u_n[i] - 0.5*C2*(u_n[i-1] - 2*u_n[i] + u_n[i+1])\n",
- "\n",
- "# Time loop\n",
- "for n in It[1:-1]:\n",
- " # Compute internal points\n",
- " for i in Ix[1:-1]:\n",
- " u[i] = - u_nm1[i] + 2*u_n[i] + \\\n",
- " C2*(u_n[i-1] - 2*u_n[i] + u_n[i+1])\n",
- " # Compute boundary conditions\n",
- " i = Ix[0]; u[i] = 0\n",
- " i = Ix[-1]; u[i] = 0\n",
- "```"
- ]
- },
{
"cell_type": "markdown",
"metadata": {},
@@ -653,287 +413,13 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Other tests must rely on an unknown approximation error, so effectively\n",
- "we are left with tests on the convergence rate.\n",
- "\n",
- "## Alternative implementation via ghost cells\n",
- "\n",
- "\n",
- "### Idea\n",
- "\n",
- "Instead of modifying the scheme at the boundary, we can introduce\n",
- "extra points outside the domain such that the fictitious values\n",
- "$u_{-1}^n$ and $u_{N_x+1}^n$ are defined in the mesh. Adding the\n",
- "intervals $[-\\Delta x,0]$ and $[L, L+\\Delta x]$, known as *ghost\n",
- "cells*, to the mesh gives us all the needed mesh points, corresponding\n",
- "to $i=-1,0,\\ldots,N_x,N_x+1$. The extra points with $i=-1$ and\n",
- "$i=N_x+1$ are known as *ghost points*, and values at these points,\n",
- "$u_{-1}^n$ and $u_{N_x+1}^n$, are called *ghost values*.\n",
- "\n",
- "The important idea is\n",
- "to ensure that we always have"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "$$\n",
- "u_{-1}^n = u_{1}^n\\hbox{ and } u_{N_x+1}^n = u_{N_x-1}^n,\n",
- "$$"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "because then\n",
- "the application of the standard scheme at a boundary point $i=0$ or $i=N_x$\n",
- "will be correct and guarantee that the solution is compatible with the\n",
- "boundary condition $u_x=0$.\n",
- "\n",
- "Some readers may find it strange to just extend the domain with ghost\n",
- "cells as a general technique, because in some problems there is a\n",
- "completely different medium with different physics and equations right\n",
- "outside of a boundary. Nevertheless, one should view the ghost cell\n",
- "technique as a purely mathematical technique, which is valid in the\n",
- "limit $\\Delta x \\rightarrow 0$ and helps us to implement derivatives.\n",
- "\n",
- "\n",
- "### Implementation\n",
- "\n",
- "The `u` array now needs extra elements corresponding to the ghost\n",
- "points. Two new point values are needed:"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "```python\n",
- "u = np.zeros(Nx+3)\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The arrays `u_n` and `u_nm1` must be defined accordingly.\n",
- "\n",
- "Unfortunately, a major indexing problem arises with ghost cells.\n",
- "The reason is that Python indices *must* start\n",
- "at 0 and `u[-1]` will always mean the last element in `u`.\n",
- "This fact gives, apparently, a mismatch between the mathematical\n",
- "indices $i=-1,0,\\ldots,N_x+1$ and the Python indices running over\n",
- "`u`: `0,..,Nx+2`. One remedy is to change the mathematical indexing\n",
- "of $i$ in the scheme and write"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "$$\n",
- "u^{n+1}_i = \\cdots,\\quad i=1,\\ldots,N_x+1,\n",
- "$$"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "instead of $i=0,\\ldots,N_x$ as we have previously used. The ghost\n",
- "points now correspond to $i=0$ and $i=N_x+1$.\n",
- "A better solution is to use the ideas of the section [Index set notation](#wave:indexset):\n",
- "we hide the specific index value in an index set and operate with\n",
- "inner and boundary points using the index set notation.\n",
- "\n",
- "To this end, we define `u` with proper length and `mathcal{I}_x` to be the corresponding\n",
- "indices for the real physical mesh points ($1,2,\\ldots,N_x+1$):"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "```python\n",
- "u = zeros(Nx+3)\n",
- "Ix = range(1, u.shape[0]-1)\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "That is, the boundary points have indices `Ix[0]` and `Ix[-1]` (as before).\n",
- "We first update the solution at all physical mesh points (i.e., interior\n",
- "points in the mesh):"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "```python\n",
- "for i in Ix:\n",
- " u[i] = - u_nm1[i] + 2*u_n[i] + \\\n",
- " C2*(u_n[i-1] - 2*u_n[i] + u_n[i+1])\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The indexing becomes a bit more complicated when we call functions like\n",
- "`V(x)` and `f(x, t)`, as we must remember that the appropriate\n",
- "$x$ coordinate is given as `x[i-Ix[0]]`:"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "```python\n",
- "for i in Ix:\n",
- " u[i] = u_n[i] + dt*V(x[i-mathcal{I}_x[0]]) + \\\n",
- " 0.5*C2*(u_n[i-1] - 2*u_n[i] + u_n[i+1]) + \\\n",
- " 0.5*dt2*f(x[i-mathcal{I}_x[0]], t[0])\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "It remains to update the solution at ghost points, i.e., `u[0]`\n",
- "and `u[-1]` (or `u[Nx+2]`). For a boundary condition $u_x=0$,\n",
- "the ghost value must equal the value at the associated inner mesh\n",
- "point. Computer code makes this statement precise:"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "```python\n",
- "i = Ix[0] # x=0 boundary\n",
- "u[i-1] = u[i+1]\n",
- "i = Ix[-1] # x=L boundary\n",
- "u[i+1] = u[i-1]\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The physical solution to be plotted is now in `u[1:-1]`, or\n",
- "equivalently `u[Ix[0]:Ix[-1]+1]`, so this slice is\n",
- "the quantity to be returned from a solver function.\n",
- "A complete implementation appears in the program\n",
- "[`wave1D_n0_ghost.py`](src-wave/wave1D/wave1D_n0_ghost.py).\n",
- "\n",
- "### Warning\n",
- "\n",
- "We have to be careful with how the spatial and temporal mesh\n",
- "points are stored. Say we let `x` be the physical mesh points,"
+ "Other tests must rely on an unknown approximation error, so effectively we are left with tests on the convergence rate.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "```python\n",
- "x = linspace(0, L, Nx+1)\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\"Standard coding\" of the initial condition,"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "```python\n",
- "for i in Ix:\n",
- " u_n[i] = I(x[i])\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "becomes wrong, since `u_n` and `x` have different lengths and the index `i`\n",
- "corresponds to two different mesh points. In fact, `x[i]` corresponds\n",
- "to `u[1+i]`. A correct implementation is"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "```python\n",
- "for i in Ix:\n",
- " u_n[i] = I(x[i-Ix[0]])\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Similarly, a source term usually coded as `f(x[i], t[n])` is incorrect\n",
- "if `x` is defined to be the physical points, so `x[i]` must be\n",
- "replaced by `x[i-Ix[0]]`.\n",
- "\n",
- "An alternative remedy is to let `x` also cover the ghost points such that\n",
- "`u[i]` is the value at `x[i]`.\n",
- "\n",
- "\n",
- "\n",
- "The ghost cell is only added to the boundary where we have a Neumann\n",
- "condition. Suppose we have a Dirichlet condition at $x=L$ and\n",
- "a homogeneous Neumann condition at $x=0$. One ghost cell $[-\\Delta x,0]$\n",
- "is added to the mesh, so the index set for the physical points\n",
- "becomes $\\{1,\\ldots,N_x+1\\}$. A relevant implementation\n",
- "is"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "```python\n",
- "u = zeros(Nx+2)\n",
- "mathcal{I}_x = range(1, u.shape[0])\n",
- "...\n",
- "for i in mathcal{I}_x[:-1]:\n",
- " u[i] = - u_nm1[i] + 2*u_n[i] + \\\n",
- " C2*(u_n[i-1] - 2*u_n[i] + u_n[i+1]) + \\\n",
- " dt2*f(x[i-mathcal{I}_x[0]], t[n])\n",
- "i = mathcal{I}_x[-1]\n",
- "u[i] = U_0 # set Dirichlet value\n",
- "i = mathcal{I}_x[0]\n",
- "u[i-1] = u[i+1] # update ghost value\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The physical solution to be plotted is now in `u[1:]`\n",
- "or (as always) `u[Ix[0]:Ix[-1]+1]`.\n",
- "\n",
"\n",
"# Generalization: variable wave velocity\n",
"\n",
From ce5f30ee952e7f7f8635a5d8a48625f9f9a18cbd Mon Sep 17 00:00:00 2001
From: Rini Banerjee <26858592+rbanerjee20@users.noreply.github.com>
Date: Thu, 27 Aug 2020 17:09:44 +0100
Subject: [PATCH 08/19] Added Dirichlet boundary condition code to wave1D_dn.py
---
.../02_wave/src-wave/wave1D/wave1D_dn.py | 88 ++++++++++++++++++-
fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb | 9 +-
2 files changed, 88 insertions(+), 9 deletions(-)
diff --git a/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_dn.py b/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_dn.py
index 24eac945..6ddeec38 100644
--- a/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_dn.py
+++ b/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_dn.py
@@ -37,8 +37,90 @@
"""
import numpy as np
import scitools.std as plt
+import time
+from devito import Constant, Grid, TimeFunction, SparseTimeFunction, SparseFunction, Eq, solve, Operator, Buffer
-def solver(I, V, f, c, U_0, U_L, L, dt, C, T,
+
+def devito_solver(I, V, f, c, U_0, U_L, L, dt, C, T,
+ user_action=None, version='scalar'):
+ """
+ Solve u_tt=c^2*u_xx + f on (0,L)x(0,T].
+ u(0,t)=U_0(t) or du/dn=0 (U_0=None), u(L,t)=U_L(t) or du/dn=0 (u_L=None).
+ """
+ Nt = int(round(T/dt))
+ t = np.linspace(0, Nt*dt, Nt+1) # Mesh points in time
+ dx = dt*c/float(C)
+ Nx = int(round(L/dx))
+ x = np.linspace(0, L, Nx+1) # Mesh points in space
+ C2 = C**2 # Help variable in the scheme
+ # Make sure dx and dt are compatible with x and t
+ dx = x[1] - x[0]
+ dt = t[1] - t[0]
+
+ # Wrap user-given f, I, V, U_0, U_L if None or 0
+ if f is None or f == 0:
+ f = (lambda x, t: 0) if version == 'scalar' else \
+ lambda x, t: np.zeros(x.shape)
+ if I is None or I == 0:
+ I = (lambda x: 0) if version == 'scalar' else \
+ lambda x: np.zeros(x.shape)
+ if V is None or V == 0:
+ V = (lambda x: 0) if version == 'scalar' else \
+ lambda x: np.zeros(x.shape)
+ if U_0 is not None:
+ if isinstance(U_0, (float,int)) and U_0 == 0:
+ U_0 = lambda t: 0
+ # else: U_0(t) is a function
+ if U_L is not None:
+ if isinstance(U_L, (float,int)) and U_L == 0:
+ U_L = lambda t: 0
+ # else: U_L(t) is a function
+
+ grid = Grid(shape=(Nx+1), extent=(L))
+ t_s = grid.stepping_dim
+
+ u = TimeFunction(name='u', grid=grid, time_order=2, space_order=2)
+ # Initialise values
+ for i in range(Nx+1):
+ u.data[:,i] = I(x[i])
+
+ x_dim = grid.dimensions[0]
+ t_dim = grid.time_dim
+
+ pde = (1/c**2)*u.dt2-u.dx2
+ stencil = Eq(u.forward, solve(pde, u.forward))
+
+ # Source term and injection into equation
+ dt_symbolic = grid.time_dim.spacing
+ src = SparseTimeFunction(name='f', grid=grid, npoint=Nx+1, nt=Nt+1)
+ for i in range(Nt):
+ src.data[i] = f(x, t[i])
+ src.coordinates.data[:, 0] = x
+ src_term = src.inject(field=u.forward, expr=src * (dt_symbolic**2))
+
+ v = SparseFunction(name='v', grid=grid, npoint=Nx+1, nt=1)
+ v.data[:] = V(x[:])
+ stencil_init = stencil.subs(u.backward, u.forward - 2*dt_symbolic*v)
+
+ # Boundary conditions, depending on arguments
+ bc = []
+ if U_0 is None and U_L is None:
+ bc += [Eq(u[t_s+1, 0], u[t_s+1, 1])]
+ else:
+ if U_0 is not None:
+ bc += [Eq(u[t_s+1, 0], U_0(t_s+1))]
+ if U_L is not None:
+ bc += [Eq(u[t_s+1, L], U_L(t_s+1))]
+
+ op_init = Operator([stencil_init]+bc)
+ op = Operator([stencil]+src_term+bc)
+
+ op_init.apply(time_M=1, dt=dt)
+ op.apply(time_m=1,time_M=Nt, dt=dt)
+
+ return u.data[-1], x, t, 0
+
+def python_solver(I, V, f, c, U_0, U_L, L, dt, C, T,
user_action=None, version='scalar'):
"""
Solve u_tt=c^2*u_xx + f on (0,L)x(0,T].
@@ -80,7 +162,7 @@ def solver(I, V, f, c, U_0, U_L, L, dt, C, T,
Ix = list(range(0, Nx+1))
It = list(range(0, Nt+1))
- import time; t0 = time.clock() # CPU time measurement
+ import time; t0 = time.perf_counter() # CPU time measurement
# Load initial condition into u_n
for i in Ix:
@@ -175,7 +257,7 @@ def solver(I, V, f, c, U_0, U_L, L, dt, C, T,
# Important to correct the mathematically wrong u=u_nm1 above
# before returning u
u = u_n
- cpu_time = time.clock() - t0
+ cpu_time = time.perf_counter() - t0
return u, x, t, cpu_time
diff --git a/fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb b/fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb
index 26a5c45b..f3a85332 100644
--- a/fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb
+++ b/fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb
@@ -136,7 +136,7 @@
},
{
"cell_type": "code",
- "execution_count": 66,
+ "execution_count": 84,
"metadata": {},
"outputs": [],
"source": [
@@ -198,7 +198,7 @@
},
{
"cell_type": "code",
- "execution_count": 67,
+ "execution_count": 87,
"metadata": {},
"outputs": [
{
@@ -272,7 +272,6 @@
"**Notice.**\n",
"\n",
"The program [`wave1D_dn.py`](src-wave/wave1D/wave1D_dn.py)\n",
- "applies the index set notation and\n",
"solves the 1D wave equation $u_{tt}=c^2u_{xx}+f(x,t)$ with\n",
"quite general boundary and initial conditions:\n",
"\n",
@@ -284,8 +283,6 @@
"\n",
" * $t=0$: $u_t=V(x)$\n",
"\n",
- "The program combines Dirichlet and Neumann conditions, scalar and vectorized\n",
- "implementation of schemes, and the index set notation into one piece of code.\n",
"A lot of test examples are also included in the program:\n",
"\n",
" * A rectangular plug-shaped initial condition. (For $C=1$ the solution\n",
@@ -321,7 +318,7 @@
},
{
"cell_type": "code",
- "execution_count": 10,
+ "execution_count": 86,
"metadata": {},
"outputs": [],
"source": [
From a0dfbab35e44a154f0c225568c5ff0c14c0cf992 Mon Sep 17 00:00:00 2001
From: Rini Banerjee <26858592+rbanerjee20@users.noreply.github.com>
Date: Fri, 28 Aug 2020 11:52:06 +0100
Subject: [PATCH 09/19] Added devito code for variable wave velocity.
---
.../02_wave/src-wave/wave1D/wave1D_dn.py | 1 +
.../02_wave/src-wave/wave1D/wave1D_dn_vc.py | 1431 +++++++++--------
fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb | 8 +-
fdm-devito-notebooks/02_wave/wave_app.ipynb | 20 +-
4 files changed, 787 insertions(+), 673 deletions(-)
diff --git a/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_dn.py b/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_dn.py
index 6ddeec38..13e33ccc 100644
--- a/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_dn.py
+++ b/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_dn.py
@@ -40,6 +40,7 @@
import time
from devito import Constant, Grid, TimeFunction, SparseTimeFunction, SparseFunction, Eq, solve, Operator, Buffer
+# TODO: Remove scalar vs vectorized version since Devito doesn't require these
def devito_solver(I, V, f, c, U_0, U_L, L, dt, C, T,
user_action=None, version='scalar'):
diff --git a/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_dn_vc.py b/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_dn_vc.py
index 39d33d73..05d0dc00 100644
--- a/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_dn_vc.py
+++ b/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_dn_vc.py
@@ -31,8 +31,10 @@
"""
import time, glob, shutil, os
import numpy as np
+from devito import Constant, Grid, TimeFunction, SparseTimeFunction, SparseFunction, Eq, solve, Operator, Buffer
-def solver(
+
+def devito_solver(
I, V, f, c, U_0, U_L, L, dt, C, T,
user_action=None, version='scalar',
stability_safety_factor=1.0):
@@ -84,671 +86,768 @@ def solver(
if isinstance(U_L, (float,int)) and U_L == 0:
U_L = lambda t: 0
- # --- Make hash of all input data ---
- import hashlib, inspect
- data = inspect.getsource(I) + '_' + inspect.getsource(V) + \
- '_' + inspect.getsource(f) + '_' + str(c) + '_' + \
- ('None' if U_0 is None else inspect.getsource(U_0)) + \
- ('None' if U_L is None else inspect.getsource(U_L)) + \
- '_' + str(L) + str(dt) + '_' + str(C) + '_' + str(T) + \
- '_' + str(stability_safety_factor)
- hashed_input = hashlib.sha1(data).hexdigest()
- if os.path.isfile('.' + hashed_input + '_archive.npz'):
- # Simulation is already run
- return -1, hashed_input
-
- # --- Allocate memomry for solutions ---
- u = np.zeros(Nx+1) # Solution array at new time level
- u_n = np.zeros(Nx+1) # Solution at 1 time level back
- u_nm1 = np.zeros(Nx+1) # Solution at 2 time levels back
-
- import time; t0 = time.clock() # CPU time measurement
-
- # --- Valid indices for space and time mesh ---
- Ix = range(0, Nx+1)
- It = range(0, Nt+1)
-
- # --- Load initial condition into u_n ---
- for i in range(0,Nx+1):
- u_n[i] = I(x[i])
-
- if user_action is not None:
- user_action(u_n, x, t, 0)
-
- # --- Special formula for the first step ---
- for i in Ix[1:-1]:
- u[i] = u_n[i] + dt*V(x[i]) + \
- 0.5*C2*(0.5*(q[i] + q[i+1])*(u_n[i+1] - u_n[i]) - \
- 0.5*(q[i] + q[i-1])*(u_n[i] - u_n[i-1])) + \
- 0.5*dt2*f(x[i], t[0])
-
- i = Ix[0]
- if U_0 is None:
- # Set boundary values (x=0: i-1 -> i+1 since u[i-1]=u[i+1]
- # when du/dn = 0, on x=L: i+1 -> i-1 since u[i+1]=u[i-1])
- ip1 = i+1
- im1 = ip1 # i-1 -> i+1
- u[i] = u_n[i] + dt*V(x[i]) + \
- 0.5*C2*(0.5*(q[i] + q[ip1])*(u_n[ip1] - u_n[i]) - \
- 0.5*(q[i] + q[im1])*(u_n[i] - u_n[im1])) + \
- 0.5*dt2*f(x[i], t[0])
- else:
- u[i] = U_0(dt)
-
- i = Ix[-1]
- if U_L is None:
- im1 = i-1
- ip1 = im1 # i+1 -> i-1
- u[i] = u_n[i] + dt*V(x[i]) + \
- 0.5*C2*(0.5*(q[i] + q[ip1])*(u_n[ip1] - u_n[i]) - \
- 0.5*(q[i] + q[im1])*(u_n[i] - u_n[im1])) + \
- 0.5*dt2*f(x[i], t[0])
- else:
- u[i] = U_L(dt)
-
- if user_action is not None:
- user_action(u, x, t, 1)
-
- # Update data structures for next step
- #u_nm1[:] = u_n; u_n[:] = u # safe, but slower
- u_nm1, u_n, u = u_n, u, u_nm1
-
- # --- Time loop ---
- for n in It[1:-1]:
- # Update all inner points
- if version == 'scalar':
- for i in Ix[1:-1]:
- u[i] = - u_nm1[i] + 2*u_n[i] + \
- C2*(0.5*(q[i] + q[i+1])*(u_n[i+1] - u_n[i]) - \
- 0.5*(q[i] + q[i-1])*(u_n[i] - u_n[i-1])) + \
- dt2*f(x[i], t[n])
-
- elif version == 'vectorized':
- u[1:-1] = - u_nm1[1:-1] + 2*u_n[1:-1] + \
- C2*(0.5*(q[1:-1] + q[2:])*(u_n[2:] - u_n[1:-1]) -
- 0.5*(q[1:-1] + q[:-2])*(u_n[1:-1] - u_n[:-2])) + \
- dt2*f(x[1:-1], t[n])
- else:
- raise ValueError('version=%s' % version)
-
- # Insert boundary conditions
- i = Ix[0]
- if U_0 is None:
- # Set boundary values
- # x=0: i-1 -> i+1 since u[i-1]=u[i+1] when du/dn=0
- # x=L: i+1 -> i-1 since u[i+1]=u[i-1] when du/dn=0
- ip1 = i+1
- im1 = ip1
- u[i] = - u_nm1[i] + 2*u_n[i] + \
- C2*(0.5*(q[i] + q[ip1])*(u_n[ip1] - u_n[i]) - \
- 0.5*(q[i] + q[im1])*(u_n[i] - u_n[im1])) + \
- dt2*f(x[i], t[n])
- else:
- u[i] = U_0(t[n+1])
-
- i = Ix[-1]
- if U_L is None:
- im1 = i-1
- ip1 = im1
- u[i] = - u_nm1[i] + 2*u_n[i] + \
- C2*(0.5*(q[i] + q[ip1])*(u_n[ip1] - u_n[i]) - \
- 0.5*(q[i] + q[im1])*(u_n[i] - u_n[im1])) + \
- dt2*f(x[i], t[n])
- else:
- u[i] = U_L(t[n+1])
-
- if user_action is not None:
- if user_action(u, x, t, n+1):
- break
-
- # Update data structures for next step
- u_nm1, u_n, u = u_n, u, u_nm1
-
- cpu_time = time.clock() - t0
- return cpu_time, hashed_input
-
-
-def test_quadratic():
- """
- Check the scalar and vectorized versions for
- a quadratic u(x,t)=x(L-x)(1+t/2) that is exactly reproduced,
- provided c(x) is constant.
- We simulate in [0, L/2] and apply a symmetry condition
- at the end x=L/2.
- """
- u_exact = lambda x, t: x*(L-x)*(1+0.5*t)
- I = lambda x: u_exact(x, 0)
- V = lambda x: 0.5*u_exact(x, 0)
- f = lambda x, t: 2*(1+0.5*t)*c**2
- U_0 = lambda t: u_exact(0, t)
- U_L = None
- L = 2.5
- c = 1.5
- C = 0.75
- Nx = 3 # Very coarse mesh for this exact test
- dt = C*((L/2)/Nx)/c
- T = 18 # long time integration
-
- def assert_no_error(u, x, t, n):
- u_e = u_exact(x, t[n])
- diff = np.abs(u - u_e).max()
- tol = 1E-13
- assert diff < tol
-
- solver(
- I, V, f, c, U_0, U_L, L/2, dt, C, T,
- user_action=assert_no_error, version='scalar',
- stability_safety_factor=1)
- solver(
- I, V, f, c, U_0, U_L, L/2, dt, C, T,
- user_action=assert_no_error, version='vectorized',
- stability_safety_factor=1)
-
-def test_plug():
- """Check that an initial plug is correct back after one period."""
- L = 1.
- c = 0.5
- dt = (L/10)/c # Nx=10
- I = lambda x: 0 if abs(x-L/2.0) > 0.1 else 1
-
- class Action:
- """Store last solution."""
- def __call__(self, u, x, t, n):
- if n == len(t)-1:
- self.u = u.copy()
- self.x = x.copy()
- self.t = t[n]
-
- action = Action()
-
- solver(
- I=I,
- V=None, f=None, c=c, U_0=None, U_L=None, L=L,
- dt=dt, C=1, T=4, user_action=action, version='scalar')
- u_s = action.u
- solver(
- I=I,
- V=None, f=None, c=c, U_0=None, U_L=None, L=L,
- dt=dt, C=1, T=4, user_action=action, version='vectorized')
- u_v = action.u
- diff = np.abs(u_s - u_v).max()
- tol = 1E-13
- assert diff < tol
- u_0 = np.array([I(x_) for x_ in action.x])
- diff = np.abs(u_s - u_0).max()
- assert diff < tol
-
-def merge_zip_archives(individual_archives, archive_name):
- """
- Merge individual zip archives made with numpy.savez into
- one archive with name archive_name.
- The individual archives can be given as a list of names
- or as a Unix wild chard filename expression for glob.glob.
- The result of this function is that all the individual
- archives are deleted and the new single archive made.
- """
- import zipfile
- archive = zipfile.ZipFile(
- archive_name, 'w', zipfile.ZIP_DEFLATED,
- allowZip64=True)
- if isinstance(individual_archives, (list,tuple)):
- filenames = individual_archives
- elif isinstance(individual_archives, str):
- filenames = glob.glob(individual_archives)
-
- # Open each archive and write to the common archive
- for filename in filenames:
- f = zipfile.ZipFile(filename, 'r',
- zipfile.ZIP_DEFLATED)
- for name in f.namelist():
- data = f.open(name, 'r')
- # Save under name without .npy
- archive.writestr(name[:-4], data.read())
- f.close()
- os.remove(filename)
- archive.close()
-
-class PlotAndStoreSolution:
- """
- Class for the user_action function in solver.
- Visualizes the solution only.
- """
- def __init__(
- self,
- casename='tmp', # Prefix in filenames
- umin=-1, umax=1, # Fixed range of y axis
- pause_between_frames=None, # Movie speed
- backend='matplotlib', # or 'gnuplot' or None
- screen_movie=True, # Show movie on screen?
- title='', # Extra message in title
- skip_frame=1, # Skip every skip_frame frame
- filename=None): # Name of file with solutions
- self.casename = casename
- self.yaxis = [umin, umax]
- self.pause = pause_between_frames
- self.backend = backend
- if backend is None:
- # Use native matplotlib
- import matplotlib.pyplot as plt
- elif backend in ('matplotlib', 'gnuplot'):
- module = 'scitools.easyviz.' + backend + '_'
- exec('import %s as plt' % module)
- self.plt = plt
- self.screen_movie = screen_movie
- self.title = title
- self.skip_frame = skip_frame
- self.filename = filename
- if filename is not None:
- # Store time points when u is written to file
- self.t = []
- filenames = glob.glob('.' + self.filename + '*.dat.npz')
- for filename in filenames:
- os.remove(filename)
-
- # Clean up old movie frames
- for filename in glob.glob('frame_*.png'):
- os.remove(filename)
-
- def __call__(self, u, x, t, n):
- """
- Callback function user_action, call by solver:
- Store solution, plot on screen and save to file.
- """
- # Save solution u to a file using numpy.savez
- if self.filename is not None:
- name = 'u%04d' % n # array name
- kwargs = {name: u}
- fname = '.' + self.filename + '_' + name + '.dat'
- np.savez(fname, **kwargs)
- self.t.append(t[n]) # store corresponding time value
- if n == 0: # save x once
- np.savez('.' + self.filename + '_x.dat', x=x)
-
- # Animate
- if n % self.skip_frame != 0:
- return
- title = 't=%.3f' % t[n]
- if self.title:
- title = self.title + ' ' + title
- if self.backend is None:
- # native matplotlib animation
- if n == 0:
- self.plt.ion()
- self.lines = self.plt.plot(x, u, 'r-')
- self.plt.axis([x[0], x[-1],
- self.yaxis[0], self.yaxis[1]])
- self.plt.xlabel('x')
- self.plt.ylabel('u')
- self.plt.title(title)
- self.plt.legend(['t=%.3f' % t[n]])
- else:
- # Update new solution
- self.lines[0].set_ydata(u)
- self.plt.legend(['t=%.3f' % t[n]])
- self.plt.draw()
- else:
- # scitools.easyviz animation
- self.plt.plot(x, u, 'r-',
- xlabel='x', ylabel='u',
- axis=[x[0], x[-1],
- self.yaxis[0], self.yaxis[1]],
- title=title,
- show=self.screen_movie)
- # pause
- if t[n] == 0:
- time.sleep(2) # let initial condition stay 2 s
- else:
- if self.pause is None:
- pause = 0.2 if u.size < 100 else 0
- time.sleep(pause)
-
- self.plt.savefig('frame_%04d.png' % (n))
-
- def make_movie_file(self):
- """
- Create subdirectory based on casename, move all plot
- frame files to this directory, and generate
- an index.html for viewing the movie in a browser
- (as a sequence of PNG files).
- """
- # Make HTML movie in a subdirectory
- directory = self.casename
-
- if os.path.isdir(directory):
- shutil.rmtree(directory) # rm -rf directory
- os.mkdir(directory) # mkdir directory
- # mv frame_*.png directory
- for filename in glob.glob('frame_*.png'):
- os.rename(filename, os.path.join(directory, filename))
- os.chdir(directory) # cd directory
-
- fps = 24 # frames per second
- if self.backend is not None:
- from scitools.std import movie
- movie('frame_*.png', encoder='html',
- output_file='index.html', fps=fps)
-
- # Make other movie formats: Flash, Webm, Ogg, MP4
- codec2ext = dict(flv='flv', libx264='mp4', libvpx='webm',
- libtheora='ogg')
- filespec = 'frame_%04d.png'
- movie_program = 'ffmpeg'
- for codec in codec2ext:
- ext = codec2ext[codec]
- cmd = '%(movie_program)s -r %(fps)d -i %(filespec)s '\
- '-vcodec %(codec)s movie.%(ext)s' % vars()
- os.system(cmd)
-
- os.chdir(os.pardir) # move back to parent directory
-
- def close_file(self, hashed_input):
- """
- Merge all files from savez calls into one archive.
- hashed_input is a string reflecting input data
- for this simulation (made by solver).
- """
- if self.filename is not None:
- # Save all the time points where solutions are saved
- np.savez('.' + self.filename + '_t.dat',
- t=np.array(self.t, dtype=float))
-
- # Merge all savez files to one zip archive
- archive_name = '.' + hashed_input + '_archive.npz'
- filenames = glob.glob('.' + self.filename + '*.dat.npz')
- merge_zip_archives(filenames, archive_name)
- print 'Archive name:', archive_name
- # data = numpy.load(archive); data.files holds names
- # data[name] extract the array
-
-def demo_BC_plug(C=1, Nx=40, T=4):
- """Demonstrate u=0 and u_x=0 boundary conditions with a plug."""
- action = PlotAndStoreSolution(
- 'plug', -1.3, 1.3, skip_frame=1,
- title='u(0,t)=0, du(L,t)/dn=0.', filename='tmpdata')
- # Scaled problem: L=1, c=1, max I=1
- L = 1.
- dt = (L/Nx)/C # choose the stability limit with given Nx
- cpu, hashed_input = solver(
- I=lambda x: 0 if abs(x-L/2.0) > 0.1 else 1,
- V=0, f=0, c=1, U_0=lambda t: 0, U_L=None, L=L,
- dt=dt, C=C, T=T,
- user_action=action, version='vectorized',
- stability_safety_factor=1)
- action.make_movie_file()
- if cpu > 0: # did we generate new data?
- action.close_file(hashed_input)
- print 'cpu:', cpu
-
-def demo_BC_gaussian(C=1, Nx=80, T=4):
- """Demonstrate u=0 and u_x=0 boundary conditions with a bell function."""
- # Scaled problem: L=1, c=1, max I=1
- action = PlotAndStoreSolution(
- 'gaussian', -1.3, 1.3, skip_frame=1,
- title='u(0,t)=0, du(L,t)/dn=0.', filename='tmpdata')
- L = 1.
- dt = (L/Nx)/c # choose the stability limit with given Nx
- cpu, hashed_input = solver(
- I=lambda x: np.exp(-0.5*((x-0.5)/0.05)**2),
- V=0, f=0, c=1, U_0=lambda t: 0, U_L=None, L=L,
- dt=dt, C=C, T=T,
- user_action=action, version='vectorized',
- stability_safety_factor=1)
- action.make_movie_file()
- if cpu > 0: # did we generate new data?
- action.close_file(hashed_input)
-
-def moving_end(
- C=1, Nx=50, reflecting_right_boundary=True,
- version='vectorized'):
- # Scaled problem: L=1, c=1, max I=1
- L = 1.
- c = 1
- dt = (L/Nx)/c # choose the stability limit with given Nx
- T = 3
- I = lambda x: 0
- V = 0
- f = 0
-
- def U_0(t):
- return 1.0*sin(6*np.pi*t) if t < 1./3 else 0
-
- if reflecting_right_boundary:
- U_L = None
- bc_right = 'du(L,t)/dx=0'
+ grid = Grid(shape=(Nx+1), extent=(L))
+ t_s = grid.stepping_dim
+
+ u = TimeFunction(name='u', grid=grid, time_order=2, space_order=2)
+ # Initialise values
+ for i in range(Nx+1):
+ u.data[:,i] = I(x[i])
+
+ x_dim = grid.dimensions[0]
+ t_dim = grid.time_dim
+
+ pde = u.dt2-(q*u.dx).dx
+ stencil = Eq(u.forward, solve(pde, u.forward))
+
+ # Source term and injection into equation
+ dt_symbolic = grid.time_dim.spacing
+ src = SparseTimeFunction(name='f', grid=grid, npoint=Nx+1, nt=Nt+1)
+ for i in range(Nt):
+ src.data[i] = f(x, t[i])
+ src.coordinates.data[:, 0] = x
+ src_term = src.inject(field=u.forward, expr=src * (dt_symbolic**2))
+
+ v = SparseFunction(name='v', grid=grid, npoint=Nx+1, nt=1)
+ v.data[:] = V(x[:])
+ stencil_init = stencil.subs(u.backward, u.forward - 2*dt_symbolic*v)
+
+ # Boundary conditions, depending on arguments
+ bc = []
+ if U_0 is None and U_L is None:
+ bc += [Eq(u[t_s+1, 0], u[t_s+1, 1])]
else:
- U_L = 0
- bc_right = 'u(L,t)=0'
-
- action = PlotAndStoreSolution(
- 'moving_end', -2.3, 2.3, skip_frame=4,
- title='u(0,t)=0.25*sin(6*pi*t) if t < 1/3 else 0, '
- + bc_right, filename='tmpdata')
- cpu, hashed_input = solver(
- I, V, f, c, U_0, U_L, L, dt, C, T,
- user_action=action, version=version,
- stability_safety_factor=1)
- action.make_movie_file()
- if cpu > 0: # did we generate new data?
- action.close_file(hashed_input)
-
-
-class PlotMediumAndSolution(PlotAndStoreSolution):
- def __init__(self, medium, **kwargs):
- """Mark medium in plot: medium=[x_L, x_R]."""
- self.medium = medium
- PlotAndStoreSolution.__init__(self, **kwargs)
-
- def __call__(self, u, x, t, n):
- # Save solution u to a file using numpy.savez
- if self.filename is not None:
- name = 'u%04d' % n # array name
- kwargs = {name: u}
- fname = '.' + self.filename + '_' + name + '.dat'
- np.savez(fname, **kwargs)
- self.t.append(t[n]) # store corresponding time value
- if n == 0: # save x once
- np.savez('.' + self.filename + '_x.dat', x=x)
-
- # Animate
- if n % self.skip_frame != 0:
- return
- # Plot u and mark medium x=x_L and x=x_R
- x_L, x_R = self.medium
- umin, umax = self.yaxis
- title = 'Nx=%d' % (x.size-1)
- if self.title:
- title = self.title + ' ' + title
- if self.backend is None:
- # native matplotlib animation
- if n == 0:
- self.plt.ion()
- self.lines = self.plt.plot(
- x, u, 'r-',
- [x_L, x_L], [umin, umax], 'k--',
- [x_R, x_R], [umin, umax], 'k--')
- self.plt.axis([x[0], x[-1],
- self.yaxis[0], self.yaxis[1]])
- self.plt.xlabel('x')
- self.plt.ylabel('u')
- self.plt.title(title)
- self.plt.text(0.75, 1.0, 'c lower')
- self.plt.text(0.32, 1.0, 'c=1')
- self.plt.legend(['t=%.3f' % t[n]])
- else:
- # Update new solution
- self.lines[0].set_ydata(u)
- self.plt.legend(['t=%.3f' % t[n]])
- self.plt.draw()
- else:
- # scitools.easyviz animation
- self.plt.plot(x, u, 'r-',
- [x_L, x_L], [umin, umax], 'k--',
- [x_R, x_R], [umin, umax], 'k--',
- xlabel='x', ylabel='u',
- axis=[x[0], x[-1],
- self.yaxis[0], self.yaxis[1]],
- title=title,
- show=self.screen_movie)
- # pause
- if t[n] == 0:
- time.sleep(2) # let initial condition stay 2 s
- else:
- if self.pause is None:
- pause = 0.2 if u.size < 100 else 0
- time.sleep(pause)
-
- self.plt.savefig('frame_%04d.png' % (n))
-
- if n == (len(t) - 1): # finished with this run, close plot
- self.plt.close()
-
-
-def animate_multiple_solutions(*archives):
- a = [load(archive) for archive in archives]
- # Assume the array names are the same in all archives
- raise NotImplementedError # more to do...
-
-def pulse(
- C=1, # Maximum Courant number
- Nx=200, # spatial resolution
- animate=True,
- version='vectorized',
- T=2, # end time
- loc='left', # location of initial condition
- pulse_tp='gaussian', # pulse/init.cond. type
- slowness_factor=2, # inverse of wave vel. in right medium
- medium=[0.7, 0.9], # interval for right medium
- skip_frame=1, # skip frames in animations
- sigma=0.05 # width measure of the pulse
- ):
- """
- Various peaked-shaped initial conditions on [0,1].
- Wave velocity is decreased by the slowness_factor inside
- medium. The loc parameter can be 'center' or 'left',
- depending on where the initial pulse is to be located.
- The sigma parameter governs the width of the pulse.
- """
- # Use scaled parameters: L=1 for domain length, c_0=1
- # for wave velocity outside the domain.
- L = 1.0
- c_0 = 1.0
- if loc == 'center':
- xc = L/2
- elif loc == 'left':
- xc = 0
-
- if pulse_tp in ('gaussian','Gaussian'):
- def I(x):
- return np.exp(-0.5*((x-xc)/sigma)**2)
- elif pulse_tp == 'plug':
- def I(x):
- return 0 if abs(x-xc) > sigma else 1
- elif pulse_tp == 'cosinehat':
- def I(x):
- # One period of a cosine
- w = 2
- a = w*sigma
- return 0.5*(1 + np.cos(np.pi*(x-xc)/a)) \
- if xc - a <= x <= xc + a else 0
-
- elif pulse_tp == 'half-cosinehat':
- def I(x):
- # Half a period of a cosine
- w = 4
- a = w*sigma
- return np.cos(np.pi*(x-xc)/a) \
- if xc - 0.5*a <= x <= xc + 0.5*a else 0
- else:
- raise ValueError('Wrong pulse_tp="%s"' % pulse_tp)
-
- def c(x):
- return c_0/slowness_factor \
- if medium[0] <= x <= medium[1] else c_0
-
- umin=-0.5; umax=1.5*I(xc)
- casename = '%s_Nx%s_sf%s' % \
- (pulse_tp, Nx, slowness_factor)
- action = PlotMediumAndSolution(
- medium, casename=casename, umin=umin, umax=umax,
- skip_frame=skip_frame, screen_movie=animate,
- backend=None, filename='tmpdata')
-
- # Choose the stability limit with given Nx, worst case c
- # (lower C will then use this dt, but smaller Nx)
- dt = (L/Nx)/c_0
- cpu, hashed_input = solver(
- I=I, V=None, f=None, c=c,
- U_0=None, U_L=None,
- L=L, dt=dt, C=C, T=T,
- user_action=action,
- version=version,
- stability_safety_factor=1)
-
- if cpu > 0: # did we generate new data?
- action.close_file(hashed_input)
- action.make_movie_file()
- print 'cpu (-1 means no new data generated):', cpu
-
-def convergence_rates(
- u_exact,
- I, V, f, c, U_0, U_L, L,
- dt0, num_meshes,
- C, T, version='scalar',
- stability_safety_factor=1.0):
- """
- Half the time step and estimate convergence rates for
- for num_meshes simulations.
- """
- class ComputeError:
- def __init__(self, norm_type):
- self.error = 0
-
- def __call__(self, u, x, t, n):
- """Store norm of the error in self.E."""
- error = np.abs(u - u_exact(x, t[n])).max()
- self.error = max(self.error, error)
-
- E = []
- h = [] # dt, solver adjusts dx such that C=dt*c/dx
- dt = dt0
- for i in range(num_meshes):
- error_calculator = ComputeError('Linf')
- solver(I, V, f, c, U_0, U_L, L, dt, C, T,
- user_action=error_calculator,
- version='scalar',
- stability_safety_factor=1.0)
- E.append(error_calculator.error)
- h.append(dt)
- dt /= 2 # halve the time step for next simulation
- print 'E:', E
- print 'h:', h
- r = [np.log(E[i]/E[i-1])/np.log(h[i]/h[i-1])
- for i in range(1,num_meshes)]
- return r
-
-def test_convrate_sincos():
- n = m = 2
- L = 1.0
- u_exact = lambda x, t: np.cos(m*np.pi/L*t)*np.sin(m*np.pi/L*x)
-
- r = convergence_rates(
- u_exact=u_exact,
- I=lambda x: u_exact(x, 0),
- V=lambda x: 0,
- f=0,
- c=1,
- U_0=0,
- U_L=0,
- L=L,
- dt0=0.1,
- num_meshes=6,
- C=0.9,
- T=1,
- version='scalar',
- stability_safety_factor=1.0)
- print 'rates sin(x)*cos(t) solution:', \
- [round(r_,2) for r_ in r]
- assert abs(r[-1] - 2) < 0.002
+ if U_0 is not None:
+ bc += [Eq(u[t_s+1, 0], U_0(t_s+1))]
+ if U_L is not None:
+ bc += [Eq(u[t_s+1, L], U_L(t_s+1))]
+
+ op_init = Operator([stencil_init]+bc)
+ op = Operator([stencil]+src_term+bc)
+
+ op_init.apply(time_M=1, dt=dt)
+ op.apply(time_m=1,time_M=Nt, dt=dt)
+
+ return u.data[-1], x, t, 0
+
+# def python_solver(
+# I, V, f, c, U_0, U_L, L, dt, C, T,
+# user_action=None, version='scalar',
+# stability_safety_factor=1.0):
+# """Solve u_tt=(c^2*u_x)_x + f on (0,L)x(0,T]."""
+
+# # --- Compute time and space mesh ---
+# Nt = int(round(T/dt))
+# t = np.linspace(0, Nt*dt, Nt+1) # Mesh points in time
+
+# # Find max(c) using a fake mesh and adapt dx to C and dt
+# if isinstance(c, (float,int)):
+# c_max = c
+# elif callable(c):
+# c_max = max([c(x_) for x_ in np.linspace(0, L, 101)])
+# dx = dt*c_max/(stability_safety_factor*C)
+# Nx = int(round(L/dx))
+# x = np.linspace(0, L, Nx+1) # Mesh points in space
+# # Make sure dx and dt are compatible with x and t
+# dx = x[1] - x[0]
+# dt = t[1] - t[0]
+
+# # Make c(x) available as array
+# if isinstance(c, (float,int)):
+# c = np.zeros(x.shape) + c
+# elif callable(c):
+# # Call c(x) and fill array c
+# c_ = np.zeros(x.shape)
+# for i in range(Nx+1):
+# c_[i] = c(x[i])
+# c = c_
+
+# q = c**2
+# C2 = (dt/dx)**2; dt2 = dt*dt # Help variables in the scheme
+
+# # --- Wrap user-given f, I, V, U_0, U_L if None or 0 ---
+# if f is None or f == 0:
+# f = (lambda x, t: 0) if version == 'scalar' else \
+# lambda x, t: np.zeros(x.shape)
+# if I is None or I == 0:
+# I = (lambda x: 0) if version == 'scalar' else \
+# lambda x: np.zeros(x.shape)
+# if V is None or V == 0:
+# V = (lambda x: 0) if version == 'scalar' else \
+# lambda x: np.zeros(x.shape)
+# if U_0 is not None:
+# if isinstance(U_0, (float,int)) and U_0 == 0:
+# U_0 = lambda t: 0
+# if U_L is not None:
+# if isinstance(U_L, (float,int)) and U_L == 0:
+# U_L = lambda t: 0
+
+# # --- Make hash of all input data ---
+# import hashlib, inspect
+# data = inspect.getsource(I) + '_' + inspect.getsource(V) + \
+# '_' + inspect.getsource(f) + '_' + str(c) + '_' + \
+# ('None' if U_0 is None else inspect.getsource(U_0)) + \
+# ('None' if U_L is None else inspect.getsource(U_L)) + \
+# '_' + str(L) + str(dt) + '_' + str(C) + '_' + str(T) + \
+# '_' + str(stability_safety_factor)
+# hashed_input = hashlib.sha1(data).hexdigest()
+# if os.path.isfile('.' + hashed_input + '_archive.npz'):
+# # Simulation is already run
+# return -1, hashed_input
+
+# # --- Allocate memomry for solutions ---
+# u = np.zeros(Nx+1) # Solution array at new time level
+# u_n = np.zeros(Nx+1) # Solution at 1 time level back
+# u_nm1 = np.zeros(Nx+1) # Solution at 2 time levels back
+
+# import time; t0 = time.clock() # CPU time measurement
+
+# # --- Valid indices for space and time mesh ---
+# Ix = range(0, Nx+1)
+# It = range(0, Nt+1)
+
+# # --- Load initial condition into u_n ---
+# for i in range(0,Nx+1):
+# u_n[i] = I(x[i])
+
+# if user_action is not None:
+# user_action(u_n, x, t, 0)
+
+# # --- Special formula for the first step ---
+# for i in Ix[1:-1]:
+# u[i] = u_n[i] + dt*V(x[i]) + \
+# 0.5*C2*(0.5*(q[i] + q[i+1])*(u_n[i+1] - u_n[i]) - \
+# 0.5*(q[i] + q[i-1])*(u_n[i] - u_n[i-1])) + \
+# 0.5*dt2*f(x[i], t[0])
+
+# i = Ix[0]
+# if U_0 is None:
+# # Set boundary values (x=0: i-1 -> i+1 since u[i-1]=u[i+1]
+# # when du/dn = 0, on x=L: i+1 -> i-1 since u[i+1]=u[i-1])
+# ip1 = i+1
+# im1 = ip1 # i-1 -> i+1
+# u[i] = u_n[i] + dt*V(x[i]) + \
+# 0.5*C2*(0.5*(q[i] + q[ip1])*(u_n[ip1] - u_n[i]) - \
+# 0.5*(q[i] + q[im1])*(u_n[i] - u_n[im1])) + \
+# 0.5*dt2*f(x[i], t[0])
+# else:
+# u[i] = U_0(dt)
+
+# i = Ix[-1]
+# if U_L is None:
+# im1 = i-1
+# ip1 = im1 # i+1 -> i-1
+# u[i] = u_n[i] + dt*V(x[i]) + \
+# 0.5*C2*(0.5*(q[i] + q[ip1])*(u_n[ip1] - u_n[i]) - \
+# 0.5*(q[i] + q[im1])*(u_n[i] - u_n[im1])) + \
+# 0.5*dt2*f(x[i], t[0])
+# else:
+# u[i] = U_L(dt)
+
+# if user_action is not None:
+# user_action(u, x, t, 1)
+
+# # Update data structures for next step
+# #u_nm1[:] = u_n; u_n[:] = u # safe, but slower
+# u_nm1, u_n, u = u_n, u, u_nm1
+
+# # --- Time loop ---
+# for n in It[1:-1]:
+# # Update all inner points
+# if version == 'scalar':
+# for i in Ix[1:-1]:
+# u[i] = - u_nm1[i] + 2*u_n[i] + \
+# C2*(0.5*(q[i] + q[i+1])*(u_n[i+1] - u_n[i]) - \
+# 0.5*(q[i] + q[i-1])*(u_n[i] - u_n[i-1])) + \
+# dt2*f(x[i], t[n])
+
+# elif version == 'vectorized':
+# u[1:-1] = - u_nm1[1:-1] + 2*u_n[1:-1] + \
+# C2*(0.5*(q[1:-1] + q[2:])*(u_n[2:] - u_n[1:-1]) -
+# 0.5*(q[1:-1] + q[:-2])*(u_n[1:-1] - u_n[:-2])) + \
+# dt2*f(x[1:-1], t[n])
+# else:
+# raise ValueError('version=%s' % version)
+
+# # Insert boundary conditions
+# i = Ix[0]
+# if U_0 is None:
+# # Set boundary values
+# # x=0: i-1 -> i+1 since u[i-1]=u[i+1] when du/dn=0
+# # x=L: i+1 -> i-1 since u[i+1]=u[i-1] when du/dn=0
+# ip1 = i+1
+# im1 = ip1
+# u[i] = - u_nm1[i] + 2*u_n[i] + \
+# C2*(0.5*(q[i] + q[ip1])*(u_n[ip1] - u_n[i]) - \
+# 0.5*(q[i] + q[im1])*(u_n[i] - u_n[im1])) + \
+# dt2*f(x[i], t[n])
+# else:
+# u[i] = U_0(t[n+1])
+
+# i = Ix[-1]
+# if U_L is None:
+# im1 = i-1
+# ip1 = im1
+# u[i] = - u_nm1[i] + 2*u_n[i] + \
+# C2*(0.5*(q[i] + q[ip1])*(u_n[ip1] - u_n[i]) - \
+# 0.5*(q[i] + q[im1])*(u_n[i] - u_n[im1])) + \
+# dt2*f(x[i], t[n])
+# else:
+# u[i] = U_L(t[n+1])
+
+# if user_action is not None:
+# if user_action(u, x, t, n+1):
+# break
+
+# # Update data structures for next step
+# u_nm1, u_n, u = u_n, u, u_nm1
+
+# cpu_time = time.clock() - t0
+# return cpu_time, hashed_input
+
+
+# def test_quadratic():
+# """
+# Check the scalar and vectorized versions for
+# a quadratic u(x,t)=x(L-x)(1+t/2) that is exactly reproduced,
+# provided c(x) is constant.
+# We simulate in [0, L/2] and apply a symmetry condition
+# at the end x=L/2.
+# """
+# u_exact = lambda x, t: x*(L-x)*(1+0.5*t)
+# I = lambda x: u_exact(x, 0)
+# V = lambda x: 0.5*u_exact(x, 0)
+# f = lambda x, t: 2*(1+0.5*t)*c**2
+# U_0 = lambda t: u_exact(0, t)
+# U_L = None
+# L = 2.5
+# c = 1.5
+# C = 0.75
+# Nx = 3 # Very coarse mesh for this exact test
+# dt = C*((L/2)/Nx)/c
+# T = 18 # long time integration
+
+# def assert_no_error(u, x, t, n):
+# u_e = u_exact(x, t[n])
+# diff = np.abs(u - u_e).max()
+# tol = 1E-13
+# assert diff < tol
+
+# solver(
+# I, V, f, c, U_0, U_L, L/2, dt, C, T,
+# user_action=assert_no_error, version='scalar',
+# stability_safety_factor=1)
+# solver(
+# I, V, f, c, U_0, U_L, L/2, dt, C, T,
+# user_action=assert_no_error, version='vectorized',
+# stability_safety_factor=1)
+
+# def test_plug():
+# """Check that an initial plug is correct back after one period."""
+# L = 1.
+# c = 0.5
+# dt = (L/10)/c # Nx=10
+# I = lambda x: 0 if abs(x-L/2.0) > 0.1 else 1
+
+# class Action:
+# """Store last solution."""
+# def __call__(self, u, x, t, n):
+# if n == len(t)-1:
+# self.u = u.copy()
+# self.x = x.copy()
+# self.t = t[n]
+
+# action = Action()
+
+# solver(
+# I=I,
+# V=None, f=None, c=c, U_0=None, U_L=None, L=L,
+# dt=dt, C=1, T=4, user_action=action, version='scalar')
+# u_s = action.u
+# solver(
+# I=I,
+# V=None, f=None, c=c, U_0=None, U_L=None, L=L,
+# dt=dt, C=1, T=4, user_action=action, version='vectorized')
+# u_v = action.u
+# diff = np.abs(u_s - u_v).max()
+# tol = 1E-13
+# assert diff < tol
+# u_0 = np.array([I(x_) for x_ in action.x])
+# diff = np.abs(u_s - u_0).max()
+# assert diff < tol
+
+# def merge_zip_archives(individual_archives, archive_name):
+# """
+# Merge individual zip archives made with numpy.savez into
+# one archive with name archive_name.
+# The individual archives can be given as a list of names
+# or as a Unix wild chard filename expression for glob.glob.
+# The result of this function is that all the individual
+# archives are deleted and the new single archive made.
+# """
+# import zipfile
+# archive = zipfile.ZipFile(
+# archive_name, 'w', zipfile.ZIP_DEFLATED,
+# allowZip64=True)
+# if isinstance(individual_archives, (list,tuple)):
+# filenames = individual_archives
+# elif isinstance(individual_archives, str):
+# filenames = glob.glob(individual_archives)
+
+# # Open each archive and write to the common archive
+# for filename in filenames:
+# f = zipfile.ZipFile(filename, 'r',
+# zipfile.ZIP_DEFLATED)
+# for name in f.namelist():
+# data = f.open(name, 'r')
+# # Save under name without .npy
+# archive.writestr(name[:-4], data.read())
+# f.close()
+# os.remove(filename)
+# archive.close()
+
+# class PlotAndStoreSolution:
+# """
+# Class for the user_action function in solver.
+# Visualizes the solution only.
+# """
+# def __init__(
+# self,
+# casename='tmp', # Prefix in filenames
+# umin=-1, umax=1, # Fixed range of y axis
+# pause_between_frames=None, # Movie speed
+# backend='matplotlib', # or 'gnuplot' or None
+# screen_movie=True, # Show movie on screen?
+# title='', # Extra message in title
+# skip_frame=1, # Skip every skip_frame frame
+# filename=None): # Name of file with solutions
+# self.casename = casename
+# self.yaxis = [umin, umax]
+# self.pause = pause_between_frames
+# self.backend = backend
+# if backend is None:
+# # Use native matplotlib
+# import matplotlib.pyplot as plt
+# elif backend in ('matplotlib', 'gnuplot'):
+# module = 'scitools.easyviz.' + backend + '_'
+# exec('import %s as plt' % module)
+# self.plt = plt
+# self.screen_movie = screen_movie
+# self.title = title
+# self.skip_frame = skip_frame
+# self.filename = filename
+# if filename is not None:
+# # Store time points when u is written to file
+# self.t = []
+# filenames = glob.glob('.' + self.filename + '*.dat.npz')
+# for filename in filenames:
+# os.remove(filename)
+
+# # Clean up old movie frames
+# for filename in glob.glob('frame_*.png'):
+# os.remove(filename)
+
+# def __call__(self, u, x, t, n):
+# """
+# Callback function user_action, call by solver:
+# Store solution, plot on screen and save to file.
+# """
+# # Save solution u to a file using numpy.savez
+# if self.filename is not None:
+# name = 'u%04d' % n # array name
+# kwargs = {name: u}
+# fname = '.' + self.filename + '_' + name + '.dat'
+# np.savez(fname, **kwargs)
+# self.t.append(t[n]) # store corresponding time value
+# if n == 0: # save x once
+# np.savez('.' + self.filename + '_x.dat', x=x)
+
+# # Animate
+# if n % self.skip_frame != 0:
+# return
+# title = 't=%.3f' % t[n]
+# if self.title:
+# title = self.title + ' ' + title
+# if self.backend is None:
+# # native matplotlib animation
+# if n == 0:
+# self.plt.ion()
+# self.lines = self.plt.plot(x, u, 'r-')
+# self.plt.axis([x[0], x[-1],
+# self.yaxis[0], self.yaxis[1]])
+# self.plt.xlabel('x')
+# self.plt.ylabel('u')
+# self.plt.title(title)
+# self.plt.legend(['t=%.3f' % t[n]])
+# else:
+# # Update new solution
+# self.lines[0].set_ydata(u)
+# self.plt.legend(['t=%.3f' % t[n]])
+# self.plt.draw()
+# else:
+# # scitools.easyviz animation
+# self.plt.plot(x, u, 'r-',
+# xlabel='x', ylabel='u',
+# axis=[x[0], x[-1],
+# self.yaxis[0], self.yaxis[1]],
+# title=title,
+# show=self.screen_movie)
+# # pause
+# if t[n] == 0:
+# time.sleep(2) # let initial condition stay 2 s
+# else:
+# if self.pause is None:
+# pause = 0.2 if u.size < 100 else 0
+# time.sleep(pause)
+
+# self.plt.savefig('frame_%04d.png' % (n))
+
+# def make_movie_file(self):
+# """
+# Create subdirectory based on casename, move all plot
+# frame files to this directory, and generate
+# an index.html for viewing the movie in a browser
+# (as a sequence of PNG files).
+# """
+# # Make HTML movie in a subdirectory
+# directory = self.casename
+
+# if os.path.isdir(directory):
+# shutil.rmtree(directory) # rm -rf directory
+# os.mkdir(directory) # mkdir directory
+# # mv frame_*.png directory
+# for filename in glob.glob('frame_*.png'):
+# os.rename(filename, os.path.join(directory, filename))
+# os.chdir(directory) # cd directory
+
+# fps = 24 # frames per second
+# if self.backend is not None:
+# from scitools.std import movie
+# movie('frame_*.png', encoder='html',
+# output_file='index.html', fps=fps)
+
+# # Make other movie formats: Flash, Webm, Ogg, MP4
+# codec2ext = dict(flv='flv', libx264='mp4', libvpx='webm',
+# libtheora='ogg')
+# filespec = 'frame_%04d.png'
+# movie_program = 'ffmpeg'
+# for codec in codec2ext:
+# ext = codec2ext[codec]
+# cmd = '%(movie_program)s -r %(fps)d -i %(filespec)s '\
+# '-vcodec %(codec)s movie.%(ext)s' % vars()
+# os.system(cmd)
+
+# os.chdir(os.pardir) # move back to parent directory
+
+# def close_file(self, hashed_input):
+# """
+# Merge all files from savez calls into one archive.
+# hashed_input is a string reflecting input data
+# for this simulation (made by solver).
+# """
+# if self.filename is not None:
+# # Save all the time points where solutions are saved
+# np.savez('.' + self.filename + '_t.dat',
+# t=np.array(self.t, dtype=float))
+
+# # Merge all savez files to one zip archive
+# archive_name = '.' + hashed_input + '_archive.npz'
+# filenames = glob.glob('.' + self.filename + '*.dat.npz')
+# merge_zip_archives(filenames, archive_name)
+# print 'Archive name:', archive_name
+# # data = numpy.load(archive); data.files holds names
+# # data[name] extract the array
+
+# def demo_BC_plug(C=1, Nx=40, T=4):
+# """Demonstrate u=0 and u_x=0 boundary conditions with a plug."""
+# action = PlotAndStoreSolution(
+# 'plug', -1.3, 1.3, skip_frame=1,
+# title='u(0,t)=0, du(L,t)/dn=0.', filename='tmpdata')
+# # Scaled problem: L=1, c=1, max I=1
+# L = 1.
+# dt = (L/Nx)/C # choose the stability limit with given Nx
+# cpu, hashed_input = solver(
+# I=lambda x: 0 if abs(x-L/2.0) > 0.1 else 1,
+# V=0, f=0, c=1, U_0=lambda t: 0, U_L=None, L=L,
+# dt=dt, C=C, T=T,
+# user_action=action, version='vectorized',
+# stability_safety_factor=1)
+# action.make_movie_file()
+# if cpu > 0: # did we generate new data?
+# action.close_file(hashed_input)
+# print 'cpu:', cpu
+
+# def demo_BC_gaussian(C=1, Nx=80, T=4):
+# """Demonstrate u=0 and u_x=0 boundary conditions with a bell function."""
+# # Scaled problem: L=1, c=1, max I=1
+# action = PlotAndStoreSolution(
+# 'gaussian', -1.3, 1.3, skip_frame=1,
+# title='u(0,t)=0, du(L,t)/dn=0.', filename='tmpdata')
+# L = 1.
+# dt = (L/Nx)/c # choose the stability limit with given Nx
+# cpu, hashed_input = solver(
+# I=lambda x: np.exp(-0.5*((x-0.5)/0.05)**2),
+# V=0, f=0, c=1, U_0=lambda t: 0, U_L=None, L=L,
+# dt=dt, C=C, T=T,
+# user_action=action, version='vectorized',
+# stability_safety_factor=1)
+# action.make_movie_file()
+# if cpu > 0: # did we generate new data?
+# action.close_file(hashed_input)
+
+# def moving_end(
+# C=1, Nx=50, reflecting_right_boundary=True,
+# version='vectorized'):
+# # Scaled problem: L=1, c=1, max I=1
+# L = 1.
+# c = 1
+# dt = (L/Nx)/c # choose the stability limit with given Nx
+# T = 3
+# I = lambda x: 0
+# V = 0
+# f = 0
+
+# def U_0(t):
+# return 1.0*sin(6*np.pi*t) if t < 1./3 else 0
+
+# if reflecting_right_boundary:
+# U_L = None
+# bc_right = 'du(L,t)/dx=0'
+# else:
+# U_L = 0
+# bc_right = 'u(L,t)=0'
+
+# action = PlotAndStoreSolution(
+# 'moving_end', -2.3, 2.3, skip_frame=4,
+# title='u(0,t)=0.25*sin(6*pi*t) if t < 1/3 else 0, '
+# + bc_right, filename='tmpdata')
+# cpu, hashed_input = solver(
+# I, V, f, c, U_0, U_L, L, dt, C, T,
+# user_action=action, version=version,
+# stability_safety_factor=1)
+# action.make_movie_file()
+# if cpu > 0: # did we generate new data?
+# action.close_file(hashed_input)
+
+
+# class PlotMediumAndSolution(PlotAndStoreSolution):
+# def __init__(self, medium, **kwargs):
+# """Mark medium in plot: medium=[x_L, x_R]."""
+# self.medium = medium
+# PlotAndStoreSolution.__init__(self, **kwargs)
+
+# def __call__(self, u, x, t, n):
+# # Save solution u to a file using numpy.savez
+# if self.filename is not None:
+# name = 'u%04d' % n # array name
+# kwargs = {name: u}
+# fname = '.' + self.filename + '_' + name + '.dat'
+# np.savez(fname, **kwargs)
+# self.t.append(t[n]) # store corresponding time value
+# if n == 0: # save x once
+# np.savez('.' + self.filename + '_x.dat', x=x)
+
+# # Animate
+# if n % self.skip_frame != 0:
+# return
+# # Plot u and mark medium x=x_L and x=x_R
+# x_L, x_R = self.medium
+# umin, umax = self.yaxis
+# title = 'Nx=%d' % (x.size-1)
+# if self.title:
+# title = self.title + ' ' + title
+# if self.backend is None:
+# # native matplotlib animation
+# if n == 0:
+# self.plt.ion()
+# self.lines = self.plt.plot(
+# x, u, 'r-',
+# [x_L, x_L], [umin, umax], 'k--',
+# [x_R, x_R], [umin, umax], 'k--')
+# self.plt.axis([x[0], x[-1],
+# self.yaxis[0], self.yaxis[1]])
+# self.plt.xlabel('x')
+# self.plt.ylabel('u')
+# self.plt.title(title)
+# self.plt.text(0.75, 1.0, 'c lower')
+# self.plt.text(0.32, 1.0, 'c=1')
+# self.plt.legend(['t=%.3f' % t[n]])
+# else:
+# # Update new solution
+# self.lines[0].set_ydata(u)
+# self.plt.legend(['t=%.3f' % t[n]])
+# self.plt.draw()
+# else:
+# # scitools.easyviz animation
+# self.plt.plot(x, u, 'r-',
+# [x_L, x_L], [umin, umax], 'k--',
+# [x_R, x_R], [umin, umax], 'k--',
+# xlabel='x', ylabel='u',
+# axis=[x[0], x[-1],
+# self.yaxis[0], self.yaxis[1]],
+# title=title,
+# show=self.screen_movie)
+# # pause
+# if t[n] == 0:
+# time.sleep(2) # let initial condition stay 2 s
+# else:
+# if self.pause is None:
+# pause = 0.2 if u.size < 100 else 0
+# time.sleep(pause)
+
+# self.plt.savefig('frame_%04d.png' % (n))
+
+# if n == (len(t) - 1): # finished with this run, close plot
+# self.plt.close()
+
+
+# def animate_multiple_solutions(*archives):
+# a = [load(archive) for archive in archives]
+# # Assume the array names are the same in all archives
+# raise NotImplementedError # more to do...
+
+# def pulse(
+# C=1, # Maximum Courant number
+# Nx=200, # spatial resolution
+# animate=True,
+# version='vectorized',
+# T=2, # end time
+# loc='left', # location of initial condition
+# pulse_tp='gaussian', # pulse/init.cond. type
+# slowness_factor=2, # inverse of wave vel. in right medium
+# medium=[0.7, 0.9], # interval for right medium
+# skip_frame=1, # skip frames in animations
+# sigma=0.05 # width measure of the pulse
+# ):
+# """
+# Various peaked-shaped initial conditions on [0,1].
+# Wave velocity is decreased by the slowness_factor inside
+# medium. The loc parameter can be 'center' or 'left',
+# depending on where the initial pulse is to be located.
+# The sigma parameter governs the width of the pulse.
+# """
+# # Use scaled parameters: L=1 for domain length, c_0=1
+# # for wave velocity outside the domain.
+# L = 1.0
+# c_0 = 1.0
+# if loc == 'center':
+# xc = L/2
+# elif loc == 'left':
+# xc = 0
+
+# if pulse_tp in ('gaussian','Gaussian'):
+# def I(x):
+# return np.exp(-0.5*((x-xc)/sigma)**2)
+# elif pulse_tp == 'plug':
+# def I(x):
+# return 0 if abs(x-xc) > sigma else 1
+# elif pulse_tp == 'cosinehat':
+# def I(x):
+# # One period of a cosine
+# w = 2
+# a = w*sigma
+# return 0.5*(1 + np.cos(np.pi*(x-xc)/a)) \
+# if xc - a <= x <= xc + a else 0
+
+# elif pulse_tp == 'half-cosinehat':
+# def I(x):
+# # Half a period of a cosine
+# w = 4
+# a = w*sigma
+# return np.cos(np.pi*(x-xc)/a) \
+# if xc - 0.5*a <= x <= xc + 0.5*a else 0
+# else:
+# raise ValueError('Wrong pulse_tp="%s"' % pulse_tp)
+
+# def c(x):
+# return c_0/slowness_factor \
+# if medium[0] <= x <= medium[1] else c_0
+
+# umin=-0.5; umax=1.5*I(xc)
+# casename = '%s_Nx%s_sf%s' % \
+# (pulse_tp, Nx, slowness_factor)
+# action = PlotMediumAndSolution(
+# medium, casename=casename, umin=umin, umax=umax,
+# skip_frame=skip_frame, screen_movie=animate,
+# backend=None, filename='tmpdata')
+
+# # Choose the stability limit with given Nx, worst case c
+# # (lower C will then use this dt, but smaller Nx)
+# dt = (L/Nx)/c_0
+# cpu, hashed_input = solver(
+# I=I, V=None, f=None, c=c,
+# U_0=None, U_L=None,
+# L=L, dt=dt, C=C, T=T,
+# user_action=action,
+# version=version,
+# stability_safety_factor=1)
+
+# if cpu > 0: # did we generate new data?
+# action.close_file(hashed_input)
+# action.make_movie_file()
+# print 'cpu (-1 means no new data generated):', cpu
+
+# def convergence_rates(
+# u_exact,
+# I, V, f, c, U_0, U_L, L,
+# dt0, num_meshes,
+# C, T, version='scalar',
+# stability_safety_factor=1.0):
+# """
+# Half the time step and estimate convergence rates for
+# for num_meshes simulations.
+# """
+# class ComputeError:
+# def __init__(self, norm_type):
+# self.error = 0
+
+# def __call__(self, u, x, t, n):
+# """Store norm of the error in self.E."""
+# error = np.abs(u - u_exact(x, t[n])).max()
+# self.error = max(self.error, error)
+
+# E = []
+# h = [] # dt, solver adjusts dx such that C=dt*c/dx
+# dt = dt0
+# for i in range(num_meshes):
+# error_calculator = ComputeError('Linf')
+# solver(I, V, f, c, U_0, U_L, L, dt, C, T,
+# user_action=error_calculator,
+# version='scalar',
+# stability_safety_factor=1.0)
+# E.append(error_calculator.error)
+# h.append(dt)
+# dt /= 2 # halve the time step for next simulation
+# print 'E:', E
+# print 'h:', h
+# r = [np.log(E[i]/E[i-1])/np.log(h[i]/h[i-1])
+# for i in range(1,num_meshes)]
+# return r
+
+# def test_convrate_sincos():
+# n = m = 2
+# L = 1.0
+# u_exact = lambda x, t: np.cos(m*np.pi/L*t)*np.sin(m*np.pi/L*x)
+
+# r = convergence_rates(
+# u_exact=u_exact,
+# I=lambda x: u_exact(x, 0),
+# V=lambda x: 0,
+# f=0,
+# c=1,
+# U_0=0,
+# U_L=0,
+# L=L,
+# dt0=0.1,
+# num_meshes=6,
+# C=0.9,
+# T=1,
+# version='scalar',
+# stability_safety_factor=1.0)
+# print 'rates sin(x)*cos(t) solution:', \
+# [round(r_,2) for r_ in r]
+# assert abs(r[-1] - 2) < 0.002
if __name__ == '__main__':
- test_convrate_sincos()
+ print(type(devito_solver))
+ # test_convrate_sincos()
diff --git a/fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb b/fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb
index f3a85332..fee0f44d 100644
--- a/fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb
+++ b/fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb
@@ -318,7 +318,7 @@
},
{
"cell_type": "code",
- "execution_count": 86,
+ "execution_count": 88,
"metadata": {},
"outputs": [],
"source": [
@@ -1558,14 +1558,10 @@
"a variable wave velocity. The different code segments needed\n",
"to make these extensions have been shown and commented upon in the\n",
"preceding text. We refer to the `solver` function in the\n",
- "`wave1D_dn_vc.py` file for all the details. Note in that\n",
+ "[`wave1D_dn_vc.py`](src-wave/wave1D/wave1D_dn_vc.py) file for all the details. Note in that\n",
" `solver` function, however, that the technique of \"hashing\" is\n",
"used to check whether a certain simulation has been run before, or not.\n",
"\n",
- "The vectorization is only applied inside the time loop, not for the\n",
- "initial condition or the first time steps, since this initial work\n",
- "is negligible for long time simulations in 1D problems.\n",
- "\n",
"The following sections explain various more advanced programming\n",
"techniques applied in the general 1D wave equation solver.\n",
"\n",
diff --git a/fdm-devito-notebooks/02_wave/wave_app.ipynb b/fdm-devito-notebooks/02_wave/wave_app.ipynb
index 23183ed0..b6d0dbd4 100644
--- a/fdm-devito-notebooks/02_wave/wave_app.ipynb
+++ b/fdm-devito-notebooks/02_wave/wave_app.ipynb
@@ -1884,7 +1884,25 @@
]
}
],
- "metadata": {},
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.3"
+ }
+ },
"nbformat": 4,
"nbformat_minor": 4
}
From 6a79390d4ca09dc90bc70091803bad26a33036b9 Mon Sep 17 00:00:00 2001
From: Rini Banerjee <26858592+rbanerjee20@users.noreply.github.com>
Date: Fri, 28 Aug 2020 12:46:55 +0100
Subject: [PATCH 10/19] Added notebook explanation of variable velocity Devito
implementation and fixed code to use Devito Function.
---
.../02_wave/src-wave/wave1D/wave1D_dn_vc.py | 8 +-
fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb | 168 ++++++++----------
2 files changed, 79 insertions(+), 97 deletions(-)
diff --git a/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_dn_vc.py b/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_dn_vc.py
index 05d0dc00..4de8e311 100644
--- a/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_dn_vc.py
+++ b/fdm-devito-notebooks/02_wave/src-wave/wave1D/wave1D_dn_vc.py
@@ -31,7 +31,7 @@
"""
import time, glob, shutil, os
import numpy as np
-from devito import Constant, Grid, TimeFunction, SparseTimeFunction, SparseFunction, Eq, solve, Operator, Buffer
+from devito import Constant, Grid, TimeFunction, SparseTimeFunction, SparseFunction, Eq, solve, Operator, Buffer, Function
def devito_solver(
@@ -96,8 +96,12 @@ def devito_solver(
x_dim = grid.dimensions[0]
t_dim = grid.time_dim
+
+ # Initialise variable velocity function
+ q_f = Function(name='q', grid=grid, npoint=Nx+1, nt=Nt+1)
+ q_f.data[:] = q(x[:])
- pde = u.dt2-(q*u.dx).dx
+ pde = u.dt2-(q_f*u.dx).dx
stencil = Eq(u.forward, solve(pde, u.forward))
# Source term and injection into equation
diff --git a/fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb b/fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb
index fee0f44d..2cc9f45c 100644
--- a/fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb
+++ b/fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb
@@ -124,19 +124,19 @@
},
{
"cell_type": "code",
- "execution_count": 65,
+ "execution_count": 56,
"metadata": {},
"outputs": [],
"source": [
"# NBVAL_IGNORE_OUTPUT\n",
"import numpy as np\n",
"import time as time\n",
- "from devito import Constant, Grid, TimeFunction, SparseTimeFunction, SparseFunction, Eq, solve, Operator, Buffer"
+ "from devito import Constant, Grid, TimeFunction, SparseTimeFunction, SparseFunction, Eq, solve, Operator, Buffer, Function"
]
},
{
"cell_type": "code",
- "execution_count": 84,
+ "execution_count": 57,
"metadata": {},
"outputs": [],
"source": [
@@ -198,7 +198,7 @@
},
{
"cell_type": "code",
- "execution_count": 87,
+ "execution_count": 58,
"metadata": {},
"outputs": [
{
@@ -236,6 +236,8 @@
"dt = C*(L/Nx)/c\n",
"nperiods = 4\n",
"T = L/c*nperiods # One period: c*T = L\n",
+ "Nt = int(round(T/dt))\n",
+ "x = np.linspace(0, L, Nx+1) # Mesh points in space\n",
"\n",
"u_mine, x_arr, t_arr, cpu_time = solver(I, None, None, c, L, dt, C, T)\n",
"\n",
@@ -318,7 +320,7 @@
},
{
"cell_type": "code",
- "execution_count": 88,
+ "execution_count": 59,
"metadata": {},
"outputs": [],
"source": [
@@ -378,7 +380,7 @@
},
{
"cell_type": "code",
- "execution_count": 11,
+ "execution_count": 60,
"metadata": {},
"outputs": [],
"source": [
@@ -1160,92 +1162,103 @@
"## Implementation of variable coefficients\n",
"\n",
"\n",
- "The implementation of the scheme with a variable wave velocity $q(x)=c^2(x)$\n",
- "may assume that $q$ is available as an array `q[i]` at\n",
- "the spatial mesh points. The following loop is a straightforward\n",
- "implementation of the scheme ([16](#wave:pde2:var:c:scheme:impl)):"
+ "The implementation of the scheme with a variable wave velocity $q(x)=c^2(x)$ is very simple using Devito. Previously, we used this simpler form of the wave equation"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "$$\n",
+ "\\begin{equation}\n",
+ "\\frac{\\partial^2 u}{\\partial t^2} =\n",
+ "c^2\\frac{\\partial^2 u}{\\partial x^2}\n",
+ " + f(x,t) \\thinspace .\n",
+ "\\end{equation}\n",
+ "$$"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We represented this equation in our code as"
]
},
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": 67,
"metadata": {},
- "outputs": [
- {
- "ename": "NameError",
- "evalue": "name 'Nx' is not defined",
- "output_type": "error",
- "traceback": [
- "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mNx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mu_nm1\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mu_n\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m\\\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m C2*(0.5*(q[i] + q[i+1])*(u_n[i+1] - u_n[i]) - \\\n\u001b[1;32m 4\u001b[0m 0.5*(q[i] + q[i-1])*(u_n[i] - u_n[i-1])) + \\\n\u001b[1;32m 5\u001b[0m \u001b[0mdt2\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
- "\u001b[0;31mNameError\u001b[0m: name 'Nx' is not defined"
- ]
- }
- ],
+ "outputs": [],
"source": [
- "for i in range(1, Nx):\n",
- " u[i] = - u_nm1[i] + 2*u_n[i] + \\\n",
- " C2*(0.5*(q[i] + q[i+1])*(u_n[i+1] - u_n[i]) - \\\n",
- " 0.5*(q[i] + q[i-1])*(u_n[i] - u_n[i-1])) + \\\n",
- " dt2*f(x[i], t[n])"
+ "grid = Grid(shape=(Nx+1), extent=(L))\n",
+ "u = TimeFunction(name='u', grid=grid, time_order=2, space_order=2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "The coefficient `C2` is now defined as `(dt/dx)**2`, i.e., *not* as the\n",
- "squared Courant number, since the wave velocity is variable and appears\n",
- "inside the parenthesis.\n",
- "\n",
- "With Neumann conditions $u_x=0$ at the\n",
- "boundary, we need to combine this scheme with the discrete\n",
- "version of the boundary condition, as shown in the section [Neumann condition and a variable coefficient](#wave:pde2:var:c:Neumann).\n",
- "Nevertheless, it would be convenient to reuse the formula for the\n",
- "interior points and just modify the indices `ip1=i+1` and `im1=i-1`\n",
- "as we did in the section [Implementation of Neumann conditions](#wave:pde2:Neumann:impl). Assuming\n",
- "$dq/dx=0$ at the boundaries, we can implement the scheme at\n",
- "the boundary with the following code."
+ "with our `pde` variable simply being"
]
},
{
"cell_type": "code",
- "execution_count": 14,
+ "execution_count": 76,
"metadata": {},
"outputs": [],
"source": [
- "i = 0\n",
- "ip1 = i+1\n",
- "im1 = ip1\n",
- "u[i] = - u_nm1[i] + 2*u_n[i] + \\\n",
- " C2*(0.5*(q[i] + q[ip1])*(u_n[ip1] - u_n[i]) - \\\n",
- " 0.5*(q[i] + q[im1])*(u_n[i] - u_n[im1])) + \\\n",
- " dt2*f(x[i], t[n])"
+ "pde = (1/c**2)*u.dt2-u.dx2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "With ghost cells we can just reuse the formula for the interior\n",
- "points also at the boundary, provided that the ghost values of both\n",
- "$u$ and $q$ are correctly updated to ensure $u_x=0$ and $q_x=0$.\n",
+ "For incorporating the variable wave velocity term, we first need to create a Devito `Function` to represent our given function `q` and initialise its values."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 82,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Setting q as identity function for demonstrative purposes\n",
+ "# In reality, this function q would be an argument to the solver function\n",
+ "q = lambda x: x\n",
"\n",
- "A vectorized version of the scheme with a variable coefficient\n",
- "at internal mesh points becomes"
+ "q_f = Function(name='q', grid=grid, npoint=Nx+1, nt=Nt+1)\n",
+ "q_f.data[:] = q(x[:])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can now set our `pde` variable as"
]
},
{
"cell_type": "code",
- "execution_count": 15,
+ "execution_count": 83,
"metadata": {},
"outputs": [],
"source": [
- "u[1:-1] = - u_nm1[1:-1] + 2*u_n[1:-1] + \\\n",
- " C2*(0.5*(q[1:-1] + q[2:])*(u_n[2:] - u_n[1:-1]) -\n",
- " 0.5*(q[1:-1] + q[:-2])*(u_n[1:-1] - u_n[:-2])) + \\\n",
- " dt2*f(x[1:-1], t[n])"
+ "pde = u.dt2-(q_f*u.dx).dx"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "and the rest of the steps are now identical to what we did in our `solver` functions before.\n",
+ "\n",
+ "**Note**\n",
+ "\n",
+ "The coefficient `C2` is now defined as `(dt/dx)**2`, i.e., *not* as the\n",
+ "squared Courant number, since the wave velocity is variable and appears\n",
+ "inside the parenthesis."
]
},
{
@@ -1514,39 +1527,6 @@
"$$"
]
},
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The only new feature here is the time-dependent Dirichlet conditions, but\n",
- "they are trivial to implement:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [
- {
- "ename": "NameError",
- "evalue": "name 'Ix' is not defined",
- "output_type": "error",
- "traceback": [
- "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
- "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mi\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mIx\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m# x=0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mU_0\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mi\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mIx\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m# x=L\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mu\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mU_L\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
- "\u001b[0;31mNameError\u001b[0m: name 'Ix' is not defined"
- ]
- }
- ],
- "source": [
- "i = Ix[0] # x=0\n",
- "u[i] = U_0(t[n+1])\n",
- "\n",
- "i = Ix[-1] # x=L\n",
- "u[i] = U_L(t[n+1])"
- ]
- },
{
"cell_type": "markdown",
"metadata": {},
@@ -1558,9 +1538,7 @@
"a variable wave velocity. The different code segments needed\n",
"to make these extensions have been shown and commented upon in the\n",
"preceding text. We refer to the `solver` function in the\n",
- "[`wave1D_dn_vc.py`](src-wave/wave1D/wave1D_dn_vc.py) file for all the details. Note in that\n",
- " `solver` function, however, that the technique of \"hashing\" is\n",
- "used to check whether a certain simulation has been run before, or not.\n",
+ "[`wave1D_dn_vc.py`](src-wave/wave1D/wave1D_dn_vc.py) file for all the details.\n",
"\n",
"The following sections explain various more advanced programming\n",
"techniques applied in the general 1D wave equation solver.\n",
From 96400a694e1e96020572559b6a2fbd7bb796c5e1 Mon Sep 17 00:00:00 2001
From: Rini Banerjee <26858592+rbanerjee20@users.noreply.github.com>
Date: Fri, 28 Aug 2020 15:21:04 +0100
Subject: [PATCH 11/19] Corrected variable velocity initialisation.
---
...01af3f04047239501937ae936b7ae5_archive.npz | Bin 0 -> 660399 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0000.png | Bin 0 -> 12172 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0001.png | Bin 0 -> 12337 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0002.png | Bin 0 -> 12284 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0003.png | Bin 0 -> 12277 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0004.png | Bin 0 -> 12379 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0005.png | Bin 0 -> 12317 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0006.png | Bin 0 -> 12129 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0007.png | Bin 0 -> 12206 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0008.png | Bin 0 -> 12036 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0009.png | Bin 0 -> 12088 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0010.png | Bin 0 -> 12020 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0011.png | Bin 0 -> 11950 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0012.png | Bin 0 -> 12121 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0013.png | Bin 0 -> 12194 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0014.png | Bin 0 -> 12152 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0015.png | Bin 0 -> 12153 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0016.png | Bin 0 -> 12208 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0017.png | Bin 0 -> 12324 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0018.png | Bin 0 -> 12327 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0019.png | Bin 0 -> 12450 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0020.png | Bin 0 -> 12384 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0021.png | Bin 0 -> 12381 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0022.png | Bin 0 -> 12312 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0023.png | Bin 0 -> 12379 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0024.png | Bin 0 -> 12462 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0025.png | Bin 0 -> 12520 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0026.png | Bin 0 -> 12587 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0027.png | Bin 0 -> 12563 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0028.png | Bin 0 -> 12561 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0029.png | Bin 0 -> 12571 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0030.png | Bin 0 -> 12583 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0031.png | Bin 0 -> 12591 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0032.png | Bin 0 -> 12659 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0033.png | Bin 0 -> 12656 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0034.png | Bin 0 -> 12617 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0035.png | Bin 0 -> 12595 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0036.png | Bin 0 -> 12658 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0037.png | Bin 0 -> 12698 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0038.png | Bin 0 -> 12690 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0039.png | Bin 0 -> 12666 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0040.png | Bin 0 -> 12757 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0041.png | Bin 0 -> 12759 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0042.png | Bin 0 -> 12678 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0043.png | Bin 0 -> 12672 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0044.png | Bin 0 -> 12769 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0045.png | Bin 0 -> 12719 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0046.png | Bin 0 -> 12772 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0047.png | Bin 0 -> 12763 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0048.png | Bin 0 -> 12764 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0049.png | Bin 0 -> 12726 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0050.png | Bin 0 -> 12760 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0051.png | Bin 0 -> 12718 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0052.png | Bin 0 -> 12816 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0053.png | Bin 0 -> 12793 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0054.png | Bin 0 -> 12735 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0055.png | Bin 0 -> 12713 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0056.png | Bin 0 -> 12791 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0057.png | Bin 0 -> 12777 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0058.png | Bin 0 -> 12786 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0059.png | Bin 0 -> 12785 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0060.png | Bin 0 -> 12596 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0061.png | Bin 0 -> 12660 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0062.png | Bin 0 -> 12677 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0063.png | Bin 0 -> 12662 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0064.png | Bin 0 -> 12751 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0065.png | Bin 0 -> 12811 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0066.png | Bin 0 -> 12689 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0067.png | Bin 0 -> 12789 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0068.png | Bin 0 -> 12607 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0069.png | Bin 0 -> 12734 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0070.png | Bin 0 -> 12658 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0071.png | Bin 0 -> 12697 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0072.png | Bin 0 -> 12812 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0073.png | Bin 0 -> 12773 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0074.png | Bin 0 -> 12742 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0075.png | Bin 0 -> 12721 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0076.png | Bin 0 -> 12682 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0077.png | Bin 0 -> 12790 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0078.png | Bin 0 -> 12762 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0079.png | Bin 0 -> 12832 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0080.png | Bin 0 -> 12524 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0081.png | Bin 0 -> 12616 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0082.png | Bin 0 -> 12586 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0083.png | Bin 0 -> 12621 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0084.png | Bin 0 -> 12720 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0085.png | Bin 0 -> 12724 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0086.png | Bin 0 -> 12642 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0087.png | Bin 0 -> 12756 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0088.png | Bin 0 -> 12563 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0089.png | Bin 0 -> 12688 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0090.png | Bin 0 -> 12689 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0091.png | Bin 0 -> 12646 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0092.png | Bin 0 -> 12766 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0093.png | Bin 0 -> 12762 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0094.png | Bin 0 -> 12760 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0095.png | Bin 0 -> 12727 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0096.png | Bin 0 -> 12655 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0097.png | Bin 0 -> 12755 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0098.png | Bin 0 -> 12784 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0099.png | Bin 0 -> 12777 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0100.png | Bin 0 -> 12721 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0101.png | Bin 0 -> 12783 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0102.png | Bin 0 -> 12698 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0103.png | Bin 0 -> 12685 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0104.png | Bin 0 -> 12777 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0105.png | Bin 0 -> 12768 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0106.png | Bin 0 -> 12769 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0107.png | Bin 0 -> 12748 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0108.png | Bin 0 -> 12712 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0109.png | Bin 0 -> 12678 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0110.png | Bin 0 -> 12722 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0111.png | Bin 0 -> 12686 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0112.png | Bin 0 -> 12828 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0113.png | Bin 0 -> 12734 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0114.png | Bin 0 -> 12710 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0115.png | Bin 0 -> 12672 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0116.png | Bin 0 -> 12757 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0117.png | Bin 0 -> 12699 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0118.png | Bin 0 -> 12772 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0119.png | Bin 0 -> 12689 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0120.png | Bin 0 -> 12686 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0121.png | Bin 0 -> 12670 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0122.png | Bin 0 -> 12643 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0123.png | Bin 0 -> 12654 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0124.png | Bin 0 -> 12741 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0125.png | Bin 0 -> 12668 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0126.png | Bin 0 -> 12698 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0127.png | Bin 0 -> 12692 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0128.png | Bin 0 -> 12669 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0129.png | Bin 0 -> 12682 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0130.png | Bin 0 -> 12719 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0131.png | Bin 0 -> 12677 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0132.png | Bin 0 -> 12814 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0133.png | Bin 0 -> 12787 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0134.png | Bin 0 -> 12760 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0135.png | Bin 0 -> 12751 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0136.png | Bin 0 -> 12935 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0137.png | Bin 0 -> 12918 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0138.png | Bin 0 -> 12962 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0139.png | Bin 0 -> 12907 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0140.png | Bin 0 -> 12789 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0141.png | Bin 0 -> 12877 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0142.png | Bin 0 -> 12840 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0143.png | Bin 0 -> 12796 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0144.png | Bin 0 -> 12938 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0145.png | Bin 0 -> 12946 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0146.png | Bin 0 -> 12927 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0147.png | Bin 0 -> 12992 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0148.png | Bin 0 -> 12950 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0149.png | Bin 0 -> 13017 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0150.png | Bin 0 -> 12984 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0151.png | Bin 0 -> 12985 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0152.png | Bin 0 -> 13048 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0153.png | Bin 0 -> 13019 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0154.png | Bin 0 -> 12998 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0155.png | Bin 0 -> 12983 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0156.png | Bin 0 -> 13052 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0157.png | Bin 0 -> 13139 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0158.png | Bin 0 -> 13221 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0159.png | Bin 0 -> 13277 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0160.png | Bin 0 -> 13223 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0161.png | Bin 0 -> 13325 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0162.png | Bin 0 -> 13360 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0163.png | Bin 0 -> 13404 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0164.png | Bin 0 -> 13562 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0165.png | Bin 0 -> 13612 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0166.png | Bin 0 -> 13594 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0167.png | Bin 0 -> 13639 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0168.png | Bin 0 -> 13434 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0169.png | Bin 0 -> 13618 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0170.png | Bin 0 -> 13602 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0171.png | Bin 0 -> 13641 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0172.png | Bin 0 -> 13809 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0173.png | Bin 0 -> 13745 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0174.png | Bin 0 -> 13720 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0175.png | Bin 0 -> 13721 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0176.png | Bin 0 -> 13629 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0177.png | Bin 0 -> 13785 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0178.png | Bin 0 -> 13866 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0179.png | Bin 0 -> 13819 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0180.png | Bin 0 -> 13669 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0181.png | Bin 0 -> 13742 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0182.png | Bin 0 -> 13649 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0183.png | Bin 0 -> 13618 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0184.png | Bin 0 -> 13791 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0185.png | Bin 0 -> 13674 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0186.png | Bin 0 -> 13720 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0187.png | Bin 0 -> 13759 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0188.png | Bin 0 -> 13710 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0189.png | Bin 0 -> 13655 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0190.png | Bin 0 -> 13755 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0191.png | Bin 0 -> 13685 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0192.png | Bin 0 -> 13787 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0193.png | Bin 0 -> 13758 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0194.png | Bin 0 -> 13703 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0195.png | Bin 0 -> 13676 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0196.png | Bin 0 -> 13796 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0197.png | Bin 0 -> 13787 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0198.png | Bin 0 -> 13855 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0199.png | Bin 0 -> 13812 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0200.png | Bin 0 -> 13655 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0201.png | Bin 0 -> 13669 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0202.png | Bin 0 -> 13598 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0203.png | Bin 0 -> 13564 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0204.png | Bin 0 -> 13669 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0205.png | Bin 0 -> 13635 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0206.png | Bin 0 -> 13701 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0207.png | Bin 0 -> 13620 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0208.png | Bin 0 -> 13567 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0209.png | Bin 0 -> 13607 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0210.png | Bin 0 -> 13585 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0211.png | Bin 0 -> 13555 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0212.png | Bin 0 -> 13527 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0213.png | Bin 0 -> 13492 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0214.png | Bin 0 -> 13469 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0215.png | Bin 0 -> 13363 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0216.png | Bin 0 -> 13389 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0217.png | Bin 0 -> 13325 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0218.png | Bin 0 -> 13249 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0219.png | Bin 0 -> 13141 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0220.png | Bin 0 -> 13024 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0221.png | Bin 0 -> 12981 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0222.png | Bin 0 -> 12757 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0223.png | Bin 0 -> 12695 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0224.png | Bin 0 -> 12958 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0225.png | Bin 0 -> 12899 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0226.png | Bin 0 -> 12980 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0227.png | Bin 0 -> 12970 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0228.png | Bin 0 -> 13023 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0229.png | Bin 0 -> 12977 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0230.png | Bin 0 -> 13007 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0231.png | Bin 0 -> 13048 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0232.png | Bin 0 -> 13294 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0233.png | Bin 0 -> 13297 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0234.png | Bin 0 -> 13423 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0235.png | Bin 0 -> 13441 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0236.png | Bin 0 -> 13523 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0237.png | Bin 0 -> 13648 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0238.png | Bin 0 -> 13616 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0239.png | Bin 0 -> 13606 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0240.png | Bin 0 -> 13755 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0241.png | Bin 0 -> 13716 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0242.png | Bin 0 -> 13631 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0243.png | Bin 0 -> 13545 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0244.png | Bin 0 -> 13677 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0245.png | Bin 0 -> 13597 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0246.png | Bin 0 -> 13697 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0247.png | Bin 0 -> 13584 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0248.png | Bin 0 -> 13515 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0249.png | Bin 0 -> 13471 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0250.png | Bin 0 -> 13396 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0251.png | Bin 0 -> 13330 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0252.png | Bin 0 -> 13482 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0253.png | Bin 0 -> 13433 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0254.png | Bin 0 -> 13475 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0255.png | Bin 0 -> 13512 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0256.png | Bin 0 -> 13715 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0257.png | Bin 0 -> 13745 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0258.png | Bin 0 -> 13741 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0259.png | Bin 0 -> 13741 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0260.png | Bin 0 -> 13807 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0261.png | Bin 0 -> 13790 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0262.png | Bin 0 -> 13714 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0263.png | Bin 0 -> 13787 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0264.png | Bin 0 -> 13817 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0265.png | Bin 0 -> 13749 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0266.png | Bin 0 -> 13729 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0267.png | Bin 0 -> 13675 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0268.png | Bin 0 -> 13676 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0269.png | Bin 0 -> 13647 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0270.png | Bin 0 -> 13695 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0271.png | Bin 0 -> 13652 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0272.png | Bin 0 -> 13645 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0273.png | Bin 0 -> 13721 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0274.png | Bin 0 -> 13732 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0275.png | Bin 0 -> 13760 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0276.png | Bin 0 -> 13856 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0277.png | Bin 0 -> 13928 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0278.png | Bin 0 -> 13933 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0279.png | Bin 0 -> 13976 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0280.png | Bin 0 -> 13934 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0281.png | Bin 0 -> 13902 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0282.png | Bin 0 -> 13890 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0283.png | Bin 0 -> 13836 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0284.png | Bin 0 -> 13912 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0285.png | Bin 0 -> 13953 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0286.png | Bin 0 -> 14038 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0287.png | Bin 0 -> 13974 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0288.png | Bin 0 -> 13914 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0289.png | Bin 0 -> 13875 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0290.png | Bin 0 -> 13850 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0291.png | Bin 0 -> 13785 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0292.png | Bin 0 -> 13896 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0293.png | Bin 0 -> 13919 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0294.png | Bin 0 -> 14022 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0295.png | Bin 0 -> 14053 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0296.png | Bin 0 -> 14130 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0297.png | Bin 0 -> 14162 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0298.png | Bin 0 -> 14175 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0299.png | Bin 0 -> 14284 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0300.png | Bin 0 -> 14290 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0301.png | Bin 0 -> 14323 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0302.png | Bin 0 -> 14167 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0303.png | Bin 0 -> 14137 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0304.png | Bin 0 -> 14346 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0305.png | Bin 0 -> 14337 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0306.png | Bin 0 -> 14429 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0307.png | Bin 0 -> 14396 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0308.png | Bin 0 -> 14308 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0309.png | Bin 0 -> 14368 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0310.png | Bin 0 -> 14314 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0311.png | Bin 0 -> 14389 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0312.png | Bin 0 -> 14364 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0313.png | Bin 0 -> 14384 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0314.png | Bin 0 -> 14440 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0315.png | Bin 0 -> 14435 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0316.png | Bin 0 -> 14598 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0317.png | Bin 0 -> 14695 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0318.png | Bin 0 -> 14699 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0319.png | Bin 0 -> 14687 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0320.png | Bin 0 -> 14775 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0321.png | Bin 0 -> 14784 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0322.png | Bin 0 -> 14663 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0323.png | Bin 0 -> 14641 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0324.png | Bin 0 -> 14795 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0325.png | Bin 0 -> 14708 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0326.png | Bin 0 -> 14837 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0327.png | Bin 0 -> 14667 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0328.png | Bin 0 -> 14633 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0329.png | Bin 0 -> 14589 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0330.png | Bin 0 -> 14501 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0331.png | Bin 0 -> 14523 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0332.png | Bin 0 -> 14572 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0333.png | Bin 0 -> 14455 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0334.png | Bin 0 -> 14510 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0335.png | Bin 0 -> 14398 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0336.png | Bin 0 -> 14491 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0337.png | Bin 0 -> 14528 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0338.png | Bin 0 -> 14549 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0339.png | Bin 0 -> 14448 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0340.png | Bin 0 -> 14407 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0341.png | Bin 0 -> 14419 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0342.png | Bin 0 -> 14241 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0343.png | Bin 0 -> 14166 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0344.png | Bin 0 -> 14324 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0345.png | Bin 0 -> 14284 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0346.png | Bin 0 -> 14410 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0347.png | Bin 0 -> 14358 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0348.png | Bin 0 -> 14347 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0349.png | Bin 0 -> 14269 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0350.png | Bin 0 -> 14259 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0351.png | Bin 0 -> 14140 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0352.png | Bin 0 -> 14206 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0353.png | Bin 0 -> 14068 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0354.png | Bin 0 -> 14019 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0355.png | Bin 0 -> 13944 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0356.png | Bin 0 -> 13951 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0357.png | Bin 0 -> 13881 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0358.png | Bin 0 -> 13846 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0359.png | Bin 0 -> 13493 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0360.png | Bin 0 -> 13331 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0361.png | Bin 0 -> 13234 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0362.png | Bin 0 -> 13377 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0363.png | Bin 0 -> 13486 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0364.png | Bin 0 -> 13694 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0365.png | Bin 0 -> 13847 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0366.png | Bin 0 -> 13978 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0367.png | Bin 0 -> 14086 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0368.png | Bin 0 -> 14086 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0369.png | Bin 0 -> 14207 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0370.png | Bin 0 -> 14168 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0371.png | Bin 0 -> 14329 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0372.png | Bin 0 -> 14417 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0373.png | Bin 0 -> 14475 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0374.png | Bin 0 -> 14460 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0375.png | Bin 0 -> 14449 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0376.png | Bin 0 -> 14642 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0377.png | Bin 0 -> 14587 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0378.png | Bin 0 -> 14607 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0379.png | Bin 0 -> 14633 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0380.png | Bin 0 -> 14582 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0381.png | Bin 0 -> 14620 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0382.png | Bin 0 -> 14511 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0383.png | Bin 0 -> 14388 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0384.png | Bin 0 -> 14599 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0385.png | Bin 0 -> 14432 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0386.png | Bin 0 -> 14414 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0387.png | Bin 0 -> 14454 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0388.png | Bin 0 -> 14424 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0389.png | Bin 0 -> 14393 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0390.png | Bin 0 -> 14361 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0391.png | Bin 0 -> 14352 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0392.png | Bin 0 -> 14346 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0393.png | Bin 0 -> 14376 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0394.png | Bin 0 -> 14528 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0395.png | Bin 0 -> 14543 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0396.png | Bin 0 -> 14759 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0397.png | Bin 0 -> 14807 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0398.png | Bin 0 -> 14807 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0399.png | Bin 0 -> 14687 bytes
.../02_wave/gaussian_Nx200_sf2/frame_0400.png | Bin 0 -> 14838 bytes
...01af3f04047239501937ae936b7ae5_archive.npz | Bin 0 -> 660399 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0000.png | Bin 0 -> 20272 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0001.png | Bin 0 -> 20359 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0002.png | Bin 0 -> 20239 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0003.png | Bin 0 -> 20251 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0004.png | Bin 0 -> 20260 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0005.png | Bin 0 -> 20215 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0006.png | Bin 0 -> 20181 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0007.png | Bin 0 -> 20179 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0008.png | Bin 0 -> 19959 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0009.png | Bin 0 -> 19985 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0010.png | Bin 0 -> 19894 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0011.png | Bin 0 -> 19798 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0012.png | Bin 0 -> 19920 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0013.png | Bin 0 -> 19978 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0014.png | Bin 0 -> 19926 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0015.png | Bin 0 -> 20001 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0016.png | Bin 0 -> 20269 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0017.png | Bin 0 -> 20321 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0018.png | Bin 0 -> 20368 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0019.png | Bin 0 -> 20417 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0020.png | Bin 0 -> 20237 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0021.png | Bin 0 -> 20332 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0022.png | Bin 0 -> 20469 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0023.png | Bin 0 -> 20528 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0024.png | Bin 0 -> 20682 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0025.png | Bin 0 -> 20628 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0026.png | Bin 0 -> 20777 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0027.png | Bin 0 -> 20818 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0028.png | Bin 0 -> 20781 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0029.png | Bin 0 -> 20825 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0030.png | Bin 0 -> 20837 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0031.png | Bin 0 -> 20862 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0032.png | Bin 0 -> 20949 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0033.png | Bin 0 -> 20934 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0034.png | Bin 0 -> 20819 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0035.png | Bin 0 -> 20833 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0036.png | Bin 0 -> 20915 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0037.png | Bin 0 -> 20954 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0038.png | Bin 0 -> 20892 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0039.png | Bin 0 -> 20980 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0040.png | Bin 0 -> 21002 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0041.png | Bin 0 -> 20966 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0042.png | Bin 0 -> 20912 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0043.png | Bin 0 -> 20947 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0044.png | Bin 0 -> 20981 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0045.png | Bin 0 -> 21017 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0046.png | Bin 0 -> 21029 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0047.png | Bin 0 -> 21043 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0048.png | Bin 0 -> 20934 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0049.png | Bin 0 -> 20990 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0050.png | Bin 0 -> 20930 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0051.png | Bin 0 -> 21034 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0052.png | Bin 0 -> 21060 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0053.png | Bin 0 -> 21104 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0054.png | Bin 0 -> 20939 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0055.png | Bin 0 -> 20948 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0056.png | Bin 0 -> 21113 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0057.png | Bin 0 -> 21117 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0058.png | Bin 0 -> 21050 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0059.png | Bin 0 -> 21052 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0060.png | Bin 0 -> 20991 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0061.png | Bin 0 -> 20966 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0062.png | Bin 0 -> 20928 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0063.png | Bin 0 -> 20903 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0064.png | Bin 0 -> 21005 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0065.png | Bin 0 -> 21000 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0066.png | Bin 0 -> 20989 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0067.png | Bin 0 -> 21007 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0068.png | Bin 0 -> 20990 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0069.png | Bin 0 -> 20975 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0070.png | Bin 0 -> 21050 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0071.png | Bin 0 -> 21038 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0072.png | Bin 0 -> 21118 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0073.png | Bin 0 -> 21041 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0074.png | Bin 0 -> 20990 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0075.png | Bin 0 -> 20891 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0076.png | Bin 0 -> 21130 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0077.png | Bin 0 -> 21104 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0078.png | Bin 0 -> 21113 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0079.png | Bin 0 -> 21073 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0080.png | Bin 0 -> 20972 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0081.png | Bin 0 -> 20977 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0082.png | Bin 0 -> 20930 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0083.png | Bin 0 -> 20891 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0084.png | Bin 0 -> 20965 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0085.png | Bin 0 -> 20961 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0086.png | Bin 0 -> 20955 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0087.png | Bin 0 -> 21006 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0088.png | Bin 0 -> 20893 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0089.png | Bin 0 -> 20917 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0090.png | Bin 0 -> 20995 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0091.png | Bin 0 -> 20963 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0092.png | Bin 0 -> 21075 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0093.png | Bin 0 -> 21090 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0094.png | Bin 0 -> 20945 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0095.png | Bin 0 -> 20971 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0096.png | Bin 0 -> 21122 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0097.png | Bin 0 -> 21146 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0098.png | Bin 0 -> 21047 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0099.png | Bin 0 -> 21109 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0100.png | Bin 0 -> 20947 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0101.png | Bin 0 -> 21045 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0102.png | Bin 0 -> 20956 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0103.png | Bin 0 -> 20994 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0104.png | Bin 0 -> 21022 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0105.png | Bin 0 -> 21032 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0106.png | Bin 0 -> 21041 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0107.png | Bin 0 -> 21045 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0108.png | Bin 0 -> 20957 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0109.png | Bin 0 -> 20908 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0110.png | Bin 0 -> 21020 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0111.png | Bin 0 -> 20953 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0112.png | Bin 0 -> 21084 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0113.png | Bin 0 -> 20992 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0114.png | Bin 0 -> 20915 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0115.png | Bin 0 -> 20882 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0116.png | Bin 0 -> 21043 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0117.png | Bin 0 -> 20957 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0118.png | Bin 0 -> 20972 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0119.png | Bin 0 -> 20951 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0120.png | Bin 0 -> 20813 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0121.png | Bin 0 -> 20817 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0122.png | Bin 0 -> 20893 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0123.png | Bin 0 -> 20901 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0124.png | Bin 0 -> 20993 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0125.png | Bin 0 -> 20927 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0126.png | Bin 0 -> 21004 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0127.png | Bin 0 -> 20933 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0128.png | Bin 0 -> 20883 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0129.png | Bin 0 -> 20889 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0130.png | Bin 0 -> 21033 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0131.png | Bin 0 -> 21042 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0132.png | Bin 0 -> 21106 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0133.png | Bin 0 -> 21084 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0134.png | Bin 0 -> 21064 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0135.png | Bin 0 -> 21204 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0136.png | Bin 0 -> 21219 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0137.png | Bin 0 -> 21259 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0138.png | Bin 0 -> 21346 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0139.png | Bin 0 -> 21338 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0140.png | Bin 0 -> 21163 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0141.png | Bin 0 -> 21083 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0142.png | Bin 0 -> 21078 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0143.png | Bin 0 -> 21072 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0144.png | Bin 0 -> 21245 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0145.png | Bin 0 -> 21268 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0146.png | Bin 0 -> 21226 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0147.png | Bin 0 -> 21318 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0148.png | Bin 0 -> 21284 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0149.png | Bin 0 -> 21221 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0150.png | Bin 0 -> 21358 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0151.png | Bin 0 -> 21298 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0152.png | Bin 0 -> 21458 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0153.png | Bin 0 -> 21379 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0154.png | Bin 0 -> 21169 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0155.png | Bin 0 -> 21241 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0156.png | Bin 0 -> 21500 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0157.png | Bin 0 -> 21612 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0158.png | Bin 0 -> 21707 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0159.png | Bin 0 -> 21702 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0160.png | Bin 0 -> 21774 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0161.png | Bin 0 -> 21849 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0162.png | Bin 0 -> 21942 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0163.png | Bin 0 -> 22019 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0164.png | Bin 0 -> 22207 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0165.png | Bin 0 -> 22241 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0166.png | Bin 0 -> 22349 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0167.png | Bin 0 -> 22360 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0168.png | Bin 0 -> 22270 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0169.png | Bin 0 -> 22414 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0170.png | Bin 0 -> 22409 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0171.png | Bin 0 -> 22419 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0172.png | Bin 0 -> 22541 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0173.png | Bin 0 -> 22559 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0174.png | Bin 0 -> 22517 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0175.png | Bin 0 -> 22384 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0176.png | Bin 0 -> 22621 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0177.png | Bin 0 -> 22599 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0178.png | Bin 0 -> 22632 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0179.png | Bin 0 -> 22594 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0180.png | Bin 0 -> 22367 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0181.png | Bin 0 -> 22454 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0182.png | Bin 0 -> 22511 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0183.png | Bin 0 -> 22454 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0184.png | Bin 0 -> 22555 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0185.png | Bin 0 -> 22635 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0186.png | Bin 0 -> 22651 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0187.png | Bin 0 -> 22528 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0188.png | Bin 0 -> 22518 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0189.png | Bin 0 -> 22430 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0190.png | Bin 0 -> 22689 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0191.png | Bin 0 -> 22493 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0192.png | Bin 0 -> 22663 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0193.png | Bin 0 -> 22610 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0194.png | Bin 0 -> 22556 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0195.png | Bin 0 -> 22510 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0196.png | Bin 0 -> 22587 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0197.png | Bin 0 -> 22599 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0198.png | Bin 0 -> 22694 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0199.png | Bin 0 -> 22668 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0200.png | Bin 0 -> 22444 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0201.png | Bin 0 -> 22340 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0202.png | Bin 0 -> 22275 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0203.png | Bin 0 -> 22200 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0204.png | Bin 0 -> 22361 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0205.png | Bin 0 -> 22359 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0206.png | Bin 0 -> 22486 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0207.png | Bin 0 -> 22432 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0208.png | Bin 0 -> 22390 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0209.png | Bin 0 -> 22389 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0210.png | Bin 0 -> 22311 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0211.png | Bin 0 -> 22413 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0212.png | Bin 0 -> 22411 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0213.png | Bin 0 -> 22335 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0214.png | Bin 0 -> 22152 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0215.png | Bin 0 -> 22190 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0216.png | Bin 0 -> 22118 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0217.png | Bin 0 -> 22097 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0218.png | Bin 0 -> 21955 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0219.png | Bin 0 -> 21843 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0220.png | Bin 0 -> 21606 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0221.png | Bin 0 -> 21508 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0222.png | Bin 0 -> 21267 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0223.png | Bin 0 -> 21298 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0224.png | Bin 0 -> 21397 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0225.png | Bin 0 -> 21424 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0226.png | Bin 0 -> 21429 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0227.png | Bin 0 -> 21471 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0228.png | Bin 0 -> 21563 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0229.png | Bin 0 -> 21479 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0230.png | Bin 0 -> 21607 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0231.png | Bin 0 -> 21816 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0232.png | Bin 0 -> 22051 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0233.png | Bin 0 -> 22128 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0234.png | Bin 0 -> 22190 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0235.png | Bin 0 -> 22320 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0236.png | Bin 0 -> 22624 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0237.png | Bin 0 -> 22645 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0238.png | Bin 0 -> 22665 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0239.png | Bin 0 -> 22670 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0240.png | Bin 0 -> 22802 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0241.png | Bin 0 -> 22779 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0242.png | Bin 0 -> 22627 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0243.png | Bin 0 -> 22664 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0244.png | Bin 0 -> 22744 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0245.png | Bin 0 -> 22688 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0246.png | Bin 0 -> 22718 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0247.png | Bin 0 -> 22712 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0248.png | Bin 0 -> 22601 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0249.png | Bin 0 -> 22393 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0250.png | Bin 0 -> 22304 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0251.png | Bin 0 -> 22254 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0252.png | Bin 0 -> 22329 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0253.png | Bin 0 -> 22458 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0254.png | Bin 0 -> 22453 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0255.png | Bin 0 -> 22551 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0256.png | Bin 0 -> 22758 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0257.png | Bin 0 -> 22942 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0258.png | Bin 0 -> 22932 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0259.png | Bin 0 -> 22993 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0260.png | Bin 0 -> 22910 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0261.png | Bin 0 -> 23036 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0262.png | Bin 0 -> 22855 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0263.png | Bin 0 -> 22827 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0264.png | Bin 0 -> 22913 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0265.png | Bin 0 -> 22916 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0266.png | Bin 0 -> 22780 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0267.png | Bin 0 -> 22802 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0268.png | Bin 0 -> 22747 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0269.png | Bin 0 -> 22657 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0270.png | Bin 0 -> 22707 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0271.png | Bin 0 -> 22625 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0272.png | Bin 0 -> 22615 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0273.png | Bin 0 -> 22847 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0274.png | Bin 0 -> 22820 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0275.png | Bin 0 -> 22798 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0276.png | Bin 0 -> 22948 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0277.png | Bin 0 -> 23113 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0278.png | Bin 0 -> 23175 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0279.png | Bin 0 -> 23313 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0280.png | Bin 0 -> 23175 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0281.png | Bin 0 -> 23275 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0282.png | Bin 0 -> 23074 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0283.png | Bin 0 -> 23077 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0284.png | Bin 0 -> 23282 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0285.png | Bin 0 -> 23287 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0286.png | Bin 0 -> 23259 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0287.png | Bin 0 -> 23256 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0288.png | Bin 0 -> 23162 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0289.png | Bin 0 -> 23136 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0290.png | Bin 0 -> 23088 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0291.png | Bin 0 -> 23008 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0292.png | Bin 0 -> 23145 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0293.png | Bin 0 -> 23259 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0294.png | Bin 0 -> 23313 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0295.png | Bin 0 -> 23308 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0296.png | Bin 0 -> 23564 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0297.png | Bin 0 -> 23633 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0298.png | Bin 0 -> 23689 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0299.png | Bin 0 -> 23805 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0300.png | Bin 0 -> 23722 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0301.png | Bin 0 -> 23845 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0302.png | Bin 0 -> 23584 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0303.png | Bin 0 -> 23713 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0304.png | Bin 0 -> 23921 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0305.png | Bin 0 -> 24013 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0306.png | Bin 0 -> 23929 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0307.png | Bin 0 -> 23899 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0308.png | Bin 0 -> 23981 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0309.png | Bin 0 -> 23989 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0310.png | Bin 0 -> 24045 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0311.png | Bin 0 -> 23985 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0312.png | Bin 0 -> 24072 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0313.png | Bin 0 -> 24142 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0314.png | Bin 0 -> 24113 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0315.png | Bin 0 -> 24119 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0316.png | Bin 0 -> 24236 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0317.png | Bin 0 -> 24318 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0318.png | Bin 0 -> 24421 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0319.png | Bin 0 -> 24504 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0320.png | Bin 0 -> 24526 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0321.png | Bin 0 -> 24584 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0322.png | Bin 0 -> 24524 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0323.png | Bin 0 -> 24511 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0324.png | Bin 0 -> 24652 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0325.png | Bin 0 -> 24546 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0326.png | Bin 0 -> 24541 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0327.png | Bin 0 -> 24399 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0328.png | Bin 0 -> 24434 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0329.png | Bin 0 -> 24254 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0330.png | Bin 0 -> 24268 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0331.png | Bin 0 -> 24131 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0332.png | Bin 0 -> 24233 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0333.png | Bin 0 -> 24213 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0334.png | Bin 0 -> 24163 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0335.png | Bin 0 -> 24231 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0336.png | Bin 0 -> 24215 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0337.png | Bin 0 -> 24366 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0338.png | Bin 0 -> 24350 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0339.png | Bin 0 -> 24208 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0340.png | Bin 0 -> 23981 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0341.png | Bin 0 -> 24021 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0342.png | Bin 0 -> 23840 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0343.png | Bin 0 -> 23806 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0344.png | Bin 0 -> 23978 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0345.png | Bin 0 -> 23940 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0346.png | Bin 0 -> 24017 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0347.png | Bin 0 -> 23997 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0348.png | Bin 0 -> 23943 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0349.png | Bin 0 -> 23810 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0350.png | Bin 0 -> 23825 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0351.png | Bin 0 -> 23696 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0352.png | Bin 0 -> 23702 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0353.png | Bin 0 -> 23561 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0354.png | Bin 0 -> 23220 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0355.png | Bin 0 -> 23316 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0356.png | Bin 0 -> 23255 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0357.png | Bin 0 -> 23035 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0358.png | Bin 0 -> 22762 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0359.png | Bin 0 -> 22491 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0360.png | Bin 0 -> 22121 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0361.png | Bin 0 -> 21826 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0362.png | Bin 0 -> 22124 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0363.png | Bin 0 -> 22414 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0364.png | Bin 0 -> 22753 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0365.png | Bin 0 -> 23081 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0366.png | Bin 0 -> 23381 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0367.png | Bin 0 -> 23426 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0368.png | Bin 0 -> 23574 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0369.png | Bin 0 -> 23712 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0370.png | Bin 0 -> 23856 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0371.png | Bin 0 -> 24089 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0372.png | Bin 0 -> 24213 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0373.png | Bin 0 -> 24233 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0374.png | Bin 0 -> 24293 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0375.png | Bin 0 -> 24366 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0376.png | Bin 0 -> 24503 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0377.png | Bin 0 -> 24526 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0378.png | Bin 0 -> 24587 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0379.png | Bin 0 -> 24616 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0380.png | Bin 0 -> 24502 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0381.png | Bin 0 -> 24603 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0382.png | Bin 0 -> 24362 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0383.png | Bin 0 -> 24310 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0384.png | Bin 0 -> 24362 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0385.png | Bin 0 -> 24316 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0386.png | Bin 0 -> 24253 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0387.png | Bin 0 -> 24126 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0388.png | Bin 0 -> 24057 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0389.png | Bin 0 -> 23984 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0390.png | Bin 0 -> 24127 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0391.png | Bin 0 -> 24161 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0392.png | Bin 0 -> 24009 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0393.png | Bin 0 -> 24282 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0394.png | Bin 0 -> 24365 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0395.png | Bin 0 -> 24538 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0396.png | Bin 0 -> 24651 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0397.png | Bin 0 -> 24795 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0398.png | Bin 0 -> 24809 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0399.png | Bin 0 -> 25034 bytes
.../wave1D/gaussian_Nx200_sf2/frame_0400.png | Bin 0 -> 24921 bytes
.../02_wave/src-wave/wave1D/wave1D_dn_vc.py | 1438 ++++++++---------
fdm-devito-notebooks/02_wave/wave1D_fd2.ipynb | 243 ++-
806 files changed, 880 insertions(+), 801 deletions(-)
create mode 100644 fdm-devito-notebooks/02_wave/.f41e97ebc401af3f04047239501937ae936b7ae5_archive.npz
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0000.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0001.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0002.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0003.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0004.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0005.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0006.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0007.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0008.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0009.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0010.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0011.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0012.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0013.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0014.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0015.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0016.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0017.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0018.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0019.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0020.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0021.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0022.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0023.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0024.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0025.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0026.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0027.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0028.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0029.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0030.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0031.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0032.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0033.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0034.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0035.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0036.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0037.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0038.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0039.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0040.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0041.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0042.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0043.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0044.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0045.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0046.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0047.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0048.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0049.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0050.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0051.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0052.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0053.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0054.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0055.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0056.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0057.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0058.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0059.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0060.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0061.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0062.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0063.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0064.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0065.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0066.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0067.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0068.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0069.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0070.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0071.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0072.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0073.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0074.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0075.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0076.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0077.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0078.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0079.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0080.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0081.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0082.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0083.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0084.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0085.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0086.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0087.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0088.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0089.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0090.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0091.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0092.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0093.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0094.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0095.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0096.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0097.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0098.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0099.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0100.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0101.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0102.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0103.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0104.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0105.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0106.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0107.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0108.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0109.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0110.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0111.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0112.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0113.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0114.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0115.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0116.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0117.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0118.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0119.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0120.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0121.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0122.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0123.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0124.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0125.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0126.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0127.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0128.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0129.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0130.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0131.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0132.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0133.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0134.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0135.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0136.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0137.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0138.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0139.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0140.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0141.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0142.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0143.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0144.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0145.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0146.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0147.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0148.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0149.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0150.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0151.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0152.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0153.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0154.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0155.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0156.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0157.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0158.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0159.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0160.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0161.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0162.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0163.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0164.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0165.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0166.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0167.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0168.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0169.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0170.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0171.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0172.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0173.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0174.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0175.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0176.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0177.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0178.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0179.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0180.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0181.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0182.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0183.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0184.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0185.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0186.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0187.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0188.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0189.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0190.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0191.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0192.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0193.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0194.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0195.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0196.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0197.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0198.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0199.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0200.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0201.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0202.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0203.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0204.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0205.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0206.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0207.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0208.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0209.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0210.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0211.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0212.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0213.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0214.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0215.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0216.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0217.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0218.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0219.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0220.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0221.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0222.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0223.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0224.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0225.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0226.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0227.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0228.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0229.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0230.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0231.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0232.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0233.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0234.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0235.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0236.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0237.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0238.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0239.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0240.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0241.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0242.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0243.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0244.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0245.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0246.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0247.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0248.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0249.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0250.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0251.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0252.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0253.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0254.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0255.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0256.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0257.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0258.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0259.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0260.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0261.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0262.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0263.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0264.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0265.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0266.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0267.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0268.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0269.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0270.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0271.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0272.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0273.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0274.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0275.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0276.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0277.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0278.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0279.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0280.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0281.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0282.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0283.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0284.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0285.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0286.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0287.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0288.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0289.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0290.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0291.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0292.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0293.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0294.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0295.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0296.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0297.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0298.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0299.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0300.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0301.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0302.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0303.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0304.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0305.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0306.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0307.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0308.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0309.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0310.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0311.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0312.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0313.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0314.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0315.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0316.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0317.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0318.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0319.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0320.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0321.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0322.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0323.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0324.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0325.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0326.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0327.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0328.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0329.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0330.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0331.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0332.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0333.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0334.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0335.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0336.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0337.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0338.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0339.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0340.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0341.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0342.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0343.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0344.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0345.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0346.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0347.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0348.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0349.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0350.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0351.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0352.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0353.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0354.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0355.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0356.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0357.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0358.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0359.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0360.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0361.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0362.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0363.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0364.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0365.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0366.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0367.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0368.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0369.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0370.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0371.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0372.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0373.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0374.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0375.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0376.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0377.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0378.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0379.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0380.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0381.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0382.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0383.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0384.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0385.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0386.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0387.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0388.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0389.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0390.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0391.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0392.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0393.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0394.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0395.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0396.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0397.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0398.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0399.png
create mode 100644 fdm-devito-notebooks/02_wave/gaussian_Nx200_sf2/frame_0400.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/.f41e97ebc401af3f04047239501937ae936b7ae5_archive.npz
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0000.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0001.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0002.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0003.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0004.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0005.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0006.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0007.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0008.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0009.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0010.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0011.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0012.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0013.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0014.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0015.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0016.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0017.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0018.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0019.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0020.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0021.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0022.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0023.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0024.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0025.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0026.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0027.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0028.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0029.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0030.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0031.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0032.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0033.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0034.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0035.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0036.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0037.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0038.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0039.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0040.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0041.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0042.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0043.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0044.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0045.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0046.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0047.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0048.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0049.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0050.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0051.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0052.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0053.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0054.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0055.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0056.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0057.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0058.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0059.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0060.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0061.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0062.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0063.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0064.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0065.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0066.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0067.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0068.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0069.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0070.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0071.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0072.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0073.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0074.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0075.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0076.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0077.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0078.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0079.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0080.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0081.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0082.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0083.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0084.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0085.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0086.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0087.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0088.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0089.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0090.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0091.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0092.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0093.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0094.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0095.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0096.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0097.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0098.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0099.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0100.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0101.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0102.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0103.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0104.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0105.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0106.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0107.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0108.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0109.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0110.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0111.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0112.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0113.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0114.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0115.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0116.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0117.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0118.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0119.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0120.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0121.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0122.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0123.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0124.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0125.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0126.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0127.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0128.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0129.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0130.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0131.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0132.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0133.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0134.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0135.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0136.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0137.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0138.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0139.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0140.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0141.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0142.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0143.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0144.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0145.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0146.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0147.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0148.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0149.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0150.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0151.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0152.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0153.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0154.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0155.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0156.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0157.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0158.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0159.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0160.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0161.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0162.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0163.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0164.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0165.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0166.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0167.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0168.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0169.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0170.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0171.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0172.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0173.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0174.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0175.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0176.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0177.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0178.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0179.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0180.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0181.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0182.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0183.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0184.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0185.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0186.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0187.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0188.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0189.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0190.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0191.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0192.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0193.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0194.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0195.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0196.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0197.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0198.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0199.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0200.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0201.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0202.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0203.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0204.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0205.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0206.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0207.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0208.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0209.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0210.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0211.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0212.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0213.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0214.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0215.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0216.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0217.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0218.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0219.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0220.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0221.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0222.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0223.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0224.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0225.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0226.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0227.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0228.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0229.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0230.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0231.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0232.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0233.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0234.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0235.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0236.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0237.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0238.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0239.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0240.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0241.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0242.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0243.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0244.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0245.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0246.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0247.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0248.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0249.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0250.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0251.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0252.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0253.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0254.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0255.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0256.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0257.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0258.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0259.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0260.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0261.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0262.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0263.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0264.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0265.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0266.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0267.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0268.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0269.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0270.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0271.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0272.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0273.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0274.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0275.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0276.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0277.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0278.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0279.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0280.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0281.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0282.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0283.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0284.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0285.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0286.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0287.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0288.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0289.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0290.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0291.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0292.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0293.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0294.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0295.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0296.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0297.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0298.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0299.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0300.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0301.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0302.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0303.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0304.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0305.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0306.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0307.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0308.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0309.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0310.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0311.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0312.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0313.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0314.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0315.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0316.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0317.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0318.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0319.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0320.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0321.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0322.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0323.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0324.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0325.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0326.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0327.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0328.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0329.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0330.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0331.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0332.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0333.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0334.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0335.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0336.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0337.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0338.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0339.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0340.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0341.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0342.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0343.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0344.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0345.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0346.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0347.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0348.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0349.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0350.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0351.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0352.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0353.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0354.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0355.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0356.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0357.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0358.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0359.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0360.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0361.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0362.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0363.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0364.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0365.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0366.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0367.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0368.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0369.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0370.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0371.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0372.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0373.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0374.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0375.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0376.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0377.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0378.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0379.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0380.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0381.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0382.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0383.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0384.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0385.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0386.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0387.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0388.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0389.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0390.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0391.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0392.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0393.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0394.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0395.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0396.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0397.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0398.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0399.png
create mode 100644 fdm-devito-notebooks/02_wave/src-wave/wave1D/gaussian_Nx200_sf2/frame_0400.png
diff --git a/fdm-devito-notebooks/02_wave/.f41e97ebc401af3f04047239501937ae936b7ae5_archive.npz b/fdm-devito-notebooks/02_wave/.f41e97ebc401af3f04047239501937ae936b7ae5_archive.npz
new file mode 100644
index 0000000000000000000000000000000000000000..a9a7d8a14e2dec38522ebea17aec2f310a56165d
GIT binary patch
literal 660399
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