{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 08 - Snapshotting with Devito using the `ConditionalDimension`\n", "\n", "This notebook intends to introduce new Devito users (especially with a C or FORTRAN background) to the best practice on saving snapshots to disk, as a binary float file. \n", "\n", "We start by presenting a naive approach, and then introduce a more efficient method, which exploits Devito's `ConditionalDimension`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Initialize utilities" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "#NBVAL_IGNORE_OUTPUT\n", "%reset -f\n", "import numpy as np\n", "import matplotlib.pyplot as plt \n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Problem Setup \n", "This tutorial is based on an example that has appeared in a [TLE tutorial](https://github.com/devitocodes/devito/blob/master/examples/seismic/tutorials/01_modelling.ipynb)(Louboutin et. al., 2017), in which one shot is modeled over a 2-layer velocity model." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Operator `initdamp` run in 0.01 s\n", "Operator `padfunc` run in 0.01 s\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "Operator `Kernel` run in 0.03 s\n" ] }, { "data": { "text/plain": [ "PerformanceSummary([(PerfKey(name='section0', rank=None),\n", " PerfEntry(time=0.02613699999999999, gflopss=0.0, gpointss=0.0, oi=0.0, ops=0, itershapes=[])),\n", " (PerfKey(name='section1', rank=None),\n", " PerfEntry(time=0.0007910000000000022, gflopss=0.0, gpointss=0.0, oi=0.0, ops=0, itershapes=[])),\n", " (PerfKey(name='section2', rank=None),\n", " PerfEntry(time=0.0010599999999999995, gflopss=0.0, gpointss=0.0, oi=0.0, ops=0, itershapes=[]))])" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# This cell sets up the problem that is already explained in the first TLE tutorial.\n", "\n", "#NBVAL_IGNORE_OUTPUT\n", "#%%flake8\n", "from examples.seismic import Receiver\n", "from examples.seismic import RickerSource\n", "from examples.seismic import Model, plot_velocity, TimeAxis\n", "from devito import TimeFunction\n", "from devito import Eq, solve\n", "from devito import Operator\n", "\n", "\n", "# Set velocity model\n", "nx = 201\n", "nz = 201\n", "nb = 10\n", "shape = (nx, nz)\n", "spacing = (20., 20.)\n", "origin = (0., 0.)\n", "v = np.empty(shape, dtype=np.float32)\n", "v[:, :int(nx/2)] = 2.0\n", "v[:, int(nx/2):] = 2.5\n", "\n", "model = Model(vp=v, origin=origin, shape=shape, spacing=spacing,\n", " space_order=2, nbl=10, bcs=\"damp\")\n", "\n", "# Set time range, source, source coordinates and receiver coordinates\n", "t0 = 0. # Simulation starts a t=0\n", "tn = 1000. # Simulation lasts tn milliseconds\n", "dt = model.critical_dt # Time step from model grid spacing\n", "time_range = TimeAxis(start=t0, stop=tn, step=dt)\n", "nt = time_range.num # number of time steps\n", "\n", "f0 = 0.010 # Source peak frequency is 10Hz (0.010 kHz)\n", "src = RickerSource(\n", " name='src',\n", " grid=model.grid,\n", " f0=f0,\n", " time_range=time_range) \n", "\n", "src.coordinates.data[0, :] = np.array(model.domain_size) * .5\n", "src.coordinates.data[0, -1] = 20. # Depth is 20m\n", "\n", "rec = Receiver(\n", " name='rec',\n", " grid=model.grid,\n", " npoint=101,\n", " time_range=time_range) # new\n", "rec.coordinates.data[:, 0] = np.linspace(0, model.domain_size[0], num=101)\n", "rec.coordinates.data[:, 1] = 20. # Depth is 20m\n", "depth = rec.coordinates.data[:, 1] # Depth is 20m\n", "\n", "\n", "plot_velocity(model, source=src.coordinates.data,\n", " receiver=rec.coordinates.data[::4, :])\n", "\n", "#Used for reshaping\n", "vnx = nx+20 \n", "vnz = nz+20\n", "\n", "# Set symbolics for the wavefield object `u`, setting save on all time steps \n", "# (which can occupy a lot of memory), to later collect snapshots (naive method):\n", "\n", "u = TimeFunction(name=\"u\", grid=model.grid, time_order=2,\n", " space_order=2, save=time_range.num)\n", "\n", "# Set symbolics of the operator, source and receivers:\n", "pde = model.m * u.dt2 - u.laplace + model.damp * u.dt\n", "stencil = Eq(u.forward, solve(pde, u.forward))\n", "src_term = src.inject(field=u.forward, expr=src * dt**2 / model.m)\n", "rec_term = rec.interpolate(expr=u)\n", "op = Operator([stencil] + src_term + rec_term, subs=model.spacing_map)\n", "\n", "# Run the operator for `(nt-2)` time steps:\n", "op(time=nt-2, dt=model.critical_dt)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Saving snaps to disk - naive approach\n", "\n", "We want to get equally spaced snaps from the `nt-2` saved in `u.data`. The user can then define the total number of snaps `nsnaps`, which determines a `factor` to divide `nt`." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "nsnaps = 100\n", "factor = round(u.shape[0] / nsnaps) # Get approx nsnaps, for any nt\n", "ucopy = u.data.copy(order='C')\n", "filename = \"naivsnaps.bin\"\n", "file_u = open(filename, 'wb')\n", "for it in range(0, nsnaps):\n", " file_u.write(ucopy[it*factor, :, :])\n", "file_u.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Checking `u.data` spaced by `factor` using matplotlib," ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "#NBVAL_IGNORE_OUTPUT\n", "plt.rcParams['figure.figsize'] = (20, 20) # Increases figure size\n", "\n", "imcnt = 1 # Image counter for plotting\n", "plot_num = 5 # Number of images to plot\n", "\n", "for i in range(0, nsnaps, int(nsnaps/plot_num)):\n", " plt.subplot(1, plot_num+1, imcnt+1)\n", " imcnt = imcnt + 1\n", " plt.imshow(np.transpose(u.data[i * factor, :, :]), vmin=-1, vmax=1, cmap=\"seismic\")\n", "\n", "plt.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Or from the saved file:\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "#NBVAL_IGNORE_OUTPUT\n", "fobj = open(\"naivsnaps.bin\", \"rb\") \n", "snaps = np.fromfile(fobj, dtype = np.float32) \n", "snaps = np.reshape(snaps, (nsnaps, vnx, vnz)) #reshape vec2mtx, devito format. nx first\n", "fobj.close()\n", "\n", "plt.rcParams['figure.figsize'] = (20,20) # Increases figure size\n", "\n", "imcnt = 1 # Image counter for plotting\n", "plot_num = 5 # Number of images to plot\n", "\n", "for i in range(0, nsnaps, int(nsnaps/plot_num)):\n", " plt.subplot(1, plot_num+1, imcnt+1);\n", " imcnt = imcnt + 1\n", " plt.imshow(np.transpose(snaps[i,:,:]), vmin=-1, vmax=1, cmap=\"seismic\")\n", "\n", "plt.show() " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This C/FORTRAN way of saving snaps is clearly not optimal when using Devito; the wavefield object `u` is specified to save all snaps, and a memory copy is done at every `op` time step. Giving that we don't want all the snaps saved, this process is wasteful; only the selected snapshots should be copied during execution. \n", "\n", "\n", "To address these issues, a better way to save snaps using Devito's capabilities is presented in the following section." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Saving snaps to disk - Devito method\n", "\n", "A better way to save snapshots to disk is to create a new `TimeFunction`, `usave`, whose time size is equal to \n", "`nsnaps`. There are 3 main differences from the previous code, which are flagged by `#Part 1`, `#Part 2` and `#Part 3` . After running the code each part is explained with more detail." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "factor is 2\n", "t_sub\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Operator `Kernel` run in 0.02 s\n", "Operator `Kernel` run in 0.03 s\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saving snaps file\n", "Dimensions: nz = 221, nx = 221\n" ] } ], "source": [ "#NBVAL_IGNORE_OUTPUT\n", "from devito import ConditionalDimension\n", "\n", "nsnaps = 103 # desired number of equally spaced snaps\n", "factor = round(nt / nsnaps) # subsequent calculated factor\n", "\n", "print(f\"factor is {factor}\")\n", "\n", "#Part 1 #############\n", "time_subsampled = ConditionalDimension(\n", " 't_sub', parent=model.grid.time_dim, factor=factor)\n", "usave = TimeFunction(name='usave', grid=model.grid, time_order=2, space_order=2,\n", " save=nsnaps, time_dim=time_subsampled)\n", "print(time_subsampled)\n", "#####################\n", "\n", "u = TimeFunction(name=\"u\", grid=model.grid, time_order=2, space_order=2)\n", "pde = model.m * u.dt2 - u.laplace + model.damp * u.dt\n", "stencil = Eq(u.forward, solve(pde, u.forward))\n", "src_term = src.inject(\n", " field=u.forward,\n", " expr=src * dt**2 / model.m)\n", "rec_term = rec.interpolate(expr=u)\n", "\n", "#Part 2 #############\n", "op1 = Operator([stencil] + src_term + rec_term,\n", " subs=model.spacing_map) # usual operator\n", "op2 = Operator([stencil] + src_term + [Eq(usave, u)] + rec_term,\n", " subs=model.spacing_map) # operator with snapshots\n", "\n", "op1(time=nt - 2, dt=model.critical_dt) # run only for comparison\n", "u.data.fill(0.)\n", "op2(time=nt - 2, dt=model.critical_dt)\n", "#####################\n", "\n", "#Part 3 #############\n", "print(\"Saving snaps file\")\n", "print(\"Dimensions: nz = {:d}, nx = {:d}\".format(nz + 2 * nb, nx + 2 * nb))\n", "filename = \"snaps2.bin\"\n", "usave.data.tofile(filename)\n", "#####################" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As `usave.data` has the desired snaps, no extra variable copy is required. The snaps can then be visualized:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "#NBVAL_IGNORE_OUTPUT\n", "fobj = open(\"snaps2.bin\", \"rb\")\n", "snaps = np.fromfile(fobj, dtype=np.float32)\n", "snaps = np.reshape(snaps, (nsnaps, vnx, vnz))\n", "fobj.close()\n", "\n", "plt.rcParams['figure.figsize'] = (20, 20) # Increases figure size\n", "\n", "imcnt = 1 # Image counter for plotting\n", "plot_num = 5 # Number of images to plot\n", "for i in range(0, plot_num):\n", " plt.subplot(1, plot_num, i+1);\n", " imcnt = imcnt + 1\n", " ind = i * int(nsnaps/plot_num)\n", " plt.imshow(np.transpose(snaps[ind,:,:]), vmin=-1, vmax=1, cmap=\"seismic\")\n", "\n", "plt.show() " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## About Part 1\n", "\n", "Here a subsampled version (`time_subsampled`) of the full time Dimension (`model.grid.time_dim`) is created with the `ConditionalDimension`. `time_subsampled` is then used to define an additional symbolic wavefield `usave`, which will store in `usave.data` only the predefined number of snapshots (see Part 2).\n", "\n", "Further insight on how `ConditionalDimension` works and its most common uses can be found in [the Devito documentation](https://www.devitoproject.org/devito/dimension.html#devito.types.dimension.ConditionalDimension). The following excerpt exemplifies subsampling of simple functions:\n", "\n", " Among the other things, ConditionalDimensions are indicated to implement\n", " Function subsampling. In the following example, an Operator evaluates the\n", " Function ``g`` and saves its content into ``f`` every ``factor=4`` iterations.\n", " \n", " >>> from devito import Dimension, ConditionalDimension, Function, Eq, Operator\n", " >>> size, factor = 16, 4\n", " >>> i = Dimension(name='i')\n", " >>> ci = ConditionalDimension(name='ci', parent=i, factor=factor)\n", " >>> g = Function(name='g', shape=(size,), dimensions=(i,))\n", " >>> f = Function(name='f', shape=(int(size/factor),), dimensions=(ci,))\n", " >>> op = Operator([Eq(g, 1), Eq(f, g)])\n", " \n", " The Operator generates the following for-loop (pseudocode)\n", " .. code-block:: C\n", " for (int i = i_m; i <= i_M; i += 1) {\n", " g[i] = 1;\n", " if (i%4 == 0) {\n", " f[i / 4] = g[i];\n", " }\n", " }\n", "\n", "From this excerpt we can see that the C code generated by `Operator` with the extra argument `Eq(f,g)` mainly corresponds to adding an `if` block on the optimized C-code, which saves the desired snapshots on `f`, from `g`, at the correct times. Following the same line of thought, in the following section the symbolic and C-generated code are compared, with and without snapshots.\n", "\n", "# About Part 2\n", " \n", "We then define `Operator`s `op1` (no snaps) and `op2` (with snaps). The only difference between the two is that `op2` has an extra symbolic equation `Eq(usave, u)`. Notice that even though `usave` and `u` have different Dimensions, Devito's symbolic interpreter understands it, because `usave`'s `time_dim` was defined through the `ConditionalDimension`. \n", "\n", "Below, we show relevant excerpts of the compiled `Operators`. As explained above, the main difference between the optimized C-code of `op1` and `op2` is the addition of an `if` block. For `op1`'s C code:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```c\n", "// #define's\n", "//...\n", "\n", "// declare dataobj struct\n", "//...\n", "\n", "// declare profiler struct\n", "//...\n", "\n", "int Kernel(struct dataobj *restrict damp_vec, const float dt, struct dataobj *restrict m_vec, const float o_x, const float o_y, struct dataobj *restrict rec_vec, struct dataobj *restrict rec_coords_vec, struct dataobj *restrict src_vec, struct dataobj *restrict src_coords_vec, struct dataobj *restrict u_vec, const int x_M, const int x_m, const int y_M, const int y_m, const int p_rec_M, const int p_rec_m, const int p_src_M, const int p_src_m, const int time_M, const int time_m, struct profiler * timers)\n", "{\n", " // ...\n", " // ...\n", " \n", " float (*restrict u)[u_vec->size[1]][u_vec->size[2]] __attribute__ ((aligned (64))) = (float (*)[u_vec->size[1]][u_vec->size[2]]) u_vec->data;\n", " // ...\n", " \n", " for (int time = time_m, t0 = (time)%(3), t1 = (time + 1)%(3), t2 = (time + 2)%(3); time <= time_M; time += 1, t0 = (time)%(3), t1 = (time + 1)%(3), t2 = (time + 2)%(3))\n", " {\n", " struct timeval start_section0, end_section0;\n", " gettimeofday(&start_section0, NULL);\n", " for (int x = x_m; x <= x_M; x += 1)\n", " {\n", " #pragma omp simd\n", " for (int y = y_m; y <= y_M; y += 1)\n", " {\n", " float r0 = 1.0e+4F*dt*m[x + 2][y + 2] + 5.0e+3F*(dt*dt)*damp[x + 1][y + 1];\n", " u[t1][x + 2][y + 2] = 2.0e+4F*dt*m[x + 2][y + 2]*u[t0][x + 2][y + 2]/r0 - 1.0e+4F*dt*m[x + 2][y + 2]*u[t2][x + 2][y + 2]/r0 + 1.0e+2F*((dt*dt*dt)*u[t0][x + 1][y + 2]/r0 + (dt*dt*dt)*u[t0][x + 2][y + 1]/r0 + (dt*dt*dt)*u[t0][x + 2][y + 3]/r0 + (dt*dt*dt)*u[t0][x + 3][y + 2]/r0) + 5.0e+3F*(dt*dt)*damp[x + 1][y + 1]*u[t2][x + 2][y + 2]/r0 - 4.0e+2F*dt*dt*dt*u[t0][x + 2][y + 2]/r0;\n", " }\n", " }\n", " gettimeofday(&end_section0, NULL);\n", " timers->section0 += (double)(end_section0.tv_sec-start_section0.tv_sec)+(double)(end_section0.tv_usec-start_section0.tv_usec)/1000000;\n", " struct timeval start_section1, end_section1;\n", " gettimeofday(&start_section1, NULL);\n", " for (int p_src = p_src_m; p_src <= p_src_M; p_src += 1)\n", " {\n", " //source injection\n", " //...\n", " }\n", " gettimeofday(&end_section1, NULL);\n", " timers->section1 += (double)(end_section1.tv_sec-start_section1.tv_sec)+(double)(end_section1.tv_usec-start_section1.tv_usec)/1000000;\n", " struct timeval start_section2, end_section2;\n", " gettimeofday(&start_section2, NULL);\n", " for (int p_rec = p_rec_m; p_rec <= p_rec_M; p_rec += 1)\n", " {\n", " //receivers interpolation\n", " //...\n", " }\n", " gettimeofday(&end_section2, NULL);\n", " timers->section2 += (double)(end_section2.tv_sec-start_section2.tv_sec)+(double)(end_section2.tv_usec-start_section2.tv_usec)/1000000;\n", " }\n", " return 0;\n", "}\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`op2`'s C code (differences are highlighted by `//<<<<<<<<<<<<<<<<<<<<`):" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```c\n", "// #define's\n", "//...\n", "\n", "// declare dataobj struct\n", "//...\n", "\n", "// declare profiler struct\n", "//...\n", "\n", "int Kernel(struct dataobj *restrict damp_vec, const float dt, struct dataobj *restrict m_vec, const float o_x, const float o_y, struct dataobj *restrict rec_vec, struct dataobj *restrict rec_coords_vec, struct dataobj *restrict src_vec, struct dataobj *restrict src_coords_vec, struct dataobj *restrict u_vec, struct dataobj *restrict usave_vec, const int x_M, const int x_m, const int y_M, const int y_m, const int p_rec_M, const int p_rec_m, const int p_src_M, const int p_src_m, const int time_M, const int time_m, struct profiler * timers)\n", "{\n", " // ...\n", " // ...\n", " \n", " float (*restrict u)[u_vec->size[1]][u_vec->size[2]] __attribute__ ((aligned (64))) = (float (*)[u_vec->size[1]][u_vec->size[2]]) u_vec->data;\n", "//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<size[1]][usave_vec->size[2]] __attribute__ ((aligned (64))) = (float (*)[usave_vec->size[1]][usave_vec->size[2]]) usave_vec->data;\n", "//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< \n", " \n", " //flush denormal numbers...\n", " \n", " for (int time = time_m, t0 = (time)%(3), t1 = (time + 1)%(3), t2 = (time + 2)%(3); time <= time_M; time += 1, t0 = (time)%(3), t1 = (time + 1)%(3), t2 = (time + 2)%(3))\n", " {\n", " struct timeval start_section0, end_section0;\n", " gettimeofday(&start_section0, NULL);\n", " for (int x = x_m; x <= x_M; x += 1)\n", " {\n", " #pragma omp simd\n", " for (int y = y_m; y <= y_M; y += 1)\n", " {\n", " float r0 = 1.0e+4F*dt*m[x + 2][y + 2] + 5.0e+3F*(dt*dt)*damp[x + 1][y + 1];\n", " u[t1][x + 2][y + 2] = 2.0e+4F*dt*m[x + 2][y + 2]*u[t0][x + 2][y + 2]/r0 - 1.0e+4F*dt*m[x + 2][y + 2]*u[t2][x + 2][y + 2]/r0 + 1.0e+2F*((dt*dt*dt)*u[t0][x + 1][y + 2]/r0 + (dt*dt*dt)*u[t0][x + 2][y + 1]/r0 + (dt*dt*dt)*u[t0][x + 2][y + 3]/r0 + (dt*dt*dt)*u[t0][x + 3][y + 2]/r0) + 5.0e+3F*(dt*dt)*damp[x + 1][y + 1]*u[t2][x + 2][y + 2]/r0 - 4.0e+2F*dt*dt*dt*u[t0][x + 2][y + 2]/r0;\n", " }\n", " }\n", " gettimeofday(&end_section0, NULL);\n", " timers->section0 += (double)(end_section0.tv_sec-start_section0.tv_sec)+(double)(end_section0.tv_usec-start_section0.tv_usec)/1000000;\n", "//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<section1 += (double)(end_section1.tv_sec-start_section1.tv_sec)+(double)(end_section1.tv_usec-start_section1.tv_usec)/1000000;\n", " }\n", " struct timeval start_section2, end_section2;\n", " gettimeofday(&start_section2, NULL);\n", " for (int p_src = p_src_m; p_src <= p_src_M; p_src += 1)\n", " {\n", " //source injection\n", " //...\n", " }\n", " gettimeofday(&end_section2, NULL);\n", " timers->section2 += (double)(end_section2.tv_sec-start_section2.tv_sec)+(double)(end_section2.tv_usec-start_section2.tv_usec)/1000000;\n", " struct timeval start_section3, end_section3;\n", " gettimeofday(&start_section3, NULL);\n", " for (int p_rec = p_rec_m; p_rec <= p_rec_M; p_rec += 1)\n", " {\n", " //receivers interpolation\n", " //...\n", " }\n", " gettimeofday(&end_section3, NULL);\n", " timers->section3 += (double)(end_section3.tv_sec-start_section3.tv_sec)+(double)(end_section3.tv_usec-start_section3.tv_usec)/1000000;\n", " }\n", " return 0;\n", "}\n", "\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To inspect the full codes of `op1` and `op2`, run the block below:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "def print2file(filename, thingToPrint):\n", " import sys\n", "\n", " orig_stdout = sys.stdout\n", "\n", " f = open(filename, 'w')\n", " sys.stdout = f\n", " print(thingToPrint)\n", " f.close()\n", "\n", " sys.stdout = orig_stdout\n", "\n", "\n", "# print2file(\"op1.c\", op1) # uncomment to print to file\n", "# print2file(\"op2.c\", op2) # uncomment to print to file\n", "# print(op1) # uncomment to print here\n", "# print(op2) # uncomment to print here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To run snaps as a movie (outside Jupyter Notebook), run the code below, altering `filename, nsnaps, nx, nz` accordingly:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#NBVAL_IGNORE_OUTPUT\n", "#NBVAL_SKIP\n", "from IPython.display import HTML\n", "import matplotlib.pyplot as plt\n", "import matplotlib.animation as animation\n", "\n", "filename = \"naivsnaps.bin\"\n", "nsnaps = 100\n", "fobj = open(filename, \"rb\")\n", "snapsObj = np.fromfile(fobj, dtype=np.float32)\n", "snapsObj = np.reshape(snapsObj, (nsnaps, vnx, vnz))\n", "fobj.close()\n", "\n", "fig, ax = plt.subplots()\n", "matrice = ax.imshow(snapsObj[0, :, :].T, vmin=-1, vmax=1, cmap=\"seismic\")\n", "plt.colorbar(matrice)\n", "\n", "plt.xlabel('x')\n", "plt.ylabel('z')\n", "plt.title('Modelling one shot over a 2-layer velocity model with Devito.') \n", "\n", "def update(i):\n", " matrice.set_array(snapsObj[i, :, :].T)\n", " return matrice,\n", "\n", "# Animation\n", "ani = animation.FuncAnimation(fig, update, frames=nsnaps, interval=50, blit=True)\n", "\n", "plt.close(ani._fig)\n", "HTML(ani.to_html5_video())\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# References\n", "\n", "Louboutin, M., Witte, P., Lange, M., Kukreja, N., Luporini, F., Gorman, G., & Herrmann, F. J. (2017). Full-waveform inversion, Part 1: Forward modeling. The Leading Edge, 36(12), 1033-1036." ] } ], "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.7.7" }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }