diff --git a/docker/jupyter.sh b/docker/jupyter.sh index d44e8237..d43a347d 100644 --- a/docker/jupyter.sh +++ b/docker/jupyter.sh @@ -1,4 +1,4 @@ #!/usr/bin/env bash source ~/.bashrc -jupyter notebook --ip=0.0.0.0 --port=8888 --allow-root +imrun notebook --ip=0.0.0.0 --port=8888 --allow-root diff --git a/environment.yml b/environment.yml index 7e32f550..0e57ea2d 100644 --- a/environment.yml +++ b/environment.yml @@ -25,22 +25,26 @@ dependencies: - pyflakes - pytest - pytest-cov + - pytest-runner + - pytorch - pyyaml>=5.4 - pyqt5-sip - - pytest-runner - pyzmq>=22.1 - scikit-image - scipy>=1.6 - sphinx - sphinx_rtd_theme - tornado>=6.1 + - tqdm - traitsui + - ipympl - uvloop - zlib - zict>=3.0.0 - pip: - devito>=4.6 + - ndsplines - python-daemon - py-libnuma - - tblib - resampy + - tblib diff --git a/mosaic/cli/findomp.py b/mosaic/cli/findomp.py new file mode 100755 index 00000000..a0ccb8aa --- /dev/null +++ b/mosaic/cli/findomp.py @@ -0,0 +1,48 @@ + +import re +import os +import sys + + +def go(): + # Get CUDA compilers path + comp_path = None + + # Try to get from environment variables + envs = ['CUDA_HOME', 'NVHPC_CUDA_HOME', 'CUDA_ROOT'] + for env in envs: + cuda_home = os.environ.get(env, None) + if cuda_home: + comp_path = os.path.join(os.path.join(os.path.dirname(cuda_home), 'compilers'), 'lib') + break + + if comp_path is None: + hpcsdk_home = os.environ.get('HPCSDK_HOME') + if hpcsdk_home: + comp_path = os.path.join(os.path.join(hpcsdk_home, 'compilers'), 'lib') + + # If not, try to get from LD_LIBRARY_PATH + if comp_path is None: + library_path = os.environ.get('LD_LIBRARY_PATH', '') + for path in library_path.split(':'): + if re.match('.*/nvidia/hpc_sdk/.*/?compilers/lib', path) or \ + re.match('.*/nvhpc/.*/?compilers/lib', path): + comp_path = path + + if comp_path is None or not os.path.exists(comp_path): + return '' + + # Now try to get libgomp path + libnames = ['libgomp', 'libiomp', 'libomp'] + extnames = ['.so', '.dylib', '.dll'] + for lib in libnames: + for ext in extnames: + lib_path = os.path.join(comp_path, lib + ext) + if os.path.exists(lib_path): + return lib_path + + return '' + + +if __name__ == '__main__': + sys.exit(go()) diff --git a/mosaic/cli/imrun b/mosaic/cli/imrun new file mode 100755 index 00000000..fd9913e8 --- /dev/null +++ b/mosaic/cli/imrun @@ -0,0 +1,3 @@ +#!/bin/bash +preload=$((findomp) 2>&1) +LD_PRELOAD="$preload" jupyter "$@" diff --git a/mosaic/cli/mrun b/mosaic/cli/mrun new file mode 100755 index 00000000..73038983 --- /dev/null +++ b/mosaic/cli/mrun @@ -0,0 +1,3 @@ +#!/bin/bash +preload=$((findomp) 2>&1) +LD_PRELOAD="$preload" mrun_ "$@" diff --git a/requirements.txt b/requirements.txt index fe7ecb4f..d0e8fdd8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,9 +8,11 @@ devito flake8 gputil h5py>=3.2 +multiprocess nbval +ndsplines numpy>=1.20 -multiprocess +notebook>=6.4 pre_commit psutil pyflakes @@ -26,6 +28,10 @@ scikit-image scipy>=1.6 sphinx sphinx_rtd_theme +tornado>=6.1 tblib +torch +tqdm +ipympl uvloop zict>=3.0.0 diff --git a/setup.py b/setup.py index 41211be6..d081b820 100644 --- a/setup.py +++ b/setup.py @@ -47,11 +47,17 @@ Extension('_profile', sources=['mosaic/profile/_profile.c']) ], + scripts=[ + 'mosaic/cli/mrun', + 'mosaic/cli/imrun', + ], entry_points={ 'console_scripts': [ 'mrun=mosaic.cli.mrun:go', + 'mrun_=mosaic.cli.mrun:go', 'mscript=mosaic.cli.mscript:go', 'mprof=mosaic.cli.mprof:go', + 'findomp=mosaic.cli.findomp:go', ] }, zip_safe=False, diff --git a/stride/physics/common/devito.py b/stride/physics/common/devito.py index e8c30e55..eb085fca 100644 --- a/stride/physics/common/devito.py +++ b/stride/physics/common/devito.py @@ -509,7 +509,9 @@ def _time_undersampled(self, name, factor, bounds=None, offset=None): factor=factor, condition=condition) - buffer_size = (bounds[1] - bounds[0] + factor) // factor + 1 + # buffer_size = (bounds[1] - bounds[0] + factor) // factor + 1 + # TODO Force larger buffer size to prevent devito issue + buffer_size = (self.time.extended_num - 1 - 0 + factor) // factor + 1 return time_under, buffer_size diff --git a/stride_examples/tutorials/03_acoustic_modelling.ipynb b/stride_examples/tutorials/03_acoustic_modelling.ipynb index 342e9933..b983e943 100644 --- a/stride_examples/tutorials/03_acoustic_modelling.ipynb +++ b/stride_examples/tutorials/03_acoustic_modelling.ipynb @@ -34,7 +34,7 @@ "outputs": [], "source": [ "from stride import Space, Time, Grid\n", - "%matplotlib notebook\n", + "%matplotlib widget\n", "\n", "space = Space(shape=(200, 200), extra=(50, 50), absorbing=(40, 40), spacing=0.4e-3)\n", "time = Time(start=0.0e-6, step=0.05e-6, num=2000)\n", @@ -80,993 +80,33 @@ "outputs": [ { "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "/* global mpl */\n", - "window.mpl = {};\n", - "\n", - "mpl.get_websocket_type = function () {\n", - " if (typeof WebSocket !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof MozWebSocket !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert(\n", - " 'Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.'\n", - " );\n", - " }\n", - "};\n", - "\n", - "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = this.ws.binaryType !== undefined;\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById('mpl-warnings');\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent =\n", - " 'This browser does not support binary websocket messages. ' +\n", - " 'Performance may be slow.';\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = document.createElement('div');\n", - " this.root.setAttribute('style', 'display: inline-block');\n", - " this._root_extra_style(this.root);\n", - "\n", - " parent_element.appendChild(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message('supports_binary', { value: fig.supports_binary });\n", - " fig.send_message('send_image_mode', {});\n", - " if (fig.ratio !== 1) {\n", - " fig.send_message('set_device_pixel_ratio', {\n", - " device_pixel_ratio: fig.ratio,\n", - " });\n", - " }\n", - " fig.send_message('refresh', {});\n", - " };\n", - "\n", - " this.imageObj.onload = function () {\n", - " if (fig.image_mode === 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function () {\n", - " fig.ws.close();\n", - " };\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "};\n", - "\n", - "mpl.figure.prototype._init_header = function () {\n", - " var titlebar = document.createElement('div');\n", - " titlebar.classList =\n", - " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", - " var titletext = document.createElement('div');\n", - " titletext.classList = 'ui-dialog-title';\n", - " titletext.setAttribute(\n", - " 'style',\n", - " 'width: 100%; text-align: center; padding: 3px;'\n", - " );\n", - " titlebar.appendChild(titletext);\n", - " this.root.appendChild(titlebar);\n", - " this.header = titletext;\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._init_canvas = function () {\n", - " var fig = this;\n", - "\n", - " var canvas_div = (this.canvas_div = document.createElement('div'));\n", - " canvas_div.setAttribute(\n", - " 'style',\n", - " 'border: 1px solid #ddd;' +\n", - " 'box-sizing: content-box;' +\n", - " 'clear: both;' +\n", - " 'min-height: 1px;' +\n", - " 'min-width: 1px;' +\n", - " 'outline: 0;' +\n", - " 'overflow: hidden;' +\n", - " 'position: relative;' +\n", - " 'resize: both;'\n", - " );\n", - "\n", - " function on_keyboard_event_closure(name) {\n", - " return function (event) {\n", - " return fig.key_event(event, name);\n", - " };\n", - " }\n", - "\n", - " canvas_div.addEventListener(\n", - " 'keydown',\n", - " on_keyboard_event_closure('key_press')\n", - " );\n", - " canvas_div.addEventListener(\n", - " 'keyup',\n", - " on_keyboard_event_closure('key_release')\n", - " );\n", - "\n", - " this._canvas_extra_style(canvas_div);\n", - " this.root.appendChild(canvas_div);\n", - "\n", - " var canvas = (this.canvas = document.createElement('canvas'));\n", - " canvas.classList.add('mpl-canvas');\n", - " canvas.setAttribute('style', 'box-sizing: content-box;');\n", - "\n", - " this.context = canvas.getContext('2d');\n", - "\n", - " var backingStore =\n", - " this.context.backingStorePixelRatio ||\n", - " this.context.webkitBackingStorePixelRatio ||\n", - " this.context.mozBackingStorePixelRatio ||\n", - " this.context.msBackingStorePixelRatio ||\n", - " this.context.oBackingStorePixelRatio ||\n", - " this.context.backingStorePixelRatio ||\n", - " 1;\n", - "\n", - " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", - " 'canvas'\n", - " ));\n", - " rubberband_canvas.setAttribute(\n", - " 'style',\n", - " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", - " );\n", - "\n", - " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", - " if (this.ResizeObserver === undefined) {\n", - " if (window.ResizeObserver !== undefined) {\n", - " this.ResizeObserver = window.ResizeObserver;\n", - " } else {\n", - " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", - " this.ResizeObserver = obs.ResizeObserver;\n", - " }\n", - " }\n", - "\n", - " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", - " var nentries = entries.length;\n", - " for (var i = 0; i < nentries; i++) {\n", - " var entry = entries[i];\n", - " var width, height;\n", - " if (entry.contentBoxSize) {\n", - " if (entry.contentBoxSize instanceof Array) {\n", - " // Chrome 84 implements new version of spec.\n", - " width = entry.contentBoxSize[0].inlineSize;\n", - " height = entry.contentBoxSize[0].blockSize;\n", - " } else {\n", - " // Firefox implements old version of spec.\n", - " width = entry.contentBoxSize.inlineSize;\n", - " height = entry.contentBoxSize.blockSize;\n", - " }\n", - " } else {\n", - " // Chrome <84 implements even older version of spec.\n", - " width = entry.contentRect.width;\n", - " height = entry.contentRect.height;\n", - " }\n", - "\n", - " // Keep the size of the canvas and rubber band canvas in sync with\n", - " // the canvas container.\n", - " if (entry.devicePixelContentBoxSize) {\n", - " // Chrome 84 implements new version of spec.\n", - " canvas.setAttribute(\n", - " 'width',\n", - " entry.devicePixelContentBoxSize[0].inlineSize\n", - " );\n", - " canvas.setAttribute(\n", - " 'height',\n", - " entry.devicePixelContentBoxSize[0].blockSize\n", - " );\n", - " } else {\n", - " canvas.setAttribute('width', width * fig.ratio);\n", - " canvas.setAttribute('height', height * fig.ratio);\n", - " }\n", - " canvas.setAttribute(\n", - " 'style',\n", - " 'width: ' + width + 'px; height: ' + height + 'px;'\n", - " );\n", - "\n", - " rubberband_canvas.setAttribute('width', width);\n", - " rubberband_canvas.setAttribute('height', height);\n", - "\n", - " // And update the size in Python. We ignore the initial 0/0 size\n", - " // that occurs as the element is placed into the DOM, which should\n", - " // otherwise not happen due to the minimum size styling.\n", - " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", - " fig.request_resize(width, height);\n", - " }\n", - " }\n", - " });\n", - " this.resizeObserverInstance.observe(canvas_div);\n", - "\n", - " function on_mouse_event_closure(name) {\n", - " return function (event) {\n", - " return fig.mouse_event(event, name);\n", - " };\n", - " }\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mousedown',\n", - " on_mouse_event_closure('button_press')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseup',\n", - " on_mouse_event_closure('button_release')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'dblclick',\n", - " on_mouse_event_closure('dblclick')\n", - " );\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband_canvas.addEventListener(\n", - " 'mousemove',\n", - " on_mouse_event_closure('motion_notify')\n", - " );\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseenter',\n", - " on_mouse_event_closure('figure_enter')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseleave',\n", - " on_mouse_event_closure('figure_leave')\n", - " );\n", - "\n", - " canvas_div.addEventListener('wheel', function (event) {\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " on_mouse_event_closure('scroll')(event);\n", - " });\n", - "\n", - " canvas_div.appendChild(canvas);\n", - " canvas_div.appendChild(rubberband_canvas);\n", - "\n", - " this.rubberband_context = rubberband_canvas.getContext('2d');\n", - " this.rubberband_context.strokeStyle = '#000000';\n", - "\n", - " this._resize_canvas = function (width, height, forward) {\n", - " if (forward) {\n", - " canvas_div.style.width = width + 'px';\n", - " canvas_div.style.height = height + 'px';\n", - " }\n", - " };\n", - "\n", - " // Disable right mouse context menu.\n", - " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n", - " event.preventDefault();\n", - " return false;\n", - " });\n", - "\n", - " function set_focus() {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'mpl-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " continue;\n", - " }\n", - "\n", - " var button = (fig.buttons[name] = document.createElement('button'));\n", - " button.classList = 'mpl-widget';\n", - " button.setAttribute('role', 'button');\n", - " button.setAttribute('aria-disabled', 'false');\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - "\n", - " var icon_img = document.createElement('img');\n", - " icon_img.src = '_images/' + image + '.png';\n", - " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", - " icon_img.alt = tooltip;\n", - " button.appendChild(icon_img);\n", - "\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " var fmt_picker = document.createElement('select');\n", - " fmt_picker.classList = 'mpl-widget';\n", - " toolbar.appendChild(fmt_picker);\n", - " this.format_dropdown = fmt_picker;\n", - "\n", - " for (var ind in mpl.extensions) {\n", - " var fmt = mpl.extensions[ind];\n", - " var option = document.createElement('option');\n", - " option.selected = fmt === mpl.default_extension;\n", - " option.innerHTML = fmt;\n", - " fmt_picker.appendChild(option);\n", - " }\n", - "\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "};\n", - "\n", - "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n", - " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", - " // which will in turn request a refresh of the image.\n", - " this.send_message('resize', { width: x_pixels, height: y_pixels });\n", - "};\n", - "\n", - "mpl.figure.prototype.send_message = function (type, properties) {\n", - " properties['type'] = type;\n", - " properties['figure_id'] = this.id;\n", - " this.ws.send(JSON.stringify(properties));\n", - "};\n", - "\n", - "mpl.figure.prototype.send_draw_message = function () {\n", - " if (!this.waiting) {\n", - " this.waiting = true;\n", - " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " var format_dropdown = fig.format_dropdown;\n", - " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", - " fig.ondownload(fig, format);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_resize = function (fig, msg) {\n", - " var size = msg['size'];\n", - " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n", - " fig._resize_canvas(size[0], size[1], msg['forward']);\n", - " fig.send_message('refresh', {});\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", - " var x0 = msg['x0'] / fig.ratio;\n", - " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", - " var x1 = msg['x1'] / fig.ratio;\n", - " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n", - " x0 = Math.floor(x0) + 0.5;\n", - " y0 = Math.floor(y0) + 0.5;\n", - " x1 = Math.floor(x1) + 0.5;\n", - " y1 = Math.floor(y1) + 0.5;\n", - " var min_x = Math.min(x0, x1);\n", - " var min_y = Math.min(y0, y1);\n", - " var width = Math.abs(x1 - x0);\n", - " var height = Math.abs(y1 - y0);\n", - "\n", - " fig.rubberband_context.clearRect(\n", - " 0,\n", - " 0,\n", - " fig.canvas.width / fig.ratio,\n", - " fig.canvas.height / fig.ratio\n", - " );\n", - "\n", - " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n", - " // Updates the figure title.\n", - " fig.header.textContent = msg['label'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n", - " fig.rubberband_canvas.style.cursor = msg['cursor'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_message = function (fig, msg) {\n", - " fig.message.textContent = msg['message'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n", - " // Request the server to send over a new figure.\n", - " fig.send_draw_message();\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n", - " fig.image_mode = msg['mode'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n", - " for (var key in msg) {\n", - " if (!(key in fig.buttons)) {\n", - " continue;\n", - " }\n", - " fig.buttons[key].disabled = !msg[key];\n", - " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", - " if (msg['mode'] === 'PAN') {\n", - " fig.buttons['Pan'].classList.add('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " } else if (msg['mode'] === 'ZOOM') {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.add('active');\n", - " } else {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Called whenever the canvas gets updated.\n", - " this.send_message('ack', {});\n", - "};\n", - "\n", - "// A function to construct a web socket function for onmessage handling.\n", - "// Called in the figure constructor.\n", - "mpl.figure.prototype._make_on_message_function = function (fig) {\n", - " return function socket_on_message(evt) {\n", - " if (evt.data instanceof Blob) {\n", - " var img = evt.data;\n", - " if (img.type !== 'image/png') {\n", - " /* FIXME: We get \"Resource interpreted as Image but\n", - " * transferred with MIME type text/plain:\" errors on\n", - " * Chrome. But how to set the MIME type? It doesn't seem\n", - " * to be part of the websocket stream */\n", - " img.type = 'image/png';\n", - " }\n", - "\n", - " /* Free the memory for the previous frames */\n", - " if (fig.imageObj.src) {\n", - " (window.URL || window.webkitURL).revokeObjectURL(\n", - " fig.imageObj.src\n", - " );\n", - " }\n", - "\n", - " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", - " img\n", - " );\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " } else if (\n", - " typeof evt.data === 'string' &&\n", - " evt.data.slice(0, 21) === 'data:image/png;base64'\n", - " ) {\n", - " fig.imageObj.src = evt.data;\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - "\n", - " var msg = JSON.parse(evt.data);\n", - " var msg_type = msg['type'];\n", - "\n", - " // Call the \"handle_{type}\" callback, which takes\n", - " // the figure and JSON message as its only arguments.\n", - " try {\n", - " var callback = fig['handle_' + msg_type];\n", - " } catch (e) {\n", - " console.log(\n", - " \"No handler for the '\" + msg_type + \"' message type: \",\n", - " msg\n", - " );\n", - " return;\n", - " }\n", - "\n", - " if (callback) {\n", - " try {\n", - " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", - " callback(fig, msg);\n", - " } catch (e) {\n", - " console.log(\n", - " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", - " e,\n", - " e.stack,\n", - " msg\n", - " );\n", - " }\n", - " }\n", - " };\n", - "};\n", - "\n", - "// from https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", - "mpl.findpos = function (e) {\n", - " //this section is from http://www.quirksmode.org/js/events_properties.html\n", - " var targ;\n", - " if (!e) {\n", - " e = window.event;\n", - " }\n", - " if (e.target) {\n", - " targ = e.target;\n", - " } else if (e.srcElement) {\n", - " targ = e.srcElement;\n", - " }\n", - " if (targ.nodeType === 3) {\n", - " // defeat Safari bug\n", - " targ = targ.parentNode;\n", - " }\n", - "\n", - " // pageX,Y are the mouse positions relative to the document\n", - " var boundingRect = targ.getBoundingClientRect();\n", - " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", - " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n", - "\n", - " return { x: x, y: y };\n", - "};\n", - "\n", - "/*\n", - " * return a copy of an object with only non-object keys\n", - " * we need this to avoid circular references\n", - " * https://stackoverflow.com/a/24161582/3208463\n", - " */\n", - "function simpleKeys(original) {\n", - " return Object.keys(original).reduce(function (obj, key) {\n", - " if (typeof original[key] !== 'object') {\n", - " obj[key] = original[key];\n", - " }\n", - " return obj;\n", - " }, {});\n", - "}\n", - "\n", - "mpl.figure.prototype.mouse_event = function (event, name) {\n", - " var canvas_pos = mpl.findpos(event);\n", - "\n", - " if (name === 'button_press') {\n", - " this.canvas.focus();\n", - " this.canvas_div.focus();\n", - " }\n", - "\n", - " var x = canvas_pos.x * this.ratio;\n", - " var y = canvas_pos.y * this.ratio;\n", - "\n", - " this.send_message(name, {\n", - " x: x,\n", - " y: y,\n", - " button: event.button,\n", - " step: event.step,\n", - " guiEvent: simpleKeys(event),\n", - " });\n", - "\n", - " /* This prevents the web browser from automatically changing to\n", - " * the text insertion cursor when the button is pressed. We want\n", - " * to control all of the cursor setting manually through the\n", - " * 'cursor' event from matplotlib */\n", - " event.preventDefault();\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n", - " // Handle any extra behaviour associated with a key event\n", - "};\n", - "\n", - "mpl.figure.prototype.key_event = function (event, name) {\n", - " // Prevent repeat events\n", - " if (name === 'key_press') {\n", - " if (event.key === this._key) {\n", - " return;\n", - " } else {\n", - " this._key = event.key;\n", - " }\n", - " }\n", - " if (name === 'key_release') {\n", - " this._key = null;\n", - " }\n", - "\n", - " var value = '';\n", - " if (event.ctrlKey && event.key !== 'Control') {\n", - " value += 'ctrl+';\n", - " }\n", - " else if (event.altKey && event.key !== 'Alt') {\n", - " value += 'alt+';\n", - " }\n", - " else if (event.shiftKey && event.key !== 'Shift') {\n", - " value += 'shift+';\n", - " }\n", - "\n", - " value += 'k' + event.key;\n", - "\n", - " this._key_event_extra(event, name);\n", - "\n", - " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n", - " if (name === 'download') {\n", - " this.handle_save(this, null);\n", - " } else {\n", - " this.send_message('toolbar_button', { name: name });\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n", - " this.message.textContent = tooltip;\n", - "};\n", - "\n", - "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", - "// prettier-ignore\n", - "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n", - "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", - "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", - "\n", - "mpl.default_extension = \"png\";/* global mpl */\n", - "\n", - "var comm_websocket_adapter = function (comm) {\n", - " // Create a \"websocket\"-like object which calls the given IPython comm\n", - " // object with the appropriate methods. Currently this is a non binary\n", - " // socket, so there is still some room for performance tuning.\n", - " var ws = {};\n", - "\n", - " ws.binaryType = comm.kernel.ws.binaryType;\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " function updateReadyState(_event) {\n", - " if (comm.kernel.ws) {\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " } else {\n", - " ws.readyState = 3; // Closed state.\n", - " }\n", - " }\n", - " comm.kernel.ws.addEventListener('open', updateReadyState);\n", - " comm.kernel.ws.addEventListener('close', updateReadyState);\n", - " comm.kernel.ws.addEventListener('error', updateReadyState);\n", - "\n", - " ws.close = function () {\n", - " comm.close();\n", - " };\n", - " ws.send = function (m) {\n", - " //console.log('sending', m);\n", - " comm.send(m);\n", - " };\n", - " // Register the callback with on_msg.\n", - " comm.on_msg(function (msg) {\n", - " //console.log('receiving', msg['content']['data'], msg);\n", - " var data = msg['content']['data'];\n", - " if (data['blob'] !== undefined) {\n", - " data = {\n", - " data: new Blob(msg['buffers'], { type: data['blob'] }),\n", - " };\n", - " }\n", - " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", - " ws.onmessage(data);\n", - " });\n", - " return ws;\n", - "};\n", - "\n", - "mpl.mpl_figure_comm = function (comm, msg) {\n", - " // This is the function which gets called when the mpl process\n", - " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", - "\n", - " var id = msg.content.data.id;\n", - " // Get hold of the div created by the display call when the Comm\n", - " // socket was opened in Python.\n", - " var element = document.getElementById(id);\n", - " var ws_proxy = comm_websocket_adapter(comm);\n", - "\n", - " function ondownload(figure, _format) {\n", - " window.open(figure.canvas.toDataURL());\n", - " }\n", - "\n", - " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n", - "\n", - " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", - " // web socket which is closed, not our websocket->open comm proxy.\n", - " ws_proxy.onopen();\n", - "\n", - " fig.parent_element = element;\n", - " fig.cell_info = mpl.find_output_cell(\"
\");\n", - " if (!fig.cell_info) {\n", - " console.error('Failed to find cell for figure', id, fig);\n", - " return;\n", - " }\n", - " fig.cell_info[0].output_area.element.on(\n", - " 'cleared',\n", - " { fig: fig },\n", - " fig._remove_fig_handler\n", - " );\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_close = function (fig, msg) {\n", - " var width = fig.canvas.width / fig.ratio;\n", - " fig.cell_info[0].output_area.element.off(\n", - " 'cleared',\n", - " fig._remove_fig_handler\n", - " );\n", - " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n", - "\n", - " // Update the output cell to use the data from the current canvas.\n", - " fig.push_to_output();\n", - " var dataURL = fig.canvas.toDataURL();\n", - " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", - " // the notebook keyboard shortcuts fail.\n", - " IPython.keyboard_manager.enable();\n", - " fig.parent_element.innerHTML =\n", - " '';\n", - " fig.close_ws(fig, msg);\n", - "};\n", - "\n", - "mpl.figure.prototype.close_ws = function (fig, msg) {\n", - " fig.send_message('closing', msg);\n", - " // fig.ws.close()\n", - "};\n", - "\n", - "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n", - " // Turn the data on the canvas into data in the output cell.\n", - " var width = this.canvas.width / this.ratio;\n", - " var dataURL = this.canvas.toDataURL();\n", - " this.cell_info[1]['text/html'] =\n", - " '';\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Tell IPython that the notebook contents must change.\n", - " IPython.notebook.set_dirty(true);\n", - " this.send_message('ack', {});\n", - " var fig = this;\n", - " // Wait a second, then push the new image to the DOM so\n", - " // that it is saved nicely (might be nice to debounce this).\n", - " setTimeout(function () {\n", - " fig.push_to_output();\n", - " }, 1000);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'btn-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " var button;\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " continue;\n", - " }\n", - "\n", - " button = fig.buttons[name] = document.createElement('button');\n", - " button.classList = 'btn btn-default';\n", - " button.href = '#';\n", - " button.title = name;\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message pull-right';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = document.createElement('div');\n", - " buttongrp.classList = 'btn-group inline pull-right';\n", - " button = document.createElement('button');\n", - " button.classList = 'btn btn-mini btn-primary';\n", - " button.href = '#';\n", - " button.title = 'Stop Interaction';\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', function (_evt) {\n", - " fig.handle_close(fig, {});\n", - " });\n", - " button.addEventListener(\n", - " 'mouseover',\n", - " on_mouseover_closure('Stop Interaction')\n", - " );\n", - " buttongrp.appendChild(button);\n", - " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", - " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", - "};\n", - "\n", - "mpl.figure.prototype._remove_fig_handler = function (event) {\n", - " var fig = event.data.fig;\n", - " if (event.target !== this) {\n", - " // Ignore bubbled events from children.\n", - " return;\n", - " }\n", - " fig.close_ws(fig, {});\n", - "};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (el) {\n", - " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (el) {\n", - " // this is important to make the div 'focusable\n", - " el.setAttribute('tabindex', 0);\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " } else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (event, _name) {\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which === 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " fig.ondownload(fig, null);\n", - "};\n", - "\n", - "mpl.find_output_cell = function (html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i = 0; i < ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code') {\n", - " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] === html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "};\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel !== null) {\n", - " IPython.notebook.kernel.comm_manager.register_target(\n", - " 'matplotlib',\n", - " mpl.mpl_figure_comm\n", - " );\n", - "}\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d1d5becf18d246b090b4ef3ff80281ed", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA23klEQVR4nO3df3RU5Z3H8c9oYAiQRFCZyZCIEYNVCUjFRYlH4o+gVK2ulVrBLdT+QMFK1nbhoFjA0gSwctRDq+i6iLqsPT0K/gQJq8Y2wCmIHGN00R6QBmGMdTGJgEHh2T9mM80kAWaYzNw793m/zpkTc+dmeLy583y/eX58x2eMMQIAAIA1TnC6AQAAAEgvEkAAAADLkAACAABYhgQQAADAMiSAAAAAliEBBAAAsAwJIAAAgGVIAAEAACxDAggAAGAZEkAAAADLkAACAABYhgQQAADAMiSAAAAAliEBBAAAsAwJIAAAgGVIAAEAACxDAggAAGAZEkAAAADLkAACAABYhgQQAADAMiSAAAAAliEBBAAAsAwJIAAAgGVIAAEAACxDAggAAGAZEkAAAADLkAACAABYhgQQAADAMiSAAAAAliEBBAAAsAwJIAAAgGVIAAEAACxDAggAAGAZEkAAAADLkAACAABYhgQQAADAMiSAAJBC+/fv19y5c/Xmm2863RQAiCIBBIAU2r9/v+bNm0cCCMBVSAABwEX279/vdBMAWIAEEIDjXnjhBQ0bNkx+v19nnHGGHnroIc2dO1c+ny96jjFGv//973XeeecpOztb/fr104033qjt27d3er3/+I//0PDhw9WrVy/1799f//zP/6wPPvgg5pzJkyerb9+++p//+R9deeWV6tOnj/Lz87VgwQJJ0saNG3XxxRerT58+GjJkiJYvX97p3wmHw5oyZYoKCgrUs2dPFRUVad68efrmm28kSR9//LFOPfVUSdK8efPk8/nk8/k0efJkSYr+P27ZskU33nij+vXrp8GDB+vpp5+Wz+fThg0bOv2b9913n3r06KHdu3cf38UGAEkyAOCg1atXmxNOOMGUlZWZlStXmj/+8Y9m1KhR5vTTTzftu6if/vSnpkePHuYXv/iFWbNmjVmxYoX51re+ZQKBgAmHw9HzKisrjSRz8803m1deecU89dRT5owzzjB5eXnmww8/jJ43adIk07NnT3P22Webhx56yFRXV5sf/ehHRpKZNWuWGTJkiHniiSfMa6+9Zq655hojyWzevDn683v27DGFhYVm0KBBZunSpWbdunXm17/+tfH7/Wby5MnGGGO++uors2bNGiPJ/PjHPzYbNmwwGzZsMH/961+NMcbMmTPHSDKDBg0yM2fONNXV1WbVqlWmtbXVBINBM3HixJhr9fXXX5tQKGTGjx+fkt8FAHuQAAJw1AUXXGAKCwtNa2tr9FhLS4s5+eSTownghg0bjCTzwAMPxPxsQ0ODyc7ONjNmzDDGGLN3716TnZ1tvvOd78Sc97e//c34/X4zYcKE6LFJkyYZSea5556LHvv666/NqaeeaiSZLVu2RI9//vnn5sQTTzR33XVX9NiUKVNM3759zc6dO2P+rd/+9rdGkqmvrzfGGPPZZ58ZSWbOnDmd/t/bEsBf/epXXT7Xs2dP8+mnn0aP/eEPfzCSTE1NTafzASARTAEDcMy+ffu0efNmXX/99erZs2f0eN++fXXttddGv3/55Zfl8/l0yy236Jtvvok+gsGghg8fHt1gsWHDBh04cCA6xdqmsLBQl112mf77v/875rjP59N3vvOd6PdZWVk688wzlZ+frxEjRkSP9+/fXwMGDNDOnTtj2nTppZcqFArFtGncuHGSpJqamrivw/e+971Ox26//XZJ0uOPPx49tmTJEpWUlOiSSy6J+7UBoCskgAAcs3fvXhljFAgEOj3X/tinn34aPa9Hjx4xj40bN+rvf/+7JOnzzz+XJOXn53d6vVAoFH2+Te/evdWrV6+YYz179lT//v07/XzPnj311VdfxbTppZde6tSec889V5KibYpHV+0NBAK66aabtHTpUh06dEjvvvuu/vSnP+mOO+6I+3UB4EiynG4AAHv169dPPp9Pn376aafnwuFw9L9POeUU+Xw+/elPf5Lf7+90btuxk08+WZK0Z8+eTufs3r1bp5xySnc1XaeccoqGDRum3/zmN10+HwqF4n6t9ptd2ps+fbqefvppvfDCC1qzZo1OOukkTZw48bjaCwDtkQACcEyfPn00cuRIrVq1Sr/97W+j08BffvmlXn755eh511xzjRYsWKBPPvlE3//+94/4ehdddJGys7P1zDPPaPz48dHju3bt0uuvv64bb7yx29p+zTXX6NVXX9XgwYPVr1+/I57XlpweOHAg4X/j/PPP1+jRo7Vw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", "text/html": [ - "" + "\n", + "
\n", + "
\n", + " Figure\n", + "
\n", + " \n", + "
\n", + " " ], "text/plain": [ - "" + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "output_type": "display_data" }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "QApplication: invalid style override passed, ignoring it.\n", - " Available styles: Windows, Fusion\n" - ] - }, { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 3, @@ -1106,964 +146,206 @@ "outputs": [ { "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "/* global mpl */\n", - "window.mpl = {};\n", - "\n", - "mpl.get_websocket_type = function () {\n", - " if (typeof WebSocket !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof MozWebSocket !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert(\n", - " 'Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.'\n", - " );\n", - " }\n", - "};\n", - "\n", - "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = this.ws.binaryType !== undefined;\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById('mpl-warnings');\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent =\n", - " 'This browser does not support binary websocket messages. ' +\n", - " 'Performance may be slow.';\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = document.createElement('div');\n", - " this.root.setAttribute('style', 'display: inline-block');\n", - " this._root_extra_style(this.root);\n", - "\n", - " parent_element.appendChild(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message('supports_binary', { value: fig.supports_binary });\n", - " fig.send_message('send_image_mode', {});\n", - " if (fig.ratio !== 1) {\n", - " fig.send_message('set_device_pixel_ratio', {\n", - " device_pixel_ratio: fig.ratio,\n", - " });\n", - " }\n", - " fig.send_message('refresh', {});\n", - " };\n", - "\n", - " this.imageObj.onload = function () {\n", - " if (fig.image_mode === 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function () {\n", - " fig.ws.close();\n", - " };\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "};\n", - "\n", - "mpl.figure.prototype._init_header = function () {\n", - " var titlebar = document.createElement('div');\n", - " titlebar.classList =\n", - " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", - " var titletext = document.createElement('div');\n", - " titletext.classList = 'ui-dialog-title';\n", - " titletext.setAttribute(\n", - " 'style',\n", - " 'width: 100%; text-align: center; padding: 3px;'\n", - " );\n", - " titlebar.appendChild(titletext);\n", - " this.root.appendChild(titlebar);\n", - " this.header = titletext;\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._init_canvas = function () {\n", - " var fig = this;\n", - "\n", - " var canvas_div = (this.canvas_div = document.createElement('div'));\n", - " canvas_div.setAttribute(\n", - " 'style',\n", - " 'border: 1px solid #ddd;' +\n", - " 'box-sizing: content-box;' +\n", - " 'clear: both;' +\n", - " 'min-height: 1px;' +\n", - " 'min-width: 1px;' +\n", - " 'outline: 0;' +\n", - " 'overflow: hidden;' +\n", - " 'position: relative;' +\n", - " 'resize: both;'\n", - " );\n", - "\n", - " function on_keyboard_event_closure(name) {\n", - " return function (event) {\n", - " return fig.key_event(event, name);\n", - " };\n", - " }\n", - "\n", - " canvas_div.addEventListener(\n", - " 'keydown',\n", - " on_keyboard_event_closure('key_press')\n", - " );\n", - " canvas_div.addEventListener(\n", - " 'keyup',\n", - " on_keyboard_event_closure('key_release')\n", - " );\n", - "\n", - " this._canvas_extra_style(canvas_div);\n", - " this.root.appendChild(canvas_div);\n", - "\n", - " var canvas = (this.canvas = document.createElement('canvas'));\n", - " canvas.classList.add('mpl-canvas');\n", - " canvas.setAttribute('style', 'box-sizing: content-box;');\n", - "\n", - " this.context = canvas.getContext('2d');\n", - "\n", - " var backingStore =\n", - " this.context.backingStorePixelRatio ||\n", - " this.context.webkitBackingStorePixelRatio ||\n", - " this.context.mozBackingStorePixelRatio ||\n", - " this.context.msBackingStorePixelRatio ||\n", - " this.context.oBackingStorePixelRatio ||\n", - " this.context.backingStorePixelRatio ||\n", - " 1;\n", - "\n", - " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", - " 'canvas'\n", - " ));\n", - " rubberband_canvas.setAttribute(\n", - " 'style',\n", - " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", - " );\n", - "\n", - " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", - " if (this.ResizeObserver === undefined) {\n", - " if (window.ResizeObserver !== undefined) {\n", - " this.ResizeObserver = window.ResizeObserver;\n", - " } else {\n", - " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", - " this.ResizeObserver = obs.ResizeObserver;\n", - " }\n", - " }\n", - "\n", - " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", - " var nentries = entries.length;\n", - " for (var i = 0; i < nentries; i++) {\n", - " var entry = entries[i];\n", - " var width, height;\n", - " if (entry.contentBoxSize) {\n", - " if (entry.contentBoxSize instanceof Array) {\n", - " // Chrome 84 implements new version of spec.\n", - " width = entry.contentBoxSize[0].inlineSize;\n", - " height = entry.contentBoxSize[0].blockSize;\n", - " } else {\n", - " // Firefox implements old version of spec.\n", - " width = entry.contentBoxSize.inlineSize;\n", - " height = entry.contentBoxSize.blockSize;\n", - " }\n", - " } else {\n", - " // Chrome <84 implements even older version of spec.\n", - " width = entry.contentRect.width;\n", - " height = entry.contentRect.height;\n", - " }\n", - "\n", - " // Keep the size of the canvas and rubber band canvas in sync with\n", - " // the canvas container.\n", - " if (entry.devicePixelContentBoxSize) {\n", - " // Chrome 84 implements new version of spec.\n", - " canvas.setAttribute(\n", - " 'width',\n", - " entry.devicePixelContentBoxSize[0].inlineSize\n", - " );\n", - " canvas.setAttribute(\n", - " 'height',\n", - " entry.devicePixelContentBoxSize[0].blockSize\n", - " );\n", - " } else {\n", - " canvas.setAttribute('width', width * fig.ratio);\n", - " canvas.setAttribute('height', height * fig.ratio);\n", - " }\n", - " canvas.setAttribute(\n", - " 'style',\n", - " 'width: ' + width + 'px; height: ' + height + 'px;'\n", - " );\n", - "\n", - " rubberband_canvas.setAttribute('width', width);\n", - " rubberband_canvas.setAttribute('height', height);\n", - "\n", - " // And update the size in Python. We ignore the initial 0/0 size\n", - " // that occurs as the element is placed into the DOM, which should\n", - " // otherwise not happen due to the minimum size styling.\n", - " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", - " fig.request_resize(width, height);\n", - " }\n", - " }\n", - " });\n", - " this.resizeObserverInstance.observe(canvas_div);\n", - "\n", - " function on_mouse_event_closure(name) {\n", - " return function (event) {\n", - " return fig.mouse_event(event, name);\n", - " };\n", - " }\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mousedown',\n", - " on_mouse_event_closure('button_press')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseup',\n", - " on_mouse_event_closure('button_release')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'dblclick',\n", - " on_mouse_event_closure('dblclick')\n", - " );\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband_canvas.addEventListener(\n", - " 'mousemove',\n", - " on_mouse_event_closure('motion_notify')\n", - " );\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseenter',\n", - " on_mouse_event_closure('figure_enter')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseleave',\n", - " on_mouse_event_closure('figure_leave')\n", - " );\n", - "\n", - " canvas_div.addEventListener('wheel', function (event) {\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " on_mouse_event_closure('scroll')(event);\n", - " });\n", - "\n", - " canvas_div.appendChild(canvas);\n", - " canvas_div.appendChild(rubberband_canvas);\n", - "\n", - " this.rubberband_context = rubberband_canvas.getContext('2d');\n", - " this.rubberband_context.strokeStyle = '#000000';\n", - "\n", - " this._resize_canvas = function (width, height, forward) {\n", - " if (forward) {\n", - " canvas_div.style.width = width + 'px';\n", - " canvas_div.style.height = height + 'px';\n", - " }\n", - " };\n", - "\n", - " // Disable right mouse context menu.\n", - " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n", - " event.preventDefault();\n", - " return false;\n", - " });\n", - "\n", - " function set_focus() {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", + "application/vnd.jupyter.widget-view+json": { + "model_id": "0b949e690dbb4db88deed22eab69f5b3", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "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W6bMzEzNnDlTW7Zs0bBhw3Tddddp7969To8GAC2Ot4EBAEmpqakaMGCAFixY4F/Xp08f3XjjjcrJyXFwMgBoeVwBBGC82tpabdq0SRkZGQHrMzIyVFxc7NBUABA8BCAA4x04cED19fXyer0B671er0pLSx2aCgCChwAEgP+yLCvgsW3bTdYBQDggAAEY75xzzpHL5Wpyta+srKzJVUEACAcEIADjRUdHa+DAgSooKAhYX1BQoCFDhjg0FQAET6TTAwBAKJg2bZomTJigQYMGafDgwVq4cKH27t2re+65x+nRAKDFEYAAIOnnP/+5vvnmG82ePVv79+9X37599dZbb6lHjx5OjwYALY73AQQAADAMrwEEAAAwDAEIAABgGAIQAADAMAQgAACAYQhAAAAAwxCAAAAAhiEAAQAADEMAAgAAGIYABBCW0tPTlZmZ6fQYABCSCEAARrJtW3V1dU6PAQCOIAABhJ3bb79dRUVFeuaZZ2RZlizL0qJFi2RZllatWqVBgwbJ7XZr3bp1+uyzz3TDDTfI6/WqXbt2uuyyy1RYWBhwvpqaGk2fPl1JSUlyu91KSUnRiy++6N++fft2jRw5Uu3atZPX69WECRN04MCB1v6yAeCUEYAAws4zzzyjwYMH66677tL+/fu1f/9+JSUlSZKmT5+unJwc7dixQ5dccokqKys1cuRIFRYWasuWLbrmmms0evRo7d2713++2267Ta+++qqeffZZ7dixQ88//7zatWsnSdq/f7/S0tLUv39/vf/++1q5cqW++uor/exnP3PkaweAU2HZtm07PQQAtLT09HT1799fubm5kqS1a9fqyiuv1JtvvqkbbrjhhMdefPHF+tWvfqV7771Xn3zyiS688EIVFBRoxIgRTfZ95JFHtGHDBq1atcq/7osvvlBSUpJ27typCy64oEW/LgBoCZFODwAArWnQoEEBj48cOaJZs2bpb3/7m/bt26e6ujpVV1f7rwB+8MEHcrlcSktLa/Z8mzZt0po1a/xXBBv77LPPCEAAIYkABGCUtm3bBjy+//77tWrVKj311FM6//zz5fF4NHbsWNXW1kqSPB7PCc/n8/k0evRoPfHEE022denSpeUGB4AWRAACCEvR0dGqr68/6X7r1q3T7bffrptuukmSVFlZqT179vi39+vXTz6fT0VFRc0+BTxgwAD96U9/Us+ePRUZyV+pAM4O3AQCICz17NlTGzZs0J49e3TgwAH5fL5m9zv//PO1fPlyffDBB9q6davGjRsXsG/Pnj01ceJE3XHHHXrzzTe1e/durV27Vq+99pokacqUKTp48KBuvfVW/etf/9KuXbu0evVq3XHHHacUoADgBAIQQFi677775HK5dNFFF+ncc88NuKu3sT/84Q/q0KGDhgwZotGjR+uaa67RgAEDAvZZsGCBxo4dq8mTJ6t379666667dOTIEUlSYmKi3n33XdXX1+uaa65R3759NXXqVMXHxysigr9iAYQm7gIGAAAwDP88BQAAMAwBCAAAYBgCEAAAwDAEIAAAgGEIQAAAAMMQgAAAAIYhAAEAAAxDAAIAABiGAAQAADAMAQgAAGAYAhAAAMAwBCAAAIBh/h+8TUXwnUnBEAAAAABJRU5ErkJggg==", + "text/html": [ "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'mpl-toolbar';\n", - " this.root.appendChild(toolbar);\n", + "
\n", + "
\n", + " Figure\n", + "
\n", + " \n", + "
\n", + " " + ], + "text/plain": [ + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[(array([[0.]]),\n", + " )]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from stride import Shot\n", + "from stride.utils import wavelets\n", + "\n", + "# Create shot\n", + "source = problem.geometry.locations[0]\n", + "receivers = problem.geometry.locations\n", + "\n", + "shot = Shot(id=0,\n", + " sources=[source], receivers=receivers,\n", + " geometry=problem.geometry, problem=problem)\n", + "\n", + "# and add it to the acquisition\n", + "problem.acquisitions.add(shot)\n", + "\n", + "# Create a wavelet for the shot\n", + "f_centre = 0.50e6\n", + "n_cycles = 3\n", + "\n", + "shot.wavelets.data[0] = wavelets.tone_burst(f_centre, n_cycles, time.num, time.step)\n", + "\n", + "# Plot the generated wavelet\n", + "shot.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "guilty-information", + "metadata": {}, + "source": [ + "Because we are going to run the acoustic modelling using constant density and no attenuation, the only thing that remains is creating a sound-speed scalar field." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "legislative-football", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2dfe819a48a54067b9ffac900d5e1b1d", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABH9ElEQVR4nO3dfXRU1b3/8c+RPPCUjAZMJvkZMNWIPAsEQwAliASCAStdKoK5oNyoVxERkJbSStplE6W3iDUtKqWAEortVfnVagNBBeQXedQoBC6iBoiWEMoNeUBIMHN+f1DOZUzCkEzCZM68X2vttZhz9j7z3cQ2X7777HMM0zRNAQAAIGBc4esAAAAAcHmRAAIAAAQYEkAAAIAAQwIIAAAQYEgAAQAAAgwJIAAAQIAhAQQAAAgwJIAAAAABhgQQAAAgwJAAAgAABBgSQAAAgABDAggAABBgSAABAAACDAkgAABAgCEBBAAACDAkgAAAAAGGBBAAACDAkAACAAAEGBJAAACAAEMCCAAAEGBIAAEAAAIMCSAAAECAIQEEAAAIMCSAAAAAAYYEEAAAIMCQAAIAAAQYEkAAAIAAQwIIAAAQYEgAAQAAAgwJIAAAQIAhAQQAAAgwJIAAAAABhgQQAAAgwJAAAgAABBgSQAAAgABDAggAABBgSAABAAACDAkgAABAgCEBBAAACDAkgACaZN26dTIMQ++99169c0uXLpVhGPrss880bdo0de7cWUVFRRo1apQ6deqkq6++WjNmzNC3337rg8gBAOeRAAJokrS0NEVGRmrFihX1zq1cuVIDBw5Uv379JElnz57VuHHjNGrUKK1bt04zZszQyy+/rHvvvfdyhw0AuECQrwMA4F+CgoJ0//33a+nSpaqoqJDD4ZAk7d+/Xzt27NCLL75o9a2trdWcOXM0c+ZMSdLo0aMVHBysBQsW6P/9v/+nYcOG+WQOABDoqAACaLIHH3xQp0+f1uuvv24dW7FihUJDQzV58mS3vlOmTHH7fP78Bx980PqBAgAaRAIIoMl69+6twYMHW8vAdXV1Wr16te68805FRERY/YKCgtSlSxe3sU6nU5J04sSJyxcwAMANCSCAZnnggQe0bds27d+/X3l5eTp69KgeeOABtz7fffddvUSvtLRUkuolhgCAy4cEEECz3HfffWrfvr1WrlyplStX6v/8n/+jlJSUev1yc3PdPq9Zs0aSlJycfDnCBAA0gE0gAJrlyiuv1F133aWVK1fq5MmTmjt3rq64wv3flCEhIfrNb36j6upqDR48WAUFBXrmmWeUmpqq4cOH+yhyAAAVQADN9sADD6isrEy1tbWaNm1avfPBwcH629/+pvz8fN1555367W9/q4yMDP3lL3+5/MECACxUAAE02+jRo2Wa5kX79O3blx2/ANDGUAEEAAAIMCSAAAAAAcYwPa3fAAAAwFaoAAIAAK9s2bJF48ePV0xMjAzD0Lp16+r12b9/vyZMmCCHw6GwsDANGTJER44csc4nJyfLMAy3NmnSJLdrlJeXKz09XQ6HQw6HQ+np6Tp58mQrz86eSAABAIBXTp06pf79+ysnJ6fB819++aWGDx+uG2+8UZs2bdKnn36qn//852rfvr1bv4yMDB09etRqL7/8stv5yZMnq7CwUHl5ecrLy1NhYaHS09NbbV52xhIwAABoMYZh6K233tIPf/hD69ikSZMUHBys1157rdFxycnJuummm7RkyZIGz+/fv1+9evXStm3blJiYKEnatm2bkpKS9N///d/q0aNHS07D9qgAAgCAVuNyufTOO+/ohhtu0JgxYxQZGanExMQGl4lzc3PVtWtX9e7dW3PnzlVVVZV17qOPPpLD4bCSP0kaMmSIHA6HCgoKLsdUbIXnAHrB5XLpH//4h8LCwmQYhq/DAQC0YaZpqqqqSjExMfXemtOSzpw5o9raWq+vY5pmvd9toaGhCg0NbdJ1ysrKVF1drWeffVbPPPOMnnvuOeXl5WnixIn64IMPNGLECEnSlClTFBcXJ6fTqb1792r+/Pn69NNPlZ+fL+nce8QjIyPrXT8yMtJ6xzguHQmgF/7xj38oNjbW12EAAPxISUmJrrnmmla59pkzZxTXvbNKy+q8vlbnzp1VXV3tdmzhwoXKzMxs0nVcLpck6c4779STTz4pSbrppptUUFCgl156yUoAMzIyrDF9+vRRfHy8EhIS9PHHH2vgwIGS1GCxpaFEFZ6RAHohLCxMknRN5s90xfduZAUA4EKuM2f0deYz1u+O1lBbW6vSsjoV7+6u8LDmVxkrq1yKG3RYJSUlCg8Pt443tfonSV27dlVQUJB69erldrxnz57aunVro+MGDhyo4OBgHTx4UAMHDpTT6dSxY8fq9Tt+/LiioqKaHFegIwH0wvl/cVzRvj0JIADgklyOalWnzudac9X9a3toeHi4WwLYHCEhIRo8eLAOHDjgdvzzzz9X9+7dGx1XVFSks2fPKjo6WpKUlJSkiooK7dixQzfffLMkafv27aqoqNDQoUO9ijEQkQACAACvVFdX64svvrA+FxcXq7CwUBEREerWrZueeuop3Xvvvbr11ls1cuRI5eXl6e2339amTZsknXtMTG5ursaNG6euXbtq3759mjNnjgYMGKBhw4ZJOlcxHDt2rDIyMqzHwzz00ENKS0tjB3AzsAsYAACbccn0ujXFrl27NGDAAA0YMECSNHv2bA0YMEBPP/20JOmuu+7SSy+9pEWLFqlv3776wx/+oDfeeEPDhw+XdK5K+N5772nMmDHq0aOHZs6cqZSUFG3cuFHt2rWzvic3N1d9+/ZVSkqKUlJS1K9fv4s+WgaN4zmAXqisrJTD4VC3Z59hCRgAcFGuM2d05Cc/U0VFhdfLqo05/3vpHweu8foewJgeX7dqrPAtKoAAAAABhnsAAQCwmTrTVJ0XC3zejIV/IAEEAMBmmnMf3/fHw95YAgYAAAgwVAABALAZl0zVUQHERZAAAgBgMywBwxOWgAEAAAIMFUAAAGyGXcDwhAQQAACbcf2reTMe9kYCCACAzdR5uQnEm7HwD9wDCAAAEGCoAAIAYDN15rnmzXjYGwkgAAA2wz2A8IQlYAAAgABDBRAAAJtxyVCdDK/Gw95IAAEAsBmXea55Mx72xhIwAABAgKECCACAzdR5uQTszVj4BxJAAABshgQQnrAEDAAAEGCoAAIAYDMu05DL9GIXsBdj4R9IAAEAsBmWgOEJCSAAADZTpytU58VdXnUtGAvaJu4BBAAACDBUAAEAsBnTy3sATe4BtD0SQAAAbIZ7AOEJS8AAAAABhgogAAA2U2deoTrTi00gvAvY9kgAAQCwGZcMubxY5HOJDNDuWAIGAAAIMFQAAQCwGTaBwBMSQAAAbMb7ewBZArY7loABAAACDBVAAABs5twmkOYv43ozFv7BthXAa6+9VoZh1GuPPfaYJMk0TWVmZiomJkYdOnRQcnKyioqKfBw1AADec/3rXcDNbd7sIIZ/sO1PeOfOnTp69KjV8vPzJUl33323JGnRokVavHixcnJytHPnTjmdTo0ePVpVVVW+DBsAAK+dvwfQmwZ7s+1P+Oqrr5bT6bTa3/72N1133XUaMWKETNPUkiVLtGDBAk2cOFF9+vTRqlWr9O2332rNmjW+Dh0AAKBV2TYBvFBtba1Wr16tBx98UIZhqLi4WKWlpUpJSbH6hIaGasSIESooKGj0OjU1NaqsrHRrAAC0Na5/LeN602BvAfETXrdunU6ePKlp06ZJkkpLSyVJUVFRbv2ioqKscw3Jzs6Ww+GwWmxsbKvFDABAc9WZhtcN9hYQCeDy5cuVmpqqmJgYt+OG4f4fuGma9Y5daP78+aqoqLBaSUlJq8QLAADQmmz/GJjDhw9r48aNevPNN61jTqdT0rlKYHR0tHW8rKysXlXwQqGhoQoNDW29YAEAaAHnd/M2fzwPgrY721cAV6xYocjISN1xxx3Wsbi4ODmdTmtnsHTuPsHNmzdr6NChvggTAIAW4zKv8LrB3mxdAXS5XFqxYoWmTp2qoKD/naphGJo1a5aysrIUHx+v+Ph4ZWVlqWPHjpo8ebIPIwYAAGh9tk4AN27cqCNHjujBBx+sd27evHk6ffq0Hn30UZWXlysxMVEbNmxQWFiYDyIFAKDlsAQMT2ydAKakpMhs5IXWhmEoMzNTmZmZlzcoAABamUvyaievq+VCQRvFIj8AAECAsXUFEACAQOTtw5x5ELT9kQACAGAz3r7Pl3cB2x8JIAAANuOSIZe8uQeQN4HYHSk+AABAgKECCACAzbAEDE/4CQMAYDPnnwPoTWuKLVu2aPz48YqJiZFhGFq3bl29Pvv379eECRPkcDgUFhamIUOG6MiRI9b5mpoaPf744+ratas6deqkCRMm6Ouvv3a7Rnl5udLT0+VwOORwOJSenq6TJ082568o4JEAAgAAr5w6dUr9+/dXTk5Og+e//PJLDR8+XDfeeKM2bdqkTz/9VD//+c/Vvn17q8+sWbP01ltvae3atdq6dauqq6uVlpamuro6q8/kyZNVWFiovLw85eXlqbCwUOnp6a0+PztiCRgAAJtxmYZc3jwIuoljU1NTlZqa2uj5BQsWaNy4cVq0aJF17Ac/+IH154qKCi1fvlyvvfaabr/9dknS6tWrFRsbq40bN2rMmDHav3+/8vLytG3bNiUmJkqSli1bpqSkJB04cEA9evRoUsyBjgogAAA24/Jy+ff8cwArKyvdWk1NTdNjcbn0zjvv6IYbbtCYMWMUGRmpxMREt2Xi3bt36+zZs0pJSbGOxcTEqE+fPiooKJAkffTRR3I4HFbyJ0lDhgyRw+Gw+uDSkQACAIAGxcbGWvfbORwOZWdnN/kaZWVlqq6u1rPPPquxY8dqw4YNuuuuuzRx4kRt3rxZklRaWqqQkBBdddVVbmOjoqJUWlpq9YmMjKx3/cjISKsPLh1LwAAA2IzLvEIuL3bynh9bUlKi8PBw63hoaGjTr+U692bhO++8U08++aQk6aabblJBQYFeeukljRgxotGxpmnKMP53OfrCPzfWB5eGCiAAADZTJ8PrJknh4eFurTkJYNeuXRUUFKRevXq5He/Zs6e1C9jpdKq2tlbl5eVufcrKyhQVFWX1OXbsWL3rHz9+3OqDS0cCCAAAWk1ISIgGDx6sAwcOuB3//PPP1b17d0nSoEGDFBwcrPz8fOv80aNHtXfvXg0dOlSSlJSUpIqKCu3YscPqs337dlVUVFh9cOlYAgYAwGZaagn4UlVXV+uLL76wPhcXF6uwsFARERHq1q2bnnrqKd1777269dZbNXLkSOXl5entt9/Wpk2bJEkOh0PTp0/XnDlz1KVLF0VERGju3Lnq27evtSu4Z8+eGjt2rDIyMvTyyy9Lkh566CGlpaWxA7gZSAABALCZOslaxm3u+KbYtWuXRo4caX2ePXu2JGnq1KlauXKl7rrrLr300kvKzs7WzJkz1aNHD73xxhsaPny4Neb5559XUFCQ7rnnHp0+fVqjRo3SypUr1a5dO6tPbm6uZs6cae0WnjBhQqPPHsTFGaZpmr4Owl9VVlbK4XCo27PP6IoLHmYJAMD3uc6c0ZGf/EwVFRVuGyta0vnfSz/blqL2nYObfZ0z1Wf1zJANrRorfIt7AAEAAAIMS8AAANhMnXmF6ry4B9CbsfAPJIAAANiMKUMuL+4BNL0YC/9Aig8AABBgqAACAGAzLAHDExJAAABsxmUacpnNX8b1Ziz8Ayk+AABAgKECCACAzdTpCtV5UePxZiz8AwkgAAA2wxIwPCHFBwAACDBUAAEAsBmXrpDLixqPN2PhH0gAAQCwmTrTUJ0Xy7jejIV/IAEEAMBmuAcQnlDjBQAACDBUAAEAsBnTvEIuL97mYfImENsjAQQAwGbqZKhOXtwD6MVY+AdSfAAAgABDBRAAAJtxmd5t5HCZLRgM2iRbVwC/+eYb3X///erSpYs6duyom266Sbt377bOm6apzMxMxcTEqEOHDkpOTlZRUZEPIwYAwHuuf90D6E2Dvdn2J1xeXq5hw4YpODhYf//737Vv3z795je/0ZVXXmn1WbRokRYvXqycnBzt3LlTTqdTo0ePVlVVle8CBwAAaGW2XQJ+7rnnFBsbqxUrVljHrr32WuvPpmlqyZIlWrBggSZOnChJWrVqlaKiorRmzRo9/PDDlztkAABahEuGXF5s5PBmLPyDbSuAf/3rX5WQkKC7775bkZGRGjBggJYtW2adLy4uVmlpqVJSUqxjoaGhGjFihAoKCnwRMgAALeL8m0C8abA32yaAX331lZYuXar4+HitX79ejzzyiGbOnKlXX31VklRaWipJioqKchsXFRVlnfu+mpoaVVZWujUAAAB/Y9slYJfLpYSEBGVlZUmSBgwYoKKiIi1dulT/9m//ZvUzDPd/5ZimWe/YednZ2frFL37RekEDANACvN3IwSYQ+7PtTzg6Olq9evVyO9azZ08dOXJEkuR0OiWpXrWvrKysXlXwvPnz56uiosJqJSUlrRA5AADeccmw3gfcrMY9gLZn2wRw2LBhOnDggNuxzz//XN27d5ckxcXFyel0Kj8/3zpfW1urzZs3a+jQoQ1eMzQ0VOHh4W4NAIC2xvzXJpDmNpME0PZsuwT85JNPaujQocrKytI999yjHTt26JVXXtErr7wi6dzS76xZs5SVlaX4+HjFx8crKytLHTt21OTJk30cPQAAQOuxbQI4ePBgvfXWW5o/f75++ctfKi4uTkuWLNGUKVOsPvPmzdPp06f16KOPqry8XImJidqwYYPCwsJ8GDkAAN45v5TrzXjYm20TQElKS0tTWlpao+cNw1BmZqYyMzMvX1AAALQyNoHAE37CAAAAAcbWFUAAAAIRS8DwhAQQAACb4VVw8IQlYAAAgABDBRAAAJthCRiekAACAGAzJIDwhCVgAACAAEMFEAAAm6ECCE9IAAEAsBkSQHhCAggAgM2Y8u5RLmbLhYI2insAAQAAAgwVQAAAbIYlYHhCAggAgM2QAMITloABAAACDBVAAABshgogPCEBBADAZkgA4QlLwAAAAAGGCiAAADZjmoZML6p43oyFfyABBADAZlwyvHoQtDdj4R9YAgYAAAgwVAABALAZNoHAEyqAAADYzPl7AL1pTbFlyxaNHz9eMTExMgxD69atczs/bdo0GYbh1oYMGeLWJzk5uV6fSZMmufUpLy9Xenq6HA6HHA6H0tPTdfLkyeb8FQU8EkAAAGzmfAXQm9YUp06dUv/+/ZWTk9Non7Fjx+ro0aNWe/fdd+v1ycjIcOvz8ssvu52fPHmyCgsLlZeXp7y8PBUWFio9Pb1JseIcloABAIBXUlNTlZqaetE+oaGhcjqdF+3TsWPHRvvs379feXl52rZtmxITEyVJy5YtU1JSkg4cOKAePXo0L/gARQUQAACbudxLwJdi06ZNioyM1A033KCMjAyVlZXV65Obm6uuXbuqd+/emjt3rqqqqqxzH330kRwOh5X8SdKQIUPkcDhUUFDQ4vHaHRVAAABsxvRyE8j5BLCystLteGhoqEJDQ5t8vdTUVN19993q3r27iouL9fOf/1y33Xabdu/ebV1vypQpiouLk9Pp1N69ezV//nx9+umnys/PlySVlpYqMjKy3rUjIyNVWlra5JgCHQkgAABoUGxsrNvnhQsXKjMzs8nXuffee60/9+nTRwkJCerevbveeecdTZw4UdK5+/8u7BMfH6+EhAR9/PHHGjhwoCTJMOontaZpNngcF0cCCACAzZiSTNO78ZJUUlKi8PBw63hzqn8NiY6OVvfu3XXw4MFG+wwcOFDBwcE6ePCgBg4cKKfTqWPHjtXrd/z4cUVFRbVIXIGEewABALCZ828C8aZJUnh4uFtrqQTwxIkTKikpUXR0dKN9ioqKdPbsWatPUlKSKioqtGPHDqvP9u3bVVFRoaFDh7ZIXIGECiAAAPBKdXW1vvjiC+tzcXGxCgsLFRERoYiICGVmZupHP/qRoqOjdejQIf30pz9V165dddddd0mSvvzyS+Xm5mrcuHHq2rWr9u3bpzlz5mjAgAEaNmyYJKlnz54aO3asMjIyrMfDPPTQQ0pLS2MHcDOQAAIAYDPe7uRt6thdu3Zp5MiR1ufZs2dLkqZOnaqlS5dqz549evXVV3Xy5ElFR0dr5MiRev311xUWFiZJCgkJ0XvvvacXXnhB1dXVio2N1R133KGFCxeqXbt21nVzc3M1c+ZMpaSkSJImTJhw0WcPonEkgAAA2IzLNGRcxlfBJScny7zITYfr16+/6PjY2Fht3rzZ4/dERERo9erVTYoNDeMeQAAAgABDBRAAAJsxTS93AXsxFv6BBBAAAJu53PcAwv+QAAIAYDMkgPDEtvcAZmZmyjAMt3bhC6ZN01RmZqZiYmLUoUMHJScnq6ioyIcRAwAAXB62TQAlqXfv3jp69KjV9uzZY51btGiRFi9erJycHO3cuVNOp1OjR492e/E0AAD+yPWvdwF702Bvtl4CDgoKcqv6nWeappYsWaIFCxZY7yBctWqVoqKitGbNGj388MOXO1QAAFoMm0Dgia0rgAcPHlRMTIzi4uI0adIkffXVV5LOPaG8tLTUepCkdO79hiNGjFBBQUGj16upqVFlZaVbAwAA8De2TQATExP16quvav369Vq2bJlKS0s1dOhQnThxQqWlpZJU7+XRUVFR1rmGZGdny+FwWC02NrZV5wAAQHOcqwAaXjRfzwCtzbZLwKmpqdaf+/btq6SkJF133XVatWqVhgwZIkkyDPd7HEzTrHfsQvPnz7debyNJlZWVJIEAgDaHXcDwxLYVwO/r1KmT+vbtq4MHD1r3BX6/2ldWVlavKnih0NBQhYeHuzUAAAB/EzAJYE1Njfbv36/o6GjFxcXJ6XQqPz/fOl9bW6vNmzdr6NChPowSAADvmS3QYG+2XQKeO3euxo8fr27duqmsrEzPPPOMKisrNXXqVBmGoVmzZikrK0vx8fGKj49XVlaWOnbsqMmTJ/s6dAAAvMISMDyxbQL49ddf67777tM///lPXX311RoyZIi2bdum7t27S5LmzZun06dP69FHH1V5ebkSExO1YcMGhYWF+ThyAACA1mXbBHDt2rUXPW8YhjIzM5WZmXl5AgIA4HLxdh2XNWDbs20CCABAwPJyCVgsAdseCSAAADbDm0DgScDsAgYAAMA5VAABALAZdgHDExJAAADsxjS8u4+PBND2WAIGAAAIMFQAAQCwGTaBwBMSQAAA7IbnAMIDloABAAACDBVAAABshl3A8IQEEAAAO2IZFxfBEjAAAECAoQIIAIDNsAQMT0gAAQCwG3YBwwMSQAAAbMf4V/NmPOyMewABAAACDBVAAADshiVgeNDmEsCSkhIdOnRI3377ra6++mr17t1boaGhvg4LAAD/QQIID9pEAnj48GG99NJL+tOf/qSSkhKZF7yEMCQkRLfccoseeugh/ehHP9IVV7BqDQAA4A2fZ1NPPPGE+vbtq4MHD+qXv/ylioqKVFFRodraWpWWlurdd9/V8OHD9fOf/1z9+vXTzp07fR0yAABtm2l432BrPq8AhoSE6Msvv9TVV19d71xkZKRuu+023XbbbVq4cKHeffddHT58WIMHD/ZBpAAA+AfTPNe8GQ9783kC+Otf//qS+44bN64VIwEAAAgMPk8AAQBAC2MTCDxoUwngiRMn9PTTT+uDDz5QWVmZXC6X2/n/+Z//8VFkAAD4EW/v4+MeQNtrUwng/fffry+//FLTp09XVFSUDIP/AAEAAFpam0oAt27dqq1bt6p///6+DgUAAL9lmOeaN+Nhb20qAbzxxht1+vRpX4cBAIB/4x5AeODz5wBe6Pe//70WLFigzZs368SJE6qsrHRrAADgEvAcQHjQpiqAV155pSoqKnTbbbe5HTdNU4ZhqK6uzkeRAQAA2EebSgCnTJmikJAQrVmzhk0gAAA0F0vA8KBNJYB79+7VJ598oh49evg6FAAA/BcJIDxoU/cAJiQkqKSkxNdhAAAA2FqbqgA+/vjjeuKJJ/TUU0+pb9++Cg4Odjvfr18/H0UGAIAfoQIID9pUAnjvvfdKkh588EHrmGEYbAIBAKApeBMIPGhTCWBxcbGvQwAAALC9NnUPYPfu3S/amis7O1uGYWjWrFnWMdM0lZmZqZiYGHXo0EHJyckqKipqgVkAAOBb598E4k2DvbWpBFCSvvnmG/35z39WTk6Ofvvb37q15ti5c6deeeWVevcPLlq0SIsXL1ZOTo527twpp9Op0aNHq6qqqiWmAQCA75gt0Jpgy5YtGj9+vGJiYmQYhtatW+d2ftq0aTIMw60NGTLErU9NTY0ef/xxde3aVZ06ddKECRP09ddfu/UpLy9Xenq6HA6HHA6H0tPTdfLkyaYFC0ltbAl4xYoVeuSRRxQSEqIuXbq4PQfQMAzNnDmzSderrq7WlClTtGzZMj3zzDPWcdM0tWTJEi1YsEATJ06UJK1atUpRUVFas2aNHn744ZaZEAAAAeDUqVPq37+/HnjgAf3oRz9qsM/YsWO1YsUK63NISIjb+VmzZuntt9/W2rVr1aVLF82ZM0dpaWnavXu32rVrJ0maPHmyvv76a+Xl5UmSHnroIaWnp+vtt99upZnZV5tKAJ9++mk9/fTTmj9/vq64wvvi5GOPPaY77rhDt99+u1sCWFxcrNLSUqWkpFjHQkNDNWLECBUUFDSaANbU1Kimpsb6zOvpAACQUlNTlZqaetE+oaGhcjqdDZ6rqKjQ8uXL9dprr+n222+XJK1evVqxsbHauHGjxowZo/379ysvL0/btm1TYmKiJGnZsmVKSkrSgQMHeIZwE7WpJeBvv/1WkyZNapHkb+3atfr444+VnZ1d71xpaakkKSoqyu14VFSUda4h2dnZVtnZ4XAoNjbW6zgBAGhphry8B/Bf16msrHRrFxZBmmrTpk2KjIzUDTfcoIyMDJWVlVnndu/erbNnz7oVZmJiYtSnTx8VFBRIkj766CM5HA4r+ZOkIUOGyOFwWH1w6dpUAjh9+nT95S9/8fo6JSUleuKJJ7R69Wq1b9++0X7ff9Xc+cfNNGb+/PmqqKiwGg+tBgC0SecfA+NNkxQbG+tW+GioqHIpUlNTlZubq/fff1+/+c1vtHPnTt12221WQllaWqqQkBBdddVVbuMuLMyUlpYqMjKy3rUjIyMvWrxBw9rUEnB2drbS0tKUl5fX4IOgFy9efEnX2b17t8rKyjRo0CDrWF1dnbZs2aKcnBwdOHBA0rn/mKKjo60+ZWVl9aqCFwoNDVVoaGhTpgQAgN8qKSlReHi49bm5vwPPP+dXkvr06aOEhAR1795d77zzjnUvfkO+X5hpqEjjqXiDhrWpBDArK0vr16+31vE9/dAbM2rUKO3Zs8ft2AMPPKAbb7xRP/7xj/WDH/xATqdT+fn5GjBggCSptrZWmzdv1nPPPdcCMwEAwIda6E0g4eHhbglgS4mOjlb37t118OBBSZLT6VRtba3Ky8vdqoBlZWUaOnSo1efYsWP1rnX8+PGLFm/QsDaVAC5evFh//OMfNW3aNK+uExYWpj59+rgd69Spk7p06WIdnzVrlrKyshQfH6/4+HhlZWWpY8eOmjx5slffDQCAz7XxV8GdOHFCJSUl1ircoEGDFBwcrPz8fN1zzz2SpKNHj2rv3r1atGiRJCkpKUkVFRXasWOHbr75ZknS9u3bVVFRYSWJuHRtKgEMDQ3VsGHDLst3zZs3T6dPn9ajjz6q8vJyJSYmasOGDQoLC7ss3w8AgF1UV1friy++sD4XFxersLBQERERioiIUGZmpn70ox8pOjpahw4d0k9/+lN17dpVd911lyTJ4XBo+vTpmjNnjrp06aKIiAjNnTtXffv2tXYF9+zZU2PHjlVGRoZefvllSeceA5OWlsYO4GZoUwngE088oRdffLHZD32+mE2bNrl9NgxDmZmZyszMbPHvAgDAl7x9m0dTx+7atUsjR460Ps+ePVuSNHXqVC1dulR79uzRq6++qpMnTyo6OlojR47U66+/7lZ0ef755xUUFKR77rlHp0+f1qhRo7Ry5UrrGYCSlJubq5kzZ1q7hSdMmKCcnJzmTzSAtakEcMeOHXr//ff1t7/9Tb179663CeTNN9/0UWQAAPiRy7wEnJycLNNsfND69es9XqN9+/Z68cUX9eKLLzbaJyIiQqtXr25acGhQm0oAr7zyyovuBgIAAID32lQCeOErYgAAQDO18U0g8L02lQACAADvXe57AOF/fP4mkLFjx17SK1yqqqr03HPP6Xe/+91liAoAAMC+fF4BvPvuu3XPPfcoLCxMEyZMUEJCgmJiYtS+fXuVl5dr37592rp1q959912lpaXp17/+ta9DBgCgbbvgdW7NHg9b83kCOH36dKWnp+u//uu/9Prrr2vZsmU6efKkpHOPaunVq5fGjBmj3bt385wfAAAuBfcAwgOfJ4CSFBISosmTJ1tv4aioqNDp06fVpUuXeo+CAQAAF8c9gPCkTSSA3+dwOORwOHwdBgAAgC21yQQQAAB4gSVgeEACCACA3Xi5BEwCaH8+fwwMAAAALi8qgAAA2A1LwPCgTVUAp02bpi1btvg6DAAA/JvZAg221qYSwKqqKqWkpCg+Pl5ZWVn65ptvfB0SAACA7bSpBPCNN97QN998oxkzZugvf/mLrr32WqWmpuq//uu/dPbsWV+HBwCAXzj/HEBvGuytTSWAktSlSxc98cQT+uSTT7Rjxw5df/31Sk9PV0xMjJ588kkdPHjQ1yECAAD4tTaXAJ539OhRbdiwQRs2bFC7du00btw4FRUVqVevXnr++ed9HR4AAG0X9wDCgzaVAJ49e1ZvvPGG0tLS1L17d/3lL3/Rk08+qaNHj2rVqlXasGGDXnvtNf3yl7/0dagAAAB+q009BiY6Oloul0v33XefduzYoZtuuqlenzFjxujKK6+87LEBAOAveBcwPGlTCeDzzz+vu+++W+3bt2+0z1VXXaXi4uLLGBUAAH6IJA4X0aYSwPT0dF+HAAAAYHttKgEEAAAtgDeBwAMSQAAAbIZ7AOFJm9oFDAAAgNZHBRAAALthCRgekAACAGAzLAHDE5aAAQAAAgwVQAAA7IYlYHhAAggAgN2QAMIDEkAAAGyGewDhCfcAAgAABBgqgAAA2A1LwPCABBAAALshAYQHLAEDAAAEGNsmgEuXLlW/fv0UHh6u8PBwJSUl6e9//7t13jRNZWZmKiYmRh06dFBycrKKiop8GDEAAC3j/CYQbxrszbYJ4DXXXKNnn31Wu3bt0q5du3TbbbfpzjvvtJK8RYsWafHixcrJydHOnTvldDo1evRoVVVV+ThyAAC8ZLZAg63ZNgEcP368xo0bpxtuuEE33HCDfvWrX6lz587atm2bTNPUkiVLtGDBAk2cOFF9+vTRqlWr9O2332rNmjW+Dh0AAKBV2TYBvFBdXZ3Wrl2rU6dOKSkpScXFxSotLVVKSorVJzQ0VCNGjFBBQYEPIwUAwHssAcMTW+8C3rNnj5KSknTmzBl17txZb731lnr16mUleVFRUW79o6KidPjw4UavV1NTo5qaGutzZWVl6wQOAIA32AUMD2xdAezRo4cKCwu1bds2/cd//IemTp2qffv2WecNw3Drb5pmvWMXys7OlsPhsFpsbGyrxQ4AANBabJ0AhoSE6Prrr1dCQoKys7PVv39/vfDCC3I6nZKk0tJSt/5lZWX1qoIXmj9/vioqKqxWUlLSqvEDANAsbAKBB7ZOAL/PNE3V1NQoLi5OTqdT+fn51rna2lpt3rxZQ4cObXR8aGio9ViZ8w0AgLbGaIEGe7PtPYA//elPlZqaqtjYWFVVVWnt2rXatGmT8vLyZBiGZs2apaysLMXHxys+Pl5ZWVnq2LGjJk+e7OvQAQDwDvcAwgPbJoDHjh1Tenq6jh49KofDoX79+ikvL0+jR4+WJM2bN0+nT5/Wo48+qvLyciUmJmrDhg0KCwvzceQAAACty7YJ4PLlyy963jAMZWZmKjMz8/IEBADAZeLto1x4DIz92TYBBAAgYLEEDA8CahMIAAAAqAACAGBPVPFwESSAAADYDPcAwhOWgAEAAAIMFUAAAOyGTSDwgAogAAA2c34J2JvWFFu2bNH48eMVExMjwzC0bt26Rvs+/PDDMgxDS5YscTuenJwswzDc2qRJk9z6lJeXKz09XQ6HQw6HQ+np6Tp58mTTgoUkEkAAAOClU6dOqX///srJyblov3Xr1mn79u2KiYlp8HxGRoaOHj1qtZdfftnt/OTJk1VYWKi8vDzl5eWpsLBQ6enpLTaPQMISMAAAdnOZl4BTU1OVmpp60T7ffPONZsyYofXr1+uOO+5osE/Hjh3ldDobPLd//37l5eVp27ZtSkxMlCQtW7ZMSUlJOnDggHr06NG0oAMcFUAAAGympZaAKysr3VpNTU2z4nG5XEpPT9dTTz2l3r17N9ovNzdXXbt2Ve/evTV37lxVVVVZ5z766CM5HA4r+ZOkIUOGyOFwqKCgoFlxBTIqgAAA2E0LVQBjY2PdDi9cuLBZr1B97rnnFBQUpJkzZzbaZ8qUKYqLi5PT6dTevXs1f/58ffrpp8rPz5cklZaWKjIyst64yMhIlZaWNjmmQEcCCAAAGlRSUqLw8HDrc2hoaJOvsXv3br3wwgv6+OOPZRhGo/0yMjKsP/fp00fx8fFKSEjQxx9/rIEDB0pSg+NN07zoddEwloABALAbswWapPDwcLfWnATwww8/VFlZmbp166agoCAFBQXp8OHDmjNnjq699tpGxw0cOFDBwcE6ePCgJMnpdOrYsWP1+h0/flxRUVFNjivQUQEEAMBm2tKbQNLT03X77be7HRszZozS09P1wAMPNDquqKhIZ8+eVXR0tCQpKSlJFRUV2rFjh26++WZJ0vbt21VRUaGhQ4e2XMABggQQAAB4pbq6Wl988YX1ubi4WIWFhYqIiFC3bt3UpUsXt/7BwcFyOp3Wzt0vv/xSubm5GjdunLp27ap9+/Zpzpw5GjBggIYNGyZJ6tmzp8aOHauMjAzr8TAPPfSQ0tLS2AHcDCwBAwBgNy20BHypdu3apQEDBmjAgAGSpNmzZ2vAgAF6+umnL2l8SEiI3nvvPY0ZM0Y9evTQzJkzlZKSoo0bN6pdu3ZWv9zcXPXt21cpKSlKSUlRv3799NprrzUtWEiiAggAgO0YpinDbP46blPHJicny2zCmEOHDrl9jo2N1ebNmz2Oi4iI0OrVq5sUGxpGBRAAACDAUAEEAMBuLvObQOB/SAABALCZtrQLGG0TS8AAAAABhgogAAB2wxIwPCABBADAZlgChickgAAA2A0VQHjAPYAAAAABhgogAAA2wxIwPCEBBADAblgChgcsAQMAAAQYKoAAANgQy7i4GBJAAADsxjTPNW/Gw9ZYAgYAAAgwVAABALAZdgHDExJAAADshl3A8IAlYAAAgABDBRAAAJsxXOeaN+NhbySAAADYDUvA8MC2S8DZ2dkaPHiwwsLCFBkZqR/+8Ic6cOCAWx/TNJWZmamYmBh16NBBycnJKioq8lHEAAC0jPObQLxpsDfbJoCbN2/WY489pm3btik/P1/fffedUlJSdOrUKavPokWLtHjxYuXk5Gjnzp1yOp0aPXq0qqqqfBg5AABA67LtEnBeXp7b5xUrVigyMlK7d+/WrbfeKtM0tWTJEi1YsEATJ06UJK1atUpRUVFas2aNHn74YV+EDQCA93gQNDywbQXw+yoqKiRJERERkqTi4mKVlpYqJSXF6hMaGqoRI0aooKCgwWvU1NSosrLSrQEA0NawBAxPAiIBNE1Ts2fP1vDhw9WnTx9JUmlpqSQpKirKrW9UVJR17vuys7PlcDisFhsb27qBAwAAtIKASABnzJihzz77TH/605/qnTMMw+2zaZr1jp03f/58VVRUWK2kpKRV4gUAwCtmCzTYmm3vATzv8ccf11//+ldt2bJF11xzjXXc6XRKOlcJjI6Oto6XlZXVqwqeFxoaqtDQ0NYNGAAAL/EqOHhi2wqgaZqaMWOG3nzzTb3//vuKi4tzOx8XFyen06n8/HzrWG1trTZv3qyhQ4de7nABAAAuG9tWAB977DGtWbNG//f//l+FhYVZ9/U5HA516NBBhmFo1qxZysrKUnx8vOLj45WVlaWOHTtq8uTJPo4eAAAvsAsYHtg2AVy6dKkkKTk52e34ihUrNG3aNEnSvHnzdPr0aT366KMqLy9XYmKiNmzYoLCwsMscLQAALYclYHhi2wTQvIR/vRiGoczMTGVmZrZ+QAAAAG2EbRNAAAACFu8ChgckgAAA2AxLwPCEBBAAALtxmeeaN+Nha7Z9DAwAAAAaRgUQAAC74R5AeEACCACAzRjy8h7AFosEbRVLwAAAAAGGCiAAAHbDm0DgAQkgAAA2w2Ng4AlLwAAAAAGGCiAAAHbDLmB4QAIIAIDNGKYpw4v7+LwZC//AEjAAAECAoQIIAIDduP7VvBkPWyMBBADAZlgChickgAAA2A2bQOAB9wACAAAEGCqAAADYDW8CgQckgAAA2AxvAoEnLAEDAAAEGBJAAADs5vwSsDetCbZs2aLx48crJiZGhmFo3bp1jfZ9+OGHZRiGlixZ4na8pqZGjz/+uLp27apOnTppwoQJ+vrrr936lJeXKz09XQ6HQw6HQ+np6Tp58mSTYsU5JIAAANiM4fK+NcWpU6fUv39/5eTkXLTfunXrtH37dsXExNQ7N2vWLL311ltau3attm7dqurqaqWlpamurs7qM3nyZBUWFiovL095eXkqLCxUenp604KFJO4BBAAAXkpNTVVqaupF+3zzzTeaMWOG1q9frzvuuMPtXEVFhZYvX67XXntNt99+uyRp9erVio2N1caNGzVmzBjt379feXl52rZtmxITEyVJy5YtU1JSkg4cOKAePXq0zuRsigogAAB2c5mXgD1xuVxKT0/XU089pd69e9c7v3v3bp09e1YpKSnWsZiYGPXp00cFBQWSpI8++kgOh8NK/iRpyJAhcjgcVh9cOiqAAADYTQs9CLqystLtcGhoqEJDQ5t8ueeee05BQUGaOXNmg+dLS0sVEhKiq666yu14VFSUSktLrT6RkZH1xkZGRlp9cOmoAAIAgAbFxsZaGy4cDoeys7ObfI3du3frhRde0MqVK2UYRpPGmqbpNqah8d/vg0tDBRAAAJtpqXcBl5SUKDw83DrenOrfhx9+qLKyMnXr1s06VldXpzlz5mjJkiU6dOiQnE6namtrVV5e7lYFLCsr09ChQyVJTqdTx44dq3f948ePKyoqqslxBToqgAAA2E0L3QMYHh7u1pqTAKanp+uzzz5TYWGh1WJiYvTUU09p/fr1kqRBgwYpODhY+fn51rijR49q7969VgKYlJSkiooK7dixw+qzfft2VVRUWH1w6agAAgBgN6akJj7Kpd74JqiurtYXX3xhfS4uLlZhYaEiIiLUrVs3denSxa1/cHCwnE6ntXPX4XBo+vTpmjNnjrp06aKIiAjNnTtXffv2tXYF9+zZU2PHjlVGRoZefvllSdJDDz2ktLQ0dgA3AwkgAADwyq5duzRy5Ejr8+zZsyVJU6dO1cqVKy/pGs8//7yCgoJ0zz336PTp0xo1apRWrlypdu3aWX1yc3M1c+ZMa7fwhAkTPD57EA0jAQQAwGZa6h7AS5WcnCyzCWMOHTpU71j79u314osv6sUXX2x0XEREhFavXt2k2NAwEkAAAOzGlHfP8mvZxwCiDWITCAAAQIChAggAgN14+zaPFn4TCNoeEkAAAOzGJcmbZyN7s4MYfsG2S8BbtmzR+PHjFRMTI8MwtG7dOrfzpmkqMzNTMTEx6tChg5KTk1VUVOSbYAEAAC4j2yaAp06dUv/+/RvdHr5o0SItXrxYOTk52rlzp5xOp0aPHq2qqqrLHCkAAC3r/C5gbxrszbZLwKmpqUpNTW3wnGmaWrJkiRYsWKCJEydKklatWqWoqCitWbNGDz/88OUMFQCAlsU9gPDAthXAiykuLlZpaan1IEnp3PsNR4wYoYKCAh9GBgAA0PpsWwG8mNLSUkmq9/LoqKgoHT58uNFxNTU1qqmpsT5XVla2ToAAAHiDCiA8CMgK4HmG4b5FyjTNesculJ2dLYfDYbXY2NjWDhEAgKY7nwB602BrAZkAOp1OSf9bCTyvrKysXlXwQvPnz1dFRYXVSkpKWjVOAACaxdUCDbYWkAlgXFycnE6n8vPzrWO1tbXavHmzhg4d2ui40NBQhYeHuzUAAAB/Y9t7AKurq/XFF19Yn4uLi1VYWKiIiAh169ZNs2bNUlZWluLj4xUfH6+srCx17NhRkydP9mHUAAB4z9tHufAYGPuzbQK4a9cujRw50vo8e/ZsSdLUqVO1cuVKzZs3T6dPn9ajjz6q8vJyJSYmasOGDQoLC/NVyAAAtAw2gcAD2yaAycnJMi/yH7BhGMrMzFRmZublCwoAAKANsG0CCABAwHKZkuFFFc9FBdDuSAABALAbloDhQUDuAgYAAAhkVAABALAdbx/mTAXQ7kgAAQCwG5aA4QFLwAAAAAGGCiAAAHbjMuXVMi67gG2PBBAAALsxXeeaN+NhaySAAADYDfcAwgPuAQQAAAgwVAABALAb7gGEBySAAADYDUvA8IAlYAAAgABDBRAAALsx5WUFsMUiQRtFAggAgN2wBAwPWAIGAAAIMFQAAQCwG5dLkhcPc3bxIGi7IwEEAMBuWAKGBywBAwAABBgqgAAA2A0VQHhAAggAgN3wJhB4QAIIAIDNmKZLptn8jRzejIV/4B5AAACAAEMFEAAAuzFN75ZxuQfQ9kgAAQCwG9PLewBJAG2PJWAAAIAAQwUQAAC7cbkkw4uNHGwCsT0SQAAA7IYlYHjAEjAAAECAoQIIAIDNmC6XTC+WgHkOoP2RAAIAYDcsAcMDloABAAACDBVAAADsxmVKBhVANI4EEAAAuzFNSd48BoYE0O5IAAEAsBnTZcr0ogJokgDaHvcAAgAABJiATwB///vfKy4uTu3bt9egQYP04Ycf+jokAAC8Y7q8b02wZcsWjR8/XjExMTIMQ+vWrXM7n5mZqRtvvFGdOnXSVVddpdtvv13bt29365OcnCzDMNzapEmT3PqUl5crPT1dDodDDodD6enpOnnyZHP+hgJeQCeAr7/+umbNmqUFCxbok08+0S233KLU1FQdOXLE16EBANBspsv0ujXFqVOn1L9/f+Xk5DR4/oYbblBOTo727NmjrVu36tprr1VKSoqOHz/u1i8jI0NHjx612ssvv+x2fvLkySosLFReXp7y8vJUWFio9PT0pv3lQFKA3wO4ePFiTZ8+Xf/+7/8uSVqyZInWr1+vpUuXKjs728fRAQDgH1JTU5Wamtro+cmTJ7t9Xrx4sZYvX67PPvtMo0aNso537NhRTqezwWvs379feXl52rZtmxITEyVJy5YtU1JSkg4cOKAePXq0wEwCR8AmgLW1tdq9e7d+8pOfuB1PSUlRQUFBg2NqampUU1Njfa6oqJAkuc6cab1AAQC2cP53xeXYYPGdWdPkZVy38TorSaqsrHQ7HhoaqtDQUK9iq62t1SuvvCKHw6H+/fu7ncvNzdXq1asVFRWl1NRULVy4UGFhYZKkjz76SA6Hw0r+JGnIkCFyOBwqKCggAWyigE0A//nPf6qurk5RUVFux6OiolRaWtrgmOzsbP3iF7+od/zrzGdaJUYAgP1UVVXJ4XC0yrVDQkLkdDq1tfRdr6/VuXNnxcbGuh1buHChMjMzm3W9v/3tb5o0aZK+/fZbRUdHKz8/X127drXOT5kyRXFxcXI6ndq7d6/mz5+vTz/9VPn5+ZKk0tJSRUZG1rtuZGRko7+30biATQDPMwzD7bNpmvWOnTd//nzNnj3b+nzy5El1795dR44cabX/MV8OlZWVio2NVUlJicLDw30dTrMxj7bDDnOQmEdb4+/zME1TVVVViomJabXvaN++vYqLi1VbW+v1tRr6fehN9W/kyJEqLCzUP//5Ty1btkz33HOPtm/fbiV1GRkZVt8+ffooPj5eCQkJ+vjjjzVw4EBJ9X9nNxYnPAvYBLBr165q165dvX81lJWV1asKntdY6dvhcPjl/xl9X3h4OPNoQ+wwDzvMQWIebY0/z+NyFAvat2+v9u3bt/r3NFWnTp10/fXX6/rrr9eQIUMUHx+v5cuXa/78+Q32HzhwoIKDg3Xw4EENHDhQTqdTx44dq9fv+PHjjf7eRuMCdhdwSEiIBg0aZJWWz8vPz9fQoUN9FBUAAIHBNE23++q/r6ioSGfPnlV0dLQkKSkpSRUVFdqxY4fVZ/v27aqoqOD3djMEbAVQkmbPnq309HQlJCQoKSlJr7zyio4cOaJHHnnE16EBAOA3qqur9cUXX1ifi4uLVVhYqIiICHXp0kW/+tWvNGHCBEVHR+vEiRP6/e9/r6+//lp33323JOnLL79Ubm6uxo0bp65du2rfvn2aM2eOBgwYoGHDhkmSevbsqbFjxyojI8N6PMxDDz2ktLQ0NoA0hxngfve735ndu3c3Q0JCzIEDB5qbN2++5LFnzpwxFy5caJ45c6YVI2x9zKNtscM87DAH02QebY1d5mFHH3zwgSmpXps6dap5+vRp86677jJjYmLMkJAQMzo62pwwYYK5Y8cOa/yRI0fMW2+91YyIiDBDQkLM6667zpw5c6Z54sQJt+85ceKEOWXKFDMsLMwMCwszp0yZYpaXl1/m2dqDYZq88A8AACCQBOw9gAAAAIGKBBAAACDAkAACAAAEGBJAAACAAEMC2Ey///3vFRcXp/bt22vQoEH68MMPfR2SR1u2bNH48eMVExMjwzC0bt06t/OmaSozM1MxMTHq0KGDkpOTVVRU5JtgG5Gdna3BgwcrLCxMkZGR+uEPf6gDBw649fGHeSxdulT9+vWzHmiblJSkv//979Z5f5jD92VnZ8swDM2aNcs65g/zyMzMlGEYbu3Cl9H7wxzO++abb3T//ferS5cu6tixo2666Sbt3r3bOu8Pc7n22mvr/TwMw9Bjjz0myT/mAPgDEsBmeP311zVr1iwtWLBAn3zyiW655RalpqbqyJEjvg7tok6dOqX+/fsrJyenwfOLFi3S4sWLlZOTo507d8rpdGr06NGqqqq6zJE2bvPmzXrssce0bds25efn67vvvlNKSopOnTpl9fGHeVxzzTV69tlntWvXLu3atUu33Xab7rzzTusXmT/M4UI7d+7UK6+8on79+rkd95d59O7dW0ePHrXanj17rHP+Mofy8nINGzZMwcHB+vvf/659+/bpN7/5ja688kqrjz/MZefOnW4/i/MP6z//vDh/mAPgF3z2ABo/dvPNN5uPPPKI27Ebb7zR/MlPfuKjiJpOkvnWW29Zn10ul+l0Os1nn33WOnbmzBnT4XCYL730kg8ivDRlZWWmJOv5jf46D9M0zauuusr8wx/+4HdzqKqqMuPj4838/HxzxIgR5hNPPGGapv/8LBYuXGj279+/wXP+MgfTNM0f//jH5vDhwxs9709zudATTzxhXnfddabL5fLbOQBtERXAJqqtrdXu3buVkpLidjwlJUUFBQU+isp7xcXFKi0tdZtXaGioRowY0abnVVFRIUmKiIiQ5J/zqKur09q1a3Xq1CklJSX53Rwee+wx3XHHHbr99tvdjvvTPA4ePKiYmBjFxcVp0qRJ+uqrryT51xz++te/KiEhQXfffbciIyM1YMAALVu2zDrvT3M5r7a2VqtXr9aDDz4owzD8cg5AW0UC2ET//Oc/VVdXV+/F01FRUSotLfVRVN47H7s/zcs0Tc2ePVvDhw9Xnz59JPnXPPbs2aPOnTsrNDRUjzzyiN566y316tXLr+awdu1affzxx8rOzq53zl/mkZiYqFdffVXr16/XsmXLVFpaqqFDh+rEiRN+MwdJ+uqrr7R06VLFx8dr/fr1euSRRzRz5ky9+uqrkvzn53GhdevW6eTJk5o2bZok/5wD0FYF9LuAvWEYhttn0zTrHfNH/jSvGTNm6LPPPtPWrVvrnfOHefTo0UOFhYU6efKk3njjDU2dOlWbN2+2zrf1OZSUlOiJJ57Qhg0b1L59+0b7tfV5pKamWn/u27evkpKSdN1112nVqlUaMmSIpLY/B0lyuVxKSEhQVlaWJGnAgAEqKirS0qVL9W//9m9WP3+Yy3nLly9XamqqYmJi3I770xyAtooKYBN17dpV7dq1q/evzbKysnr/KvUn53c9+su8Hn/8cf31r3/VBx98oGuuucY67k/zCAkJ0fXXX6+EhARlZ2erf//+euGFF/xmDrt371ZZWZkGDRqkoKAgBQUFafPmzfrtb3+roKAgK9a2Po/v69Spk/r27auDBw/6zc9CkqKjo9WrVy+3Yz179rQ2p/nTXCTp8OHD2rhxo/793//dOuZvcwDaMhLAJgoJCdGgQYOsnWnn5efna+jQoT6KyntxcXFyOp1u86qtrdXmzZvb1LxM09SMGTP05ptv6v3331dcXJzbeX+ZR0NM01RNTY3fzGHUqFHas2ePCgsLrZaQkKApU6aosLBQP/jBD/xiHt9XU1Oj/fv3Kzo62m9+FpI0bNiweo9E+vzzz9W9e3dJ/ve/jRUrVigyMlJ33HGHdczf5gC0aT7afOLX1q5dawYHB5vLly839+3bZ86aNcvs1KmTeejQIV+HdlFVVVXmJ598Yn7yySemJHPx4sXmJ598Yh4+fNg0TdN89tlnTYfDYb755pvmnj17zPvuu8+Mjo42KysrfRz5//qP//gP0+FwmJs2bTKPHj1qtW+//dbq4w/zmD9/vrllyxazuLjY/Oyzz8yf/vSn5hVXXGFu2LDBNE3/mENDLtwFbJr+MY85c+aYmzZtMr/66itz27ZtZlpamhkWFmb979kf5mCaprljxw4zKCjI/NWvfmUePHjQzM3NNTt27GiuXr3a6uMvc6mrqzO7detm/vjHP653zl/mALR1JIDN9Lvf/c7s3r27GRISYg4cONB6DElb9sEHH5iS6rWpU6eapnnuMRELFy40nU6nGRoaat56663mnj17fBv09zQUvyRzxYoVVh9/mMeDDz5o/fdz9dVXm6NGjbKSP9P0jzk05PsJoD/M49577zWjo6PN4OBgMyYmxpw4caJZVFRknfeHOZz39ttvm3369DFDQ0PNG2+80XzllVfczvvLXNavX29KMg8cOFDvnL/MAWjrDNM0TZ+UHgEAAOAT3AMIAAAQYEgAAQAAAgwJIAAAQIAhAQQAAAgwJIAAAAABhgQQAAAgwJAAAgAABBgSQAAAgABDAgjgki1fvlwpKSk++e65c+dq5syZPvluALAb3gQC4JLU1NToBz/4gdauXatbbrnlsn9/WVmZrrvuOn322WeKi4u77N8PAHZCBRDAJXnjjTfUuXNnnyR/khQZGamUlBS99NJLPvl+ALATEkAgwBw/flxOp1NZWVnWse3btyskJEQbNmxodNzatWs1YcIEt2PTpk3TD3/4Q2VlZSkqKkpXXnmlfvGLX+i7777TU089pYiICF1zzTX64x//aI05dOiQDMPQn//8Z91yyy3q0KGDBg8erM8//1w7d+5UQkKCOnfurLFjx+r48eNu3zdhwgT96U9/aqG/CQAIXCSAQIC5+uqr9cc//lGZmZnatWuXqqurdf/99+vRRx+96P19H374oRISEuodf//99/WPf/xDW7Zs0eLFi5WZmam0tDRdddVV2r59ux555BE98sgjKikpcRu3cOFC/exnP9PHH3+soKAg3XfffZo3b55eeOEFffjhh/ryyy/19NNPu425+eabVVJSosOHD7fMXwYABCjuAQQC1GOPPaaNGzdq8ODB+vTTT7Vz5061b9++wb4nT57UVVddpS1btrgtAU+bNk2bNm3SV199pSuuOPfvyRtvvFGRkZHasmWLJKmurk4Oh0N/+MMfNGnSJB06dEhxcXH6wx/+oOnTp0s6V12877779N577+m2226TJD377LNauXKl/vu//9v6vsrKSjkcDm3atEkjRoxolb8XAAgEVACBAPWf//mf+u677/TnP/9Zubm5jSZ/knT69GlJarBP7969reRPkqKiotS3b1/rc7t27dSlSxeVlZW5jevXr5/bGElu46KiouqN6dChgyTp22+/9Tg/AEDjSACBAPXVV1/pH//4h1wul8cl1S5dusgwDJWXl9c7Fxwc7PbZMIwGj7lcrkbHGYbR4LHvj/mf//kfSeeWsQEAzUcCCASg2tpaTZkyRffee6+eeeYZTZ8+XceOHWu0f0hIiHr16qV9+/Zdxijr27t3r4KDg9W7d2+fxgEA/o4EEAhACxYsUEVFhX77299q3rx56tmzp3U/XmPGjBmjrVu3XqYIG/bhhx9aO4cBAM1HAggEmE2bNmnJkiV67bXXFB4eriuuuEKvvfaatm7dqqVLlzY6LiMjQ++++64qKiouY7Tu/vSnPykjI8Nn3w8AdsEuYACX7J577tGAAQM0f/78y/7d77zzjp566il99tlnCgoKuuzfDwB2QgUQwCX79a9/rc6dO/vku0+dOqUVK1aQ/AFAC6ACCAAAEGCoAAIAAAQYEkAAAIAAQwIIAAAQYEgAAQAAAgwJIAAAQIAhAQQAAAgwJIAAAAABhgQQAAAgwJAAAgAABJj/D6TJZGuqywDKAAAAAElFTkSuQmCC", + "text/html": [ "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " continue;\n", - " }\n", - "\n", - " var button = (fig.buttons[name] = document.createElement('button'));\n", - " button.classList = 'mpl-widget';\n", - " button.setAttribute('role', 'button');\n", - " button.setAttribute('aria-disabled', 'false');\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - "\n", - " var icon_img = document.createElement('img');\n", - " icon_img.src = '_images/' + image + '.png';\n", - " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", - " icon_img.alt = tooltip;\n", - " button.appendChild(icon_img);\n", - "\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " var fmt_picker = document.createElement('select');\n", - " fmt_picker.classList = 'mpl-widget';\n", - " toolbar.appendChild(fmt_picker);\n", - " this.format_dropdown = fmt_picker;\n", - "\n", - " for (var ind in mpl.extensions) {\n", - " var fmt = mpl.extensions[ind];\n", - " var option = document.createElement('option');\n", - " option.selected = fmt === mpl.default_extension;\n", - " option.innerHTML = fmt;\n", - " fmt_picker.appendChild(option);\n", - " }\n", - "\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "};\n", - "\n", - "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n", - " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", - " // which will in turn request a refresh of the image.\n", - " this.send_message('resize', { width: x_pixels, height: y_pixels });\n", - "};\n", - "\n", - "mpl.figure.prototype.send_message = function (type, properties) {\n", - " properties['type'] = type;\n", - " properties['figure_id'] = this.id;\n", - " this.ws.send(JSON.stringify(properties));\n", - "};\n", - "\n", - "mpl.figure.prototype.send_draw_message = function () {\n", - " if (!this.waiting) {\n", - " this.waiting = true;\n", - " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " var format_dropdown = fig.format_dropdown;\n", - " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", - " fig.ondownload(fig, format);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_resize = function (fig, msg) {\n", - " var size = msg['size'];\n", - " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n", - " fig._resize_canvas(size[0], size[1], msg['forward']);\n", - " fig.send_message('refresh', {});\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", - " var x0 = msg['x0'] / fig.ratio;\n", - " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", - " var x1 = msg['x1'] / fig.ratio;\n", - " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n", - " x0 = Math.floor(x0) + 0.5;\n", - " y0 = Math.floor(y0) + 0.5;\n", - " x1 = Math.floor(x1) + 0.5;\n", - " y1 = Math.floor(y1) + 0.5;\n", - " var min_x = Math.min(x0, x1);\n", - " var min_y = Math.min(y0, y1);\n", - " var width = Math.abs(x1 - x0);\n", - " var height = Math.abs(y1 - y0);\n", - "\n", - " fig.rubberband_context.clearRect(\n", - " 0,\n", - " 0,\n", - " fig.canvas.width / fig.ratio,\n", - " fig.canvas.height / fig.ratio\n", - " );\n", - "\n", - " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n", - " // Updates the figure title.\n", - " fig.header.textContent = msg['label'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n", - " fig.rubberband_canvas.style.cursor = msg['cursor'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_message = function (fig, msg) {\n", - " fig.message.textContent = msg['message'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n", - " // Request the server to send over a new figure.\n", - " fig.send_draw_message();\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n", - " fig.image_mode = msg['mode'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n", - " for (var key in msg) {\n", - " if (!(key in fig.buttons)) {\n", - " continue;\n", - " }\n", - " fig.buttons[key].disabled = !msg[key];\n", - " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", - " if (msg['mode'] === 'PAN') {\n", - " fig.buttons['Pan'].classList.add('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " } else if (msg['mode'] === 'ZOOM') {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.add('active');\n", - " } else {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Called whenever the canvas gets updated.\n", - " this.send_message('ack', {});\n", - "};\n", - "\n", - "// A function to construct a web socket function for onmessage handling.\n", - "// Called in the figure constructor.\n", - "mpl.figure.prototype._make_on_message_function = function (fig) {\n", - " return function socket_on_message(evt) {\n", - " if (evt.data instanceof Blob) {\n", - " var img = evt.data;\n", - " if (img.type !== 'image/png') {\n", - " /* FIXME: We get \"Resource interpreted as Image but\n", - " * transferred with MIME type text/plain:\" errors on\n", - " * Chrome. But how to set the MIME type? It doesn't seem\n", - " * to be part of the websocket stream */\n", - " img.type = 'image/png';\n", - " }\n", - "\n", - " /* Free the memory for the previous frames */\n", - " if (fig.imageObj.src) {\n", - " (window.URL || window.webkitURL).revokeObjectURL(\n", - " fig.imageObj.src\n", - " );\n", - " }\n", - "\n", - " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", - " img\n", - " );\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " } else if (\n", - " typeof evt.data === 'string' &&\n", - " evt.data.slice(0, 21) === 'data:image/png;base64'\n", - " ) {\n", - " fig.imageObj.src = evt.data;\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - "\n", - " var msg = JSON.parse(evt.data);\n", - " var msg_type = msg['type'];\n", - "\n", - " // Call the \"handle_{type}\" callback, which takes\n", - " // the figure and JSON message as its only arguments.\n", - " try {\n", - " var callback = fig['handle_' + msg_type];\n", - " } catch (e) {\n", - " console.log(\n", - " \"No handler for the '\" + msg_type + \"' message type: \",\n", - " msg\n", - " );\n", - " return;\n", - " }\n", - "\n", - " if (callback) {\n", - " try {\n", - " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", - " callback(fig, msg);\n", - " } catch (e) {\n", - " console.log(\n", - " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", - " e,\n", - " e.stack,\n", - " msg\n", - " );\n", - " }\n", - " }\n", - " };\n", - "};\n", - "\n", - "// from https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", - "mpl.findpos = function (e) {\n", - " //this section is from http://www.quirksmode.org/js/events_properties.html\n", - " var targ;\n", - " if (!e) {\n", - " e = window.event;\n", - " }\n", - " if (e.target) {\n", - " targ = e.target;\n", - " } else if (e.srcElement) {\n", - " targ = e.srcElement;\n", - " }\n", - " if (targ.nodeType === 3) {\n", - " // defeat Safari bug\n", - " targ = targ.parentNode;\n", - " }\n", - "\n", - " // pageX,Y are the mouse positions relative to the document\n", - " var boundingRect = targ.getBoundingClientRect();\n", - " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", - " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n", - "\n", - " return { x: x, y: y };\n", - "};\n", - "\n", - "/*\n", - " * return a copy of an object with only non-object keys\n", - " * we need this to avoid circular references\n", - " * https://stackoverflow.com/a/24161582/3208463\n", - " */\n", - "function simpleKeys(original) {\n", - " return Object.keys(original).reduce(function (obj, key) {\n", - " if (typeof original[key] !== 'object') {\n", - " obj[key] = original[key];\n", - " }\n", - " return obj;\n", - " }, {});\n", - "}\n", - "\n", - "mpl.figure.prototype.mouse_event = function (event, name) {\n", - " var canvas_pos = mpl.findpos(event);\n", - "\n", - " if (name === 'button_press') {\n", - " this.canvas.focus();\n", - " this.canvas_div.focus();\n", - " }\n", - "\n", - " var x = canvas_pos.x * this.ratio;\n", - " var y = canvas_pos.y * this.ratio;\n", - "\n", - " this.send_message(name, {\n", - " x: x,\n", - " y: y,\n", - " button: event.button,\n", - " step: event.step,\n", - " guiEvent: simpleKeys(event),\n", - " });\n", - "\n", - " /* This prevents the web browser from automatically changing to\n", - " * the text insertion cursor when the button is pressed. We want\n", - " * to control all of the cursor setting manually through the\n", - " * 'cursor' event from matplotlib */\n", - " event.preventDefault();\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n", - " // Handle any extra behaviour associated with a key event\n", - "};\n", - "\n", - "mpl.figure.prototype.key_event = function (event, name) {\n", - " // Prevent repeat events\n", - " if (name === 'key_press') {\n", - " if (event.key === this._key) {\n", - " return;\n", - " } else {\n", - " this._key = event.key;\n", - " }\n", - " }\n", - " if (name === 'key_release') {\n", - " this._key = null;\n", - " }\n", - "\n", - " var value = '';\n", - " if (event.ctrlKey && event.key !== 'Control') {\n", - " value += 'ctrl+';\n", - " }\n", - " else if (event.altKey && event.key !== 'Alt') {\n", - " value += 'alt+';\n", - " }\n", - " else if (event.shiftKey && event.key !== 'Shift') {\n", - " value += 'shift+';\n", - " }\n", - "\n", - " value += 'k' + event.key;\n", - "\n", - " this._key_event_extra(event, name);\n", - "\n", - " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n", - " if (name === 'download') {\n", - " this.handle_save(this, null);\n", - " } else {\n", - " this.send_message('toolbar_button', { name: name });\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n", - " this.message.textContent = tooltip;\n", - "};\n", - "\n", - "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", - "// prettier-ignore\n", - "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n", - "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", - "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", - "\n", - "mpl.default_extension = \"png\";/* global mpl */\n", - "\n", - "var comm_websocket_adapter = function (comm) {\n", - " // Create a \"websocket\"-like object which calls the given IPython comm\n", - " // object with the appropriate methods. Currently this is a non binary\n", - " // socket, so there is still some room for performance tuning.\n", - " var ws = {};\n", - "\n", - " ws.binaryType = comm.kernel.ws.binaryType;\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " function updateReadyState(_event) {\n", - " if (comm.kernel.ws) {\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " } else {\n", - " ws.readyState = 3; // Closed state.\n", - " }\n", - " }\n", - " comm.kernel.ws.addEventListener('open', updateReadyState);\n", - " comm.kernel.ws.addEventListener('close', updateReadyState);\n", - " comm.kernel.ws.addEventListener('error', updateReadyState);\n", - "\n", - " ws.close = function () {\n", - " comm.close();\n", - " };\n", - " ws.send = function (m) {\n", - " //console.log('sending', m);\n", - " comm.send(m);\n", - " };\n", - " // Register the callback with on_msg.\n", - " comm.on_msg(function (msg) {\n", - " //console.log('receiving', msg['content']['data'], msg);\n", - " var data = msg['content']['data'];\n", - " if (data['blob'] !== undefined) {\n", - " data = {\n", - " data: new Blob(msg['buffers'], { type: data['blob'] }),\n", - " };\n", - " }\n", - " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", - " ws.onmessage(data);\n", - " });\n", - " return ws;\n", - "};\n", - "\n", - "mpl.mpl_figure_comm = function (comm, msg) {\n", - " // This is the function which gets called when the mpl process\n", - " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", - "\n", - " var id = msg.content.data.id;\n", - " // Get hold of the div created by the display call when the Comm\n", - " // socket was opened in Python.\n", - " var element = document.getElementById(id);\n", - " var ws_proxy = comm_websocket_adapter(comm);\n", - "\n", - " function ondownload(figure, _format) {\n", - " window.open(figure.canvas.toDataURL());\n", - " }\n", - "\n", - " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n", - "\n", - " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", - " // web socket which is closed, not our websocket->open comm proxy.\n", - " ws_proxy.onopen();\n", - "\n", - " fig.parent_element = element;\n", - " fig.cell_info = mpl.find_output_cell(\"
\");\n", - " if (!fig.cell_info) {\n", - " console.error('Failed to find cell for figure', id, fig);\n", - " return;\n", - " }\n", - " fig.cell_info[0].output_area.element.on(\n", - " 'cleared',\n", - " { fig: fig },\n", - " fig._remove_fig_handler\n", - " );\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_close = function (fig, msg) {\n", - " var width = fig.canvas.width / fig.ratio;\n", - " fig.cell_info[0].output_area.element.off(\n", - " 'cleared',\n", - " fig._remove_fig_handler\n", - " );\n", - " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n", - "\n", - " // Update the output cell to use the data from the current canvas.\n", - " fig.push_to_output();\n", - " var dataURL = fig.canvas.toDataURL();\n", - " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", - " // the notebook keyboard shortcuts fail.\n", - " IPython.keyboard_manager.enable();\n", - " fig.parent_element.innerHTML =\n", - " '';\n", - " fig.close_ws(fig, msg);\n", - "};\n", - "\n", - "mpl.figure.prototype.close_ws = function (fig, msg) {\n", - " fig.send_message('closing', msg);\n", - " // fig.ws.close()\n", - "};\n", - "\n", - "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n", - " // Turn the data on the canvas into data in the output cell.\n", - " var width = this.canvas.width / this.ratio;\n", - " var dataURL = this.canvas.toDataURL();\n", - " this.cell_info[1]['text/html'] =\n", - " '';\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Tell IPython that the notebook contents must change.\n", - " IPython.notebook.set_dirty(true);\n", - " this.send_message('ack', {});\n", - " var fig = this;\n", - " // Wait a second, then push the new image to the DOM so\n", - " // that it is saved nicely (might be nice to debounce this).\n", - " setTimeout(function () {\n", - " fig.push_to_output();\n", - " }, 1000);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'btn-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " var button;\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " continue;\n", - " }\n", - "\n", - " button = fig.buttons[name] = document.createElement('button');\n", - " button.classList = 'btn btn-default';\n", - " button.href = '#';\n", - " button.title = name;\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message pull-right';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = document.createElement('div');\n", - " buttongrp.classList = 'btn-group inline pull-right';\n", - " button = document.createElement('button');\n", - " button.classList = 'btn btn-mini btn-primary';\n", - " button.href = '#';\n", - " button.title = 'Stop Interaction';\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', function (_evt) {\n", - " fig.handle_close(fig, {});\n", - " });\n", - " button.addEventListener(\n", - " 'mouseover',\n", - " on_mouseover_closure('Stop Interaction')\n", - " );\n", - " buttongrp.appendChild(button);\n", - " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", - " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", - "};\n", - "\n", - "mpl.figure.prototype._remove_fig_handler = function (event) {\n", - " var fig = event.data.fig;\n", - " if (event.target !== this) {\n", - " // Ignore bubbled events from children.\n", - " return;\n", - " }\n", - " fig.close_ws(fig, {});\n", - "};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (el) {\n", - " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (el) {\n", - " // this is important to make the div 'focusable\n", - " el.setAttribute('tabindex', 0);\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " } else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (event, _name) {\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which === 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " fig.ondownload(fig, null);\n", - "};\n", - "\n", - "mpl.find_output_cell = function (html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i = 0; i < ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code') {\n", - " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] === html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "};\n", + "
\n", + "
\n", + " Figure\n", + "
\n", + " \n", + "
\n", + " " + ], + "text/plain": [ + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from stride import ScalarField\n", + "\n", + "vp = ScalarField(name='vp', grid=problem.grid)\n", + "vp.fill(1500.) # [m/s]\n", + "\n", + "problem.medium.add(vp)\n", + "\n", + "# Plot the field\n", + "vp.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "serious-cherry", + "metadata": {}, + "source": [ + "We are now ready to run our PDE:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "catholic-tampa", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Default Devito configuration:\n", + "\t * autotuning=['aggressive', 'runtime']\n", + "\t * develop-mode=False\n", + "\t * mpi=False\n", + "\t * log-level=DEBUG\n", + "\t * language=openmp\n", + "(ShotID 0) Preparing to run state for shot\n", + "(ShotID 0) Estimated bandwidth for the propagated wavelet 0.260-0.730 MHz\n", + "(ShotID 0) Spatial grid spacing (0.400 mm | 5.137 PPW) is below dispersion limit (0.411 mm | 5.000 PPW)\n", + "(ShotID 0) Time grid spacing (0.050 μs | 18%) is below OT2 limit (0.120 μs)\n", + "(ShotID 0) Selected undersampling level 6\n", + "(ShotID 0) Selected time stepping scheme OT2\n", + "Operator `acoustic_iso_state` instance configuration:\n", + "\t * name=acoustic_iso_state\n", + "\t * subs={h_x: 0.0004, h_y: 0.0004, dt: 5e-08}\n", + "\t * opt=advanced-fsg\n", + "\t * autotuning=off\n", + "\t * compiler=nvc\n", + "\t * language=openacc\n", + "\t * platform=nvidiaX\n", + "\t * devicecreate=(p(t, x, y),)\n", + "Operator `acoustic_iso_state` generated in 1.57 s\n", + " * lowering.Clusters: 0.78 s (49.8 %)\n", + " * specializing.Clusters: 0.40 s (25.6 %)\n", + " * lowering.Expressions: 0.39 s (24.9 %)\n", + " * lowering.IET: 0.33 s (21.1 %)\n", + "Flops reduction after symbolic optimization: [99 --> 55]\n", + "Operator `acoustic_iso_state` fetched `/tmp/devito-jitcache-uid1000/379a5c3204c5761233329524198c272903f03482.cpp` in 0.10 s from jit-cache\n", + "(ShotID 0) Running state equation for shot\n", + "Operator `acoustic_iso_state` ran in 0.17 s\n", + "Global performance: [OI=2.60, 45.57 GFlops/s, 1.06 GPts/s]\n", + "Local performance:\n", + " * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + " * section1<1999,300,300> ran in 0.03 s [OI=2.60, 355.02 GFlops/s, 8.26 GPts/s]\n", + " * section2<<1999,1,2,2>,<1999,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + " * section3<<1999,120>,<1999,120,2,2>> ran in 0.02 s [OI=1.32, 0.74 GFlops/s, 0.00 GPts/s]\n", + "Performance[mode=advanced-fsg] arguments: {'deviceid': -1, 'devicerm': 1}\n", + "(ShotID 0) Completed state equation run for shot\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "54d98aa977114d62822db33d2363388c", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "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A9GtYAFIRHSLCiseWOCVftxH5M5YABIVA64mlB23UgSwgCi7eIySu2MBSHQDbvRkwYKAqHS7mWOUxSKVRywAia6jrBV0PFER3T5l7fgn+itYABIRERG5GRaARERERG6GBSARERGRm2EBSERERORmWAASERERuRkWgOR29G/K8huzRHS7cV6hsoIFIJVptzLZ8ice6M/wZE5/1a3MKxxvdCexAKQyicUbidy5E+adHG8sAtwP5zMqCSwAiajMKW8nzPK2PURU+rEAJLoJXKUhKr94fJM7YAFIROUaV9foRnGskDthAUj0X/zUT0RE7oIFINF/8dO/e+MHALpZHDtUFrEAJCKiElMeiid+eKSyiAUgURlS1MmSJyAqa25kzJaH4pCotGIBSFQGsMAjd8LxTlT8WAASUblRFleMymLMRFT2sQAkojKvLK4YlcWYiaj8YAFIRG6pOFfeuKpXMph3ohvHApCohBS1AsSTGNGNAcCV1P/ivEF/FQtAKnGcuK7hiYzoxvBY+R/mgm4WC0AqMZy4yB3xAw8RlQYsAIlug9t9UmdxfPNKa+5Ka1xlAXNHdPuxAKRyrzhXXHhiIiofbvc8wZVeKu1YAJLbYLFGxYUn+7LpTswJnHeotGIBSERu7VZO0Dy5l14syomujwUgUTnCkx4REd0IFoBEREVgQU1E5RULQCKiP8FLvURU3rAAJLoBXAkicl88/qk8YgFIdB1c+SFyXzz+qTxjAUhEt4wrJOUb9y9R+cMCkIhuWFlaEWHR8teVpf1LRLeGBSARERGRm2EBSERERORmWAASUannbpcm3W17iejOYwFIRCS8Z5CI3AsLQCIqN65XxJVUgfdn71vccXE1kYgKwwKQiErU7SiASmOR82cxFUfMXMUkohvFApCIKJ+SXrUjIipuLACJqFQpyeKqJFbtiIhKAgtAIrojWDzdPswlEd0qFoBEdNvxEikRUenGApCIiIjIzZTbAvDKlSsyduxYiY2NFU9PT6lUqZI899xz4nK51HMAyPjx4yU8PFw8PT0lJSVFDhw4UIJR01/lbitN7ra95N7cbby72/ZSySq3BeC0adNk/vz58sorr8j3338vL7zwgrz44osye/Zs9ZwXXnhBZsyYIa+88ors2LFDQkNDpXXr1pKVlVWCkdONcLd7oNxte4tTceWS++j2cbdcutv2UulQbgvA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w9vbG9OmTUPFihXh6+sLh8OBzMxMnD17Fq1atcLkyZNRsWJFVK5cGaGhoWof6l544QXYbDZYLBY0b95c/f3QoUPw8fGBr68v4uLi0LdvX6xevRp///vf4e/vj+joaHz44YfYvn07XnrpJZjNZqxcuRItW7aEyWTC66+/jk2bNqFjx44IDg5GZmYmRo0aBS8vL7z66qvYsmULVq9ejXr16qmY0tLSUKNGDbz55puIj49HSEgIJk6cqNri4uLg5+eHwYMHY926ddi+fTtWr16N33//Hb169YLFYsG9996LFStWYPLkyTCZTJg3b546bhITE+FwODBv3jwsWLAA7dq1Q1hYGPbt2wcPDw8kJyfjvffew/Lly1GtWjXUrFmzwDH36quvolKlSggODsbMmTNx+vRpVKxYETabDT179lTjacGCBfj999/xxx9/oEePHipfb731FkQEJpMJixYtwpgxY+Dl5YXXX38dr732GkQEAQEB+O2339C8eXNDrqpVqwYRwaZNm/DHH38gIyMDGRkZePPNN1GpUiWICB577DEAwLZt2wy5Wrx4MUQEy5cvx6RJk2C32xEaGoolS5Zgzpw5sNvtamxNmjQJDocDnp6emDdvHqZPnw6LxQIfHx88++yzCAgIQJ06dTB79mzMmjULDodD5TfvHPTqq68iOjoamqahU6dOqm3BggXw9fVFx44d4XA4MHbsWLUfY2NjYbVaMWvWLGzatAnt27eHiOCNN95Aly5dEBwcDE9PT7zyyisYPHgwrFYrgoOD8dtvvyEkJAQRERF466238N5776FixYowmUw4duwYunTpgvj4eKSnp2Pu3LkICQmBpmlIS0sDALRt2xZmsxnNmzfHgw8+iLZt20JEMGPGDABQx+K9994Lq9WK1q1bQ0RQvXp1NW9++umnaNGiBcxmM0QEgwcPRps2bWCz2VCzZk306dMHVqsVcXFxEBEkJiaiQoUKuOuuu9CkSRO0aNFCzdedOnVCWFgYRATvvvuumq979OgBEUF0dDSCgoLw7bff4v3338fw4cPh5+eHoKAgiAj+8Y9/YOLEiTCZTJg9ezY6duyIu+66CyICEcGSJUvQokUL1K5dG0899RQSExMRGxur+m7cuBFxcXFo0qQJOnbsiK5du6q+TZo0UeeUxYsXY8KECRg9ejREBI8//jj279+PgwcP4v3338fl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81jedv1DkL4PIyMj1YfB2bNnq4JH319FFYADBgxQBWDeOfedd95BUFAQAgMDkZ6eDhFRRWthBeBHH32ktj/vfF2rVi2MHj0aQ4cORe3atSEiePrppzF+/Hj4+vpi7969RRaArVq1wqBBgwD8rwCcPHkyGjZsiHvvvRc5OTn46KOPULly5SILQH27874uAENcd999NzZs2IDdu3cb4qJbwwKwFMrOzobZbMby5csNf3/iiSfUKsvQoUMRERGBw4cPq/YVK1YYPvnqNxNrmqYmw/79+xtec+7cuQgPDwcARERE4JVXXjG0T5w4sUAB+PPPP0NE1E24envHjh3Ru3dv9bycnByIXLvh+NSpUwCAmTNnqnj0+PRPnNHR0cjOzobFYinwviNHjkTDhg1htVrRvn17w7b3798fqampKq6uXbsa2vPGpeetdevWSEhIKBCXpmkqnvxxaZoGHx8fQ87zxpX3/qGWLVuiatWqaNasmSFXusDAQMTFxRly1alTJyQkJKB58+Z45JFHCuQqb76cTqchV3nft3bt2mrSN5lMBfpqmqZW6Qp77bwnSX0FJe846tu3b4HnFvbQ31vvq2laoblq1aoVqlWrdt1c5V35zpur5ORkPProozeVq1atWqFOnTrqvqj8q2ZJSUmw2+2IiopSKzp6bPpx07FjR3h5eaF///6GuF544QWEh4cjKioKDRs2NMSWd4zp/84b19y5c+F0OpGUlISLFy/CarXizTffVF8q0se8ni+9INfb8o73nJwctGnTBiJiuI9Kz1feca7/r140TZw4Eb/88ot67ZEjRyIpKUl9OSLvPpw4caJa2Q4NDS2wHydOnKg+FOlzjJ6vkJAQVK5cGQDUinVh+9FsNmPWrFmG/Thx4kRUrVq1wHF4/vx5VSzFxsYiMDBQzQ9fffWVatO/GJI3X+3bt0f16tVx6tQpdOnSBW3btjXkK++4FhFDvvK+r8i1VVR9H77++usF5s06deqo/aXHl7dI0/enXgDm7Vu1alUEBgbioYceKtA3f4wigo8//tjw2vr7dunSRa3Ir127Vq3i6fPJoEGDsHHjRsNr6YVaQkICxo0bB+B/BWB0dDRatmyprh4MGzZMjfn8Yy05ORmHDx8utADMG9f+/fsNx6YeF90a3gNYCtlsNklMTJT169cb/r5+/Xpp3LixDB06VJYvXy6ff/65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BGDatGlwuVzIzMzEE088YRjzkZGR+Pbbb5GZmYmHH364yNg++eQTNQd5eHion7V58cUXC8xP+rivVauWiu3VV1+Ft7e34VibNGkSXC4Xli1bhkqVKqn9bzKZkJSUdEP50vvabDaEhobiscceQ2RkpMrXsmXLVNFX2KNLly7o27evuqf6r8x9ISEhOHr0aJFz7p89VqxYUWTfoKAgbNmyBaNGjSpyjisqLpFrBVtRff/s0bVrVyxcuLDQtoiICPUB6ODBg+jcubP6gJqQkFDgZ2Ho5mgAIERERETkNngPIBEREZGbYQFIRERE5GZYABIRERG5GRaARERERG6GBSARERGRm2EBSERERORmWAASERERuRkWgERERERuhgUgEZVLKSkpMnz48JIOg4ioVGIBSERuCYBcuXKlpMMgIioRLACJqNzp27evpKenyz//+U/RNE00TZN//etfommarF27VurXry92u122bNkiP//8s9x3330SEhIiTqdTGjRoIBs2bDC8XnZ2towcOVIiIyPFbrdLXFycvPHGG6r9u+++k7Zt24rT6ZSQkBDp1auXnDp16k5vNhHRDWMBSETlzj//+U9p3LixDBw4UDIyMiQjI0MiIyNFRGTkyJEydepU+f777yUhIUHOnz8vbdu2lQ0bNsiuXbskNTVVOnToIEePHlWv17t3b1m6dKm8/PLL8v3338v8+fPF6XSKiEhGRoYkJydLnTp15JtvvpE1a9bI77//Ll26dCmRbSciuhEaAJR0EEREt1tKSorUqVNHZs2aJSIimzdvlhYtWsjKlSvlvvvuu27fGjVqyODBg2Xo0KFy8OBBqVq1qqxfv15atWpV4Lnjxo2Tbdu2ydq1a9Xfjh07JpGRkfLjjz9KlSpVbut2ERHdDpaSDoCI6E6qX7++4d8XLlyQCRMmyOrVq+XEiRNy5coVuXTpkloB3L17t5jNZklOTi709Xbu3CmbNm1SK4J5/fzzzywAiahUYgFIRG7Fy8vL8O8RI0bI2rVr5aWXXpLKlSuLp6enPPDAA5KTkyMiIp6entd9PZfLJR06dJBp06YVaAsLC7t9gRMR3UYsAImoXLLZbHL16tU/fd6WLVukb9++cv/994uIyPnz5+WXX35R7bVq1RKXyyXp6emFXgKuV6+efPjhhxITEyMWC6dUIiob+CUQIiqXYmJiZNu2bfLLL7/IqVOnxOVyFfq8ypUry/Lly2X37t2yZ88e6dGjh+G5MTEx0qdPH+nXr5+sXLlSjhw5Ips3b5b33ntPREQee+wxOX36tHTv3l22b98uhw8flnXr1km/fv1uqAAlIioJLACJqFz6+9//LmazWeLj4yUoKMjwrd68Zs6cKf7+/pKUlCQdOnSQ1NRUqVevnuE58+bNkwceeECGDBki1apVk4EDB8qFCxdERCQ8PFy++uoruXr1qqSmpkrNmjVl2LBh4uvrKyYTp1giKp34LWAiIiIiN8OPp0RERERuhgUgERERkZthAUhERETkZlgAEhEREbkZFoBEREREboYFIBEREZGbYQFIRERE5GZYABIRERG5GRaARERERG6GBSARERGRm2EBSERERORmWAASERERuZn/DzLtm56HM4aUAAAAAElFTkSuQmCC", + "text/html": [ "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel !== null) {\n", - " IPython.notebook.kernel.comm_manager.register_target(\n", - " 'matplotlib',\n", - " mpl.mpl_figure_comm\n", - " );\n", - "}\n" + "
\n", + "
\n", + " Figure\n", + "
\n", + " \n", + "
\n", + " " ], "text/plain": [ - "" + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, @@ -2071,11 +353,24 @@ }, { "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "521ef61ff6894e549b4afd0c62bb00ba", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA7F0lEQVR4nO3de3wU9b3/8ffmDgFWIZCLhJBwp1gMQSBBam0xiFCrVsFSoZwiPejRAjn+qin2IWI16mlttApWj0qtF9ACR3oODyQgpSIgcomC0ogICZeEO0lQyHV+f/DYcTfZTXZz3cm8no/HPLI7893Jd0ZM3vl85zvjMAzDEAAAAGwjpL07AAAAgLZFAAQAALAZAiAAAIDNEAABAABshgAIAABgMwRAAAAAmyEAAgAA2AwBEAAAwGYIgAAAADZDAAQAALAZAiAAAIDNEAABAABshgAIAABgMwRAAAAAmyEAAgAA2AwBEAAAwGYIgAAAADZDAAQAALAZAiAAAIDNEAABAABshgAIAABgMwRAAAAAmyEAAgAA2AwBEAAAwGYIgAAAADZDAAQAALAZAiAAAIDNEAABAABshgAIAABgMwRAAAAAmyEAAgAA2AwBEAAAwGYIgAAAADZDAAQAALAZAiAAAIDNEAABAABshgAIwPYOHTokh8OhpUuXBvzZf/zjH3I4HPrHP/5hrlu4cKEcDkfLdVDSzJkz1bdv3xbdJwD7IgACAADYDAEQAADAZgiAAIKCa9j0008/1e233y6n06nu3bsrKytL1dXVKigo0A033KCuXbuqb9++euqppzw+X1RUpDvvvFO9evVSZGSkhgwZoj/84Q+qra31aHfs2DFNmTJFXbt2ldPp1NSpU1VSUuK1Tzt27NBNN92k7t27KyoqSqmpqXr77bebfIzLly9Xenq6oqOj1aVLF02YMEG7d++u127p0qUaNGiQeRyvvfZak78nAHhDAAQQVKZMmaLhw4drxYoVmj17tv74xz9q/vz5uvnmmzVp0iStWrVKP/jBD/TAAw9o5cqVkqSTJ08qIyND69at06OPPqrVq1dr/Pjxuv/++3Xvvfea+75w4YLGjx+vdevWKScnR++8847i4uI0derUev3YuHGjxo4dq3PnzumFF17Qu+++q6uuukpTp05t0rWCjz/+uH76059q6NChevvtt/XXv/5V5eXlGjdunD7//HOz3dKlS/Vv//ZvGjJkiFasWKGHHnpIjz76qN5///3ATyYA+GIAQBB4+OGHDUnGH/7wB4/1V111lSHJWLlypbmuqqrK6Nmzp3HrrbcahmEYDz74oCHJ+Oijjzw+e/fddxsOh8MoKCgwDMMwlixZYkgy3n33XY92s2fPNiQZr776qrlu8ODBRmpqqlFVVeXRdvLkyUZ8fLxRU1NjGIZhbNy40ZBkbNy4sd6xuBQVFRlhYWHGfffd57Gv8vJyIy4uzpgyZYphGIZRU1NjJCQkGCNGjDBqa2vNdocOHTLCw8ONpKQkn+cPAAJBBRBAUJk8ebLH+yFDhsjhcGjixInmurCwMPXv31+FhYWSpPfff19Dhw7VqFGjPD47c+ZMGYZhVs82btyorl276qabbvJoN23aNI/3X375pf71r3/pZz/7mSSpurraXG688UYVFxeroKDA72N67733VF1drRkzZnjsKyoqStdee605g7igoEDHjh3TtGnTPGYRJyUlKSMjw+/vBwCNCWvvDgCAu+7du3u8j4iIUOfOnRUVFVVvfVlZmSTp9OnTXm+RkpCQYG53fY2Nja3XLi4uzuP98ePHJUn333+/7r//fq/9PHXqlB9H47m/q6++2uv2kJAQj37W7Y9r3aFDh/z+ngDQEAIgAMvr0aOHiouL660/duyYJCkmJsZst3379nrt6k4CcbXPzs7Wrbfe6vV7Dho0yO/+ufb3t7/9TUlJST7b9ejRw2t/fK0DgKYiAAKwvB/+8IfKycnRrl27NGLECHP9a6+9JofDoeuuu06SdN111+ntt9/W6tWrPYaB33zzTY/9DRo0SAMGDNAnn3yixx9/vNn9mzBhgsLCwnTgwAH95Cc/8dlu0KBBio+P11tvvaWsrCxzGLiwsFBbtmwxK5oA0FwEQACWN3/+fL322muaNGmSFi1apKSkJP3f//2fFi9erLvvvlsDBw6UJM2YMUN//OMfNWPGDD322GMaMGCA1qxZo/fee6/ePv/85z9r4sSJmjBhgmbOnKkrrrhCZ86c0b59+7Rr1y698847fvevb9++WrRokRYsWKCvvvpKN9xwgy6//HIdP35c27dvV3R0tB555BGFhITo0Ucf1V133aVbbrlFs2fP1rlz57Rw4UKvw8IA0FQEQACW17NnT23ZskXZ2dnKzs5WWVmZUlJS9NRTTykrK8ts17lzZ73//vuaO3euHnzwQTkcDmVmZmrZsmX1Jllcd9112r59ux577DHNmzdPZ8+eVY8ePTR06FBNmTIl4D5mZ2dr6NCheuaZZ/TWW2+poqJCcXFxuvrqqzVnzhyz3axZsyRJTz75pG699Vb17dtXv/nNb7Rp0yaPx80BQHM4DMMw2rsTAAAAaDvcBgYAAMBmCIAAAAA2QwAEAACwGQIgAACAzRAAAQAAbIYACAAAYDMEQAAAAJvhRtDNUFtbq2PHjqlr167mI5sAAEBwMwxD5eXlSkhIUEiIPWthBMBmOHbsmBITE9u7GwAAoAkOHz6s3r17t3c32gUBsBm6du0q6dI/oG7durVzbwAAgD/KysqUmJho/h63IwJgM7iGfbt160YABADAYux8+ZY9B74BAABsjAAIAABgMwRAAAAAmyEAAgAA2AwBEAAAwGYIgAAAADZDAAQAALAZAiAAAIDNEAABAABshgAIAABgMwRAAAAAmyEAAgAA2AwBEECHkZeXpz/84Q8yDKO9uwIAQS2svTsAAC2hsrJSmZmZkqSxY8dqzJgx7dwjAAheVAABdAglJSXm69LS0nbsCQAEPwIggA7h4sWL5uvy8vJ27AkABD8CIIAOwT0AlpWVtWNPACD4EQABdAhUAAHAfwRAAB2CewCsqKhox54AQPAjAALoEAiAAOA/AiCADsE99BEAAaBhBEAAHQIVQADwHwEQQIfgHgArKyvbsScAEPwIgAA6BCqAAOA/AiCADoEACAD+IwAC6BAIgADgPwIggA7BPQBWV1e3Y08AIPgRAAF0CO5VPwIgADSMAAigQ6ACCAD+IwAC6BCqqqrM1wRAAGiYZQLg4sWLlZycrKioKKWlpemDDz7w2ba4uFjTpk3ToEGDFBISonnz5tVrs3TpUjkcjnqLexUBgHW4hz4CIAA0zBIBcPny5Zo3b54WLFig3bt3a9y4cZo4caKKioq8tq+oqFDPnj21YMECDR8+3Od+u3XrpuLiYo8lKiqqtQ4DQCsiAAKA/ywRAJ9++mnNmjVLd911l4YMGaLc3FwlJiZqyZIlXtv37dtXzzzzjGbMmCGn0+lzvw6HQ3FxcR4LAGsiAAKA/4I+AFZWVmrnzp3KzMz0WJ+ZmaktW7Y0a9/nz59XUlKSevfurcmTJ2v37t0Ntq+oqFBZWZnHAiA41NTUmK8JgADQsKAPgKdOnVJNTY1iY2M91sfGxqqkpKTJ+x08eLCWLl2q1atX66233lJUVJTGjh2r/fv3+/xMTk6OnE6nuSQmJjb5+wNoWVQAAcB/QR8AXRwOh8d7wzDqrQvEmDFjdOedd2r48OEaN26c3n77bQ0cOFB/+tOffH4mOztbpaWl5nL48OEmf38ALYsACAD+C2vvDjQmJiZGoaGh9ap9J06cqFcVbI6QkBBdffXVDVYAIyMjFRkZ2WLfE0DLIQACgP+CvgIYERGhtLQ05eXleazPy8tTRkZGi30fwzCUn5+v+Pj4FtsngLbjfg2g+2sAQH1BXwGUpKysLE2fPl0jR45Uenq6XnzxRRUVFWnOnDmSLg3NHj16VK+99pr5mfz8fEmXJnqcPHlS+fn5ioiI0NChQyVJjzzyiMaMGaMBAwaorKxMzz77rPLz8/X888+3+fEBaD4qgADgP0sEwKlTp+r06dNatGiRiouLNWzYMK1Zs0ZJSUmSLt34ue49AVNTU83XO3fu1JtvvqmkpCQdOnRIknTu3Dn98pe/VElJiZxOp1JTU/XPf/5To0aNarPjAtByCIAA4D+HYRhGe3fCqsrKyuR0OlVaWqpu3bq1d3cAW7v++uu1fv16SVKfPn1UWFjYzj0CEKz4/W2BawABwB9UAAHAfwRAAB0CN4IGAP8RAAF0CFQAAcB/BEAAHQIBEAD8RwAE0CEQAAHAfwRAAB0C1wACgP8IgAA6BCqAAOA/AiCADsE99NXW1qq2trYdewMAwY0ACKBDqFv143nAAOAbARBAh1A38DEMDAC+EQABdAhUAAHAfwRAAB1C3QBIBRAAfCMAAugQCIAA4D8CIIAOgQAIAP4jAALoEJgEAgD+IwAC6BCYBAIA/iMAAugQ6gZAbgQNAL4RAAF0CFQAAcB/BEAAluet2kcFEAB8IwACsDz3al9ISEi9dQAATwRAAJbnXu0LDw+vtw4A4IkACMDy3Kt9rgBIBRAAfCMAArA8KoAAEBgCIADLowIIAIEhAAKwPCqAABAYAiAAy6MCCACBIQACsDz3al9YWFi9dQAATwRAAJbnqvaFhIRwH0AA8AMBEIDluap9oaGhCg0NlUQABICGEAABWJ63CiBDwADgGwEQgOVRAQSAwBAAAVieewXQFQCpAAKAbwRAAJbnXgFkEggANI4ACMDyqAACQGAIgAAszxX2uA0MAPiHAAjA8lxhz30SCBVAAPCNAAjA8qgAAkBgCIAALI8KIAAEhgAIwPKoAAJAYAiAACyPCiAABIYACMDyqAACQGAIgAAsjwogAASGAAjA8qgAAkBgCIAALI8KIAAEhgAIwPKoAAJAYAiAACyPCiAABIYACMDyqAACQGAIgAAsz1sFkAAIAL4RAAFYnrcKIEPAAOCbZQLg4sWLlZycrKioKKWlpemDDz7w2ba4uFjTpk3ToEGDFBISonnz5nltt2LFCg0dOlSRkZEaOnSoVq1a1Uq9B9CaqAACQGAsEQCXL1+uefPmacGCBdq9e7fGjRuniRMnqqioyGv7iooK9ezZUwsWLNDw4cO9ttm6daumTp2q6dOn65NPPtH06dM1ZcoUffTRR615KABagXsFkEkgANA4SwTAp59+WrNmzdJdd92lIUOGKDc3V4mJiVqyZInX9n379tUzzzyjGTNmyOl0em2Tm5ur66+/XtnZ2Ro8eLCys7P1wx/+ULm5ua14JABag3sFkEkgANC4oA+AlZWV2rlzpzIzMz3WZ2ZmasuWLU3e79atW+vtc8KECQ3us6KiQmVlZR4LgPZHBRAAAhP0AfDUqVOqqalRbGysx/rY2FiVlJQ0eb8lJSUB7zMnJ0dOp9NcEhMTm/z9AbQcKoAAEJigD4AuDofD471hGPXWtfY+s7OzVVpaai6HDx9u1vcH0DKoAAJAYMLauwONiYmJUWhoaL3K3IkTJ+pV8AIRFxcX8D4jIyMVGRnZ5O8JoHVQAQSAwAR9BTAiIkJpaWnKy8vzWJ+Xl6eMjIwm7zc9Pb3ePtetW9esfQJoH1QAASAwQV8BlKSsrCxNnz5dI0eOVHp6ul588UUVFRVpzpw5ki4NzR49elSvvfaa+Zn8/HxJ0vnz53Xy5Enl5+crIiJCQ4cOlSTNnTtX3/ve9/Tkk0/qxz/+sd59912tX79emzdvbvPjA9A8VAABIDCWCIBTp07V6dOntWjRIhUXF2vYsGFas2aNkpKSJF268XPdewKmpqaar3fu3Kk333xTSUlJOnTokCQpIyNDy5Yt00MPPaTf/va36tevn5YvX67Ro0e32XEBaBlUAAEgMJYIgJJ0zz336J577vG6benSpfXWGYbR6D5vu+023Xbbbc3tGoB2RgUQAAIT9NcAAkBjqAACQGAIgAAsjwogAASGAAjA8qgAAkBgCIAALI8KIAAEhgAIwPK8VQAJgADgGwEQgOV5qwAyBAwAvhEAAVgeFUAACAwBEIDluVcAmQQCAI0jAAKwPPcKIJNAAKBxBEAAlkcFEAACQwAEYHlUAAEgMARAAJbnCoBUAAHAPwRAAJbnqvZRAQQA/xAAAVgeFUAACAwBEIDlUQEEgMAQAAFYHhVAAAgMARCA5VEBBIDAEAABWJ63R8FRAQQA3wiAACzP/UbQVAABoHEEQACWRwUQAAJDAARgeVQAASAwBEAAlkcFEAACQwAEYHlUAAEgMARAAJZHBRAAAkMABGB5VAABIDAEQACWRwUQAAJDAARged4qgARAAPCNAAjA8twrgARAAGgcARCA5XENIAAEhgAIwPK4BhAAAkMABGB5XAMIAIEhAAKwPG/XADIEDAC+EQABWJ57BZAhYABoHAEQgOUxCxgAAkMABGB5zAIGgMAQAAFYHrOAASAwBEAAlscsYAAIDAEQgOUxCxgAAkMABGB5VAABIDAEQACWxzWAABAYAiAAy6MCCACBIQACsDyuAQSAwBAAAVgeTwIBgMAQAAFYHk8CAYDAEAABWB5PAgGAwBAAAVges4ABIDAEQACWxyxgAAgMARCA5Xm7BtB9PQDAEwEQgOV5mwUsEQABwBfLBMDFixcrOTlZUVFRSktL0wcffNBg+02bNiktLU1RUVFKSUnRCy+84LF96dKlcjgc9ZaLFy+25mEAaAVUAAEgMJYIgMuXL9e8efO0YMEC7d69W+PGjdPEiRNVVFTktf3Bgwd14403aty4cdq9e7d+85vf6Fe/+pVWrFjh0a5bt24qLi72WKKiotrikAC0IG/XAEoEQADwJay9O+CPp59+WrNmzdJdd90lScrNzdV7772nJUuWKCcnp177F154QX369FFubq4kaciQIdqxY4d+//vf6yc/+YnZzuFwKC4urk2OAUDr8VUB5FYwAOBd0FcAKysrtXPnTmVmZnqsz8zM1JYtW7x+ZuvWrfXaT5gwQTt27FBVVZW57vz580pKSlLv3r01efJk7d69u8G+VFRUqKyszGMB0P64BhAAAhP0AfDUqVOqqalRbGysx/rY2FiVlJR4/UxJSYnX9tXV1Tp16pQkafDgwVq6dKlWr16tt956S1FRURo7dqz279/vsy85OTlyOp3mkpiY2MyjA9ASuAYQAAIT9AHQxeFweLw3DKPeusbau68fM2aM7rzzTg0fPlzjxo3T22+/rYEDB+pPf/qTz31mZ2ertLTUXA4fPtzUwwHQgnxdA8gQMAB4F/TXAMbExCg0NLRete/EiRP1qnwucXFxXtuHhYWpR48eXj8TEhKiq6++usEKYGRkpCIjIwM8AgCtzduTQNzXAwA8BX0FMCIiQmlpacrLy/NYn5eXp4yMDK+fSU9Pr9d+3bp1GjlypMLDw71+xjAM5efnKz4+vmU6DqDNuFcA3av/BEAA8C7oA6AkZWVl6b//+7/1yiuvaN++fZo/f76Kioo0Z84cSZeGZmfMmGG2nzNnjgoLC5WVlaV9+/bplVde0csvv6z777/fbPPII4/ovffe01dffaX8/HzNmjVL+fn55j4BWId7BdD9K0PAAOBd0A8BS9LUqVN1+vRpLVq0SMXFxRo2bJjWrFmjpKQkSVJxcbHHPQGTk5O1Zs0azZ8/X88//7wSEhL07LPPetwC5ty5c/rlL3+pkpISOZ1Opaam6p///KdGjRrV5scHoHncK4Cur7W1tVQAAcAHh+GaHYGAlZWVyel0qrS0VN26dWvv7gC2FRISIsMwVFxcrLi4OEVFRamiokJFRUXM1gdQD7+/LTIEDAC+GIZhzvJnCBgA/EMABGBp7sO8riFgVwBkCBgAvCMAArA09yqfK/i5giABEAC8IwACsDQqgAAQOAIgAEvzVgHkGkAAaBgBEICleasAMgQMAA0jAAKwtIYqgARAAPCOAAjA0hq6BpAhYADwjgAIwNKYBQwAgSMAArA095DHEDAA+IcACMDSXBVAV+hzf80QMAB4RwAEYGmuKp9r2Nf9NRVAAPCOAAjA0hqqABIAAcA7AiAAS/NWASQAAkDDCIAALI1rAAEgcARAAJbGNYAAEDgCIABL4xpAAAgcARCApTV0DSBDwADgHQEQgKV5qwAyBAwADSMAArA0ZgEDQOAIgAAsjVnAABA4AiAAS2MWMAAEjgAIwNKYBQwAgSMAArA0ZgEDQOAIgAAsLdAK4MGDB7Vhw4a26RwABCkCIABLC+QawKqqKl1zzTUaP348IRCArREAAVhaIBXAgwcP6tixY5KkdevWtVEPASD4EAABWFog1wAWFRWZr//1r3+1Qe8AIDgRAAFYWiBPAiksLDRf79u3rw16BwDBiQAIwNICeRKIewXw8OHDMgyjDXoIAMGHAAjA0gJ5EsjZs2fN1xcvXlRpaWkb9BAAgg8BEIClBTILuKyszON9cXFxK/cOAIITARCApQUyC7i8vNzjPQEQgF0RAAFYQnFxsf7yl7+osrLSY30gs4AJgABwCQEQgCVMmTJFM2fO1KOPPuqxPpBZwK4A2KVLF0kEQAD2RQAEEPTOnj2rzZs3S5KWLVvmsS2QWcCuawAHDhwoiQAIwL4IgACCXkFBgfnafSavFNgsYFcFkAAIwO4IgACC3ldffWW+Pn36tC5cuGC+d1X5ApkEQgAEYHcEQABBzz0AStKpU6fM164qnz+3gXEFwAEDBkgiAAKwLwIggKBXNwC6DwN7C4DeKoDV1dVm25SUFEkEQAD2RQAEEPTqBsBz586ZrxsKgO7XAFZUVJivk5OTJV2aFPLNN9+0eH8BINgRAAEEvYYCoL9PArl48aL5umfPnurUqZMkqoAA7IkACCCoVVRU6MiRI5Kk1NRUSd4rgI1NAnFVAENDQxUWFqb4+HhJBEAA9kQABBDUCgsLZRiGoqOjzckbzRkCjoyMlCQzAJaUlLRe5wEgSBEAAQQ11/BvcnKyLr/8ckmNB8CGhoCjoqIkiQogAFsjAAIIal9++aWkS7du6datmySptLTU3O7vk0B8VQAJgADsiAAIIKi5AmC/fv0UHR0tSR43gvZ3CJgKIAB8iwAIIKi5AmD//v3VuXNnSfK4dUugk0BcFcCEhARJMieYAICdEAABBDX3AOi6dYu3ABjoNYD9+/eXJO3fv7+1ug4AQSusvTvgr8WLF+u//uu/VFxcrO985zvKzc3VuHHjfLbftGmTsrKy9NlnnykhIUG//vWvNWfOHI82K1as0G9/+1sdOHBA/fr102OPPaZbbrmltQ8FgJ8uXryoAwcOSLr0/N7CwkJJjQdAfyqArucBFxUV6cKFC2a4BNC4Cxcu6MCBA/riiy/MpbCwUNXV1aqtrVVYWJi6d++uHj16KDY2Vv369VNKSor69eun+Ph4j4o92oclAuDy5cs1b948LV68WGPHjtWf//xnTZw4UZ9//rn69OlTr/3Bgwd14403avbs2Xr99df14Ycf6p577lHPnj31k5/8RJK0detWTZ06VY8++qhuueUWrVq1SlOmTNHmzZs1evTotj5EAF58+umnqq6uVkxMjHr37u11CLihSSANXQMYExMjp9Op0tJSHThwQMOGDWvdgwEsprKyUkVFRfriiy+0f/9+j7B3+PBhGYbRpP126tRJ/fr1U79+/dS/f39z6devn/r06ePx/zJajyUC4NNPP61Zs2bprrvukiTl5ubqvffe05IlS5STk1Ov/QsvvKA+ffooNzdXkjRkyBDt2LFDv//9780AmJubq+uvv17Z2dmSpOzsbG3atEm5ubl666232ubA0CwN/fBp6rb2+qzV9tvafYqOjlZERIQ2b94sSRo5cqQcDkeD1wA2NgRctwLocDg0cOBAffzxxyooKCAAWlBtba2qqqrMpbq6usH2jf3bczgc6tGjR5tXp2pra1VWVqbTp0+rtLTUPBbXV8MwVFtba351f93cr7W1tTp//rzOnTunc+fO6ezZszpy5IgOHTqko0ePevw/VJfT6dSgQYM0cOBADRgwQCkpKYqKilJISIgqKyt15swZnTlzRkeOHNGBAwd04MABFRYW6sKFC9q7d6/27t1bb5+hoaHq1auXYmNjzeWWW27RzTff3Ir/Bewp6ANgZWWldu7cqQcffNBjfWZmprZs2eL1M1u3blVmZqbHugkTJujll19WVVWVwsPDtXXrVs2fP79eG1do9KaiosLjeaJlZWUBHo1/HnvsMf3ud7/zus1OQQH2FRUVpR/96EfKy8uTJE2cOFGSWnQSiCRdeeWV+vjjj7Vjxw7zj0Pp0r/L48ePa9++fTp9+rTOnz+v8+fPq7y8XF9//bX5s8C1VFZWqqqqSjU1NaqurjbX1dTUmIvrl62vxTAMj1/O3t67Xrv309vXhta5+ujql2vILjQ0VJGRkYqMjFSnTp102WWX6bLLLlP37t0VFxen+Ph4xcfHKykpScnJyUpKSjL/e7S0s2fPav/+/fryyy+1f/9+FRUV6fTp0x7LmTNnGg18TREZGamUlBQNGTJEI0eO1KhRozRq1Ch17dq1RfZfXV2t7du3a/369dq5c6e++OILHThwQFVVVS2y/5YWFRWlAQMGmCFv4MCB5hITEyOHwxHQ/qqqqnTo0CEdOHBAX375pcfXAwcOqLKyUsXFxR6z8/v160cAbAVBHwBPnTqlmpoaxcbGeqyPjY31eQf/kpISr+2rq6t16tQpxcfH+2zT0FMBcnJy9MgjjzTxSPxXXV3t8dxSwG4uXryod955R5IUHR2t22+/XVLDATDQIWBJGjdunF555RVt2LBBhmFo48aNevXVV7Vhwwbb3R6mpqZG33zzjb755hudPXtWx44da/QzPXv2VGJiohITE9WnTx/ztWtJSEhQWFj9XzPV1dU6ffq0jhw5ov3795vDi67XZ86caY1D9EtFRYX27dunffv2aeXKlZKksLAwjR49WuPHj9f48eM1evRohYeH+7U/wzD0r3/9S+vXr9f69eu1ceNGlZeXe23buXNnXXbZZYqIiFBYWJjCw8MVGhqqkJAQORwOj6/e1jX1a5cuXczAf9lllykhIUF9+/ZV37591atXrxatiIaHh2vAgAHmU33c1dTUqKSkRMePH/dYGrreH00X9AHQpe5fGYZhNPiXh7f2ddcHus/s7GxlZWWZ78vKypSYmNh45wM0d+5czZw50+f2QI67tbcFW3+CaVuw9SeYtjW2fc+ePXruuedUUFCgBx980LxnnysAut8H0Ns1gP4MAUuXqv5hYWH6+OOP1b9/f/OpI9KlEJmSkqL4+Hh16dLFXKKjoxUVFaWIiAhFRUUpMjJSERER5i/rsLAwc11oaKi5hISEmF/dF/dfxq6l7ntv6+qex4bWuW8LCwsz++n+1VW5rKio0Ndff63S0lKdO3dOp0+fVklJiYqLi3X06FEVFhbq4MGDKisr08mTJ3Xy5Ent2rXL63/HkJAQJSQkKCoqyqxiuoY6G6v+x8fHa8CAAerfv7+Sk5MVExOjHj16mEv37t3VqVMnhYeHm0tYWFjAFSl31dXVOnz4sPbv3689e/Zo+/bt2rZtm4qKivThhx/qww8/1COPPKLo6GiNHTtWo0eP1ogRI5SSkqK4uDhJl/44KSws1CeffKIPP/xQmzdvrhemu3fvrh/84AcaN26chgwZogEDBiguLs7jjxM7Cg0N1RVXXKErrriivbtiC0EfAGNiYhQaGlqvMnfixIl6FTyXuLg4r+3DwsLUo0ePBtv42qckc3iktbn+CgPsasSIEXrllVfqrQ+0AtjQbWCkSyHjF7/4hV588UV99dVXioyM1C9+8QvdfvvtGjNmDDODfTAMQ2fPnlVRUZEOHz7sdTly5Iiqqqp83mfR4XCoV69e6t+/vzm86Fr69+9v3vS7LYWFhSk5OVnJyckelxF99dVX2rBhg7mcOnVK69at07p16/zab2RkpMaNG2dWEK+66iomOqDdBX0AjIiIUFpamvLy8jxu0ZKXl6cf//jHXj+Tnp6uv//97x7r1q1bp5EjR5pl+/T0dOXl5XlcB7hu3TplZGS0wlEAaAmuAPj111+b6xq6BtB9CNhbBVCS/vSnP2nEiBG6cOGC7rjjDrOSA98cDoe6d++u7t2766qrrvLapra2VsePH9eRI0dUWVlpVi67dOmiXr16mX/cW0FKSopSUlI0e/Zs1dbWas+ePdqyZYu2b9+uPXv2qLCwUKdOnZJ06XdWnz59NHDgQGVkZCgjI4M/JhCUgj4ASlJWVpamT5+ukSNHKj09XS+++KKKiorM+/plZ2fr6NGjeu211yRJc+bM0XPPPaesrCzNnj1bW7du1csvv+wxu3fu3Ln63ve+pyeffFI//vGP9e6772r9+vXmrEMAwccV3qqqqlRbW6uQkJAm3wjaJSIiQv/+7//eqv22o5CQEHPiSEcSEhKi4cOHa/jw4br77rvN9Y1dQgQEG0sEwKlTp+r06dNatGiRiouLNWzYMK1Zs0ZJSUmSLj3Ls6ioyGyfnJysNWvWaP78+Xr++eeVkJCgZ5991mOWX0ZGhpYtW6aHHnpIv/3tb9WvXz8tX76cewACQcy9eldRUaFOnTo1+UbQQEsi/MFqLBEAJemee+7RPffc43Xb0qVL66279tprfV6Y7HLbbbfptttua4nuAWgD3gJgU28EDQB2xrNYAFhGRESE+dpV0aMCCACBIwACsAyHw2GGwMrKSkneJ4H4exsYALArAiAAS3EFuEArgK7A6F5FBAC7IgACsJS6AdDfawBdjw3z9mQKALAbAiAAS/GnAuhtCNj1rFV/H+EFAB0ZARCApTR1CJgACADfIgACsBRfAbCxJ4EQAAHgWwRAAJbS1CFgrgEEgG8RAAFYSiCTQBgCBgDvCIAALCWQawAZAgYA7wiAACyFIWAAaD4CIABLcd3I2Z9JIAwBA4B3BEAAlsI1gADQfARAAJbCNYAA0HwEQACWwjWAANB8BEAAlsKTQACg+QiAACyFJ4EAQPMRAAFYiisAVlZWSvI+CYQhYABoGAEQgKUwBAwAzUcABGApzAIGgOYjAAKwFH+uAaw7BFxbW2u+JgACAAEQgMU05UbQruv/JK4BBACJAAjAYupOAvFnCNg1/CtRAQQAiQAIwGJczwL2JwC6KoAEQADwRAAEYCmuABjIk0AYAgYATwRAAJZStwLoCnnebgRdtwIYEhLi0Q4A7IqfhAAsJZAh4LrXADL8CwCXEAABWIo/k0B8DQETAAHgEgIgAEtpziQQrv8DgEsIgAAsxZ9JIAwBA0DDCIAALMWfSSB1h4AJgADgiQAIwFKaMgTsugaQIWAAuIQACMBSmvMkECqAAHAJARCApfhTAWQIGAAaRgAEYCl1J4G4Qp4/Q8AEQAC4hAAIwFLcK4CGYZgVQH+eBMI1gABwCQEQgKW4AqB0KdgZhiGJawABIBAEQACW4poEIkkXLlwwX3MNIAD4jwAIwFLcK4C+AqD7cLBhGNwGBgDqIAACsJTQ0FA5HA5JngHQ2zWA0qVhYCqAAOCJAAjAUhwOh1kF/Oabb8z17uHOvRpYW1tLAASAOgiAACzHWwB0H951rwDW1tZyGxgAqIMACMByXBNB3AOgr2sA3YeAuQYQAC4hAAKwnLoVwJCQEPO6QIkhYABoDAEQgOW4AuDXX38tqX5lr+4QMAEQADwRAAFYTt0KYEMBsKamhtvAAEAdBEAAlhNIAKQCCAD1EQABWE7dSSAEQAAITNAHwLNnz2r69OlyOp1yOp2aPn26zp071+BnDMPQwoULlZCQoE6dOun73/++PvvsM4823//+9+VwODyWO+64oxWPBEBLaawCKH0bArkNDADUF/QBcNq0acrPz9fatWu1du1a5efna/r06Q1+5qmnntLTTz+t5557Th9//LHi4uJ0/fXXq7y83KPd7NmzVVxcbC5//vOfW/NQALSQQAIgt4EBgPqC+qfhvn37tHbtWm3btk2jR4+WJL300ktKT09XQUGBBg0aVO8zhmEoNzdXCxYs0K233ipJ+stf/qLY2Fi9+eab+vd//3ezbefOnRUXF9c2BwOgxfgTAENDQ1VdXc0QMAB4EdQVwK1bt8rpdJrhT5LGjBkjp9OpLVu2eP3MwYMHVVJSoszMTHNdZGSkrr322nqfeeONNxQTE6PvfOc7uv/+++tVCAEEp0CHgAmAAOApqCuAJSUl6tWrV731vXr1UklJic/PSFJsbKzH+tjYWBUWFprvf/aznyk5OVlxcXHau3evsrOz9cknnygvL89nfyoqKlRRUWG+LysrC+h4ALSMxiaBSJ5DwNwGBgA8tUsFcOHChfUmYNRdduzYIUked/d3MQzD63p3dbfX/czs2bM1fvx4DRs2THfccYf+9re/af369dq1a5fPfebk5JiTUZxOpxITEwM5bAAtxN8hYIkKIAB40y5/Dt97772Nzrjt27evPv30Ux0/frzetpMnT9ar8Lm4rukrKSlRfHy8uf7EiRM+PyNJI0aMUHh4uPbv368RI0Z4bZOdna2srCzzfVlZGSEQaAeNPQlEYggYABrSLgEwJiZGMTExjbZLT09XaWmptm/frlGjRkmSPvroI5WWliojI8PrZ1zDunl5eUpNTZUkVVZWatOmTXryySd9fq/PPvtMVVVVHqGxrsjISHPoCUD7CXQWMLeBAQBPQT0JZMiQIbrhhhs0e/Zsbdu2Tdu2bdPs2bM1efJkjxnAgwcP1qpVqyRdGvqdN2+eHn/8ca1atUp79+7VzJkz1blzZ02bNk2SdODAAS1atEg7duzQoUOHtGbNGt1+++1KTU3V2LFj2+VYAfivqUPAXAMIAJcE/U/DN954Q7/61a/MWb033XSTnnvuOY82BQUFKi0tNd//+te/1oULF3TPPffo7NmzGj16tNatW6euXbtKuvTLY8OGDXrmmWd0/vx5JSYmatKkSXr44YfNXxoAglcgk0AYAgaA+oI+AHbv3l2vv/56g20Mw/B473A4tHDhQi1cuNBr+8TERG3atKmlugigjXEbGABonqAeAgYAbwKZBMJtYACgPgIgAMvhNjAA0DwEQACW4wqAFy5ckMQQMAAEigAIwHLq3o6J28AAQGAIgAAsx1UBdOE2MAAQGAIgAMvxJwAyBAwAvhEAAVhOIAGwpqaGAAgAdRAAAVhOoEPA3AYGADwRAAFYTiCTQBgCBoD6CIAALKduBdDbIxwZAgYA3wiAACynbgCsWxGUPCuADAEDgCcCIADL8ScA8iQQAPCNAAjAcgKtABIAAcATARCA5dQNfA0FQK4BBID6CIAALCfQIWCuAQQATwRAAJZTNwDWfS/xLGAAaAgBEIDlBHINYGVlpbmOAAgAlxAAAVhOIEPAFy9eNNcRAAHgEgIgAMsJZBJIRUWFuY4ACACXEAABWE6nTp083lMBBIDAEAABWE5UVJQcDof53lsAdM34vXDhgqRLFUFXVRAA7I6fhgAsx+FwqEuXLuZ7fyqAVP8A4FsEQACWFB0dbb72pwJIAASAbxEAAVgSARAAmo4ACMCSAg2APAUEAL5FAARgSY1dA0gFEAB8IwACsCT3CmBUVFS97UwCAQDfCIAALMm96nfZZZfV204FEAB8IwACsKSamhrzdbdu3eptJwACgG8EQACW5BrilbyHOwIgAPhGAARgSXFxcQ1udwVEAiAA1EcABGBJDz/8sNLT07V8+XKv210VQCaBAEB93BgLgCX17t1bW7Zs8bmdAAgAvlEBBNAhcQ0gAPhGAATQIREAAcA3AiCADolJIADgGwEQQIfkqgAahiGJAAgA7giAADokVwB0IQACwLcIgAA6JAIgAPhGAATQIbk/KUQiAAKAOwIggA6JCiAA+EYABNAhEQABwDcCIIAOiQAIAL4RAAF0SARAAPCNAAigQ2ISCAD4RgAE0CFRAQQA3wiAADokAiAA+EYABNAhEQABwDcCIIAOiQAIAL4FfQA8e/aspk+fLqfTKafTqenTp+vcuXMNfmblypWaMGGCYmJi5HA4lJ+fX69NRUWF7rvvPsXExCg6Olo33XSTjhw50joHAaDNMQkEAHwL+gA4bdo05efna+3atVq7dq3y8/M1ffr0Bj/z9ddfa+zYsXriiSd8tpk3b55WrVqlZcuWafPmzTp//rwmT56smpqalj4EAO0gIiLC4z0BEAC+FdZ4k/azb98+rV27Vtu2bdPo0aMlSS+99JLS09NVUFCgQYMGef2cKyAeOnTI6/bS0lK9/PLL+utf/6rx48dLkl5//XUlJiZq/fr1mjBhQssfDIA2FRkZ6fG+biAEADsL6grg1q1b5XQ6zfAnSWPGjJHT6dSWLVuavN+dO3eqqqpKmZmZ5rqEhAQNGzasWfsFEDzqBsCoqKh26gkABJ+grgCWlJSoV69e9db36tVLJSUlzdpvRESELr/8co/1sbGxDe63oqJCFRUV5vuysrIm9wFA6yIAAoBv7VIBXLhwoRwOR4PLjh07JEkOh6Pe5w3D8Lq+uRrbb05OjjkZxel0KjExscX7AKBlEAABwLd2qQDee++9uuOOOxps07dvX3366ac6fvx4vW0nT55UbGxsk79/XFycKisrdfbsWY8q4IkTJ5SRkeHzc9nZ2crKyjLfl5WVEQKBIEUABADf2iUAxsTEKCYmptF26enpKi0t1fbt2zVq1ChJ0kcffaTS0tIGg1pj0tLSFB4erry8PE2ZMkWSVFxcrL179+qpp57y+bnIyMh6v1QABKe6kz4IgADwraCeBDJkyBDdcMMNmj17trZt26Zt27Zp9uzZmjx5sscM4MGDB2vVqlXm+zNnzig/P1+ff/65JKmgoED5+fnm9X1Op1OzZs3Sf/7nf2rDhg3avXu37rzzTl155ZXmrGAA1kYFEAB8C+oAKElvvPGGrrzySmVmZiozM1Pf/e539de//tWjTUFBgUpLS833q1evVmpqqiZNmiRJuuOOO5SamqoXXnjBbPPHP/5RN998s6ZMmaKxY8eqc+fO+vvf/17v5rEArIkACAC+OQzDMNq7E1ZVVlYmp9Op0tJSdevWrb27A8BNbW2txx90Bw4cUEpKSjv2CECw4Pe3BSqAANAUISEhHs8DpgIIAN8iAALosAiAAOAdARBAh+V+hQsBEAC+RQAE0GG5B0Bu4QQA3yIAAuiw3AMgM/wB4FsEQAAdVm1tbXt3AQCCEgEQQIdVU1PT3l0AgKBEAAQAALAZAiCADouJHwDgHQEQQIc1f/58SdJNN93Uzj0BgOAS1ngTALCmBx54QCNGjCAAAkAdBEAAHdZll12m22+/vb27AQBBhyFgAAAAmyEAAgAA2AwBEAAAwGYIgAAAADZDAAQAALAZAiAAAIDNEAABAABshgAIAABgMwRAAAAAmyEAAgAA2AwBEAAAwGYIgAAAADZDAAQAALCZsPbugJUZhiFJKisra+eeAAAAf7l+b7t+j9sRAbAZysvLJUmJiYnt3BMAABCo8vJyOZ3O9u5Gu3AYdo6/zVRbW6tjx46pa9eucjgcLbrvsrIyJSYm6vDhw+rWrVuL7hvf4jy3Dc5z2+A8tw3Oc9tprXNtGIbKy8uVkJCgkBB7Xg1HBbAZQkJC1Lt371b9Ht26deMHTBvgPLcNznPb4Dy3Dc5z22mNc23Xyp+LPWMvAACAjREAAQAAbIYAGKQiIyP18MMPKzIysr270qFxntsG57ltcJ7bBue57XCuWw+TQAAAAGyGCiAAAIDNEAABAABshgAIAABgMwRAAAAAmyEABqHFixcrOTlZUVFRSktL0wcffNDeXbK0nJwcXX311eratat69eqlm2++WQUFBR5tDMPQwoULlZCQoE6dOun73/++Pvvss3bqcceQk5Mjh8OhefPmmes4zy3j6NGjuvPOO9WjRw917txZV111lXbu3Glu5zy3jOrqaj300ENKTk5Wp06dlJKSokWLFqm2ttZsw7kO3D//+U/96Ec/UkJCghwOh/7nf/7HY7s/57SiokL33XefYmJiFB0drZtuuklHjhxpw6PoAAwElWXLlhnh4eHGSy+9ZHz++efG3LlzjejoaKOwsLC9u2ZZEyZMMF599VVj7969Rn5+vjFp0iSjT58+xvnz5802TzzxhNG1a1djxYoVxp49e4ypU6ca8fHxRllZWTv23Lq2b99u9O3b1/jud79rzJ0711zPeW6+M2fOGElJScbMmTONjz76yDh48KCxfv1648svvzTbcJ5bxu9+9zujR48exv/+7/8aBw8eNN555x2jS5cuRm5urtmGcx24NWvWGAsWLDBWrFhhSDJWrVrlsd2fczpnzhzjiiuuMPLy8oxdu3YZ1113nTF8+HCjurq6jY/GugiAQWbUqFHGnDlzPNYNHjzYePDBB9upRx3PiRMnDEnGpk2bDMMwjNraWiMuLs544oknzDYXL140nE6n8cILL7RXNy2rvLzcGDBggJGXl2dce+21ZgDkPLeMBx54wLjmmmt8buc8t5xJkyYZv/jFLzzW3Xrrrcadd95pGAbnuiXUDYD+nNNz584Z4eHhxrJly8w2R48eNUJCQoy1a9e2Wd+tjiHgIFJZWamdO3cqMzPTY31mZqa2bNnSTr3qeEpLSyVJ3bt3lyQdPHhQJSUlHuc9MjJS1157Lee9Cf7jP/5DkyZN0vjx4z3Wc55bxurVqzVy5Ejdfvvt6tWrl1JTU/XSSy+Z2znPLeeaa67Rhg0b9MUXX0iSPvnkE23evFk33nijJM51a/DnnO7cuVNVVVUebRISEjRs2DDOewDC2rsD+NapU6dUU1Oj2NhYj/WxsbEqKSlpp151LIZhKCsrS9dcc42GDRsmSea59XbeCwsL27yPVrZs2TLt2rVLH3/8cb1tnOeW8dVXX2nJkiXKysrSb37zG23fvl2/+tWvFBkZqRkzZnCeW9ADDzyg0tJSDR48WKGhoaqpqdFjjz2mn/70p5L4N90a/DmnJSUlioiI0OWXX16vDb8r/UcADEIOh8PjvWEY9dahae699159+umn2rx5c71tnPfmOXz4sObOnat169YpKirKZzvOc/PU1tZq5MiRevzxxyVJqamp+uyzz7RkyRLNmDHDbMd5br7ly5fr9ddf15tvvqnvfOc7ys/P17x585SQkKCf//znZjvOdctryjnlvAeGIeAgEhMTo9DQ0Hp/wZw4caLeX0MI3H333afVq1dr48aN6t27t7k+Li5OkjjvzbRz506dOHFCaWlpCgsLU1hYmDZt2qRnn31WYWFh5rnkPDdPfHy8hg4d6rFuyJAhKioqksS/55b0//7f/9ODDz6oO+64Q1deeaWmT5+u+fPnKycnRxLnujX4c07j4uJUWVmps2fP+myDxhEAg0hERITS0tKUl5fnsT4vL08ZGRnt1CvrMwxD9957r1auXKn3339fycnJHtuTk5MVFxfncd4rKyu1adMmznsAfvjDH2rPnj3Kz883l5EjR+pnP/uZ8vPzlZKSwnluAWPHjq13G6MvvvhCSUlJkvj33JK++eYbhYR4/poMDQ01bwPDuW55/pzTtLQ0hYeHe7QpLi7W3r17Oe+BaLfpJ/DKdRuYl19+2fj888+NefPmGdHR0cahQ4fau2uWdffddxtOp9P4xz/+YRQXF5vLN998Y7Z54oknDKfTaaxcudLYs2eP8dOf/pRbObQA91nAhsF5bgnbt283wsLCjMcee8zYv3+/8cYbbxidO3c2Xn/9dbMN57ll/PznPzeuuOIK8zYwK1euNGJiYoxf//rXZhvOdeDKy8uN3bt3G7t37zYkGU8//bSxe/du83Zn/pzTOXPmGL179zbWr19v7Nq1y/jBD37AbWACRAAMQs8//7yRlJRkREREGCNGjDBvV4KmkeR1efXVV802tbW1xsMPP2zExcUZkZGRxve+9z1jz5497dfpDqJuAOQ8t4y///3vxrBhw4zIyEhj8ODBxosvvuixnfPcMsrKyoy5c+caffr0MaKiooyUlBRjwYIFRkVFhdmGcx24jRs3ev2Z/POf/9wwDP/O6YULF4x7773X6N69u9GpUydj8uTJRlFRUTscjXU5DMMw2qf2CAAAgPbANYAAAAA2QwAEAACwGQIgAACAzRAAAQAAbIYACAAAYDMEQAAAAJshAAIAANgMARAAAMBmCIAAAAA2QwAEAACwGQIgAACAzRAAAQAAbIYACAAAYDMEQAAAAJshAAIAANgMARAAAMBmCIAAAAA2QwAEAACwGQIgAACAzRAAAQAAbIYACAAAYDMEQAAAAJshAAIAANgMARAAAMBmCIAAAAA2QwAEAACwGQIgAACAzRAAAQAAbIYACAAAYDMEQAAAAJshAAIAANjM/wcNEUIZcihhwgAAAABJRU5ErkJggg==", "text/html": [ - "" + "\n", + "
\n", + "
\n", + " Figure\n", + "
\n", + " \n", + "
\n", + " " ], "text/plain": [ - "" + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, @@ -2084,1026 +379,69 @@ { "data": { "text/plain": [ - "[(array([[0.]]),\n", - " )]" + "" ] }, - "execution_count": 4, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "from stride import Shot\n", - "from stride.utils import wavelets\n", - "\n", - "# Create shot\n", - "source = problem.geometry.locations[0]\n", - "receivers = problem.geometry.locations\n", - "\n", - "shot = Shot(id=0,\n", - " sources=[source], receivers=receivers,\n", - " geometry=problem.geometry, problem=problem)\n", + "from stride import IsoAcousticDevito\n", "\n", - "# and add it to the acquisition\n", - "problem.acquisitions.add(shot)\n", + "# Instantiate the PDE operator,\n", + "pde = IsoAcousticDevito(space=space, time=time)\n", "\n", - "# Create a wavelet for the shot\n", - "f_centre = 0.50e6\n", - "n_cycles = 3\n", + "# create a sub-problem for the shot,\n", + "sub_problem = problem.sub_problem(shot.id)\n", "\n", - "shot.wavelets.data[0] = wavelets.tone_burst(f_centre, n_cycles, time.num, time.step)\n", + "# and run it forward\n", + "traces = await pde(shot.wavelets, vp, problem=sub_problem)\n", "\n", - "# Plot the generated wavelet\n", - "shot.plot()" + "# Plot the resulting traces\n", + "_ = traces.plot()\n", + "traces.plot_one(60)" ] }, { "cell_type": "markdown", - "id": "guilty-information", + "id": "alone-steal", "metadata": {}, "source": [ - "Because we are going to run the acoustic modelling using constant density and no attenuation, the only thing that remains is creating a sound-speed scalar field." + "## Variable density and no attenuation\n", + "\n", + "Let's now introduce variable density into our previous example.\n", + "\n", + "To do this, we only need to create another scalar field that contains our density information:" ] }, { "cell_type": "code", - "execution_count": 5, - "id": "legislative-football", + "execution_count": 7, + "id": "killing-chest", "metadata": {}, "outputs": [ { "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "/* global mpl */\n", - "window.mpl = {};\n", - "\n", - "mpl.get_websocket_type = function () {\n", - " if (typeof WebSocket !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof MozWebSocket !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert(\n", - " 'Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.'\n", - " );\n", - " }\n", - "};\n", - "\n", - "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = this.ws.binaryType !== undefined;\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById('mpl-warnings');\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent =\n", - " 'This browser does not support binary websocket messages. ' +\n", - " 'Performance may be slow.';\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = document.createElement('div');\n", - " this.root.setAttribute('style', 'display: inline-block');\n", - " this._root_extra_style(this.root);\n", - "\n", - " parent_element.appendChild(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message('supports_binary', { value: fig.supports_binary });\n", - " fig.send_message('send_image_mode', {});\n", - " if (fig.ratio !== 1) {\n", - " fig.send_message('set_device_pixel_ratio', {\n", - " device_pixel_ratio: fig.ratio,\n", - " });\n", - " }\n", - " fig.send_message('refresh', {});\n", - " };\n", - "\n", - " this.imageObj.onload = function () {\n", - " if (fig.image_mode === 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function () {\n", - " fig.ws.close();\n", - " };\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "};\n", - "\n", - "mpl.figure.prototype._init_header = function () {\n", - " var titlebar = document.createElement('div');\n", - " titlebar.classList =\n", - " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", - " var titletext = document.createElement('div');\n", - " titletext.classList = 'ui-dialog-title';\n", - " titletext.setAttribute(\n", - " 'style',\n", - " 'width: 100%; text-align: center; padding: 3px;'\n", - " );\n", - " titlebar.appendChild(titletext);\n", - " this.root.appendChild(titlebar);\n", - " this.header = titletext;\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._init_canvas = function () {\n", - " var fig = this;\n", - "\n", - " var canvas_div = (this.canvas_div = document.createElement('div'));\n", - " canvas_div.setAttribute(\n", - " 'style',\n", - " 'border: 1px solid #ddd;' +\n", - " 'box-sizing: content-box;' +\n", - " 'clear: both;' +\n", - " 'min-height: 1px;' +\n", - " 'min-width: 1px;' +\n", - " 'outline: 0;' +\n", - " 'overflow: hidden;' +\n", - " 'position: relative;' +\n", - " 'resize: both;'\n", - " );\n", - "\n", - " function on_keyboard_event_closure(name) {\n", - " return function (event) {\n", - " return fig.key_event(event, name);\n", - " };\n", - " }\n", - "\n", - " canvas_div.addEventListener(\n", - " 'keydown',\n", - " on_keyboard_event_closure('key_press')\n", - " );\n", - " canvas_div.addEventListener(\n", - " 'keyup',\n", - " on_keyboard_event_closure('key_release')\n", - " );\n", - "\n", - " this._canvas_extra_style(canvas_div);\n", - " this.root.appendChild(canvas_div);\n", - "\n", - " var canvas = (this.canvas = document.createElement('canvas'));\n", - " canvas.classList.add('mpl-canvas');\n", - " canvas.setAttribute('style', 'box-sizing: content-box;');\n", - "\n", - " this.context = canvas.getContext('2d');\n", - "\n", - " var backingStore =\n", - " this.context.backingStorePixelRatio ||\n", - " this.context.webkitBackingStorePixelRatio ||\n", - " this.context.mozBackingStorePixelRatio ||\n", - " this.context.msBackingStorePixelRatio ||\n", - " this.context.oBackingStorePixelRatio ||\n", - " this.context.backingStorePixelRatio ||\n", - " 1;\n", - "\n", - " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", - " 'canvas'\n", - " ));\n", - " rubberband_canvas.setAttribute(\n", - " 'style',\n", - " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", - " );\n", - "\n", - " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", - " if (this.ResizeObserver === undefined) {\n", - " if (window.ResizeObserver !== undefined) {\n", - " this.ResizeObserver = window.ResizeObserver;\n", - " } else {\n", - " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", - " this.ResizeObserver = obs.ResizeObserver;\n", - " }\n", - " }\n", - "\n", - " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", - " var nentries = entries.length;\n", - " for (var i = 0; i < nentries; i++) {\n", - " var entry = entries[i];\n", - " var width, height;\n", - " if (entry.contentBoxSize) {\n", - " if (entry.contentBoxSize instanceof Array) {\n", - " // Chrome 84 implements new version of spec.\n", - " width = entry.contentBoxSize[0].inlineSize;\n", - " height = entry.contentBoxSize[0].blockSize;\n", - " } else {\n", - " // Firefox implements old version of spec.\n", - " width = entry.contentBoxSize.inlineSize;\n", - " height = entry.contentBoxSize.blockSize;\n", - " }\n", - " } else {\n", - " // Chrome <84 implements even older version of spec.\n", - " width = entry.contentRect.width;\n", - " height = entry.contentRect.height;\n", - " }\n", - "\n", - " // Keep the size of the canvas and rubber band canvas in sync with\n", - " // the canvas container.\n", - " if (entry.devicePixelContentBoxSize) {\n", - " // Chrome 84 implements new version of spec.\n", - " canvas.setAttribute(\n", - " 'width',\n", - " entry.devicePixelContentBoxSize[0].inlineSize\n", - " );\n", - " canvas.setAttribute(\n", - " 'height',\n", - " entry.devicePixelContentBoxSize[0].blockSize\n", - " );\n", - " } else {\n", - " canvas.setAttribute('width', width * fig.ratio);\n", - " canvas.setAttribute('height', height * fig.ratio);\n", - " }\n", - " canvas.setAttribute(\n", - " 'style',\n", - " 'width: ' + width + 'px; height: ' + height + 'px;'\n", - " );\n", - "\n", - " rubberband_canvas.setAttribute('width', width);\n", - " rubberband_canvas.setAttribute('height', height);\n", - "\n", - " // And update the size in Python. We ignore the initial 0/0 size\n", - " // that occurs as the element is placed into the DOM, which should\n", - " // otherwise not happen due to the minimum size styling.\n", - " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", - " fig.request_resize(width, height);\n", - " }\n", - " }\n", - " });\n", - " this.resizeObserverInstance.observe(canvas_div);\n", - "\n", - " function on_mouse_event_closure(name) {\n", - " return function (event) {\n", - " return fig.mouse_event(event, name);\n", - " };\n", - " }\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mousedown',\n", - " on_mouse_event_closure('button_press')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseup',\n", - " on_mouse_event_closure('button_release')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'dblclick',\n", - " on_mouse_event_closure('dblclick')\n", - " );\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband_canvas.addEventListener(\n", - " 'mousemove',\n", - " on_mouse_event_closure('motion_notify')\n", - " );\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseenter',\n", - " on_mouse_event_closure('figure_enter')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseleave',\n", - " on_mouse_event_closure('figure_leave')\n", - " );\n", - "\n", - " canvas_div.addEventListener('wheel', function (event) {\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " on_mouse_event_closure('scroll')(event);\n", - " });\n", - "\n", - " canvas_div.appendChild(canvas);\n", - " canvas_div.appendChild(rubberband_canvas);\n", - "\n", - " this.rubberband_context = rubberband_canvas.getContext('2d');\n", - " this.rubberband_context.strokeStyle = '#000000';\n", - "\n", - " this._resize_canvas = function (width, height, forward) {\n", - " if (forward) {\n", - " canvas_div.style.width = width + 'px';\n", - " canvas_div.style.height = height + 'px';\n", - " }\n", - " };\n", - "\n", - " // Disable right mouse context menu.\n", - " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n", - " event.preventDefault();\n", - " return false;\n", - " });\n", - "\n", - " function set_focus() {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'mpl-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " continue;\n", - " }\n", - "\n", - " var button = (fig.buttons[name] = document.createElement('button'));\n", - " button.classList = 'mpl-widget';\n", - " button.setAttribute('role', 'button');\n", - " button.setAttribute('aria-disabled', 'false');\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - "\n", - " var icon_img = document.createElement('img');\n", - " icon_img.src = '_images/' + image + '.png';\n", - " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", - " icon_img.alt = tooltip;\n", - " button.appendChild(icon_img);\n", - "\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", + "application/vnd.jupyter.widget-view+json": { + "model_id": "1830ef18bb5c44118ebf0d5118181846", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABKzklEQVR4nO3de1xVVf7/8fdR4YAKJ68cKDQyxlS8W96m1FSKvNTXSk1ztMzsp5WkZZFN0kVIZ8asL9+xm6mZl6ZM6/sdU3EaMR+m4oVJra9pkaJCNA0eQBEU9u8Ph/P1CHqEAx7OPq/n47Eejzl7r7XPWkizP3zWWntbDMMwBAAAAL9Rz9sdAAAAwNVFAAgAAOBnCAABAAD8DAEgAACAnyEABAAA8DMEgAAAAH6GABAAAMDPEAACAAD4GQJAAAAAP0MACAAA4GcIAAEAAPwMASAAAICfIQAEAADwMwSAAAAAfoYAEAAAwM8QAAIAAPgZAkAAAAA/QwAIAADgZwgAAQAA/AwBIAAAgJ8hAAQAAPAzBIAAAAB+hgAQAADAzxAAAgAA+BkCQAAAAD9DAAgAAOBnCAABAAD8DAEgAACAnyEABAAA8DMEgAAAAH6GABAAAMDPEAACAAD4GQJAAAAAP0MACAAA4GcIAAEAAPwMASAAAICfIQAEUG3XX3+9hg4d6u1uAACqiAAQAADAzxAAAqiW06dPe7sLAIBqIgAE4FZiYqIsFov27Nmj++67T02aNFGbNm2c59evX69u3bopODhYN910k95///0K19i/f7/uvvtuNWnSREFBQerSpYuWLl16NYcBAPg3AkAAV2zEiBG68cYb9fHHH+utt96SJP3jH//QjBkz9NRTT+mzzz5Tp06dNHHiRG3ZssXZ7uDBg+rTp48OHDigN998U59++qnat2+vCRMmaN68ed4aDgD4LYthGIa3OwGgbktMTNRLL72kF198US+99JLz+PXXX6+ff/5ZBw8eVKtWrSRJZ86c0bXXXqv777/fGSQ+8MADWrNmjQ4dOqTIyEhn+7vuuktpaWk6ceKEbDbb1R0UAPgxMoAArti9995b4ViXLl2cwZ8kBQUF6Te/+Y2OHDniPPbll19q4MCBLsGfJE2YMEGnT5/W119/XXudBgBUQAAI4IqFh4dXONasWbMKx6xWq4qKipyff/3110rbRkREOM8DAK4eAkAAV8xisVSrXbNmzZSdnV3h+IkTJyRJzZs396hfAICqIQAEUOsGDhyoL7/80hnwlfvggw/UsGFD9erVy0s9AwD/RAAIoNbNnj1bAQEBGjBggJYvX64vvvhCDz74oP76178qMTGRDSAAcJU18HYHAJhf27ZttW3bNj3//POaOnWqioqK1K5dOy1evFgTJkzwdvcAwO/wGBgAAAA/wxQwAACAnyEABAAA8DMEgAAAAH6GABAAAHhky5YtGjZsmCIiImSxWLR27VqX859++qnuuOMONW/eXBaLRRkZGRWuUVxcrCeeeELNmzdXo0aNNHz4cB07dsylTl5ensaNGyebzSabzaZx48bp5MmTtTcwEyMABAAAHjl16pQ6d+6slJSUS57v27evXnvttUteIz4+XmvWrNGqVau0detWFRYWaujQoSotLXXWGTNmjDIyMrR+/XqtX79eGRkZGjduXI2Pxx+wCxgAANQYi8WiNWvW6J577qlw7qefflJUVJT27t2rLl26OI87HA61aNFCy5Yt06hRoySdf1NQZGSk1q1bpzvuuEPfffed2rdvr+3bt6tnz56SpO3bt6t379763//9X7Vt2/ZqDM80yAACAACv2r17t86ePavY2FjnsYiICMXExGjbtm2SpK+//lo2m80Z/ElSr169ZLPZnHVw5XgQtAfKysp04sQJhYSEVPsdqQAA/2AYhgoKChQREaF69Wov/3LmzBmVlJR4fB3DMCrc26xWq6xWq8fXvlhOTo4CAwPVpEkTl+NhYWHKyclx1mnZsmWFti1btnTWwZUjAPRAeXoaAIArlZWVpeuuu65Wrn3mzBlFtW6snNxS95XdaNy4sQoLC12OzZ49W4mJiR5f+0pdHIRWlmypLFCFewSAHggJCZEkXZf4guoFBXm5NwCAuqzszBkdS3zVee+oDSUlJcrJLVXm7tYKDal+ljG/oExR3Y8oKytLoaGhzuO1kf2TJLvdrpKSEuXl5blkAXNzc9WnTx9nnZ9//rlC219++UVhYWG10i8zIwD0QPlfHPWCgggAAQBX5Gpkqxo1Pl+qq/Tf20NDQ0NdAsDa0r17dwUEBCg1NVUjR46UJGVnZ2v//v2aN2+eJKl3795yOBzauXOnbrnlFknSjh075HA4nEEirhwBIAAA8EhhYaEOHz7s/JyZmamMjAw1bdpUrVq10r/+9S8dPXpU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arRq1cp49tlnK5zzlTEAdR0BYDX913/9l9G6dWsjMDDQ6Natm/MxJHXZ3//+d0NShTJ+/HjDMM4/JmL27NmG3W43rFarcdtttxn79u3zbqcvUln/JRmLFy921vGFcTz88MPO358WLVoYAwcOdAZ/huEbY6jMxQGgL4xj1KhRRnh4uBEQEGBEREQYI0aMMA4cOOA87wtjKPff//3fRkxMjGG1Wo2bbrrJeOedd1zO+8pYNmzYYEgyDh48WOGcr4wBqOsshmEYXkk9AgAAwCtYAwgAAOBnCAABAAD8DAEgAACAnyEABAAA8DMEgAAAAH6GABAAAMDPEAACAAD4GQJAAAAAP0MACOCKLVq0SLGxsV757qefflpPPvmkV74bAMyGN4EAuCLFxcW64YYbtGrVKt16661X/ftzc3PVpk0bffPNN4qKirrq3w8AZkIGEMAVWb16tRo3buyV4E+SWrZsqdjYWL311lte+X4AMBMCQMDP/PLLL7Lb7UpKSnIe27FjhwIDA7Vx48ZLtlu1apWGDx/ucmzChAm65557lJSUpLCwMF1zzTV66aWXdO7cOT3zzDNq2rSprrvuOr3//vvONj/99JMsFov+8pe/6NZbb1VwcLBuvvlmff/990pPT1ePHj3UuHFj3Xnnnfrll19cvm/48OFauXJlDf0kAMB/EQACfqZFixZ6//33lZiYqF27dqmwsFAPPvigpkyZctn1fV999ZV69OhR4fiXX36pEydOaMuWLZo/f74SExM1dOhQNWnSRDt27NBjjz2mxx57TFlZWS7tZs+erRdeeEF79uxRgwYN9MADD2jmzJl644039NVXX+mHH37Qiy++6NLmlltuUVZWlo4cOVIzPwwA8FOsAQT81NSpU7Vp0ybdfPPN+sc//qH09HQFBQVVWvfkyZNq0qSJtmzZ4jIFPGHCBG3evFk//vij6tU7//fkTTfdpJYtW2rLli2SpNLSUtlsNr333nsaPXq0fvrpJ0VFRem9997TxIkTJZ3PLj7wwAP629/+pttvv12S9Nprr2nJkiX63//9X+f35efny2azafPmzerXr1+t/FwAwB+QAQT81B//+EedO3dOf/nLX7R8+fJLBn+SVFRUJEmV1unQoYMz+JOksLAwdezY0fm5fv36atasmXJzc13aderUyaWNJJd2YWFhFdoEBwdLkk6fPu12fACASyMABPzUjz/+qBMnTqisrMztlGqzZs1ksViUl5dX4VxAQIDLZ4vFUumxsrKyS7azWCyVHru4zb/+9S9J56exAQDVRwAI+KGSkhKNHTtWo0aN0quvvqqJEyfq559/vmT9wMBAtW/fXt9+++1V7GVF+/fvV0BAgDp06ODVfgCAryMABPzQrFmz5HA49Oabb2rmzJlq166dcz3epdxxxx3aunXrVeph5b766ivnzmEAQPURAAJ+ZvPmzVqwYIGWLVum0NBQ1atXT8uWLdPWrVu1cOHCS7abNGmS1q1bJ4fDcRV762rlypWaNGmS174fAMyCXcAArtjIkSPVtWtXJSQkXPXv/utf/6pnnnlG33zzjRo0aHDVvx8AzIQMIIAr9oc//EGNGzf2ynefOnVKixcvJvgDgBpABhAAAMDPkAEEAADwMwSAAAAAfoYAEAAAwM8QAAIAAPgZAkAAAAA/QwAIAADgZwgAAQAA/AwBIAAAgJ8hAAQAAPAz/x/la51tstzkmwAAAABJRU5ErkJggg==", + "text/html": [ "\n", - " var fmt_picker = document.createElement('select');\n", - " fmt_picker.classList = 'mpl-widget';\n", - " toolbar.appendChild(fmt_picker);\n", - " this.format_dropdown = fmt_picker;\n", - "\n", - " for (var ind in mpl.extensions) {\n", - " var fmt = mpl.extensions[ind];\n", - " var option = document.createElement('option');\n", - " option.selected = fmt === mpl.default_extension;\n", - " option.innerHTML = fmt;\n", - " fmt_picker.appendChild(option);\n", - " }\n", - "\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "};\n", - "\n", - "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n", - " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", - " // which will in turn request a refresh of the image.\n", - " this.send_message('resize', { width: x_pixels, height: y_pixels });\n", - "};\n", - "\n", - "mpl.figure.prototype.send_message = function (type, properties) {\n", - " properties['type'] = type;\n", - " properties['figure_id'] = this.id;\n", - " this.ws.send(JSON.stringify(properties));\n", - "};\n", - "\n", - "mpl.figure.prototype.send_draw_message = function () {\n", - " if (!this.waiting) {\n", - " this.waiting = true;\n", - " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " var format_dropdown = fig.format_dropdown;\n", - " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", - " fig.ondownload(fig, format);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_resize = function (fig, msg) {\n", - " var size = msg['size'];\n", - " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n", - " fig._resize_canvas(size[0], size[1], msg['forward']);\n", - " fig.send_message('refresh', {});\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", - " var x0 = msg['x0'] / fig.ratio;\n", - " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", - " var x1 = msg['x1'] / fig.ratio;\n", - " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n", - " x0 = Math.floor(x0) + 0.5;\n", - " y0 = Math.floor(y0) + 0.5;\n", - " x1 = Math.floor(x1) + 0.5;\n", - " y1 = Math.floor(y1) + 0.5;\n", - " var min_x = Math.min(x0, x1);\n", - " var min_y = Math.min(y0, y1);\n", - " var width = Math.abs(x1 - x0);\n", - " var height = Math.abs(y1 - y0);\n", - "\n", - " fig.rubberband_context.clearRect(\n", - " 0,\n", - " 0,\n", - " fig.canvas.width / fig.ratio,\n", - " fig.canvas.height / fig.ratio\n", - " );\n", - "\n", - " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n", - " // Updates the figure title.\n", - " fig.header.textContent = msg['label'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n", - " fig.rubberband_canvas.style.cursor = msg['cursor'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_message = function (fig, msg) {\n", - " fig.message.textContent = msg['message'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n", - " // Request the server to send over a new figure.\n", - " fig.send_draw_message();\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n", - " fig.image_mode = msg['mode'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n", - " for (var key in msg) {\n", - " if (!(key in fig.buttons)) {\n", - " continue;\n", - " }\n", - " fig.buttons[key].disabled = !msg[key];\n", - " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", - " if (msg['mode'] === 'PAN') {\n", - " fig.buttons['Pan'].classList.add('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " } else if (msg['mode'] === 'ZOOM') {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.add('active');\n", - " } else {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Called whenever the canvas gets updated.\n", - " this.send_message('ack', {});\n", - "};\n", - "\n", - "// A function to construct a web socket function for onmessage handling.\n", - "// Called in the figure constructor.\n", - "mpl.figure.prototype._make_on_message_function = function (fig) {\n", - " return function socket_on_message(evt) {\n", - " if (evt.data instanceof Blob) {\n", - " var img = evt.data;\n", - " if (img.type !== 'image/png') {\n", - " /* FIXME: We get \"Resource interpreted as Image but\n", - " * transferred with MIME type text/plain:\" errors on\n", - " * Chrome. But how to set the MIME type? It doesn't seem\n", - " * to be part of the websocket stream */\n", - " img.type = 'image/png';\n", - " }\n", - "\n", - " /* Free the memory for the previous frames */\n", - " if (fig.imageObj.src) {\n", - " (window.URL || window.webkitURL).revokeObjectURL(\n", - " fig.imageObj.src\n", - " );\n", - " }\n", - "\n", - " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", - " img\n", - " );\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " } else if (\n", - " typeof evt.data === 'string' &&\n", - " evt.data.slice(0, 21) === 'data:image/png;base64'\n", - " ) {\n", - " fig.imageObj.src = evt.data;\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - "\n", - " var msg = JSON.parse(evt.data);\n", - " var msg_type = msg['type'];\n", - "\n", - " // Call the \"handle_{type}\" callback, which takes\n", - " // the figure and JSON message as its only arguments.\n", - " try {\n", - " var callback = fig['handle_' + msg_type];\n", - " } catch (e) {\n", - " console.log(\n", - " \"No handler for the '\" + msg_type + \"' message type: \",\n", - " msg\n", - " );\n", - " return;\n", - " }\n", - "\n", - " if (callback) {\n", - " try {\n", - " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", - " callback(fig, msg);\n", - " } catch (e) {\n", - " console.log(\n", - " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", - " e,\n", - " e.stack,\n", - " msg\n", - " );\n", - " }\n", - " }\n", - " };\n", - "};\n", - "\n", - "// from https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", - "mpl.findpos = function (e) {\n", - " //this section is from http://www.quirksmode.org/js/events_properties.html\n", - " var targ;\n", - " if (!e) {\n", - " e = window.event;\n", - " }\n", - " if (e.target) {\n", - " targ = e.target;\n", - " } else if (e.srcElement) {\n", - " targ = e.srcElement;\n", - " }\n", - " if (targ.nodeType === 3) {\n", - " // defeat Safari bug\n", - " targ = targ.parentNode;\n", - " }\n", - "\n", - " // pageX,Y are the mouse positions relative to the document\n", - " var boundingRect = targ.getBoundingClientRect();\n", - " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", - " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n", - "\n", - " return { x: x, y: y };\n", - "};\n", - "\n", - "/*\n", - " * return a copy of an object with only non-object keys\n", - " * we need this to avoid circular references\n", - " * https://stackoverflow.com/a/24161582/3208463\n", - " */\n", - "function simpleKeys(original) {\n", - " return Object.keys(original).reduce(function (obj, key) {\n", - " if (typeof original[key] !== 'object') {\n", - " obj[key] = original[key];\n", - " }\n", - " return obj;\n", - " }, {});\n", - "}\n", - "\n", - "mpl.figure.prototype.mouse_event = function (event, name) {\n", - " var canvas_pos = mpl.findpos(event);\n", - "\n", - " if (name === 'button_press') {\n", - " this.canvas.focus();\n", - " this.canvas_div.focus();\n", - " }\n", - "\n", - " var x = canvas_pos.x * this.ratio;\n", - " var y = canvas_pos.y * this.ratio;\n", - "\n", - " this.send_message(name, {\n", - " x: x,\n", - " y: y,\n", - " button: event.button,\n", - " step: event.step,\n", - " guiEvent: simpleKeys(event),\n", - " });\n", - "\n", - " /* This prevents the web browser from automatically changing to\n", - " * the text insertion cursor when the button is pressed. We want\n", - " * to control all of the cursor setting manually through the\n", - " * 'cursor' event from matplotlib */\n", - " event.preventDefault();\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n", - " // Handle any extra behaviour associated with a key event\n", - "};\n", - "\n", - "mpl.figure.prototype.key_event = function (event, name) {\n", - " // Prevent repeat events\n", - " if (name === 'key_press') {\n", - " if (event.key === this._key) {\n", - " return;\n", - " } else {\n", - " this._key = event.key;\n", - " }\n", - " }\n", - " if (name === 'key_release') {\n", - " this._key = null;\n", - " }\n", - "\n", - " var value = '';\n", - " if (event.ctrlKey && event.key !== 'Control') {\n", - " value += 'ctrl+';\n", - " }\n", - " else if (event.altKey && event.key !== 'Alt') {\n", - " value += 'alt+';\n", - " }\n", - " else if (event.shiftKey && event.key !== 'Shift') {\n", - " value += 'shift+';\n", - " }\n", - "\n", - " value += 'k' + event.key;\n", - "\n", - " this._key_event_extra(event, name);\n", - "\n", - " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n", - " if (name === 'download') {\n", - " this.handle_save(this, null);\n", - " } else {\n", - " this.send_message('toolbar_button', { name: name });\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n", - " this.message.textContent = tooltip;\n", - "};\n", - "\n", - "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", - "// prettier-ignore\n", - "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n", - "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", - "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", - "\n", - "mpl.default_extension = \"png\";/* global mpl */\n", - "\n", - "var comm_websocket_adapter = function (comm) {\n", - " // Create a \"websocket\"-like object which calls the given IPython comm\n", - " // object with the appropriate methods. Currently this is a non binary\n", - " // socket, so there is still some room for performance tuning.\n", - " var ws = {};\n", - "\n", - " ws.binaryType = comm.kernel.ws.binaryType;\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " function updateReadyState(_event) {\n", - " if (comm.kernel.ws) {\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " } else {\n", - " ws.readyState = 3; // Closed state.\n", - " }\n", - " }\n", - " comm.kernel.ws.addEventListener('open', updateReadyState);\n", - " comm.kernel.ws.addEventListener('close', updateReadyState);\n", - " comm.kernel.ws.addEventListener('error', updateReadyState);\n", - "\n", - " ws.close = function () {\n", - " comm.close();\n", - " };\n", - " ws.send = function (m) {\n", - " //console.log('sending', m);\n", - " comm.send(m);\n", - " };\n", - " // Register the callback with on_msg.\n", - " comm.on_msg(function (msg) {\n", - " //console.log('receiving', msg['content']['data'], msg);\n", - " var data = msg['content']['data'];\n", - " if (data['blob'] !== undefined) {\n", - " data = {\n", - " data: new Blob(msg['buffers'], { type: data['blob'] }),\n", - " };\n", - " }\n", - " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", - " ws.onmessage(data);\n", - " });\n", - " return ws;\n", - "};\n", - "\n", - "mpl.mpl_figure_comm = function (comm, msg) {\n", - " // This is the function which gets called when the mpl process\n", - " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", - "\n", - " var id = msg.content.data.id;\n", - " // Get hold of the div created by the display call when the Comm\n", - " // socket was opened in Python.\n", - " var element = document.getElementById(id);\n", - " var ws_proxy = comm_websocket_adapter(comm);\n", - "\n", - " function ondownload(figure, _format) {\n", - " window.open(figure.canvas.toDataURL());\n", - " }\n", - "\n", - " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n", - "\n", - " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", - " // web socket which is closed, not our websocket->open comm proxy.\n", - " ws_proxy.onopen();\n", - "\n", - " fig.parent_element = element;\n", - " fig.cell_info = mpl.find_output_cell(\"
\");\n", - " if (!fig.cell_info) {\n", - " console.error('Failed to find cell for figure', id, fig);\n", - " return;\n", - " }\n", - " fig.cell_info[0].output_area.element.on(\n", - " 'cleared',\n", - " { fig: fig },\n", - " fig._remove_fig_handler\n", - " );\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_close = function (fig, msg) {\n", - " var width = fig.canvas.width / fig.ratio;\n", - " fig.cell_info[0].output_area.element.off(\n", - " 'cleared',\n", - " fig._remove_fig_handler\n", - " );\n", - " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n", - "\n", - " // Update the output cell to use the data from the current canvas.\n", - " fig.push_to_output();\n", - " var dataURL = fig.canvas.toDataURL();\n", - " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", - " // the notebook keyboard shortcuts fail.\n", - " IPython.keyboard_manager.enable();\n", - " fig.parent_element.innerHTML =\n", - " '';\n", - " fig.close_ws(fig, msg);\n", - "};\n", - "\n", - "mpl.figure.prototype.close_ws = function (fig, msg) {\n", - " fig.send_message('closing', msg);\n", - " // fig.ws.close()\n", - "};\n", - "\n", - "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n", - " // Turn the data on the canvas into data in the output cell.\n", - " var width = this.canvas.width / this.ratio;\n", - " var dataURL = this.canvas.toDataURL();\n", - " this.cell_info[1]['text/html'] =\n", - " '';\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Tell IPython that the notebook contents must change.\n", - " IPython.notebook.set_dirty(true);\n", - " this.send_message('ack', {});\n", - " var fig = this;\n", - " // Wait a second, then push the new image to the DOM so\n", - " // that it is saved nicely (might be nice to debounce this).\n", - " setTimeout(function () {\n", - " fig.push_to_output();\n", - " }, 1000);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'btn-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " var button;\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " continue;\n", - " }\n", - "\n", - " button = fig.buttons[name] = document.createElement('button');\n", - " button.classList = 'btn btn-default';\n", - " button.href = '#';\n", - " button.title = name;\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message pull-right';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = document.createElement('div');\n", - " buttongrp.classList = 'btn-group inline pull-right';\n", - " button = document.createElement('button');\n", - " button.classList = 'btn btn-mini btn-primary';\n", - " button.href = '#';\n", - " button.title = 'Stop Interaction';\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', function (_evt) {\n", - " fig.handle_close(fig, {});\n", - " });\n", - " button.addEventListener(\n", - " 'mouseover',\n", - " on_mouseover_closure('Stop Interaction')\n", - " );\n", - " buttongrp.appendChild(button);\n", - " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", - " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", - "};\n", - "\n", - "mpl.figure.prototype._remove_fig_handler = function (event) {\n", - " var fig = event.data.fig;\n", - " if (event.target !== this) {\n", - " // Ignore bubbled events from children.\n", - " return;\n", - " }\n", - " fig.close_ws(fig, {});\n", - "};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (el) {\n", - " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (el) {\n", - " // this is important to make the div 'focusable\n", - " el.setAttribute('tabindex', 0);\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " } else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (event, _name) {\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which === 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " fig.ondownload(fig, null);\n", - "};\n", - "\n", - "mpl.find_output_cell = function (html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i = 0; i < ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code') {\n", - " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] === html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "};\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel !== null) {\n", - " IPython.notebook.kernel.comm_manager.register_target(\n", - " 'matplotlib',\n", - " mpl.mpl_figure_comm\n", - " );\n", - "}\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" + "
\n", + "
\n", + " Figure\n", + "
\n", + " \n", + "
\n", + " " ], "text/plain": [ - "" + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, @@ -3112,50 +450,42 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 5, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "from stride import ScalarField\n", - "\n", - "vp = ScalarField(name='vp', grid=problem.grid)\n", - "vp.fill(1500.) # [m/s]\n", + "rho = ScalarField(name='rho', grid=problem.grid)\n", + "rho.fill(1000.) # [kg/m^3]\n", "\n", - "problem.medium.add(vp)\n", + "problem.medium.add(rho)\n", "\n", "# Plot the field\n", - "vp.plot()" + "rho.plot()" ] }, { "cell_type": "markdown", - "id": "serious-cherry", + "id": "engaged-economy", "metadata": {}, "source": [ - "We are now ready to run our PDE:" + "Then, we can run our PDE operator with the added field." ] }, { "cell_type": "code", - "execution_count": 6, - "id": "catholic-tampa", + "execution_count": 8, + "id": "pointed-narrow", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Default Devito configuration:\n", - "\t * autotuning=['aggressive', 'runtime']\n", - "\t * develop-mode=False\n", - "\t * mpi=False\n", - "\t * log-level=DEBUG\n", - "\t * language=openmp\n", "(ShotID 0) Preparing to run state for shot\n", "(ShotID 0) Estimated bandwidth for the propagated wavelet 0.260-0.730 MHz\n", "(ShotID 0) Spatial grid spacing (0.400 mm | 5.137 PPW) is below dispersion limit (0.411 mm | 5.000 PPW)\n", @@ -3167,988 +497,48 @@ "\t * subs={h_x: 0.0004, h_y: 0.0004, dt: 5e-08}\n", "\t * opt=advanced-fsg\n", "\t * devicecreate=(p(t, x, y),)\n", - "Operator `acoustic_iso_state` generated in 0.96 s\n", - " * lowering.Clusters: 0.37 s (38.9 %)\n", - " * specializing.Clusters: 0.24 s (25.2 %)\n", - " * lowering.IET: 0.33 s (34.7 %)\n", - " * specializing.IET: 0.24 s (25.2 %)\n", - " * lowering.Expressions: 0.24 s (25.2 %)\n", - "Flops reduction after symbolic optimization: [99 --> 54]\n", - "recompiling for non-existent cache dir (/tmp/devito-codepy-uid1000/de44266/19472871844a70ffb2df52c4492c7ef2).\n", - "gcc -march=native -O3 -g -fPIC -Wall -std=c99 -Wno-unused-result -Wno-unused-variable -Wno-unused-but-set-variable -ffast-math -shared -fopenmp /tmp/devito-jitcache-uid1000/de44266938bcb7fe2109302c3a0e04bb46d9520b.c -lm -o /tmp/devito-jitcache-uid1000/de44266938bcb7fe2109302c3a0e04bb46d9520b.so\n", - "Operator `acoustic_iso_state` jit-compiled `/tmp/devito-jitcache-uid1000/de44266938bcb7fe2109302c3a0e04bb46d9520b.c` in 0.36 s with `CustomCompiler`\n", + "Operator `acoustic_iso_state` generated in 2.36 s\n", + " * lowering.Clusters: 1.13 s (48.1 %)\n", + " * specializing.Clusters: 0.70 s (29.8 %)\n", + " * lowering.Expressions: 0.82 s (34.9 %)\n", + "Flops reduction after symbolic optimization: [496 --> 84]\n", + "recompiling for non-existent cache dir (/tmp/devito-codepy-uid1000/a573a74/e0f0e3572984c72ecaead739f69d53d0).\n", + "gcc -march=native -O3 -g -fPIC -Wall -std=c99 -Wno-unused-result -Wno-unused-variable -Wno-unused-but-set-variable -ffast-math -shared -fopenmp /tmp/devito-jitcache-uid1000/a573a746c66470fc4905b3d0d0374e04e3cc01f4.c -lm -o /tmp/devito-jitcache-uid1000/a573a746c66470fc4905b3d0d0374e04e3cc01f4.so\n", + "Operator `acoustic_iso_state` jit-compiled `/tmp/devito-jitcache-uid1000/a573a746c66470fc4905b3d0d0374e04e3cc01f4.c` in 0.44 s with `GNUCompiler`\n", + "(ShotID 0) Using inhomogeneous density\n", "(ShotID 0) Running state equation for shot\n", "AutoTuner: could not perform any runs\n", - "Operator `acoustic_iso_state` ran in 0.08 s\n", - "Global performance: [OI=2.78, 103.59 GFlops/s, 2.25 GPts/s]\n", + "Operator `acoustic_iso_state` ran in 0.16 s\n", + "Global performance: [OI=1.78, 83.08 GFlops/s, 1.13 GPts/s]\n", "Local performance:\n", - " * section0<1999,300,300> ran in 0.07 s [OI=2.78, 131.29 GFlops/s, 2.86 GPts/s]\n", - " * section1<<1999,1,2,2>,<1999,1,2,2>> ran in 0.01 s [OI=5.80, 0.14 GFlops/s, 0.01 GPts/s]\n", - " * section2<<1999,120>,<1999,120,2,2>> ran in 0.01 s [OI=1.84, 2.82 GFlops/s, 0.00 GPts/s]\n", + " * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + " * section1<<1999,309,309>,<1999,300,300>> ran in 0.15 s [OI=1.79, 89.79 GFlops/s, 1.22 GPts/s]\n", + " * section2<<1999,1,2,2>,<1999,1,2,2>> ran in 0.01 s [OI=5.80, 0.11 GFlops/s, 0.01 GPts/s]\n", + " * section3<<1999,120>,<1999,120,2,2>> ran in 0.01 s [OI=1.32, 3.03 GFlops/s, 0.00 GPts/s]\n", "Performance[mode=advanced-fsg] arguments: {'nthreads': 6, 'nthreads_nonaffine': 6}\n", "(ShotID 0) Completed state equation run for shot\n" ] }, { "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "/* global mpl */\n", - "window.mpl = {};\n", - "\n", - "mpl.get_websocket_type = function () {\n", - " if (typeof WebSocket !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof MozWebSocket !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert(\n", - " 'Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.'\n", - " );\n", - " }\n", - "};\n", - "\n", - "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = this.ws.binaryType !== undefined;\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById('mpl-warnings');\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent =\n", - " 'This browser does not support binary websocket messages. ' +\n", - " 'Performance may be slow.';\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = document.createElement('div');\n", - " this.root.setAttribute('style', 'display: inline-block');\n", - " this._root_extra_style(this.root);\n", - "\n", - " parent_element.appendChild(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message('supports_binary', { value: fig.supports_binary });\n", - " fig.send_message('send_image_mode', {});\n", - " if (fig.ratio !== 1) {\n", - " fig.send_message('set_device_pixel_ratio', {\n", - " device_pixel_ratio: fig.ratio,\n", - " });\n", - " }\n", - " fig.send_message('refresh', {});\n", - " };\n", - "\n", - " this.imageObj.onload = function () {\n", - " if (fig.image_mode === 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function () {\n", - " fig.ws.close();\n", - " };\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "};\n", - "\n", - "mpl.figure.prototype._init_header = function () {\n", - " var titlebar = document.createElement('div');\n", - " titlebar.classList =\n", - " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", - " var titletext = document.createElement('div');\n", - " titletext.classList = 'ui-dialog-title';\n", - " titletext.setAttribute(\n", - " 'style',\n", - " 'width: 100%; text-align: center; padding: 3px;'\n", - " );\n", - " titlebar.appendChild(titletext);\n", - " this.root.appendChild(titlebar);\n", - " this.header = titletext;\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._init_canvas = function () {\n", - " var fig = this;\n", - "\n", - " var canvas_div = (this.canvas_div = document.createElement('div'));\n", - " canvas_div.setAttribute(\n", - " 'style',\n", - " 'border: 1px solid #ddd;' +\n", - " 'box-sizing: content-box;' +\n", - " 'clear: both;' +\n", - " 'min-height: 1px;' +\n", - " 'min-width: 1px;' +\n", - " 'outline: 0;' +\n", - " 'overflow: hidden;' +\n", - " 'position: relative;' +\n", - " 'resize: both;'\n", - " );\n", - "\n", - " function on_keyboard_event_closure(name) {\n", - " return function (event) {\n", - " return fig.key_event(event, name);\n", - " };\n", - " }\n", - "\n", - " canvas_div.addEventListener(\n", - " 'keydown',\n", - " on_keyboard_event_closure('key_press')\n", - " );\n", - " canvas_div.addEventListener(\n", - " 'keyup',\n", - " on_keyboard_event_closure('key_release')\n", - " );\n", - "\n", - " this._canvas_extra_style(canvas_div);\n", - " this.root.appendChild(canvas_div);\n", - "\n", - " var canvas = (this.canvas = document.createElement('canvas'));\n", - " canvas.classList.add('mpl-canvas');\n", - " canvas.setAttribute('style', 'box-sizing: content-box;');\n", - "\n", - " this.context = canvas.getContext('2d');\n", - "\n", - " var backingStore =\n", - " this.context.backingStorePixelRatio ||\n", - " this.context.webkitBackingStorePixelRatio ||\n", - " this.context.mozBackingStorePixelRatio ||\n", - " this.context.msBackingStorePixelRatio ||\n", - " this.context.oBackingStorePixelRatio ||\n", - " this.context.backingStorePixelRatio ||\n", - " 1;\n", - "\n", - " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", - " 'canvas'\n", - " ));\n", - " rubberband_canvas.setAttribute(\n", - " 'style',\n", - " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", - " );\n", - "\n", - " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", - " if (this.ResizeObserver === undefined) {\n", - " if (window.ResizeObserver !== undefined) {\n", - " this.ResizeObserver = window.ResizeObserver;\n", - " } else {\n", - " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", - " this.ResizeObserver = obs.ResizeObserver;\n", - " }\n", - " }\n", - "\n", - " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", - " var nentries = entries.length;\n", - " for (var i = 0; i < nentries; i++) {\n", - " var entry = entries[i];\n", - " var width, height;\n", - " if (entry.contentBoxSize) {\n", - " if (entry.contentBoxSize instanceof Array) {\n", - " // Chrome 84 implements new version of spec.\n", - " width = entry.contentBoxSize[0].inlineSize;\n", - " height = entry.contentBoxSize[0].blockSize;\n", - " } else {\n", - " // Firefox implements old version of spec.\n", - " width = entry.contentBoxSize.inlineSize;\n", - " height = entry.contentBoxSize.blockSize;\n", - " }\n", - " } else {\n", - " // Chrome <84 implements even older version of spec.\n", - " width = entry.contentRect.width;\n", - " height = entry.contentRect.height;\n", - " }\n", - "\n", - " // Keep the size of the canvas and rubber band canvas in sync with\n", - " // the canvas container.\n", - " if (entry.devicePixelContentBoxSize) {\n", - " // Chrome 84 implements new version of spec.\n", - " canvas.setAttribute(\n", - " 'width',\n", - " entry.devicePixelContentBoxSize[0].inlineSize\n", - " );\n", - " canvas.setAttribute(\n", - " 'height',\n", - " entry.devicePixelContentBoxSize[0].blockSize\n", - " );\n", - " } else {\n", - " canvas.setAttribute('width', width * fig.ratio);\n", - " canvas.setAttribute('height', height * fig.ratio);\n", - " }\n", - " canvas.setAttribute(\n", - " 'style',\n", - " 'width: ' + width + 'px; height: ' + height + 'px;'\n", - " );\n", - "\n", - " rubberband_canvas.setAttribute('width', width);\n", - " rubberband_canvas.setAttribute('height', height);\n", - "\n", - " // And update the size in Python. We ignore the initial 0/0 size\n", - " // that occurs as the element is placed into the DOM, which should\n", - " // otherwise not happen due to the minimum size styling.\n", - " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", - " fig.request_resize(width, height);\n", - " }\n", - " }\n", - " });\n", - " this.resizeObserverInstance.observe(canvas_div);\n", - "\n", - " function on_mouse_event_closure(name) {\n", - " return function (event) {\n", - " return fig.mouse_event(event, name);\n", - " };\n", - " }\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mousedown',\n", - " on_mouse_event_closure('button_press')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseup',\n", - " on_mouse_event_closure('button_release')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'dblclick',\n", - " on_mouse_event_closure('dblclick')\n", - " );\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband_canvas.addEventListener(\n", - " 'mousemove',\n", - " on_mouse_event_closure('motion_notify')\n", - " );\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseenter',\n", - " on_mouse_event_closure('figure_enter')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseleave',\n", - " on_mouse_event_closure('figure_leave')\n", - " );\n", - "\n", - " canvas_div.addEventListener('wheel', function (event) {\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " on_mouse_event_closure('scroll')(event);\n", - " });\n", - "\n", - " canvas_div.appendChild(canvas);\n", - " canvas_div.appendChild(rubberband_canvas);\n", - "\n", - " this.rubberband_context = rubberband_canvas.getContext('2d');\n", - " this.rubberband_context.strokeStyle = '#000000';\n", - "\n", - " this._resize_canvas = function (width, height, forward) {\n", - " if (forward) {\n", - " canvas_div.style.width = width + 'px';\n", - " canvas_div.style.height = height + 'px';\n", - " }\n", - " };\n", - "\n", - " // Disable right mouse context menu.\n", - " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n", - " event.preventDefault();\n", - " return false;\n", - " });\n", - "\n", - " function set_focus() {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'mpl-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " continue;\n", - " }\n", - "\n", - " var button = (fig.buttons[name] = document.createElement('button'));\n", - " button.classList = 'mpl-widget';\n", - " button.setAttribute('role', 'button');\n", - " button.setAttribute('aria-disabled', 'false');\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - "\n", - " var icon_img = document.createElement('img');\n", - " icon_img.src = '_images/' + image + '.png';\n", - " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", - " icon_img.alt = tooltip;\n", - " button.appendChild(icon_img);\n", - "\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " var fmt_picker = document.createElement('select');\n", - " fmt_picker.classList = 'mpl-widget';\n", - " toolbar.appendChild(fmt_picker);\n", - " this.format_dropdown = fmt_picker;\n", - "\n", - " for (var ind in mpl.extensions) {\n", - " var fmt = mpl.extensions[ind];\n", - " var option = document.createElement('option');\n", - " option.selected = fmt === mpl.default_extension;\n", - " option.innerHTML = fmt;\n", - " fmt_picker.appendChild(option);\n", - " }\n", - "\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "};\n", - "\n", - "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n", - " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", - " // which will in turn request a refresh of the image.\n", - " this.send_message('resize', { width: x_pixels, height: y_pixels });\n", - "};\n", - "\n", - "mpl.figure.prototype.send_message = function (type, properties) {\n", - " properties['type'] = type;\n", - " properties['figure_id'] = this.id;\n", - " this.ws.send(JSON.stringify(properties));\n", - "};\n", - "\n", - "mpl.figure.prototype.send_draw_message = function () {\n", - " if (!this.waiting) {\n", - " this.waiting = true;\n", - " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " var format_dropdown = fig.format_dropdown;\n", - " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", - " fig.ondownload(fig, format);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_resize = function (fig, msg) {\n", - " var size = msg['size'];\n", - " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n", - " fig._resize_canvas(size[0], size[1], msg['forward']);\n", - " fig.send_message('refresh', {});\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", - " var x0 = msg['x0'] / fig.ratio;\n", - " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", - " var x1 = msg['x1'] / fig.ratio;\n", - " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n", - " x0 = Math.floor(x0) + 0.5;\n", - " y0 = Math.floor(y0) + 0.5;\n", - " x1 = Math.floor(x1) + 0.5;\n", - " y1 = Math.floor(y1) + 0.5;\n", - " var min_x = Math.min(x0, x1);\n", - " var min_y = Math.min(y0, y1);\n", - " var width = Math.abs(x1 - x0);\n", - " var height = Math.abs(y1 - y0);\n", - "\n", - " fig.rubberband_context.clearRect(\n", - " 0,\n", - " 0,\n", - " fig.canvas.width / fig.ratio,\n", - " fig.canvas.height / fig.ratio\n", - " );\n", - "\n", - " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n", - " // Updates the figure title.\n", - " fig.header.textContent = msg['label'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n", - " fig.rubberband_canvas.style.cursor = msg['cursor'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_message = function (fig, msg) {\n", - " fig.message.textContent = msg['message'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n", - " // Request the server to send over a new figure.\n", - " fig.send_draw_message();\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n", - " fig.image_mode = msg['mode'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n", - " for (var key in msg) {\n", - " if (!(key in fig.buttons)) {\n", - " continue;\n", - " }\n", - " fig.buttons[key].disabled = !msg[key];\n", - " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", - " if (msg['mode'] === 'PAN') {\n", - " fig.buttons['Pan'].classList.add('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " } else if (msg['mode'] === 'ZOOM') {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.add('active');\n", - " } else {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Called whenever the canvas gets updated.\n", - " this.send_message('ack', {});\n", - "};\n", - "\n", - "// A function to construct a web socket function for onmessage handling.\n", - "// Called in the figure constructor.\n", - "mpl.figure.prototype._make_on_message_function = function (fig) {\n", - " return function socket_on_message(evt) {\n", - " if (evt.data instanceof Blob) {\n", - " var img = evt.data;\n", - " if (img.type !== 'image/png') {\n", - " /* FIXME: We get \"Resource interpreted as Image but\n", - " * transferred with MIME type text/plain:\" errors on\n", - " * Chrome. But how to set the MIME type? It doesn't seem\n", - " * to be part of the websocket stream */\n", - " img.type = 'image/png';\n", - " }\n", - "\n", - " /* Free the memory for the previous frames */\n", - " if (fig.imageObj.src) {\n", - " (window.URL || window.webkitURL).revokeObjectURL(\n", - " fig.imageObj.src\n", - " );\n", - " }\n", - "\n", - " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", - " img\n", - " );\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " } else if (\n", - " typeof evt.data === 'string' &&\n", - " evt.data.slice(0, 21) === 'data:image/png;base64'\n", - " ) {\n", - " fig.imageObj.src = evt.data;\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - "\n", - " var msg = JSON.parse(evt.data);\n", - " var msg_type = msg['type'];\n", - "\n", - " // Call the \"handle_{type}\" callback, which takes\n", - " // the figure and JSON message as its only arguments.\n", - " try {\n", - " var callback = fig['handle_' + msg_type];\n", - " } catch (e) {\n", - " console.log(\n", - " \"No handler for the '\" + msg_type + \"' message type: \",\n", - " msg\n", - " );\n", - " return;\n", - " }\n", - "\n", - " if (callback) {\n", - " try {\n", - " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", - " callback(fig, msg);\n", - " } catch (e) {\n", - " console.log(\n", - " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", - " e,\n", - " e.stack,\n", - " msg\n", - " );\n", - " }\n", - " }\n", - " };\n", - "};\n", - "\n", - "// from https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", - "mpl.findpos = function (e) {\n", - " //this section is from http://www.quirksmode.org/js/events_properties.html\n", - " var targ;\n", - " if (!e) {\n", - " e = window.event;\n", - " }\n", - " if (e.target) {\n", - " targ = e.target;\n", - " } else if (e.srcElement) {\n", - " targ = e.srcElement;\n", - " }\n", - " if (targ.nodeType === 3) {\n", - " // defeat Safari bug\n", - " targ = targ.parentNode;\n", - " }\n", - "\n", - " // pageX,Y are the mouse positions relative to the document\n", - " var boundingRect = targ.getBoundingClientRect();\n", - " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", - " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n", - "\n", - " return { x: x, y: y };\n", - "};\n", - "\n", - "/*\n", - " * return a copy of an object with only non-object keys\n", - " * we need this to avoid circular references\n", - " * https://stackoverflow.com/a/24161582/3208463\n", - " */\n", - "function simpleKeys(original) {\n", - " return Object.keys(original).reduce(function (obj, key) {\n", - " if (typeof original[key] !== 'object') {\n", - " obj[key] = original[key];\n", - " }\n", - " return obj;\n", - " }, {});\n", - "}\n", - "\n", - "mpl.figure.prototype.mouse_event = function (event, name) {\n", - " var canvas_pos = mpl.findpos(event);\n", - "\n", - " if (name === 'button_press') {\n", - " this.canvas.focus();\n", - " this.canvas_div.focus();\n", - " }\n", - "\n", - " var x = canvas_pos.x * this.ratio;\n", - " var y = canvas_pos.y * this.ratio;\n", - "\n", - " this.send_message(name, {\n", - " x: x,\n", - " y: y,\n", - " button: event.button,\n", - " step: event.step,\n", - " guiEvent: simpleKeys(event),\n", - " });\n", - "\n", - " /* This prevents the web browser from automatically changing to\n", - " * the text insertion cursor when the button is pressed. We want\n", - " * to control all of the cursor setting manually through the\n", - " * 'cursor' event from matplotlib */\n", - " event.preventDefault();\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n", - " // Handle any extra behaviour associated with a key event\n", - "};\n", - "\n", - "mpl.figure.prototype.key_event = function (event, name) {\n", - " // Prevent repeat events\n", - " if (name === 'key_press') {\n", - " if (event.key === this._key) {\n", - " return;\n", - " } else {\n", - " this._key = event.key;\n", - " }\n", - " }\n", - " if (name === 'key_release') {\n", - " this._key = null;\n", - " }\n", - "\n", - " var value = '';\n", - " if (event.ctrlKey && event.key !== 'Control') {\n", - " value += 'ctrl+';\n", - " }\n", - " else if (event.altKey && event.key !== 'Alt') {\n", - " value += 'alt+';\n", - " }\n", - " else if (event.shiftKey && event.key !== 'Shift') {\n", - " value += 'shift+';\n", - " }\n", - "\n", - " value += 'k' + event.key;\n", - "\n", - " this._key_event_extra(event, name);\n", - "\n", - " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n", - " if (name === 'download') {\n", - " this.handle_save(this, null);\n", - " } else {\n", - " this.send_message('toolbar_button', { name: name });\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n", - " this.message.textContent = tooltip;\n", - "};\n", - "\n", - "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", - "// prettier-ignore\n", - "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n", - "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", - "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", - "\n", - "mpl.default_extension = \"png\";/* global mpl */\n", - "\n", - "var comm_websocket_adapter = function (comm) {\n", - " // Create a \"websocket\"-like object which calls the given IPython comm\n", - " // object with the appropriate methods. Currently this is a non binary\n", - " // socket, so there is still some room for performance tuning.\n", - " var ws = {};\n", - "\n", - " ws.binaryType = comm.kernel.ws.binaryType;\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " function updateReadyState(_event) {\n", - " if (comm.kernel.ws) {\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " } else {\n", - " ws.readyState = 3; // Closed state.\n", - " }\n", - " }\n", - " comm.kernel.ws.addEventListener('open', updateReadyState);\n", - " comm.kernel.ws.addEventListener('close', updateReadyState);\n", - " comm.kernel.ws.addEventListener('error', updateReadyState);\n", - "\n", - " ws.close = function () {\n", - " comm.close();\n", - " };\n", - " ws.send = function (m) {\n", - " //console.log('sending', m);\n", - " comm.send(m);\n", - " };\n", - " // Register the callback with on_msg.\n", - " comm.on_msg(function (msg) {\n", - " //console.log('receiving', msg['content']['data'], msg);\n", - " var data = msg['content']['data'];\n", - " if (data['blob'] !== undefined) {\n", - " data = {\n", - " data: new Blob(msg['buffers'], { type: data['blob'] }),\n", - " };\n", - " }\n", - " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", - " ws.onmessage(data);\n", - " });\n", - " return ws;\n", - "};\n", - "\n", - "mpl.mpl_figure_comm = function (comm, msg) {\n", - " // This is the function which gets called when the mpl process\n", - " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", - "\n", - " var id = msg.content.data.id;\n", - " // Get hold of the div created by the display call when the Comm\n", - " // socket was opened in Python.\n", - " var element = document.getElementById(id);\n", - " var ws_proxy = comm_websocket_adapter(comm);\n", - "\n", - " function ondownload(figure, _format) {\n", - " window.open(figure.canvas.toDataURL());\n", - " }\n", - "\n", - " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n", - "\n", - " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", - " // web socket which is closed, not our websocket->open comm proxy.\n", - " ws_proxy.onopen();\n", - "\n", - " fig.parent_element = element;\n", - " fig.cell_info = mpl.find_output_cell(\"
\");\n", - " if (!fig.cell_info) {\n", - " console.error('Failed to find cell for figure', id, fig);\n", - " return;\n", - " }\n", - " fig.cell_info[0].output_area.element.on(\n", - " 'cleared',\n", - " { fig: fig },\n", - " fig._remove_fig_handler\n", - " );\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_close = function (fig, msg) {\n", - " var width = fig.canvas.width / fig.ratio;\n", - " fig.cell_info[0].output_area.element.off(\n", - " 'cleared',\n", - " fig._remove_fig_handler\n", - " );\n", - " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n", - "\n", - " // Update the output cell to use the data from the current canvas.\n", - " fig.push_to_output();\n", - " var dataURL = fig.canvas.toDataURL();\n", - " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", - " // the notebook keyboard shortcuts fail.\n", - " IPython.keyboard_manager.enable();\n", - " fig.parent_element.innerHTML =\n", - " '';\n", - " fig.close_ws(fig, msg);\n", - "};\n", - "\n", - "mpl.figure.prototype.close_ws = function (fig, msg) {\n", - " fig.send_message('closing', msg);\n", - " // fig.ws.close()\n", - "};\n", - "\n", - "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n", - " // Turn the data on the canvas into data in the output cell.\n", - " var width = this.canvas.width / this.ratio;\n", - " var dataURL = this.canvas.toDataURL();\n", - " this.cell_info[1]['text/html'] =\n", - " '';\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Tell IPython that the notebook contents must change.\n", - " IPython.notebook.set_dirty(true);\n", - " this.send_message('ack', {});\n", - " var fig = this;\n", - " // Wait a second, then push the new image to the DOM so\n", - " // that it is saved nicely (might be nice to debounce this).\n", - " setTimeout(function () {\n", - " fig.push_to_output();\n", - " }, 1000);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'btn-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " var button;\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " continue;\n", - " }\n", - "\n", - " button = fig.buttons[name] = document.createElement('button');\n", - " button.classList = 'btn btn-default';\n", - " button.href = '#';\n", - " button.title = name;\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message pull-right';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = document.createElement('div');\n", - " buttongrp.classList = 'btn-group inline pull-right';\n", - " button = document.createElement('button');\n", - " button.classList = 'btn btn-mini btn-primary';\n", - " button.href = '#';\n", - " button.title = 'Stop Interaction';\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', function (_evt) {\n", - " fig.handle_close(fig, {});\n", - " });\n", - " button.addEventListener(\n", - " 'mouseover',\n", - " on_mouseover_closure('Stop Interaction')\n", - " );\n", - " buttongrp.appendChild(button);\n", - " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", - " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", - "};\n", - "\n", - "mpl.figure.prototype._remove_fig_handler = function (event) {\n", - " var fig = event.data.fig;\n", - " if (event.target !== this) {\n", - " // Ignore bubbled events from children.\n", - " return;\n", - " }\n", - " fig.close_ws(fig, {});\n", - "};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (el) {\n", - " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (el) {\n", - " // this is important to make the div 'focusable\n", - " el.setAttribute('tabindex', 0);\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " } else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (event, _name) {\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which === 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " fig.ondownload(fig, null);\n", - "};\n", - "\n", - "mpl.find_output_cell = function (html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i = 0; i < ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code') {\n", - " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] === html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "};\n", + "application/vnd.jupyter.widget-view+json": { + "model_id": "0c38945fae0447f0993d33bbc9ac04cf", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAADTeUlEQVR4nOydd3gUxR+H30vvIQkkEHqT3kPvXap0EBBRQX8KiCBKEwVpCiIgVlARpPemVOkdQpUmSieEzkECqXe/P+7Z5XIkl9u7vZJk3ufh0cvuzsy2mc9+y4xGr9frEQgEAoFAIBDkGNyc3QCBQCAQCAQCgWMRAlAgEAgEAoEghyEEoEAgEAgEAkEOQwhAgUAgEAgEghyGEIACgUAgEAgEOQwhAAUCgUAgEAhyGEIACgQCgUAgEOQwhAAUCAQCgUAgyGEIASgQCAQCgUCQwxACUCAQCAQCgSCHIQSgQCAQCAQCQQ5DCECBQCAQCASCHIYQgAKBQCAQCAQ5DCEABQKBQCAQCHIYQgAKBAKBQCAQ5DCEABQIBAKBQCDIYQgBKBAIBAKBQJDDEAJQIBAIBAKBIIchBKBAIBAIBAJBDkMIQIFAIBAIBIIchhCAAoFAIBAIBDkMIQAFAoFAIBAIchhCAAoEAoFAIBDkMIQAFAgEAoFAIMhhCAEoEAgEAoFAkMMQAlAgEAgEAoEghyEEoEAgEAgEAkEOQwhAgUAgEAgEghyGEIACgUAgEAgEOQwhAAUCgUAgEAhyGEIACgQCgUAgEOQwhAAUCAQCgUAgyGEIASgQCAQCgUCQwxACUCAQCAQCgSCHIQSgQCAQCAQCQQ5DCECBQCAQCASCHIYQgAKBIMdz5coVNBoNv/32m+Jjd+7ciUajYefOnfLfxo4di0ajUa+BQN++fSlSpIiqZQoEgpyLEIACgUAgEAgEOQwhAAUCgUAgEAhyGEIACgQCl0Bym546dYquXbsSHBxMaGgoQ4cOJSUlhQsXLvDyyy8TGBhIkSJFmDJlSprjr127Ru/evQkPD8fb25syZcowbdo0dDpdmv1iYmLo1q0bgYGBBAcH0717d2JjY9Nt09GjR2nfvj2hoaH4+PhQpUoVli1bZvU5Ll26lNq1a+Pv709AQAAtW7bk+PHjL+z322+/UapUKfk85s+fb3WdAoFAkB5CAAoEApeiW7duVKpUiZUrV9K/f3+mT5/OkCFD6NChA23atGH16tU0adKE4cOHs2rVKgDu3r1LnTp12LJlC+PHj2fdunU0a9aMYcOGMXDgQLnsZ8+e0axZM7Zs2cLkyZNZvnw5efPmpXv37i+0Y8eOHdStW5dHjx7x448/snbtWipXrkz37t2tihWcNGkSr776KmXLlmXZsmX8/vvvPHnyhPr163P27Fl5v99++4033niDMmXKsHLlSj755BPGjx/P9u3blV9MgUAgyAi9QCAQuACfffaZHtBPmzYtzd8rV66sB/SrVq2S/5acnKzPkyePvlOnTnq9Xq8fMWKEHtAfOnQozbHvvvuuXqPR6C9cuKDX6/X6H374QQ/o165dm2a//v376wH93Llz5b+VLl1aX6VKFX1ycnKafdu2bavPly+fPjU1Va/X6/U7duzQA/odO3a8cC4S165d03t4eOgHDRqUpqwnT57o8+bNq+/WrZter9frU1NT9ZGRkfqqVavqdTqdvN+VK1f0np6e+sKFC2d4/QQCgUAJwgIoEAhcirZt26b5XaZMGTQaDa1atZL/5uHhQYkSJbh69SoA27dvp2zZstSoUSPNsX379kWv18vWsx07dhAYGEj79u3T7NezZ880v//991/Onz9Pr169AEhJSZH/tW7dmlu3bnHhwgWLz2nz5s2kpKTQp0+fNGX5+PjQsGFDOYP4woULxMTE0LNnzzRZxIULF6ZOnToW1ycQCASZ4eHsBggEAoExoaGhaX57eXnh5+eHj4/PC39//PgxAPfv3093ipTIyEh5u/TfiIiIF/bLmzdvmt+3b98GYNiwYQwbNizddt67d8+Cs0lbXvXq1dPd7ubmlqadpu2R/nblyhWL6xQIBAJzCAEoEAiyPGFhYdy6deuFv8fExACQO3dueb/Dhw+/sJ9pEoi0/8iRI+nUqVO6dZYqVcri9knlrVixgsKFC2e4X1hYWLrtyehvAoFAYC1CAAoEgixP06ZNmTx5MseOHaNq1ary3+fPn49Go6Fx48YANG7cmGXLlrFu3bo0buBFixalKa9UqVKULFmSkydPMmnSJJvb17JlSzw8PPjvv//o3LlzhvuVKlWKfPnysXjxYoYOHSq7ga9evcr+/ftli6ZAIBDYihCAAoEgyzNkyBDmz59PmzZt+PzzzylcuDB//PEH33//Pe+++y4vvfQSAH369GH69On06dOHiRMn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PDzUz9q88sorxcYnvd/XqlVLxfb666/Dx8fHcK5NmjQJTqcTy5YtQ6VKldTxN5lMSE5OvqF86W1tNhvCwsLw1FNPISoqSuVr2bJlqugr6dalSxf07dtXXVN9M2NfaGgoDh8+fM0x949uK1asuGbb4OBgbN68GaNGjbrmGHetuESuFmzXavtHt65du2LhwoUlbouMjFQfgLKystC5c2f1ATUxMbHYz8LQrdEAQIiIiIjIbfAaQCIiIiI3wwKQiIiIyM2wACQiIiJyMywAiYiIiNwMC0AiIiIiN8MCkIiIiMjNsAAkIiIicjMsAImIiIjcDAtAInJJqampMnz48NIOg4ioTGIBSERuCYBcvny5tMMgIioVLACJyOX07dtXMjMz5W9/+5tomiaapsk//vEP0TRN1q5dK/Xr1xe73S6bN2+Wn3/+WR566CEJDQ0Vh8MhDRo0kPXr1xueLy8vT0aOHClRUVFit9slPj5e3nrrLbX9X//6l7Rt21YcDoeEhoZKr1695OTJk/d6t4mIbhgLQCJyOX/729+kcePGMnDgQMnOzpbs7GyJiooSEZGRI0fK1KlT5YcffpDExEQ5d+6ctG3bVtavXy87d+6UtLQ06dChgxw+fFg9X+/evWXp0qXy97//XX744QeZP3++OBwOERHJzs6WlJQUqVOnjnz33XeyZs0a+f3336VLly6lsu9ERDdCA4DSDoKI6E5LTU2VOnXqyKxZs0REZNOmTdKiRQtZuXKlPPTQQ9dtW6NGDRk8eLAMHTpUsrKypGrVqpKRkSGtWrUq9thx48bJ1q1bZe3ateq+I0eOSFRUlPz4449SpUqVO7pfRER3gqW0AyAiupfq169v+Pf58+dlwoQJsnr1ajl27JhcvnxZLl68qGYAd+3aJWazWVJSUkp8vh07dsjGjRvVjGBhP//8MwtAIiqTWAASkVvx9vY2/HvEiBGydu1aefXVV6Vy5cri6ekpjzzyiOTn54uIiKen53Wfz+l0SocOHWTatGnFtoWHh9+5wImI7iAWgETkkmw2m1y5cuUPH7d582bp27evPPzwwyIicu7cOfnll1/U9lq1aonT6ZTMzMwSl4Dr1asnH3/8scTGxorFwiGViMoHfgmEiFxSbGysbN26VX755Rc5efKkOJ3OEh9XuXJlWb58uezatUt2794tPXr0MDw2NjZW+vTpI/369ZOVK1fKoUOHZNOmTfLBBx+IiMhTTz0lp06dku7du8u2bdvk4MGDsm7dOunXr98NFaBERKWBBSARuaS//OUvYjabJSEhQYKDgw3f6i1s5syZEhAQIMnJydKhQwdJS0uTevXqGR4zb948eeSRR2TIkCFSrVo1GThwoJw/f15ERCIiIuSbb76RK1euSFpamtSsWVOGDRsmfn5+YjJxiCWisonfAiYiIiJyM/x4SkRERORmWAASERERuRkWgERERERuhgUgERERkZthAUhERETkZlgAEhEREbkZFoBEREREboYFIBEREZGbYQFIRERE5GZYABIRERG5GRaARERERG6GBSARERGRm/k/jISYpHg2IO8AAAAASUVORK5CYII=", + "text/html": [ "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel !== null) {\n", - " IPython.notebook.kernel.comm_manager.register_target(\n", - " 'matplotlib',\n", - " mpl.mpl_figure_comm\n", - " );\n", - "}\n" + "
\n", + "
\n", + " Figure\n", + "
\n", + " \n", + "
\n", + " " ], "text/plain": [ - "" + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, @@ -4156,11 +546,24 @@ }, { "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8e7f5a3b99f041db9a7f8cefef3cc821", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA7PUlEQVR4nO3de3RU5b3/8c/kTiCZCpGESEgCIhdpKQSRi4hWDCocWq2CpUJtkR7q0QKpv2qKXSIejXpaG29g9Vg51gvYIkfaspCgiHIAKZCoIEaFQBASAwhJKJDr8/uDNcNMZiaZyW1mZ96vtfZiZu9ndp69BeeT7/PsvW3GGCMAAACEjYhgdwAAAACdiwAIAAAQZgiAAAAAYYYACAAAEGYIgAAAAGGGAAgAABBmCIAAAABhhgAIAAAQZgiAAAAAYYYACAAAEGYIgAAAAGGGAAgAABBmCIAAAABhhgAIAAAQZgiAAAAAYYYACAAAEGYIgAAAAGGGAAgAABBmCIAAAABhhgAIAAAQZgiAAAAAYYYACAAAEGYIgAAAAGGGAAgAABBmCIAAAABhhgAIAAAQZgiAAAAAYYYACAAAEGYIgAAAAGGGAAgAABBmCIAAAABhhgAIAAAQZgiAAAAAYYYACAAAEGYIgAAAAGGGAAgAABBmCIAAwt6BAwdks9m0fPnygD/73nvvyWaz6b333nOuW7x4sWw2W/t1UNLtt9+ujIyMdt0ngPBFAAQAAAgzBEAAAIAwQwAEEBIcw6Yff/yxbrnlFtntdvXs2VM5OTmqr69XcXGxrrvuOiUkJCgjI0OPP/642+dLS0t12223qXfv3oqNjdWQIUP0+9//Xo2NjW7tjhw5ounTpyshIUF2u10zZsxQeXm51z7t2LFD06ZNU8+ePRUXF6cRI0bojTfeaPUxrly5UmPHjlX37t3Vo0cPTZ48WYWFhR7tli9frkGDBjmP4+WXX271zwQAbwiAAELK9OnTNXz4cK1atUpz587VH/7wBy1cuFA/+MEPNGXKFK1evVrf+973dO+99+rNN9+UJB09elTjxo3T+vXr9dBDD2nNmjWaNGmS7rnnHt11113OfZ85c0aTJk3S+vXrlZeXp7/85S9KSUnRjBkzPPqxceNGjR8/XidPntRzzz2nt956S9/97nc1Y8aMVs0VfOSRR/SjH/1IQ4cO1RtvvKE///nPqq6u1oQJE/Tpp5862y1fvlw//elPNWTIEK1atUr333+/HnroIb377ruBn0wA8MUAQAh44IEHjCTz+9//3m39d7/7XSPJvPnmm851dXV15sILLzQ33XSTMcaY++67z0gyH374odtnf/GLXxibzWaKi4uNMcYsW7bMSDJvvfWWW7u5c+caSeall15yrhs8eLAZMWKEqaurc2s7depU06dPH9PQ0GCMMWbjxo1Gktm4caPHsTiUlpaaqKgoc/fdd7vtq7q62qSkpJjp06cbY4xpaGgwqampZuTIkaaxsdHZ7sCBAyY6Otqkp6f7PH8AEAgqgABCytSpU93eDxkyRDabTddff71zXVRUlC6++GIdPHhQkvTuu+9q6NChGj16tNtnb7/9dhljnNWzjRs3KiEhQdOmTXNrN3PmTLf3X375pT777DP9+Mc/liTV19c7lxtuuEFlZWUqLi72+5jefvtt1dfXa/bs2W77iouL08SJE51XEBcXF+vIkSOaOXOm21XE6enpGjdunN8/DwBaEhXsDgCAq549e7q9j4mJUXx8vOLi4jzWV1VVSZKOHz/u9RYpqampzu2OP5OTkz3apaSkuL3/+uuvJUn33HOP7rnnHq/9PHbsmB9H476/yy67zOv2iIgIt3427Y9j3YEDB/z+mQDQHAIgAMvr1auXysrKPNYfOXJEkpSUlORst337do92TS8CcbTPzc3VTTfd5PVnDho0yO/+Ofb317/+Venp6T7b9erVy2t/fK0DgNYiAAKwvGuuuUZ5eXnatWuXRo4c6Vz/8ssvy2az6eqrr5YkXX311XrjjTe0Zs0at2Hg1157zW1/gwYN0sCBA/XRRx/pkUceaXP/Jk+erKioKO3bt08//OEPfbYbNGiQ+vTpo9dff105OTnOYeCDBw9qy5YtzoomALQVARCA5S1cuFAvv/yypkyZoiVLlig9PV3/+Mc/tHTpUv3iF7/QJZdcIkmaPXu2/vCHP2j27Nl6+OGHNXDgQK1du1Zvv/22xz7/+Mc/6vrrr9fkyZN1++2366KLLtI333yjvXv3ateuXfrLX/7id/8yMjK0ZMkSLVq0SPv379d1112nCy64QF9//bW2b9+u7t2768EHH1RERIQeeugh3XHHHbrxxhs1d+5cnTx5UosXL/Y6LAwArUUABGB5F154obZs2aLc3Fzl5uaqqqpK/fv31+OP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", "text/html": [ - "" + "\n", + "
\n", + "
\n", + " Figure\n", + "
\n", + " \n", + "
\n", + " " ], "text/plain": [ - "" + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, @@ -4168,964 +571,161 @@ }, { "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "/* global mpl */\n", - "window.mpl = {};\n", - "\n", - "mpl.get_websocket_type = function () {\n", - " if (typeof WebSocket !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof MozWebSocket !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert(\n", - " 'Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.'\n", - " );\n", - " }\n", - "};\n", - "\n", - "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = this.ws.binaryType !== undefined;\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById('mpl-warnings');\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent =\n", - " 'This browser does not support binary websocket messages. ' +\n", - " 'Performance may be slow.';\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = document.createElement('div');\n", - " this.root.setAttribute('style', 'display: inline-block');\n", - " this._root_extra_style(this.root);\n", - "\n", - " parent_element.appendChild(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message('supports_binary', { value: fig.supports_binary });\n", - " fig.send_message('send_image_mode', {});\n", - " if (fig.ratio !== 1) {\n", - " fig.send_message('set_device_pixel_ratio', {\n", - " device_pixel_ratio: fig.ratio,\n", - " });\n", - " }\n", - " fig.send_message('refresh', {});\n", - " };\n", - "\n", - " this.imageObj.onload = function () {\n", - " if (fig.image_mode === 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function () {\n", - " fig.ws.close();\n", - " };\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "};\n", - "\n", - "mpl.figure.prototype._init_header = function () {\n", - " var titlebar = document.createElement('div');\n", - " titlebar.classList =\n", - " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", - " var titletext = document.createElement('div');\n", - " titletext.classList = 'ui-dialog-title';\n", - " titletext.setAttribute(\n", - " 'style',\n", - " 'width: 100%; text-align: center; padding: 3px;'\n", - " );\n", - " titlebar.appendChild(titletext);\n", - " this.root.appendChild(titlebar);\n", - " this.header = titletext;\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._init_canvas = function () {\n", - " var fig = this;\n", - "\n", - " var canvas_div = (this.canvas_div = document.createElement('div'));\n", - " canvas_div.setAttribute(\n", - " 'style',\n", - " 'border: 1px solid #ddd;' +\n", - " 'box-sizing: content-box;' +\n", - " 'clear: both;' +\n", - " 'min-height: 1px;' +\n", - " 'min-width: 1px;' +\n", - " 'outline: 0;' +\n", - " 'overflow: hidden;' +\n", - " 'position: relative;' +\n", - " 'resize: both;'\n", - " );\n", - "\n", - " function on_keyboard_event_closure(name) {\n", - " return function (event) {\n", - " return fig.key_event(event, name);\n", - " };\n", - " }\n", - "\n", - " canvas_div.addEventListener(\n", - " 'keydown',\n", - " on_keyboard_event_closure('key_press')\n", - " );\n", - " canvas_div.addEventListener(\n", - " 'keyup',\n", - " on_keyboard_event_closure('key_release')\n", - " );\n", - "\n", - " this._canvas_extra_style(canvas_div);\n", - " this.root.appendChild(canvas_div);\n", - "\n", - " var canvas = (this.canvas = document.createElement('canvas'));\n", - " canvas.classList.add('mpl-canvas');\n", - " canvas.setAttribute('style', 'box-sizing: content-box;');\n", - "\n", - " this.context = canvas.getContext('2d');\n", - "\n", - " var backingStore =\n", - " this.context.backingStorePixelRatio ||\n", - " this.context.webkitBackingStorePixelRatio ||\n", - " this.context.mozBackingStorePixelRatio ||\n", - " this.context.msBackingStorePixelRatio ||\n", - " this.context.oBackingStorePixelRatio ||\n", - " this.context.backingStorePixelRatio ||\n", - " 1;\n", - "\n", - " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", - " 'canvas'\n", - " ));\n", - " rubberband_canvas.setAttribute(\n", - " 'style',\n", - " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", - " );\n", - "\n", - " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", - " if (this.ResizeObserver === undefined) {\n", - " if (window.ResizeObserver !== undefined) {\n", - " this.ResizeObserver = window.ResizeObserver;\n", - " } else {\n", - " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", - " this.ResizeObserver = obs.ResizeObserver;\n", - " }\n", - " }\n", - "\n", - " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", - " var nentries = entries.length;\n", - " for (var i = 0; i < nentries; i++) {\n", - " var entry = entries[i];\n", - " var width, height;\n", - " if (entry.contentBoxSize) {\n", - " if (entry.contentBoxSize instanceof Array) {\n", - " // Chrome 84 implements new version of spec.\n", - " width = entry.contentBoxSize[0].inlineSize;\n", - " height = entry.contentBoxSize[0].blockSize;\n", - " } else {\n", - " // Firefox implements old version of spec.\n", - " width = entry.contentBoxSize.inlineSize;\n", - " height = entry.contentBoxSize.blockSize;\n", - " }\n", - " } else {\n", - " // Chrome <84 implements even older version of spec.\n", - " width = entry.contentRect.width;\n", - " height = entry.contentRect.height;\n", - " }\n", - "\n", - " // Keep the size of the canvas and rubber band canvas in sync with\n", - " // the canvas container.\n", - " if (entry.devicePixelContentBoxSize) {\n", - " // Chrome 84 implements new version of spec.\n", - " canvas.setAttribute(\n", - " 'width',\n", - " entry.devicePixelContentBoxSize[0].inlineSize\n", - " );\n", - " canvas.setAttribute(\n", - " 'height',\n", - " entry.devicePixelContentBoxSize[0].blockSize\n", - " );\n", - " } else {\n", - " canvas.setAttribute('width', width * fig.ratio);\n", - " canvas.setAttribute('height', height * fig.ratio);\n", - " }\n", - " canvas.setAttribute(\n", - " 'style',\n", - " 'width: ' + width + 'px; height: ' + height + 'px;'\n", - " );\n", - "\n", - " rubberband_canvas.setAttribute('width', width);\n", - " rubberband_canvas.setAttribute('height', height);\n", - "\n", - " // And update the size in Python. We ignore the initial 0/0 size\n", - " // that occurs as the element is placed into the DOM, which should\n", - " // otherwise not happen due to the minimum size styling.\n", - " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", - " fig.request_resize(width, height);\n", - " }\n", - " }\n", - " });\n", - " this.resizeObserverInstance.observe(canvas_div);\n", - "\n", - " function on_mouse_event_closure(name) {\n", - " return function (event) {\n", - " return fig.mouse_event(event, name);\n", - " };\n", - " }\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mousedown',\n", - " on_mouse_event_closure('button_press')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseup',\n", - " on_mouse_event_closure('button_release')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'dblclick',\n", - " on_mouse_event_closure('dblclick')\n", - " );\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband_canvas.addEventListener(\n", - " 'mousemove',\n", - " on_mouse_event_closure('motion_notify')\n", - " );\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseenter',\n", - " on_mouse_event_closure('figure_enter')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseleave',\n", - " on_mouse_event_closure('figure_leave')\n", - " );\n", - "\n", - " canvas_div.addEventListener('wheel', function (event) {\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " on_mouse_event_closure('scroll')(event);\n", - " });\n", - "\n", - " canvas_div.appendChild(canvas);\n", - " canvas_div.appendChild(rubberband_canvas);\n", - "\n", - " this.rubberband_context = rubberband_canvas.getContext('2d');\n", - " this.rubberband_context.strokeStyle = '#000000';\n", - "\n", - " this._resize_canvas = function (width, height, forward) {\n", - " if (forward) {\n", - " canvas_div.style.width = width + 'px';\n", - " canvas_div.style.height = height + 'px';\n", - " }\n", - " };\n", - "\n", - " // Disable right mouse context menu.\n", - " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n", - " event.preventDefault();\n", - " return false;\n", - " });\n", - "\n", - " function set_focus() {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'mpl-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " continue;\n", - " }\n", - "\n", - " var button = (fig.buttons[name] = document.createElement('button'));\n", - " button.classList = 'mpl-widget';\n", - " button.setAttribute('role', 'button');\n", - " button.setAttribute('aria-disabled', 'false');\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - "\n", - " var icon_img = document.createElement('img');\n", - " icon_img.src = '_images/' + image + '.png';\n", - " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", - " icon_img.alt = tooltip;\n", - " button.appendChild(icon_img);\n", - "\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " var fmt_picker = document.createElement('select');\n", - " fmt_picker.classList = 'mpl-widget';\n", - " toolbar.appendChild(fmt_picker);\n", - " this.format_dropdown = fmt_picker;\n", - "\n", - " for (var ind in mpl.extensions) {\n", - " var fmt = mpl.extensions[ind];\n", - " var option = document.createElement('option');\n", - " option.selected = fmt === mpl.default_extension;\n", - " option.innerHTML = fmt;\n", - " fmt_picker.appendChild(option);\n", - " }\n", - "\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "};\n", - "\n", - "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n", - " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", - " // which will in turn request a refresh of the image.\n", - " this.send_message('resize', { width: x_pixels, height: y_pixels });\n", - "};\n", - "\n", - "mpl.figure.prototype.send_message = function (type, properties) {\n", - " properties['type'] = type;\n", - " properties['figure_id'] = this.id;\n", - " this.ws.send(JSON.stringify(properties));\n", - "};\n", - "\n", - "mpl.figure.prototype.send_draw_message = function () {\n", - " if (!this.waiting) {\n", - " this.waiting = true;\n", - " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " var format_dropdown = fig.format_dropdown;\n", - " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", - " fig.ondownload(fig, format);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_resize = function (fig, msg) {\n", - " var size = msg['size'];\n", - " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n", - " fig._resize_canvas(size[0], size[1], msg['forward']);\n", - " fig.send_message('refresh', {});\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", - " var x0 = msg['x0'] / fig.ratio;\n", - " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", - " var x1 = msg['x1'] / fig.ratio;\n", - " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n", - " x0 = Math.floor(x0) + 0.5;\n", - " y0 = Math.floor(y0) + 0.5;\n", - " x1 = Math.floor(x1) + 0.5;\n", - " y1 = Math.floor(y1) + 0.5;\n", - " var min_x = Math.min(x0, x1);\n", - " var min_y = Math.min(y0, y1);\n", - " var width = Math.abs(x1 - x0);\n", - " var height = Math.abs(y1 - y0);\n", - "\n", - " fig.rubberband_context.clearRect(\n", - " 0,\n", - " 0,\n", - " fig.canvas.width / fig.ratio,\n", - " fig.canvas.height / fig.ratio\n", - " );\n", - "\n", - " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n", - " // Updates the figure title.\n", - " fig.header.textContent = msg['label'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n", - " fig.rubberband_canvas.style.cursor = msg['cursor'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_message = function (fig, msg) {\n", - " fig.message.textContent = msg['message'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n", - " // Request the server to send over a new figure.\n", - " fig.send_draw_message();\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n", - " fig.image_mode = msg['mode'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n", - " for (var key in msg) {\n", - " if (!(key in fig.buttons)) {\n", - " continue;\n", - " }\n", - " fig.buttons[key].disabled = !msg[key];\n", - " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", - " if (msg['mode'] === 'PAN') {\n", - " fig.buttons['Pan'].classList.add('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " } else if (msg['mode'] === 'ZOOM') {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.add('active');\n", - " } else {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Called whenever the canvas gets updated.\n", - " this.send_message('ack', {});\n", - "};\n", - "\n", - "// A function to construct a web socket function for onmessage handling.\n", - "// Called in the figure constructor.\n", - "mpl.figure.prototype._make_on_message_function = function (fig) {\n", - " return function socket_on_message(evt) {\n", - " if (evt.data instanceof Blob) {\n", - " var img = evt.data;\n", - " if (img.type !== 'image/png') {\n", - " /* FIXME: We get \"Resource interpreted as Image but\n", - " * transferred with MIME type text/plain:\" errors on\n", - " * Chrome. But how to set the MIME type? It doesn't seem\n", - " * to be part of the websocket stream */\n", - " img.type = 'image/png';\n", - " }\n", - "\n", - " /* Free the memory for the previous frames */\n", - " if (fig.imageObj.src) {\n", - " (window.URL || window.webkitURL).revokeObjectURL(\n", - " fig.imageObj.src\n", - " );\n", - " }\n", - "\n", - " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", - " img\n", - " );\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " } else if (\n", - " typeof evt.data === 'string' &&\n", - " evt.data.slice(0, 21) === 'data:image/png;base64'\n", - " ) {\n", - " fig.imageObj.src = evt.data;\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - "\n", - " var msg = JSON.parse(evt.data);\n", - " var msg_type = msg['type'];\n", - "\n", - " // Call the \"handle_{type}\" callback, which takes\n", - " // the figure and JSON message as its only arguments.\n", - " try {\n", - " var callback = fig['handle_' + msg_type];\n", - " } catch (e) {\n", - " console.log(\n", - " \"No handler for the '\" + msg_type + \"' message type: \",\n", - " msg\n", - " );\n", - " return;\n", - " }\n", - "\n", - " if (callback) {\n", - " try {\n", - " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", - " callback(fig, msg);\n", - " } catch (e) {\n", - " console.log(\n", - " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", - " e,\n", - " e.stack,\n", - " msg\n", - " );\n", - " }\n", - " }\n", - " };\n", - "};\n", - "\n", - "// from https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", - "mpl.findpos = function (e) {\n", - " //this section is from http://www.quirksmode.org/js/events_properties.html\n", - " var targ;\n", - " if (!e) {\n", - " e = window.event;\n", - " }\n", - " if (e.target) {\n", - " targ = e.target;\n", - " } else if (e.srcElement) {\n", - " targ = e.srcElement;\n", - " }\n", - " if (targ.nodeType === 3) {\n", - " // defeat Safari bug\n", - " targ = targ.parentNode;\n", - " }\n", - "\n", - " // pageX,Y are the mouse positions relative to the document\n", - " var boundingRect = targ.getBoundingClientRect();\n", - " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", - " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n", - "\n", - " return { x: x, y: y };\n", - "};\n", - "\n", - "/*\n", - " * return a copy of an object with only non-object keys\n", - " * we need this to avoid circular references\n", - " * https://stackoverflow.com/a/24161582/3208463\n", - " */\n", - "function simpleKeys(original) {\n", - " return Object.keys(original).reduce(function (obj, key) {\n", - " if (typeof original[key] !== 'object') {\n", - " obj[key] = original[key];\n", - " }\n", - " return obj;\n", - " }, {});\n", - "}\n", - "\n", - "mpl.figure.prototype.mouse_event = function (event, name) {\n", - " var canvas_pos = mpl.findpos(event);\n", - "\n", - " if (name === 'button_press') {\n", - " this.canvas.focus();\n", - " this.canvas_div.focus();\n", - " }\n", - "\n", - " var x = canvas_pos.x * this.ratio;\n", - " var y = canvas_pos.y * this.ratio;\n", - "\n", - " this.send_message(name, {\n", - " x: x,\n", - " y: y,\n", - " button: event.button,\n", - " step: event.step,\n", - " guiEvent: simpleKeys(event),\n", - " });\n", - "\n", - " /* This prevents the web browser from automatically changing to\n", - " * the text insertion cursor when the button is pressed. We want\n", - " * to control all of the cursor setting manually through the\n", - " * 'cursor' event from matplotlib */\n", - " event.preventDefault();\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n", - " // Handle any extra behaviour associated with a key event\n", - "};\n", - "\n", - "mpl.figure.prototype.key_event = function (event, name) {\n", - " // Prevent repeat events\n", - " if (name === 'key_press') {\n", - " if (event.key === this._key) {\n", - " return;\n", - " } else {\n", - " this._key = event.key;\n", - " }\n", - " }\n", - " if (name === 'key_release') {\n", - " this._key = null;\n", - " }\n", - "\n", - " var value = '';\n", - " if (event.ctrlKey && event.key !== 'Control') {\n", - " value += 'ctrl+';\n", - " }\n", - " else if (event.altKey && event.key !== 'Alt') {\n", - " value += 'alt+';\n", - " }\n", - " else if (event.shiftKey && event.key !== 'Shift') {\n", - " value += 'shift+';\n", - " }\n", - "\n", - " value += 'k' + event.key;\n", - "\n", - " this._key_event_extra(event, name);\n", - "\n", - " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n", - " if (name === 'download') {\n", - " this.handle_save(this, null);\n", - " } else {\n", - " this.send_message('toolbar_button', { name: name });\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n", - " this.message.textContent = tooltip;\n", - "};\n", - "\n", - "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", - "// prettier-ignore\n", - "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n", - "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", - "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", - "\n", - "mpl.default_extension = \"png\";/* global mpl */\n", - "\n", - "var comm_websocket_adapter = function (comm) {\n", - " // Create a \"websocket\"-like object which calls the given IPython comm\n", - " // object with the appropriate methods. Currently this is a non binary\n", - " // socket, so there is still some room for performance tuning.\n", - " var ws = {};\n", - "\n", - " ws.binaryType = comm.kernel.ws.binaryType;\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " function updateReadyState(_event) {\n", - " if (comm.kernel.ws) {\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " } else {\n", - " ws.readyState = 3; // Closed state.\n", - " }\n", - " }\n", - " comm.kernel.ws.addEventListener('open', updateReadyState);\n", - " comm.kernel.ws.addEventListener('close', updateReadyState);\n", - " comm.kernel.ws.addEventListener('error', updateReadyState);\n", - "\n", - " ws.close = function () {\n", - " comm.close();\n", - " };\n", - " ws.send = function (m) {\n", - " //console.log('sending', m);\n", - " comm.send(m);\n", - " };\n", - " // Register the callback with on_msg.\n", - " comm.on_msg(function (msg) {\n", - " //console.log('receiving', msg['content']['data'], msg);\n", - " var data = msg['content']['data'];\n", - " if (data['blob'] !== undefined) {\n", - " data = {\n", - " data: new Blob(msg['buffers'], { type: data['blob'] }),\n", - " };\n", - " }\n", - " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", - " ws.onmessage(data);\n", - " });\n", - " return ws;\n", - "};\n", - "\n", - "mpl.mpl_figure_comm = function (comm, msg) {\n", - " // This is the function which gets called when the mpl process\n", - " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", - "\n", - " var id = msg.content.data.id;\n", - " // Get hold of the div created by the display call when the Comm\n", - " // socket was opened in Python.\n", - " var element = document.getElementById(id);\n", - " var ws_proxy = comm_websocket_adapter(comm);\n", - "\n", - " function ondownload(figure, _format) {\n", - " window.open(figure.canvas.toDataURL());\n", - " }\n", - "\n", - " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n", - "\n", - " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", - " // web socket which is closed, not our websocket->open comm proxy.\n", - " ws_proxy.onopen();\n", - "\n", - " fig.parent_element = element;\n", - " fig.cell_info = mpl.find_output_cell(\"
\");\n", - " if (!fig.cell_info) {\n", - " console.error('Failed to find cell for figure', id, fig);\n", - " return;\n", - " }\n", - " fig.cell_info[0].output_area.element.on(\n", - " 'cleared',\n", - " { fig: fig },\n", - " fig._remove_fig_handler\n", - " );\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_close = function (fig, msg) {\n", - " var width = fig.canvas.width / fig.ratio;\n", - " fig.cell_info[0].output_area.element.off(\n", - " 'cleared',\n", - " fig._remove_fig_handler\n", - " );\n", - " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n", - "\n", - " // Update the output cell to use the data from the current canvas.\n", - " fig.push_to_output();\n", - " var dataURL = fig.canvas.toDataURL();\n", - " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", - " // the notebook keyboard shortcuts fail.\n", - " IPython.keyboard_manager.enable();\n", - " fig.parent_element.innerHTML =\n", - " '';\n", - " fig.close_ws(fig, msg);\n", - "};\n", - "\n", - "mpl.figure.prototype.close_ws = function (fig, msg) {\n", - " fig.send_message('closing', msg);\n", - " // fig.ws.close()\n", - "};\n", - "\n", - "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n", - " // Turn the data on the canvas into data in the output cell.\n", - " var width = this.canvas.width / this.ratio;\n", - " var dataURL = this.canvas.toDataURL();\n", - " this.cell_info[1]['text/html'] =\n", - " '';\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Tell IPython that the notebook contents must change.\n", - " IPython.notebook.set_dirty(true);\n", - " this.send_message('ack', {});\n", - " var fig = this;\n", - " // Wait a second, then push the new image to the DOM so\n", - " // that it is saved nicely (might be nice to debounce this).\n", - " setTimeout(function () {\n", - " fig.push_to_output();\n", - " }, 1000);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'btn-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " var button;\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " continue;\n", - " }\n", - "\n", - " button = fig.buttons[name] = document.createElement('button');\n", - " button.classList = 'btn btn-default';\n", - " button.href = '#';\n", - " button.title = name;\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message pull-right';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = document.createElement('div');\n", - " buttongrp.classList = 'btn-group inline pull-right';\n", - " button = document.createElement('button');\n", - " button.classList = 'btn btn-mini btn-primary';\n", - " button.href = '#';\n", - " button.title = 'Stop Interaction';\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', function (_evt) {\n", - " fig.handle_close(fig, {});\n", - " });\n", - " button.addEventListener(\n", - " 'mouseover',\n", - " on_mouseover_closure('Stop Interaction')\n", - " );\n", - " buttongrp.appendChild(button);\n", - " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", - " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", - "};\n", - "\n", - "mpl.figure.prototype._remove_fig_handler = function (event) {\n", - " var fig = event.data.fig;\n", - " if (event.target !== this) {\n", - " // Ignore bubbled events from children.\n", - " return;\n", - " }\n", - " fig.close_ws(fig, {});\n", - "};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (el) {\n", - " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (el) {\n", - " // this is important to make the div 'focusable\n", - " el.setAttribute('tabindex', 0);\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " } else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (event, _name) {\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which === 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " fig.ondownload(fig, null);\n", - "};\n", + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Clear the previously compiled operator\n", + "pde.clear_operators()\n", + "\n", + "# and run it forward\n", + "traces = await pde(shot.wavelets, vp, rho, problem=sub_problem)\n", + "\n", + "# Plot the resulting traces\n", + "_ = traces.plot()\n", + "traces.plot_one(60)" + ] + }, + { + "cell_type": "markdown", + "id": "twelve-township", + "metadata": {}, + "source": [ + "## Variable density and attenuation\n", + "\n", + "We can also add some attenuation to our acoustic run by creating a further scalar field." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "interested-police", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2b2da335b4774b5f989aca2ab13f8ec0", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABO1UlEQVR4nO3dfVxVVd738e9RHlUgH0FGUHSc8jmFQnBIbRSjdLSaUivTa6zJySaRq6nIHMlpILUYx0FxNB+nUWzGh+rOCppJ1FtNISy1brMRgwyGcAx8BIV9/8F4xiPoEQ54OPt83q/Xer2us/Zae6+VzrV//tbae1sMwzAEAAAAt9HC2QMAAADAjUUACAAA4GYIAAEAANwMASAAAICbIQAEAABwMwSAAAAAboYAEAAAwM0QAAIAALgZAkAAAAA3QwAIAADgZggAAQAA3AwBIAAAgJshAAQAAHAzBIAAAABuhgAQAADAzRAAAgAAuBkCQAAAADdDAAgAAOBmCAABAADcDAEgAACAmyEABAAAcDMEgAAAAG6GABAAAMDNEAACAAC4GQJAAAAAN0MACAAA4GYIAAEAANwMASAAAICbIQAEAABwMwSAAAAAboYAEAAAwM0QAAIAALgZAkAAAAA3QwAIAADgZggAAQAA3AwBIAAAgJshAARg17Fjx2SxWLR69eoG9e/WrZtGjx7duIMCADQYASAAAICbIQAEAABwMwSAgBv76quv9D//8z/q2bOnWrVqpR/84AcaM2aMDhw4YLdvUlKSLBaL8vLydN9998nf318BAQF65JFH9N1339XZ5/3339egQYPk6+urW265RStXrrQ5/t133+nJJ59U79691aZNG3Xq1El33nmnduzY0SjzBQDUIAAE3Ni3336r9u3b65VXXtH777+vxYsXy8PDQ5GRkTp8+PB1nePee+/VD3/4Q/3tb39TUlKStmzZolGjRunChQs27T799FP97//+r2bOnKm33npL/fv319SpU7V9+3Zrm3//+9+SpDlz5ujdd9/VqlWr1L17dw0bNkzbtm1rtHkDgLvzcPYAADjPHXfcoTvuuMP6u6qqSvfcc4/69OmjP/3pT0pNTbV7jvvuu0/z58+XJMXGxiowMFAPP/yw3nzzTT388MPWdqWlpfq///f/KjQ01Hrtv//971q3bp11DDfffLOWLFliM55Ro0bp2LFj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5QoICFDovJfVwrfh96Xqc+dV8FzDxmqxWLR582aNGzfuqm2ee+45vf322/riiy+sddOmTdOnn36q3bt3S6p5MLS8vFzvvfeetc1dd92ltm3bav369ZKkyMhIDRo0SOnp6dY2vXr10rhx45SSklKvcbubZpUBPHv2rCZMmNAowV9GRoY++eSTOv8CFBcXS5ICAwNt6gMDA63H6pKSkqKAgABrCQkJcXicAAA0Nosc3AP4n/OUl5fblMuTII7YvXu3YmNjbepGjRqlnJwcXbhw4Zptdu3aJUmqrKxUbm5urTaxsbHWNri6ZhUATp06VX/9618dPk9hYaFmzJihN954Qz7XyMxd+am5S6+buZrExESVlZVZCy+tBgA0S5deA+NIUc3K3OWJj8bKqhUXF9eZhLl48aJKS0uv2eZSoqa0tFRVVVX1TuagRrN6DUxKSopGjx6t999/v84XQaempl7XeXJzc1VSUqLw8HBrXVVVlbZv3660tDQdPnxYUs1frs6dO1vblJSU1PqLdDlvb295e3vXZ0oAALiswsJCmyXgxrwH1pWEubL+ehI19U3moEazCgCTk5P1wQcfWL8FfK2/BNfyk5/8RAcOHLCp+5//+R/dcssteu6559S9e3cFBQUpKyvLugewsrJS2dnZmjdvXiPMBAAAJ2qkL4H4+/s3yX7FoKCgWlm6kpISeXh4qH379tdscylR06FDB7Vs2fKabXB1zSoATE1N1cqVKzVlyhSHzuPn56e+ffva1LVu3Vrt27e31sfHxys5OVk9e/ZUz549lZycrFatWumhhx5y6NoAADhdM/8UXFRUlN555x2buszMTEVERFhX/6KiopSVlaWZM2fatImOjpYkeXl5KTw8XFlZWbr33nutbbKysjR27NimnYAJNKsA0NvbW0OGDLkh13r22Wd17tw5Pfnkkzp58qQiIyOVmZkpPz+/G3J9AADM4vTp0/rqq6+sv/Pz87V//361a9dOoaGhSkxM1PHjx7V27VpJNU/8pqWlKSEhQY8//rh2796tFStWWJ/ulaQZM2bojjvu0Lx58zR27Fi99dZb+vDDD7Vz505rm4SEBE2aNEkRERGKiorSsmXLVFBQoGnTpt24ybuoZhUAzpgxQ3/84x8b/NLna9m2bZvNb4vFoqSkJCUlJTX6tQAAcCZHv+ZR3745OTkaPny49XdCQoKkmtexrV69WkVFRTbv5gsLC9PWrVs1c+ZMLV68WMHBwVq0aJHuv/9+a5vo6GhlZGToxRdf1OzZs9WjRw9t2LBBkZGR1jbjx4/XiRMnNHfuXBUVFalv377aunWrQ18PcxfN6j2A9957r/7xj3+offv26tOnT62HQDZt2uSkkdXN+r4l3gMIALDjRr4HsNvLv3PovlR9/ryOvTirSccK52pWGcCbbrpJ9913n7OHAQAAYGrNKgBctWqVs4cAAIDra+YPgcD5mlUACAAAHHej9wDC9Tj9SyB33XXXdX2y5dSpU5o3b54WL158A0YFAABgXk7PAD7wwAN68MEH5efnp5/+9KeKiIhQcHCwfHx8dPLkSX3++efauXOntm7dqtGjR2vBggXOHjIAAM3bZZ9za3B/mJrTA8CpU6dq0qRJ+tvf/qYNGzZo+fLl+v777yXVvKqld+/eGjVqlHJzc61fCAEAANfAHkDY4fQAUKp5m/dDDz1k/QpHWVmZzp07p/bt29d6FQwAALg29gDCnmYRAF4pICBAAQEBzh4GAACAKTXLABAAADiAJWDYQQAIAIDZOLgETABofk5/DQwAAABuLDKAAACYDUvAsKNZZQCnTJmi7du3O3sYAAC4NqMRCkytWQWAp06dUmxsrHr27Knk5GQdP37c2UMCAAAwnWYVAG7cuFHHjx/XU089pb/+9a/q1q2b4uLi9Le//U0XLlxw9vAAAHAJl94D6EiBuTWrAFCS2rdvrxkzZigvL0979+7VD3/4Q02aNEnBwcGaOXOmjhw54uwhAgAAuLRmFwBeUlRUpMzMTGVmZqply5a6++67dejQIfXu3Vu///3vnT08AAAAl9WsAsALFy5o48aNGj16tLp27aq//vWvmjlzpoqKirRmzRplZmbqz3/+s+bOnevsoQIA0HzxEAjsaFavgencubOqq6s1ceJE7d27V7feemutNqNGjdJNN910w8cGAICr4FvAsKdZBYC///3v9cADD8jHx+eqbdq2bav8/PwbOCoAAFwQQRyuoVkFgJMmTXL2EAAAAEyvWQWAAACgEfAlENhBAAgAgMmwBxD2NKungAEAAND0yAACAGA2LAHDDgJAAABMhiVg2MMSMAAAgJshAwgAgNmwBAw7CAABADAbAkDYQQAIAIDJsAcQ9rAHEAAAwM2QAQQAwGxYAoYdBIAAAJgNASDsYAkYAADAzZg2AExPT1f//v3l7+8vf39/RUVF6b333rMeNwxDSUlJCg4Olq+vr4YNG6ZDhw45ccQAADSOSw+BOFJgbqYNALt06aJXXnlFOTk5ysnJ0Z133qmxY8dag7z58+crNTVVaWlp2rdvn4KCgjRy5EidOnXKySMHAMBBRiOUBliyZInCwsLk4+Oj8PBw7dix45rtFy9erF69esnX11c333yz1q5da3N82LBhslgstco999xjbZOUlFTreFBQUMMm4EZMuwdwzJgxNr9/97vfKT09XXv27FHv3r21cOFCzZo1S/fdd58kac2aNQoMDNS6dev0xBNPOGPIAAC4rA0bNig+Pl5LlizRkCFD9Kc//UlxcXH6/PPPFRoaWqt9enq6EhMTtXz5ct12223au3evHn/8cbVt29Z6D9+0aZMqKyutfU6cOKEBAwbogQcesDlXnz599OGHH1p/t2zZsolmaR6mzQBerqqqShkZGTpz5oyioqKUn5+v4uJixcbGWtt4e3tr6NCh2rVrlxNHCgCA45yxBJyamqqpU6fqscceU69evbRw4UKFhIQoPT29zvZ//vOf9cQTT2j8+PHq3r27JkyYoKlTp2revHnWNu3atVNQUJC1ZGVlqVWrVrUCQA8PD5t2HTt2rP8E3IypA8ADBw6oTZs28vb21rRp07R582b17t1bxcXFkqTAwECb9oGBgdZjdamoqFB5eblNAQCg2bnBS8CVlZXKzc21SaxIUmxs7FUTKxUVFfLx8bGp8/X11d69e3XhwoU6+6xYsUITJkxQ69atbeqPHDmi4OBghYWFacKECTp69Gj9JuCGTB0A3nzzzdq/f7/27NmjX/7yl5o8ebI+//xz63GLxWLT3jCMWnWXS0lJUUBAgLWEhIQ02dgBAHC2K5MeFRUVdbYrLS1VVVVVvRIro0aN0uuvv67c3FwZhqGcnBytXLlSFy5cUGlpaa32e/fu1cGDB/XYY4/Z1EdGRmrt2rX64IMPtHz5chUXFys6OlonTpxo4Kzdg6kDQC8vL/3whz9URESEUlJSNGDAAP3hD3+wbg698i9lSUlJrb+8l0tMTFRZWZm1FBYWNun4AQBokEbKAIaEhNgkPlJSUq552fokVmbPnq24uDgNHjxYnp6eGjt2rKZMmSKp7j18K1asUN++fXX77bfb1MfFxen+++9Xv379NGLE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4hJvb295e3s37YABAHBQY30KrrCw0GYP4NXugR06dFDLli1rZd2udU/19fXVypUr9ac//Un/+te/1LlzZy1btkx+fn7q0KFDnX1atGih2267zZoBbMh1UcO0GUDDMPTUU09p06ZN+sc//qGwsDCb42FhYQoKClJWVpa1rrKyUtnZ2YqOjr7RwwUAoNnx9/e3KVcLAL28vBQeHm5zT5WkrKwsu/dUT09PdenSRS1btlRGRoZGjx6tFi3qDk8Mw9D+/futiRtHruvuTJsBnD59utatW6e33npLfn5+1n8dBAQEyNfXVxaLRfHx8UpOTlbPnj3Vs2dPJScnq1WrVnrooYecPHoAABxgGDXFkf71lJCQoEmTJikiIkJRUVFatmyZCgoKNG3aNEk126iOHz9ufdffl19+qb179yoyMlInT55UamqqDh48qDVr1ljP+dJLL2nw4MHq2bOnysvLtWjRIu3fv1+LFy++7uuibqYNAC89Dj5s2DCb+lWrVln3GDz77LM6d+6cnnzySZ08eVKRkZHKzMyUn5/fDR4tAACNp7GWgOtj/PjxOnHihObOnauioiL17dtXW7duVdeuXSVJRUVFNu/mq6qq0muvvabDhw/L09NTw4cP165du9StWzdrm++//16/+MUvVFxcrICAAA0cOFDbt2/X7bffft3XRd3c5j2ATYH3AAIArteNfA9gVNxch98DuPu93zTpWOFcps0AAgDgtvgWMOwgAAQAwGScsQQM10IACACA2VQbNcWR/jA1074GBgAAAHUjAwgAgNmwBxB2EAACAGAyFjm4B7DRRoLmiiVgAAAAN0MGEAAAs3HCl0DgWggAAQAwGV4DA3tYAgYAAHAzZAABADAbngKGHQSAAACYjMUwZHFgH58jfeEaWAIGAABwM2QAAQAwm+r/FEf6w9QIAAEAMBmWgGEPASAAAGbDQyCwgz2AAAAAboYMIAAAZsOXQGAHASAAACbDl0BgD0vAAAAAboYMIAAAZsMSMOwgAAQAwGQs1TXFkf4wN5aAAQAA3AwZQAAAzIYlYNhBAAgAgNnwImjYwRIwAACAmyEDCACAyfAtYNhDAAgAgNmwBxB2EAACAGA2hiRHXuVC/Gd67AEEAABwM2QAAQAwGfYAwh4CQAAAzMaQg3sAG20kaKZYAgYAAHAzZAABADAbngKGHQSAAACYTbUki4P9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xrZt24yioiJrOXv2rLWNK8wjMTHR2L59u5Gfn2989tlnxgsvvGC0aNHCyMzMNAzDNeZQl8ufAjYM15jH//7v/xrbtm0zjh49auzZs8cYPXq04efnZ/3fsyvMwTAMY+/evYaHh4fxu9/9zjhy5Ijxl7/8xWjVqpXxxhtvWNu4ylyqqqqM0NBQ47nnnqt1zFXmADR3BIANtHjxYqNr166Gl5eXMWjQIOtrSJqzjz76yJBUq0yePNkwjJrXRMyZM8cICgoyvL29jTvuuMM4cOCAcwd9hbrGL8lYtWqVtY0rzOPnP/+59e9Px44djZ/85CfW4M8wXGMOdbkyAHSFeYwfP97o3Lmz4enpaQQHBxv33XefcejQIetxV5jDJe+8847Rt29fw9vb27jllluMZcuW2Rx3lbl88MEHhiTj8OHDtY65yhyA5s5iGIbhlNQjAAAAnII9gAAAAG6GABAAAMDNEAACAAC4GQJAAAAAN0MACAAA4GYIAAEAANwMASAAAICbIQAEAABwMwSAAK7bihUrFBsb65RrP/PMM3r66aedcm0AMBu+BALgulRUVKh79+7KyMhQTEzMDb9+SUmJevTooc8++0xhYWE3/PoAYCZkAAFcl40bN6pNmzZOCf4kqVOnToqNjdXSpUudcn0AMBMCQMDNfPfddwoKClJycrK17uOPP5aXl5cyMzOv2i8jI0M//elPbeqmTJmicePGKTk5WYGBgbrpppv00ksv6eLFi/r1r3+tdu3aqUuXLlq5cqW1z7Fjx2SxWPTmm28qJiZGvr6+uu222/Tll19q3759ioiIUJs2bXTXXXfpu+++s7neT3/6U61fv76R/ksAgPsiAATcTMeOHbVy5UolJSUpJydHp0+f1iOPPKInn3zymvv7duzYoYiIiFr1//jHP/Ttt99q+/btSk1NVVJSkkaPHq22bdvq448/1rRp0zRt2jQVFhba9JszZ45efPFFffLJJ/Lw8NDEiRP17LPP6g9/+IN27Nihf/7zn/rNb35j0+f2229XYWGhvv7668b5jwEAboo9gICbmj59uj788EPddttt+vTTT7Vv3z75+PjU2fb7779X27ZttX37dpsl4ClTpmjbtm06evSoWrSo+ffkLbfcok6dOmn79u2SpKqqKgUEBOj111/XhAkTdOzYMYWFhen111/X1KlTJdVkFydOnKi///3vuvPOOyVJr7zyilavXq3/9//+n/V65eXlCggI0LZt2zR06NAm+e8CAO6ADCDgpl599VVdvHhRb775pv7yl79cNfiTpHPnzklSnW369OljDf4kKTAwUP369bP+btmypdq3b6+SkhKbfv3797fpI8mmX2BgYK0+vr6+kqSzZ8/anR8A4OoIAAE3dfToUX377beqrq62u6Tavn17WSwWnTx5stYxT09Pm98Wi6XOuurq6qv2s1gsddZd2eff//63pJplbABAwxEAAm6osrJSDz/8sMaPH6+XX35ZU6dO1b/+9a+rtvfy8lLv3r31+eef38BR1nbw4EF5enqqT58+Th0HALg6AkDADc2aNUtlZWVatGiRnn32WfXq1cu6H+9qRo0apZ07d96gEdZtx44d1ieHAQANRwAIuJlt27Zp4cKF+vOf/yx/f3+1aNFCf/7zn7Vz506lp6dftd/jjz+urVu3qqys7AaO1tb69ev1+OOPO+36AGAWPAUM4Lo9+OCDGjhwoBITE2/4td999139+te/1meffSYPD48bfn0AMBMygACu24IFC9SmTRunXPvMmTNatWoVwR8ANAIygAAAAG6GDCAAAICbIQAEAABwMwSAAAAAboYAEAAAwM0QAAIAALgZAkAAAAA3QwAIAADgZggAAQAA3AwBIAAAgJv5//9a/Ig22rAeAAAAAElFTkSuQmCC", + "text/html": [ "\n", - "mpl.find_output_cell = function (html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i = 0; i < ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code') {\n", - " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] === html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "};\n", + "
\n", + "
\n", + " Figure\n", + "
\n", + " \n", + "
\n", + " " + ], + "text/plain": [ + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "alpha = ScalarField(name='alpha', grid=problem.grid)\n", + "alpha.fill(1.) # [Np/m]\n", + "\n", + "problem.medium.add(alpha)\n", + "\n", + "# Plot the field\n", + "alpha.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "asian-leader", + "metadata": {}, + "source": [ + "And then running the PDE operator as before using the new field." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "exotic-healing", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(ShotID 0) Preparing to run state for shot\n", + "(ShotID 0) Estimated bandwidth for the propagated wavelet 0.260-0.730 MHz\n", + "(ShotID 0) Spatial grid spacing (0.400 mm | 5.137 PPW) is below dispersion limit (0.411 mm | 5.000 PPW)\n", + "(ShotID 0) Time grid spacing (0.050 μs | 18%) is below OT2 limit (0.120 μs)\n", + "(ShotID 0) Selected undersampling level 6\n", + "(ShotID 0) Selected time stepping scheme OT2\n", + "Operator `acoustic_iso_state` instance configuration:\n", + "\t * name=acoustic_iso_state\n", + "\t * subs={h_x: 0.0004, h_y: 0.0004, dt: 5e-08}\n", + "\t * opt=advanced-fsg\n", + "\t * devicecreate=(p(t, x, y),)\n", + "Operator `acoustic_iso_state` generated in 2.75 s\n", + " * lowering.Clusters: 1.26 s (46.0 %)\n", + " * specializing.Clusters: 0.79 s (28.9 %)\n", + " * lowering.Expressions: 0.96 s (35.1 %)\n", + "Flops reduction after symbolic optimization: [503 --> 91]\n", + "recompiling for non-existent cache dir (/tmp/devito-codepy-uid1000/fb896a9/577f1f9575fb092bfd481fcac94f127a).\n", + "gcc -march=native -O3 -g -fPIC -Wall -std=c99 -Wno-unused-result -Wno-unused-variable -Wno-unused-but-set-variable -ffast-math -shared -fopenmp /tmp/devito-jitcache-uid1000/fb896a97036744fe22df05400a59051eeeb3f431.c -lm -o /tmp/devito-jitcache-uid1000/fb896a97036744fe22df05400a59051eeeb3f431.so\n", + "Operator `acoustic_iso_state` jit-compiled `/tmp/devito-jitcache-uid1000/fb896a97036744fe22df05400a59051eeeb3f431.c` in 0.43 s with `GNUCompiler`\n", + "(ShotID 0) Using inhomogeneous density\n", + "(ShotID 0) Using attenuation with power 0\n", + "(ShotID 0) Running state equation for shot\n", + "AutoTuner: could not perform any runs\n", + "Operator `acoustic_iso_state` ran in 0.19 s\n", + "Global performance: [OI=1.78, 76.60 GFlops/s, 0.95 GPts/s]\n", + "Local performance:\n", + " * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + " * section1<<1999,309,309>,<1999,300,300>> ran in 0.18 s [OI=1.78, 81.68 GFlops/s, 1.02 GPts/s]\n", + " * section2<<1999,1,2,2>,<1999,1,2,2>> ran in 0.01 s [OI=5.80, 0.11 GFlops/s, 0.01 GPts/s]\n", + " * section3<<1999,120>,<1999,120,2,2>> ran in 0.01 s [OI=1.32, 2.31 GFlops/s, 0.00 GPts/s]\n", + "Performance[mode=advanced-fsg] arguments: {'nthreads': 6, 'nthreads_nonaffine': 6}\n", + "(ShotID 0) Completed state equation run for shot\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0a12400028bb422eac8949220d4c877b", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "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bhhXmoiI3AMLQCI3wMKMiIhuBgtAIjfC02lERHQjWAASEdEdx1VrorLFApCojHHVjqhssAglT8YCkKiM8M2H6NbxOCL6fVgAEv0XV+LcW1n1L8eV+2MfU0XEApDKXFlPnlxB+G1l3Ud3wq28xpLautO48oT+/z3KUx+zj+hmsQCkMnM7Jk9OgnSzbmUclqcC4HaoyK+voswFtxpnRe4jKlssAMktVIRJsCLESFTRVZTjrKLESe6LBSARERGRh2EBSERERORhWAASEREReRgWgER0W1WUi/HdHfuBiFyxACSi24IXuRMRlV8sAImoVCziPAv7m8hzsAAkciM8zUcVDccsUdlgAUjkBvSVm4q4gsMC4I9TEXNZEccskTtgAUhEZYJv/H8c5vK6ilgAE5UVFoBEREREHoYFIBEREZGHYQFIRG6Np0eJiIpjAUhERETkYVgAEhEREXkYFoBEREREHoYFIBEREZGHYQFIdIfxt8qIiKissQAkIiIi8jAsAInopnEV072xf4ncHwtAIrph/E09IiL3wAKQiIiIyMOwACSi38RTgp6N/U/kflgAEpFbKa+nqctrXL+mIsZMRDeGBSAReYSyWsXi6hkRlUcsAImI5NYKtZLacvWMiMozFoBEVKqKVsT8niLuVl7jH5EfrhASUVlgAUhEVASLMiJyd25bAF69elXGjx8vCQkJ4u3tLVWqVJFnn31WnE6negwAmThxokRFRYm3t7ekp6fLwYMHyzBqIipPiq7wVbQVUSKi0rhtAThjxgxZuHChvPTSS/LNN9/I888/Ly+88ILMnTtXPeb555+XWbNmyUsvvSQ7d+6UiIgIadu2reTl5ZVh5ERERES3l9sWgNu2bZP77rtPOnToIPHx8fLAAw9Iu3bt5KuvvhKR66t/c+bMkXHjxknXrl2ldu3asmTJErl06ZK8/fbbZRw9ERER0e3jtgVg8+bNZdOmTXLo0CEREdm7d698/vnn0r59exEROXr0qJw6dUratWun2tjtdklLS5Mvv/yyxH3m5+dLbm6u4UblC6/dIqKKhHMWlRVLWQdwu4wZM0bOnz8vNWrUELPZLNeuXZOpU6dKz549RUTk1KlTIiISHh5uaBceHi4//vhjifucPn26TJo06fYGTr8Lr836bXyjobLAcVcyzllU1tx2BXDFihXy5ptvyttvvy1ff/21LFmy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nJwc5OTk4PXXX0eVKlUgInjssccAANu3bzfkaunSpRARrFy5ElOmTIHdbkdERASWLVuGefPmwW63q7E1ZcoU+Pj4wNvbGwsWLMDMmTNhsVjg7++PZ555BsHBwahXrx7mzp2LOXPmwMfHR+XXdQ56+eWXERcXB03T0KVLF7Vt0aJFCAgIQOfOneHj44Px48erfkxISIDVasWcOXOwefNmdOzYESKC1157Dd26dUNYWBi8vb3x0ksvYejQobBarQgLC8NPP/2E8PBwREdH44033sA777yDypUrw2Qy4fjx4+jWrRuSkpKQnZ2N+fPnIzw8HJqmITMzEwDQvn17mM1mtGzZEg8++CDat28PEcGsWbMAQB2L9957L6xWK9q2bQsRQc2aNdW8+fHHH6NVq1Ywm80QEQwdOhTt2rWDzWZD7dq10a9fP1itViQmJkJEkJKSgkqVKuGuu+5Cs2bN0KpVKzVfd+nSBZGRkRARvP3222q+7tWrF0QEcXFxCA0Nxddff413330XI0eORGBgIEJDQyEi+Otf/4rJkyfDZDJh7ty56Ny5M+666y6ICEQEy5YtQ6tWrVC3bl089dRTSElJQUJCgmq7adMmJCYmolmzZujcuTO6d++u2jZr1ky9pyxduhSTJk3C2LFjISJ4/PHHceDAARw6dAjvvvsurly5gjZt2qBRo0bYvn07vv/+exXX119//bveW+l/WACWU3fffTceffRRw301atTA2LFjDff98ssvEBFkZ2er+/Ly8pCYmIisrCykpaWpAnDMmDFo3rx5qc/ZoUMHDBgwwHBf165dixWATqcTEREReO655wAAIoJ33nkHAQEBWLhwoaG93nbHjh0QEfz4448AgOPHj6Ny5coQEYSGhqoCEAC6d++O3r17l1h41qpVC88++6zhtScmJmL8+PHF4tK3+/r6FotL37Zw4cIS4/rss88gIhg+fHixuErKuWtcABAUFITY2FiMGzfOEBMAXLlyBZqmoU+fPiX2g7+/f4kxHThwAHFxcfDx8cGrr75qiMn1efVttWrVwrhx4wxjITQ01JCrSZMmqe0tWrSAzWZTuSo6jnr06GGI69tvv4XZbMaiRYtgt9sNBWDXrl3h5+dXbAxmZmbCy8vLkCsAaNCggSpmIiMjDbnSx1VmZibq1q1raOc6rjIzM5GUlGTIlT6uMjMzERgYaMiV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7Ha7JCYmymuvvaa2/+tf/5L27duLw+GQ8PBw6dOnj5w+ffpOv2wiohvGApCI3M7f/vY3adq0qQwePFhycnIkJydHYmJiRERk9OjRMn36dPnmm28kOTlZLly4IO3bt5eNGzfK7t27JSMjQzp16iTHjh1T++vbt68sX75c/v73v8s333wjCxcuFIfDISIiOTk5kpaWJvXq1ZOvvvpK1q1bJz///LN069atTF47EdGN0ACgrIMgIvqjpaenS7169WTOnDkiIrJlyxZp1aqVrF69Wu67775fbVurVi0ZOnSoDB8+XA4dOiTVq1eXrKwsadOmTbHHTpgwQbZv3y7r169X9x0/flxiYmLk22+/lWrVqv2hr4uI6I9gKesAiIjupIYNGxr+ffHiRZk0aZKsXbtWTp48KVevXpXLly+rFcA9e/aI2WyWtLS0Eve3a9cu2bx5s1oRdPX999+zACSicokFIBF5FF9fX8O/R40aJevXr5cXX3xRqlatKt7e3vLAAw9IQUGBiIh4e3v/6v6cTqd06tRJZsyYUWxbZGTkHxc4EdEfiAUgEbklm80m165d+83Hbd26Vfr37y/333+/iIhcuHBBfvjhB7W9Tp064nQ6JTs7u8RTwA0aNJD3339f4uPjxWLhlEpEFQO/BEJEbik+Pl62b98uP/zwg5w+fVqcTmeJj6tataqsXLlS9uzZI3v37pVevXoZHhsfHy/9+vWTAQMGyOrVq+Xo0aOyZcsWeeedd0RE5LHHHpMzZ85Iz549ZceOHXLkyBHZsGGDDBgw4IYKUCKissACkIjc0l/+8hcxm82SlJQkoaGhhm/1upo9e7YEBQVJamqqdOrUSTIyMqRBgwaGxyxYsEAeeOABGTZsmNSoUUMGDx4sFy9eFBGRqKgo+eKLL+TatWuSkZEhtWvXlhEjRkhAQICYTJxiiah84reAiYiIiDwMP54SEREReRgWgEREREQehgUgERERkYdhAUhERETkYVgAEhEREXkYFoBEREREHoYFIBEREZGHYQFIRERE5GFYABIRERF5GBaARERERB6GBSARERGRh2EBSERERORh/j9v/pRN3QPkDQAAAABJRU5ErkJggg==", + "text/html": [ "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel !== null) {\n", - " IPython.notebook.kernel.comm_manager.register_target(\n", - " 'matplotlib',\n", - " mpl.mpl_figure_comm\n", - " );\n", - "}\n" + "
\n", + "
\n", + " Figure\n", + "
\n", + " \n", + "
\n", + " " ], "text/plain": [ - "" + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, @@ -5133,11 +733,24 @@ }, { "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5e74d5c5e5054d47b820671e05cd37ee", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABBeUlEQVR4nO3de3RU5b3/8c+QkAQwGSGRXDRAUAqheIGgNFSKVg3iBa8VRYO2So2IQHKsENEfEY5EqVrqQqBa8HK8QC3Y0jaLJopy9BC5g6gRvARCIWPklokGct2/P7Jmm8nMhBkIyezM+7XWLGb2PHvy7K0wn3yfZz/bZhiGIQAAAISMLh3dAQAAALQvAiAAAECIIQACAACEGAIgAABAiCEAAgAAhBgCIAAAQIghAAIAAIQYAiAAAECIIQACAACEGAIgAABAiCEAAgAAhBgCIAAAQIghAAIAAIQYAiAAAECIIQACAACEGAIgAABAiCEAAgAAhBgCIAAAQIghAAIAAIQYAiAAAECIIQACAACEGAIgAABAiCEAAgAAhBgCIAAAQIghAAIAAIQYAiAAAECIIQACAACEGAIgAABAiCEAAgAAhBgCIAAAQIghAAIAAIQYAiAAAECIIQACAACEGAIgAABAiCEAAgAAhBgCIAAAQIghAAIIeXv27JHNZtMrr7wS8L4ffPCBbDabPvjgA3NbXl6ebDZb23VQ0j333KN+/fq16WcCCF0EQAAAgBBDAAQAAAgxBEAAQcE1bPrJJ5/oV7/6lex2u3r16qWcnBzV19dr165duvrqqxUdHa1+/fpp/vz5bvuXlZXprrvuUu/evRUZGanU1FQ9++yzamxsdGt34MAB3XbbbYqOjpbdbtf48ePlcDi89mnz5s0aN26cevXqpaioKA0dOlR/+ctfTvoYV6xYofT0dPXo0UNnnHGGxowZo23btnm0e+WVVzRw4EDzOF577bWT/pkA4A0BEEBQue2223ThhRdq5cqVmjRpkv7whz8oOztbN954o6699lq98847+uUvf6kZM2Zo1apVkqTvvvtOI0eOVGFhoebOnavVq1fryiuv1MMPP6wpU6aYn33s2DFdeeWVKiwsVH5+vt5++20lJCRo/PjxHv14//339fOf/1xHjx7VkiVL9Pe//10XXXSRxo8ff1JzBefNm6c77rhDgwcP1l/+8hf9z//8j6qqqjRq1Ch9/vnnZrtXXnlFv/71r5WamqqVK1fqscce09y5c7V27drATyYA+GIAQBCYPXu2Icl49tln3bZfdNFFhiRj1apV5ra6ujrjrLPOMm6++WbDMAxj5syZhiRjw4YNbvs+8MADhs1mM3bt2mUYhmEsXrzYkGT8/e9/d2s3adIkQ5Lx8ssvm9sGDRpkDB061Kirq3Nre9111xmJiYlGQ0ODYRiG8f777xuSjPfff9/jWFzKysqM8PBw46GHHnL7rKqqKiMhIcG47bbbDMMwjIaGBiMpKckYNmyY0djYaLbbs2eP0bVrV6Nv374+zx8ABIIKIICgct1117m9Tk1Nlc1m09ixY81t4eHhOu+887R3715J0tq1azV48GBdcsklbvvec889MgzDrJ69//77io6O1rhx49zaTZgwwe31V199pS+++EJ33nmnJKm+vt58XHPNNSovL9euXbv8PqZ///vfqq+v18SJE90+KyoqSqNHjzavIN61a5cOHDigCRMmuF1F3LdvX40cOdLvnwcAJxLe0R0AgOZ69erl9joiIkLdu3dXVFSUx3an0ylJOnTokNclUpKSksz3XX/Gx8d7tEtISHB7/e2330qSHn74YT388MNe+3nw4EE/jsb98y6++GKv73fp0sWtny3749q2Z88ev38mALSGAAjA8mJjY1VeXu6x/cCBA5KkuLg4s93GjRs92rW8CMTVPjc3VzfffLPXnzlw4EC/++f6vL/+9a/q27evz3axsbFe++NrGwCcLAIgAMu74oorlJ+fr61bt2rYsGHm9tdee002m02XX365JOnyyy/XX/7yF61evdptGPjNN990+7yBAwdqwIAB2rFjh+bNm3fK/RszZozCw8P19ddf65ZbbvHZbuDAgUpMTNRbb72lnJwccxh47969Wr9+vVnRBIBTRQAEYHnZ2dl67bXXdO2112rOnDnq27ev/vWvf2nRokV64IEH9JOf/ESSNHHiRP3hD3/QxIkT9eSTT2rAgAEqKCjQv//9b4/P/NOf/qSxY8dqzJgxuueee3T22Wfr8OHDKikp0datW/X222/73b9+/fppzpw5mjVrlr755htdffXV6tmzp7799ltt3LhRPXr00BNPPKEuXbpo7ty5uu+++3TTTTdp0qRJOnr0qPLy8rwOCwPAySIAArC8s846S+vXr1dubq5yc3PldDrV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Kj8VQADwzRLrAAYr1hECgkN1dbV69OghSbrwwgu1Y8cOrVq1SjfddFMH9wxAMOL72yJDwADQGm8VQIaAAcA3AiAAy2se9hgCBoATIwACsDzmAAJAYAiAACzPWwWQIWAA8I0ACMDymlf7wsPDPbYBANwRAAFYnqvaFxYWZt7dhwogAPhGAARgea5qX5cuXdSlSxe3bQAATwRAAJbnrQJIAAQA3wiAACyveQWQIWAAODECIADLa14BZAgYAE6MAAjA8rxVAAmAAOAbARCA5XEVMAAEhgAIwPK4ChgAAkMABGB5XAUMAIEhAAKwPG8VQIaAAcA3AiAAy6MCCACBIQACsDzWAQSAwBAAAVge6wACQGAIgAAsj3UAASAwBEAAlsc6gAAQGAIgAMtjHUAACAwBEIDlcRUwAASGAAjA8rgKGAACQwAEYHlcBQwAgSEAArA8rgIGgMAQAAFYnrcKIEPAAOAbARCA5VEBBIDAEAABWB7rAAJAYAiAACyPdQABIDAEQACWxzqAABAYAiAAy2MdQAAIDAEQgOWxDiAABIYACMDyuAoYAAJDAARgeVwFDACBIQACsDyuAgaAwBAAAVgeFUAACAwBEIDlUQEEgMAQAAFYHusAAkBgCIAALI91AAEgMJYJgIsWLVJKSoqioqKUlpamDz/8sNX269atU1pamqKiotS/f38tWbLEZ9vly5fLZrPpxhtvbONeA2gPrAMIAIGxRABcsWKFpk+frlmzZmnbtm0aNWqUxo4dq7KyMq/tS0tLdc0112jUqFHatm2bHn30UU2dOlUrV670aLt37149/PDDGjVq1Ok+DACnCesAAkBgLBEAn3vuOd1777267777lJqaqgULFig5OVmLFy/22n7JkiXq06ePFixYoNTUVN133336zW9+o2eeecatXUNDg+6880498cQT6t+/f3scCoDTgKuAASAwQR8Aa2trtWXLFmVkZLhtz8jI0Pr1673uU1xc7NF+zJgx2rx5s+rq6sxtc+bM0VlnnaV777237TsOoN1wFTAABCa8oztwIgcPHlRDQ4Pi4+PdtsfHx8vhcHjdx+FweG1fX1+vgwcPKjExUf/3f/+npUuXavv27X73paamRjU1NeZrp9Pp/4EAOG24ChgAAhP0FUAXm83m9towDI9tJ2rv2l5VVaW77rpLL730kuLi4vzuQ35+vux2u/lI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zN19992S1KZzACVp5MiRevbZZ/Xuu+9KkrZv366XX35Z7733nj7//HNCfYC6dOminj17eg2INpvNbYjw6NGjZuirqqpqtz4ahmFWCn05cuSIDhw4oE2bNnl9Pzo62i0QxsbGKiIiQuHh4aqqqtLRo0dVUVFhhr3md67xR9euXdW1a1e3qqWvh6RTbtP8/bCwMLeKXPNH818GWr6Ojo5WWFiY2y8Qx48fNwN78wDfvMLYvMrY8vn333+vmpoanXHGGQGdP/gn6AOgS8vftgzDaPU3MG/tW24P9DNzc3OVk5NjvnY6nUpOTj5x5wP04IMP6o477vD5fiDH3RbvdcTPtMp7wdafznD8hmHoq6++0oIFC7R161bl5OTopz/9qSSZQ8DV1dXm31d/K4DHjx+X5B4Ar7zySkVERGj37t06//zz9emnn7r15ayzzlJiYqI5/NyjRw91795dUVFR6tatm7p166aoqChFRkYqIiJCYWFhPr+0XcccyJdzoPu05WfZbDbV1tbK6XTq6NGjqqys1NGjR3XkyBEdPnzYrFy5nh87dkyNjY06dOjQSV1UExUVpcTERCUkJHg8zjrrLHMY0TWU6ApIYWFh5sP12vXf/mQfVVVV2r9/v/7zn/9o3759KisrU2lpqfbs2WMG1p07d2rnzp1+H19iYqLOPfdc83HeeecpKSlJsbGx6tWrl84880xz6kNnER0drbPOOqujuwEfgj4AxsXFKSwszKMyV1FR4VHBc0lISPDaPjw8XLGxsa228fWZUtMXR/Mvj9MlLi5OcXFxp/3nAMFq6NChevXVVz22N//7V1dXp4iIiIBvBdf8M2JiYjR58mQtWLBAn376qbp06aLbbrtNt956qy699NJW/z2Au+PHj5uB0FtINAxDPXr0MB8xMTFKSEhQfHy8EhISFB0dHVTz84YPH+51+7Fjx7R3717t2bNHe/bsUWlpqSorK835e2eccYZ69uyp2NhYM+w1v4sNECyCPgBGREQoLS1NRUVFuummm8ztRUVFuuGGG7zuk56ern/84x9u2woLCzV8+HB17drVbFNUVOQ2D7CwsFAjR448DUcBoC00D281NTWKiIg4pSFgqWnObd++feVwOHTvvfdqwIABp63/nZmrgue6srqz6tatmwYNGqRBgwZ1dFeAUxL0AVCScnJylJmZqeHDhys9PV0vvvii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X31ltuE8t43//u//NmJjY41//vOfRmlpqfH2228bZ5xxhrFgwQKzDec6cAUFBcasWbOMlStXGpKMd955x+19f85pVlaWcfbZZxtFRUXG1q1bjcsvv9y48MILjfr6+nY+GusiAAaZSy65xMjKynLbNmjQIGPmzJkd1KPOp6KiwpBkrFu3zjAMw2hsbDQSEhKMp556ymxz/Phxw263G0uWLOmoblpWVVWVMWDAAKOoqMgYPXq0GQA5z21jxowZxqWXXurzfc5z27n22muN3/zmN27bbr75ZuOuu+4yDINz3RZaBkB/zunRo0eNrl27GsuXLzfb7N+/3+jSpYuxZs2aduu71TEEHERqa2u1ZcsW87Z3LhkZGVq/fn0H9arzcd02sFevXpKk0tJSORwOt/MeGRmp0aNHc95PwoMPPqhrr71WV155pdt2znPbWL16tYYPH65f/epX6t27t4YOHaqXXnrJfJ/z3HYuvfRSvffee9q9e7ckaceOHfroo490zTXXSOJcnw7+nNMtW7aorq7OrU1SUpKGDBnCeQ9A0N8LOJQcPHhQDQ0Nio+Pd9seHx8vh8PRQb3qXAzDUE5Oji699FINGTJEksxz6+287927t937aGXLly/X1q1btWnTJo/3OM9t45tvvtHixYuVk5OjRx99VBs3btTUqVMVGRmpiRMncp7b0IwZM1RZWalBgwYpLCxMDQ0NevLJJ3XHHXdI4v/p08Gfc+pwOBQREaGePXt6tOG70n8EwCBks9ncXhuG4bENJ2fKlCn65JNP9NFHH3m8x3k/Nfv27dO0adNUWFioqKgon+04z6emsbFRw4cP17x58yRJQ4cO1WeffabFixdr4sSJZjvO86lbsWKFXn/9db355pv66U9/qu3bt2v69OlKSkrS3XffbbbjXLe9kzmnnPfAMAQcROLi4hQWFubxG0xFRYXHb0MI3EMPPaTVq1fr/fff1znnnGNuT0hIkCTO+ynasmWLKioqlJaWpvDwcIWHh2vdunV6/vnnFR4ebp5LzvOpSUxM1ODBg922paamqqysTBL/P7el3/3ud5o5c6Zuv/12nX/++crMzFR2drby8/Mlca5PB3/OaUJCgmpra3XkyBGfbXBiBMAgEhERobS0NBUVFbltLyoq0siRIzuoV9ZnGIamTJmiVatWae3atUpJSXF7PyUlRQkJCW7nvba2VuvWreO8B+CKK67Qzp07tX37dvMxfPhw3Xnnndq+fbv69+/PeW4DP//5zz2WMdq9e7f69u0rif+f21J1dbW6dHH/mgwLCzOXgeFctz1/zmlaWpq6du3q1qa8vFyffvop5z0QHXb5CbxyLQOzdOlS4/PPPzemT59u9OjRw9izZ09Hd82yHnjgAcNutxsffPCBUV5ebj6qq6vNNk899ZRht9uNVatWGTt37jTuuOMOlnJoA82vAjYMznNb2LhxoxEeHm48+eSTxpdffmm88cYbRvfu3Y3XX3/dbMN5bht33323cfbZZ5vLwKxatcqIi4szHnnkEbMN5zpwVVVVxrZt24xt27YZkoznnnvO2LZtm7ncmT/nNCsryzjnnHOMd99919i6davxy1/+kmVgAkQADEIvvPCC0bdvXyMiIsIYNmyYuVwJTo4kr4+XX37ZbNPY2GjMnj3bSEhIMCIjI41f/OIXxs6dOzuu051EywDIeW4b//jHP4whQ4YYkZGRxqBBg4wXX3zR7X3Oc9twOp3GtGnTjD59+hhRUVFG//79jVmzZhk1NTVmG8514N5//32v/ybffffdhmH4d06PHTtmTJkyxejVq5fRrVs347rrrjPKyso64Gisy2YYhtExtUcAAAB0BOYAAgAAhBgCIAAAQIghAAIAAIQYAiAAAECIIQACAACEGAIgAABAiCEAAgAAhBgCIAAAQIghAAIAAIQYAiAAAECIIQACAACEGAIgAABAiCEAAgAAhBgCIAAAQIghAAIAAIQYAiAAAECIIQACAACEGAIgAABAiCEAAgAAhBgCIAAAQIghAAIAAIQYAiAAAECIIQACAACEGAIgAABAiCEAAgAAhBgCIAAAQIghAAIAAIQYAiAAAECIIQACAACEGAIgAABAiCEAAgAAhJj/D3q3YJDyZ722AAAAAElFTkSuQmCC", "text/html": [ - "" + "\n", + "
\n", + "
\n", + " Figure\n", + "
\n", + " \n", + "
\n", + " " ], "text/plain": [ - "" + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, @@ -5146,25 +759,20 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 6, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "from stride import IsoAcousticDevito\n", - "\n", - "# Instantiate the PDE operator,\n", - "pde = IsoAcousticDevito(space=space, time=time)\n", - "\n", - "# create a sub-problem for the shot,\n", - "sub_problem = problem.sub_problem(shot.id)\n", + "# Clear the previously compiled operator\n", + "pde.clear_operators()\n", "\n", "# and run it forward\n", - "traces = await pde(shot.wavelets, vp, problem=sub_problem)\n", + "traces = await pde(shot.wavelets, vp, rho, alpha, problem=sub_problem)\n", "\n", "# Plot the resulting traces\n", "_ = traces.plot()\n", @@ -5173,1032 +781,24 @@ }, { "cell_type": "markdown", - "id": "alone-steal", + "id": "municipal-failure", "metadata": {}, "source": [ - "## Variable density and no attenuation\n", + "Attenuation in the viscoacoustic wave equation follows a power law, that is $\\alpha \\propto \\alpha_0 \\omega^y$ for some absorption coefficient $\\alpha_0$ and the temporal frequency $\\omega$. In Stride, the power $y$ is by default 0, but a value of 2 can also be chosen by calling the pde operator with the argument `pde(..., attenuation_power=2)`.\n", "\n", - "Let's now introduce variable density into our previous example.\n", + "## Absorbing boundaries\n", "\n", - "To do this, we only need to create another scalar field that contains our density information:" + "By default, absorbing boundaries in Stride's acoustic solver are considered sponge absorbing boundaries. These boundaries are computationally very efficient, but have lower absorption efficiency than other alternatives, requiring larger absorbing regions. \n", + "\n", + "Using a perfectly matched layer (PML), it is possible to obtain higher absorption efficiency while using smaller absorbing regions. However, this comes at an increased computational cost.\n", + "\n", + "To run the same PDE with a PML, we can pass the `boundary_type` argument to the solver:" ] }, { "cell_type": "code", - "execution_count": 7, - "id": "killing-chest", - "metadata": {}, - "outputs": [ - { - "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "/* global mpl */\n", - "window.mpl = {};\n", - "\n", - "mpl.get_websocket_type = function () {\n", - " if (typeof WebSocket !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof MozWebSocket !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert(\n", - " 'Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.'\n", - " );\n", - " }\n", - "};\n", - "\n", - "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = this.ws.binaryType !== undefined;\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById('mpl-warnings');\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent =\n", - " 'This browser does not support binary websocket messages. ' +\n", - " 'Performance may be slow.';\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = document.createElement('div');\n", - " this.root.setAttribute('style', 'display: inline-block');\n", - " this._root_extra_style(this.root);\n", - "\n", - " parent_element.appendChild(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message('supports_binary', { value: fig.supports_binary });\n", - " fig.send_message('send_image_mode', {});\n", - " if (fig.ratio !== 1) {\n", - " fig.send_message('set_device_pixel_ratio', {\n", - " device_pixel_ratio: fig.ratio,\n", - " });\n", - " }\n", - " fig.send_message('refresh', {});\n", - " };\n", - "\n", - " this.imageObj.onload = function () {\n", - " if (fig.image_mode === 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function () {\n", - " fig.ws.close();\n", - " };\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "};\n", - "\n", - "mpl.figure.prototype._init_header = function () {\n", - " var titlebar = document.createElement('div');\n", - " titlebar.classList =\n", - " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", - " var titletext = document.createElement('div');\n", - " titletext.classList = 'ui-dialog-title';\n", - " titletext.setAttribute(\n", - " 'style',\n", - " 'width: 100%; text-align: center; padding: 3px;'\n", - " );\n", - " titlebar.appendChild(titletext);\n", - " this.root.appendChild(titlebar);\n", - " this.header = titletext;\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._init_canvas = function () {\n", - " var fig = this;\n", - "\n", - " var canvas_div = (this.canvas_div = document.createElement('div'));\n", - " canvas_div.setAttribute(\n", - " 'style',\n", - " 'border: 1px solid #ddd;' +\n", - " 'box-sizing: content-box;' +\n", - " 'clear: both;' +\n", - " 'min-height: 1px;' +\n", - " 'min-width: 1px;' +\n", - " 'outline: 0;' +\n", - " 'overflow: hidden;' +\n", - " 'position: relative;' +\n", - " 'resize: both;'\n", - " );\n", - "\n", - " function on_keyboard_event_closure(name) {\n", - " return function (event) {\n", - " return fig.key_event(event, name);\n", - " };\n", - " }\n", - "\n", - " canvas_div.addEventListener(\n", - " 'keydown',\n", - " on_keyboard_event_closure('key_press')\n", - " );\n", - " canvas_div.addEventListener(\n", - " 'keyup',\n", - " on_keyboard_event_closure('key_release')\n", - " );\n", - "\n", - " this._canvas_extra_style(canvas_div);\n", - " this.root.appendChild(canvas_div);\n", - "\n", - " var canvas = (this.canvas = document.createElement('canvas'));\n", - " canvas.classList.add('mpl-canvas');\n", - " canvas.setAttribute('style', 'box-sizing: content-box;');\n", - "\n", - " this.context = canvas.getContext('2d');\n", - "\n", - " var backingStore =\n", - " this.context.backingStorePixelRatio ||\n", - " this.context.webkitBackingStorePixelRatio ||\n", - " this.context.mozBackingStorePixelRatio ||\n", - " this.context.msBackingStorePixelRatio ||\n", - " this.context.oBackingStorePixelRatio ||\n", - " this.context.backingStorePixelRatio ||\n", - " 1;\n", - "\n", - " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", - " 'canvas'\n", - " ));\n", - " rubberband_canvas.setAttribute(\n", - " 'style',\n", - " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", - " );\n", - "\n", - " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", - " if (this.ResizeObserver === undefined) {\n", - " if (window.ResizeObserver !== undefined) {\n", - " this.ResizeObserver = window.ResizeObserver;\n", - " } else {\n", - " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", - " this.ResizeObserver = obs.ResizeObserver;\n", - " }\n", - " }\n", - "\n", - " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", - " var nentries = entries.length;\n", - " for (var i = 0; i < nentries; i++) {\n", - " var entry = entries[i];\n", - " var width, height;\n", - " if (entry.contentBoxSize) {\n", - " if (entry.contentBoxSize instanceof Array) {\n", - " // Chrome 84 implements new version of spec.\n", - " width = entry.contentBoxSize[0].inlineSize;\n", - " height = entry.contentBoxSize[0].blockSize;\n", - " } else {\n", - " // Firefox implements old version of spec.\n", - " width = entry.contentBoxSize.inlineSize;\n", - " height = entry.contentBoxSize.blockSize;\n", - " }\n", - " } else {\n", - " // Chrome <84 implements even older version of spec.\n", - " width = entry.contentRect.width;\n", - " height = entry.contentRect.height;\n", - " }\n", - "\n", - " // Keep the size of the canvas and rubber band canvas in sync with\n", - " // the canvas container.\n", - " if (entry.devicePixelContentBoxSize) {\n", - " // Chrome 84 implements new version of spec.\n", - " canvas.setAttribute(\n", - " 'width',\n", - " entry.devicePixelContentBoxSize[0].inlineSize\n", - " );\n", - " canvas.setAttribute(\n", - " 'height',\n", - " entry.devicePixelContentBoxSize[0].blockSize\n", - " );\n", - " } else {\n", - " canvas.setAttribute('width', width * fig.ratio);\n", - " canvas.setAttribute('height', height * fig.ratio);\n", - " }\n", - " canvas.setAttribute(\n", - " 'style',\n", - " 'width: ' + width + 'px; height: ' + height + 'px;'\n", - " );\n", - "\n", - " rubberband_canvas.setAttribute('width', width);\n", - " rubberband_canvas.setAttribute('height', height);\n", - "\n", - " // And update the size in Python. We ignore the initial 0/0 size\n", - " // that occurs as the element is placed into the DOM, which should\n", - " // otherwise not happen due to the minimum size styling.\n", - " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", - " fig.request_resize(width, height);\n", - " }\n", - " }\n", - " });\n", - " this.resizeObserverInstance.observe(canvas_div);\n", - "\n", - " function on_mouse_event_closure(name) {\n", - " return function (event) {\n", - " return fig.mouse_event(event, name);\n", - " };\n", - " }\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mousedown',\n", - " on_mouse_event_closure('button_press')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseup',\n", - " on_mouse_event_closure('button_release')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'dblclick',\n", - " on_mouse_event_closure('dblclick')\n", - " );\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband_canvas.addEventListener(\n", - " 'mousemove',\n", - " on_mouse_event_closure('motion_notify')\n", - " );\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseenter',\n", - " on_mouse_event_closure('figure_enter')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseleave',\n", - " on_mouse_event_closure('figure_leave')\n", - " );\n", - "\n", - " canvas_div.addEventListener('wheel', function (event) {\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " on_mouse_event_closure('scroll')(event);\n", - " });\n", - "\n", - " canvas_div.appendChild(canvas);\n", - " canvas_div.appendChild(rubberband_canvas);\n", - "\n", - " this.rubberband_context = rubberband_canvas.getContext('2d');\n", - " this.rubberband_context.strokeStyle = '#000000';\n", - "\n", - " this._resize_canvas = function (width, height, forward) {\n", - " if (forward) {\n", - " canvas_div.style.width = width + 'px';\n", - " canvas_div.style.height = height + 'px';\n", - " }\n", - " };\n", - "\n", - " // Disable right mouse context menu.\n", - " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n", - " event.preventDefault();\n", - " return false;\n", - " });\n", - "\n", - " function set_focus() {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'mpl-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " continue;\n", - " }\n", - "\n", - " var button = (fig.buttons[name] = document.createElement('button'));\n", - " button.classList = 'mpl-widget';\n", - " button.setAttribute('role', 'button');\n", - " button.setAttribute('aria-disabled', 'false');\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - "\n", - " var icon_img = document.createElement('img');\n", - " icon_img.src = '_images/' + image + '.png';\n", - " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", - " icon_img.alt = tooltip;\n", - " button.appendChild(icon_img);\n", - "\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " var fmt_picker = document.createElement('select');\n", - " fmt_picker.classList = 'mpl-widget';\n", - " toolbar.appendChild(fmt_picker);\n", - " this.format_dropdown = fmt_picker;\n", - "\n", - " for (var ind in mpl.extensions) {\n", - " var fmt = mpl.extensions[ind];\n", - " var option = document.createElement('option');\n", - " option.selected = fmt === mpl.default_extension;\n", - " option.innerHTML = fmt;\n", - " fmt_picker.appendChild(option);\n", - " }\n", - "\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "};\n", - "\n", - "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n", - " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", - " // which will in turn request a refresh of the image.\n", - " this.send_message('resize', { width: x_pixels, height: y_pixels });\n", - "};\n", - "\n", - "mpl.figure.prototype.send_message = function (type, properties) {\n", - " properties['type'] = type;\n", - " properties['figure_id'] = this.id;\n", - " this.ws.send(JSON.stringify(properties));\n", - "};\n", - "\n", - "mpl.figure.prototype.send_draw_message = function () {\n", - " if (!this.waiting) {\n", - " this.waiting = true;\n", - " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " var format_dropdown = fig.format_dropdown;\n", - " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", - " fig.ondownload(fig, format);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_resize = function (fig, msg) {\n", - " var size = msg['size'];\n", - " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n", - " fig._resize_canvas(size[0], size[1], msg['forward']);\n", - " fig.send_message('refresh', {});\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", - " var x0 = msg['x0'] / fig.ratio;\n", - " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", - " var x1 = msg['x1'] / fig.ratio;\n", - " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n", - " x0 = Math.floor(x0) + 0.5;\n", - " y0 = Math.floor(y0) + 0.5;\n", - " x1 = Math.floor(x1) + 0.5;\n", - " y1 = Math.floor(y1) + 0.5;\n", - " var min_x = Math.min(x0, x1);\n", - " var min_y = Math.min(y0, y1);\n", - " var width = Math.abs(x1 - x0);\n", - " var height = Math.abs(y1 - y0);\n", - "\n", - " fig.rubberband_context.clearRect(\n", - " 0,\n", - " 0,\n", - " fig.canvas.width / fig.ratio,\n", - " fig.canvas.height / fig.ratio\n", - " );\n", - "\n", - " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n", - " // Updates the figure title.\n", - " fig.header.textContent = msg['label'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n", - " fig.rubberband_canvas.style.cursor = msg['cursor'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_message = function (fig, msg) {\n", - " fig.message.textContent = msg['message'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n", - " // Request the server to send over a new figure.\n", - " fig.send_draw_message();\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n", - " fig.image_mode = msg['mode'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n", - " for (var key in msg) {\n", - " if (!(key in fig.buttons)) {\n", - " continue;\n", - " }\n", - " fig.buttons[key].disabled = !msg[key];\n", - " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", - " if (msg['mode'] === 'PAN') {\n", - " fig.buttons['Pan'].classList.add('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " } else if (msg['mode'] === 'ZOOM') {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.add('active');\n", - " } else {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Called whenever the canvas gets updated.\n", - " this.send_message('ack', {});\n", - "};\n", - "\n", - "// A function to construct a web socket function for onmessage handling.\n", - "// Called in the figure constructor.\n", - "mpl.figure.prototype._make_on_message_function = function (fig) {\n", - " return function socket_on_message(evt) {\n", - " if (evt.data instanceof Blob) {\n", - " var img = evt.data;\n", - " if (img.type !== 'image/png') {\n", - " /* FIXME: We get \"Resource interpreted as Image but\n", - " * transferred with MIME type text/plain:\" errors on\n", - " * Chrome. But how to set the MIME type? It doesn't seem\n", - " * to be part of the websocket stream */\n", - " img.type = 'image/png';\n", - " }\n", - "\n", - " /* Free the memory for the previous frames */\n", - " if (fig.imageObj.src) {\n", - " (window.URL || window.webkitURL).revokeObjectURL(\n", - " fig.imageObj.src\n", - " );\n", - " }\n", - "\n", - " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", - " img\n", - " );\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " } else if (\n", - " typeof evt.data === 'string' &&\n", - " evt.data.slice(0, 21) === 'data:image/png;base64'\n", - " ) {\n", - " fig.imageObj.src = evt.data;\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - "\n", - " var msg = JSON.parse(evt.data);\n", - " var msg_type = msg['type'];\n", - "\n", - " // Call the \"handle_{type}\" callback, which takes\n", - " // the figure and JSON message as its only arguments.\n", - " try {\n", - " var callback = fig['handle_' + msg_type];\n", - " } catch (e) {\n", - " console.log(\n", - " \"No handler for the '\" + msg_type + \"' message type: \",\n", - " msg\n", - " );\n", - " return;\n", - " }\n", - "\n", - " if (callback) {\n", - " try {\n", - " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", - " callback(fig, msg);\n", - " } catch (e) {\n", - " console.log(\n", - " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", - " e,\n", - " e.stack,\n", - " msg\n", - " );\n", - " }\n", - " }\n", - " };\n", - "};\n", - "\n", - "// from https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", - "mpl.findpos = function (e) {\n", - " //this section is from http://www.quirksmode.org/js/events_properties.html\n", - " var targ;\n", - " if (!e) {\n", - " e = window.event;\n", - " }\n", - " if (e.target) {\n", - " targ = e.target;\n", - " } else if (e.srcElement) {\n", - " targ = e.srcElement;\n", - " }\n", - " if (targ.nodeType === 3) {\n", - " // defeat Safari bug\n", - " targ = targ.parentNode;\n", - " }\n", - "\n", - " // pageX,Y are the mouse positions relative to the document\n", - " var boundingRect = targ.getBoundingClientRect();\n", - " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", - " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n", - "\n", - " return { x: x, y: y };\n", - "};\n", - "\n", - "/*\n", - " * return a copy of an object with only non-object keys\n", - " * we need this to avoid circular references\n", - " * https://stackoverflow.com/a/24161582/3208463\n", - " */\n", - "function simpleKeys(original) {\n", - " return Object.keys(original).reduce(function (obj, key) {\n", - " if (typeof original[key] !== 'object') {\n", - " obj[key] = original[key];\n", - " }\n", - " return obj;\n", - " }, {});\n", - "}\n", - "\n", - "mpl.figure.prototype.mouse_event = function (event, name) {\n", - " var canvas_pos = mpl.findpos(event);\n", - "\n", - " if (name === 'button_press') {\n", - " this.canvas.focus();\n", - " this.canvas_div.focus();\n", - " }\n", - "\n", - " var x = canvas_pos.x * this.ratio;\n", - " var y = canvas_pos.y * this.ratio;\n", - "\n", - " this.send_message(name, {\n", - " x: x,\n", - " y: y,\n", - " button: event.button,\n", - " step: event.step,\n", - " guiEvent: simpleKeys(event),\n", - " });\n", - "\n", - " /* This prevents the web browser from automatically changing to\n", - " * the text insertion cursor when the button is pressed. We want\n", - " * to control all of the cursor setting manually through the\n", - " * 'cursor' event from matplotlib */\n", - " event.preventDefault();\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n", - " // Handle any extra behaviour associated with a key event\n", - "};\n", - "\n", - "mpl.figure.prototype.key_event = function (event, name) {\n", - " // Prevent repeat events\n", - " if (name === 'key_press') {\n", - " if (event.key === this._key) {\n", - " return;\n", - " } else {\n", - " this._key = event.key;\n", - " }\n", - " }\n", - " if (name === 'key_release') {\n", - " this._key = null;\n", - " }\n", - "\n", - " var value = '';\n", - " if (event.ctrlKey && event.key !== 'Control') {\n", - " value += 'ctrl+';\n", - " }\n", - " else if (event.altKey && event.key !== 'Alt') {\n", - " value += 'alt+';\n", - " }\n", - " else if (event.shiftKey && event.key !== 'Shift') {\n", - " value += 'shift+';\n", - " }\n", - "\n", - " value += 'k' + event.key;\n", - "\n", - " this._key_event_extra(event, name);\n", - "\n", - " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n", - " if (name === 'download') {\n", - " this.handle_save(this, null);\n", - " } else {\n", - " this.send_message('toolbar_button', { name: name });\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n", - " this.message.textContent = tooltip;\n", - "};\n", - "\n", - "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", - "// prettier-ignore\n", - "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n", - "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", - "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", - "\n", - "mpl.default_extension = \"png\";/* global mpl */\n", - "\n", - "var comm_websocket_adapter = function (comm) {\n", - " // Create a \"websocket\"-like object which calls the given IPython comm\n", - " // object with the appropriate methods. Currently this is a non binary\n", - " // socket, so there is still some room for performance tuning.\n", - " var ws = {};\n", - "\n", - " ws.binaryType = comm.kernel.ws.binaryType;\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " function updateReadyState(_event) {\n", - " if (comm.kernel.ws) {\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " } else {\n", - " ws.readyState = 3; // Closed state.\n", - " }\n", - " }\n", - " comm.kernel.ws.addEventListener('open', updateReadyState);\n", - " comm.kernel.ws.addEventListener('close', updateReadyState);\n", - " comm.kernel.ws.addEventListener('error', updateReadyState);\n", - "\n", - " ws.close = function () {\n", - " comm.close();\n", - " };\n", - " ws.send = function (m) {\n", - " //console.log('sending', m);\n", - " comm.send(m);\n", - " };\n", - " // Register the callback with on_msg.\n", - " comm.on_msg(function (msg) {\n", - " //console.log('receiving', msg['content']['data'], msg);\n", - " var data = msg['content']['data'];\n", - " if (data['blob'] !== undefined) {\n", - " data = {\n", - " data: new Blob(msg['buffers'], { type: data['blob'] }),\n", - " };\n", - " }\n", - " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", - " ws.onmessage(data);\n", - " });\n", - " return ws;\n", - "};\n", - "\n", - "mpl.mpl_figure_comm = function (comm, msg) {\n", - " // This is the function which gets called when the mpl process\n", - " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", - "\n", - " var id = msg.content.data.id;\n", - " // Get hold of the div created by the display call when the Comm\n", - " // socket was opened in Python.\n", - " var element = document.getElementById(id);\n", - " var ws_proxy = comm_websocket_adapter(comm);\n", - "\n", - " function ondownload(figure, _format) {\n", - " window.open(figure.canvas.toDataURL());\n", - " }\n", - "\n", - " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n", - "\n", - " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", - " // web socket which is closed, not our websocket->open comm proxy.\n", - " ws_proxy.onopen();\n", - "\n", - " fig.parent_element = element;\n", - " fig.cell_info = mpl.find_output_cell(\"
\");\n", - " if (!fig.cell_info) {\n", - " console.error('Failed to find cell for figure', id, fig);\n", - " return;\n", - " }\n", - " fig.cell_info[0].output_area.element.on(\n", - " 'cleared',\n", - " { fig: fig },\n", - " fig._remove_fig_handler\n", - " );\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_close = function (fig, msg) {\n", - " var width = fig.canvas.width / fig.ratio;\n", - " fig.cell_info[0].output_area.element.off(\n", - " 'cleared',\n", - " fig._remove_fig_handler\n", - " );\n", - " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n", - "\n", - " // Update the output cell to use the data from the current canvas.\n", - " fig.push_to_output();\n", - " var dataURL = fig.canvas.toDataURL();\n", - " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", - " // the notebook keyboard shortcuts fail.\n", - " IPython.keyboard_manager.enable();\n", - " fig.parent_element.innerHTML =\n", - " '';\n", - " fig.close_ws(fig, msg);\n", - "};\n", - "\n", - "mpl.figure.prototype.close_ws = function (fig, msg) {\n", - " fig.send_message('closing', msg);\n", - " // fig.ws.close()\n", - "};\n", - "\n", - "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n", - " // Turn the data on the canvas into data in the output cell.\n", - " var width = this.canvas.width / this.ratio;\n", - " var dataURL = this.canvas.toDataURL();\n", - " this.cell_info[1]['text/html'] =\n", - " '';\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Tell IPython that the notebook contents must change.\n", - " IPython.notebook.set_dirty(true);\n", - " this.send_message('ack', {});\n", - " var fig = this;\n", - " // Wait a second, then push the new image to the DOM so\n", - " // that it is saved nicely (might be nice to debounce this).\n", - " setTimeout(function () {\n", - " fig.push_to_output();\n", - " }, 1000);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'btn-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " var button;\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " continue;\n", - " }\n", - "\n", - " button = fig.buttons[name] = document.createElement('button');\n", - " button.classList = 'btn btn-default';\n", - " button.href = '#';\n", - " button.title = name;\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message pull-right';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = document.createElement('div');\n", - " buttongrp.classList = 'btn-group inline pull-right';\n", - " button = document.createElement('button');\n", - " button.classList = 'btn btn-mini btn-primary';\n", - " button.href = '#';\n", - " button.title = 'Stop Interaction';\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', function (_evt) {\n", - " fig.handle_close(fig, {});\n", - " });\n", - " button.addEventListener(\n", - " 'mouseover',\n", - " on_mouseover_closure('Stop Interaction')\n", - " );\n", - " buttongrp.appendChild(button);\n", - " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", - " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", - "};\n", - "\n", - "mpl.figure.prototype._remove_fig_handler = function (event) {\n", - " var fig = event.data.fig;\n", - " if (event.target !== this) {\n", - " // Ignore bubbled events from children.\n", - " return;\n", - " }\n", - " fig.close_ws(fig, {});\n", - "};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (el) {\n", - " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (el) {\n", - " // this is important to make the div 'focusable\n", - " el.setAttribute('tabindex', 0);\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " } else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (event, _name) {\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which === 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " fig.ondownload(fig, null);\n", - "};\n", - "\n", - "mpl.find_output_cell = function (html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i = 0; i < ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code') {\n", - " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] === html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "};\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel !== null) {\n", - " IPython.notebook.kernel.comm_manager.register_target(\n", - " 'matplotlib',\n", - " mpl.mpl_figure_comm\n", - " );\n", - "}\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rho = ScalarField(name='rho', grid=problem.grid)\n", - "rho.fill(1000.) # [kg/m^3]\n", - "\n", - "problem.medium.add(rho)\n", - "\n", - "# Plot the field\n", - "rho.plot()" - ] - }, - { - "cell_type": "markdown", - "id": "engaged-economy", - "metadata": {}, - "source": [ - "Then, we can run our PDE operator with the added field." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "pointed-narrow", + "execution_count": 11, + "id": "empirical-devon", "metadata": {}, "outputs": [ { @@ -6216,7060 +816,78 @@ "\t * subs={h_x: 0.0004, h_y: 0.0004, dt: 5e-08}\n", "\t * opt=advanced-fsg\n", "\t * devicecreate=(p(t, x, y),)\n", - "Operator `acoustic_iso_state` generated in 1.75 s\n", - " * lowering.Clusters: 0.85 s (48.7 %)\n", - " * specializing.Clusters: 0.53 s (30.4 %)\n", - " * lowering.Expressions: 0.49 s (28.1 %)\n", - " * lowering.IET: 0.37 s (21.2 %)\n", - "Flops reduction after symbolic optimization: [496 --> 81]\n", - "recompiling for non-existent cache dir (/tmp/devito-codepy-uid1000/fa5ad15/2192fde79e05992400f6d9b434a76548).\n", - "gcc -march=native -O3 -g -fPIC -Wall -std=c99 -Wno-unused-result -Wno-unused-variable -Wno-unused-but-set-variable -ffast-math -shared -fopenmp /tmp/devito-jitcache-uid1000/fa5ad15b1d71d34a42f6f450c80474ba44096802.c -lm -o /tmp/devito-jitcache-uid1000/fa5ad15b1d71d34a42f6f450c80474ba44096802.so\n", - "Operator `acoustic_iso_state` jit-compiled `/tmp/devito-jitcache-uid1000/fa5ad15b1d71d34a42f6f450c80474ba44096802.c` in 0.29 s with `CustomCompiler`\n", + "Operator `acoustic_iso_state` generated in 7.06 s\n", + " * lowering.Clusters: 4.11 s (58.3 %)\n", + " * specializing.Clusters: 2.93 s (41.6 %)\n", + " * fuse: 2.07 s (29.4 %)\n", + " * lowering.Expressions: 1.71 s (24.3 %)\n", + "Flops reduction after symbolic optimization: [1119 --> 548]\n", + "recompiling for non-existent cache dir (/tmp/devito-codepy-uid1000/854b6b5/504768efa4c9f00e987ce2448a3e4095).\n", + "gcc -march=native -O3 -g -fPIC -Wall -std=c99 -Wno-unused-result -Wno-unused-variable -Wno-unused-but-set-variable -ffast-math -shared -fopenmp /tmp/devito-jitcache-uid1000/854b6b5ab6a9c339e99065419703ba0e1638e61f.c -lm -o /tmp/devito-jitcache-uid1000/854b6b5ab6a9c339e99065419703ba0e1638e61f.so\n", + "Operator `acoustic_iso_state` jit-compiled `/tmp/devito-jitcache-uid1000/854b6b5ab6a9c339e99065419703ba0e1638e61f.c` in 1.23 s with `GNUCompiler`\n", "(ShotID 0) Using inhomogeneous density\n", + "(ShotID 0) Using attenuation with power 0\n", "(ShotID 0) Running state equation for shot\n", "AutoTuner: could not perform any runs\n", - "Operator `acoustic_iso_state` ran in 0.15 s\n", - "Global performance: [OI=1.81, 89.83 GFlops/s, 1.20 GPts/s]\n", + "Operator `acoustic_iso_state` ran in 0.31 s\n", + "Global performance: [OI=0.01, 78.17 GFlops/s, 0.59 GPts/s]\n", "Local performance:\n", - " * section0<<1999,309,309>,<1999,300,300>> ran in 0.14 s [OI=1.81, 100.14 GFlops/s, 1.34 GPts/s]\n", - " * section1<<1999,1,2,2>,<1999,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - " * section2<<1999,120>,<1999,120,2,2>> ran in 0.01 s [OI=1.84, 2.84 GFlops/s, 0.00 GPts/s]\n", + " * section0<300> ran in 0.01 s [OI=0.25, 0.02 GFlops/s, 0.00 GPts/s]\n", + " * section1<300> ran in 0.01 s [OI=0.25, 0.40 GFlops/s, 0.00 GPts/s]\n", + " * section2<120> ran in 0.01 s [OI=0.50, 0.24 GFlops/s, 0.00 GPts/s]\n", + " * section3<<1999,40,300>,<1999,40,300>,<1999,40,300>,<1999,40,300>,<1999,40,300>,<1999,40,300>,<1999,300,40>,<1999,300,40>,<1999,300,40>,<1999,300,40>,<1999,300,40>,<1999,300,40>> ran in 0.14 s [OI=0.01, 80.63 GFlops/s, 0.71 GPts/s]\n", + " * section4<<1999,309,309>,<1999,300,300>> ran in 0.17 s [OI=1.50, 81.42 GFlops/s, 1.11 GPts/s]\n", + " * section5<<1999,1,2,2>,<1999,1,2,2>> ran in 0.01 s [OI=5.80, 0.11 GFlops/s, 0.01 GPts/s]\n", + " * section6<<1999,120>,<1999,120,2,2>> ran in 0.01 s [OI=1.32, 2.24 GFlops/s, 0.00 GPts/s]\n", "Performance[mode=advanced-fsg] arguments: {'nthreads': 6, 'nthreads_nonaffine': 6}\n", "(ShotID 0) Completed state equation run for shot\n" ] }, { "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "/* global mpl */\n", - "window.mpl = {};\n", - "\n", - "mpl.get_websocket_type = function () {\n", - " if (typeof WebSocket !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof MozWebSocket !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert(\n", - " 'Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.'\n", - " );\n", - " }\n", - "};\n", - "\n", - "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = this.ws.binaryType !== undefined;\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById('mpl-warnings');\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent =\n", - " 'This browser does not support binary websocket messages. ' +\n", - " 'Performance may be slow.';\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = document.createElement('div');\n", - " this.root.setAttribute('style', 'display: inline-block');\n", - " this._root_extra_style(this.root);\n", - "\n", - " parent_element.appendChild(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message('supports_binary', { value: fig.supports_binary });\n", - " fig.send_message('send_image_mode', {});\n", - " if (fig.ratio !== 1) {\n", - " fig.send_message('set_device_pixel_ratio', {\n", - " device_pixel_ratio: fig.ratio,\n", - " });\n", - " }\n", - " fig.send_message('refresh', {});\n", - " };\n", - "\n", - " this.imageObj.onload = function () {\n", - " if (fig.image_mode === 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function () {\n", - " fig.ws.close();\n", - " };\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "};\n", - "\n", - "mpl.figure.prototype._init_header = function () {\n", - " var titlebar = document.createElement('div');\n", - " titlebar.classList =\n", - " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", - " var titletext = document.createElement('div');\n", - " titletext.classList = 'ui-dialog-title';\n", - " titletext.setAttribute(\n", - " 'style',\n", - " 'width: 100%; text-align: center; padding: 3px;'\n", - " );\n", - " titlebar.appendChild(titletext);\n", - " this.root.appendChild(titlebar);\n", - " this.header = titletext;\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._init_canvas = function () {\n", - " var fig = this;\n", - "\n", - " var canvas_div = (this.canvas_div = document.createElement('div'));\n", - " canvas_div.setAttribute(\n", - " 'style',\n", - " 'border: 1px solid #ddd;' +\n", - " 'box-sizing: content-box;' +\n", - " 'clear: both;' +\n", - " 'min-height: 1px;' +\n", - " 'min-width: 1px;' +\n", - " 'outline: 0;' +\n", - " 'overflow: hidden;' +\n", - " 'position: relative;' +\n", - " 'resize: both;'\n", - " );\n", - "\n", - " function on_keyboard_event_closure(name) {\n", - " return function (event) {\n", - " return fig.key_event(event, name);\n", - " };\n", - " }\n", - "\n", - " canvas_div.addEventListener(\n", - " 'keydown',\n", - " on_keyboard_event_closure('key_press')\n", - " );\n", - " canvas_div.addEventListener(\n", - " 'keyup',\n", - " on_keyboard_event_closure('key_release')\n", - " );\n", - "\n", - " this._canvas_extra_style(canvas_div);\n", - " this.root.appendChild(canvas_div);\n", - "\n", - " var canvas = (this.canvas = document.createElement('canvas'));\n", - " canvas.classList.add('mpl-canvas');\n", - " canvas.setAttribute('style', 'box-sizing: content-box;');\n", - "\n", - " this.context = canvas.getContext('2d');\n", - "\n", - " var backingStore =\n", - " this.context.backingStorePixelRatio ||\n", - " this.context.webkitBackingStorePixelRatio ||\n", - " this.context.mozBackingStorePixelRatio ||\n", - " this.context.msBackingStorePixelRatio ||\n", - " this.context.oBackingStorePixelRatio ||\n", - " this.context.backingStorePixelRatio ||\n", - " 1;\n", - "\n", - " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", - " 'canvas'\n", - " ));\n", - " rubberband_canvas.setAttribute(\n", - " 'style',\n", - " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", - " );\n", - "\n", - " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", - " if (this.ResizeObserver === undefined) {\n", - " if (window.ResizeObserver !== undefined) {\n", - " this.ResizeObserver = window.ResizeObserver;\n", - " } else {\n", - " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", - " this.ResizeObserver = obs.ResizeObserver;\n", - " }\n", - " }\n", - "\n", - " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", - " var nentries = entries.length;\n", - " for (var i = 0; i < nentries; i++) {\n", - " var entry = entries[i];\n", - " var width, height;\n", - " if (entry.contentBoxSize) {\n", - " if (entry.contentBoxSize instanceof Array) {\n", - " // Chrome 84 implements new version of spec.\n", - " width = entry.contentBoxSize[0].inlineSize;\n", - " height = entry.contentBoxSize[0].blockSize;\n", - " } else {\n", - " // Firefox implements old version of spec.\n", - " width = entry.contentBoxSize.inlineSize;\n", - " height = entry.contentBoxSize.blockSize;\n", - " }\n", - " } else {\n", - " // Chrome <84 implements even older version of spec.\n", - " width = entry.contentRect.width;\n", - " height = entry.contentRect.height;\n", - " }\n", - "\n", - " // Keep the size of the canvas and rubber band canvas in sync with\n", - " // the canvas container.\n", - " if (entry.devicePixelContentBoxSize) {\n", - " // Chrome 84 implements new version of spec.\n", - " canvas.setAttribute(\n", - " 'width',\n", - " entry.devicePixelContentBoxSize[0].inlineSize\n", - " );\n", - " canvas.setAttribute(\n", - " 'height',\n", - " entry.devicePixelContentBoxSize[0].blockSize\n", - " );\n", - " } else {\n", - " canvas.setAttribute('width', width * fig.ratio);\n", - " canvas.setAttribute('height', height * fig.ratio);\n", - " }\n", - " canvas.setAttribute(\n", - " 'style',\n", - " 'width: ' + width + 'px; height: ' + height + 'px;'\n", - " );\n", - "\n", - " rubberband_canvas.setAttribute('width', width);\n", - " rubberband_canvas.setAttribute('height', height);\n", - "\n", - " // And update the size in Python. We ignore the initial 0/0 size\n", - " // that occurs as the element is placed into the DOM, which should\n", - " // otherwise not happen due to the minimum size styling.\n", - " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", - " fig.request_resize(width, height);\n", - " }\n", - " }\n", - " });\n", - " this.resizeObserverInstance.observe(canvas_div);\n", - "\n", - " function on_mouse_event_closure(name) {\n", - " return function (event) {\n", - " return fig.mouse_event(event, name);\n", - " };\n", - " }\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mousedown',\n", - " on_mouse_event_closure('button_press')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseup',\n", - " on_mouse_event_closure('button_release')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'dblclick',\n", - " on_mouse_event_closure('dblclick')\n", - " );\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband_canvas.addEventListener(\n", - " 'mousemove',\n", - " on_mouse_event_closure('motion_notify')\n", - " );\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseenter',\n", - " on_mouse_event_closure('figure_enter')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseleave',\n", - " on_mouse_event_closure('figure_leave')\n", - " );\n", - "\n", - " canvas_div.addEventListener('wheel', function (event) {\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " on_mouse_event_closure('scroll')(event);\n", - " });\n", - "\n", - " canvas_div.appendChild(canvas);\n", - " canvas_div.appendChild(rubberband_canvas);\n", - "\n", - " this.rubberband_context = rubberband_canvas.getContext('2d');\n", - " this.rubberband_context.strokeStyle = '#000000';\n", - "\n", - " this._resize_canvas = function (width, height, forward) {\n", - " if (forward) {\n", - " canvas_div.style.width = width + 'px';\n", - " canvas_div.style.height = height + 'px';\n", - " }\n", - " };\n", - "\n", - " // Disable right mouse context menu.\n", - " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n", - " event.preventDefault();\n", - " return false;\n", - " });\n", - "\n", - " function set_focus() {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'mpl-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " continue;\n", - " }\n", - "\n", - " var button = (fig.buttons[name] = document.createElement('button'));\n", - " button.classList = 'mpl-widget';\n", - " button.setAttribute('role', 'button');\n", - " button.setAttribute('aria-disabled', 'false');\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - "\n", - " var icon_img = document.createElement('img');\n", - " icon_img.src = '_images/' + image + '.png';\n", - " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", - " icon_img.alt = tooltip;\n", - " button.appendChild(icon_img);\n", + "application/vnd.jupyter.widget-view+json": { + "model_id": "6931078072504526a50a113fbd94f98c", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "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MaOyqNzuARwxYoSMHj1aunXrJiIitWrVkp9//lmmTp0qffr0kfDwcBG5ticwIiJC9fvtt98K7RXU2e12sdvttz54+su4EBePuSm9yvP1BDnviEqncrsH8OLFi2IyGd+e2WxWl4GJj4+X8PBwWb9+vWrPy8uTzMxMSUlJua2xkme71R+Q5bm4oNLrds27sjq/y2rcVH6U2z2AHTp0kMmTJ0tMTIzUqFFDdu3aJTNmzJB+/fqJyLWNb/jw4TJlyhRJSEiQhIQEmTJlijgcDunRo0cJR0+egB8ARERUUsptATh79mx5+umnZciQIfLbb79JZGSkDBo0SMaNG6ceM3LkSLl06ZIMGTJEzpw5Iw0bNpR169aJr69vCUZOREREdGuV2wLQ19dXZs2aJbNmzSr2MZqmyfjx42X8+PG3LS4iotKO5+3dPr/3w0OiW6ncngNIRDcfP6jKt7I+vixcia4fC0AqF8r6BxcREdHtxAKQiIiIyMOwACQij1BShwd5WJKISiMWgOTxePiYRG6sUCuqL+dV+ccxprKMBSAReTR+iBORJ2IBSER/iIcxPRvHn6j8YQFIRMXi3jHPxvEnKr9YABKRR+JeLSLyZCwAiehPK8vF0+3Yq1WW80NEnoEFIBHRTcDDpURUlrAAJCIiIvIwLACJiIiIPAwLQCIq13holoioMBaARER/EYtLIiqrWAASEREReRgWgEREREQehgUgERERkYdhAUhERETkYVgAEhEREXkYFoBEREREHoYFIBEREZGHYQFIRERE5GFYABIRERF5GBaARERERB6GBSARERGRh2EBSERERORhWAASlTAAJR0CUbnAbYno+rEApHKlLH0AaJpW0iEQlXllfTsqS2sWlS8sAKlcKOsfAkTkWbhmUUljAUj0//hNnIj+Cq4dVBaxACQiIiLyMCwAiYiIiDwMC0AiIjLgIU2i8o8FIBFdN564Xr5xfIk8BwtAIvIIf7RX60b2ev1eX+5NI6LSiAUgeTzu9fBst2r8Oa/KP44xlWUsAImIiIg8DAtAIvrTeFiTiKhsYwFIRERE5GFYABJRucbztIiICmMBSET0F7G4JKKyigUgERERkYdhAUhERETkYVgAEhEREXkYFoBEREREHoYFIBEREZGHYQFIRERE5GFYABIRERF5GBaARERERB6GBSARERGRh2EBSERERORhWAAS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vXrqPI+ibgsXLizyOdwLQAD48MMPUbNmTdjtdlSrVg2vvPKKasvOzsawYcMQExNj+Mm/+61Pnz4AgE8//bTY9iVLlhQb56ZNm7Bp06Zi+xbX1qJFi2Kfs2vXruoHJUXd9MPJf+Wmn4tY1C06OhorV65Ev379EBUVpQ4PmUwmREVFYfr06XC5XHjwwQfh7++v+gUEBODll18GAHVosbhc9evXT82BkJAQ9SMGAKrNYrGoIqJSpUrqUGBWVhb69u2LyMhIeHl5wdvbG82aNYPL5QJw7ccwGRkZCA8Ph91uh7+/v7qkhn44p7i4CipYAALAa6+9hsqVK0PTNAQHB2PlypXo2rWrutSFftPPnXS5XOrHJfpr6f0AqGu6FRdT165dERERAavVisjISDgcDlXc6G36YUWTyYSqVasactWyZUv14Wuz2XD//ferXOnbjd5fv+7hvn37/jBXRW1z7sXWhx9+iIoVK6rD5FFRUSouAGp7Cg0NhZeXF6pWrarytWbNGpUnfQyuJyYA6nDf999/D8BYAALA448/rnJRu3ZtFVN2djYGDBgAHx8fiFw7vB8UFIRp06bB5XIhOzsbjz32mGHOR0dH4+uvv0Z2djYefPDBYmP76KOP1Brk5eWlLmvz/PPPF1qf9Hlfq1YtFdvLL78MX19fw7Y2adIkuFwuLFu2DJUqVVLjbzKZkJKScl350vvabDaEh4fjkUceQXR0tMrXsmXLVNFX1K1Lly7o27evOqf6z6x9YWFhOHr0aLFr7h/dVqxYUWzfkJAQbNmyBaNGjSp2jSsuLpFrBVtxff/o1rVrVyxcuLDItqioKPUF6ODBg+jcubP6gpqUlFTosjD012gAIERERETkMXgOIBEREZGHYQFIRERE5GFYABIRERF5GBaARERERB6GBSARERGRh2EBSERERORhWAASEREReRgWgEREREQehgUgEZVLaWlpMnz48JIOg4ioVGIBSEQeCYBcuXKlpMMgIioRLACJqNzp27evZGZmyj//+U/RNE00TZN//etfommarF27VurXry92u122bNkiP/74o9xzzz0SFhYmTqdTGjRoIBs2bDA8X25urowcOVKio6PFbrdLQkKCvPbaa6r9m2++kbZt24rT6ZSwsDDp1auXnDp16na/bSKi68YCkIjKnX/+85/SuHFjGThwoGRlZUlWVpZER0eLiMjIkSNl6tSp8u2330pSUpKcP39e2rZtKxs2bJBdu3ZJenq6dOjQQY4ePaqer3fv3rJ06VJ58cUX5dtvv5X58+eL0+kUEZGsrCxJTU2VOnXqyFdffSVr1qyRX3/9Vbp06VIi752I6HpoAFDSQRAR3WxpaWlSp04dmTVrloiIbN68WVq0aCErV66Ue+6553f71qhRQwYPHixDhw6VgwcPStWqVWX9+vXSqlWrQo8dN26cbNu2TdauXavuO3bsmERHR8v3338vVapUuanvi4joZrCUdABERLdT/fr1Df++cOGCTJgwQVavXi0nTpyQK1euyKVLl9QewN27d4vZbJbU1NQin2/nzp2yadMmtUfQ3Y8//sgCkIhKJRaARORRfHx8DP8eMWKErF27Vl544QWpXLmyeHt7y3333Sd5eXkiIuLt7f27z+dyuaRDhw4ybdq0Qm0RERE3L3AiopuIBSARlUs2m02uXr36h4/bsmWL9O3bV+69914RETl//rz89NNPqr1WrVricrkkMzOzyEPA9erVk/fff1/i4uLEYuGSSkRlA38EQkTlUlxcnGzbtk1++uknOXXqlLhcriIfV7lyZVm+fLns3r1b9uzZIz169DA8Ni4uTvr06SP9+vWTlStXypEjR2Tz5s3yzjvviIjII488IqdPn5bu3bvL9u3b5fDhw7Ju3Trp16/fdRWgREQlgQUgEZVLf//738VsNktiYqKEhIQYftXrbubMmRIYGCgpKSnSoUMHSU9Pl3r16hkeM2/ePLnvvvtkyJAhUq1aNRk4cKBcuHBBREQiIyPliy++kKtXr0p6errUrFlThg0bJv7+/mIycYklotKJvwImIiIi8jD8ekpERETkYVgAEhEREXkYFoBEREREHoYFIBEREZGHYQFIRERE5GFYABIRERF5GBaARERERB6GBSARERGRh2EBSERERORhWAASEREReRgWgEREREQehgUgERERkYf5P27AiOnkz3tMAAAAAElFTkSuQmCC", + "text/html": [ "\n", - " buttonGroup.appendChild(button);\n", - " }\n", + "
\n", + "
\n", + " Figure\n", + "
\n", + " \n", + "
\n", + " " + ], + "text/plain": [ + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "86de90e63723489c8c20268c82c9748c", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "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o7KyUnPmzFF8fLxatGihLl26aN68eY7Pk5e41pfjf//3f3X33XcrNjZWFotFf/3rX51e9+WalpWV6ZlnnlFkZKRatWql0aNH6z//+U8DnkUTYCCgrF271mjevLmxatUq4/PPPzemTp1qtGrVyjhy5EhjD820hg4darz66qvGp59+auzbt88YOXKk0bFjR+O7775z9Hn++eeN1q1bG+vXrzc++eQTY9y4cUZMTIxRWlraiCM3r507dxqdO3c2br75ZmPq1KmOdq7zlTt9+rTRqVMn47HHHjN27NhhFBYWGu+//77x1VdfOfpwnevHf//3fxvt27c3/vGPfxiFhYXGu+++a1xzzTXG0qVLHX241v7Lzs42Zs+ebaxfv96QZLz33ntOr/tyTVNTU43rr7/eyM3NNfbu3Wvccccdxi233GJUVlY28NmYFwEwwPTt29dITU11auvevbsxc+bMRhpR03PixAlDkrF161bDMAyjurraiI6ONp5//nlHn4sXLxpWq9VYuXJlYw3TtM6dO2d07drVyM3NNQYNGuQIgFzn+jFjxgxjwIABHl/nOtefkSNHGr/61a+c2u6//37jkUceMQyDa10f6gZAX67p2bNnjebNmxtr16519Dl27JjRrFkzY9OmTQ02drNjCjiAlJeXa8+ePY6PvbNLTk7W9u3bG2lUTY/9YwPbtWsnSSosLJTNZnO67uHh4Ro0aBDX/TI8/fTTGjlypAYPHuzUznWuHxs3blSfPn30i1/8Qh06dFCvXr20atUqx+tc5/ozYMAAffDBBzp06JAkaf/+/froo480YsQISVzrq8GXa7pnzx5VVFQ49YmNjVXPnj257n4I+M8CDiYnT55UVVWVoqKinNqjoqJks9kaaVRNi2EYSk9P14ABA9SzZ09Jclxbd9f9yJEjDT5GM1u7dq327t2rXbt2ubzGda4fX3/9tVasWKH09HTNmjVLO3fu1JQpUxQeHq4JEyZwnevRjBkzVFJSou7duyskJERVVVVasGCBHnroIUn8nb4afLmmNptNYWFhatu2rUsfflb6jgAYgCwWi9NzwzBc2nB5Jk+erAMHDuijjz5yeY3rfmWOHj2qqVOnKicnRxERER77cZ2vTHV1tfr06aOFCxdKknr16qXPPvtMK1as0IQJExz9uM5Xbt26dXrzzTf19ttv6yc/+Yn27dunadOmKTY2Vo8++qijH9e6/l3ONeW6+4cp4AASGRmpkJAQl99gTpw44fLbEPz3zDPPaOPGjdqyZYtuuOEGR3t0dLQkcd2v0J49e3TixAklJiYqNDRUoaGh2rp1q1566SWFhoY6riXX+crExMSoR48eTm0JCQkqKiqSxN/n+vSb3/xGM2fO1IMPPqibbrpJKSkpSktLU1ZWliSu9dXgyzWNjo5WeXm5zpw547EPLo0AGEDCwsKUmJio3Nxcp/bc3Fz179+/kUZlfoZhaPLkydqwYYM2b96s+Ph4p9fj4+MVHR3tdN3Ly8u1detWrrsf7rrrLn3yySfat2+f49GnTx89/PDD2rdvn7p06cJ1rgc/+9nPXLYxOnTokDp16iSJv8/16fz582rWzPnHZEhIiGMbGK51/fPlmiYmJqp58+ZOfYqLi/Xpp59y3f3RaLefwC37NjCrV682Pv/8c2PatGlGq1atjMOHDzf20EzrqaeeMqxWq/Hhhx8axcXFjsf58+cdfZ5//nnDarUaGzZsMD755BPjoYceYiuHelD7LmDD4DrXh507dxqhoaHGggULjC+//NJ46623jJYtWxpvvvmmow/XuX48+uijxvXXX+/YBmbDhg1GZGSk8eyzzzr6cK39d+7cOSM/P9/Iz883JBlLliwx8vPzHdud+XJNU1NTjRtuuMF4//33jb179xp33nkn28D4iQAYgF5++WWjU6dORlhYmNG7d2/HdiW4PJLcPl599VVHn+rqamPu3LlGdHS0ER4ebvz85z83Pvnkk8YbdBNRNwBynevH3//+d6Nnz55GeHi40b17d+OVV15xep3rXD9KS0uNqVOnGh07djQiIiKMLl26GLNnzzbKysocfbjW/tuyZYvb/5MfffRRwzB8u6YXLlwwJk+ebLRr185o0aKFMWrUKKOoqKgRzsa8LIZhGI1TewQAAEBjYA0gAABAkCEAAgAABBkCIAAAQJAhAAIAAAQZAiAAAECQIQACAAAEGQIgAABAkCEAAgAABBkCIAAAQJAhAAIAAAQZAiAAAECQIQACAAAEGQIgAABAkCEAAgAABBkCIAAAQJAhAAIAAAQZAiAAAECQIQACAAAEGQIgAABAkCEAAgAABBkCIAAAQJAhAAIAAAQZAiAAAECQIQACAAAEGQIgAABAkCEAAgAABBkCIAAAQJAhAAIAAAQZAiAAAECQIQACAAAEGQIgAABAkPn/ADW9LxliCQ4AAAAASUVORK5CYII=", + "text/html": [ "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " var fmt_picker = document.createElement('select');\n", - " fmt_picker.classList = 'mpl-widget';\n", - " toolbar.appendChild(fmt_picker);\n", - " this.format_dropdown = fmt_picker;\n", - "\n", - " for (var ind in mpl.extensions) {\n", - " var fmt = mpl.extensions[ind];\n", - " var option = document.createElement('option');\n", - " option.selected = fmt === mpl.default_extension;\n", - " option.innerHTML = fmt;\n", - " fmt_picker.appendChild(option);\n", - " }\n", - "\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "};\n", - "\n", - "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n", - " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", - " // which will in turn request a refresh of the image.\n", - " this.send_message('resize', { width: x_pixels, height: y_pixels });\n", - "};\n", - "\n", - "mpl.figure.prototype.send_message = function (type, properties) {\n", - " properties['type'] = type;\n", - " properties['figure_id'] = this.id;\n", - " this.ws.send(JSON.stringify(properties));\n", - "};\n", - "\n", - "mpl.figure.prototype.send_draw_message = function () {\n", - " if (!this.waiting) {\n", - " this.waiting = true;\n", - " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " var format_dropdown = fig.format_dropdown;\n", - " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", - " fig.ondownload(fig, format);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_resize = function (fig, msg) {\n", - " var size = msg['size'];\n", - " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n", - " fig._resize_canvas(size[0], size[1], msg['forward']);\n", - " fig.send_message('refresh', {});\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", - " var x0 = msg['x0'] / fig.ratio;\n", - " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", - " var x1 = msg['x1'] / fig.ratio;\n", - " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n", - " x0 = Math.floor(x0) + 0.5;\n", - " y0 = Math.floor(y0) + 0.5;\n", - " x1 = Math.floor(x1) + 0.5;\n", - " y1 = Math.floor(y1) + 0.5;\n", - " var min_x = Math.min(x0, x1);\n", - " var min_y = Math.min(y0, y1);\n", - " var width = Math.abs(x1 - x0);\n", - " var height = Math.abs(y1 - y0);\n", - "\n", - " fig.rubberband_context.clearRect(\n", - " 0,\n", - " 0,\n", - " fig.canvas.width / fig.ratio,\n", - " fig.canvas.height / fig.ratio\n", - " );\n", - "\n", - " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n", - " // Updates the figure title.\n", - " fig.header.textContent = msg['label'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n", - " fig.rubberband_canvas.style.cursor = msg['cursor'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_message = function (fig, msg) {\n", - " fig.message.textContent = msg['message'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n", - " // Request the server to send over a new figure.\n", - " fig.send_draw_message();\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n", - " fig.image_mode = msg['mode'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n", - " for (var key in msg) {\n", - " if (!(key in fig.buttons)) {\n", - " continue;\n", - " }\n", - " fig.buttons[key].disabled = !msg[key];\n", - " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", - " if (msg['mode'] === 'PAN') {\n", - " fig.buttons['Pan'].classList.add('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " } else if (msg['mode'] === 'ZOOM') {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.add('active');\n", - " } else {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Called whenever the canvas gets updated.\n", - " this.send_message('ack', {});\n", - "};\n", - "\n", - "// A function to construct a web socket function for onmessage handling.\n", - "// Called in the figure constructor.\n", - "mpl.figure.prototype._make_on_message_function = function (fig) {\n", - " return function socket_on_message(evt) {\n", - " if (evt.data instanceof Blob) {\n", - " var img = evt.data;\n", - " if (img.type !== 'image/png') {\n", - " /* FIXME: We get \"Resource interpreted as Image but\n", - " * transferred with MIME type text/plain:\" errors on\n", - " * Chrome. But how to set the MIME type? It doesn't seem\n", - " * to be part of the websocket stream */\n", - " img.type = 'image/png';\n", - " }\n", - "\n", - " /* Free the memory for the previous frames */\n", - " if (fig.imageObj.src) {\n", - " (window.URL || window.webkitURL).revokeObjectURL(\n", - " fig.imageObj.src\n", - " );\n", - " }\n", - "\n", - " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", - " img\n", - " );\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " } else if (\n", - " typeof evt.data === 'string' &&\n", - " evt.data.slice(0, 21) === 'data:image/png;base64'\n", - " ) {\n", - " fig.imageObj.src = evt.data;\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - "\n", - " var msg = JSON.parse(evt.data);\n", - " var msg_type = msg['type'];\n", - "\n", - " // Call the \"handle_{type}\" callback, which takes\n", - " // the figure and JSON message as its only arguments.\n", - " try {\n", - " var callback = fig['handle_' + msg_type];\n", - " } catch (e) {\n", - " console.log(\n", - " \"No handler for the '\" + msg_type + \"' message type: \",\n", - " msg\n", - " );\n", - " return;\n", - " }\n", - "\n", - " if (callback) {\n", - " try {\n", - " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", - " callback(fig, msg);\n", - " } catch (e) {\n", - " console.log(\n", - " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", - " e,\n", - " e.stack,\n", - " msg\n", - " );\n", - " }\n", - " }\n", - " };\n", - "};\n", - "\n", - "// from https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", - "mpl.findpos = function (e) {\n", - " //this section is from http://www.quirksmode.org/js/events_properties.html\n", - " var targ;\n", - " if (!e) {\n", - " e = window.event;\n", - " }\n", - " if (e.target) {\n", - " targ = e.target;\n", - " } else if (e.srcElement) {\n", - " targ = e.srcElement;\n", - " }\n", - " if (targ.nodeType === 3) {\n", - " // defeat Safari bug\n", - " targ = targ.parentNode;\n", - " }\n", - "\n", - " // pageX,Y are the mouse positions relative to the document\n", - " var boundingRect = targ.getBoundingClientRect();\n", - " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", - " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n", - "\n", - " return { x: x, y: y };\n", - "};\n", - "\n", - "/*\n", - " * return a copy of an object with only non-object keys\n", - " * we need this to avoid circular references\n", - " * https://stackoverflow.com/a/24161582/3208463\n", - " */\n", - "function simpleKeys(original) {\n", - " return Object.keys(original).reduce(function (obj, key) {\n", - " if (typeof original[key] !== 'object') {\n", - " obj[key] = original[key];\n", - " }\n", - " return obj;\n", - " }, {});\n", - "}\n", - "\n", - "mpl.figure.prototype.mouse_event = function (event, name) {\n", - " var canvas_pos = mpl.findpos(event);\n", - "\n", - " if (name === 'button_press') {\n", - " this.canvas.focus();\n", - " this.canvas_div.focus();\n", - " }\n", - "\n", - " var x = canvas_pos.x * this.ratio;\n", - " var y = canvas_pos.y * this.ratio;\n", - "\n", - " this.send_message(name, {\n", - " x: x,\n", - " y: y,\n", - " button: event.button,\n", - " step: event.step,\n", - " guiEvent: simpleKeys(event),\n", - " });\n", - "\n", - " /* This prevents the web browser from automatically changing to\n", - " * the text insertion cursor when the button is pressed. We want\n", - " * to control all of the cursor setting manually through the\n", - " * 'cursor' event from matplotlib */\n", - " event.preventDefault();\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n", - " // Handle any extra behaviour associated with a key event\n", - "};\n", - "\n", - "mpl.figure.prototype.key_event = function (event, name) {\n", - " // Prevent repeat events\n", - " if (name === 'key_press') {\n", - " if (event.key === this._key) {\n", - " return;\n", - " } else {\n", - " this._key = event.key;\n", - " }\n", - " }\n", - " if (name === 'key_release') {\n", - " this._key = null;\n", - " }\n", - "\n", - " var value = '';\n", - " if (event.ctrlKey && event.key !== 'Control') {\n", - " value += 'ctrl+';\n", - " }\n", - " else if (event.altKey && event.key !== 'Alt') {\n", - " value += 'alt+';\n", - " }\n", - " else if (event.shiftKey && event.key !== 'Shift') {\n", - " value += 'shift+';\n", - " }\n", - "\n", - " value += 'k' + event.key;\n", - "\n", - " this._key_event_extra(event, name);\n", - "\n", - " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n", - " if (name === 'download') {\n", - " this.handle_save(this, null);\n", - " } else {\n", - " this.send_message('toolbar_button', { name: name });\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n", - " this.message.textContent = tooltip;\n", - "};\n", - "\n", - "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", - "// prettier-ignore\n", - "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n", - "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", - "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", - "\n", - "mpl.default_extension = \"png\";/* global mpl */\n", - "\n", - "var comm_websocket_adapter = function (comm) {\n", - " // Create a \"websocket\"-like object which calls the given IPython comm\n", - " // object with the appropriate methods. Currently this is a non binary\n", - " // socket, so there is still some room for performance tuning.\n", - " var ws = {};\n", - "\n", - " ws.binaryType = comm.kernel.ws.binaryType;\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " function updateReadyState(_event) {\n", - " if (comm.kernel.ws) {\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " } else {\n", - " ws.readyState = 3; // Closed state.\n", - " }\n", - " }\n", - " comm.kernel.ws.addEventListener('open', updateReadyState);\n", - " comm.kernel.ws.addEventListener('close', updateReadyState);\n", - " comm.kernel.ws.addEventListener('error', updateReadyState);\n", - "\n", - " ws.close = function () {\n", - " comm.close();\n", - " };\n", - " ws.send = function (m) {\n", - " //console.log('sending', m);\n", - " comm.send(m);\n", - " };\n", - " // Register the callback with on_msg.\n", - " comm.on_msg(function (msg) {\n", - " //console.log('receiving', msg['content']['data'], msg);\n", - " var data = msg['content']['data'];\n", - " if (data['blob'] !== undefined) {\n", - " data = {\n", - " data: new Blob(msg['buffers'], { type: data['blob'] }),\n", - " };\n", - " }\n", - " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", - " ws.onmessage(data);\n", - " });\n", - " return ws;\n", - "};\n", - "\n", - "mpl.mpl_figure_comm = function (comm, msg) {\n", - " // This is the function which gets called when the mpl process\n", - " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", - "\n", - " var id = msg.content.data.id;\n", - " // Get hold of the div created by the display call when the Comm\n", - " // socket was opened in Python.\n", - " var element = document.getElementById(id);\n", - " var ws_proxy = comm_websocket_adapter(comm);\n", - "\n", - " function ondownload(figure, _format) {\n", - " window.open(figure.canvas.toDataURL());\n", - " }\n", - "\n", - " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n", - "\n", - " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", - " // web socket which is closed, not our websocket->open comm proxy.\n", - " ws_proxy.onopen();\n", - "\n", - " fig.parent_element = element;\n", - " fig.cell_info = mpl.find_output_cell(\"
\");\n", - " if (!fig.cell_info) {\n", - " console.error('Failed to find cell for figure', id, fig);\n", - " return;\n", - " }\n", - " fig.cell_info[0].output_area.element.on(\n", - " 'cleared',\n", - " { fig: fig },\n", - " fig._remove_fig_handler\n", - " );\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_close = function (fig, msg) {\n", - " var width = fig.canvas.width / fig.ratio;\n", - " fig.cell_info[0].output_area.element.off(\n", - " 'cleared',\n", - " fig._remove_fig_handler\n", - " );\n", - " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n", - "\n", - " // Update the output cell to use the data from the current canvas.\n", - " fig.push_to_output();\n", - " var dataURL = fig.canvas.toDataURL();\n", - " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", - " // the notebook keyboard shortcuts fail.\n", - " IPython.keyboard_manager.enable();\n", - " fig.parent_element.innerHTML =\n", - " '';\n", - " fig.close_ws(fig, msg);\n", - "};\n", - "\n", - "mpl.figure.prototype.close_ws = function (fig, msg) {\n", - " fig.send_message('closing', msg);\n", - " // fig.ws.close()\n", - "};\n", - "\n", - "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n", - " // Turn the data on the canvas into data in the output cell.\n", - " var width = this.canvas.width / this.ratio;\n", - " var dataURL = this.canvas.toDataURL();\n", - " this.cell_info[1]['text/html'] =\n", - " '';\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Tell IPython that the notebook contents must change.\n", - " IPython.notebook.set_dirty(true);\n", - " this.send_message('ack', {});\n", - " var fig = this;\n", - " // Wait a second, then push the new image to the DOM so\n", - " // that it is saved nicely (might be nice to debounce this).\n", - " setTimeout(function () {\n", - " fig.push_to_output();\n", - " }, 1000);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'btn-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " var button;\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " continue;\n", - " }\n", - "\n", - " button = fig.buttons[name] = document.createElement('button');\n", - " button.classList = 'btn btn-default';\n", - " button.href = '#';\n", - " button.title = name;\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message pull-right';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = document.createElement('div');\n", - " buttongrp.classList = 'btn-group inline pull-right';\n", - " button = document.createElement('button');\n", - " button.classList = 'btn btn-mini btn-primary';\n", - " button.href = '#';\n", - " button.title = 'Stop Interaction';\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', function (_evt) {\n", - " fig.handle_close(fig, {});\n", - " });\n", - " button.addEventListener(\n", - " 'mouseover',\n", - " on_mouseover_closure('Stop Interaction')\n", - " );\n", - " buttongrp.appendChild(button);\n", - " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", - " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", - "};\n", - "\n", - "mpl.figure.prototype._remove_fig_handler = function (event) {\n", - " var fig = event.data.fig;\n", - " if (event.target !== this) {\n", - " // Ignore bubbled events from children.\n", - " return;\n", - " }\n", - " fig.close_ws(fig, {});\n", - "};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (el) {\n", - " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (el) {\n", - " // this is important to make the div 'focusable\n", - " el.setAttribute('tabindex', 0);\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " } else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (event, _name) {\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which === 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " fig.ondownload(fig, null);\n", - "};\n", - "\n", - "mpl.find_output_cell = function (html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i = 0; i < ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code') {\n", - " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] === html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "};\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel !== null) {\n", - " IPython.notebook.kernel.comm_manager.register_target(\n", - " 'matplotlib',\n", - " mpl.mpl_figure_comm\n", - " );\n", - "}\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "/* global mpl */\n", - "window.mpl = {};\n", - "\n", - "mpl.get_websocket_type = function () {\n", - " if (typeof WebSocket !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof MozWebSocket !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert(\n", - " 'Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.'\n", - " );\n", - " }\n", - "};\n", - "\n", - "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = this.ws.binaryType !== undefined;\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById('mpl-warnings');\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent =\n", - " 'This browser does not support binary websocket messages. ' +\n", - " 'Performance may be slow.';\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = document.createElement('div');\n", - " this.root.setAttribute('style', 'display: inline-block');\n", - " this._root_extra_style(this.root);\n", - "\n", - " parent_element.appendChild(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message('supports_binary', { value: fig.supports_binary });\n", - " fig.send_message('send_image_mode', {});\n", - " if (fig.ratio !== 1) {\n", - " fig.send_message('set_device_pixel_ratio', {\n", - " device_pixel_ratio: fig.ratio,\n", - " });\n", - " }\n", - " fig.send_message('refresh', {});\n", - " };\n", - "\n", - " this.imageObj.onload = function () {\n", - " if (fig.image_mode === 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function () {\n", - " fig.ws.close();\n", - " };\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "};\n", - "\n", - "mpl.figure.prototype._init_header = function () {\n", - " var titlebar = document.createElement('div');\n", - " titlebar.classList =\n", - " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", - " var titletext = document.createElement('div');\n", - " titletext.classList = 'ui-dialog-title';\n", - " titletext.setAttribute(\n", - " 'style',\n", - " 'width: 100%; text-align: center; padding: 3px;'\n", - " );\n", - " titlebar.appendChild(titletext);\n", - " this.root.appendChild(titlebar);\n", - " this.header = titletext;\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._init_canvas = function () {\n", - " var fig = this;\n", - "\n", - " var canvas_div = (this.canvas_div = document.createElement('div'));\n", - " canvas_div.setAttribute(\n", - " 'style',\n", - " 'border: 1px solid #ddd;' +\n", - " 'box-sizing: content-box;' +\n", - " 'clear: both;' +\n", - " 'min-height: 1px;' +\n", - " 'min-width: 1px;' +\n", - " 'outline: 0;' +\n", - " 'overflow: hidden;' +\n", - " 'position: relative;' +\n", - " 'resize: both;'\n", - " );\n", - "\n", - " function on_keyboard_event_closure(name) {\n", - " return function (event) {\n", - " return fig.key_event(event, name);\n", - " };\n", - " }\n", - "\n", - " canvas_div.addEventListener(\n", - " 'keydown',\n", - " on_keyboard_event_closure('key_press')\n", - " );\n", - " canvas_div.addEventListener(\n", - " 'keyup',\n", - " on_keyboard_event_closure('key_release')\n", - " );\n", - "\n", - " this._canvas_extra_style(canvas_div);\n", - " this.root.appendChild(canvas_div);\n", - "\n", - " var canvas = (this.canvas = document.createElement('canvas'));\n", - " canvas.classList.add('mpl-canvas');\n", - " canvas.setAttribute('style', 'box-sizing: content-box;');\n", - "\n", - " this.context = canvas.getContext('2d');\n", - "\n", - " var backingStore =\n", - " this.context.backingStorePixelRatio ||\n", - " this.context.webkitBackingStorePixelRatio ||\n", - " this.context.mozBackingStorePixelRatio ||\n", - " this.context.msBackingStorePixelRatio ||\n", - " this.context.oBackingStorePixelRatio ||\n", - " this.context.backingStorePixelRatio ||\n", - " 1;\n", - "\n", - " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", - " 'canvas'\n", - " ));\n", - " rubberband_canvas.setAttribute(\n", - " 'style',\n", - " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", - " );\n", - "\n", - " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", - " if (this.ResizeObserver === undefined) {\n", - " if (window.ResizeObserver !== undefined) {\n", - " this.ResizeObserver = window.ResizeObserver;\n", - " } else {\n", - " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", - " this.ResizeObserver = obs.ResizeObserver;\n", - " }\n", - " }\n", - "\n", - " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", - " var nentries = entries.length;\n", - " for (var i = 0; i < nentries; i++) {\n", - " var entry = entries[i];\n", - " var width, height;\n", - " if (entry.contentBoxSize) {\n", - " if (entry.contentBoxSize instanceof Array) {\n", - " // Chrome 84 implements new version of spec.\n", - " width = entry.contentBoxSize[0].inlineSize;\n", - " height = entry.contentBoxSize[0].blockSize;\n", - " } else {\n", - " // Firefox implements old version of spec.\n", - " width = entry.contentBoxSize.inlineSize;\n", - " height = entry.contentBoxSize.blockSize;\n", - " }\n", - " } else {\n", - " // Chrome <84 implements even older version of spec.\n", - " width = entry.contentRect.width;\n", - " height = entry.contentRect.height;\n", - " }\n", - "\n", - " // Keep the size of the canvas and rubber band canvas in sync with\n", - " // the canvas container.\n", - " if (entry.devicePixelContentBoxSize) {\n", - " // Chrome 84 implements new version of spec.\n", - " canvas.setAttribute(\n", - " 'width',\n", - " entry.devicePixelContentBoxSize[0].inlineSize\n", - " );\n", - " canvas.setAttribute(\n", - " 'height',\n", - " entry.devicePixelContentBoxSize[0].blockSize\n", - " );\n", - " } else {\n", - " canvas.setAttribute('width', width * fig.ratio);\n", - " canvas.setAttribute('height', height * fig.ratio);\n", - " }\n", - " canvas.setAttribute(\n", - " 'style',\n", - " 'width: ' + width + 'px; height: ' + height + 'px;'\n", - " );\n", - "\n", - " rubberband_canvas.setAttribute('width', width);\n", - " rubberband_canvas.setAttribute('height', height);\n", - "\n", - " // And update the size in Python. We ignore the initial 0/0 size\n", - " // that occurs as the element is placed into the DOM, which should\n", - " // otherwise not happen due to the minimum size styling.\n", - " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", - " fig.request_resize(width, height);\n", - " }\n", - " }\n", - " });\n", - " this.resizeObserverInstance.observe(canvas_div);\n", - "\n", - " function on_mouse_event_closure(name) {\n", - " return function (event) {\n", - " return fig.mouse_event(event, name);\n", - " };\n", - " }\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mousedown',\n", - " on_mouse_event_closure('button_press')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseup',\n", - " on_mouse_event_closure('button_release')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'dblclick',\n", - " on_mouse_event_closure('dblclick')\n", - " );\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband_canvas.addEventListener(\n", - " 'mousemove',\n", - " on_mouse_event_closure('motion_notify')\n", - " );\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseenter',\n", - " on_mouse_event_closure('figure_enter')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseleave',\n", - " on_mouse_event_closure('figure_leave')\n", - " );\n", - "\n", - " canvas_div.addEventListener('wheel', function (event) {\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " on_mouse_event_closure('scroll')(event);\n", - " });\n", - "\n", - " canvas_div.appendChild(canvas);\n", - " canvas_div.appendChild(rubberband_canvas);\n", - "\n", - " this.rubberband_context = rubberband_canvas.getContext('2d');\n", - " this.rubberband_context.strokeStyle = '#000000';\n", - "\n", - " this._resize_canvas = function (width, height, forward) {\n", - " if (forward) {\n", - " canvas_div.style.width = width + 'px';\n", - " canvas_div.style.height = height + 'px';\n", - " }\n", - " };\n", - "\n", - " // Disable right mouse context menu.\n", - " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n", - " event.preventDefault();\n", - " return false;\n", - " });\n", - "\n", - " function set_focus() {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'mpl-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " continue;\n", - " }\n", - "\n", - " var button = (fig.buttons[name] = document.createElement('button'));\n", - " button.classList = 'mpl-widget';\n", - " button.setAttribute('role', 'button');\n", - " button.setAttribute('aria-disabled', 'false');\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - "\n", - " var icon_img = document.createElement('img');\n", - " icon_img.src = '_images/' + image + '.png';\n", - " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", - " icon_img.alt = tooltip;\n", - " button.appendChild(icon_img);\n", - "\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " var fmt_picker = document.createElement('select');\n", - " fmt_picker.classList = 'mpl-widget';\n", - " toolbar.appendChild(fmt_picker);\n", - " this.format_dropdown = fmt_picker;\n", - "\n", - " for (var ind in mpl.extensions) {\n", - " var fmt = mpl.extensions[ind];\n", - " var option = document.createElement('option');\n", - " option.selected = fmt === mpl.default_extension;\n", - " option.innerHTML = fmt;\n", - " fmt_picker.appendChild(option);\n", - " }\n", - "\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "};\n", - "\n", - "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n", - " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", - " // which will in turn request a refresh of the image.\n", - " this.send_message('resize', { width: x_pixels, height: y_pixels });\n", - "};\n", - "\n", - "mpl.figure.prototype.send_message = function (type, properties) {\n", - " properties['type'] = type;\n", - " properties['figure_id'] = this.id;\n", - " this.ws.send(JSON.stringify(properties));\n", - "};\n", - "\n", - "mpl.figure.prototype.send_draw_message = function () {\n", - " if (!this.waiting) {\n", - " this.waiting = true;\n", - " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " var format_dropdown = fig.format_dropdown;\n", - " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", - " fig.ondownload(fig, format);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_resize = function (fig, msg) {\n", - " var size = msg['size'];\n", - " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n", - " fig._resize_canvas(size[0], size[1], msg['forward']);\n", - " fig.send_message('refresh', {});\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", - " var x0 = msg['x0'] / fig.ratio;\n", - " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", - " var x1 = msg['x1'] / fig.ratio;\n", - " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n", - " x0 = Math.floor(x0) + 0.5;\n", - " y0 = Math.floor(y0) + 0.5;\n", - " x1 = Math.floor(x1) + 0.5;\n", - " y1 = Math.floor(y1) + 0.5;\n", - " var min_x = Math.min(x0, x1);\n", - " var min_y = Math.min(y0, y1);\n", - " var width = Math.abs(x1 - x0);\n", - " var height = Math.abs(y1 - y0);\n", - "\n", - " fig.rubberband_context.clearRect(\n", - " 0,\n", - " 0,\n", - " fig.canvas.width / fig.ratio,\n", - " fig.canvas.height / fig.ratio\n", - " );\n", - "\n", - " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n", - " // Updates the figure title.\n", - " fig.header.textContent = msg['label'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n", - " fig.rubberband_canvas.style.cursor = msg['cursor'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_message = function (fig, msg) {\n", - " fig.message.textContent = msg['message'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n", - " // Request the server to send over a new figure.\n", - " fig.send_draw_message();\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n", - " fig.image_mode = msg['mode'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n", - " for (var key in msg) {\n", - " if (!(key in fig.buttons)) {\n", - " continue;\n", - " }\n", - " fig.buttons[key].disabled = !msg[key];\n", - " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", - " if (msg['mode'] === 'PAN') {\n", - " fig.buttons['Pan'].classList.add('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " } else if (msg['mode'] === 'ZOOM') {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.add('active');\n", - " } else {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Called whenever the canvas gets updated.\n", - " this.send_message('ack', {});\n", - "};\n", - "\n", - "// A function to construct a web socket function for onmessage handling.\n", - "// Called in the figure constructor.\n", - "mpl.figure.prototype._make_on_message_function = function (fig) {\n", - " return function socket_on_message(evt) {\n", - " if (evt.data instanceof Blob) {\n", - " var img = evt.data;\n", - " if (img.type !== 'image/png') {\n", - " /* FIXME: We get \"Resource interpreted as Image but\n", - " * transferred with MIME type text/plain:\" errors on\n", - " * Chrome. But how to set the MIME type? It doesn't seem\n", - " * to be part of the websocket stream */\n", - " img.type = 'image/png';\n", - " }\n", - "\n", - " /* Free the memory for the previous frames */\n", - " if (fig.imageObj.src) {\n", - " (window.URL || window.webkitURL).revokeObjectURL(\n", - " fig.imageObj.src\n", - " );\n", - " }\n", - "\n", - " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", - " img\n", - " );\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " } else if (\n", - " typeof evt.data === 'string' &&\n", - " evt.data.slice(0, 21) === 'data:image/png;base64'\n", - " ) {\n", - " fig.imageObj.src = evt.data;\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - "\n", - " var msg = JSON.parse(evt.data);\n", - " var msg_type = msg['type'];\n", - "\n", - " // Call the \"handle_{type}\" callback, which takes\n", - " // the figure and JSON message as its only arguments.\n", - " try {\n", - " var callback = fig['handle_' + msg_type];\n", - " } catch (e) {\n", - " console.log(\n", - " \"No handler for the '\" + msg_type + \"' message type: \",\n", - " msg\n", - " );\n", - " return;\n", - " }\n", - "\n", - " if (callback) {\n", - " try {\n", - " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", - " callback(fig, msg);\n", - " } catch (e) {\n", - " console.log(\n", - " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", - " e,\n", - " e.stack,\n", - " msg\n", - " );\n", - " }\n", - " }\n", - " };\n", - "};\n", - "\n", - "// from https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", - "mpl.findpos = function (e) {\n", - " //this section is from http://www.quirksmode.org/js/events_properties.html\n", - " var targ;\n", - " if (!e) {\n", - " e = window.event;\n", - " }\n", - " if (e.target) {\n", - " targ = e.target;\n", - " } else if (e.srcElement) {\n", - " targ = e.srcElement;\n", - " }\n", - " if (targ.nodeType === 3) {\n", - " // defeat Safari bug\n", - " targ = targ.parentNode;\n", - " }\n", - "\n", - " // pageX,Y are the mouse positions relative to the document\n", - " var boundingRect = targ.getBoundingClientRect();\n", - " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", - " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n", - "\n", - " return { x: x, y: y };\n", - "};\n", - "\n", - "/*\n", - " * return a copy of an object with only non-object keys\n", - " * we need this to avoid circular references\n", - " * https://stackoverflow.com/a/24161582/3208463\n", - " */\n", - "function simpleKeys(original) {\n", - " return Object.keys(original).reduce(function (obj, key) {\n", - " if (typeof original[key] !== 'object') {\n", - " obj[key] = original[key];\n", - " }\n", - " return obj;\n", - " }, {});\n", - "}\n", - "\n", - "mpl.figure.prototype.mouse_event = function (event, name) {\n", - " var canvas_pos = mpl.findpos(event);\n", - "\n", - " if (name === 'button_press') {\n", - " this.canvas.focus();\n", - " this.canvas_div.focus();\n", - " }\n", - "\n", - " var x = canvas_pos.x * this.ratio;\n", - " var y = canvas_pos.y * this.ratio;\n", - "\n", - " this.send_message(name, {\n", - " x: x,\n", - " y: y,\n", - " button: event.button,\n", - " step: event.step,\n", - " guiEvent: simpleKeys(event),\n", - " });\n", - "\n", - " /* This prevents the web browser from automatically changing to\n", - " * the text insertion cursor when the button is pressed. We want\n", - " * to control all of the cursor setting manually through the\n", - " * 'cursor' event from matplotlib */\n", - " event.preventDefault();\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n", - " // Handle any extra behaviour associated with a key event\n", - "};\n", - "\n", - "mpl.figure.prototype.key_event = function (event, name) {\n", - " // Prevent repeat events\n", - " if (name === 'key_press') {\n", - " if (event.key === this._key) {\n", - " return;\n", - " } else {\n", - " this._key = event.key;\n", - " }\n", - " }\n", - " if (name === 'key_release') {\n", - " this._key = null;\n", - " }\n", - "\n", - " var value = '';\n", - " if (event.ctrlKey && event.key !== 'Control') {\n", - " value += 'ctrl+';\n", - " }\n", - " else if (event.altKey && event.key !== 'Alt') {\n", - " value += 'alt+';\n", - " }\n", - " else if (event.shiftKey && event.key !== 'Shift') {\n", - " value += 'shift+';\n", - " }\n", - "\n", - " value += 'k' + event.key;\n", - "\n", - " this._key_event_extra(event, name);\n", - "\n", - " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n", - " if (name === 'download') {\n", - " this.handle_save(this, null);\n", - " } else {\n", - " this.send_message('toolbar_button', { name: name });\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n", - " this.message.textContent = tooltip;\n", - "};\n", - "\n", - "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", - "// prettier-ignore\n", - "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n", - "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", - "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", - "\n", - "mpl.default_extension = \"png\";/* global mpl */\n", - "\n", - "var comm_websocket_adapter = function (comm) {\n", - " // Create a \"websocket\"-like object which calls the given IPython comm\n", - " // object with the appropriate methods. Currently this is a non binary\n", - " // socket, so there is still some room for performance tuning.\n", - " var ws = {};\n", - "\n", - " ws.binaryType = comm.kernel.ws.binaryType;\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " function updateReadyState(_event) {\n", - " if (comm.kernel.ws) {\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " } else {\n", - " ws.readyState = 3; // Closed state.\n", - " }\n", - " }\n", - " comm.kernel.ws.addEventListener('open', updateReadyState);\n", - " comm.kernel.ws.addEventListener('close', updateReadyState);\n", - " comm.kernel.ws.addEventListener('error', updateReadyState);\n", - "\n", - " ws.close = function () {\n", - " comm.close();\n", - " };\n", - " ws.send = function (m) {\n", - " //console.log('sending', m);\n", - " comm.send(m);\n", - " };\n", - " // Register the callback with on_msg.\n", - " comm.on_msg(function (msg) {\n", - " //console.log('receiving', msg['content']['data'], msg);\n", - " var data = msg['content']['data'];\n", - " if (data['blob'] !== undefined) {\n", - " data = {\n", - " data: new Blob(msg['buffers'], { type: data['blob'] }),\n", - " };\n", - " }\n", - " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", - " ws.onmessage(data);\n", - " });\n", - " return ws;\n", - "};\n", - "\n", - "mpl.mpl_figure_comm = function (comm, msg) {\n", - " // This is the function which gets called when the mpl process\n", - " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", - "\n", - " var id = msg.content.data.id;\n", - " // Get hold of the div created by the display call when the Comm\n", - " // socket was opened in Python.\n", - " var element = document.getElementById(id);\n", - " var ws_proxy = comm_websocket_adapter(comm);\n", - "\n", - " function ondownload(figure, _format) {\n", - " window.open(figure.canvas.toDataURL());\n", - " }\n", - "\n", - " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n", - "\n", - " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", - " // web socket which is closed, not our websocket->open comm proxy.\n", - " ws_proxy.onopen();\n", - "\n", - " fig.parent_element = element;\n", - " fig.cell_info = mpl.find_output_cell(\"
\");\n", - " if (!fig.cell_info) {\n", - " console.error('Failed to find cell for figure', id, fig);\n", - " return;\n", - " }\n", - " fig.cell_info[0].output_area.element.on(\n", - " 'cleared',\n", - " { fig: fig },\n", - " fig._remove_fig_handler\n", - " );\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_close = function (fig, msg) {\n", - " var width = fig.canvas.width / fig.ratio;\n", - " fig.cell_info[0].output_area.element.off(\n", - " 'cleared',\n", - " fig._remove_fig_handler\n", - " );\n", - " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n", - "\n", - " // Update the output cell to use the data from the current canvas.\n", - " fig.push_to_output();\n", - " var dataURL = fig.canvas.toDataURL();\n", - " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", - " // the notebook keyboard shortcuts fail.\n", - " IPython.keyboard_manager.enable();\n", - " fig.parent_element.innerHTML =\n", - " '';\n", - " fig.close_ws(fig, msg);\n", - "};\n", - "\n", - "mpl.figure.prototype.close_ws = function (fig, msg) {\n", - " fig.send_message('closing', msg);\n", - " // fig.ws.close()\n", - "};\n", - "\n", - "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n", - " // Turn the data on the canvas into data in the output cell.\n", - " var width = this.canvas.width / this.ratio;\n", - " var dataURL = this.canvas.toDataURL();\n", - " this.cell_info[1]['text/html'] =\n", - " '';\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Tell IPython that the notebook contents must change.\n", - " IPython.notebook.set_dirty(true);\n", - " this.send_message('ack', {});\n", - " var fig = this;\n", - " // Wait a second, then push the new image to the DOM so\n", - " // that it is saved nicely (might be nice to debounce this).\n", - " setTimeout(function () {\n", - " fig.push_to_output();\n", - " }, 1000);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'btn-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " var button;\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " continue;\n", - " }\n", - "\n", - " button = fig.buttons[name] = document.createElement('button');\n", - " button.classList = 'btn btn-default';\n", - " button.href = '#';\n", - " button.title = name;\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message pull-right';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = document.createElement('div');\n", - " buttongrp.classList = 'btn-group inline pull-right';\n", - " button = document.createElement('button');\n", - " button.classList = 'btn btn-mini btn-primary';\n", - " button.href = '#';\n", - " button.title = 'Stop Interaction';\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', function (_evt) {\n", - " fig.handle_close(fig, {});\n", - " });\n", - " button.addEventListener(\n", - " 'mouseover',\n", - " on_mouseover_closure('Stop Interaction')\n", - " );\n", - " buttongrp.appendChild(button);\n", - " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", - " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", - "};\n", - "\n", - "mpl.figure.prototype._remove_fig_handler = function (event) {\n", - " var fig = event.data.fig;\n", - " if (event.target !== this) {\n", - " // Ignore bubbled events from children.\n", - " return;\n", - " }\n", - " fig.close_ws(fig, {});\n", - "};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (el) {\n", - " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (el) {\n", - " // this is important to make the div 'focusable\n", - " el.setAttribute('tabindex', 0);\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " } else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (event, _name) {\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which === 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " fig.ondownload(fig, null);\n", - "};\n", - "\n", - "mpl.find_output_cell = function (html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i = 0; i < ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code') {\n", - " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] === html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "};\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel !== null) {\n", - " IPython.notebook.kernel.comm_manager.register_target(\n", - " 'matplotlib',\n", - " mpl.mpl_figure_comm\n", - " );\n", - "}\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Clear the previously compiled operator\n", - "pde.clear_operators()\n", - "\n", - "# and run it forward\n", - "traces = await pde(shot.wavelets, vp, rho, problem=sub_problem)\n", - "\n", - "# Plot the resulting traces\n", - "_ = traces.plot()\n", - "traces.plot_one(60)" - ] - }, - { - "cell_type": "markdown", - "id": "twelve-township", - "metadata": {}, - "source": [ - "## Variable density and attenuation\n", - "\n", - "We can also add some attenuation to our acoustic run by creating a further scalar field." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "interested-police", - "metadata": {}, - "outputs": [ - { - "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "/* global mpl */\n", - "window.mpl = {};\n", - "\n", - "mpl.get_websocket_type = function () {\n", - " if (typeof WebSocket !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof MozWebSocket !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert(\n", - " 'Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.'\n", - " );\n", - " }\n", - "};\n", - "\n", - "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = this.ws.binaryType !== undefined;\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById('mpl-warnings');\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent =\n", - " 'This browser does not support binary websocket messages. ' +\n", - " 'Performance may be slow.';\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = document.createElement('div');\n", - " this.root.setAttribute('style', 'display: inline-block');\n", - " this._root_extra_style(this.root);\n", - "\n", - " parent_element.appendChild(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message('supports_binary', { value: fig.supports_binary });\n", - " fig.send_message('send_image_mode', {});\n", - " if (fig.ratio !== 1) {\n", - " fig.send_message('set_device_pixel_ratio', {\n", - " device_pixel_ratio: fig.ratio,\n", - " });\n", - " }\n", - " fig.send_message('refresh', {});\n", - " };\n", - "\n", - " this.imageObj.onload = function () {\n", - " if (fig.image_mode === 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function () {\n", - " fig.ws.close();\n", - " };\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "};\n", - "\n", - "mpl.figure.prototype._init_header = function () {\n", - " var titlebar = document.createElement('div');\n", - " titlebar.classList =\n", - " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", - " var titletext = document.createElement('div');\n", - " titletext.classList = 'ui-dialog-title';\n", - " titletext.setAttribute(\n", - " 'style',\n", - " 'width: 100%; text-align: center; padding: 3px;'\n", - " );\n", - " titlebar.appendChild(titletext);\n", - " this.root.appendChild(titlebar);\n", - " this.header = titletext;\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._init_canvas = function () {\n", - " var fig = this;\n", - "\n", - " var canvas_div = (this.canvas_div = document.createElement('div'));\n", - " canvas_div.setAttribute(\n", - " 'style',\n", - " 'border: 1px solid #ddd;' +\n", - " 'box-sizing: content-box;' +\n", - " 'clear: both;' +\n", - " 'min-height: 1px;' +\n", - " 'min-width: 1px;' +\n", - " 'outline: 0;' +\n", - " 'overflow: hidden;' +\n", - " 'position: relative;' +\n", - " 'resize: both;'\n", - " );\n", - "\n", - " function on_keyboard_event_closure(name) {\n", - " return function (event) {\n", - " return fig.key_event(event, name);\n", - " };\n", - " }\n", - "\n", - " canvas_div.addEventListener(\n", - " 'keydown',\n", - " on_keyboard_event_closure('key_press')\n", - " );\n", - " canvas_div.addEventListener(\n", - " 'keyup',\n", - " on_keyboard_event_closure('key_release')\n", - " );\n", - "\n", - " this._canvas_extra_style(canvas_div);\n", - " this.root.appendChild(canvas_div);\n", - "\n", - " var canvas = (this.canvas = document.createElement('canvas'));\n", - " canvas.classList.add('mpl-canvas');\n", - " canvas.setAttribute('style', 'box-sizing: content-box;');\n", - "\n", - " this.context = canvas.getContext('2d');\n", - "\n", - " var backingStore =\n", - " this.context.backingStorePixelRatio ||\n", - " this.context.webkitBackingStorePixelRatio ||\n", - " this.context.mozBackingStorePixelRatio ||\n", - " this.context.msBackingStorePixelRatio ||\n", - " this.context.oBackingStorePixelRatio ||\n", - " this.context.backingStorePixelRatio ||\n", - " 1;\n", - "\n", - " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", - " 'canvas'\n", - " ));\n", - " rubberband_canvas.setAttribute(\n", - " 'style',\n", - " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", - " );\n", - "\n", - " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", - " if (this.ResizeObserver === undefined) {\n", - " if (window.ResizeObserver !== undefined) {\n", - " this.ResizeObserver = window.ResizeObserver;\n", - " } else {\n", - " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", - " this.ResizeObserver = obs.ResizeObserver;\n", - " }\n", - " }\n", - "\n", - " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", - " var nentries = entries.length;\n", - " for (var i = 0; i < nentries; i++) {\n", - " var entry = entries[i];\n", - " var width, height;\n", - " if (entry.contentBoxSize) {\n", - " if (entry.contentBoxSize instanceof Array) {\n", - " // Chrome 84 implements new version of spec.\n", - " width = entry.contentBoxSize[0].inlineSize;\n", - " height = entry.contentBoxSize[0].blockSize;\n", - " } else {\n", - " // Firefox implements old version of spec.\n", - " width = entry.contentBoxSize.inlineSize;\n", - " height = entry.contentBoxSize.blockSize;\n", - " }\n", - " } else {\n", - " // Chrome <84 implements even older version of spec.\n", - " width = entry.contentRect.width;\n", - " height = entry.contentRect.height;\n", - " }\n", - "\n", - " // Keep the size of the canvas and rubber band canvas in sync with\n", - " // the canvas container.\n", - " if (entry.devicePixelContentBoxSize) {\n", - " // Chrome 84 implements new version of spec.\n", - " canvas.setAttribute(\n", - " 'width',\n", - " entry.devicePixelContentBoxSize[0].inlineSize\n", - " );\n", - " canvas.setAttribute(\n", - " 'height',\n", - " entry.devicePixelContentBoxSize[0].blockSize\n", - " );\n", - " } else {\n", - " canvas.setAttribute('width', width * fig.ratio);\n", - " canvas.setAttribute('height', height * fig.ratio);\n", - " }\n", - " canvas.setAttribute(\n", - " 'style',\n", - " 'width: ' + width + 'px; height: ' + height + 'px;'\n", - " );\n", - "\n", - " rubberband_canvas.setAttribute('width', width);\n", - " rubberband_canvas.setAttribute('height', height);\n", - "\n", - " // And update the size in Python. We ignore the initial 0/0 size\n", - " // that occurs as the element is placed into the DOM, which should\n", - " // otherwise not happen due to the minimum size styling.\n", - " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", - " fig.request_resize(width, height);\n", - " }\n", - " }\n", - " });\n", - " this.resizeObserverInstance.observe(canvas_div);\n", - "\n", - " function on_mouse_event_closure(name) {\n", - " return function (event) {\n", - " return fig.mouse_event(event, name);\n", - " };\n", - " }\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mousedown',\n", - " on_mouse_event_closure('button_press')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseup',\n", - " on_mouse_event_closure('button_release')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'dblclick',\n", - " on_mouse_event_closure('dblclick')\n", - " );\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband_canvas.addEventListener(\n", - " 'mousemove',\n", - " on_mouse_event_closure('motion_notify')\n", - " );\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseenter',\n", - " on_mouse_event_closure('figure_enter')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseleave',\n", - " on_mouse_event_closure('figure_leave')\n", - " );\n", - "\n", - " canvas_div.addEventListener('wheel', function (event) {\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " on_mouse_event_closure('scroll')(event);\n", - " });\n", - "\n", - " canvas_div.appendChild(canvas);\n", - " canvas_div.appendChild(rubberband_canvas);\n", - "\n", - " this.rubberband_context = rubberband_canvas.getContext('2d');\n", - " this.rubberband_context.strokeStyle = '#000000';\n", - "\n", - " this._resize_canvas = function (width, height, forward) {\n", - " if (forward) {\n", - " canvas_div.style.width = width + 'px';\n", - " canvas_div.style.height = height + 'px';\n", - " }\n", - " };\n", - "\n", - " // Disable right mouse context menu.\n", - " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n", - " event.preventDefault();\n", - " return false;\n", - " });\n", - "\n", - " function set_focus() {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'mpl-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " continue;\n", - " }\n", - "\n", - " var button = (fig.buttons[name] = document.createElement('button'));\n", - " button.classList = 'mpl-widget';\n", - " button.setAttribute('role', 'button');\n", - " button.setAttribute('aria-disabled', 'false');\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - "\n", - " var icon_img = document.createElement('img');\n", - " icon_img.src = '_images/' + image + '.png';\n", - " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", - " icon_img.alt = tooltip;\n", - " button.appendChild(icon_img);\n", - "\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " var fmt_picker = document.createElement('select');\n", - " fmt_picker.classList = 'mpl-widget';\n", - " toolbar.appendChild(fmt_picker);\n", - " this.format_dropdown = fmt_picker;\n", - "\n", - " for (var ind in mpl.extensions) {\n", - " var fmt = mpl.extensions[ind];\n", - " var option = document.createElement('option');\n", - " option.selected = fmt === mpl.default_extension;\n", - " option.innerHTML = fmt;\n", - " fmt_picker.appendChild(option);\n", - " }\n", - "\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "};\n", - "\n", - "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n", - " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", - " // which will in turn request a refresh of the image.\n", - " this.send_message('resize', { width: x_pixels, height: y_pixels });\n", - "};\n", - "\n", - "mpl.figure.prototype.send_message = function (type, properties) {\n", - " properties['type'] = type;\n", - " properties['figure_id'] = this.id;\n", - " this.ws.send(JSON.stringify(properties));\n", - "};\n", - "\n", - "mpl.figure.prototype.send_draw_message = function () {\n", - " if (!this.waiting) {\n", - " this.waiting = true;\n", - " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " var format_dropdown = fig.format_dropdown;\n", - " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", - " fig.ondownload(fig, format);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_resize = function (fig, msg) {\n", - " var size = msg['size'];\n", - " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n", - " fig._resize_canvas(size[0], size[1], msg['forward']);\n", - " fig.send_message('refresh', {});\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", - " var x0 = msg['x0'] / fig.ratio;\n", - " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", - " var x1 = msg['x1'] / fig.ratio;\n", - " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n", - " x0 = Math.floor(x0) + 0.5;\n", - " y0 = Math.floor(y0) + 0.5;\n", - " x1 = Math.floor(x1) + 0.5;\n", - " y1 = Math.floor(y1) + 0.5;\n", - " var min_x = Math.min(x0, x1);\n", - " var min_y = Math.min(y0, y1);\n", - " var width = Math.abs(x1 - x0);\n", - " var height = Math.abs(y1 - y0);\n", - "\n", - " fig.rubberband_context.clearRect(\n", - " 0,\n", - " 0,\n", - " fig.canvas.width / fig.ratio,\n", - " fig.canvas.height / fig.ratio\n", - " );\n", - "\n", - " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n", - " // Updates the figure title.\n", - " fig.header.textContent = msg['label'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n", - " fig.rubberband_canvas.style.cursor = msg['cursor'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_message = function (fig, msg) {\n", - " fig.message.textContent = msg['message'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n", - " // Request the server to send over a new figure.\n", - " fig.send_draw_message();\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n", - " fig.image_mode = msg['mode'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n", - " for (var key in msg) {\n", - " if (!(key in fig.buttons)) {\n", - " continue;\n", - " }\n", - " fig.buttons[key].disabled = !msg[key];\n", - " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", - " if (msg['mode'] === 'PAN') {\n", - " fig.buttons['Pan'].classList.add('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " } else if (msg['mode'] === 'ZOOM') {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.add('active');\n", - " } else {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Called whenever the canvas gets updated.\n", - " this.send_message('ack', {});\n", - "};\n", - "\n", - "// A function to construct a web socket function for onmessage handling.\n", - "// Called in the figure constructor.\n", - "mpl.figure.prototype._make_on_message_function = function (fig) {\n", - " return function socket_on_message(evt) {\n", - " if (evt.data instanceof Blob) {\n", - " var img = evt.data;\n", - " if (img.type !== 'image/png') {\n", - " /* FIXME: We get \"Resource interpreted as Image but\n", - " * transferred with MIME type text/plain:\" errors on\n", - " * Chrome. But how to set the MIME type? It doesn't seem\n", - " * to be part of the websocket stream */\n", - " img.type = 'image/png';\n", - " }\n", - "\n", - " /* Free the memory for the previous frames */\n", - " if (fig.imageObj.src) {\n", - " (window.URL || window.webkitURL).revokeObjectURL(\n", - " fig.imageObj.src\n", - " );\n", - " }\n", - "\n", - " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", - " img\n", - " );\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " } else if (\n", - " typeof evt.data === 'string' &&\n", - " evt.data.slice(0, 21) === 'data:image/png;base64'\n", - " ) {\n", - " fig.imageObj.src = evt.data;\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - "\n", - " var msg = JSON.parse(evt.data);\n", - " var msg_type = msg['type'];\n", - "\n", - " // Call the \"handle_{type}\" callback, which takes\n", - " // the figure and JSON message as its only arguments.\n", - " try {\n", - " var callback = fig['handle_' + msg_type];\n", - " } catch (e) {\n", - " console.log(\n", - " \"No handler for the '\" + msg_type + \"' message type: \",\n", - " msg\n", - " );\n", - " return;\n", - " }\n", - "\n", - " if (callback) {\n", - " try {\n", - " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", - " callback(fig, msg);\n", - " } catch (e) {\n", - " console.log(\n", - " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", - " e,\n", - " e.stack,\n", - " msg\n", - " );\n", - " }\n", - " }\n", - " };\n", - "};\n", - "\n", - "// from https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", - "mpl.findpos = function (e) {\n", - " //this section is from http://www.quirksmode.org/js/events_properties.html\n", - " var targ;\n", - " if (!e) {\n", - " e = window.event;\n", - " }\n", - " if (e.target) {\n", - " targ = e.target;\n", - " } else if (e.srcElement) {\n", - " targ = e.srcElement;\n", - " }\n", - " if (targ.nodeType === 3) {\n", - " // defeat Safari bug\n", - " targ = targ.parentNode;\n", - " }\n", - "\n", - " // pageX,Y are the mouse positions relative to the document\n", - " var boundingRect = targ.getBoundingClientRect();\n", - " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", - " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n", - "\n", - " return { x: x, y: y };\n", - "};\n", - "\n", - "/*\n", - " * return a copy of an object with only non-object keys\n", - " * we need this to avoid circular references\n", - " * https://stackoverflow.com/a/24161582/3208463\n", - " */\n", - "function simpleKeys(original) {\n", - " return Object.keys(original).reduce(function (obj, key) {\n", - " if (typeof original[key] !== 'object') {\n", - " obj[key] = original[key];\n", - " }\n", - " return obj;\n", - " }, {});\n", - "}\n", - "\n", - "mpl.figure.prototype.mouse_event = function (event, name) {\n", - " var canvas_pos = mpl.findpos(event);\n", - "\n", - " if (name === 'button_press') {\n", - " this.canvas.focus();\n", - " this.canvas_div.focus();\n", - " }\n", - "\n", - " var x = canvas_pos.x * this.ratio;\n", - " var y = canvas_pos.y * this.ratio;\n", - "\n", - " this.send_message(name, {\n", - " x: x,\n", - " y: y,\n", - " button: event.button,\n", - " step: event.step,\n", - " guiEvent: simpleKeys(event),\n", - " });\n", - "\n", - " /* This prevents the web browser from automatically changing to\n", - " * the text insertion cursor when the button is pressed. We want\n", - " * to control all of the cursor setting manually through the\n", - " * 'cursor' event from matplotlib */\n", - " event.preventDefault();\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n", - " // Handle any extra behaviour associated with a key event\n", - "};\n", - "\n", - "mpl.figure.prototype.key_event = function (event, name) {\n", - " // Prevent repeat events\n", - " if (name === 'key_press') {\n", - " if (event.key === this._key) {\n", - " return;\n", - " } else {\n", - " this._key = event.key;\n", - " }\n", - " }\n", - " if (name === 'key_release') {\n", - " this._key = null;\n", - " }\n", - "\n", - " var value = '';\n", - " if (event.ctrlKey && event.key !== 'Control') {\n", - " value += 'ctrl+';\n", - " }\n", - " else if (event.altKey && event.key !== 'Alt') {\n", - " value += 'alt+';\n", - " }\n", - " else if (event.shiftKey && event.key !== 'Shift') {\n", - " value += 'shift+';\n", - " }\n", - "\n", - " value += 'k' + event.key;\n", - "\n", - " this._key_event_extra(event, name);\n", - "\n", - " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n", - " if (name === 'download') {\n", - " this.handle_save(this, null);\n", - " } else {\n", - " this.send_message('toolbar_button', { name: name });\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n", - " this.message.textContent = tooltip;\n", - "};\n", - "\n", - "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", - "// prettier-ignore\n", - "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n", - "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", - "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", - "\n", - "mpl.default_extension = \"png\";/* global mpl */\n", - "\n", - "var comm_websocket_adapter = function (comm) {\n", - " // Create a \"websocket\"-like object which calls the given IPython comm\n", - " // object with the appropriate methods. Currently this is a non binary\n", - " // socket, so there is still some room for performance tuning.\n", - " var ws = {};\n", - "\n", - " ws.binaryType = comm.kernel.ws.binaryType;\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " function updateReadyState(_event) {\n", - " if (comm.kernel.ws) {\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " } else {\n", - " ws.readyState = 3; // Closed state.\n", - " }\n", - " }\n", - " comm.kernel.ws.addEventListener('open', updateReadyState);\n", - " comm.kernel.ws.addEventListener('close', updateReadyState);\n", - " comm.kernel.ws.addEventListener('error', updateReadyState);\n", - "\n", - " ws.close = function () {\n", - " comm.close();\n", - " };\n", - " ws.send = function (m) {\n", - " //console.log('sending', m);\n", - " comm.send(m);\n", - " };\n", - " // Register the callback with on_msg.\n", - " comm.on_msg(function (msg) {\n", - " //console.log('receiving', msg['content']['data'], msg);\n", - " var data = msg['content']['data'];\n", - " if (data['blob'] !== undefined) {\n", - " data = {\n", - " data: new Blob(msg['buffers'], { type: data['blob'] }),\n", - " };\n", - " }\n", - " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", - " ws.onmessage(data);\n", - " });\n", - " return ws;\n", - "};\n", - "\n", - "mpl.mpl_figure_comm = function (comm, msg) {\n", - " // This is the function which gets called when the mpl process\n", - " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", - "\n", - " var id = msg.content.data.id;\n", - " // Get hold of the div created by the display call when the Comm\n", - " // socket was opened in Python.\n", - " var element = document.getElementById(id);\n", - " var ws_proxy = comm_websocket_adapter(comm);\n", - "\n", - " function ondownload(figure, _format) {\n", - " window.open(figure.canvas.toDataURL());\n", - " }\n", - "\n", - " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n", - "\n", - " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", - " // web socket which is closed, not our websocket->open comm proxy.\n", - " ws_proxy.onopen();\n", - "\n", - " fig.parent_element = element;\n", - " fig.cell_info = mpl.find_output_cell(\"
\");\n", - " if (!fig.cell_info) {\n", - " console.error('Failed to find cell for figure', id, fig);\n", - " return;\n", - " }\n", - " fig.cell_info[0].output_area.element.on(\n", - " 'cleared',\n", - " { fig: fig },\n", - " fig._remove_fig_handler\n", - " );\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_close = function (fig, msg) {\n", - " var width = fig.canvas.width / fig.ratio;\n", - " fig.cell_info[0].output_area.element.off(\n", - " 'cleared',\n", - " fig._remove_fig_handler\n", - " );\n", - " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n", - "\n", - " // Update the output cell to use the data from the current canvas.\n", - " fig.push_to_output();\n", - " var dataURL = fig.canvas.toDataURL();\n", - " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", - " // the notebook keyboard shortcuts fail.\n", - " IPython.keyboard_manager.enable();\n", - " fig.parent_element.innerHTML =\n", - " '';\n", - " fig.close_ws(fig, msg);\n", - "};\n", - "\n", - "mpl.figure.prototype.close_ws = function (fig, msg) {\n", - " fig.send_message('closing', msg);\n", - " // fig.ws.close()\n", - "};\n", - "\n", - "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n", - " // Turn the data on the canvas into data in the output cell.\n", - " var width = this.canvas.width / this.ratio;\n", - " var dataURL = this.canvas.toDataURL();\n", - " this.cell_info[1]['text/html'] =\n", - " '';\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Tell IPython that the notebook contents must change.\n", - " IPython.notebook.set_dirty(true);\n", - " this.send_message('ack', {});\n", - " var fig = this;\n", - " // Wait a second, then push the new image to the DOM so\n", - " // that it is saved nicely (might be nice to debounce this).\n", - " setTimeout(function () {\n", - " fig.push_to_output();\n", - " }, 1000);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'btn-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " var button;\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " continue;\n", - " }\n", - "\n", - " button = fig.buttons[name] = document.createElement('button');\n", - " button.classList = 'btn btn-default';\n", - " button.href = '#';\n", - " button.title = name;\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message pull-right';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = document.createElement('div');\n", - " buttongrp.classList = 'btn-group inline pull-right';\n", - " button = document.createElement('button');\n", - " button.classList = 'btn btn-mini btn-primary';\n", - " button.href = '#';\n", - " button.title = 'Stop Interaction';\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', function (_evt) {\n", - " fig.handle_close(fig, {});\n", - " });\n", - " button.addEventListener(\n", - " 'mouseover',\n", - " on_mouseover_closure('Stop Interaction')\n", - " );\n", - " buttongrp.appendChild(button);\n", - " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", - " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", - "};\n", - "\n", - "mpl.figure.prototype._remove_fig_handler = function (event) {\n", - " var fig = event.data.fig;\n", - " if (event.target !== this) {\n", - " // Ignore bubbled events from children.\n", - " return;\n", - " }\n", - " fig.close_ws(fig, {});\n", - "};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (el) {\n", - " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (el) {\n", - " // this is important to make the div 'focusable\n", - " el.setAttribute('tabindex', 0);\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " } else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (event, _name) {\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which === 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " fig.ondownload(fig, null);\n", - "};\n", - "\n", - "mpl.find_output_cell = function (html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i = 0; i < ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code') {\n", - " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] === html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "};\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel !== null) {\n", - " IPython.notebook.kernel.comm_manager.register_target(\n", - " 'matplotlib',\n", - " mpl.mpl_figure_comm\n", - " );\n", - "}\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "alpha = ScalarField(name='alpha', grid=problem.grid)\n", - "alpha.fill(1.) # [Np/m]\n", - "\n", - "problem.medium.add(alpha)\n", - "\n", - "# Plot the field\n", - "alpha.plot()" - ] - }, - { - "cell_type": "markdown", - "id": "asian-leader", - "metadata": {}, - "source": [ - "And then running the PDE operator as before using the new field." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "exotic-healing", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(ShotID 0) Preparing to run state for shot\n", - "(ShotID 0) Estimated bandwidth for the propagated wavelet 0.260-0.730 MHz\n", - "(ShotID 0) Spatial grid spacing (0.400 mm | 5.137 PPW) is below dispersion limit (0.411 mm | 5.000 PPW)\n", - "(ShotID 0) Time grid spacing (0.050 μs | 18%) is below OT2 limit (0.120 μs)\n", - "(ShotID 0) Selected undersampling level 6\n", - "(ShotID 0) Selected time stepping scheme OT2\n", - "Operator `acoustic_iso_state` instance configuration:\n", - "\t * name=acoustic_iso_state\n", - "\t * subs={h_x: 0.0004, h_y: 0.0004, dt: 5e-08}\n", - "\t * opt=advanced-fsg\n", - "\t * devicecreate=(p(t, x, y),)\n", - "Operator `acoustic_iso_state` generated in 1.63 s\n", - " * lowering.Clusters: 0.75 s (46.3 %)\n", - " * specializing.Clusters: 0.54 s (33.3 %)\n", - " * lowering.Expressions: 0.50 s (30.9 %)\n", - " * lowering.IET: 0.35 s (21.6 %)\n", - "Flops reduction after symbolic optimization: [503 --> 88]\n", - "recompiling for non-existent cache dir (/tmp/devito-codepy-uid1000/ed7f899/c0ececf9361e4cbb12e180a4c690a784).\n", - "gcc -march=native -O3 -g -fPIC -Wall -std=c99 -Wno-unused-result -Wno-unused-variable -Wno-unused-but-set-variable -ffast-math -shared -fopenmp /tmp/devito-jitcache-uid1000/ed7f8990f253d9c3122a8afde370e2172e15ebdd.c -lm -o /tmp/devito-jitcache-uid1000/ed7f8990f253d9c3122a8afde370e2172e15ebdd.so\n", - "Operator `acoustic_iso_state` jit-compiled `/tmp/devito-jitcache-uid1000/ed7f8990f253d9c3122a8afde370e2172e15ebdd.c` in 0.29 s with `CustomCompiler`\n", - "(ShotID 0) Using inhomogeneous density\n", - "(ShotID 0) Using attenuation with power 0\n", - "(ShotID 0) Running state equation for shot\n", - "AutoTuner: could not perform any runs\n", - "Operator `acoustic_iso_state` ran in 0.15 s\n", - "Global performance: [OI=1.80, 98.22 GFlops/s, 1.20 GPts/s]\n", - "Local performance:\n", - " * section0<<1999,309,309>,<1999,300,300>> ran in 0.15 s [OI=1.80, 103.70 GFlops/s, 1.27 GPts/s]\n", - " * section1<<1999,1,2,2>,<1999,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - " * section2<<1999,120>,<1999,120,2,2>> ran in 0.01 s [OI=1.84, 2.92 GFlops/s, 0.00 GPts/s]\n", - "Performance[mode=advanced-fsg] arguments: {'nthreads': 6, 'nthreads_nonaffine': 6}\n", - "(ShotID 0) Completed state equation run for shot\n" - ] - }, - { - "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "/* global mpl */\n", - "window.mpl = {};\n", - "\n", - "mpl.get_websocket_type = function () {\n", - " if (typeof WebSocket !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof MozWebSocket !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert(\n", - " 'Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.'\n", - " );\n", - " }\n", - "};\n", - "\n", - "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = this.ws.binaryType !== undefined;\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById('mpl-warnings');\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent =\n", - " 'This browser does not support binary websocket messages. ' +\n", - " 'Performance may be slow.';\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = document.createElement('div');\n", - " this.root.setAttribute('style', 'display: inline-block');\n", - " this._root_extra_style(this.root);\n", - "\n", - " parent_element.appendChild(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message('supports_binary', { value: fig.supports_binary });\n", - " fig.send_message('send_image_mode', {});\n", - " if (fig.ratio !== 1) {\n", - " fig.send_message('set_device_pixel_ratio', {\n", - " device_pixel_ratio: fig.ratio,\n", - " });\n", - " }\n", - " fig.send_message('refresh', {});\n", - " };\n", - "\n", - " this.imageObj.onload = function () {\n", - " if (fig.image_mode === 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function () {\n", - " fig.ws.close();\n", - " };\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "};\n", - "\n", - "mpl.figure.prototype._init_header = function () {\n", - " var titlebar = document.createElement('div');\n", - " titlebar.classList =\n", - " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", - " var titletext = document.createElement('div');\n", - " titletext.classList = 'ui-dialog-title';\n", - " titletext.setAttribute(\n", - " 'style',\n", - " 'width: 100%; text-align: center; padding: 3px;'\n", - " );\n", - " titlebar.appendChild(titletext);\n", - " this.root.appendChild(titlebar);\n", - " this.header = titletext;\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._init_canvas = function () {\n", - " var fig = this;\n", - "\n", - " var canvas_div = (this.canvas_div = document.createElement('div'));\n", - " canvas_div.setAttribute(\n", - " 'style',\n", - " 'border: 1px solid #ddd;' +\n", - " 'box-sizing: content-box;' +\n", - " 'clear: both;' +\n", - " 'min-height: 1px;' +\n", - " 'min-width: 1px;' +\n", - " 'outline: 0;' +\n", - " 'overflow: hidden;' +\n", - " 'position: relative;' +\n", - " 'resize: both;'\n", - " );\n", - "\n", - " function on_keyboard_event_closure(name) {\n", - " return function (event) {\n", - " return fig.key_event(event, name);\n", - " };\n", - " }\n", - "\n", - " canvas_div.addEventListener(\n", - " 'keydown',\n", - " on_keyboard_event_closure('key_press')\n", - " );\n", - " canvas_div.addEventListener(\n", - " 'keyup',\n", - " on_keyboard_event_closure('key_release')\n", - " );\n", - "\n", - " this._canvas_extra_style(canvas_div);\n", - " this.root.appendChild(canvas_div);\n", - "\n", - " var canvas = (this.canvas = document.createElement('canvas'));\n", - " canvas.classList.add('mpl-canvas');\n", - " canvas.setAttribute('style', 'box-sizing: content-box;');\n", - "\n", - " this.context = canvas.getContext('2d');\n", - "\n", - " var backingStore =\n", - " this.context.backingStorePixelRatio ||\n", - " this.context.webkitBackingStorePixelRatio ||\n", - " this.context.mozBackingStorePixelRatio ||\n", - " this.context.msBackingStorePixelRatio ||\n", - " this.context.oBackingStorePixelRatio ||\n", - " this.context.backingStorePixelRatio ||\n", - " 1;\n", - "\n", - " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", - " 'canvas'\n", - " ));\n", - " rubberband_canvas.setAttribute(\n", - " 'style',\n", - " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", - " );\n", - "\n", - " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", - " if (this.ResizeObserver === undefined) {\n", - " if (window.ResizeObserver !== undefined) {\n", - " this.ResizeObserver = window.ResizeObserver;\n", - " } else {\n", - " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", - " this.ResizeObserver = obs.ResizeObserver;\n", - " }\n", - " }\n", - "\n", - " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", - " var nentries = entries.length;\n", - " for (var i = 0; i < nentries; i++) {\n", - " var entry = entries[i];\n", - " var width, height;\n", - " if (entry.contentBoxSize) {\n", - " if (entry.contentBoxSize instanceof Array) {\n", - " // Chrome 84 implements new version of spec.\n", - " width = entry.contentBoxSize[0].inlineSize;\n", - " height = entry.contentBoxSize[0].blockSize;\n", - " } else {\n", - " // Firefox implements old version of spec.\n", - " width = entry.contentBoxSize.inlineSize;\n", - " height = entry.contentBoxSize.blockSize;\n", - " }\n", - " } else {\n", - " // Chrome <84 implements even older version of spec.\n", - " width = entry.contentRect.width;\n", - " height = entry.contentRect.height;\n", - " }\n", - "\n", - " // Keep the size of the canvas and rubber band canvas in sync with\n", - " // the canvas container.\n", - " if (entry.devicePixelContentBoxSize) {\n", - " // Chrome 84 implements new version of spec.\n", - " canvas.setAttribute(\n", - " 'width',\n", - " entry.devicePixelContentBoxSize[0].inlineSize\n", - " );\n", - " canvas.setAttribute(\n", - " 'height',\n", - " entry.devicePixelContentBoxSize[0].blockSize\n", - " );\n", - " } else {\n", - " canvas.setAttribute('width', width * fig.ratio);\n", - " canvas.setAttribute('height', height * fig.ratio);\n", - " }\n", - " canvas.setAttribute(\n", - " 'style',\n", - " 'width: ' + width + 'px; height: ' + height + 'px;'\n", - " );\n", - "\n", - " rubberband_canvas.setAttribute('width', width);\n", - " rubberband_canvas.setAttribute('height', height);\n", - "\n", - " // And update the size in Python. We ignore the initial 0/0 size\n", - " // that occurs as the element is placed into the DOM, which should\n", - " // otherwise not happen due to the minimum size styling.\n", - " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", - " fig.request_resize(width, height);\n", - " }\n", - " }\n", - " });\n", - " this.resizeObserverInstance.observe(canvas_div);\n", - "\n", - " function on_mouse_event_closure(name) {\n", - " return function (event) {\n", - " return fig.mouse_event(event, name);\n", - " };\n", - " }\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mousedown',\n", - " on_mouse_event_closure('button_press')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseup',\n", - " on_mouse_event_closure('button_release')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'dblclick',\n", - " on_mouse_event_closure('dblclick')\n", - " );\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband_canvas.addEventListener(\n", - " 'mousemove',\n", - " on_mouse_event_closure('motion_notify')\n", - " );\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseenter',\n", - " on_mouse_event_closure('figure_enter')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseleave',\n", - " on_mouse_event_closure('figure_leave')\n", - " );\n", - "\n", - " canvas_div.addEventListener('wheel', function (event) {\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " on_mouse_event_closure('scroll')(event);\n", - " });\n", - "\n", - " canvas_div.appendChild(canvas);\n", - " canvas_div.appendChild(rubberband_canvas);\n", - "\n", - " this.rubberband_context = rubberband_canvas.getContext('2d');\n", - " this.rubberband_context.strokeStyle = '#000000';\n", - "\n", - " this._resize_canvas = function (width, height, forward) {\n", - " if (forward) {\n", - " canvas_div.style.width = width + 'px';\n", - " canvas_div.style.height = height + 'px';\n", - " }\n", - " };\n", - "\n", - " // Disable right mouse context menu.\n", - " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n", - " event.preventDefault();\n", - " return false;\n", - " });\n", - "\n", - " function set_focus() {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'mpl-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " continue;\n", - " }\n", - "\n", - " var button = (fig.buttons[name] = document.createElement('button'));\n", - " button.classList = 'mpl-widget';\n", - " button.setAttribute('role', 'button');\n", - " button.setAttribute('aria-disabled', 'false');\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - "\n", - " var icon_img = document.createElement('img');\n", - " icon_img.src = '_images/' + image + '.png';\n", - " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", - " icon_img.alt = tooltip;\n", - " button.appendChild(icon_img);\n", - "\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " var fmt_picker = document.createElement('select');\n", - " fmt_picker.classList = 'mpl-widget';\n", - " toolbar.appendChild(fmt_picker);\n", - " this.format_dropdown = fmt_picker;\n", - "\n", - " for (var ind in mpl.extensions) {\n", - " var fmt = mpl.extensions[ind];\n", - " var option = document.createElement('option');\n", - " option.selected = fmt === mpl.default_extension;\n", - " option.innerHTML = fmt;\n", - " fmt_picker.appendChild(option);\n", - " }\n", - "\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "};\n", - "\n", - "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n", - " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", - " // which will in turn request a refresh of the image.\n", - " this.send_message('resize', { width: x_pixels, height: y_pixels });\n", - "};\n", - "\n", - "mpl.figure.prototype.send_message = function (type, properties) {\n", - " properties['type'] = type;\n", - " properties['figure_id'] = this.id;\n", - " this.ws.send(JSON.stringify(properties));\n", - "};\n", - "\n", - "mpl.figure.prototype.send_draw_message = function () {\n", - " if (!this.waiting) {\n", - " this.waiting = true;\n", - " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " var format_dropdown = fig.format_dropdown;\n", - " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", - " fig.ondownload(fig, format);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_resize = function (fig, msg) {\n", - " var size = msg['size'];\n", - " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n", - " fig._resize_canvas(size[0], size[1], msg['forward']);\n", - " fig.send_message('refresh', {});\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", - " var x0 = msg['x0'] / fig.ratio;\n", - " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", - " var x1 = msg['x1'] / fig.ratio;\n", - " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n", - " x0 = Math.floor(x0) + 0.5;\n", - " y0 = Math.floor(y0) + 0.5;\n", - " x1 = Math.floor(x1) + 0.5;\n", - " y1 = Math.floor(y1) + 0.5;\n", - " var min_x = Math.min(x0, x1);\n", - " var min_y = Math.min(y0, y1);\n", - " var width = Math.abs(x1 - x0);\n", - " var height = Math.abs(y1 - y0);\n", - "\n", - " fig.rubberband_context.clearRect(\n", - " 0,\n", - " 0,\n", - " fig.canvas.width / fig.ratio,\n", - " fig.canvas.height / fig.ratio\n", - " );\n", - "\n", - " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n", - " // Updates the figure title.\n", - " fig.header.textContent = msg['label'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n", - " fig.rubberband_canvas.style.cursor = msg['cursor'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_message = function (fig, msg) {\n", - " fig.message.textContent = msg['message'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n", - " // Request the server to send over a new figure.\n", - " fig.send_draw_message();\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n", - " fig.image_mode = msg['mode'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n", - " for (var key in msg) {\n", - " if (!(key in fig.buttons)) {\n", - " continue;\n", - " }\n", - " fig.buttons[key].disabled = !msg[key];\n", - " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", - " if (msg['mode'] === 'PAN') {\n", - " fig.buttons['Pan'].classList.add('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " } else if (msg['mode'] === 'ZOOM') {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.add('active');\n", - " } else {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Called whenever the canvas gets updated.\n", - " this.send_message('ack', {});\n", - "};\n", - "\n", - "// A function to construct a web socket function for onmessage handling.\n", - "// Called in the figure constructor.\n", - "mpl.figure.prototype._make_on_message_function = function (fig) {\n", - " return function socket_on_message(evt) {\n", - " if (evt.data instanceof Blob) {\n", - " var img = evt.data;\n", - " if (img.type !== 'image/png') {\n", - " /* FIXME: We get \"Resource interpreted as Image but\n", - " * transferred with MIME type text/plain:\" errors on\n", - " * Chrome. But how to set the MIME type? It doesn't seem\n", - " * to be part of the websocket stream */\n", - " img.type = 'image/png';\n", - " }\n", - "\n", - " /* Free the memory for the previous frames */\n", - " if (fig.imageObj.src) {\n", - " (window.URL || window.webkitURL).revokeObjectURL(\n", - " fig.imageObj.src\n", - " );\n", - " }\n", - "\n", - " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", - " img\n", - " );\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " } else if (\n", - " typeof evt.data === 'string' &&\n", - " evt.data.slice(0, 21) === 'data:image/png;base64'\n", - " ) {\n", - " fig.imageObj.src = evt.data;\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - "\n", - " var msg = JSON.parse(evt.data);\n", - " var msg_type = msg['type'];\n", - "\n", - " // Call the \"handle_{type}\" callback, which takes\n", - " // the figure and JSON message as its only arguments.\n", - " try {\n", - " var callback = fig['handle_' + msg_type];\n", - " } catch (e) {\n", - " console.log(\n", - " \"No handler for the '\" + msg_type + \"' message type: \",\n", - " msg\n", - " );\n", - " return;\n", - " }\n", - "\n", - " if (callback) {\n", - " try {\n", - " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", - " callback(fig, msg);\n", - " } catch (e) {\n", - " console.log(\n", - " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", - " e,\n", - " e.stack,\n", - " msg\n", - " );\n", - " }\n", - " }\n", - " };\n", - "};\n", - "\n", - "// from https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", - "mpl.findpos = function (e) {\n", - " //this section is from http://www.quirksmode.org/js/events_properties.html\n", - " var targ;\n", - " if (!e) {\n", - " e = window.event;\n", - " }\n", - " if (e.target) {\n", - " targ = e.target;\n", - " } else if (e.srcElement) {\n", - " targ = e.srcElement;\n", - " }\n", - " if (targ.nodeType === 3) {\n", - " // defeat Safari bug\n", - " targ = targ.parentNode;\n", - " }\n", - "\n", - " // pageX,Y are the mouse positions relative to the document\n", - " var boundingRect = targ.getBoundingClientRect();\n", - " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", - " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n", - "\n", - " return { x: x, y: y };\n", - "};\n", - "\n", - "/*\n", - " * return a copy of an object with only non-object keys\n", - " * we need this to avoid circular references\n", - " * https://stackoverflow.com/a/24161582/3208463\n", - " */\n", - "function simpleKeys(original) {\n", - " return Object.keys(original).reduce(function (obj, key) {\n", - " if (typeof original[key] !== 'object') {\n", - " obj[key] = original[key];\n", - " }\n", - " return obj;\n", - " }, {});\n", - "}\n", - "\n", - "mpl.figure.prototype.mouse_event = function (event, name) {\n", - " var canvas_pos = mpl.findpos(event);\n", - "\n", - " if (name === 'button_press') {\n", - " this.canvas.focus();\n", - " this.canvas_div.focus();\n", - " }\n", - "\n", - " var x = canvas_pos.x * this.ratio;\n", - " var y = canvas_pos.y * this.ratio;\n", - "\n", - " this.send_message(name, {\n", - " x: x,\n", - " y: y,\n", - " button: event.button,\n", - " step: event.step,\n", - " guiEvent: simpleKeys(event),\n", - " });\n", - "\n", - " /* This prevents the web browser from automatically changing to\n", - " * the text insertion cursor when the button is pressed. We want\n", - " * to control all of the cursor setting manually through the\n", - " * 'cursor' event from matplotlib */\n", - " event.preventDefault();\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n", - " // Handle any extra behaviour associated with a key event\n", - "};\n", - "\n", - "mpl.figure.prototype.key_event = function (event, name) {\n", - " // Prevent repeat events\n", - " if (name === 'key_press') {\n", - " if (event.key === this._key) {\n", - " return;\n", - " } else {\n", - " this._key = event.key;\n", - " }\n", - " }\n", - " if (name === 'key_release') {\n", - " this._key = null;\n", - " }\n", - "\n", - " var value = '';\n", - " if (event.ctrlKey && event.key !== 'Control') {\n", - " value += 'ctrl+';\n", - " }\n", - " else if (event.altKey && event.key !== 'Alt') {\n", - " value += 'alt+';\n", - " }\n", - " else if (event.shiftKey && event.key !== 'Shift') {\n", - " value += 'shift+';\n", - " }\n", - "\n", - " value += 'k' + event.key;\n", - "\n", - " this._key_event_extra(event, name);\n", - "\n", - " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n", - " if (name === 'download') {\n", - " this.handle_save(this, null);\n", - " } else {\n", - " this.send_message('toolbar_button', { name: name });\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n", - " this.message.textContent = tooltip;\n", - "};\n", - "\n", - "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", - "// prettier-ignore\n", - "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n", - "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", - "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", - "\n", - "mpl.default_extension = \"png\";/* global mpl */\n", - "\n", - "var comm_websocket_adapter = function (comm) {\n", - " // Create a \"websocket\"-like object which calls the given IPython comm\n", - " // object with the appropriate methods. Currently this is a non binary\n", - " // socket, so there is still some room for performance tuning.\n", - " var ws = {};\n", - "\n", - " ws.binaryType = comm.kernel.ws.binaryType;\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " function updateReadyState(_event) {\n", - " if (comm.kernel.ws) {\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " } else {\n", - " ws.readyState = 3; // Closed state.\n", - " }\n", - " }\n", - " comm.kernel.ws.addEventListener('open', updateReadyState);\n", - " comm.kernel.ws.addEventListener('close', updateReadyState);\n", - " comm.kernel.ws.addEventListener('error', updateReadyState);\n", - "\n", - " ws.close = function () {\n", - " comm.close();\n", - " };\n", - " ws.send = function (m) {\n", - " //console.log('sending', m);\n", - " comm.send(m);\n", - " };\n", - " // Register the callback with on_msg.\n", - " comm.on_msg(function (msg) {\n", - " //console.log('receiving', msg['content']['data'], msg);\n", - " var data = msg['content']['data'];\n", - " if (data['blob'] !== undefined) {\n", - " data = {\n", - " data: new Blob(msg['buffers'], { type: data['blob'] }),\n", - " };\n", - " }\n", - " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", - " ws.onmessage(data);\n", - " });\n", - " return ws;\n", - "};\n", - "\n", - "mpl.mpl_figure_comm = function (comm, msg) {\n", - " // This is the function which gets called when the mpl process\n", - " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", - "\n", - " var id = msg.content.data.id;\n", - " // Get hold of the div created by the display call when the Comm\n", - " // socket was opened in Python.\n", - " var element = document.getElementById(id);\n", - " var ws_proxy = comm_websocket_adapter(comm);\n", - "\n", - " function ondownload(figure, _format) {\n", - " window.open(figure.canvas.toDataURL());\n", - " }\n", - "\n", - " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n", - "\n", - " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", - " // web socket which is closed, not our websocket->open comm proxy.\n", - " ws_proxy.onopen();\n", - "\n", - " fig.parent_element = element;\n", - " fig.cell_info = mpl.find_output_cell(\"
\");\n", - " if (!fig.cell_info) {\n", - " console.error('Failed to find cell for figure', id, fig);\n", - " return;\n", - " }\n", - " fig.cell_info[0].output_area.element.on(\n", - " 'cleared',\n", - " { fig: fig },\n", - " fig._remove_fig_handler\n", - " );\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_close = function (fig, msg) {\n", - " var width = fig.canvas.width / fig.ratio;\n", - " fig.cell_info[0].output_area.element.off(\n", - " 'cleared',\n", - " fig._remove_fig_handler\n", - " );\n", - " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n", - "\n", - " // Update the output cell to use the data from the current canvas.\n", - " fig.push_to_output();\n", - " var dataURL = fig.canvas.toDataURL();\n", - " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", - " // the notebook keyboard shortcuts fail.\n", - " IPython.keyboard_manager.enable();\n", - " fig.parent_element.innerHTML =\n", - " '';\n", - " fig.close_ws(fig, msg);\n", - "};\n", - "\n", - "mpl.figure.prototype.close_ws = function (fig, msg) {\n", - " fig.send_message('closing', msg);\n", - " // fig.ws.close()\n", - "};\n", - "\n", - "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n", - " // Turn the data on the canvas into data in the output cell.\n", - " var width = this.canvas.width / this.ratio;\n", - " var dataURL = this.canvas.toDataURL();\n", - " this.cell_info[1]['text/html'] =\n", - " '';\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Tell IPython that the notebook contents must change.\n", - " IPython.notebook.set_dirty(true);\n", - " this.send_message('ack', {});\n", - " var fig = this;\n", - " // Wait a second, then push the new image to the DOM so\n", - " // that it is saved nicely (might be nice to debounce this).\n", - " setTimeout(function () {\n", - " fig.push_to_output();\n", - " }, 1000);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'btn-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " var button;\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " continue;\n", - " }\n", - "\n", - " button = fig.buttons[name] = document.createElement('button');\n", - " button.classList = 'btn btn-default';\n", - " button.href = '#';\n", - " button.title = name;\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message pull-right';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = document.createElement('div');\n", - " buttongrp.classList = 'btn-group inline pull-right';\n", - " button = document.createElement('button');\n", - " button.classList = 'btn btn-mini btn-primary';\n", - " button.href = '#';\n", - " button.title = 'Stop Interaction';\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', function (_evt) {\n", - " fig.handle_close(fig, {});\n", - " });\n", - " button.addEventListener(\n", - " 'mouseover',\n", - " on_mouseover_closure('Stop Interaction')\n", - " );\n", - " buttongrp.appendChild(button);\n", - " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", - " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", - "};\n", - "\n", - "mpl.figure.prototype._remove_fig_handler = function (event) {\n", - " var fig = event.data.fig;\n", - " if (event.target !== this) {\n", - " // Ignore bubbled events from children.\n", - " return;\n", - " }\n", - " fig.close_ws(fig, {});\n", - "};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (el) {\n", - " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (el) {\n", - " // this is important to make the div 'focusable\n", - " el.setAttribute('tabindex', 0);\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " } else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (event, _name) {\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which === 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " fig.ondownload(fig, null);\n", - "};\n", - "\n", - "mpl.find_output_cell = function (html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i = 0; i < ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code') {\n", - " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] === html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "};\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel !== null) {\n", - " IPython.notebook.kernel.comm_manager.register_target(\n", - " 'matplotlib',\n", - " mpl.mpl_figure_comm\n", - " );\n", - "}\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "/* global mpl */\n", - "window.mpl = {};\n", - "\n", - "mpl.get_websocket_type = function () {\n", - " if (typeof WebSocket !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof MozWebSocket !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert(\n", - " 'Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.'\n", - " );\n", - " }\n", - "};\n", - "\n", - "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = this.ws.binaryType !== undefined;\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById('mpl-warnings');\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent =\n", - " 'This browser does not support binary websocket messages. ' +\n", - " 'Performance may be slow.';\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = document.createElement('div');\n", - " this.root.setAttribute('style', 'display: inline-block');\n", - " this._root_extra_style(this.root);\n", - "\n", - " parent_element.appendChild(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message('supports_binary', { value: fig.supports_binary });\n", - " fig.send_message('send_image_mode', {});\n", - " if (fig.ratio !== 1) {\n", - " fig.send_message('set_device_pixel_ratio', {\n", - " device_pixel_ratio: fig.ratio,\n", - " });\n", - " }\n", - " fig.send_message('refresh', {});\n", - " };\n", - "\n", - " this.imageObj.onload = function () {\n", - " if (fig.image_mode === 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function () {\n", - " fig.ws.close();\n", - " };\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "};\n", - "\n", - "mpl.figure.prototype._init_header = function () {\n", - " var titlebar = document.createElement('div');\n", - " titlebar.classList =\n", - " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", - " var titletext = document.createElement('div');\n", - " titletext.classList = 'ui-dialog-title';\n", - " titletext.setAttribute(\n", - " 'style',\n", - " 'width: 100%; text-align: center; padding: 3px;'\n", - " );\n", - " titlebar.appendChild(titletext);\n", - " this.root.appendChild(titlebar);\n", - " this.header = titletext;\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._init_canvas = function () {\n", - " var fig = this;\n", - "\n", - " var canvas_div = (this.canvas_div = document.createElement('div'));\n", - " canvas_div.setAttribute(\n", - " 'style',\n", - " 'border: 1px solid #ddd;' +\n", - " 'box-sizing: content-box;' +\n", - " 'clear: both;' +\n", - " 'min-height: 1px;' +\n", - " 'min-width: 1px;' +\n", - " 'outline: 0;' +\n", - " 'overflow: hidden;' +\n", - " 'position: relative;' +\n", - " 'resize: both;'\n", - " );\n", - "\n", - " function on_keyboard_event_closure(name) {\n", - " return function (event) {\n", - " return fig.key_event(event, name);\n", - " };\n", - " }\n", - "\n", - " canvas_div.addEventListener(\n", - " 'keydown',\n", - " on_keyboard_event_closure('key_press')\n", - " );\n", - " canvas_div.addEventListener(\n", - " 'keyup',\n", - " on_keyboard_event_closure('key_release')\n", - " );\n", - "\n", - " this._canvas_extra_style(canvas_div);\n", - " this.root.appendChild(canvas_div);\n", - "\n", - " var canvas = (this.canvas = document.createElement('canvas'));\n", - " canvas.classList.add('mpl-canvas');\n", - " canvas.setAttribute('style', 'box-sizing: content-box;');\n", - "\n", - " this.context = canvas.getContext('2d');\n", - "\n", - " var backingStore =\n", - " this.context.backingStorePixelRatio ||\n", - " this.context.webkitBackingStorePixelRatio ||\n", - " this.context.mozBackingStorePixelRatio ||\n", - " this.context.msBackingStorePixelRatio ||\n", - " this.context.oBackingStorePixelRatio ||\n", - " this.context.backingStorePixelRatio ||\n", - " 1;\n", - "\n", - " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", - " 'canvas'\n", - " ));\n", - " rubberband_canvas.setAttribute(\n", - " 'style',\n", - " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", - " );\n", - "\n", - " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", - " if (this.ResizeObserver === undefined) {\n", - " if (window.ResizeObserver !== undefined) {\n", - " this.ResizeObserver = window.ResizeObserver;\n", - " } else {\n", - " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", - " this.ResizeObserver = obs.ResizeObserver;\n", - " }\n", - " }\n", - "\n", - " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", - " var nentries = entries.length;\n", - " for (var i = 0; i < nentries; i++) {\n", - " var entry = entries[i];\n", - " var width, height;\n", - " if (entry.contentBoxSize) {\n", - " if (entry.contentBoxSize instanceof Array) {\n", - " // Chrome 84 implements new version of spec.\n", - " width = entry.contentBoxSize[0].inlineSize;\n", - " height = entry.contentBoxSize[0].blockSize;\n", - " } else {\n", - " // Firefox implements old version of spec.\n", - " width = entry.contentBoxSize.inlineSize;\n", - " height = entry.contentBoxSize.blockSize;\n", - " }\n", - " } else {\n", - " // Chrome <84 implements even older version of spec.\n", - " width = entry.contentRect.width;\n", - " height = entry.contentRect.height;\n", - " }\n", - "\n", - " // Keep the size of the canvas and rubber band canvas in sync with\n", - " // the canvas container.\n", - " if (entry.devicePixelContentBoxSize) {\n", - " // Chrome 84 implements new version of spec.\n", - " canvas.setAttribute(\n", - " 'width',\n", - " entry.devicePixelContentBoxSize[0].inlineSize\n", - " );\n", - " canvas.setAttribute(\n", - " 'height',\n", - " entry.devicePixelContentBoxSize[0].blockSize\n", - " );\n", - " } else {\n", - " canvas.setAttribute('width', width * fig.ratio);\n", - " canvas.setAttribute('height', height * fig.ratio);\n", - " }\n", - " canvas.setAttribute(\n", - " 'style',\n", - " 'width: ' + width + 'px; height: ' + height + 'px;'\n", - " );\n", - "\n", - " rubberband_canvas.setAttribute('width', width);\n", - " rubberband_canvas.setAttribute('height', height);\n", - "\n", - " // And update the size in Python. We ignore the initial 0/0 size\n", - " // that occurs as the element is placed into the DOM, which should\n", - " // otherwise not happen due to the minimum size styling.\n", - " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", - " fig.request_resize(width, height);\n", - " }\n", - " }\n", - " });\n", - " this.resizeObserverInstance.observe(canvas_div);\n", - "\n", - " function on_mouse_event_closure(name) {\n", - " return function (event) {\n", - " return fig.mouse_event(event, name);\n", - " };\n", - " }\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mousedown',\n", - " on_mouse_event_closure('button_press')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseup',\n", - " on_mouse_event_closure('button_release')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'dblclick',\n", - " on_mouse_event_closure('dblclick')\n", - " );\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband_canvas.addEventListener(\n", - " 'mousemove',\n", - " on_mouse_event_closure('motion_notify')\n", - " );\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseenter',\n", - " on_mouse_event_closure('figure_enter')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseleave',\n", - " on_mouse_event_closure('figure_leave')\n", - " );\n", - "\n", - " canvas_div.addEventListener('wheel', function (event) {\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " on_mouse_event_closure('scroll')(event);\n", - " });\n", - "\n", - " canvas_div.appendChild(canvas);\n", - " canvas_div.appendChild(rubberband_canvas);\n", - "\n", - " this.rubberband_context = rubberband_canvas.getContext('2d');\n", - " this.rubberband_context.strokeStyle = '#000000';\n", - "\n", - " this._resize_canvas = function (width, height, forward) {\n", - " if (forward) {\n", - " canvas_div.style.width = width + 'px';\n", - " canvas_div.style.height = height + 'px';\n", - " }\n", - " };\n", - "\n", - " // Disable right mouse context menu.\n", - " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n", - " event.preventDefault();\n", - " return false;\n", - " });\n", - "\n", - " function set_focus() {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'mpl-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " continue;\n", - " }\n", - "\n", - " var button = (fig.buttons[name] = document.createElement('button'));\n", - " button.classList = 'mpl-widget';\n", - " button.setAttribute('role', 'button');\n", - " button.setAttribute('aria-disabled', 'false');\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - "\n", - " var icon_img = document.createElement('img');\n", - " icon_img.src = '_images/' + image + '.png';\n", - " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", - " icon_img.alt = tooltip;\n", - " button.appendChild(icon_img);\n", - "\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " var fmt_picker = document.createElement('select');\n", - " fmt_picker.classList = 'mpl-widget';\n", - " toolbar.appendChild(fmt_picker);\n", - " this.format_dropdown = fmt_picker;\n", - "\n", - " for (var ind in mpl.extensions) {\n", - " var fmt = mpl.extensions[ind];\n", - " var option = document.createElement('option');\n", - " option.selected = fmt === mpl.default_extension;\n", - " option.innerHTML = fmt;\n", - " fmt_picker.appendChild(option);\n", - " }\n", - "\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "};\n", - "\n", - "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n", - " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", - " // which will in turn request a refresh of the image.\n", - " this.send_message('resize', { width: x_pixels, height: y_pixels });\n", - "};\n", - "\n", - "mpl.figure.prototype.send_message = function (type, properties) {\n", - " properties['type'] = type;\n", - " properties['figure_id'] = this.id;\n", - " this.ws.send(JSON.stringify(properties));\n", - "};\n", - "\n", - "mpl.figure.prototype.send_draw_message = function () {\n", - " if (!this.waiting) {\n", - " this.waiting = true;\n", - " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " var format_dropdown = fig.format_dropdown;\n", - " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", - " fig.ondownload(fig, format);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_resize = function (fig, msg) {\n", - " var size = msg['size'];\n", - " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n", - " fig._resize_canvas(size[0], size[1], msg['forward']);\n", - " fig.send_message('refresh', {});\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", - " var x0 = msg['x0'] / fig.ratio;\n", - " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", - " var x1 = msg['x1'] / fig.ratio;\n", - " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n", - " x0 = Math.floor(x0) + 0.5;\n", - " y0 = Math.floor(y0) + 0.5;\n", - " x1 = Math.floor(x1) + 0.5;\n", - " y1 = Math.floor(y1) + 0.5;\n", - " var min_x = Math.min(x0, x1);\n", - " var min_y = Math.min(y0, y1);\n", - " var width = Math.abs(x1 - x0);\n", - " var height = Math.abs(y1 - y0);\n", - "\n", - " fig.rubberband_context.clearRect(\n", - " 0,\n", - " 0,\n", - " fig.canvas.width / fig.ratio,\n", - " fig.canvas.height / fig.ratio\n", - " );\n", - "\n", - " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n", - " // Updates the figure title.\n", - " fig.header.textContent = msg['label'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n", - " fig.rubberband_canvas.style.cursor = msg['cursor'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_message = function (fig, msg) {\n", - " fig.message.textContent = msg['message'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n", - " // Request the server to send over a new figure.\n", - " fig.send_draw_message();\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n", - " fig.image_mode = msg['mode'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n", - " for (var key in msg) {\n", - " if (!(key in fig.buttons)) {\n", - " continue;\n", - " }\n", - " fig.buttons[key].disabled = !msg[key];\n", - " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", - " if (msg['mode'] === 'PAN') {\n", - " fig.buttons['Pan'].classList.add('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " } else if (msg['mode'] === 'ZOOM') {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.add('active');\n", - " } else {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Called whenever the canvas gets updated.\n", - " this.send_message('ack', {});\n", - "};\n", - "\n", - "// A function to construct a web socket function for onmessage handling.\n", - "// Called in the figure constructor.\n", - "mpl.figure.prototype._make_on_message_function = function (fig) {\n", - " return function socket_on_message(evt) {\n", - " if (evt.data instanceof Blob) {\n", - " var img = evt.data;\n", - " if (img.type !== 'image/png') {\n", - " /* FIXME: We get \"Resource interpreted as Image but\n", - " * transferred with MIME type text/plain:\" errors on\n", - " * Chrome. But how to set the MIME type? It doesn't seem\n", - " * to be part of the websocket stream */\n", - " img.type = 'image/png';\n", - " }\n", - "\n", - " /* Free the memory for the previous frames */\n", - " if (fig.imageObj.src) {\n", - " (window.URL || window.webkitURL).revokeObjectURL(\n", - " fig.imageObj.src\n", - " );\n", - " }\n", - "\n", - " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", - " img\n", - " );\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " } else if (\n", - " typeof evt.data === 'string' &&\n", - " evt.data.slice(0, 21) === 'data:image/png;base64'\n", - " ) {\n", - " fig.imageObj.src = evt.data;\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - "\n", - " var msg = JSON.parse(evt.data);\n", - " var msg_type = msg['type'];\n", - "\n", - " // Call the \"handle_{type}\" callback, which takes\n", - " // the figure and JSON message as its only arguments.\n", - " try {\n", - " var callback = fig['handle_' + msg_type];\n", - " } catch (e) {\n", - " console.log(\n", - " \"No handler for the '\" + msg_type + \"' message type: \",\n", - " msg\n", - " );\n", - " return;\n", - " }\n", - "\n", - " if (callback) {\n", - " try {\n", - " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", - " callback(fig, msg);\n", - " } catch (e) {\n", - " console.log(\n", - " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", - " e,\n", - " e.stack,\n", - " msg\n", - " );\n", - " }\n", - " }\n", - " };\n", - "};\n", - "\n", - "// from https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", - "mpl.findpos = function (e) {\n", - " //this section is from http://www.quirksmode.org/js/events_properties.html\n", - " var targ;\n", - " if (!e) {\n", - " e = window.event;\n", - " }\n", - " if (e.target) {\n", - " targ = e.target;\n", - " } else if (e.srcElement) {\n", - " targ = e.srcElement;\n", - " }\n", - " if (targ.nodeType === 3) {\n", - " // defeat Safari bug\n", - " targ = targ.parentNode;\n", - " }\n", - "\n", - " // pageX,Y are the mouse positions relative to the document\n", - " var boundingRect = targ.getBoundingClientRect();\n", - " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", - " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n", - "\n", - " return { x: x, y: y };\n", - "};\n", - "\n", - "/*\n", - " * return a copy of an object with only non-object keys\n", - " * we need this to avoid circular references\n", - " * https://stackoverflow.com/a/24161582/3208463\n", - " */\n", - "function simpleKeys(original) {\n", - " return Object.keys(original).reduce(function (obj, key) {\n", - " if (typeof original[key] !== 'object') {\n", - " obj[key] = original[key];\n", - " }\n", - " return obj;\n", - " }, {});\n", - "}\n", - "\n", - "mpl.figure.prototype.mouse_event = function (event, name) {\n", - " var canvas_pos = mpl.findpos(event);\n", - "\n", - " if (name === 'button_press') {\n", - " this.canvas.focus();\n", - " this.canvas_div.focus();\n", - " }\n", - "\n", - " var x = canvas_pos.x * this.ratio;\n", - " var y = canvas_pos.y * this.ratio;\n", - "\n", - " this.send_message(name, {\n", - " x: x,\n", - " y: y,\n", - " button: event.button,\n", - " step: event.step,\n", - " guiEvent: simpleKeys(event),\n", - " });\n", - "\n", - " /* This prevents the web browser from automatically changing to\n", - " * the text insertion cursor when the button is pressed. We want\n", - " * to control all of the cursor setting manually through the\n", - " * 'cursor' event from matplotlib */\n", - " event.preventDefault();\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n", - " // Handle any extra behaviour associated with a key event\n", - "};\n", - "\n", - "mpl.figure.prototype.key_event = function (event, name) {\n", - " // Prevent repeat events\n", - " if (name === 'key_press') {\n", - " if (event.key === this._key) {\n", - " return;\n", - " } else {\n", - " this._key = event.key;\n", - " }\n", - " }\n", - " if (name === 'key_release') {\n", - " this._key = null;\n", - " }\n", - "\n", - " var value = '';\n", - " if (event.ctrlKey && event.key !== 'Control') {\n", - " value += 'ctrl+';\n", - " }\n", - " else if (event.altKey && event.key !== 'Alt') {\n", - " value += 'alt+';\n", - " }\n", - " else if (event.shiftKey && event.key !== 'Shift') {\n", - " value += 'shift+';\n", - " }\n", - "\n", - " value += 'k' + event.key;\n", - "\n", - " this._key_event_extra(event, name);\n", - "\n", - " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n", - " if (name === 'download') {\n", - " this.handle_save(this, null);\n", - " } else {\n", - " this.send_message('toolbar_button', { name: name });\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n", - " this.message.textContent = tooltip;\n", - "};\n", - "\n", - "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", - "// prettier-ignore\n", - "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n", - "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", - "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", - "\n", - "mpl.default_extension = \"png\";/* global mpl */\n", - "\n", - "var comm_websocket_adapter = function (comm) {\n", - " // Create a \"websocket\"-like object which calls the given IPython comm\n", - " // object with the appropriate methods. Currently this is a non binary\n", - " // socket, so there is still some room for performance tuning.\n", - " var ws = {};\n", - "\n", - " ws.binaryType = comm.kernel.ws.binaryType;\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " function updateReadyState(_event) {\n", - " if (comm.kernel.ws) {\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " } else {\n", - " ws.readyState = 3; // Closed state.\n", - " }\n", - " }\n", - " comm.kernel.ws.addEventListener('open', updateReadyState);\n", - " comm.kernel.ws.addEventListener('close', updateReadyState);\n", - " comm.kernel.ws.addEventListener('error', updateReadyState);\n", - "\n", - " ws.close = function () {\n", - " comm.close();\n", - " };\n", - " ws.send = function (m) {\n", - " //console.log('sending', m);\n", - " comm.send(m);\n", - " };\n", - " // Register the callback with on_msg.\n", - " comm.on_msg(function (msg) {\n", - " //console.log('receiving', msg['content']['data'], msg);\n", - " var data = msg['content']['data'];\n", - " if (data['blob'] !== undefined) {\n", - " data = {\n", - " data: new Blob(msg['buffers'], { type: data['blob'] }),\n", - " };\n", - " }\n", - " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", - " ws.onmessage(data);\n", - " });\n", - " return ws;\n", - "};\n", - "\n", - "mpl.mpl_figure_comm = function (comm, msg) {\n", - " // This is the function which gets called when the mpl process\n", - " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", - "\n", - " var id = msg.content.data.id;\n", - " // Get hold of the div created by the display call when the Comm\n", - " // socket was opened in Python.\n", - " var element = document.getElementById(id);\n", - " var ws_proxy = comm_websocket_adapter(comm);\n", - "\n", - " function ondownload(figure, _format) {\n", - " window.open(figure.canvas.toDataURL());\n", - " }\n", - "\n", - " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n", - "\n", - " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", - " // web socket which is closed, not our websocket->open comm proxy.\n", - " ws_proxy.onopen();\n", - "\n", - " fig.parent_element = element;\n", - " fig.cell_info = mpl.find_output_cell(\"
\");\n", - " if (!fig.cell_info) {\n", - " console.error('Failed to find cell for figure', id, fig);\n", - " return;\n", - " }\n", - " fig.cell_info[0].output_area.element.on(\n", - " 'cleared',\n", - " { fig: fig },\n", - " fig._remove_fig_handler\n", - " );\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_close = function (fig, msg) {\n", - " var width = fig.canvas.width / fig.ratio;\n", - " fig.cell_info[0].output_area.element.off(\n", - " 'cleared',\n", - " fig._remove_fig_handler\n", - " );\n", - " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n", - "\n", - " // Update the output cell to use the data from the current canvas.\n", - " fig.push_to_output();\n", - " var dataURL = fig.canvas.toDataURL();\n", - " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", - " // the notebook keyboard shortcuts fail.\n", - " IPython.keyboard_manager.enable();\n", - " fig.parent_element.innerHTML =\n", - " '';\n", - " fig.close_ws(fig, msg);\n", - "};\n", - "\n", - "mpl.figure.prototype.close_ws = function (fig, msg) {\n", - " fig.send_message('closing', msg);\n", - " // fig.ws.close()\n", - "};\n", - "\n", - "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n", - " // Turn the data on the canvas into data in the output cell.\n", - " var width = this.canvas.width / this.ratio;\n", - " var dataURL = this.canvas.toDataURL();\n", - " this.cell_info[1]['text/html'] =\n", - " '';\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Tell IPython that the notebook contents must change.\n", - " IPython.notebook.set_dirty(true);\n", - " this.send_message('ack', {});\n", - " var fig = this;\n", - " // Wait a second, then push the new image to the DOM so\n", - " // that it is saved nicely (might be nice to debounce this).\n", - " setTimeout(function () {\n", - " fig.push_to_output();\n", - " }, 1000);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'btn-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " var button;\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " continue;\n", - " }\n", - "\n", - " button = fig.buttons[name] = document.createElement('button');\n", - " button.classList = 'btn btn-default';\n", - " button.href = '#';\n", - " button.title = name;\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message pull-right';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = document.createElement('div');\n", - " buttongrp.classList = 'btn-group inline pull-right';\n", - " button = document.createElement('button');\n", - " button.classList = 'btn btn-mini btn-primary';\n", - " button.href = '#';\n", - " button.title = 'Stop Interaction';\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', function (_evt) {\n", - " fig.handle_close(fig, {});\n", - " });\n", - " button.addEventListener(\n", - " 'mouseover',\n", - " on_mouseover_closure('Stop Interaction')\n", - " );\n", - " buttongrp.appendChild(button);\n", - " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", - " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", - "};\n", - "\n", - "mpl.figure.prototype._remove_fig_handler = function (event) {\n", - " var fig = event.data.fig;\n", - " if (event.target !== this) {\n", - " // Ignore bubbled events from children.\n", - " return;\n", - " }\n", - " fig.close_ws(fig, {});\n", - "};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (el) {\n", - " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (el) {\n", - " // this is important to make the div 'focusable\n", - " el.setAttribute('tabindex', 0);\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " } else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (event, _name) {\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which === 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " fig.ondownload(fig, null);\n", - "};\n", - "\n", - "mpl.find_output_cell = function (html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i = 0; i < ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code') {\n", - " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] === html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "};\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel !== null) {\n", - " IPython.notebook.kernel.comm_manager.register_target(\n", - " 'matplotlib',\n", - " mpl.mpl_figure_comm\n", - " );\n", - "}\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Clear the previously compiled operator\n", - "pde.clear_operators()\n", - "\n", - "# and run it forward\n", - "traces = await pde(shot.wavelets, vp, rho, alpha, problem=sub_problem)\n", - "\n", - "# Plot the resulting traces\n", - "_ = traces.plot()\n", - "traces.plot_one(60)" - ] - }, - { - "cell_type": "markdown", - "id": "municipal-failure", - "metadata": {}, - "source": [ - "Attenuation in the viscoacoustic wave equation follows a power law, that is $\\alpha \\propto \\alpha_0 \\omega^y$ for some absorption coefficient $\\alpha_0$ and the temporal frequency $\\omega$. In Stride, the power $y$ is by default 0, but a value of 2 can also be chosen by calling the pde operator with the argument `pde(..., attenuation_power=2)`.\n", - "\n", - "## Absorbing boundaries\n", - "\n", - "By default, absorbing boundaries in Stride's acoustic solver are considered sponge absorbing boundaries. These boundaries are computationally very efficient, but have lower absorption efficiency than other alternatives, requiring larger absorbing regions. \n", - "\n", - "Using a perfectly matched layer (PML), it is possible to obtain higher absorption efficiency while using smaller absorbing regions. However, this comes at an increased computational cost.\n", - "\n", - "To run the same PDE with a PML, we can pass the `boundary_type` argument to the solver:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "empirical-devon", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(ShotID 0) Preparing to run state for shot\n", - "(ShotID 0) Estimated bandwidth for the propagated wavelet 0.260-0.730 MHz\n", - "(ShotID 0) Spatial grid spacing (0.400 mm | 5.137 PPW) is below dispersion limit (0.411 mm | 5.000 PPW)\n", - "(ShotID 0) Time grid spacing (0.050 μs | 18%) is below OT2 limit (0.120 μs)\n", - "(ShotID 0) Selected undersampling level 6\n", - "(ShotID 0) Selected time stepping scheme OT2\n", - "Operator `acoustic_iso_state` instance configuration:\n", - "\t * name=acoustic_iso_state\n", - "\t * subs={h_x: 0.0004, h_y: 0.0004, dt: 5e-08}\n", - "\t * opt=advanced-fsg\n", - "\t * devicecreate=(p(t, x, y),)\n", - "Operator `acoustic_iso_state` generated in 4.47 s\n", - " * lowering.Clusters: 2.43 s (54.4 %)\n", - " * specializing.Clusters: 1.75 s (39.2 %)\n", - " * fuse: 1.18 s (26.5 %)\n", - " * lowering.Expressions: 1.04 s (23.3 %)\n", - "Flops reduction after symbolic optimization: [1119 --> 545]\n", - "recompiling for non-existent cache dir (/tmp/devito-codepy-uid1000/dd1d9bb/2d113284be914f13fd4b577022f4b4b4).\n", - "gcc -march=native -O3 -g -fPIC -Wall -std=c99 -Wno-unused-result -Wno-unused-variable -Wno-unused-but-set-variable -ffast-math -shared -fopenmp /tmp/devito-jitcache-uid1000/dd1d9bb9a098c6a4c28aaf8f7ec9f9128dc5a248.c -lm -o /tmp/devito-jitcache-uid1000/dd1d9bb9a098c6a4c28aaf8f7ec9f9128dc5a248.so\n", - "Operator `acoustic_iso_state` jit-compiled `/tmp/devito-jitcache-uid1000/dd1d9bb9a098c6a4c28aaf8f7ec9f9128dc5a248.c` in 0.98 s with `CustomCompiler`\n", - "(ShotID 0) Using inhomogeneous density\n", - "(ShotID 0) Using attenuation with power 0\n", - "(ShotID 0) Running state equation for shot\n", - "AutoTuner: could not perform any runs\n", - "Operator `acoustic_iso_state` ran in 0.29 s\n", - "Global performance: [OI=0.01, 84.18 GFlops/s, 0.63 GPts/s]\n", - "Local performance:\n", - " * section0<300> ran in 0.01 s [OI=0.25, 0.04 GFlops/s, 0.00 GPts/s]\n", - " * section1<300> ran in 0.01 s [OI=0.25, 0.40 GFlops/s, 0.00 GPts/s]\n", - " * section2<<1999,40,300>,<1999,40,300>,<1999,40,300>,<1999,40,300>,<1999,40,300>,<1999,40,300>,<1999,300,40>,<1999,300,40>,<1999,300,40>,<1999,300,40>,<1999,300,40>,<1999,300,40>> ran in 0.12 s [OI=0.01, 92.27 GFlops/s, 0.81 GPts/s]\n", - " * section3<<1999,309,309>,<1999,300,300>> ran in 0.16 s [OI=1.52, 88.19 GFlops/s, 1.18 GPts/s]\n", - " * section4<<1999,1,2,2>,<1999,1,2,2>> ran in 0.01 s [OI=5.80, 0.11 GFlops/s, 0.01 GPts/s]\n", - " * section5<<1999,120>,<1999,120,2,2>> ran in 0.01 s [OI=1.84, 2.41 GFlops/s, 0.00 GPts/s]\n", - "Performance[mode=advanced-fsg] arguments: {'nthreads': 6, 'nthreads_nonaffine': 6}\n", - "(ShotID 0) Completed state equation run for shot\n" - ] - }, - { - "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "/* global mpl */\n", - "window.mpl = {};\n", - "\n", - "mpl.get_websocket_type = function () {\n", - " if (typeof WebSocket !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof MozWebSocket !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert(\n", - " 'Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.'\n", - " );\n", - " }\n", - "};\n", - "\n", - "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = this.ws.binaryType !== undefined;\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById('mpl-warnings');\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent =\n", - " 'This browser does not support binary websocket messages. ' +\n", - " 'Performance may be slow.';\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = document.createElement('div');\n", - " this.root.setAttribute('style', 'display: inline-block');\n", - " this._root_extra_style(this.root);\n", - "\n", - " parent_element.appendChild(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message('supports_binary', { value: fig.supports_binary });\n", - " fig.send_message('send_image_mode', {});\n", - " if (fig.ratio !== 1) {\n", - " fig.send_message('set_device_pixel_ratio', {\n", - " device_pixel_ratio: fig.ratio,\n", - " });\n", - " }\n", - " fig.send_message('refresh', {});\n", - " };\n", - "\n", - " this.imageObj.onload = function () {\n", - " if (fig.image_mode === 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function () {\n", - " fig.ws.close();\n", - " };\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "};\n", - "\n", - "mpl.figure.prototype._init_header = function () {\n", - " var titlebar = document.createElement('div');\n", - " titlebar.classList =\n", - " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", - " var titletext = document.createElement('div');\n", - " titletext.classList = 'ui-dialog-title';\n", - " titletext.setAttribute(\n", - " 'style',\n", - " 'width: 100%; text-align: center; padding: 3px;'\n", - " );\n", - " titlebar.appendChild(titletext);\n", - " this.root.appendChild(titlebar);\n", - " this.header = titletext;\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._init_canvas = function () {\n", - " var fig = this;\n", - "\n", - " var canvas_div = (this.canvas_div = document.createElement('div'));\n", - " canvas_div.setAttribute(\n", - " 'style',\n", - " 'border: 1px solid #ddd;' +\n", - " 'box-sizing: content-box;' +\n", - " 'clear: both;' +\n", - " 'min-height: 1px;' +\n", - " 'min-width: 1px;' +\n", - " 'outline: 0;' +\n", - " 'overflow: hidden;' +\n", - " 'position: relative;' +\n", - " 'resize: both;'\n", - " );\n", - "\n", - " function on_keyboard_event_closure(name) {\n", - " return function (event) {\n", - " return fig.key_event(event, name);\n", - " };\n", - " }\n", - "\n", - " canvas_div.addEventListener(\n", - " 'keydown',\n", - " on_keyboard_event_closure('key_press')\n", - " );\n", - " canvas_div.addEventListener(\n", - " 'keyup',\n", - " on_keyboard_event_closure('key_release')\n", - " );\n", - "\n", - " this._canvas_extra_style(canvas_div);\n", - " this.root.appendChild(canvas_div);\n", - "\n", - " var canvas = (this.canvas = document.createElement('canvas'));\n", - " canvas.classList.add('mpl-canvas');\n", - " canvas.setAttribute('style', 'box-sizing: content-box;');\n", - "\n", - " this.context = canvas.getContext('2d');\n", - "\n", - " var backingStore =\n", - " this.context.backingStorePixelRatio ||\n", - " this.context.webkitBackingStorePixelRatio ||\n", - " this.context.mozBackingStorePixelRatio ||\n", - " this.context.msBackingStorePixelRatio ||\n", - " this.context.oBackingStorePixelRatio ||\n", - " this.context.backingStorePixelRatio ||\n", - " 1;\n", - "\n", - " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", - " 'canvas'\n", - " ));\n", - " rubberband_canvas.setAttribute(\n", - " 'style',\n", - " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", - " );\n", - "\n", - " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", - " if (this.ResizeObserver === undefined) {\n", - " if (window.ResizeObserver !== undefined) {\n", - " this.ResizeObserver = window.ResizeObserver;\n", - " } else {\n", - " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", - " this.ResizeObserver = obs.ResizeObserver;\n", - " }\n", - " }\n", - "\n", - " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", - " var nentries = entries.length;\n", - " for (var i = 0; i < nentries; i++) {\n", - " var entry = entries[i];\n", - " var width, height;\n", - " if (entry.contentBoxSize) {\n", - " if (entry.contentBoxSize instanceof Array) {\n", - " // Chrome 84 implements new version of spec.\n", - " width = entry.contentBoxSize[0].inlineSize;\n", - " height = entry.contentBoxSize[0].blockSize;\n", - " } else {\n", - " // Firefox implements old version of spec.\n", - " width = entry.contentBoxSize.inlineSize;\n", - " height = entry.contentBoxSize.blockSize;\n", - " }\n", - " } else {\n", - " // Chrome <84 implements even older version of spec.\n", - " width = entry.contentRect.width;\n", - " height = entry.contentRect.height;\n", - " }\n", - "\n", - " // Keep the size of the canvas and rubber band canvas in sync with\n", - " // the canvas container.\n", - " if (entry.devicePixelContentBoxSize) {\n", - " // Chrome 84 implements new version of spec.\n", - " canvas.setAttribute(\n", - " 'width',\n", - " entry.devicePixelContentBoxSize[0].inlineSize\n", - " );\n", - " canvas.setAttribute(\n", - " 'height',\n", - " entry.devicePixelContentBoxSize[0].blockSize\n", - " );\n", - " } else {\n", - " canvas.setAttribute('width', width * fig.ratio);\n", - " canvas.setAttribute('height', height * fig.ratio);\n", - " }\n", - " canvas.setAttribute(\n", - " 'style',\n", - " 'width: ' + width + 'px; height: ' + height + 'px;'\n", - " );\n", - "\n", - " rubberband_canvas.setAttribute('width', width);\n", - " rubberband_canvas.setAttribute('height', height);\n", - "\n", - " // And update the size in Python. We ignore the initial 0/0 size\n", - " // that occurs as the element is placed into the DOM, which should\n", - " // otherwise not happen due to the minimum size styling.\n", - " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", - " fig.request_resize(width, height);\n", - " }\n", - " }\n", - " });\n", - " this.resizeObserverInstance.observe(canvas_div);\n", - "\n", - " function on_mouse_event_closure(name) {\n", - " return function (event) {\n", - " return fig.mouse_event(event, name);\n", - " };\n", - " }\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mousedown',\n", - " on_mouse_event_closure('button_press')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseup',\n", - " on_mouse_event_closure('button_release')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'dblclick',\n", - " on_mouse_event_closure('dblclick')\n", - " );\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband_canvas.addEventListener(\n", - " 'mousemove',\n", - " on_mouse_event_closure('motion_notify')\n", - " );\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseenter',\n", - " on_mouse_event_closure('figure_enter')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseleave',\n", - " on_mouse_event_closure('figure_leave')\n", - " );\n", - "\n", - " canvas_div.addEventListener('wheel', function (event) {\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " on_mouse_event_closure('scroll')(event);\n", - " });\n", - "\n", - " canvas_div.appendChild(canvas);\n", - " canvas_div.appendChild(rubberband_canvas);\n", - "\n", - " this.rubberband_context = rubberband_canvas.getContext('2d');\n", - " this.rubberband_context.strokeStyle = '#000000';\n", - "\n", - " this._resize_canvas = function (width, height, forward) {\n", - " if (forward) {\n", - " canvas_div.style.width = width + 'px';\n", - " canvas_div.style.height = height + 'px';\n", - " }\n", - " };\n", - "\n", - " // Disable right mouse context menu.\n", - " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n", - " event.preventDefault();\n", - " return false;\n", - " });\n", - "\n", - " function set_focus() {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'mpl-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " continue;\n", - " }\n", - "\n", - " var button = (fig.buttons[name] = document.createElement('button'));\n", - " button.classList = 'mpl-widget';\n", - " button.setAttribute('role', 'button');\n", - " button.setAttribute('aria-disabled', 'false');\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - "\n", - " var icon_img = document.createElement('img');\n", - " icon_img.src = '_images/' + image + '.png';\n", - " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", - " icon_img.alt = tooltip;\n", - " button.appendChild(icon_img);\n", - "\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " var fmt_picker = document.createElement('select');\n", - " fmt_picker.classList = 'mpl-widget';\n", - " toolbar.appendChild(fmt_picker);\n", - " this.format_dropdown = fmt_picker;\n", - "\n", - " for (var ind in mpl.extensions) {\n", - " var fmt = mpl.extensions[ind];\n", - " var option = document.createElement('option');\n", - " option.selected = fmt === mpl.default_extension;\n", - " option.innerHTML = fmt;\n", - " fmt_picker.appendChild(option);\n", - " }\n", - "\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "};\n", - "\n", - "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n", - " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", - " // which will in turn request a refresh of the image.\n", - " this.send_message('resize', { width: x_pixels, height: y_pixels });\n", - "};\n", - "\n", - "mpl.figure.prototype.send_message = function (type, properties) {\n", - " properties['type'] = type;\n", - " properties['figure_id'] = this.id;\n", - " this.ws.send(JSON.stringify(properties));\n", - "};\n", - "\n", - "mpl.figure.prototype.send_draw_message = function () {\n", - " if (!this.waiting) {\n", - " this.waiting = true;\n", - " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " var format_dropdown = fig.format_dropdown;\n", - " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", - " fig.ondownload(fig, format);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_resize = function (fig, msg) {\n", - " var size = msg['size'];\n", - " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n", - " fig._resize_canvas(size[0], size[1], msg['forward']);\n", - " fig.send_message('refresh', {});\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", - " var x0 = msg['x0'] / fig.ratio;\n", - " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", - " var x1 = msg['x1'] / fig.ratio;\n", - " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n", - " x0 = Math.floor(x0) + 0.5;\n", - " y0 = Math.floor(y0) + 0.5;\n", - " x1 = Math.floor(x1) + 0.5;\n", - " y1 = Math.floor(y1) + 0.5;\n", - " var min_x = Math.min(x0, x1);\n", - " var min_y = Math.min(y0, y1);\n", - " var width = Math.abs(x1 - x0);\n", - " var height = Math.abs(y1 - y0);\n", - "\n", - " fig.rubberband_context.clearRect(\n", - " 0,\n", - " 0,\n", - " fig.canvas.width / fig.ratio,\n", - " fig.canvas.height / fig.ratio\n", - " );\n", - "\n", - " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n", - " // Updates the figure title.\n", - " fig.header.textContent = msg['label'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n", - " fig.rubberband_canvas.style.cursor = msg['cursor'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_message = function (fig, msg) {\n", - " fig.message.textContent = msg['message'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n", - " // Request the server to send over a new figure.\n", - " fig.send_draw_message();\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n", - " fig.image_mode = msg['mode'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n", - " for (var key in msg) {\n", - " if (!(key in fig.buttons)) {\n", - " continue;\n", - " }\n", - " fig.buttons[key].disabled = !msg[key];\n", - " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", - " if (msg['mode'] === 'PAN') {\n", - " fig.buttons['Pan'].classList.add('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " } else if (msg['mode'] === 'ZOOM') {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.add('active');\n", - " } else {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Called whenever the canvas gets updated.\n", - " this.send_message('ack', {});\n", - "};\n", - "\n", - "// A function to construct a web socket function for onmessage handling.\n", - "// Called in the figure constructor.\n", - "mpl.figure.prototype._make_on_message_function = function (fig) {\n", - " return function socket_on_message(evt) {\n", - " if (evt.data instanceof Blob) {\n", - " var img = evt.data;\n", - " if (img.type !== 'image/png') {\n", - " /* FIXME: We get \"Resource interpreted as Image but\n", - " * transferred with MIME type text/plain:\" errors on\n", - " * Chrome. But how to set the MIME type? It doesn't seem\n", - " * to be part of the websocket stream */\n", - " img.type = 'image/png';\n", - " }\n", - "\n", - " /* Free the memory for the previous frames */\n", - " if (fig.imageObj.src) {\n", - " (window.URL || window.webkitURL).revokeObjectURL(\n", - " fig.imageObj.src\n", - " );\n", - " }\n", - "\n", - " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", - " img\n", - " );\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " } else if (\n", - " typeof evt.data === 'string' &&\n", - " evt.data.slice(0, 21) === 'data:image/png;base64'\n", - " ) {\n", - " fig.imageObj.src = evt.data;\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - "\n", - " var msg = JSON.parse(evt.data);\n", - " var msg_type = msg['type'];\n", - "\n", - " // Call the \"handle_{type}\" callback, which takes\n", - " // the figure and JSON message as its only arguments.\n", - " try {\n", - " var callback = fig['handle_' + msg_type];\n", - " } catch (e) {\n", - " console.log(\n", - " \"No handler for the '\" + msg_type + \"' message type: \",\n", - " msg\n", - " );\n", - " return;\n", - " }\n", - "\n", - " if (callback) {\n", - " try {\n", - " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", - " callback(fig, msg);\n", - " } catch (e) {\n", - " console.log(\n", - " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", - " e,\n", - " e.stack,\n", - " msg\n", - " );\n", - " }\n", - " }\n", - " };\n", - "};\n", - "\n", - "// from https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", - "mpl.findpos = function (e) {\n", - " //this section is from http://www.quirksmode.org/js/events_properties.html\n", - " var targ;\n", - " if (!e) {\n", - " e = window.event;\n", - " }\n", - " if (e.target) {\n", - " targ = e.target;\n", - " } else if (e.srcElement) {\n", - " targ = e.srcElement;\n", - " }\n", - " if (targ.nodeType === 3) {\n", - " // defeat Safari bug\n", - " targ = targ.parentNode;\n", - " }\n", - "\n", - " // pageX,Y are the mouse positions relative to the document\n", - " var boundingRect = targ.getBoundingClientRect();\n", - " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", - " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n", - "\n", - " return { x: x, y: y };\n", - "};\n", - "\n", - "/*\n", - " * return a copy of an object with only non-object keys\n", - " * we need this to avoid circular references\n", - " * https://stackoverflow.com/a/24161582/3208463\n", - " */\n", - "function simpleKeys(original) {\n", - " return Object.keys(original).reduce(function (obj, key) {\n", - " if (typeof original[key] !== 'object') {\n", - " obj[key] = original[key];\n", - " }\n", - " return obj;\n", - " }, {});\n", - "}\n", - "\n", - "mpl.figure.prototype.mouse_event = function (event, name) {\n", - " var canvas_pos = mpl.findpos(event);\n", - "\n", - " if (name === 'button_press') {\n", - " this.canvas.focus();\n", - " this.canvas_div.focus();\n", - " }\n", - "\n", - " var x = canvas_pos.x * this.ratio;\n", - " var y = canvas_pos.y * this.ratio;\n", - "\n", - " this.send_message(name, {\n", - " x: x,\n", - " y: y,\n", - " button: event.button,\n", - " step: event.step,\n", - " guiEvent: simpleKeys(event),\n", - " });\n", - "\n", - " /* This prevents the web browser from automatically changing to\n", - " * the text insertion cursor when the button is pressed. We want\n", - " * to control all of the cursor setting manually through the\n", - " * 'cursor' event from matplotlib */\n", - " event.preventDefault();\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n", - " // Handle any extra behaviour associated with a key event\n", - "};\n", - "\n", - "mpl.figure.prototype.key_event = function (event, name) {\n", - " // Prevent repeat events\n", - " if (name === 'key_press') {\n", - " if (event.key === this._key) {\n", - " return;\n", - " } else {\n", - " this._key = event.key;\n", - " }\n", - " }\n", - " if (name === 'key_release') {\n", - " this._key = null;\n", - " }\n", - "\n", - " var value = '';\n", - " if (event.ctrlKey && event.key !== 'Control') {\n", - " value += 'ctrl+';\n", - " }\n", - " else if (event.altKey && event.key !== 'Alt') {\n", - " value += 'alt+';\n", - " }\n", - " else if (event.shiftKey && event.key !== 'Shift') {\n", - " value += 'shift+';\n", - " }\n", - "\n", - " value += 'k' + event.key;\n", - "\n", - " this._key_event_extra(event, name);\n", - "\n", - " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n", - " if (name === 'download') {\n", - " this.handle_save(this, null);\n", - " } else {\n", - " this.send_message('toolbar_button', { name: name });\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n", - " this.message.textContent = tooltip;\n", - "};\n", - "\n", - "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", - "// prettier-ignore\n", - "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n", - "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", - "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", - "\n", - "mpl.default_extension = \"png\";/* global mpl */\n", - "\n", - "var comm_websocket_adapter = function (comm) {\n", - " // Create a \"websocket\"-like object which calls the given IPython comm\n", - " // object with the appropriate methods. Currently this is a non binary\n", - " // socket, so there is still some room for performance tuning.\n", - " var ws = {};\n", - "\n", - " ws.binaryType = comm.kernel.ws.binaryType;\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " function updateReadyState(_event) {\n", - " if (comm.kernel.ws) {\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " } else {\n", - " ws.readyState = 3; // Closed state.\n", - " }\n", - " }\n", - " comm.kernel.ws.addEventListener('open', updateReadyState);\n", - " comm.kernel.ws.addEventListener('close', updateReadyState);\n", - " comm.kernel.ws.addEventListener('error', updateReadyState);\n", - "\n", - " ws.close = function () {\n", - " comm.close();\n", - " };\n", - " ws.send = function (m) {\n", - " //console.log('sending', m);\n", - " comm.send(m);\n", - " };\n", - " // Register the callback with on_msg.\n", - " comm.on_msg(function (msg) {\n", - " //console.log('receiving', msg['content']['data'], msg);\n", - " var data = msg['content']['data'];\n", - " if (data['blob'] !== undefined) {\n", - " data = {\n", - " data: new Blob(msg['buffers'], { type: data['blob'] }),\n", - " };\n", - " }\n", - " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", - " ws.onmessage(data);\n", - " });\n", - " return ws;\n", - "};\n", - "\n", - "mpl.mpl_figure_comm = function (comm, msg) {\n", - " // This is the function which gets called when the mpl process\n", - " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", - "\n", - " var id = msg.content.data.id;\n", - " // Get hold of the div created by the display call when the Comm\n", - " // socket was opened in Python.\n", - " var element = document.getElementById(id);\n", - " var ws_proxy = comm_websocket_adapter(comm);\n", - "\n", - " function ondownload(figure, _format) {\n", - " window.open(figure.canvas.toDataURL());\n", - " }\n", - "\n", - " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n", - "\n", - " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", - " // web socket which is closed, not our websocket->open comm proxy.\n", - " ws_proxy.onopen();\n", - "\n", - " fig.parent_element = element;\n", - " fig.cell_info = mpl.find_output_cell(\"
\");\n", - " if (!fig.cell_info) {\n", - " console.error('Failed to find cell for figure', id, fig);\n", - " return;\n", - " }\n", - " fig.cell_info[0].output_area.element.on(\n", - " 'cleared',\n", - " { fig: fig },\n", - " fig._remove_fig_handler\n", - " );\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_close = function (fig, msg) {\n", - " var width = fig.canvas.width / fig.ratio;\n", - " fig.cell_info[0].output_area.element.off(\n", - " 'cleared',\n", - " fig._remove_fig_handler\n", - " );\n", - " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n", - "\n", - " // Update the output cell to use the data from the current canvas.\n", - " fig.push_to_output();\n", - " var dataURL = fig.canvas.toDataURL();\n", - " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", - " // the notebook keyboard shortcuts fail.\n", - " IPython.keyboard_manager.enable();\n", - " fig.parent_element.innerHTML =\n", - " '';\n", - " fig.close_ws(fig, msg);\n", - "};\n", - "\n", - "mpl.figure.prototype.close_ws = function (fig, msg) {\n", - " fig.send_message('closing', msg);\n", - " // fig.ws.close()\n", - "};\n", - "\n", - "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n", - " // Turn the data on the canvas into data in the output cell.\n", - " var width = this.canvas.width / this.ratio;\n", - " var dataURL = this.canvas.toDataURL();\n", - " this.cell_info[1]['text/html'] =\n", - " '';\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Tell IPython that the notebook contents must change.\n", - " IPython.notebook.set_dirty(true);\n", - " this.send_message('ack', {});\n", - " var fig = this;\n", - " // Wait a second, then push the new image to the DOM so\n", - " // that it is saved nicely (might be nice to debounce this).\n", - " setTimeout(function () {\n", - " fig.push_to_output();\n", - " }, 1000);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'btn-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " var button;\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " continue;\n", - " }\n", - "\n", - " button = fig.buttons[name] = document.createElement('button');\n", - " button.classList = 'btn btn-default';\n", - " button.href = '#';\n", - " button.title = name;\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message pull-right';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = document.createElement('div');\n", - " buttongrp.classList = 'btn-group inline pull-right';\n", - " button = document.createElement('button');\n", - " button.classList = 'btn btn-mini btn-primary';\n", - " button.href = '#';\n", - " button.title = 'Stop Interaction';\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', function (_evt) {\n", - " fig.handle_close(fig, {});\n", - " });\n", - " button.addEventListener(\n", - " 'mouseover',\n", - " on_mouseover_closure('Stop Interaction')\n", - " );\n", - " buttongrp.appendChild(button);\n", - " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", - " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", - "};\n", - "\n", - "mpl.figure.prototype._remove_fig_handler = function (event) {\n", - " var fig = event.data.fig;\n", - " if (event.target !== this) {\n", - " // Ignore bubbled events from children.\n", - " return;\n", - " }\n", - " fig.close_ws(fig, {});\n", - "};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (el) {\n", - " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (el) {\n", - " // this is important to make the div 'focusable\n", - " el.setAttribute('tabindex', 0);\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " } else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (event, _name) {\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which === 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " fig.ondownload(fig, null);\n", - "};\n", - "\n", - "mpl.find_output_cell = function (html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i = 0; i < ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code') {\n", - " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] === html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "};\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel !== null) {\n", - " IPython.notebook.kernel.comm_manager.register_target(\n", - " 'matplotlib',\n", - " mpl.mpl_figure_comm\n", - " );\n", - "}\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "/* global mpl */\n", - "window.mpl = {};\n", - "\n", - "mpl.get_websocket_type = function () {\n", - " if (typeof WebSocket !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof MozWebSocket !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert(\n", - " 'Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.'\n", - " );\n", - " }\n", - "};\n", - "\n", - "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = this.ws.binaryType !== undefined;\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById('mpl-warnings');\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent =\n", - " 'This browser does not support binary websocket messages. ' +\n", - " 'Performance may be slow.';\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = document.createElement('div');\n", - " this.root.setAttribute('style', 'display: inline-block');\n", - " this._root_extra_style(this.root);\n", - "\n", - " parent_element.appendChild(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message('supports_binary', { value: fig.supports_binary });\n", - " fig.send_message('send_image_mode', {});\n", - " if (fig.ratio !== 1) {\n", - " fig.send_message('set_device_pixel_ratio', {\n", - " device_pixel_ratio: fig.ratio,\n", - " });\n", - " }\n", - " fig.send_message('refresh', {});\n", - " };\n", - "\n", - " this.imageObj.onload = function () {\n", - " if (fig.image_mode === 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function () {\n", - " fig.ws.close();\n", - " };\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "};\n", - "\n", - "mpl.figure.prototype._init_header = function () {\n", - " var titlebar = document.createElement('div');\n", - " titlebar.classList =\n", - " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", - " var titletext = document.createElement('div');\n", - " titletext.classList = 'ui-dialog-title';\n", - " titletext.setAttribute(\n", - " 'style',\n", - " 'width: 100%; text-align: center; padding: 3px;'\n", - " );\n", - " titlebar.appendChild(titletext);\n", - " this.root.appendChild(titlebar);\n", - " this.header = titletext;\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._init_canvas = function () {\n", - " var fig = this;\n", - "\n", - " var canvas_div = (this.canvas_div = document.createElement('div'));\n", - " canvas_div.setAttribute(\n", - " 'style',\n", - " 'border: 1px solid #ddd;' +\n", - " 'box-sizing: content-box;' +\n", - " 'clear: both;' +\n", - " 'min-height: 1px;' +\n", - " 'min-width: 1px;' +\n", - " 'outline: 0;' +\n", - " 'overflow: hidden;' +\n", - " 'position: relative;' +\n", - " 'resize: both;'\n", - " );\n", - "\n", - " function on_keyboard_event_closure(name) {\n", - " return function (event) {\n", - " return fig.key_event(event, name);\n", - " };\n", - " }\n", - "\n", - " canvas_div.addEventListener(\n", - " 'keydown',\n", - " on_keyboard_event_closure('key_press')\n", - " );\n", - " canvas_div.addEventListener(\n", - " 'keyup',\n", - " on_keyboard_event_closure('key_release')\n", - " );\n", - "\n", - " this._canvas_extra_style(canvas_div);\n", - " this.root.appendChild(canvas_div);\n", - "\n", - " var canvas = (this.canvas = document.createElement('canvas'));\n", - " canvas.classList.add('mpl-canvas');\n", - " canvas.setAttribute('style', 'box-sizing: content-box;');\n", - "\n", - " this.context = canvas.getContext('2d');\n", - "\n", - " var backingStore =\n", - " this.context.backingStorePixelRatio ||\n", - " this.context.webkitBackingStorePixelRatio ||\n", - " this.context.mozBackingStorePixelRatio ||\n", - " this.context.msBackingStorePixelRatio ||\n", - " this.context.oBackingStorePixelRatio ||\n", - " this.context.backingStorePixelRatio ||\n", - " 1;\n", - "\n", - " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", - " 'canvas'\n", - " ));\n", - " rubberband_canvas.setAttribute(\n", - " 'style',\n", - " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", - " );\n", - "\n", - " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", - " if (this.ResizeObserver === undefined) {\n", - " if (window.ResizeObserver !== undefined) {\n", - " this.ResizeObserver = window.ResizeObserver;\n", - " } else {\n", - " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", - " this.ResizeObserver = obs.ResizeObserver;\n", - " }\n", - " }\n", - "\n", - " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", - " var nentries = entries.length;\n", - " for (var i = 0; i < nentries; i++) {\n", - " var entry = entries[i];\n", - " var width, height;\n", - " if (entry.contentBoxSize) {\n", - " if (entry.contentBoxSize instanceof Array) {\n", - " // Chrome 84 implements new version of spec.\n", - " width = entry.contentBoxSize[0].inlineSize;\n", - " height = entry.contentBoxSize[0].blockSize;\n", - " } else {\n", - " // Firefox implements old version of spec.\n", - " width = entry.contentBoxSize.inlineSize;\n", - " height = entry.contentBoxSize.blockSize;\n", - " }\n", - " } else {\n", - " // Chrome <84 implements even older version of spec.\n", - " width = entry.contentRect.width;\n", - " height = entry.contentRect.height;\n", - " }\n", - "\n", - " // Keep the size of the canvas and rubber band canvas in sync with\n", - " // the canvas container.\n", - " if (entry.devicePixelContentBoxSize) {\n", - " // Chrome 84 implements new version of spec.\n", - " canvas.setAttribute(\n", - " 'width',\n", - " entry.devicePixelContentBoxSize[0].inlineSize\n", - " );\n", - " canvas.setAttribute(\n", - " 'height',\n", - " entry.devicePixelContentBoxSize[0].blockSize\n", - " );\n", - " } else {\n", - " canvas.setAttribute('width', width * fig.ratio);\n", - " canvas.setAttribute('height', height * fig.ratio);\n", - " }\n", - " canvas.setAttribute(\n", - " 'style',\n", - " 'width: ' + width + 'px; height: ' + height + 'px;'\n", - " );\n", - "\n", - " rubberband_canvas.setAttribute('width', width);\n", - " rubberband_canvas.setAttribute('height', height);\n", - "\n", - " // And update the size in Python. We ignore the initial 0/0 size\n", - " // that occurs as the element is placed into the DOM, which should\n", - " // otherwise not happen due to the minimum size styling.\n", - " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", - " fig.request_resize(width, height);\n", - " }\n", - " }\n", - " });\n", - " this.resizeObserverInstance.observe(canvas_div);\n", - "\n", - " function on_mouse_event_closure(name) {\n", - " return function (event) {\n", - " return fig.mouse_event(event, name);\n", - " };\n", - " }\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mousedown',\n", - " on_mouse_event_closure('button_press')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseup',\n", - " on_mouse_event_closure('button_release')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'dblclick',\n", - " on_mouse_event_closure('dblclick')\n", - " );\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband_canvas.addEventListener(\n", - " 'mousemove',\n", - " on_mouse_event_closure('motion_notify')\n", - " );\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseenter',\n", - " on_mouse_event_closure('figure_enter')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseleave',\n", - " on_mouse_event_closure('figure_leave')\n", - " );\n", - "\n", - " canvas_div.addEventListener('wheel', function (event) {\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " on_mouse_event_closure('scroll')(event);\n", - " });\n", - "\n", - " canvas_div.appendChild(canvas);\n", - " canvas_div.appendChild(rubberband_canvas);\n", - "\n", - " this.rubberband_context = rubberband_canvas.getContext('2d');\n", - " this.rubberband_context.strokeStyle = '#000000';\n", - "\n", - " this._resize_canvas = function (width, height, forward) {\n", - " if (forward) {\n", - " canvas_div.style.width = width + 'px';\n", - " canvas_div.style.height = height + 'px';\n", - " }\n", - " };\n", - "\n", - " // Disable right mouse context menu.\n", - " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n", - " event.preventDefault();\n", - " return false;\n", - " });\n", - "\n", - " function set_focus() {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'mpl-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " continue;\n", - " }\n", - "\n", - " var button = (fig.buttons[name] = document.createElement('button'));\n", - " button.classList = 'mpl-widget';\n", - " button.setAttribute('role', 'button');\n", - " button.setAttribute('aria-disabled', 'false');\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - "\n", - " var icon_img = document.createElement('img');\n", - " icon_img.src = '_images/' + image + '.png';\n", - " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", - " icon_img.alt = tooltip;\n", - " button.appendChild(icon_img);\n", - "\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " var fmt_picker = document.createElement('select');\n", - " fmt_picker.classList = 'mpl-widget';\n", - " toolbar.appendChild(fmt_picker);\n", - " this.format_dropdown = fmt_picker;\n", - "\n", - " for (var ind in mpl.extensions) {\n", - " var fmt = mpl.extensions[ind];\n", - " var option = document.createElement('option');\n", - " option.selected = fmt === mpl.default_extension;\n", - " option.innerHTML = fmt;\n", - " fmt_picker.appendChild(option);\n", - " }\n", - "\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "};\n", - "\n", - "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n", - " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", - " // which will in turn request a refresh of the image.\n", - " this.send_message('resize', { width: x_pixels, height: y_pixels });\n", - "};\n", - "\n", - "mpl.figure.prototype.send_message = function (type, properties) {\n", - " properties['type'] = type;\n", - " properties['figure_id'] = this.id;\n", - " this.ws.send(JSON.stringify(properties));\n", - "};\n", - "\n", - "mpl.figure.prototype.send_draw_message = function () {\n", - " if (!this.waiting) {\n", - " this.waiting = true;\n", - " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " var format_dropdown = fig.format_dropdown;\n", - " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", - " fig.ondownload(fig, format);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_resize = function (fig, msg) {\n", - " var size = msg['size'];\n", - " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n", - " fig._resize_canvas(size[0], size[1], msg['forward']);\n", - " fig.send_message('refresh', {});\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", - " var x0 = msg['x0'] / fig.ratio;\n", - " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", - " var x1 = msg['x1'] / fig.ratio;\n", - " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n", - " x0 = Math.floor(x0) + 0.5;\n", - " y0 = Math.floor(y0) + 0.5;\n", - " x1 = Math.floor(x1) + 0.5;\n", - " y1 = Math.floor(y1) + 0.5;\n", - " var min_x = Math.min(x0, x1);\n", - " var min_y = Math.min(y0, y1);\n", - " var width = Math.abs(x1 - x0);\n", - " var height = Math.abs(y1 - y0);\n", - "\n", - " fig.rubberband_context.clearRect(\n", - " 0,\n", - " 0,\n", - " fig.canvas.width / fig.ratio,\n", - " fig.canvas.height / fig.ratio\n", - " );\n", - "\n", - " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n", - " // Updates the figure title.\n", - " fig.header.textContent = msg['label'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n", - " fig.rubberband_canvas.style.cursor = msg['cursor'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_message = function (fig, msg) {\n", - " fig.message.textContent = msg['message'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n", - " // Request the server to send over a new figure.\n", - " fig.send_draw_message();\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n", - " fig.image_mode = msg['mode'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n", - " for (var key in msg) {\n", - " if (!(key in fig.buttons)) {\n", - " continue;\n", - " }\n", - " fig.buttons[key].disabled = !msg[key];\n", - " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", - " if (msg['mode'] === 'PAN') {\n", - " fig.buttons['Pan'].classList.add('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " } else if (msg['mode'] === 'ZOOM') {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.add('active');\n", - " } else {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Called whenever the canvas gets updated.\n", - " this.send_message('ack', {});\n", - "};\n", - "\n", - "// A function to construct a web socket function for onmessage handling.\n", - "// Called in the figure constructor.\n", - "mpl.figure.prototype._make_on_message_function = function (fig) {\n", - " return function socket_on_message(evt) {\n", - " if (evt.data instanceof Blob) {\n", - " var img = evt.data;\n", - " if (img.type !== 'image/png') {\n", - " /* FIXME: We get \"Resource interpreted as Image but\n", - " * transferred with MIME type text/plain:\" errors on\n", - " * Chrome. But how to set the MIME type? It doesn't seem\n", - " * to be part of the websocket stream */\n", - " img.type = 'image/png';\n", - " }\n", - "\n", - " /* Free the memory for the previous frames */\n", - " if (fig.imageObj.src) {\n", - " (window.URL || window.webkitURL).revokeObjectURL(\n", - " fig.imageObj.src\n", - " );\n", - " }\n", - "\n", - " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", - " img\n", - " );\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " } else if (\n", - " typeof evt.data === 'string' &&\n", - " evt.data.slice(0, 21) === 'data:image/png;base64'\n", - " ) {\n", - " fig.imageObj.src = evt.data;\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - "\n", - " var msg = JSON.parse(evt.data);\n", - " var msg_type = msg['type'];\n", - "\n", - " // Call the \"handle_{type}\" callback, which takes\n", - " // the figure and JSON message as its only arguments.\n", - " try {\n", - " var callback = fig['handle_' + msg_type];\n", - " } catch (e) {\n", - " console.log(\n", - " \"No handler for the '\" + msg_type + \"' message type: \",\n", - " msg\n", - " );\n", - " return;\n", - " }\n", - "\n", - " if (callback) {\n", - " try {\n", - " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", - " callback(fig, msg);\n", - " } catch (e) {\n", - " console.log(\n", - " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", - " e,\n", - " e.stack,\n", - " msg\n", - " );\n", - " }\n", - " }\n", - " };\n", - "};\n", - "\n", - "// from https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", - "mpl.findpos = function (e) {\n", - " //this section is from http://www.quirksmode.org/js/events_properties.html\n", - " var targ;\n", - " if (!e) {\n", - " e = window.event;\n", - " }\n", - " if (e.target) {\n", - " targ = e.target;\n", - " } else if (e.srcElement) {\n", - " targ = e.srcElement;\n", - " }\n", - " if (targ.nodeType === 3) {\n", - " // defeat Safari bug\n", - " targ = targ.parentNode;\n", - " }\n", - "\n", - " // pageX,Y are the mouse positions relative to the document\n", - " var boundingRect = targ.getBoundingClientRect();\n", - " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", - " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n", - "\n", - " return { x: x, y: y };\n", - "};\n", - "\n", - "/*\n", - " * return a copy of an object with only non-object keys\n", - " * we need this to avoid circular references\n", - " * https://stackoverflow.com/a/24161582/3208463\n", - " */\n", - "function simpleKeys(original) {\n", - " return Object.keys(original).reduce(function (obj, key) {\n", - " if (typeof original[key] !== 'object') {\n", - " obj[key] = original[key];\n", - " }\n", - " return obj;\n", - " }, {});\n", - "}\n", - "\n", - "mpl.figure.prototype.mouse_event = function (event, name) {\n", - " var canvas_pos = mpl.findpos(event);\n", - "\n", - " if (name === 'button_press') {\n", - " this.canvas.focus();\n", - " this.canvas_div.focus();\n", - " }\n", - "\n", - " var x = canvas_pos.x * this.ratio;\n", - " var y = canvas_pos.y * this.ratio;\n", - "\n", - " this.send_message(name, {\n", - " x: x,\n", - " y: y,\n", - " button: event.button,\n", - " step: event.step,\n", - " guiEvent: simpleKeys(event),\n", - " });\n", - "\n", - " /* This prevents the web browser from automatically changing to\n", - " * the text insertion cursor when the button is pressed. We want\n", - " * to control all of the cursor setting manually through the\n", - " * 'cursor' event from matplotlib */\n", - " event.preventDefault();\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n", - " // Handle any extra behaviour associated with a key event\n", - "};\n", - "\n", - "mpl.figure.prototype.key_event = function (event, name) {\n", - " // Prevent repeat events\n", - " if (name === 'key_press') {\n", - " if (event.key === this._key) {\n", - " return;\n", - " } else {\n", - " this._key = event.key;\n", - " }\n", - " }\n", - " if (name === 'key_release') {\n", - " this._key = null;\n", - " }\n", - "\n", - " var value = '';\n", - " if (event.ctrlKey && event.key !== 'Control') {\n", - " value += 'ctrl+';\n", - " }\n", - " else if (event.altKey && event.key !== 'Alt') {\n", - " value += 'alt+';\n", - " }\n", - " else if (event.shiftKey && event.key !== 'Shift') {\n", - " value += 'shift+';\n", - " }\n", - "\n", - " value += 'k' + event.key;\n", - "\n", - " this._key_event_extra(event, name);\n", - "\n", - " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n", - " if (name === 'download') {\n", - " this.handle_save(this, null);\n", - " } else {\n", - " this.send_message('toolbar_button', { name: name });\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n", - " this.message.textContent = tooltip;\n", - "};\n", - "\n", - "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", - "// prettier-ignore\n", - "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n", - "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", - "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", - "\n", - "mpl.default_extension = \"png\";/* global mpl */\n", - "\n", - "var comm_websocket_adapter = function (comm) {\n", - " // Create a \"websocket\"-like object which calls the given IPython comm\n", - " // object with the appropriate methods. Currently this is a non binary\n", - " // socket, so there is still some room for performance tuning.\n", - " var ws = {};\n", - "\n", - " ws.binaryType = comm.kernel.ws.binaryType;\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " function updateReadyState(_event) {\n", - " if (comm.kernel.ws) {\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " } else {\n", - " ws.readyState = 3; // Closed state.\n", - " }\n", - " }\n", - " comm.kernel.ws.addEventListener('open', updateReadyState);\n", - " comm.kernel.ws.addEventListener('close', updateReadyState);\n", - " comm.kernel.ws.addEventListener('error', updateReadyState);\n", - "\n", - " ws.close = function () {\n", - " comm.close();\n", - " };\n", - " ws.send = function (m) {\n", - " //console.log('sending', m);\n", - " comm.send(m);\n", - " };\n", - " // Register the callback with on_msg.\n", - " comm.on_msg(function (msg) {\n", - " //console.log('receiving', msg['content']['data'], msg);\n", - " var data = msg['content']['data'];\n", - " if (data['blob'] !== undefined) {\n", - " data = {\n", - " data: new Blob(msg['buffers'], { type: data['blob'] }),\n", - " };\n", - " }\n", - " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", - " ws.onmessage(data);\n", - " });\n", - " return ws;\n", - "};\n", - "\n", - "mpl.mpl_figure_comm = function (comm, msg) {\n", - " // This is the function which gets called when the mpl process\n", - " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", - "\n", - " var id = msg.content.data.id;\n", - " // Get hold of the div created by the display call when the Comm\n", - " // socket was opened in Python.\n", - " var element = document.getElementById(id);\n", - " var ws_proxy = comm_websocket_adapter(comm);\n", - "\n", - " function ondownload(figure, _format) {\n", - " window.open(figure.canvas.toDataURL());\n", - " }\n", - "\n", - " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n", - "\n", - " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", - " // web socket which is closed, not our websocket->open comm proxy.\n", - " ws_proxy.onopen();\n", - "\n", - " fig.parent_element = element;\n", - " fig.cell_info = mpl.find_output_cell(\"
\");\n", - " if (!fig.cell_info) {\n", - " console.error('Failed to find cell for figure', id, fig);\n", - " return;\n", - " }\n", - " fig.cell_info[0].output_area.element.on(\n", - " 'cleared',\n", - " { fig: fig },\n", - " fig._remove_fig_handler\n", - " );\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_close = function (fig, msg) {\n", - " var width = fig.canvas.width / fig.ratio;\n", - " fig.cell_info[0].output_area.element.off(\n", - " 'cleared',\n", - " fig._remove_fig_handler\n", - " );\n", - " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n", - "\n", - " // Update the output cell to use the data from the current canvas.\n", - " fig.push_to_output();\n", - " var dataURL = fig.canvas.toDataURL();\n", - " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", - " // the notebook keyboard shortcuts fail.\n", - " IPython.keyboard_manager.enable();\n", - " fig.parent_element.innerHTML =\n", - " '';\n", - " fig.close_ws(fig, msg);\n", - "};\n", - "\n", - "mpl.figure.prototype.close_ws = function (fig, msg) {\n", - " fig.send_message('closing', msg);\n", - " // fig.ws.close()\n", - "};\n", - "\n", - "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n", - " // Turn the data on the canvas into data in the output cell.\n", - " var width = this.canvas.width / this.ratio;\n", - " var dataURL = this.canvas.toDataURL();\n", - " this.cell_info[1]['text/html'] =\n", - " '';\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Tell IPython that the notebook contents must change.\n", - " IPython.notebook.set_dirty(true);\n", - " this.send_message('ack', {});\n", - " var fig = this;\n", - " // Wait a second, then push the new image to the DOM so\n", - " // that it is saved nicely (might be nice to debounce this).\n", - " setTimeout(function () {\n", - " fig.push_to_output();\n", - " }, 1000);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'btn-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " var button;\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " continue;\n", - " }\n", - "\n", - " button = fig.buttons[name] = document.createElement('button');\n", - " button.classList = 'btn btn-default';\n", - " button.href = '#';\n", - " button.title = name;\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message pull-right';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = document.createElement('div');\n", - " buttongrp.classList = 'btn-group inline pull-right';\n", - " button = document.createElement('button');\n", - " button.classList = 'btn btn-mini btn-primary';\n", - " button.href = '#';\n", - " button.title = 'Stop Interaction';\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', function (_evt) {\n", - " fig.handle_close(fig, {});\n", - " });\n", - " button.addEventListener(\n", - " 'mouseover',\n", - " on_mouseover_closure('Stop Interaction')\n", - " );\n", - " buttongrp.appendChild(button);\n", - " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", - " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", - "};\n", - "\n", - "mpl.figure.prototype._remove_fig_handler = function (event) {\n", - " var fig = event.data.fig;\n", - " if (event.target !== this) {\n", - " // Ignore bubbled events from children.\n", - " return;\n", - " }\n", - " fig.close_ws(fig, {});\n", - "};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (el) {\n", - " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (el) {\n", - " // this is important to make the div 'focusable\n", - " el.setAttribute('tabindex', 0);\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " } else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (event, _name) {\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which === 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " fig.ondownload(fig, null);\n", - "};\n", - "\n", - "mpl.find_output_cell = function (html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i = 0; i < ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code') {\n", - " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] === html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "};\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel !== null) {\n", - " IPython.notebook.kernel.comm_manager.register_target(\n", - " 'matplotlib',\n", - " mpl.mpl_figure_comm\n", - " );\n", - "}\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" + "
\n", + "
\n", + " Figure\n", + "
\n", + " \n", + "
\n", + " " ], "text/plain": [ - "" + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, @@ -13278,7 +896,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 11, @@ -13442,7 +1060,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.5" + "version": "3.10.13" } }, "nbformat": 4, diff --git a/stride_examples/tutorials/06_imaging.ipynb b/stride_examples/tutorials/06_imaging.ipynb index 02aadcfd..4d387462 100644 --- a/stride_examples/tutorials/06_imaging.ipynb +++ b/stride_examples/tutorials/06_imaging.ipynb @@ -50,12 +50,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "HEAD Listening at \n", - "MONITOR Listening at \n", - "WAREHOUSE Listening at \n", - "NODE:0 Listening at \n", - "WORKER:0:0 Listening at \n", - "WORKER:0:1 Listening at \n" + "Listening at HEAD Listening at \n" ] } ], @@ -84,7 +79,7 @@ "outputs": [], "source": [ "from stride import Space, Time, Grid\n", - "%matplotlib notebook\n", + "%matplotlib widget\n", "\n", "space = Space(shape=(356, 385), extra=(50, 50), absorbing=(40, 40), spacing=0.5e-3)\n", "time = Time(start=0.0e-6, step=0.08e-6, num=2500)\n", @@ -207,1961 +202,49 @@ "outputs": [ { "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "/* global mpl */\n", - "window.mpl = {};\n", - "\n", - "mpl.get_websocket_type = function () {\n", - " if (typeof WebSocket !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof MozWebSocket !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert(\n", - " 'Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.'\n", - " );\n", - " }\n", - "};\n", - "\n", - "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = this.ws.binaryType !== undefined;\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById('mpl-warnings');\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent =\n", - " 'This browser does not support binary websocket messages. ' +\n", - " 'Performance may be slow.';\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = document.createElement('div');\n", - " this.root.setAttribute('style', 'display: inline-block');\n", - " this._root_extra_style(this.root);\n", - "\n", - " parent_element.appendChild(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message('supports_binary', { value: fig.supports_binary });\n", - " fig.send_message('send_image_mode', {});\n", - " if (fig.ratio !== 1) {\n", - " fig.send_message('set_device_pixel_ratio', {\n", - " device_pixel_ratio: fig.ratio,\n", - " });\n", - " }\n", - " fig.send_message('refresh', {});\n", - " };\n", - "\n", - " this.imageObj.onload = function () {\n", - " if (fig.image_mode === 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function () {\n", - " fig.ws.close();\n", - " };\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "};\n", - "\n", - "mpl.figure.prototype._init_header = function () {\n", - " var titlebar = document.createElement('div');\n", - " titlebar.classList =\n", - " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", - " var titletext = document.createElement('div');\n", - " titletext.classList = 'ui-dialog-title';\n", - " titletext.setAttribute(\n", - " 'style',\n", - " 'width: 100%; text-align: center; padding: 3px;'\n", - " );\n", - " titlebar.appendChild(titletext);\n", - " this.root.appendChild(titlebar);\n", - " this.header = titletext;\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._init_canvas = function () {\n", - " var fig = this;\n", - "\n", - " var canvas_div = (this.canvas_div = document.createElement('div'));\n", - " canvas_div.setAttribute(\n", - " 'style',\n", - " 'border: 1px solid #ddd;' +\n", - " 'box-sizing: content-box;' +\n", - " 'clear: both;' +\n", - " 'min-height: 1px;' +\n", - " 'min-width: 1px;' +\n", - " 'outline: 0;' +\n", - " 'overflow: hidden;' +\n", - " 'position: relative;' +\n", - " 'resize: both;'\n", - " );\n", - "\n", - " function on_keyboard_event_closure(name) {\n", - " return function (event) {\n", - " return fig.key_event(event, name);\n", - " };\n", - " }\n", - "\n", - " canvas_div.addEventListener(\n", - " 'keydown',\n", - " on_keyboard_event_closure('key_press')\n", - " );\n", - " canvas_div.addEventListener(\n", - " 'keyup',\n", - " on_keyboard_event_closure('key_release')\n", - " );\n", - "\n", - " this._canvas_extra_style(canvas_div);\n", - " this.root.appendChild(canvas_div);\n", - "\n", - " var canvas = (this.canvas = document.createElement('canvas'));\n", - " canvas.classList.add('mpl-canvas');\n", - " canvas.setAttribute('style', 'box-sizing: content-box;');\n", - "\n", - " this.context = canvas.getContext('2d');\n", - "\n", - " var backingStore =\n", - " this.context.backingStorePixelRatio ||\n", - " this.context.webkitBackingStorePixelRatio ||\n", - " this.context.mozBackingStorePixelRatio ||\n", - " this.context.msBackingStorePixelRatio ||\n", - " this.context.oBackingStorePixelRatio ||\n", - " this.context.backingStorePixelRatio ||\n", - " 1;\n", - "\n", - " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", - " 'canvas'\n", - " ));\n", - " rubberband_canvas.setAttribute(\n", - " 'style',\n", - " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", - " );\n", - "\n", - " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", - " if (this.ResizeObserver === undefined) {\n", - " if (window.ResizeObserver !== undefined) {\n", - " this.ResizeObserver = window.ResizeObserver;\n", - " } else {\n", - " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", - " this.ResizeObserver = obs.ResizeObserver;\n", - " }\n", - " }\n", - "\n", - " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", - " var nentries = entries.length;\n", - " for (var i = 0; i < nentries; i++) {\n", - " var entry = entries[i];\n", - " var width, height;\n", - " if (entry.contentBoxSize) {\n", - " if (entry.contentBoxSize instanceof Array) {\n", - " // Chrome 84 implements new version of spec.\n", - " width = entry.contentBoxSize[0].inlineSize;\n", - " height = entry.contentBoxSize[0].blockSize;\n", - " } else {\n", - " // Firefox implements old version of spec.\n", - " width = entry.contentBoxSize.inlineSize;\n", - " height = entry.contentBoxSize.blockSize;\n", - " }\n", - " } else {\n", - " // Chrome <84 implements even older version of spec.\n", - " width = entry.contentRect.width;\n", - " height = entry.contentRect.height;\n", - " }\n", - "\n", - " // Keep the size of the canvas and rubber band canvas in sync with\n", - " // the canvas container.\n", - " if (entry.devicePixelContentBoxSize) {\n", - " // Chrome 84 implements new version of spec.\n", - " canvas.setAttribute(\n", - " 'width',\n", - " entry.devicePixelContentBoxSize[0].inlineSize\n", - " );\n", - " canvas.setAttribute(\n", - " 'height',\n", - " entry.devicePixelContentBoxSize[0].blockSize\n", - " );\n", - " } else {\n", - " canvas.setAttribute('width', width * fig.ratio);\n", - " canvas.setAttribute('height', height * fig.ratio);\n", - " }\n", - " canvas.setAttribute(\n", - " 'style',\n", - " 'width: ' + width + 'px; height: ' + height + 'px;'\n", - " );\n", - "\n", - " rubberband_canvas.setAttribute('width', width);\n", - " rubberband_canvas.setAttribute('height', height);\n", - "\n", - " // And update the size in Python. We ignore the initial 0/0 size\n", - " // that occurs as the element is placed into the DOM, which should\n", - " // otherwise not happen due to the minimum size styling.\n", - " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", - " fig.request_resize(width, height);\n", - " }\n", - " }\n", - " });\n", - " this.resizeObserverInstance.observe(canvas_div);\n", + "application/vnd.jupyter.widget-view+json": { + "model_id": "62612f4f80b9419f94caf7555ff78e84", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "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9KUv8fDDD3PzzTfz/PPPc/755085bnfGvL1zPMkvfvELHnjgga2uLZtJ5xjgxRdf5NRTT+XQQw/lrrvu4rHHHuNLX/rSlG0Yuztmg2HGow07zPHHH68/+tGPTrnv0EMP1Z///Of3UESvzODgoAb03XffrbXWOo5j3dfXp7/61a+2jqnVajqfz+tvf/vbeypMXSwW9UEHHaRvv/12ffrpp+tPfvKTWuuZGe/nPvc5feqpp27z8ZkY81vf+lb9//1//9+U+y644AL9/ve/X2s982IG9C233NL6ejrxjY+Pa9d19Y033tg6Zt26ddqyLH3bbbft9pi3xh/+8AcN6JdeeklrvWdj3la8a9eu1fPnz9dPPvmkXrhwof6Hf/iH1mMz8Ry/5z3vaf0eb409HbPBMBMxFcAdpNFosGzZMs4666wp95911lncd999eyiqV2ZiYgKAjo4OAFauXMnAwMCU9+D7PqeffvoefQ8XX3wxb33rW3nzm9885f6ZGO8vf/lLjj32WN71rnfR09PD0UcfzXe/+93W4zMx5lNPPZXf/va3PP/88wA89thj3HvvvfzRH/3RjI15c6YT37JlywiCYMox/f39LF68eEa8B5DPo1KqVS2eaTHHccxFF13EZZddxuGHH77F4zMx3l/96lccfPDBnH322fT09HDCCSdMaRPPtJgNhpmASQB3kOHhYaIoore3d8r9vb29DAwM7KGoto3WmksvvZRTTz2VxYsXA7TinEnv4cYbb+Thhx/mmmuu2eKxmRjvihUruP766znooIP49a9/zUc/+lE+8YlP8OMf/xiYmTF/7nOf48ILL+TQQw/FdV2OPvpoLrnkEi688EJgZsa8OdOJb2BgAM/zaG9v3+Yxe5JarcbnP/953ve+95HL5YCZF/O1116L4zh84hOf2OrjMy3ewcFBSqUSX/3qVznnnHP4zW9+wzvf+U4uuOAC7r777hkZs8EwE5jTq+B2BqXUlK+11lvcNxP42Mc+xuOPP8699967xWMz5T2sWbOGT37yk/zmN7+ZMrPzcmZKvCBVh2OPPZarr74agKOPPpqnnnqK66+/ng984AOt42ZSzDfddBM//elP+fnPf87hhx/Oo48+yiWXXEJ/fz8f/OAHW8fNpJi3xquJbya8hyAIeO9730scx3zrW9/a7vF7IuZly5bxjW98g4cffniHv/eeOseTIqa3v/3tfOpTnwLgqKOO4r777uPb3/42p59++jafOxN+LwyGPYWpAO4gXV1d2La9xb8aBwcHt6hM7Gk+/vGP88tf/pI777yTffbZp3V/X18fwIx5D8uWLWNwcJAlS5bgOA6O43D33Xfzj//4jziO04pppsQLMG/ePF73utdNue+www5rCYFm2jkGuOyyy/j85z/Pe9/7Xo444gguuugiPvWpT7WqrjMx5s2ZTnx9fX00Gg3Gxsa2ecyeIAgC3v3ud7Ny5Upuv/32VvUPZlbMS5cuZXBwkH333bf1WXzppZf49Kc/zX777Tfj4gW5JjuOs93P40yK2WCYCZgEcAfxPI8lS5Zw++23T7n/9ttv5+STT95DUU1Fa83HPvYxbr75Zn73u9+xaNGiKY8vWrSIvr6+Ke+h0Whw991375H38KY3vYknnniCRx99tHU79thj+dM//VMeffRR9t9//xkVL8App5yyhbXO888/z8KFC4GZd45BFKmWNfUjb9t2q4IyE2PenOnEt2TJElzXnXLMhg0bePLJJ/fYe5hM/pYvX84dd9xBZ2fnlMdnUswXXXQRjz/++JTPYn9/P5dddhm//vWvZ1y8INfk44477hU/jzMtZoNhRrBntCd7NzfeeKN2XVffcMMN+umnn9aXXHKJTqfTetWqVXs6NK211n/5l3+p8/m8vuuuu/SGDRtat0ql0jrmq1/9qs7n8/rmm2/WTzzxhL7wwgv1vHnzdKFQ2IORb2JzFbDWMy/eP/zhD9pxHP03f/M3evny5fpnP/uZTqVS+qc//emMjfmDH/ygnj9/vv6v//ovvXLlSn3zzTfrrq4u/dnPfnbGxFwsFvUjjzyiH3nkEQ3or3/96/qRRx5pKWanE99HP/pRvc8+++g77rhDP/zww/rMM8/URx55pA7DcLfHHASBPv/88/U+++yjH3300Smfx3q9vkdi3t45fjkvVwHv7ninE/PNN9+sXdfV3/nOd/Ty5cv1P/3TP2nbtvXSpUv3WMwGw0zHJICvkn/+53/WCxcu1J7n6WOOOaZlsTITALZ6+8EPftA6Jo5jfcUVV+i+vj7t+75+wxveoJ944ok9F/TLeHkCOBPj/c///E+9ePFi7fu+PvTQQ/V3vvOdKY/PtJgLhYL+5Cc/qffdd1+dSCT0/vvvry+//PIpiciejvnOO+/c6u/uBz/4wWnHV61W9cc+9jHd0dGhk8mkPu+88/Tq1av3SMwrV67c5ufxzjvv3CMxb+8cv5ytJYAz6RxPcsMNN+gDDzxQJxIJfeSRR+pf/OIXezRmg2Gmo7TW+rWtMRoMBoPBYDAYZhJmBtBgMBgMBoNhjmESQIPBYDAYDIY5hkkADQaDwWAwGOYYJgE0GAwGg8FgmGOYBNBgMBgMBoNhjmESQIPBYDAYDIY5hkkADQaDwWAwGOYYJgE0GAwGg8FgmGOYBNBgMEybG264gbPOOmuPfO/PfOYzfOITn9gj39tgMBhmG2YTiMFgmBb1ep3999+fG2+8kdNOO223f//BwUEOOOAAHn/8cRYtWrTbv7/BYDDMJkwF0GAwTIv/+I//IJPJ7JHkD6Cnp4ezzjqLb3/723vk+xsMBsNswiSABsMcY2hoiL6+Pq6++urWfQ888ACe5/Gb3/xmm8+78cYbOf/886fc96EPfYh3vOMdXH311fT29tLW1sZVV11FGIZcdtlldHR0sM8++/D973+/9ZxVq1ahlOJf//VfOe2000gmkxx33HE8//zzPPjggxx77LFkMhnOOecchoaGpny/888/n3/5l3/ZRWfCYDAY5i4mATQY5hjd3d18//vf58orr+Shhx6iVCrx/ve/n7/6q796xfm+pUuXcuyxx25x/+9+9zvWr1/PPffcw9e//nWuvPJKzjvvPNrb23nggQf46Ec/ykc/+lHWrFkz5XlXXHEFX/ziF3n44YdxHIcLL7yQz372s3zjG99g6dKlvPjii/zv//2/pzzn+OOPZ82aNbz00ku75mQYDAbDHMXMABoMc5SLL76YO+64g+OOO47HHnuMBx98kEQisdVjx8fHaW9v55577pnSAv7Qhz7EXXfdxYoVK7As+ffkoYceSk9PD/fccw8AURSRz+f53ve+x3vf+15WrVrFokWL+N73vseHP/xhQKqLF154Ib/97W8588wzAfjqV7/KD3/4Q5599tnW9ysUCuTzee666y5OP/301+S8GAwGw1zAVAANhjnK3/3d3xGGIf/6r//Kz372s20mfwDVahVgq8ccfvjhreQPoLe3lyOOOKL1tW3bdHZ2Mjg4OOV5r3/966c8B5jyvN7e3i2ek0wmAahUKtt9fwaDwWDYNiYBNBjmKCtWrGD9+vXEcbzdlmpnZydKKcbGxrZ4zHXdKV8rpbZ6XxzH23yeUmqr9738OaOjo4C0sQ0Gg8Hw6jEJoMEwB2k0Gvzpn/4p73nPe/jKV77Chz/8YTZu3LjN4z3P43Wvex1PP/30boxyS5588klc1+Xwww/fo3EYDAbD3o5JAA2GOcjll1/OxMQE//iP/8hnP/tZDjvssNY83rY4++yzuffee3dThFtn6dKlLeWwwWAwGF49JgE0GOYYd911F9dddx0/+clPyOVyWJbFT37yE+69916uv/76bT7vIx/5CLfeeisTExO7Mdqp/Mu//Asf+chH9tj3NxgMhtmCUQEbDIZp8+53v5ujjz6aL3zhC7v9e//qV7/isssu4/HHH8dxnN3+/Q0Gg2E2YSqABoNh2vzt3/4tmUxmj3zvcrnMD37wA5P8GQwGwy7AVAANBoPBYDAY5himAmgwGAwGg8EwxzAJoMFgMBgMBsMcwySABoPBYDAYDHMMkwAaDAaDwWAwzDFMAmgwGAwGg8EwxzAJoMFgMBgMBsMcwySABoPBYDAYDHMMkwAaDAaDwWAwzDFMAmgwGAwGg8Ewx/j/AQwTH++C8Qm/AAAAAElFTkSuQmCC", + "text/html": [ "\n", - " function on_mouse_event_closure(name) {\n", - " return function (event) {\n", - " return fig.mouse_event(event, name);\n", - " };\n", - " }\n", + "
\n", + "
\n", + " Figure\n", + "
\n", + " \n", + "
\n", + " " + ], + "text/plain": [ + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7750b412a62343d5bb3b78147090e587", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "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", + "text/html": [ "\n", - " rubberband_canvas.addEventListener(\n", - " 'mousedown',\n", - " on_mouse_event_closure('button_press')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseup',\n", - " on_mouse_event_closure('button_release')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'dblclick',\n", - " on_mouse_event_closure('dblclick')\n", - " );\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband_canvas.addEventListener(\n", - " 'mousemove',\n", - " on_mouse_event_closure('motion_notify')\n", - " );\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseenter',\n", - " on_mouse_event_closure('figure_enter')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseleave',\n", - " on_mouse_event_closure('figure_leave')\n", - " );\n", - "\n", - " canvas_div.addEventListener('wheel', function (event) {\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " on_mouse_event_closure('scroll')(event);\n", - " });\n", - "\n", - " canvas_div.appendChild(canvas);\n", - " canvas_div.appendChild(rubberband_canvas);\n", - "\n", - " this.rubberband_context = rubberband_canvas.getContext('2d');\n", - " this.rubberband_context.strokeStyle = '#000000';\n", - "\n", - " this._resize_canvas = function (width, height, forward) {\n", - " if (forward) {\n", - " canvas_div.style.width = width + 'px';\n", - " canvas_div.style.height = height + 'px';\n", - " }\n", - " };\n", - "\n", - " // Disable right mouse context menu.\n", - " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n", - " event.preventDefault();\n", - " return false;\n", - " });\n", - "\n", - " function set_focus() {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'mpl-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " continue;\n", - " }\n", - "\n", - " var button = (fig.buttons[name] = document.createElement('button'));\n", - " button.classList = 'mpl-widget';\n", - " button.setAttribute('role', 'button');\n", - " button.setAttribute('aria-disabled', 'false');\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - "\n", - " var icon_img = document.createElement('img');\n", - " icon_img.src = '_images/' + image + '.png';\n", - " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", - " icon_img.alt = tooltip;\n", - " button.appendChild(icon_img);\n", - "\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " var fmt_picker = document.createElement('select');\n", - " fmt_picker.classList = 'mpl-widget';\n", - " toolbar.appendChild(fmt_picker);\n", - " this.format_dropdown = fmt_picker;\n", - "\n", - " for (var ind in mpl.extensions) {\n", - " var fmt = mpl.extensions[ind];\n", - " var option = document.createElement('option');\n", - " option.selected = fmt === mpl.default_extension;\n", - " option.innerHTML = fmt;\n", - " fmt_picker.appendChild(option);\n", - " }\n", - "\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "};\n", - "\n", - "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n", - " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", - " // which will in turn request a refresh of the image.\n", - " this.send_message('resize', { width: x_pixels, height: y_pixels });\n", - "};\n", - "\n", - "mpl.figure.prototype.send_message = function (type, properties) {\n", - " properties['type'] = type;\n", - " properties['figure_id'] = this.id;\n", - " this.ws.send(JSON.stringify(properties));\n", - "};\n", - "\n", - "mpl.figure.prototype.send_draw_message = function () {\n", - " if (!this.waiting) {\n", - " this.waiting = true;\n", - " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " var format_dropdown = fig.format_dropdown;\n", - " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", - " fig.ondownload(fig, format);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_resize = function (fig, msg) {\n", - " var size = msg['size'];\n", - " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n", - " fig._resize_canvas(size[0], size[1], msg['forward']);\n", - " fig.send_message('refresh', {});\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", - " var x0 = msg['x0'] / fig.ratio;\n", - " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", - " var x1 = msg['x1'] / fig.ratio;\n", - " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n", - " x0 = Math.floor(x0) + 0.5;\n", - " y0 = Math.floor(y0) + 0.5;\n", - " x1 = Math.floor(x1) + 0.5;\n", - " y1 = Math.floor(y1) + 0.5;\n", - " var min_x = Math.min(x0, x1);\n", - " var min_y = Math.min(y0, y1);\n", - " var width = Math.abs(x1 - x0);\n", - " var height = Math.abs(y1 - y0);\n", - "\n", - " fig.rubberband_context.clearRect(\n", - " 0,\n", - " 0,\n", - " fig.canvas.width / fig.ratio,\n", - " fig.canvas.height / fig.ratio\n", - " );\n", - "\n", - " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n", - " // Updates the figure title.\n", - " fig.header.textContent = msg['label'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n", - " fig.rubberband_canvas.style.cursor = msg['cursor'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_message = function (fig, msg) {\n", - " fig.message.textContent = msg['message'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n", - " // Request the server to send over a new figure.\n", - " fig.send_draw_message();\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n", - " fig.image_mode = msg['mode'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n", - " for (var key in msg) {\n", - " if (!(key in fig.buttons)) {\n", - " continue;\n", - " }\n", - " fig.buttons[key].disabled = !msg[key];\n", - " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", - " if (msg['mode'] === 'PAN') {\n", - " fig.buttons['Pan'].classList.add('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " } else if (msg['mode'] === 'ZOOM') {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.add('active');\n", - " } else {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Called whenever the canvas gets updated.\n", - " this.send_message('ack', {});\n", - "};\n", - "\n", - "// A function to construct a web socket function for onmessage handling.\n", - "// Called in the figure constructor.\n", - "mpl.figure.prototype._make_on_message_function = function (fig) {\n", - " return function socket_on_message(evt) {\n", - " if (evt.data instanceof Blob) {\n", - " var img = evt.data;\n", - " if (img.type !== 'image/png') {\n", - " /* FIXME: We get \"Resource interpreted as Image but\n", - " * transferred with MIME type text/plain:\" errors on\n", - " * Chrome. But how to set the MIME type? It doesn't seem\n", - " * to be part of the websocket stream */\n", - " img.type = 'image/png';\n", - " }\n", - "\n", - " /* Free the memory for the previous frames */\n", - " if (fig.imageObj.src) {\n", - " (window.URL || window.webkitURL).revokeObjectURL(\n", - " fig.imageObj.src\n", - " );\n", - " }\n", - "\n", - " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", - " img\n", - " );\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " } else if (\n", - " typeof evt.data === 'string' &&\n", - " evt.data.slice(0, 21) === 'data:image/png;base64'\n", - " ) {\n", - " fig.imageObj.src = evt.data;\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - "\n", - " var msg = JSON.parse(evt.data);\n", - " var msg_type = msg['type'];\n", - "\n", - " // Call the \"handle_{type}\" callback, which takes\n", - " // the figure and JSON message as its only arguments.\n", - " try {\n", - " var callback = fig['handle_' + msg_type];\n", - " } catch (e) {\n", - " console.log(\n", - " \"No handler for the '\" + msg_type + \"' message type: \",\n", - " msg\n", - " );\n", - " return;\n", - " }\n", - "\n", - " if (callback) {\n", - " try {\n", - " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", - " callback(fig, msg);\n", - " } catch (e) {\n", - " console.log(\n", - " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", - " e,\n", - " e.stack,\n", - " msg\n", - " );\n", - " }\n", - " }\n", - " };\n", - "};\n", - "\n", - "// from https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", - "mpl.findpos = function (e) {\n", - " //this section is from http://www.quirksmode.org/js/events_properties.html\n", - " var targ;\n", - " if (!e) {\n", - " e = window.event;\n", - " }\n", - " if (e.target) {\n", - " targ = e.target;\n", - " } else if (e.srcElement) {\n", - " targ = e.srcElement;\n", - " }\n", - " if (targ.nodeType === 3) {\n", - " // defeat Safari bug\n", - " targ = targ.parentNode;\n", - " }\n", - "\n", - " // pageX,Y are the mouse positions relative to the document\n", - " var boundingRect = targ.getBoundingClientRect();\n", - " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", - " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n", - "\n", - " return { x: x, y: y };\n", - "};\n", - "\n", - "/*\n", - " * return a copy of an object with only non-object keys\n", - " * we need this to avoid circular references\n", - " * https://stackoverflow.com/a/24161582/3208463\n", - " */\n", - "function simpleKeys(original) {\n", - " return Object.keys(original).reduce(function (obj, key) {\n", - " if (typeof original[key] !== 'object') {\n", - " obj[key] = original[key];\n", - " }\n", - " return obj;\n", - " }, {});\n", - "}\n", - "\n", - "mpl.figure.prototype.mouse_event = function (event, name) {\n", - " var canvas_pos = mpl.findpos(event);\n", - "\n", - " if (name === 'button_press') {\n", - " this.canvas.focus();\n", - " this.canvas_div.focus();\n", - " }\n", - "\n", - " var x = canvas_pos.x * this.ratio;\n", - " var y = canvas_pos.y * this.ratio;\n", - "\n", - " this.send_message(name, {\n", - " x: x,\n", - " y: y,\n", - " button: event.button,\n", - " step: event.step,\n", - " guiEvent: simpleKeys(event),\n", - " });\n", - "\n", - " /* This prevents the web browser from automatically changing to\n", - " * the text insertion cursor when the button is pressed. We want\n", - " * to control all of the cursor setting manually through the\n", - " * 'cursor' event from matplotlib */\n", - " event.preventDefault();\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n", - " // Handle any extra behaviour associated with a key event\n", - "};\n", - "\n", - "mpl.figure.prototype.key_event = function (event, name) {\n", - " // Prevent repeat events\n", - " if (name === 'key_press') {\n", - " if (event.key === this._key) {\n", - " return;\n", - " } else {\n", - " this._key = event.key;\n", - " }\n", - " }\n", - " if (name === 'key_release') {\n", - " this._key = null;\n", - " }\n", - "\n", - " var value = '';\n", - " if (event.ctrlKey && event.key !== 'Control') {\n", - " value += 'ctrl+';\n", - " }\n", - " else if (event.altKey && event.key !== 'Alt') {\n", - " value += 'alt+';\n", - " }\n", - " else if (event.shiftKey && event.key !== 'Shift') {\n", - " value += 'shift+';\n", - " }\n", - "\n", - " value += 'k' + event.key;\n", - "\n", - " this._key_event_extra(event, name);\n", - "\n", - " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n", - " if (name === 'download') {\n", - " this.handle_save(this, null);\n", - " } else {\n", - " this.send_message('toolbar_button', { name: name });\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n", - " this.message.textContent = tooltip;\n", - "};\n", - "\n", - "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", - "// prettier-ignore\n", - "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n", - "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", - "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", - "\n", - "mpl.default_extension = \"png\";/* global mpl */\n", - "\n", - "var comm_websocket_adapter = function (comm) {\n", - " // Create a \"websocket\"-like object which calls the given IPython comm\n", - " // object with the appropriate methods. Currently this is a non binary\n", - " // socket, so there is still some room for performance tuning.\n", - " var ws = {};\n", - "\n", - " ws.binaryType = comm.kernel.ws.binaryType;\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " function updateReadyState(_event) {\n", - " if (comm.kernel.ws) {\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " } else {\n", - " ws.readyState = 3; // Closed state.\n", - " }\n", - " }\n", - " comm.kernel.ws.addEventListener('open', updateReadyState);\n", - " comm.kernel.ws.addEventListener('close', updateReadyState);\n", - " comm.kernel.ws.addEventListener('error', updateReadyState);\n", - "\n", - " ws.close = function () {\n", - " comm.close();\n", - " };\n", - " ws.send = function (m) {\n", - " //console.log('sending', m);\n", - " comm.send(m);\n", - " };\n", - " // Register the callback with on_msg.\n", - " comm.on_msg(function (msg) {\n", - " //console.log('receiving', msg['content']['data'], msg);\n", - " var data = msg['content']['data'];\n", - " if (data['blob'] !== undefined) {\n", - " data = {\n", - " data: new Blob(msg['buffers'], { type: data['blob'] }),\n", - " };\n", - " }\n", - " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", - " ws.onmessage(data);\n", - " });\n", - " return ws;\n", - "};\n", - "\n", - "mpl.mpl_figure_comm = function (comm, msg) {\n", - " // This is the function which gets called when the mpl process\n", - " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", - "\n", - " var id = msg.content.data.id;\n", - " // Get hold of the div created by the display call when the Comm\n", - " // socket was opened in Python.\n", - " var element = document.getElementById(id);\n", - " var ws_proxy = comm_websocket_adapter(comm);\n", - "\n", - " function ondownload(figure, _format) {\n", - " window.open(figure.canvas.toDataURL());\n", - " }\n", - "\n", - " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n", - "\n", - " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", - " // web socket which is closed, not our websocket->open comm proxy.\n", - " ws_proxy.onopen();\n", - "\n", - " fig.parent_element = element;\n", - " fig.cell_info = mpl.find_output_cell(\"
\");\n", - " if (!fig.cell_info) {\n", - " console.error('Failed to find cell for figure', id, fig);\n", - " return;\n", - " }\n", - " fig.cell_info[0].output_area.element.on(\n", - " 'cleared',\n", - " { fig: fig },\n", - " fig._remove_fig_handler\n", - " );\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_close = function (fig, msg) {\n", - " var width = fig.canvas.width / fig.ratio;\n", - " fig.cell_info[0].output_area.element.off(\n", - " 'cleared',\n", - " fig._remove_fig_handler\n", - " );\n", - " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n", - "\n", - " // Update the output cell to use the data from the current canvas.\n", - " fig.push_to_output();\n", - " var dataURL = fig.canvas.toDataURL();\n", - " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", - " // the notebook keyboard shortcuts fail.\n", - " IPython.keyboard_manager.enable();\n", - " fig.parent_element.innerHTML =\n", - " '';\n", - " fig.close_ws(fig, msg);\n", - "};\n", - "\n", - "mpl.figure.prototype.close_ws = function (fig, msg) {\n", - " fig.send_message('closing', msg);\n", - " // fig.ws.close()\n", - "};\n", - "\n", - "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n", - " // Turn the data on the canvas into data in the output cell.\n", - " var width = this.canvas.width / this.ratio;\n", - " var dataURL = this.canvas.toDataURL();\n", - " this.cell_info[1]['text/html'] =\n", - " '';\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Tell IPython that the notebook contents must change.\n", - " IPython.notebook.set_dirty(true);\n", - " this.send_message('ack', {});\n", - " var fig = this;\n", - " // Wait a second, then push the new image to the DOM so\n", - " // that it is saved nicely (might be nice to debounce this).\n", - " setTimeout(function () {\n", - " fig.push_to_output();\n", - " }, 1000);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'btn-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " var button;\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " continue;\n", - " }\n", - "\n", - " button = fig.buttons[name] = document.createElement('button');\n", - " button.classList = 'btn btn-default';\n", - " button.href = '#';\n", - " button.title = name;\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message pull-right';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = document.createElement('div');\n", - " buttongrp.classList = 'btn-group inline pull-right';\n", - " button = document.createElement('button');\n", - " button.classList = 'btn btn-mini btn-primary';\n", - " button.href = '#';\n", - " button.title = 'Stop Interaction';\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', function (_evt) {\n", - " fig.handle_close(fig, {});\n", - " });\n", - " button.addEventListener(\n", - " 'mouseover',\n", - " on_mouseover_closure('Stop Interaction')\n", - " );\n", - " buttongrp.appendChild(button);\n", - " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", - " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", - "};\n", - "\n", - "mpl.figure.prototype._remove_fig_handler = function (event) {\n", - " var fig = event.data.fig;\n", - " if (event.target !== this) {\n", - " // Ignore bubbled events from children.\n", - " return;\n", - " }\n", - " fig.close_ws(fig, {});\n", - "};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (el) {\n", - " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (el) {\n", - " // this is important to make the div 'focusable\n", - " el.setAttribute('tabindex', 0);\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " } else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (event, _name) {\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which === 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " fig.ondownload(fig, null);\n", - "};\n", - "\n", - "mpl.find_output_cell = function (html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i = 0; i < ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code') {\n", - " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] === html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "};\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel !== null) {\n", - " IPython.notebook.kernel.comm_manager.register_target(\n", - " 'matplotlib',\n", - " mpl.mpl_figure_comm\n", - " );\n", - "}\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "QApplication: invalid style override passed, ignoring it.\n", - " Available styles: Windows, Fusion\n" - ] - }, - { - "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "/* global mpl */\n", - "window.mpl = {};\n", - "\n", - "mpl.get_websocket_type = function () {\n", - " if (typeof WebSocket !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof MozWebSocket !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert(\n", - " 'Your browser does not have WebSocket support. ' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.'\n", - " );\n", - " }\n", - "};\n", - "\n", - "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = this.ws.binaryType !== undefined;\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById('mpl-warnings');\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent =\n", - " 'This browser does not support binary websocket messages. ' +\n", - " 'Performance may be slow.';\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = document.createElement('div');\n", - " this.root.setAttribute('style', 'display: inline-block');\n", - " this._root_extra_style(this.root);\n", - "\n", - " parent_element.appendChild(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message('supports_binary', { value: fig.supports_binary });\n", - " fig.send_message('send_image_mode', {});\n", - " if (fig.ratio !== 1) {\n", - " fig.send_message('set_device_pixel_ratio', {\n", - " device_pixel_ratio: fig.ratio,\n", - " });\n", - " }\n", - " fig.send_message('refresh', {});\n", - " };\n", - "\n", - " this.imageObj.onload = function () {\n", - " if (fig.image_mode === 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function () {\n", - " fig.ws.close();\n", - " };\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "};\n", - "\n", - "mpl.figure.prototype._init_header = function () {\n", - " var titlebar = document.createElement('div');\n", - " titlebar.classList =\n", - " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n", - " var titletext = document.createElement('div');\n", - " titletext.classList = 'ui-dialog-title';\n", - " titletext.setAttribute(\n", - " 'style',\n", - " 'width: 100%; text-align: center; padding: 3px;'\n", - " );\n", - " titlebar.appendChild(titletext);\n", - " this.root.appendChild(titlebar);\n", - " this.header = titletext;\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n", - "\n", - "mpl.figure.prototype._init_canvas = function () {\n", - " var fig = this;\n", - "\n", - " var canvas_div = (this.canvas_div = document.createElement('div'));\n", - " canvas_div.setAttribute(\n", - " 'style',\n", - " 'border: 1px solid #ddd;' +\n", - " 'box-sizing: content-box;' +\n", - " 'clear: both;' +\n", - " 'min-height: 1px;' +\n", - " 'min-width: 1px;' +\n", - " 'outline: 0;' +\n", - " 'overflow: hidden;' +\n", - " 'position: relative;' +\n", - " 'resize: both;'\n", - " );\n", - "\n", - " function on_keyboard_event_closure(name) {\n", - " return function (event) {\n", - " return fig.key_event(event, name);\n", - " };\n", - " }\n", - "\n", - " canvas_div.addEventListener(\n", - " 'keydown',\n", - " on_keyboard_event_closure('key_press')\n", - " );\n", - " canvas_div.addEventListener(\n", - " 'keyup',\n", - " on_keyboard_event_closure('key_release')\n", - " );\n", - "\n", - " this._canvas_extra_style(canvas_div);\n", - " this.root.appendChild(canvas_div);\n", - "\n", - " var canvas = (this.canvas = document.createElement('canvas'));\n", - " canvas.classList.add('mpl-canvas');\n", - " canvas.setAttribute('style', 'box-sizing: content-box;');\n", - "\n", - " this.context = canvas.getContext('2d');\n", - "\n", - " var backingStore =\n", - " this.context.backingStorePixelRatio ||\n", - " this.context.webkitBackingStorePixelRatio ||\n", - " this.context.mozBackingStorePixelRatio ||\n", - " this.context.msBackingStorePixelRatio ||\n", - " this.context.oBackingStorePixelRatio ||\n", - " this.context.backingStorePixelRatio ||\n", - " 1;\n", - "\n", - " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n", - " 'canvas'\n", - " ));\n", - " rubberband_canvas.setAttribute(\n", - " 'style',\n", - " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n", - " );\n", - "\n", - " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n", - " if (this.ResizeObserver === undefined) {\n", - " if (window.ResizeObserver !== undefined) {\n", - " this.ResizeObserver = window.ResizeObserver;\n", - " } else {\n", - " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n", - " this.ResizeObserver = obs.ResizeObserver;\n", - " }\n", - " }\n", - "\n", - " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n", - " var nentries = entries.length;\n", - " for (var i = 0; i < nentries; i++) {\n", - " var entry = entries[i];\n", - " var width, height;\n", - " if (entry.contentBoxSize) {\n", - " if (entry.contentBoxSize instanceof Array) {\n", - " // Chrome 84 implements new version of spec.\n", - " width = entry.contentBoxSize[0].inlineSize;\n", - " height = entry.contentBoxSize[0].blockSize;\n", - " } else {\n", - " // Firefox implements old version of spec.\n", - " width = entry.contentBoxSize.inlineSize;\n", - " height = entry.contentBoxSize.blockSize;\n", - " }\n", - " } else {\n", - " // Chrome <84 implements even older version of spec.\n", - " width = entry.contentRect.width;\n", - " height = entry.contentRect.height;\n", - " }\n", - "\n", - " // Keep the size of the canvas and rubber band canvas in sync with\n", - " // the canvas container.\n", - " if (entry.devicePixelContentBoxSize) {\n", - " // Chrome 84 implements new version of spec.\n", - " canvas.setAttribute(\n", - " 'width',\n", - " entry.devicePixelContentBoxSize[0].inlineSize\n", - " );\n", - " canvas.setAttribute(\n", - " 'height',\n", - " entry.devicePixelContentBoxSize[0].blockSize\n", - " );\n", - " } else {\n", - " canvas.setAttribute('width', width * fig.ratio);\n", - " canvas.setAttribute('height', height * fig.ratio);\n", - " }\n", - " canvas.setAttribute(\n", - " 'style',\n", - " 'width: ' + width + 'px; height: ' + height + 'px;'\n", - " );\n", - "\n", - " rubberband_canvas.setAttribute('width', width);\n", - " rubberband_canvas.setAttribute('height', height);\n", - "\n", - " // And update the size in Python. We ignore the initial 0/0 size\n", - " // that occurs as the element is placed into the DOM, which should\n", - " // otherwise not happen due to the minimum size styling.\n", - " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n", - " fig.request_resize(width, height);\n", - " }\n", - " }\n", - " });\n", - " this.resizeObserverInstance.observe(canvas_div);\n", - "\n", - " function on_mouse_event_closure(name) {\n", - " return function (event) {\n", - " return fig.mouse_event(event, name);\n", - " };\n", - " }\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mousedown',\n", - " on_mouse_event_closure('button_press')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseup',\n", - " on_mouse_event_closure('button_release')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'dblclick',\n", - " on_mouse_event_closure('dblclick')\n", - " );\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband_canvas.addEventListener(\n", - " 'mousemove',\n", - " on_mouse_event_closure('motion_notify')\n", - " );\n", - "\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseenter',\n", - " on_mouse_event_closure('figure_enter')\n", - " );\n", - " rubberband_canvas.addEventListener(\n", - " 'mouseleave',\n", - " on_mouse_event_closure('figure_leave')\n", - " );\n", - "\n", - " canvas_div.addEventListener('wheel', function (event) {\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " on_mouse_event_closure('scroll')(event);\n", - " });\n", - "\n", - " canvas_div.appendChild(canvas);\n", - " canvas_div.appendChild(rubberband_canvas);\n", - "\n", - " this.rubberband_context = rubberband_canvas.getContext('2d');\n", - " this.rubberband_context.strokeStyle = '#000000';\n", - "\n", - " this._resize_canvas = function (width, height, forward) {\n", - " if (forward) {\n", - " canvas_div.style.width = width + 'px';\n", - " canvas_div.style.height = height + 'px';\n", - " }\n", - " };\n", - "\n", - " // Disable right mouse context menu.\n", - " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n", - " event.preventDefault();\n", - " return false;\n", - " });\n", - "\n", - " function set_focus() {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'mpl-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'mpl-button-group';\n", - " continue;\n", - " }\n", - "\n", - " var button = (fig.buttons[name] = document.createElement('button'));\n", - " button.classList = 'mpl-widget';\n", - " button.setAttribute('role', 'button');\n", - " button.setAttribute('aria-disabled', 'false');\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - "\n", - " var icon_img = document.createElement('img');\n", - " icon_img.src = '_images/' + image + '.png';\n", - " icon_img.srcset = '_images/' + image + '_large.png 2x';\n", - " icon_img.alt = tooltip;\n", - " button.appendChild(icon_img);\n", - "\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " var fmt_picker = document.createElement('select');\n", - " fmt_picker.classList = 'mpl-widget';\n", - " toolbar.appendChild(fmt_picker);\n", - " this.format_dropdown = fmt_picker;\n", - "\n", - " for (var ind in mpl.extensions) {\n", - " var fmt = mpl.extensions[ind];\n", - " var option = document.createElement('option');\n", - " option.selected = fmt === mpl.default_extension;\n", - " option.innerHTML = fmt;\n", - " fmt_picker.appendChild(option);\n", - " }\n", - "\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "};\n", - "\n", - "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n", - " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", - " // which will in turn request a refresh of the image.\n", - " this.send_message('resize', { width: x_pixels, height: y_pixels });\n", - "};\n", - "\n", - "mpl.figure.prototype.send_message = function (type, properties) {\n", - " properties['type'] = type;\n", - " properties['figure_id'] = this.id;\n", - " this.ws.send(JSON.stringify(properties));\n", - "};\n", - "\n", - "mpl.figure.prototype.send_draw_message = function () {\n", - " if (!this.waiting) {\n", - " this.waiting = true;\n", - " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " var format_dropdown = fig.format_dropdown;\n", - " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", - " fig.ondownload(fig, format);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_resize = function (fig, msg) {\n", - " var size = msg['size'];\n", - " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n", - " fig._resize_canvas(size[0], size[1], msg['forward']);\n", - " fig.send_message('refresh', {});\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n", - " var x0 = msg['x0'] / fig.ratio;\n", - " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n", - " var x1 = msg['x1'] / fig.ratio;\n", - " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n", - " x0 = Math.floor(x0) + 0.5;\n", - " y0 = Math.floor(y0) + 0.5;\n", - " x1 = Math.floor(x1) + 0.5;\n", - " y1 = Math.floor(y1) + 0.5;\n", - " var min_x = Math.min(x0, x1);\n", - " var min_y = Math.min(y0, y1);\n", - " var width = Math.abs(x1 - x0);\n", - " var height = Math.abs(y1 - y0);\n", - "\n", - " fig.rubberband_context.clearRect(\n", - " 0,\n", - " 0,\n", - " fig.canvas.width / fig.ratio,\n", - " fig.canvas.height / fig.ratio\n", - " );\n", - "\n", - " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n", - " // Updates the figure title.\n", - " fig.header.textContent = msg['label'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n", - " fig.rubberband_canvas.style.cursor = msg['cursor'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_message = function (fig, msg) {\n", - " fig.message.textContent = msg['message'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n", - " // Request the server to send over a new figure.\n", - " fig.send_draw_message();\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n", - " fig.image_mode = msg['mode'];\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n", - " for (var key in msg) {\n", - " if (!(key in fig.buttons)) {\n", - " continue;\n", - " }\n", - " fig.buttons[key].disabled = !msg[key];\n", - " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n", - " if (msg['mode'] === 'PAN') {\n", - " fig.buttons['Pan'].classList.add('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " } else if (msg['mode'] === 'ZOOM') {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.add('active');\n", - " } else {\n", - " fig.buttons['Pan'].classList.remove('active');\n", - " fig.buttons['Zoom'].classList.remove('active');\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Called whenever the canvas gets updated.\n", - " this.send_message('ack', {});\n", - "};\n", - "\n", - "// A function to construct a web socket function for onmessage handling.\n", - "// Called in the figure constructor.\n", - "mpl.figure.prototype._make_on_message_function = function (fig) {\n", - " return function socket_on_message(evt) {\n", - " if (evt.data instanceof Blob) {\n", - " var img = evt.data;\n", - " if (img.type !== 'image/png') {\n", - " /* FIXME: We get \"Resource interpreted as Image but\n", - " * transferred with MIME type text/plain:\" errors on\n", - " * Chrome. But how to set the MIME type? It doesn't seem\n", - " * to be part of the websocket stream */\n", - " img.type = 'image/png';\n", - " }\n", - "\n", - " /* Free the memory for the previous frames */\n", - " if (fig.imageObj.src) {\n", - " (window.URL || window.webkitURL).revokeObjectURL(\n", - " fig.imageObj.src\n", - " );\n", - " }\n", - "\n", - " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", - " img\n", - " );\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " } else if (\n", - " typeof evt.data === 'string' &&\n", - " evt.data.slice(0, 21) === 'data:image/png;base64'\n", - " ) {\n", - " fig.imageObj.src = evt.data;\n", - " fig.updated_canvas_event();\n", - " fig.waiting = false;\n", - " return;\n", - " }\n", - "\n", - " var msg = JSON.parse(evt.data);\n", - " var msg_type = msg['type'];\n", - "\n", - " // Call the \"handle_{type}\" callback, which takes\n", - " // the figure and JSON message as its only arguments.\n", - " try {\n", - " var callback = fig['handle_' + msg_type];\n", - " } catch (e) {\n", - " console.log(\n", - " \"No handler for the '\" + msg_type + \"' message type: \",\n", - " msg\n", - " );\n", - " return;\n", - " }\n", - "\n", - " if (callback) {\n", - " try {\n", - " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n", - " callback(fig, msg);\n", - " } catch (e) {\n", - " console.log(\n", - " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n", - " e,\n", - " e.stack,\n", - " msg\n", - " );\n", - " }\n", - " }\n", - " };\n", - "};\n", - "\n", - "// from https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n", - "mpl.findpos = function (e) {\n", - " //this section is from http://www.quirksmode.org/js/events_properties.html\n", - " var targ;\n", - " if (!e) {\n", - " e = window.event;\n", - " }\n", - " if (e.target) {\n", - " targ = e.target;\n", - " } else if (e.srcElement) {\n", - " targ = e.srcElement;\n", - " }\n", - " if (targ.nodeType === 3) {\n", - " // defeat Safari bug\n", - " targ = targ.parentNode;\n", - " }\n", - "\n", - " // pageX,Y are the mouse positions relative to the document\n", - " var boundingRect = targ.getBoundingClientRect();\n", - " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n", - " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n", - "\n", - " return { x: x, y: y };\n", - "};\n", - "\n", - "/*\n", - " * return a copy of an object with only non-object keys\n", - " * we need this to avoid circular references\n", - " * https://stackoverflow.com/a/24161582/3208463\n", - " */\n", - "function simpleKeys(original) {\n", - " return Object.keys(original).reduce(function (obj, key) {\n", - " if (typeof original[key] !== 'object') {\n", - " obj[key] = original[key];\n", - " }\n", - " return obj;\n", - " }, {});\n", - "}\n", - "\n", - "mpl.figure.prototype.mouse_event = function (event, name) {\n", - " var canvas_pos = mpl.findpos(event);\n", - "\n", - " if (name === 'button_press') {\n", - " this.canvas.focus();\n", - " this.canvas_div.focus();\n", - " }\n", - "\n", - " var x = canvas_pos.x * this.ratio;\n", - " var y = canvas_pos.y * this.ratio;\n", - "\n", - " this.send_message(name, {\n", - " x: x,\n", - " y: y,\n", - " button: event.button,\n", - " step: event.step,\n", - " guiEvent: simpleKeys(event),\n", - " });\n", - "\n", - " /* This prevents the web browser from automatically changing to\n", - " * the text insertion cursor when the button is pressed. We want\n", - " * to control all of the cursor setting manually through the\n", - " * 'cursor' event from matplotlib */\n", - " event.preventDefault();\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n", - " // Handle any extra behaviour associated with a key event\n", - "};\n", - "\n", - "mpl.figure.prototype.key_event = function (event, name) {\n", - " // Prevent repeat events\n", - " if (name === 'key_press') {\n", - " if (event.key === this._key) {\n", - " return;\n", - " } else {\n", - " this._key = event.key;\n", - " }\n", - " }\n", - " if (name === 'key_release') {\n", - " this._key = null;\n", - " }\n", - "\n", - " var value = '';\n", - " if (event.ctrlKey && event.key !== 'Control') {\n", - " value += 'ctrl+';\n", - " }\n", - " else if (event.altKey && event.key !== 'Alt') {\n", - " value += 'alt+';\n", - " }\n", - " else if (event.shiftKey && event.key !== 'Shift') {\n", - " value += 'shift+';\n", - " }\n", - "\n", - " value += 'k' + event.key;\n", - "\n", - " this._key_event_extra(event, name);\n", - "\n", - " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n", - " return false;\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n", - " if (name === 'download') {\n", - " this.handle_save(this, null);\n", - " } else {\n", - " this.send_message('toolbar_button', { name: name });\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n", - " this.message.textContent = tooltip;\n", - "};\n", - "\n", - "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n", - "// prettier-ignore\n", - "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n", - "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", - "\n", - "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", - "\n", - "mpl.default_extension = \"png\";/* global mpl */\n", - "\n", - "var comm_websocket_adapter = function (comm) {\n", - " // Create a \"websocket\"-like object which calls the given IPython comm\n", - " // object with the appropriate methods. Currently this is a non binary\n", - " // socket, so there is still some room for performance tuning.\n", - " var ws = {};\n", - "\n", - " ws.binaryType = comm.kernel.ws.binaryType;\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " function updateReadyState(_event) {\n", - " if (comm.kernel.ws) {\n", - " ws.readyState = comm.kernel.ws.readyState;\n", - " } else {\n", - " ws.readyState = 3; // Closed state.\n", - " }\n", - " }\n", - " comm.kernel.ws.addEventListener('open', updateReadyState);\n", - " comm.kernel.ws.addEventListener('close', updateReadyState);\n", - " comm.kernel.ws.addEventListener('error', updateReadyState);\n", - "\n", - " ws.close = function () {\n", - " comm.close();\n", - " };\n", - " ws.send = function (m) {\n", - " //console.log('sending', m);\n", - " comm.send(m);\n", - " };\n", - " // Register the callback with on_msg.\n", - " comm.on_msg(function (msg) {\n", - " //console.log('receiving', msg['content']['data'], msg);\n", - " var data = msg['content']['data'];\n", - " if (data['blob'] !== undefined) {\n", - " data = {\n", - " data: new Blob(msg['buffers'], { type: data['blob'] }),\n", - " };\n", - " }\n", - " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", - " ws.onmessage(data);\n", - " });\n", - " return ws;\n", - "};\n", - "\n", - "mpl.mpl_figure_comm = function (comm, msg) {\n", - " // This is the function which gets called when the mpl process\n", - " // starts-up an IPython Comm through the \"matplotlib\" channel.\n", - "\n", - " var id = msg.content.data.id;\n", - " // Get hold of the div created by the display call when the Comm\n", - " // socket was opened in Python.\n", - " var element = document.getElementById(id);\n", - " var ws_proxy = comm_websocket_adapter(comm);\n", - "\n", - " function ondownload(figure, _format) {\n", - " window.open(figure.canvas.toDataURL());\n", - " }\n", - "\n", - " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n", - "\n", - " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", - " // web socket which is closed, not our websocket->open comm proxy.\n", - " ws_proxy.onopen();\n", - "\n", - " fig.parent_element = element;\n", - " fig.cell_info = mpl.find_output_cell(\"
\");\n", - " if (!fig.cell_info) {\n", - " console.error('Failed to find cell for figure', id, fig);\n", - " return;\n", - " }\n", - " fig.cell_info[0].output_area.element.on(\n", - " 'cleared',\n", - " { fig: fig },\n", - " fig._remove_fig_handler\n", - " );\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_close = function (fig, msg) {\n", - " var width = fig.canvas.width / fig.ratio;\n", - " fig.cell_info[0].output_area.element.off(\n", - " 'cleared',\n", - " fig._remove_fig_handler\n", - " );\n", - " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n", - "\n", - " // Update the output cell to use the data from the current canvas.\n", - " fig.push_to_output();\n", - " var dataURL = fig.canvas.toDataURL();\n", - " // Re-enable the keyboard manager in IPython - without this line, in FF,\n", - " // the notebook keyboard shortcuts fail.\n", - " IPython.keyboard_manager.enable();\n", - " fig.parent_element.innerHTML =\n", - " '';\n", - " fig.close_ws(fig, msg);\n", - "};\n", - "\n", - "mpl.figure.prototype.close_ws = function (fig, msg) {\n", - " fig.send_message('closing', msg);\n", - " // fig.ws.close()\n", - "};\n", - "\n", - "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n", - " // Turn the data on the canvas into data in the output cell.\n", - " var width = this.canvas.width / this.ratio;\n", - " var dataURL = this.canvas.toDataURL();\n", - " this.cell_info[1]['text/html'] =\n", - " '';\n", - "};\n", - "\n", - "mpl.figure.prototype.updated_canvas_event = function () {\n", - " // Tell IPython that the notebook contents must change.\n", - " IPython.notebook.set_dirty(true);\n", - " this.send_message('ack', {});\n", - " var fig = this;\n", - " // Wait a second, then push the new image to the DOM so\n", - " // that it is saved nicely (might be nice to debounce this).\n", - " setTimeout(function () {\n", - " fig.push_to_output();\n", - " }, 1000);\n", - "};\n", - "\n", - "mpl.figure.prototype._init_toolbar = function () {\n", - " var fig = this;\n", - "\n", - " var toolbar = document.createElement('div');\n", - " toolbar.classList = 'btn-toolbar';\n", - " this.root.appendChild(toolbar);\n", - "\n", - " function on_click_closure(name) {\n", - " return function (_event) {\n", - " return fig.toolbar_button_onclick(name);\n", - " };\n", - " }\n", - "\n", - " function on_mouseover_closure(tooltip) {\n", - " return function (event) {\n", - " if (!event.currentTarget.disabled) {\n", - " return fig.toolbar_button_onmouseover(tooltip);\n", - " }\n", - " };\n", - " }\n", - "\n", - " fig.buttons = {};\n", - " var buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " var button;\n", - " for (var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " /* Instead of a spacer, we start a new button group. */\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - " buttonGroup = document.createElement('div');\n", - " buttonGroup.classList = 'btn-group';\n", - " continue;\n", - " }\n", - "\n", - " button = fig.buttons[name] = document.createElement('button');\n", - " button.classList = 'btn btn-default';\n", - " button.href = '#';\n", - " button.title = name;\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', on_click_closure(method_name));\n", - " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n", - " buttonGroup.appendChild(button);\n", - " }\n", - "\n", - " if (buttonGroup.hasChildNodes()) {\n", - " toolbar.appendChild(buttonGroup);\n", - " }\n", - "\n", - " // Add the status bar.\n", - " var status_bar = document.createElement('span');\n", - " status_bar.classList = 'mpl-message pull-right';\n", - " toolbar.appendChild(status_bar);\n", - " this.message = status_bar;\n", - "\n", - " // Add the close button to the window.\n", - " var buttongrp = document.createElement('div');\n", - " buttongrp.classList = 'btn-group inline pull-right';\n", - " button = document.createElement('button');\n", - " button.classList = 'btn btn-mini btn-primary';\n", - " button.href = '#';\n", - " button.title = 'Stop Interaction';\n", - " button.innerHTML = '';\n", - " button.addEventListener('click', function (_evt) {\n", - " fig.handle_close(fig, {});\n", - " });\n", - " button.addEventListener(\n", - " 'mouseover',\n", - " on_mouseover_closure('Stop Interaction')\n", - " );\n", - " buttongrp.appendChild(button);\n", - " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n", - " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n", - "};\n", - "\n", - "mpl.figure.prototype._remove_fig_handler = function (event) {\n", - " var fig = event.data.fig;\n", - " if (event.target !== this) {\n", - " // Ignore bubbled events from children.\n", - " return;\n", - " }\n", - " fig.close_ws(fig, {});\n", - "};\n", - "\n", - "mpl.figure.prototype._root_extra_style = function (el) {\n", - " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n", - "};\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function (el) {\n", - " // this is important to make the div 'focusable\n", - " el.setAttribute('tabindex', 0);\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " } else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype._key_event_extra = function (event, _name) {\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which === 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "};\n", - "\n", - "mpl.figure.prototype.handle_save = function (fig, _msg) {\n", - " fig.ondownload(fig, null);\n", - "};\n", - "\n", - "mpl.find_output_cell = function (html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i = 0; i < ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code') {\n", - " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] === html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "};\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel !== null) {\n", - " IPython.notebook.kernel.comm_manager.register_target(\n", - " 'matplotlib',\n", - " mpl.mpl_figure_comm\n", - " );\n", - "}\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" + "
\n", + "
\n", + " Figure\n", + "
\n", + " \n", + "
\n", + " " ], "text/plain": [ - "" + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, @@ -2221,1205 +304,2491 @@ "text": [ "HEAD Giving shot 0 to worker:0:0\n", "HEAD Giving shot 1 to worker:0:1\n", - "WORKER:0:0 Default Devito configuration:\n", - "WORKER:0:0 \t * autotuning=['aggressive', 'runtime']\n", - "WORKER:0:0 \t * develop-mode=False\n", - "WORKER:0:0 \t * mpi=False\n", - "WORKER:0:0 \t * log-level=DEBUG\n", - "WORKER:0:0 \t * language=openmp\n", + "MONITOR Listening at \n", "WORKER:0:1 Default Devito configuration:\n", "WORKER:0:1 \t * autotuning=['aggressive', 'runtime']\n", "WORKER:0:1 \t * develop-mode=False\n", "WORKER:0:1 \t * mpi=False\n", "WORKER:0:1 \t * log-level=DEBUG\n", "WORKER:0:1 \t * language=openmp\n", - "WORKER:0:0 (ShotID 0) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 0) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 0) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 0) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 0) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 0) Selected time stepping scheme OT2\n", + "WORKER:0:0 Default Devito configuration:\n", + "WORKER:0:0 \t * autotuning=['aggressive', 'runtime']\n", + "WORKER:0:0 \t * develop-mode=False\n", + "WORKER:0:0 \t * mpi=False\n", + "WORKER:0:0 \t * log-level=DEBUG\n", + "WORKER:0:0 \t * language=openmp\n", + "WORKER:0:1 (ShotID 1) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 gcc -march=native -O3 -g -fPIC -Wall -std=c99 -Wno-unused-result -Wno-unused-variable -Wno-unused-but-set-variable -ffast-math -shared -fopenmp /tmp/devito-jitcache-uid1000/7b28505e483f600df7684c75761349468315bee6.c -lm -o /tmp/devito-jitcache-uid1000/7b28505e483f600df7684c75761349468315bee6.so\n", "WORKER:0:1 (ShotID 1) Preparing to run state for shot\n", "WORKER:0:1 (ShotID 1) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 1) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:1 (ShotID 1) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", "WORKER:0:1 (ShotID 1) Selected undersampling level 4\n", "WORKER:0:1 (ShotID 1) Selected time stepping scheme OT2\n", - "WORKER:0:0 Operator `acoustic_iso_state` instance configuration:\n", - "WORKER:0:0 \t * name=acoustic_iso_state\n", - "WORKER:0:0 \t * subs={h_x: 0.0005, h_y: 0.0005, dt: 8e-08}\n", - "WORKER:0:0 \t * opt=advanced-fsg\n", - "WORKER:0:0 \t * devicecreate=(p(t, x, y),)\n", "WORKER:0:1 Operator `acoustic_iso_state` instance configuration:\n", "WORKER:0:1 \t * name=acoustic_iso_state\n", "WORKER:0:1 \t * subs={h_x: 0.0005, h_y: 0.0005, dt: 8e-08}\n", "WORKER:0:1 \t * opt=advanced-fsg\n", "WORKER:0:1 \t * devicecreate=(p(t, x, y),)\n", - "WORKER:0:0 Operator `acoustic_iso_state` generated in 1.00 s\n", - "WORKER:0:0 * lowering.Clusters: 0.43 s (43.1 %)\n", - "WORKER:0:0 * specializing.Clusters: 0.24 s (24.1 %)\n", - "WORKER:0:0 * lowering.IET: 0.31 s (31.1 %)\n", - "WORKER:0:0 * specializing.IET: 0.22 s (22.1 %)\n", - "WORKER:0:0 * lowering.Expressions: 0.25 s (25.1 %)\n", - "WORKER:0:0 Flops reduction after symbolic optimization: [99 --> 54]\n", - "WORKER:0:1 Operator `acoustic_iso_state` generated in 1.01 s\n", - "WORKER:0:1 * lowering.Clusters: 0.43 s (42.7 %)\n", - "WORKER:0:1 * specializing.Clusters: 0.24 s (23.9 %)\n", - "WORKER:0:1 * lowering.IET: 0.31 s (30.8 %)\n", - "WORKER:0:1 * specializing.IET: 0.22 s (21.9 %)\n", - "WORKER:0:1 * lowering.Expressions: 0.25 s (24.9 %)\n", - "WORKER:0:1 Flops reduction after symbolic optimization: [99 --> 54]\n", - "WORKER:0:0 Operator `acoustic_iso_state` fetched `/tmp/devito-jitcache-uid1000/c1fd47be13a421e6347921e532e75bc1816bb899.c` in 0.05 s from jit-cache\n", + "WORKER:0:1 Operator `acoustic_iso_state` generated in 1.59 s\n", + "WORKER:0:1 * lowering.Clusters: 0.93 s (58.7 %)\n", + "WORKER:0:1 * specializing.Clusters: 0.51 s (32.2 %)\n", + "WORKER:0:1 Flops reduction after symbolic optimization: [99 --> 55]\n", + "WORKER:0:1 Operator `acoustic_iso_state` jit-compiled `/tmp/devito-jitcache-uid1000/7b28505e483f600df7684c75761349468315bee6.c` in 0.30 s with `GNUCompiler`\n", + "WORKER:0:1 (ShotID 1) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.29 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 82.00 GFlops/s, 1.91 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.28 s [OI=2.63, 85.16 GFlops/s, 1.99 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.14 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 3.10 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 1) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 0) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 0) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 0) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 0) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 0) Selected time stepping scheme OT2\n", + "WORKER:0:0 Operator `acoustic_iso_state` instance configuration:\n", + "WORKER:0:0 \t * name=acoustic_iso_state\n", + "WORKER:0:0 \t * subs={h_x: 0.0005, h_y: 0.0005, dt: 8e-08}\n", + "WORKER:0:0 \t * opt=advanced-fsg\n", + "WORKER:0:0 \t * devicecreate=(p(t, x, y),)\n", + "WORKER:0:0 Operator `acoustic_iso_state` generated in 1.50 s\n", + "WORKER:0:0 * lowering.Clusters: 0.86 s (57.7 %)\n", + "WORKER:0:0 * specializing.Clusters: 0.49 s (32.9 %)\n", + "WORKER:0:0 Flops reduction after symbolic optimization: [99 --> 55]\n", + "WORKER:0:0 Operator `acoustic_iso_state` fetched `/tmp/devito-jitcache-uid1000/7b28505e483f600df7684c75761349468315bee6.c` in 1.06 s from jit-cache\n", "WORKER:0:0 (ShotID 0) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.42 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 56.62 GFlops/s, 1.32 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.02 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.38 s [OI=2.63, 63.74 GFlops/s, 1.49 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.05 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 2.38 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 0) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 0) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "HEAD Shot 0 retrieved\n", + "HEAD Retrieved traces for shot 0\n", + "HEAD Giving shot 2 to worker:0:0\n", + "HEAD Shot 1 retrieved\n", + "HEAD Retrieved traces for shot 1\n", + "HEAD Giving shot 3 to worker:0:1\n", + "WORKER:0:0 (ShotID 2) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 2) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 2) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 2) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 2) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 2) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 2) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.41 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 58.00 GFlops/s, 1.35 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.39 s [OI=2.63, 61.07 GFlops/s, 1.43 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 2.62 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 2) Completed state equation run for shot\n", + "HEAD Shot 2 retrieved\n", + "HEAD Retrieved traces for shot 2\n", + "HEAD Giving shot 4 to worker:0:0\n", + "WORKER:0:1 (ShotID 3) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 3) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 3) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 3) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 3) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 3) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 3) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.85 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 27.98 GFlops/s, 0.66 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.02 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.73 s [OI=2.63, 32.94 GFlops/s, 0.77 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.08 s [OI=5.80, 0.01 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.48 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 3) Completed state equation run for shot\n", + "HEAD Shot 3 retrieved\n", + "HEAD Retrieved traces for shot 3\n", + "HEAD Giving shot 5 to worker:0:1\n", + "WORKER:0:0 (ShotID 4) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 4) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 4) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 4) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 4) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 4) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 4) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.24 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 19.18 GFlops/s, 0.45 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 1.19 s [OI=2.63, 20.11 GFlops/s, 0.47 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.75 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 4) Completed state equation run for shot\n", + "HEAD Shot 4 retrieved\n", + "HEAD Retrieved traces for shot 4\n", + "HEAD Giving shot 6 to worker:0:0\n", + "WORKER:0:1 (ShotID 5) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 5) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 5) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 5) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 5) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 5) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 5) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.21 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 19.66 GFlops/s, 0.46 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 1.15 s [OI=2.63, 20.80 GFlops/s, 0.49 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.68 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 5) Completed state equation run for shot\n", + "HEAD Shot 5 retrieved\n", + "HEAD Retrieved traces for shot 5\n", + "HEAD Giving shot 7 to worker:0:1\n", + "WORKER:0:0 (ShotID 6) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 6) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 6) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 6) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 6) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 6) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 6) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.01 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 23.55 GFlops/s, 0.55 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.96 s [OI=2.63, 24.83 GFlops/s, 0.58 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.90 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 6) Completed state equation run for shot\n", + "HEAD Shot 6 retrieved\n", + "HEAD Retrieved traces for shot 6\n", + "HEAD Giving shot 8 to worker:0:0\n", + "WORKER:0:1 (ShotID 7) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 7) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 7) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 7) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 7) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 7) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 7) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.68 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 34.97 GFlops/s, 0.82 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.64 s [OI=2.63, 37.65 GFlops/s, 0.88 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.14 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 7) Completed state equation run for shot\n", + "HEAD Shot 7 retrieved\n", + "HEAD Retrieved traces for shot 7\n", + "HEAD Giving shot 9 to worker:0:1\n", + "WORKER:0:1 (ShotID 9) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 9) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 9) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 9) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 9) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 9) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 9) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.99 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 24.02 GFlops/s, 0.56 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.95 s [OI=2.63, 25.27 GFlops/s, 0.59 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.83 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 9) Completed state equation run for shot\n", + "HEAD Shot 9 retrieved\n", + "HEAD Retrieved traces for shot 9\n", + "HEAD Giving shot 10 to worker:0:1\n", + "WORKER:0:0 (ShotID 8) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 8) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 8) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 8) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 8) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 8) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 8) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.28 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 18.58 GFlops/s, 0.44 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 1.23 s [OI=2.63, 19.36 GFlops/s, 0.46 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.73 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 8) Completed state equation run for shot\n", + "HEAD Shot 8 retrieved\n", + "HEAD Retrieved traces for shot 8\n", + "HEAD Giving shot 11 to worker:0:0\n", + "WORKER:0:1 (ShotID 10) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 10) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 10) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 10) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 10) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 10) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 10) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.24 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 19.18 GFlops/s, 0.45 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 1.19 s [OI=2.63, 20.04 GFlops/s, 0.47 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.69 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 10) Completed state equation run for shot\n", + "HEAD Shot 10 retrieved\n", + "HEAD Retrieved traces for shot 10\n", + "HEAD Giving shot 12 to worker:0:1\n", + "WORKER:0:0 (ShotID 11) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 11) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 11) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 11) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 11) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 11) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 11) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.17 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 20.33 GFlops/s, 0.48 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 1.13 s [OI=2.63, 21.14 GFlops/s, 0.50 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.78 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 11) Completed state equation run for shot\n", + "HEAD Shot 11 retrieved\n", + "HEAD Retrieved traces for shot 11\n", + "HEAD Giving shot 13 to worker:0:0\n", + "WORKER:0:1 (ShotID 12) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 12) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 12) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 12) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 12) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 12) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 12) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.78 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 30.49 GFlops/s, 0.71 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.74 s [OI=2.63, 32.54 GFlops/s, 0.76 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 12) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 13) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` fetched `/tmp/devito-jitcache-uid1000/c1fd47be13a421e6347921e532e75bc1816bb899.c` in 0.07 s from jit-cache\n", - "WORKER:0:1 (ShotID 1) Running state equation for shot\n", + "WORKER:0:0 (ShotID 13) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 13) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 13) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 13) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 13) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 13) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.79 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 30.10 GFlops/s, 0.70 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.75 s [OI=2.63, 31.97 GFlops/s, 0.75 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.09 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 13) Completed state equation run for shot\n", + "HEAD Shot 12 retrieved\n", + "HEAD Retrieved traces for shot 12\n", + "HEAD Giving shot 14 to worker:0:1\n", + "HEAD Shot 13 retrieved\n", + "HEAD Retrieved traces for shot 13\n", + "HEAD Giving shot 15 to worker:0:0\n", + "WORKER:0:1 (ShotID 14) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 14) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 14) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 14) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 14) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 14) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 14) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.71 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 33.50 GFlops/s, 0.78 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.69 s [OI=2.63, 34.92 GFlops/s, 0.82 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.05 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.14 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 14) Completed state equation run for shot\n", + "HEAD Shot 14 retrieved\n", + "HEAD Retrieved traces for shot 14\n", + "HEAD Giving shot 16 to worker:0:1\n", + "WORKER:0:0 (ShotID 15) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 15) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 15) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 15) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 15) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 15) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 15) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.97 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 24.52 GFlops/s, 0.57 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.92 s [OI=2.63, 25.99 GFlops/s, 0.61 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.68 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 15) Completed state equation run for shot\n", + "HEAD Shot 15 retrieved\n", + "HEAD Retrieved traces for shot 15\n", + "HEAD Giving shot 17 to worker:0:0\n", + "WORKER:0:1 (ShotID 16) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 16) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 16) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 16) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 16) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 16) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 16) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.65 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 36.59 GFlops/s, 0.86 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.62 s [OI=2.63, 38.62 GFlops/s, 0.90 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.29 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 16) Completed state equation run for shot\n", + "HEAD Shot 16 retrieved\n", + "HEAD Retrieved traces for shot 16\n", + "HEAD Giving shot 18 to worker:0:1\n", + "WORKER:0:1 (ShotID 18) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 18) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 18) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 18) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 18) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 18) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 18) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.52 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 45.73 GFlops/s, 1.07 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.50 s [OI=2.63, 48.20 GFlops/s, 1.13 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.07 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.07 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 18) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 17) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 17) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 17) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 17) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 17) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 17) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 17) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.96 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 24.77 GFlops/s, 0.58 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.03 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.91 s [OI=2.63, 26.20 GFlops/s, 0.61 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.89 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 17) Completed state equation run for shot\n", + "HEAD Shot 18 retrieved\n", + "HEAD Retrieved traces for shot 18\n", + "HEAD Shot 17 retrieved\n", + "HEAD Retrieved traces for shot 17\n", + "HEAD Giving shot 19 to worker:0:1\n", + "HEAD Giving shot 20 to worker:0:0\n", + "WORKER:0:0 (ShotID 20) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 20) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 20) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 20) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 20) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 20) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 20) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.58 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 41.00 GFlops/s, 0.96 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.54 s [OI=2.63, 44.58 GFlops/s, 1.04 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.70 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 20) Completed state equation run for shot\n", + "HEAD Shot 20 retrieved\n", + "HEAD Retrieved traces for shot 20\n", + "HEAD Giving shot 21 to worker:0:0\n", + "WORKER:0:1 (ShotID 19) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 19) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 19) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 19) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 19) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 19) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 19) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.72 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 33.03 GFlops/s, 0.77 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.05 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.64 s [OI=2.63, 37.17 GFlops/s, 0.87 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.07 s [OI=5.80, 0.01 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.99 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 19) Completed state equation run for shot\n", + "HEAD Shot 19 retrieved\n", + "HEAD Retrieved traces for shot 19\n", + "HEAD Giving shot 22 to worker:0:1\n", + "WORKER:0:0 (ShotID 21) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 21) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 21) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 21) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 21) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 21) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 21) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.77 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 30.89 GFlops/s, 0.72 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.70 s [OI=2.63, 34.16 GFlops/s, 0.80 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.04 s [OI=1.32, 0.37 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 21) Completed state equation run for shot\n", + "HEAD Shot 21 retrieved\n", + "HEAD Retrieved traces for shot 21\n", + "HEAD Giving shot 23 to worker:0:0\n", + "WORKER:0:1 (ShotID 22) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 22) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 22) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 22) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 22) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 22) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 22) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.99 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 24.02 GFlops/s, 0.56 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.93 s [OI=2.63, 25.59 GFlops/s, 0.60 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.89 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 22) Completed state equation run for shot\n", + "HEAD Shot 22 retrieved\n", + "HEAD Retrieved traces for shot 22\n", + "HEAD Giving shot 24 to worker:0:1\n", + "WORKER:0:1 (ShotID 24) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 24) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 24) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 24) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 24) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 24) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 24) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.48 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 49.54 GFlops/s, 1.16 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.47 s [OI=2.63, 51.49 GFlops/s, 1.20 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.07 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.54 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 24) Completed state equation run for shot\n", + "HEAD Shot 24 retrieved\n", + "HEAD Retrieved traces for shot 24\n", + "HEAD Giving shot 25 to worker:0:1\n", + "WORKER:0:0 (ShotID 23) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 23) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 23) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 23) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 23) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 23) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 23) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.00 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 23.78 GFlops/s, 0.56 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.94 s [OI=2.63, 25.46 GFlops/s, 0.60 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.93 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 23) Completed state equation run for shot\n", + "HEAD Shot 23 retrieved\n", + "HEAD Retrieved traces for shot 23\n", + "HEAD Giving shot 26 to worker:0:0\n", + "WORKER:0:1 (ShotID 25) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 25) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 25) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 25) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 25) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 25) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 25) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.98 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 24.27 GFlops/s, 0.57 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.02 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.92 s [OI=2.63, 25.89 GFlops/s, 0.61 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.70 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 25) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 26) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 26) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 26) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 26) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 26) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 26) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 26) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.89 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 26.72 GFlops/s, 0.63 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.84 s [OI=2.63, 28.38 GFlops/s, 0.66 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.08 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 26) Completed state equation run for shot\n", + "HEAD Shot 25 retrieved\n", + "HEAD Retrieved traces for shot 25\n", + "HEAD Giving shot 27 to worker:0:1\n", + "HEAD Shot 26 retrieved\n", + "HEAD Retrieved traces for shot 26\n", + "HEAD Giving shot 28 to worker:0:0\n", + "WORKER:0:0 (ShotID 28) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 28) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 28) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 28) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 28) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 28) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 28) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.62 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 38.36 GFlops/s, 0.90 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.57 s [OI=2.63, 42.43 GFlops/s, 0.99 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.66 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 28) Completed state equation run for shot\n", + "HEAD Shot 28 retrieved\n", + "HEAD Retrieved traces for shot 28\n", + "HEAD Giving shot 29 to worker:0:0\n", + "WORKER:0:1 (ShotID 27) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 27) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 27) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 27) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 27) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 27) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 27) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.81 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 29.36 GFlops/s, 0.69 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.77 s [OI=2.63, 31.17 GFlops/s, 0.73 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.07 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 27) Completed state equation run for shot\n", + "HEAD Shot 27 retrieved\n", + "HEAD Retrieved traces for shot 27\n", + "HEAD Giving shot 30 to worker:0:1\n", + "WORKER:0:0 (ShotID 29) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 29) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 29) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 29) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 29) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 29) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 29) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.51 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 46.63 GFlops/s, 1.09 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.02 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.47 s [OI=2.63, 51.26 GFlops/s, 1.20 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 2.49 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 29) Completed state equation run for shot\n", + "HEAD Shot 29 retrieved\n", + "HEAD Retrieved traces for shot 29\n", + "HEAD Giving shot 31 to worker:0:0\n", + "WORKER:0:1 (ShotID 30) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 30) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 30) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 30) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 30) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 30) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 30) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.69 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 34.47 GFlops/s, 0.81 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.03 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.65 s [OI=2.63, 36.82 GFlops/s, 0.86 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.67 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 30) Completed state equation run for shot\n", + "HEAD Shot 30 retrieved\n", + "HEAD Retrieved traces for shot 30\n", + "HEAD Giving shot 32 to worker:0:1\n", + "WORKER:0:0 (ShotID 31) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 31) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 31) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 31) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 31) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 31) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 31) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.49 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 48.53 GFlops/s, 1.13 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.45 s [OI=2.63, 52.96 GFlops/s, 1.24 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 2.07 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 31) Completed state equation run for shot\n", + "HEAD Shot 31 retrieved\n", + "HEAD Retrieved traces for shot 31\n", + "HEAD Giving shot 33 to worker:0:0\n", + "WORKER:0:1 (ShotID 32) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 32) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 32) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 32) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 32) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 32) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 32) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.89 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 26.72 GFlops/s, 0.63 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.83 s [OI=2.63, 28.65 GFlops/s, 0.67 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.95 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 32) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 33) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 33) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 33) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 33) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 33) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 33) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 33) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.57 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 41.72 GFlops/s, 0.97 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.54 s [OI=2.63, 44.83 GFlops/s, 1.05 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.59 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 33) Completed state equation run for shot\n", + "HEAD Shot 32 retrieved\n", + "HEAD Retrieved traces for shot 32\n", + "HEAD Giving shot 34 to worker:0:1\n", + "HEAD Shot 33 retrieved\n", + "HEAD Retrieved traces for shot 33\n", + "HEAD Giving shot 35 to worker:0:0\n", + "WORKER:0:0 (ShotID 35) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 35) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 35) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 35) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 35) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 35) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 35) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.56 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 42.47 GFlops/s, 0.99 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.54 s [OI=2.63, 44.17 GFlops/s, 1.03 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.47 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 35) Completed state equation run for shot\n", + "HEAD Shot 35 retrieved\n", + "HEAD Retrieved traces for shot 35\n", + "HEAD Giving shot 36 to worker:0:0\n", + "WORKER:0:1 (ShotID 34) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.59 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 43.12 GFlops/s, 0.94 GPts/s]\n", + "WORKER:0:1 (ShotID 34) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 34) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 34) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 34) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 34) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 34) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.89 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 26.72 GFlops/s, 0.63 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.84 s [OI=2.63, 28.31 GFlops/s, 0.66 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.95 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 34) Completed state equation run for shot\n", + "HEAD Shot 34 retrieved\n", + "HEAD Retrieved traces for shot 34\n", + "HEAD Giving shot 37 to worker:0:1\n", + "WORKER:0:0 (ShotID 36) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 36) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 36) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 36) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 36) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 36) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 36) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.48 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 49.54 GFlops/s, 1.16 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.58 s [OI=2.82, 44.35 GFlops/s, 0.97 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.11 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.41 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.45 s [OI=2.63, 53.52 GFlops/s, 1.25 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.89 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 0) Completed state equation run for shot\n", - "HEAD Shot 0 retrieved\n", - "HEAD Retrieved traces for shot 0\n", - "HEAD Giving shot 2 to worker:0:0\n", - "WORKER:0:0 (ShotID 2) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 2) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 2) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 2) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 2) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 2) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 2) Running state equation for shot\n", + "WORKER:0:0 (ShotID 36) Completed state equation run for shot\n", + "HEAD Shot 36 retrieved\n", + "HEAD Retrieved traces for shot 36\n", + "HEAD Giving shot 38 to worker:0:0\n", + "WORKER:0:0 (ShotID 38) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.61 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 41.71 GFlops/s, 0.91 GPts/s]\n", + "WORKER:0:0 (ShotID 38) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 38) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 38) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 38) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 38) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 38) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.57 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 41.72 GFlops/s, 0.97 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.53 s [OI=2.63, 45.01 GFlops/s, 1.05 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.69 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 38) Completed state equation run for shot\n", + "HEAD Shot 38 retrieved\n", + "HEAD Retrieved traces for shot 38\n", + "HEAD Giving shot 39 to worker:0:0\n", + "WORKER:0:1 (ShotID 37) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 37) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 37) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 37) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 37) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 37) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 37) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.05 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 22.65 GFlops/s, 0.53 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.59 s [OI=2.82, 43.14 GFlops/s, 0.94 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.44 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.02 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 1.00 s [OI=2.63, 23.90 GFlops/s, 0.56 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.76 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 1) Completed state equation run for shot\n", - "HEAD Shot 1 retrieved\n", - "HEAD Retrieved traces for shot 1\n", - "HEAD Giving shot 3 to worker:0:1\n", - "WORKER:0:1 (ShotID 3) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 3) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 3) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 3) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 3) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 3) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 3) Running state equation for shot\n", + "WORKER:0:1 (ShotID 37) Completed state equation run for shot\n", + "HEAD Shot 37 retrieved\n", + "HEAD Retrieved traces for shot 37\n", + "HEAD Giving shot 40 to worker:0:1\n", + "WORKER:0:1 (ShotID 40) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.51 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 49.88 GFlops/s, 1.09 GPts/s]\n", + "WORKER:0:1 (ShotID 40) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 40) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 40) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 40) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 40) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 40) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.62 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 38.36 GFlops/s, 0.90 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.50 s [OI=2.82, 51.60 GFlops/s, 1.13 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.14 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 3.10 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.60 s [OI=2.63, 40.16 GFlops/s, 0.94 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.36 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 3) Completed state equation run for shot\n", - "HEAD Shot 3 retrieved\n", - "HEAD Retrieved traces for shot 3\n", - "HEAD Giving shot 4 to worker:0:1\n", - "WORKER:0:1 (ShotID 4) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 4) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 4) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 4) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 4) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 4) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 4) Running state equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.70 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 36.34 GFlops/s, 0.79 GPts/s]\n", + "WORKER:0:1 (ShotID 40) Completed state equation run for shot\n", + "HEAD Shot 40 retrieved\n", + "HEAD Retrieved traces for shot 40\n", + "HEAD Giving shot 41 to worker:0:1\n", + "WORKER:0:0 (ShotID 39) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 39) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 39) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 39) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 39) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 39) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 39) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.24 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 19.18 GFlops/s, 0.45 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.69 s [OI=2.82, 36.91 GFlops/s, 0.81 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.64 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.02 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 1.18 s [OI=2.63, 20.15 GFlops/s, 0.47 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.71 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 2) Completed state equation run for shot\n", - "HEAD Shot 2 retrieved\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "HEAD Retrieved traces for shot 2\n", - "HEAD Giving shot 5 to worker:0:0\n", - "WORKER:0:0 (ShotID 5) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 5) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 5) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 5) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 5) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 5) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 5) Running state equation for shot\n", + "WORKER:0:0 (ShotID 39) Completed state equation run for shot\n", + "HEAD Shot 39 retrieved\n", + "HEAD Retrieved traces for shot 39\n", + "HEAD Giving shot 42 to worker:0:0\n", + "WORKER:0:0 (ShotID 42) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.60 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 42.40 GFlops/s, 0.93 GPts/s]\n", + "WORKER:0:0 (ShotID 42) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 42) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 42) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 42) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 42) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 42) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.46 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 51.70 GFlops/s, 1.21 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.42 s [OI=2.63, 56.97 GFlops/s, 1.33 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.70 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 42) Completed state equation run for shot\n", + "HEAD Shot 42 retrieved\n", + "HEAD Retrieved traces for shot 42\n", + "HEAD Giving shot 43 to worker:0:0\n", + "WORKER:0:1 (ShotID 41) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 41) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 41) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 41) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 41) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 41) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 41) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.24 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 19.18 GFlops/s, 0.45 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.59 s [OI=2.82, 43.77 GFlops/s, 0.96 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.66 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 1.17 s [OI=2.63, 20.42 GFlops/s, 0.48 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.69 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 4) Completed state equation run for shot\n", - "HEAD Shot 4 retrieved\n", - "HEAD Retrieved traces for shot 4\n", - "HEAD Giving shot 6 to worker:0:1\n", + "WORKER:0:1 (ShotID 41) Completed state equation run for shot\n", + "HEAD Shot 41 retrieved\n", + "HEAD Retrieved traces for shot 41\n", + "HEAD Giving shot 44 to worker:0:1\n", + "WORKER:0:0 (ShotID 43) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 43) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 43) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 43) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 43) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 43) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 43) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.74 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 32.14 GFlops/s, 0.75 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.71 s [OI=2.63, 33.57 GFlops/s, 0.79 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.33 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 43) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 44) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 44) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 44) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 44) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 44) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 44) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 44) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.51 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 46.63 GFlops/s, 1.09 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.49 s [OI=2.63, 48.82 GFlops/s, 1.14 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.07 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.54 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 44) Completed state equation run for shot\n", + "HEAD Shot 43 retrieved\n", + "HEAD Retrieved traces for shot 43\n", + "HEAD Giving shot 45 to worker:0:0\n", + "HEAD Shot 44 retrieved\n", + "HEAD Retrieved traces for shot 44\n", + "HEAD Giving shot 46 to worker:0:1\n", + "WORKER:0:0 (ShotID 45) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 45) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 45) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 45) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 45) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 45) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 45) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.69 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 34.47 GFlops/s, 0.81 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.65 s [OI=2.63, 36.61 GFlops/s, 0.86 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.52 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 45) Completed state equation run for shot\n", + "HEAD Shot 45 retrieved\n", + "HEAD Retrieved traces for shot 45\n", + "HEAD Giving shot 47 to worker:0:0\n", + "WORKER:0:1 (ShotID 46) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 46) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 46) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 46) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 46) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 46) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 46) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.77 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 30.89 GFlops/s, 0.72 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.05 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.74 s [OI=2.63, 32.33 GFlops/s, 0.76 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.26 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 46) Completed state equation run for shot\n", + "HEAD Shot 46 retrieved\n", + "HEAD Retrieved traces for shot 46\n", + "HEAD Giving shot 48 to worker:0:1\n", + "WORKER:0:0 (ShotID 47) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 47) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 47) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 47) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 47) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 47) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 47) Running state equation for shot\n", "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.57 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 44.63 GFlops/s, 0.97 GPts/s]\n", + "WORKER:0:0 Global performance: [OI=2.63, 41.72 GFlops/s, 0.97 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.56 s [OI=2.82, 46.12 GFlops/s, 1.01 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.55 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.53 s [OI=2.63, 45.10 GFlops/s, 1.05 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.95 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 5) Completed state equation run for shot\n", - "WORKER:0:1 (ShotID 6) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 6) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 6) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 6) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 6) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 6) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 6) Running state equation for shot\n", + "WORKER:0:0 (ShotID 47) Completed state equation run for shot\n", + "HEAD Shot 47 retrieved\n", + "HEAD Retrieved traces for shot 47\n", + "HEAD Giving shot 49 to worker:0:0\n", + "WORKER:0:1 (ShotID 48) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "HEAD Shot 5 retrieved\n", - "HEAD Retrieved traces for shot 5\n", - "HEAD Giving shot 7 to worker:0:0\n", - "WORKER:0:0 (ShotID 7) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 7) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 7) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 7) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 7) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 7) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 7) Running state equation for shot\n", + "WORKER:0:1 (ShotID 48) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 48) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 48) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 48) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 48) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 48) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.05 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 22.65 GFlops/s, 0.53 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.93 s [OI=2.63, 25.63 GFlops/s, 0.60 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.10 s [OI=5.80, 0.01 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.57 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 48) Completed state equation run for shot\n", + "HEAD Shot 48 retrieved\n", + "HEAD Retrieved traces for shot 48\n", + "HEAD Giving shot 50 to worker:0:1\n", + "WORKER:0:0 (ShotID 49) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.60 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 42.40 GFlops/s, 0.93 GPts/s]\n", + "WORKER:0:0 (ShotID 49) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 49) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 49) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 49) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 49) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 49) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.12 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 21.24 GFlops/s, 0.50 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 1.09 s [OI=2.63, 21.97 GFlops/s, 0.52 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.74 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 49) Completed state equation run for shot\n", + "HEAD Shot 49 retrieved\n", + "HEAD Retrieved traces for shot 49\n", + "HEAD Giving shot 51 to worker:0:0\n", + "WORKER:0:1 (ShotID 50) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 50) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 50) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 50) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 50) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 50) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 50) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.61 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 38.99 GFlops/s, 0.91 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.59 s [OI=2.82, 43.33 GFlops/s, 0.95 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.11 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.56 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.59 s [OI=2.63, 40.93 GFlops/s, 0.96 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.38 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 6) Completed state equation run for shot\n", - "HEAD Shot 6 retrieved\n", - "HEAD Retrieved traces for shot 6\n", - "HEAD Giving shot 8 to worker:0:1\n", - "WORKER:0:1 (ShotID 8) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 8) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 8) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 8) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 8) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 8) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 8) Running state equation for shot\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.59 s\n", + "WORKER:0:1 (ShotID 50) Completed state equation run for shot\n", + "HEAD Shot 50 retrieved\n", + "HEAD Retrieved traces for shot 50\n", + "HEAD Giving shot 52 to worker:0:1\n", + "WORKER:0:1 (ShotID 52) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 52) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 52) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 52) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 52) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 52) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 52) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.93 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 25.57 GFlops/s, 0.60 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.05 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.89 s [OI=2.63, 26.77 GFlops/s, 0.63 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.86 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 52) Completed state equation run for shot\n", + "HEAD Shot 52 retrieved\n", + "HEAD Retrieved traces for shot 52\n", + "HEAD Giving shot 53 to worker:0:1\n", + "WORKER:0:0 (ShotID 51) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 51) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 51) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 51) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 51) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 51) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 51) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.19 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 19.99 GFlops/s, 0.47 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 1.14 s [OI=2.63, 20.94 GFlops/s, 0.49 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.71 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 51) Completed state equation run for shot\n", + "HEAD Shot 51 retrieved\n", + "HEAD Retrieved traces for shot 51\n", + "HEAD Giving shot 54 to worker:0:0\n", + "WORKER:0:1 (ShotID 53) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Global performance: [OI=2.82, 43.12 GFlops/s, 0.94 GPts/s]\n", + "WORKER:0:1 (ShotID 53) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 53) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 53) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 53) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 53) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 53) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.54 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 44.04 GFlops/s, 1.03 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.52 s [OI=2.63, 45.84 GFlops/s, 1.07 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.39 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 53) Completed state equation run for shot\n", + "HEAD Shot 53 retrieved\n", + "HEAD Retrieved traces for shot 53\n", + "HEAD Giving shot 55 to worker:0:1\n", + "WORKER:0:0 (ShotID 54) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 54) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 54) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 54) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 54) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 54) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 54) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.74 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 32.14 GFlops/s, 0.75 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.58 s [OI=2.82, 44.05 GFlops/s, 0.96 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.62 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.70 s [OI=2.63, 34.27 GFlops/s, 0.80 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.68 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 7) Completed state equation run for shot\n", - "HEAD Shot 7 retrieved\n", - "HEAD Retrieved traces for shot 7\n", - "HEAD Giving shot 9 to worker:0:0\n", - "WORKER:0:0 (ShotID 9) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 9) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 9) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 9) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 9) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 9) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 9) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.48 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 53.00 GFlops/s, 1.16 GPts/s]\n", + "WORKER:0:0 (ShotID 54) Completed state equation run for shot\n", + "HEAD Shot 54 retrieved\n", + "HEAD Retrieved traces for shot 54\n", + "HEAD Giving shot 56 to worker:0:0\n", + "WORKER:0:1 (ShotID 55) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 55) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 55) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 55) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 55) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 55) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 55) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.85 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 27.98 GFlops/s, 0.66 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.47 s [OI=2.82, 54.11 GFlops/s, 1.18 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.16 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 3.17 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.03 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.79 s [OI=2.63, 30.39 GFlops/s, 0.71 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.06 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.09 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 8) Completed state equation run for shot\n", - "HEAD Shot 8 retrieved\n", - "HEAD Retrieved traces for shot 8\n", - "HEAD Giving shot 10 to worker:0:1\n", - "WORKER:0:1 (ShotID 10) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 10) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 10) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 10) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 10) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 10) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 10) Running state equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.60 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 42.40 GFlops/s, 0.93 GPts/s]\n", + "WORKER:0:1 (ShotID 55) Completed state equation run for shot\n", + "HEAD Shot 55 retrieved\n", + "HEAD Retrieved traces for shot 55\n", + "HEAD Giving shot 57 to worker:0:1\n", + "WORKER:0:0 (ShotID 56) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 56) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 56) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 56) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 56) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 56) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 56) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.66 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 36.03 GFlops/s, 0.84 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.59 s [OI=2.82, 43.47 GFlops/s, 0.95 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.14 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.99 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.62 s [OI=2.63, 38.38 GFlops/s, 0.90 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.55 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 9) Completed state equation run for shot\n", - "HEAD Shot 9 retrieved\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "HEAD Retrieved traces for shot 9\n", - "HEAD Giving shot 11 to worker:0:0\n", - "WORKER:0:0 (ShotID 11) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 11) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 11) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 11) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 11) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 11) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 11) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.64 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 39.75 GFlops/s, 0.87 GPts/s]\n", + "WORKER:0:0 (ShotID 56) Completed state equation run for shot\n", + "HEAD Shot 56 retrieved\n", + "HEAD Retrieved traces for shot 56\n", + "HEAD Giving shot 58 to worker:0:0\n", + "WORKER:0:1 (ShotID 57) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 57) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 57) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 57) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 57) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 57) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 57) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.40 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 59.45 GFlops/s, 1.39 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.63 s [OI=2.82, 40.44 GFlops/s, 0.88 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.95 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.05 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.37 s [OI=2.63, 65.18 GFlops/s, 1.52 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 2.60 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 10) Completed state equation run for shot\n", - "HEAD Shot 10 retrieved\n", - "HEAD Retrieved traces for shot 10\n", - "HEAD Giving shot 12 to worker:0:1\n", - "WORKER:0:1 (ShotID 12) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 12) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 12) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 12) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 12) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 12) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 12) Running state equation for shot\n", + "WORKER:0:1 (ShotID 57) Completed state equation run for shot\n", + "HEAD Shot 57 retrieved\n", + "HEAD Retrieved traces for shot 57\n", + "HEAD Giving shot 59 to worker:0:1\n", + "WORKER:0:1 (ShotID 59) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.58 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 43.86 GFlops/s, 0.96 GPts/s]\n", - "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.57 s [OI=2.82, 44.73 GFlops/s, 0.98 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.97 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 11) Completed state equation run for shot\n", - "HEAD Shot 11 retrieved\n", - "HEAD Retrieved traces for shot 11\n", - "HEAD Giving shot 13 to worker:0:0\n", - "WORKER:0:0 (ShotID 13) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 13) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 13) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 13) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 13) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 13) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 13) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.68 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 37.41 GFlops/s, 0.82 GPts/s]\n", + "WORKER:0:1 (ShotID 59) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 59) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 59) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 59) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 59) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 59) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.52 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 45.73 GFlops/s, 1.07 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.67 s [OI=2.82, 38.10 GFlops/s, 0.83 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.14 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.72 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.48 s [OI=2.63, 49.97 GFlops/s, 1.17 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.83 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 12) Completed state equation run for shot\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.48 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 53.00 GFlops/s, 1.16 GPts/s]\n", + "WORKER:0:1 (ShotID 59) Completed state equation run for shot\n", + "HEAD Shot 59 retrieved\n", + "HEAD Retrieved traces for shot 59\n", + "HEAD Giving shot 60 to worker:0:1\n", + "WORKER:0:0 (ShotID 58) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 58) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 58) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 58) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 58) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 58) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 58) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.14 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 20.86 GFlops/s, 0.49 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.47 s [OI=2.82, 54.69 GFlops/s, 1.19 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.95 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 1.08 s [OI=2.63, 22.10 GFlops/s, 0.52 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.76 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 13) Completed state equation run for shot\n", - "HEAD Shot 12 retrieved\n", - "HEAD Retrieved traces for shot 12\n", - "HEAD Giving shot 14 to worker:0:1\n", - "WORKER:0:1 (ShotID 14) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 14) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 14) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 14) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 14) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 14) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 14) Running state equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "HEAD Shot 13 retrieved\n", - "HEAD Retrieved traces for shot 13\n", - "HEAD Giving shot 15 to worker:0:0\n", - "WORKER:0:0 (ShotID 15) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 15) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 15) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 15) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 15) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 15) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 15) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.51 s\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.57 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 49.88 GFlops/s, 1.09 GPts/s]\n", - "WORKER:0:1 Global performance: [OI=2.82, 44.63 GFlops/s, 0.97 GPts/s]\n", + "WORKER:0:0 (ShotID 58) Completed state equation run for shot\n", + "HEAD Shot 58 retrieved\n", + "HEAD Retrieved traces for shot 58\n", + "HEAD Giving shot 61 to worker:0:0\n", + "WORKER:0:1 (ShotID 60) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 60) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 60) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 60) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 60) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 60) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 60) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.88 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 27.03 GFlops/s, 0.63 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.83 s [OI=2.63, 28.85 GFlops/s, 0.68 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.99 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 60) Completed state equation run for shot\n", + "HEAD Shot 60 retrieved\n", + "HEAD Retrieved traces for shot 60\n", + "HEAD Giving shot 62 to worker:0:1\n", + "WORKER:0:0 (ShotID 61) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 61) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 61) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 61) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 61) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 61) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 61) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.86 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 27.65 GFlops/s, 0.65 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.83 s [OI=2.63, 28.86 GFlops/s, 0.68 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.93 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 61) Completed state equation run for shot\n", + "HEAD Shot 61 retrieved\n", + "HEAD Retrieved traces for shot 61\n", + "HEAD Giving shot 63 to worker:0:0\n", + "WORKER:0:1 (ShotID 62) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 62) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 62) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 62) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 62) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 62) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 62) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.84 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 28.31 GFlops/s, 0.66 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.80 s [OI=2.63, 29.76 GFlops/s, 0.70 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.95 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 62) Completed state equation run for shot\n", + "HEAD Shot 62 retrieved\n", + "HEAD Retrieved traces for shot 62\n", + "HEAD Giving shot 64 to worker:0:1\n", + "WORKER:0:0 (ShotID 63) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 63) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 63) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 63) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 63) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 63) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 63) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.56 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 42.47 GFlops/s, 0.99 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:1 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.50 s [OI=2.82, 51.59 GFlops/s, 1.13 GPts/s]\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.56 s [OI=2.82, 45.66 GFlops/s, 1.00 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.14 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.14 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 3.04 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 3.25 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.54 s [OI=2.63, 44.27 GFlops/s, 1.03 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.34 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 15) Completed state equation run for shot\n", - "WORKER:0:1 (ShotID 14) Completed state equation run for shot\n", - "HEAD Shot 15 retrieved\n", - "HEAD Retrieved traces for shot 15\n", - "HEAD Giving shot 16 to worker:0:0\n", - "WORKER:0:0 (ShotID 16) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 16) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 16) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 16) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 16) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 16) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 16) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "HEAD Shot 14 retrieved\n", - "HEAD Retrieved traces for shot 14\n", - "HEAD Giving shot 17 to worker:0:1\n", - "WORKER:0:1 (ShotID 17) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 17) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 17) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 17) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 17) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 17) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 17) Running state equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.42 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 60.57 GFlops/s, 1.32 GPts/s]\n", + "WORKER:0:0 (ShotID 63) Completed state equation run for shot\n", + "HEAD Shot 63 retrieved\n", + "HEAD Retrieved traces for shot 63\n", + "HEAD Giving shot 65 to worker:0:0\n", + "WORKER:0:0 (ShotID 65) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 65) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 65) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 65) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 65) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 65) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 65) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.64 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 37.16 GFlops/s, 0.87 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.41 s [OI=2.82, 62.04 GFlops/s, 1.35 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.15 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 3.35 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.62 s [OI=2.63, 38.59 GFlops/s, 0.90 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.05 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.23 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 16) Completed state equation run for shot\n", - "HEAD Shot 16 retrieved\n", - "HEAD Retrieved traces for shot 16\n", - "HEAD Giving shot 18 to worker:0:0\n", - "WORKER:0:0 (ShotID 18) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 18) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 18) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 18) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 18) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 18) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 18) Running state equation for shot\n", + "WORKER:0:0 (ShotID 65) Completed state equation run for shot\n", + "HEAD Shot 65 retrieved\n", + "HEAD Retrieved traces for shot 65\n", + "HEAD Giving shot 66 to worker:0:0\n", + "WORKER:0:1 (ShotID 64) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 64) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 64) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 64) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 64) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 64) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 64) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.00 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 23.78 GFlops/s, 0.56 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.94 s [OI=2.63, 25.39 GFlops/s, 0.60 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.47 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 64) Completed state equation run for shot\n", + "HEAD Shot 64 retrieved\n", + "HEAD Retrieved traces for shot 64\n", + "HEAD Giving shot 67 to worker:0:1\n", + "WORKER:0:0 (ShotID 66) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.63 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 40.38 GFlops/s, 0.88 GPts/s]\n", - "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.62 s [OI=2.82, 41.59 GFlops/s, 0.91 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.78 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 17) Completed state equation run for shot\n", - "HEAD Shot 17 retrieved\n", - "HEAD Retrieved traces for shot 17\n", - "HEAD Giving shot 19 to worker:0:1\n", - "WORKER:0:1 (ShotID 19) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 19) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 19) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 19) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 19) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 19) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 19) Running state equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.57 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 44.63 GFlops/s, 0.97 GPts/s]\n", + "WORKER:0:0 (ShotID 66) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 66) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 66) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 66) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 66) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 66) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.63 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 37.75 GFlops/s, 0.88 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.56 s [OI=2.82, 45.97 GFlops/s, 1.00 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.14 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.96 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.62 s [OI=2.63, 38.92 GFlops/s, 0.91 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.07 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.62 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 18) Completed state equation run for shot\n", - "HEAD Shot 18 retrieved\n", - "HEAD Retrieved traces for shot 18\n", - "HEAD Giving shot 20 to worker:0:0\n", - "WORKER:0:0 (ShotID 20) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 20) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 20) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 20) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 20) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 20) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 20) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.58 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 43.86 GFlops/s, 0.96 GPts/s]\n", + "WORKER:0:0 (ShotID 66) Completed state equation run for shot\n", + "HEAD Shot 66 retrieved\n", + "HEAD Retrieved traces for shot 66\n", + "HEAD Giving shot 68 to worker:0:0\n", + "WORKER:0:1 (ShotID 67) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 67) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 67) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 67) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 67) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 67) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 67) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.80 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 29.73 GFlops/s, 0.70 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.57 s [OI=2.82, 44.80 GFlops/s, 0.98 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.14 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 3.10 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.03 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.67 s [OI=2.63, 35.70 GFlops/s, 0.84 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.08 s [OI=5.80, 0.01 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.04 s [OI=1.32, 0.42 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 19) Completed state equation run for shot\n", - "HEAD Shot 19 retrieved\n", - "HEAD Retrieved traces for shot 19\n", - "HEAD Giving shot 21 to worker:0:1\n", - "WORKER:0:1 (ShotID 21) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 21) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 21) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 21) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 21) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 21) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 21) Running state equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.59 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 43.12 GFlops/s, 0.94 GPts/s]\n", + "WORKER:0:1 (ShotID 67) Completed state equation run for shot\n", + "HEAD Shot 67 retrieved\n", + "HEAD Retrieved traces for shot 67\n", + "HEAD Giving shot 69 to worker:0:1\n", + "WORKER:0:0 (ShotID 68) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 68) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 68) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 68) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 68) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 68) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 68) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.50 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 47.56 GFlops/s, 1.11 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.58 s [OI=2.82, 44.25 GFlops/s, 0.97 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.65 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.47 s [OI=2.63, 51.51 GFlops/s, 1.20 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 2.10 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 20) Completed state equation run for shot\n", - "HEAD Shot 20 retrieved\n", - "HEAD Retrieved traces for shot 20\n", - "HEAD Giving shot 22 to worker:0:0\n", - "WORKER:0:0 (ShotID 22) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 22) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 22) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 22) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 22) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 22) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 22) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.56 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 45.43 GFlops/s, 0.99 GPts/s]\n", - "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.55 s [OI=2.82, 46.91 GFlops/s, 1.02 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.68 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WORKER:0:1 (ShotID 21) Completed state equation run for shot\n", - "HEAD Shot 21 retrieved\n", - "HEAD Retrieved traces for shot 21\n", - "HEAD Giving shot 23 to worker:0:1\n", - "WORKER:0:1 (ShotID 23) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 23) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 23) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 23) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 23) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 23) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 23) Running state equation for shot\n", + "WORKER:0:0 (ShotID 68) Completed state equation run for shot\n", + "HEAD Shot 68 retrieved\n", + "HEAD Retrieved traces for shot 68\n", + "HEAD Giving shot 70 to worker:0:0\n", + "WORKER:0:1 (ShotID 69) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.57 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 44.63 GFlops/s, 0.97 GPts/s]\n", + "WORKER:0:1 (ShotID 69) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 69) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 69) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 69) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 69) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 69) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.86 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 27.65 GFlops/s, 0.65 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.78 s [OI=2.63, 30.57 GFlops/s, 0.72 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.52 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 69) Completed state equation run for shot\n", + "HEAD Shot 69 retrieved\n", + "HEAD Retrieved traces for shot 69\n", + "HEAD Giving shot 71 to worker:0:1\n", + "WORKER:0:0 (ShotID 70) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 70) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 70) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 70) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 70) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 70) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 70) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.74 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 32.14 GFlops/s, 0.75 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.56 s [OI=2.82, 45.83 GFlops/s, 1.00 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.11 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.67 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.03 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.68 s [OI=2.63, 35.09 GFlops/s, 0.82 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.56 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 22) Completed state equation run for shot\n", - "HEAD Shot 22 retrieved\n", - "HEAD Retrieved traces for shot 22\n", - "HEAD Giving shot 24 to worker:0:0\n", - "WORKER:0:0 (ShotID 24) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 24) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 24) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 24) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 24) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 24) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 24) Running state equation for shot\n", + "WORKER:0:0 (ShotID 70) Completed state equation run for shot\n", + "HEAD Shot 70 retrieved\n", + "HEAD Retrieved traces for shot 70\n", + "HEAD Giving shot 72 to worker:0:0\n", + "WORKER:0:0 (ShotID 72) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.68 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 37.41 GFlops/s, 0.82 GPts/s]\n", - "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.67 s [OI=2.82, 38.30 GFlops/s, 0.84 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.11 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.30 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 23) Completed state equation run for shot\n", - "HEAD Shot 23 retrieved\n", - "HEAD Retrieved traces for shot 23\n", - "HEAD Giving shot 25 to worker:0:1\n", - "WORKER:0:1 (ShotID 25) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 25) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 25) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 25) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 25) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 25) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 25) Running state equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 72) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 72) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 72) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 72) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 72) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 72) Running state equation for shot\n", "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.52 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 48.92 GFlops/s, 1.07 GPts/s]\n", + "WORKER:0:0 Global performance: [OI=2.63, 45.73 GFlops/s, 1.07 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.51 s [OI=2.82, 49.92 GFlops/s, 1.09 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.76 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.48 s [OI=2.63, 49.69 GFlops/s, 1.16 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 2.24 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 24) Completed state equation run for shot\n", - "HEAD Shot 24 retrieved\n", - "HEAD Retrieved traces for shot 24\n", - "HEAD Giving shot 26 to worker:0:0\n", - "WORKER:0:0 (ShotID 26) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 26) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 26) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 26) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 26) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 26) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 26) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.58 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 43.86 GFlops/s, 0.96 GPts/s]\n", + "WORKER:0:0 (ShotID 72) Completed state equation run for shot\n", + "HEAD Shot 72 retrieved\n", + "HEAD Retrieved traces for shot 72\n", + "HEAD Giving shot 73 to worker:0:0\n", + "WORKER:0:1 (ShotID 71) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 71) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 71) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 71) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 71) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 71) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 71) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.91 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 26.14 GFlops/s, 0.61 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.57 s [OI=2.82, 45.19 GFlops/s, 0.99 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.40 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.02 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.84 s [OI=2.63, 28.50 GFlops/s, 0.67 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.15 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 25) Completed state equation run for shot\n", - "HEAD Shot 25 retrieved\n", - "HEAD Retrieved traces for shot 25\n", - "HEAD Giving shot 27 to worker:0:1\n", - "WORKER:0:1 (ShotID 27) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 27) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 27) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 27) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 27) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 27) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 27) Running state equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.49 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 51.92 GFlops/s, 1.13 GPts/s]\n", + "WORKER:0:1 (ShotID 71) Completed state equation run for shot\n", + "HEAD Shot 71 retrieved\n", + "HEAD Retrieved traces for shot 71\n", + "HEAD Giving shot 74 to worker:0:1\n", + "WORKER:0:0 (ShotID 73) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 73) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 73) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 73) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 73) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 73) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 73) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.48 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 49.54 GFlops/s, 1.16 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.48 s [OI=2.82, 53.51 GFlops/s, 1.17 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.78 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.45 s [OI=2.63, 53.93 GFlops/s, 1.26 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.71 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 26) Completed state equation run for shot\n", - "HEAD Shot 26 retrieved\n", - "HEAD Retrieved traces for shot 26\n", - "HEAD Giving shot 28 to worker:0:0\n", - "WORKER:0:0 (ShotID 28) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 28) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 28) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 28) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 28) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 28) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 28) Running state equation for shot\n", + "WORKER:0:0 (ShotID 73) Completed state equation run for shot\n", + "HEAD Shot 73 retrieved\n", + "HEAD Retrieved traces for shot 73\n", + "HEAD Giving shot 75 to worker:0:0\n", + "WORKER:0:0 (ShotID 75) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.63 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 40.38 GFlops/s, 0.88 GPts/s]\n", - "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.62 s [OI=2.82, 41.56 GFlops/s, 0.91 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.14 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.90 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WORKER:0:1 (ShotID 27) Completed state equation run for shot\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.50 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 50.88 GFlops/s, 1.11 GPts/s]\n", + "WORKER:0:0 (ShotID 75) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 75) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 75) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 75) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 75) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 75) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.47 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 50.60 GFlops/s, 1.18 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.50 s [OI=2.82, 51.87 GFlops/s, 1.13 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.91 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.05 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.42 s [OI=2.63, 56.64 GFlops/s, 1.32 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.92 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 28) Completed state equation run for shot\n", - "HEAD Shot 27 retrieved\n", - "HEAD Retrieved traces for shot 27\n", - "HEAD Giving shot 29 to worker:0:1\n", - "WORKER:0:1 (ShotID 29) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 29) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 29) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 29) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 29) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 29) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 29) Running state equation for shot\n", + "WORKER:0:0 (ShotID 75) Completed state equation run for shot\n", + "HEAD Shot 75 retrieved\n", + "HEAD Retrieved traces for shot 75\n", + "HEAD Giving shot 76 to worker:0:0\n", + "WORKER:0:1 (ShotID 74) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "HEAD Shot 28 retrieved\n", - "HEAD Retrieved traces for shot 28\n", - "HEAD Giving shot 30 to worker:0:0\n", - "WORKER:0:0 (ShotID 30) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 30) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 30) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 30) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 30) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 30) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 30) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.48 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 53.00 GFlops/s, 1.16 GPts/s]\n", + "WORKER:0:1 (ShotID 74) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 74) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 74) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 74) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 74) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 74) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.10 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 21.62 GFlops/s, 0.51 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.03 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.98 s [OI=2.63, 24.29 GFlops/s, 0.57 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.08 s [OI=5.80, 0.01 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.89 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 74) Completed state equation run for shot\n", + "HEAD Shot 74 retrieved\n", + "HEAD Retrieved traces for shot 74\n", + "HEAD Giving shot 77 to worker:0:1\n", + "WORKER:0:1 (ShotID 77) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 77) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 77) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 77) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 77) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 77) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 77) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.77 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 30.89 GFlops/s, 0.72 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.47 s [OI=2.82, 54.41 GFlops/s, 1.19 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.14 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.97 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.73 s [OI=2.63, 32.92 GFlops/s, 0.77 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.10 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 29) Completed state equation run for shot\n", - "HEAD Shot 29 retrieved\n", - "HEAD Retrieved traces for shot 29\n", - "HEAD Giving shot 31 to worker:0:1\n", - "WORKER:0:1 (ShotID 31) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 31) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 31) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 31) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 31) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 31) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 31) Running state equation for shot\n", + "WORKER:0:1 (ShotID 77) Completed state equation run for shot\n", + "HEAD Shot 77 retrieved\n", + "HEAD Retrieved traces for shot 77\n", + "HEAD Giving shot 78 to worker:0:1\n", + "WORKER:0:0 (ShotID 76) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 76) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 76) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 76) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 76) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 76) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 76) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.23 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 19.34 GFlops/s, 0.45 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 1.18 s [OI=2.63, 20.18 GFlops/s, 0.47 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.71 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 76) Completed state equation run for shot\n", + "HEAD Shot 76 retrieved\n", + "HEAD Retrieved traces for shot 76\n", + "HEAD Giving shot 79 to worker:0:0\n", + "WORKER:0:1 (ShotID 78) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.59 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 43.12 GFlops/s, 0.94 GPts/s]\n", + "WORKER:0:1 (ShotID 78) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 78) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 78) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 78) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 78) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 78) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.85 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 27.98 GFlops/s, 0.66 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.03 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.78 s [OI=2.63, 30.59 GFlops/s, 0.72 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.63 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 78) Completed state equation run for shot\n", + "HEAD Shot 78 retrieved\n", + "HEAD Retrieved traces for shot 78\n", + "HEAD Giving shot 80 to worker:0:1\n", + "WORKER:0:0 (ShotID 79) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 79) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 79) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 79) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 79) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 79) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 79) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.19 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 19.99 GFlops/s, 0.47 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.59 s [OI=2.82, 43.82 GFlops/s, 0.96 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.90 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 1.15 s [OI=2.63, 20.81 GFlops/s, 0.49 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.71 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 30) Completed state equation run for shot\n", - "HEAD Shot 30 retrieved\n", - "HEAD Retrieved traces for shot 30\n", - "HEAD Giving shot 32 to worker:0:0\n", - "WORKER:0:0 (ShotID 32) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 32) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 32) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 32) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 32) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 32) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 32) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.71 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 35.83 GFlops/s, 0.78 GPts/s]\n", + "WORKER:0:0 (ShotID 79) Completed state equation run for shot\n", + "HEAD Shot 79 retrieved\n", + "HEAD Retrieved traces for shot 79\n", + "HEAD Giving shot 81 to worker:0:0\n", + "WORKER:0:1 (ShotID 80) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 80) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 80) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 80) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 80) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 80) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 80) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.61 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 38.99 GFlops/s, 0.91 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.70 s [OI=2.82, 36.37 GFlops/s, 0.80 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.60 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.58 s [OI=2.63, 41.63 GFlops/s, 0.97 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.48 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 31) Completed state equation run for shot\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.64 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 39.75 GFlops/s, 0.87 GPts/s]\n", + "WORKER:0:1 (ShotID 80) Completed state equation run for shot\n", + "HEAD Shot 80 retrieved\n", + "HEAD Retrieved traces for shot 80\n", + "HEAD Giving shot 82 to worker:0:1\n", + "WORKER:0:0 (ShotID 81) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 81) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 81) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 81) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 81) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 81) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 81) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.94 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 25.30 GFlops/s, 0.59 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.62 s [OI=2.82, 41.03 GFlops/s, 0.90 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.11 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.48 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.05 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.91 s [OI=2.63, 26.39 GFlops/s, 0.62 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.94 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 32) Completed state equation run for shot\n", - "HEAD Shot 31 retrieved\n", - "HEAD Retrieved traces for shot 31\n", - "HEAD Giving shot 33 to worker:0:1\n", - "WORKER:0:1 (ShotID 33) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 33) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 33) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 33) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 33) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 33) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 33) Running state equation for shot\n", + "WORKER:0:0 (ShotID 81) Completed state equation run for shot\n", + "HEAD Shot 81 retrieved\n", + "HEAD Retrieved traces for shot 81\n", + "HEAD Giving shot 83 to worker:0:0\n", + "WORKER:0:1 (ShotID 82) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "HEAD Shot 32 retrieved\n", - "HEAD Retrieved traces for shot 32\n", - "HEAD Giving shot 34 to worker:0:0\n", - "WORKER:0:0 (ShotID 34) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 34) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 34) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 34) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 34) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 34) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 34) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.54 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 47.11 GFlops/s, 1.03 GPts/s]\n", + "WORKER:0:1 (ShotID 82) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 82) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 82) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 82) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 82) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 82) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.95 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 25.03 GFlops/s, 0.59 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.53 s [OI=2.82, 48.08 GFlops/s, 1.05 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.61 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WORKER:0:1 (ShotID 33) Completed state equation run for shot\n", - "HEAD Shot 33 retrieved\n", - "HEAD Retrieved traces for shot 33\n", - "HEAD Giving shot 35 to worker:0:1\n", - "WORKER:0:1 (ShotID 35) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 35) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 35) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 35) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 35) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 35) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 35) Running state equation for shot\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.91 s [OI=2.63, 26.33 GFlops/s, 0.62 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.86 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 82) Completed state equation run for shot\n", + "HEAD Shot 82 retrieved\n", + "HEAD Retrieved traces for shot 82\n", + "HEAD Giving shot 84 to worker:0:1\n", + "WORKER:0:1 (ShotID 84) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.61 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 41.71 GFlops/s, 0.91 GPts/s]\n", + "WORKER:0:1 (ShotID 84) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 84) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 84) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 84) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 84) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 84) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.76 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 31.29 GFlops/s, 0.73 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.72 s [OI=2.63, 33.29 GFlops/s, 0.78 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.07 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 84) Completed state equation run for shot\n", + "HEAD Shot 84 retrieved\n", + "HEAD Retrieved traces for shot 84\n", + "HEAD Giving shot 85 to worker:0:1\n", + "WORKER:0:0 (ShotID 83) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 83) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 83) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 83) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 83) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 83) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 83) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.21 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 19.66 GFlops/s, 0.46 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.60 s [OI=2.82, 42.77 GFlops/s, 0.93 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.78 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 1.17 s [OI=2.63, 20.36 GFlops/s, 0.48 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.72 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 34) Completed state equation run for shot\n", - "HEAD Shot 34 retrieved\n", - "HEAD Retrieved traces for shot 34\n", - "HEAD Giving shot 36 to worker:0:0\n", - "WORKER:0:0 (ShotID 36) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 36) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 36) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 36) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 36) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 36) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 36) Running state equation for shot\n", + "WORKER:0:0 (ShotID 83) Completed state equation run for shot\n", + "HEAD Shot 83 retrieved\n", + "HEAD Retrieved traces for shot 83\n", + "HEAD Giving shot 86 to worker:0:0\n", + "WORKER:0:1 (ShotID 85) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 85) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 85) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 85) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 85) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 85) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 85) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.73 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 32.58 GFlops/s, 0.76 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.05 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.70 s [OI=2.63, 34.33 GFlops/s, 0.80 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.29 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 85) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 86) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.51 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 49.88 GFlops/s, 1.09 GPts/s]\n", + "WORKER:0:0 (ShotID 86) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 86) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 86) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 86) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 86) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 86) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.52 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 45.73 GFlops/s, 1.07 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.47 s [OI=2.63, 50.90 GFlops/s, 1.19 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 2.05 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 86) Completed state equation run for shot\n", + "HEAD Shot 85 retrieved\n", + "HEAD Retrieved traces for shot 85\n", + "HEAD Giving shot 87 to worker:0:1\n", + "HEAD Shot 86 retrieved\n", + "HEAD Retrieved traces for shot 86\n", + "HEAD Giving shot 88 to worker:0:0\n", + "WORKER:0:1 (ShotID 87) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 87) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 87) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 87) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 87) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 87) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 87) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.50 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 47.56 GFlops/s, 1.11 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.50 s [OI=2.82, 51.63 GFlops/s, 1.13 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.77 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.48 s [OI=2.63, 49.79 GFlops/s, 1.16 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.07 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.64 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 35) Completed state equation run for shot\n", - "HEAD Shot 35 retrieved\n", - "HEAD Retrieved traces for shot 35\n", - "HEAD Giving shot 37 to worker:0:1\n", - "WORKER:0:1 (ShotID 37) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 37) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 37) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 37) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 37) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 37) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 37) Running state equation for shot\n", + "WORKER:0:1 (ShotID 87) Completed state equation run for shot\n", + "HEAD Shot 87 retrieved\n", + "HEAD Retrieved traces for shot 87\n", + "HEAD Giving shot 89 to worker:0:1\n", + "WORKER:0:0 (ShotID 88) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 88) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 88) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 88) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 88) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 88) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 88) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.79 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 30.10 GFlops/s, 0.70 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.73 s [OI=2.63, 32.66 GFlops/s, 0.76 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.57 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 88) Completed state equation run for shot\n", + "HEAD Shot 88 retrieved\n", + "HEAD Retrieved traces for shot 88\n", + "HEAD Giving shot 90 to worker:0:0\n", + "WORKER:0:1 (ShotID 89) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.57 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 44.63 GFlops/s, 0.97 GPts/s]\n", + "WORKER:0:1 (ShotID 89) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 89) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 89) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 89) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 89) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 89) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.88 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 27.03 GFlops/s, 0.63 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.76 s [OI=2.63, 31.58 GFlops/s, 0.74 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.12 s [OI=5.80, 0.01 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.23 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 89) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 90) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 90) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 90) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 90) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 90) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 90) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 90) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.55 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 43.24 GFlops/s, 1.01 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.56 s [OI=2.82, 45.67 GFlops/s, 1.00 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.82 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.50 s [OI=2.63, 47.59 GFlops/s, 1.11 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 2.58 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 36) Completed state equation run for shot\n", - "HEAD Shot 36 retrieved\n", - "HEAD Retrieved traces for shot 36\n", - "HEAD Giving shot 38 to worker:0:0\n", - "WORKER:0:0 (ShotID 38) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 38) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 38) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 38) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 38) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 38) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 38) Running state equation for shot\n", + "WORKER:0:0 (ShotID 90) Completed state equation run for shot\n", + "HEAD Shot 89 retrieved\n", + "HEAD Retrieved traces for shot 89\n", + "HEAD Giving shot 91 to worker:0:1\n", + "HEAD Shot 90 retrieved\n", + "HEAD Retrieved traces for shot 90\n", + "HEAD Giving shot 92 to worker:0:0\n", + "WORKER:0:1 (ShotID 91) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 91) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 91) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 91) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 91) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 91) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 91) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.95 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 25.03 GFlops/s, 0.59 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.91 s [OI=2.63, 26.40 GFlops/s, 0.62 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.85 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 91) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 92) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 92) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 92) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 92) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 92) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 92) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 92) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.87 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 27.34 GFlops/s, 0.64 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.03 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.82 s [OI=2.63, 29.30 GFlops/s, 0.69 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.25 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 92) Completed state equation run for shot\n", + "HEAD Shot 91 retrieved\n", + "HEAD Retrieved traces for shot 91\n", + "HEAD Giving shot 93 to worker:0:1\n", + "HEAD Shot 92 retrieved\n", + "HEAD Retrieved traces for shot 92\n", + "HEAD Giving shot 94 to worker:0:0\n", + "WORKER:0:0 (ShotID 94) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.50 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 50.88 GFlops/s, 1.11 GPts/s]\n", + "WORKER:0:0 (ShotID 94) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 94) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 94) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 94) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 94) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 94) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.57 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 41.72 GFlops/s, 0.97 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.03 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.54 s [OI=2.63, 44.79 GFlops/s, 1.05 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.95 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 94) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 93) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 93) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 93) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 93) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 93) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 93) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 93) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.61 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 38.99 GFlops/s, 0.91 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.49 s [OI=2.82, 52.78 GFlops/s, 1.15 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.89 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.57 s [OI=2.63, 42.27 GFlops/s, 0.99 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.39 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 37) Completed state equation run for shot\n", - "HEAD Shot 37 retrieved\n", - "HEAD Retrieved traces for shot 37\n", - "HEAD Giving shot 39 to worker:0:1\n", - "WORKER:0:1 (ShotID 39) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 39) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 39) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 39) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 39) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 39) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 39) Running state equation for shot\n", + "WORKER:0:1 (ShotID 93) Completed state equation run for shot\n", + "HEAD Shot 94 retrieved\n", + "HEAD Retrieved traces for shot 94\n", + "HEAD Giving shot 95 to worker:0:0\n", + "HEAD Shot 93 retrieved\n", + "HEAD Retrieved traces for shot 93\n", + "HEAD Giving shot 96 to worker:0:1\n", + "WORKER:0:0 (ShotID 95) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 96) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.62 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 41.03 GFlops/s, 0.90 GPts/s]\n", + "WORKER:0:0 (ShotID 95) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 95) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 95) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 95) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 95) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 95) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.84 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 28.31 GFlops/s, 0.66 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.61 s [OI=2.82, 42.23 GFlops/s, 0.92 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.66 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.82 s [OI=2.63, 29.33 GFlops/s, 0.69 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.97 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 38) Completed state equation run for shot\n", - "HEAD Shot 38 retrieved\n", - "HEAD Retrieved traces for shot 38\n", - "HEAD Giving shot 40 to worker:0:0\n", - "WORKER:0:0 (ShotID 40) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 40) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 40) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 40) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 40) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 40) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 40) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.59 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 43.12 GFlops/s, 0.94 GPts/s]\n", + "WORKER:0:0 (ShotID 95) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 96) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 96) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 96) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 96) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 96) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 96) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.84 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 28.31 GFlops/s, 0.66 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.58 s [OI=2.82, 44.41 GFlops/s, 0.97 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.76 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WORKER:0:1 (ShotID 39) Completed state equation run for shot\n", - "HEAD Shot 39 retrieved\n", - "HEAD Retrieved traces for shot 39\n", - "HEAD Giving shot 41 to worker:0:1\n", - "WORKER:0:1 (ShotID 41) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 41) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 41) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 41) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 41) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 41) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 41) Running state equation for shot\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.78 s [OI=2.63, 30.69 GFlops/s, 0.72 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.18 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 96) Completed state equation run for shot\n", + "HEAD Shot 95 retrieved\n", + "HEAD Retrieved traces for shot 95\n", + "HEAD Giving shot 97 to worker:0:0\n", + "HEAD Shot 96 retrieved\n", + "HEAD Retrieved traces for shot 96\n", + "HEAD Giving shot 98 to worker:0:1\n", + "WORKER:0:1 (ShotID 98) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.58 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 43.86 GFlops/s, 0.96 GPts/s]\n", + "WORKER:0:1 (ShotID 98) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 98) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 98) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 98) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 98) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 98) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.79 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 30.10 GFlops/s, 0.70 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.76 s [OI=2.63, 31.58 GFlops/s, 0.74 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.03 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 98) Completed state equation run for shot\n", + "HEAD Shot 98 retrieved\n", + "HEAD Retrieved traces for shot 98\n", + "HEAD Giving shot 99 to worker:0:1\n", + "WORKER:0:0 (ShotID 97) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 97) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 97) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 97) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 97) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 97) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 97) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.06 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 22.44 GFlops/s, 0.53 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.57 s [OI=2.82, 45.01 GFlops/s, 0.98 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.59 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 1.00 s [OI=2.63, 23.87 GFlops/s, 0.56 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.85 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 40) Completed state equation run for shot\n", - "HEAD Shot 40 retrieved\n", - "HEAD Retrieved traces for shot 40\n", - "HEAD Giving shot 42 to worker:0:0\n", - "WORKER:0:0 (ShotID 42) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 42) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 42) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 42) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 42) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 42) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 42) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.53 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 48.00 GFlops/s, 1.05 GPts/s]\n", + "WORKER:0:0 (ShotID 97) Completed state equation run for shot\n", + "HEAD Shot 97 retrieved\n", + "HEAD Retrieved traces for shot 97\n", + "HEAD Giving shot 100 to worker:0:0\n", + "WORKER:0:1 (ShotID 99) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 99) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 99) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 99) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 99) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 99) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 99) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.84 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 28.31 GFlops/s, 0.66 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.52 s [OI=2.82, 49.81 GFlops/s, 1.09 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.76 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.02 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.79 s [OI=2.63, 30.30 GFlops/s, 0.71 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.06 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 41) Completed state equation run for shot\n", - "HEAD Shot 41 retrieved\n", - "HEAD Retrieved traces for shot 41\n", - "HEAD Giving shot 43 to worker:0:1\n", - "WORKER:0:1 (ShotID 43) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 43) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 43) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 43) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 43) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 43) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 43) Running state equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.61 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 41.71 GFlops/s, 0.91 GPts/s]\n", + "WORKER:0:1 (ShotID 99) Completed state equation run for shot\n", + "HEAD Shot 99 retrieved\n", + "HEAD Retrieved traces for shot 99\n", + "HEAD Giving shot 101 to worker:0:1\n", + "WORKER:0:0 (ShotID 100) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 100) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 100) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 100) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 100) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 100) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 100) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.73 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 32.58 GFlops/s, 0.76 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.60 s [OI=2.82, 42.50 GFlops/s, 0.93 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.37 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.71 s [OI=2.63, 33.81 GFlops/s, 0.79 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.05 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.13 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 42) Completed state equation run for shot\n", - "HEAD Shot 42 retrieved\n", - "HEAD Retrieved traces for shot 42\n", - "HEAD Giving shot 44 to worker:0:0\n", - "WORKER:0:0 (ShotID 44) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 44) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 44) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 44) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 44) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 44) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 44) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 100) Completed state equation run for shot\n", + "HEAD Shot 100 retrieved\n", + "HEAD Retrieved traces for shot 100\n", + "HEAD Giving shot 102 to worker:0:0\n", + "WORKER:0:1 (ShotID 101) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 101) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 101) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 101) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 101) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 101) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 101) Running state equation for shot\n", "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.54 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 47.11 GFlops/s, 1.03 GPts/s]\n", + "WORKER:0:1 Global performance: [OI=2.63, 44.04 GFlops/s, 1.03 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.53 s [OI=2.82, 48.80 GFlops/s, 1.07 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.59 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.51 s [OI=2.63, 46.98 GFlops/s, 1.10 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.53 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 43) Completed state equation run for shot\n", - "HEAD Shot 43 retrieved\n", - "HEAD Retrieved traces for shot 43\n", - "HEAD Giving shot 45 to worker:0:1\n", - "WORKER:0:1 (ShotID 45) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 45) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 45) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 45) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 45) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 45) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 45) Running state equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.56 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 45.43 GFlops/s, 0.99 GPts/s]\n", + "WORKER:0:1 (ShotID 101) Completed state equation run for shot\n", + "HEAD Shot 101 retrieved\n", + "HEAD Retrieved traces for shot 101\n", + "HEAD Giving shot 103 to worker:0:1\n", + "WORKER:0:0 (ShotID 102) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 102) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 102) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 102) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 102) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 102) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.59 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 40.31 GFlops/s, 0.94 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.55 s [OI=2.82, 46.34 GFlops/s, 1.01 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.57 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.57 s [OI=2.63, 41.88 GFlops/s, 0.98 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.42 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 44) Completed state equation run for shot\n", - "HEAD Shot 44 retrieved\n", - "HEAD Retrieved traces for shot 44\n", - "HEAD Giving shot 46 to worker:0:0\n", - "WORKER:0:0 (ShotID 46) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 46) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 46) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 46) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 46) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 46) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 46) Running state equation for shot\n", + "WORKER:0:0 (ShotID 102) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 102) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.56 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 45.43 GFlops/s, 0.99 GPts/s]\n", - "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.55 s [OI=2.82, 46.68 GFlops/s, 1.02 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.67 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WORKER:0:1 (ShotID 45) Completed state equation run for shot\n", - "HEAD Shot 45 retrieved\n", - "HEAD Retrieved traces for shot 45\n", - "HEAD Giving shot 47 to worker:0:1\n", - "WORKER:0:1 (ShotID 47) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 47) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 47) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 47) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 47) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 47) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 47) Running state equation for shot\n", + "HEAD Shot 102 retrieved\n", + "HEAD Retrieved traces for shot 102\n", + "HEAD Giving shot 104 to worker:0:0\n", + "WORKER:0:1 (ShotID 103) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.61 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 41.71 GFlops/s, 0.91 GPts/s]\n", - "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.61 s [OI=2.82, 42.33 GFlops/s, 0.93 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 3.11 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 46) Completed state equation run for shot\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.55 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 46.25 GFlops/s, 1.01 GPts/s]\n", + "WORKER:0:1 (ShotID 103) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 103) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 103) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 103) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 103) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 103) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.73 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 32.58 GFlops/s, 0.76 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.55 s [OI=2.82, 47.07 GFlops/s, 1.03 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.14 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 3.33 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.70 s [OI=2.63, 34.00 GFlops/s, 0.80 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.05 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.14 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 47) Completed state equation run for shot\n", - "HEAD Shot 46 retrieved\n", - "HEAD Retrieved traces for shot 46\n", - "HEAD Giving shot 48 to worker:0:0\n", - "WORKER:0:0 (ShotID 48) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 48) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 48) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 48) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 48) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 48) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 48) Running state equation for shot\n", + "WORKER:0:1 (ShotID 103) Completed state equation run for shot\n", + "HEAD Shot 103 retrieved\n", + "HEAD Retrieved traces for shot 103\n", + "HEAD Giving shot 105 to worker:0:1\n", + "WORKER:0:0 (ShotID 104) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 104) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 104) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 104) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 104) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 104) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.08 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 22.02 GFlops/s, 0.52 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 1.05 s [OI=2.63, 22.73 GFlops/s, 0.53 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.80 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 104) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 104) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "HEAD Shot 47 retrieved\n", - "HEAD Retrieved traces for shot 47\n", - "HEAD Giving shot 49 to worker:0:1\n", - "WORKER:0:1 (ShotID 49) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 49) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 49) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 49) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 49) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 49) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 49) Running state equation for shot\n", + "HEAD Shot 104 retrieved\n", + "HEAD Retrieved traces for shot 104\n", + "HEAD Giving shot 106 to worker:0:0\n", + "WORKER:0:1 (ShotID 105) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.55 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 46.25 GFlops/s, 1.01 GPts/s]\n", + "WORKER:0:1 (ShotID 105) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 105) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 105) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 105) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 105) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 105) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.83 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 28.65 GFlops/s, 0.67 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.78 s [OI=2.63, 30.70 GFlops/s, 0.72 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.09 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 105) Completed state equation run for shot\n", + "HEAD Shot 105 retrieved\n", + "HEAD Retrieved traces for shot 105\n", + "HEAD Giving shot 107 to worker:0:1\n", + "WORKER:0:0 (ShotID 106) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 106) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 106) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 106) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 106) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 106) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.73 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 32.58 GFlops/s, 0.76 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.55 s [OI=2.82, 47.05 GFlops/s, 1.03 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.14 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.96 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.67 s [OI=2.63, 35.52 GFlops/s, 0.83 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.60 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 48) Completed state equation run for shot\n", - "HEAD Shot 48 retrieved\n", - "HEAD Retrieved traces for shot 48\n", - "HEAD Giving shot 50 to worker:0:0\n", - "WORKER:0:0 (ShotID 50) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 50) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 50) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 50) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 50) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 50) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 50) Running state equation for shot\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.57 s\n", + "WORKER:0:0 (ShotID 106) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 106) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Global performance: [OI=2.82, 44.63 GFlops/s, 0.97 GPts/s]\n", + "HEAD Shot 106 retrieved\n", + "HEAD Retrieved traces for shot 106\n", + "HEAD Giving shot 108 to worker:0:0\n", + "WORKER:0:1 (ShotID 107) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 107) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 107) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 107) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 107) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 107) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 107) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.57 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 41.72 GFlops/s, 0.97 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.56 s [OI=2.82, 45.92 GFlops/s, 1.00 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.38 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.50 s [OI=2.63, 47.73 GFlops/s, 1.11 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.06 s [OI=5.80, 0.01 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.56 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 49) Completed state equation run for shot\n", - "HEAD Shot 49 retrieved\n", - "HEAD Retrieved traces for shot 49\n", - "HEAD Giving shot 51 to worker:0:1\n", - "WORKER:0:1 (ShotID 51) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 51) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 51) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 51) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 51) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 51) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 51) Running state equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.44 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 57.82 GFlops/s, 1.26 GPts/s]\n", + "WORKER:0:1 (ShotID 107) Completed state equation run for shot\n", + "HEAD Shot 107 retrieved\n", + "HEAD Retrieved traces for shot 107\n", + "HEAD Giving shot 109 to worker:0:1\n", + "WORKER:0:0 (ShotID 108) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 108) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 108) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 108) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 108) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 108) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.63 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 37.75 GFlops/s, 0.88 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.44 s [OI=2.82, 59.08 GFlops/s, 1.29 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 3.17 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.60 s [OI=2.63, 39.80 GFlops/s, 0.93 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.05 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.59 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 50) Completed state equation run for shot\n", - "HEAD Shot 50 retrieved\n", - "HEAD Retrieved traces for shot 50\n", - "HEAD Giving shot 52 to worker:0:0\n", - "WORKER:0:0 (ShotID 52) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 52) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 52) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 52) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 52) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 52) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 52) Running state equation for shot\n", + "WORKER:0:0 (ShotID 108) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 108) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.63 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 40.38 GFlops/s, 0.88 GPts/s]\n", - "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.62 s [OI=2.82, 41.64 GFlops/s, 0.91 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.14 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.73 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WORKER:0:1 (ShotID 51) Completed state equation run for shot\n", - "HEAD Shot 51 retrieved\n", - "HEAD Retrieved traces for shot 51\n", - "HEAD Giving shot 53 to worker:0:1\n", - "WORKER:0:1 (ShotID 53) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 53) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 53) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 53) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 53) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 53) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 53) Running state equation for shot\n", + "HEAD Shot 108 retrieved\n", + "HEAD Retrieved traces for shot 108\n", + "HEAD Giving shot 110 to worker:0:0\n", + "WORKER:0:1 (ShotID 109) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.55 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 46.25 GFlops/s, 1.01 GPts/s]\n", + "WORKER:0:1 (ShotID 109) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 109) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 109) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 109) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 109) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 109) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.76 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 31.29 GFlops/s, 0.73 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.03 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.71 s [OI=2.63, 33.82 GFlops/s, 0.79 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.17 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 109) Completed state equation run for shot\n", + "HEAD Shot 109 retrieved\n", + "HEAD Retrieved traces for shot 109\n", + "HEAD Giving shot 111 to worker:0:1\n", + "WORKER:0:0 (ShotID 110) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 110) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 110) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 110) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 110) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 110) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.04 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 22.87 GFlops/s, 0.54 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.54 s [OI=2.82, 47.36 GFlops/s, 1.03 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.70 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.03 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.95 s [OI=2.63, 25.14 GFlops/s, 0.59 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.06 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.91 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 52) Completed state equation run for shot\n", - "HEAD Shot 52 retrieved\n", - "HEAD Retrieved traces for shot 52\n", - "HEAD Giving shot 54 to worker:0:0\n", - "WORKER:0:0 (ShotID 54) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 54) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 54) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 54) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 54) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 54) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 54) Running state equation for shot\n", + "WORKER:0:0 (ShotID 110) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 110) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.50 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 50.88 GFlops/s, 1.11 GPts/s]\n", + "HEAD Shot 110 retrieved\n", + "HEAD Retrieved traces for shot 110\n", + "HEAD Giving shot 112 to worker:0:0\n", + "WORKER:0:1 (ShotID 111) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 111) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 111) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 111) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 111) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 111) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 111) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.23 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 19.34 GFlops/s, 0.45 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.49 s [OI=2.82, 52.41 GFlops/s, 1.14 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.79 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.05 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 1.17 s [OI=2.63, 20.39 GFlops/s, 0.48 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.71 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 53) Completed state equation run for shot\n", - "HEAD Shot 53 retrieved\n", - "HEAD Retrieved traces for shot 53\n", - "HEAD Giving shot 55 to worker:0:1\n", - "WORKER:0:1 (ShotID 55) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 55) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 55) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 55) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 55) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 55) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 55) Running state equation for shot\n", + "WORKER:0:1 (ShotID 111) Completed state equation run for shot\n", + "HEAD Shot 111 retrieved\n", + "HEAD Retrieved traces for shot 111\n", + "HEAD Giving shot 113 to worker:0:1\n", + "WORKER:0:0 (ShotID 112) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 112) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 112) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 112) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 112) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 112) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.01 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 23.55 GFlops/s, 0.55 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.98 s [OI=2.63, 24.46 GFlops/s, 0.57 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.89 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 112) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 112) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "HEAD Shot 112 retrieved\n", + "HEAD Retrieved traces for shot 112\n", + "HEAD Giving shot 114 to worker:0:0\n", + "WORKER:0:1 (ShotID 113) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 113) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 113) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 113) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 113) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 113) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 113) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.90 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 26.43 GFlops/s, 0.62 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.03 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.84 s [OI=2.63, 28.50 GFlops/s, 0.67 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.06 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.18 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 113) Completed state equation run for shot\n", + "HEAD Shot 113 retrieved\n", + "HEAD Retrieved traces for shot 113\n", + "HEAD Giving shot 115 to worker:0:1\n", + "WORKER:0:0 (ShotID 114) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 114) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 114) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 114) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 114) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 114) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.87 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 27.34 GFlops/s, 0.64 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.80 s [OI=2.63, 29.87 GFlops/s, 0.70 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.06 s [OI=5.80, 0.01 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.32 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 114) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 114) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "HEAD Shot 114 retrieved\n", + "HEAD Retrieved traces for shot 114\n", + "HEAD Giving shot 116 to worker:0:0\n", + "WORKER:0:1 (ShotID 115) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.62 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 41.03 GFlops/s, 0.90 GPts/s]\n", + "WORKER:0:1 (ShotID 115) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 115) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 115) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 115) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 115) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 115) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.29 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 18.44 GFlops/s, 0.43 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 1.23 s [OI=2.63, 19.39 GFlops/s, 0.46 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.72 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 115) Completed state equation run for shot\n", + "HEAD Shot 115 retrieved\n", + "HEAD Retrieved traces for shot 115\n", + "HEAD Giving shot 117 to worker:0:1\n", + "WORKER:0:0 (ShotID 116) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 116) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 116) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 116) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 116) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 116) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.81 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 29.36 GFlops/s, 0.69 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.61 s [OI=2.82, 42.37 GFlops/s, 0.93 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.36 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.78 s [OI=2.63, 30.75 GFlops/s, 0.72 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.99 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 54) Completed state equation run for shot\n", - "HEAD Shot 54 retrieved\n", - "HEAD Retrieved traces for shot 54\n", - "HEAD Giving shot 56 to worker:0:0\n", - "WORKER:0:0 (ShotID 56) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 56) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 56) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 56) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 56) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 56) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 56) Running state equation for shot\n", + "WORKER:0:0 (ShotID 116) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 116) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.51 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 49.88 GFlops/s, 1.09 GPts/s]\n", + "HEAD Shot 116 retrieved\n", + "HEAD Retrieved traces for shot 116\n", + "HEAD Giving shot 118 to worker:0:0\n", + "WORKER:0:1 (ShotID 117) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 117) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 117) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 117) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 117) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 117) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 117) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.57 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 41.72 GFlops/s, 0.97 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.50 s [OI=2.82, 51.72 GFlops/s, 1.13 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.72 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.55 s [OI=2.63, 43.68 GFlops/s, 1.02 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.07 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.03 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 55) Completed state equation run for shot\n", - "HEAD Shot 55 retrieved\n", - "HEAD Retrieved traces for shot 55\n", - "HEAD Giving shot 57 to worker:0:1\n", - "WORKER:0:1 (ShotID 57) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 57) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:1 (ShotID 57) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 57) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:1 (ShotID 57) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 57) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 57) Running state equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.63 s\n", - "WORKER:0:0 Global performance: [OI=2.82, 40.38 GFlops/s, 0.88 GPts/s]\n", + "WORKER:0:1 (ShotID 117) Completed state equation run for shot\n", + "HEAD Shot 117 retrieved\n", + "HEAD Retrieved traces for shot 117\n", + "HEAD Giving shot 119 to worker:0:1\n", + "WORKER:0:0 (ShotID 118) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 118) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:0 (ShotID 118) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:0 (ShotID 118) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 118) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 118) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.65 s\n", + "WORKER:0:0 Global performance: [OI=2.63, 36.59 GFlops/s, 0.86 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.62 s [OI=2.82, 41.13 GFlops/s, 0.90 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.50 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.03 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.59 s [OI=2.63, 40.70 GFlops/s, 0.95 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.06 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.45 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 56) Completed state equation run for shot\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.59 s\n", - "WORKER:0:1 Global performance: [OI=2.82, 43.12 GFlops/s, 0.94 GPts/s]\n", + "WORKER:0:0 (ShotID 118) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 118) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "HEAD Shot 118 retrieved\n", + "HEAD Retrieved traces for shot 118\n", + "WORKER:0:1 (ShotID 119) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 119) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 119) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", + "WORKER:0:1 (ShotID 119) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", + "WORKER:0:1 (ShotID 119) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 119) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 119) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.60 s\n", + "WORKER:0:1 Global performance: [OI=2.63, 39.64 GFlops/s, 0.93 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.58 s [OI=2.82, 44.19 GFlops/s, 0.97 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.14 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 3.20 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.57 s [OI=2.63, 42.43 GFlops/s, 0.99 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.43 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 57) Completed state equation run for shot\n", - "HEAD Shot 56 retrieved\n", - "HEAD Retrieved traces for shot 56\n", - "HEAD Giving shot 58 to worker:0:0\n", - "WORKER:0:0 (ShotID 58) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 58) Estimated bandwidth for the propagated wavelet 0.255-0.735 MHz\n", - "WORKER:0:0 (ShotID 58) Spatial grid spacing (0.500 mm | 3.973 PPW) is higher than dispersion limit (0.397 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 58) Time grid spacing (0.080 μs | 26%) is below OT2 limit (0.136 μs)\n", - "WORKER:0:0 (ShotID 58) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 58) Selected time stepping scheme OT2\n" + "WORKER:0:1 (ShotID 119) Completed state equation run for shot\n", + "HEAD Shot 119 retrieved\n", + "HEAD Retrieved traces for shot 119\n", + "MONITOR Pending barrier tasks 2\n" ] }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "68ed5af4dd864132961ef6aa2ac03adf", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "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Gyb73KNHD2RnZ2PJkiUAgKZNmyItLQ3PPPMM3n//fWzfvj1gvz/++CM8Hg+GDx+O0tJS+peZmYkOHTpg6dKlsvXT0tLQu3dv2XcxMTEYPnw45syZA5/PBwAoKyvD559/jltuuQU1a9Y0ta+VK1eisLBQ9fj0KC8vl7VfVlamum6NGjXQpEkTvPnmm/j73/+ODRs2KLqyAeCyyy5DgwYN6Of4+Hg0b94chw4dot8tXrwYffr0Qf369WXbjhw5Evn5+Vi5cqVu/9XweDyWlgkEgvBHCECBoIpy7tw5SJKEOnXqBCzLysoCAJw5c0b2fWZmZsC6mZmZdL3U1FQsW7YMl112GZ577jm0adMGWVlZeOmll1BSUgIAOHHiBCRJQu3atREbGyv7W7VqFU6fPi1rX6l/AHD//fejsLAQX331FQBgwYIFyM3NlcWsGd0X6b/a8elx//33y9ru06eP6roejwe//vorrr/+erzxxhvo1KkTatWqhcceewwXL16UrUuELIvX60VBQQH9fObMGVO/oVFq1qypuG1eXh6Ki4tFAohAEOGILGCBoIqSlpaGqKgo5ObmBiw7duwYACA9PV32/fHjxwPWPX78OJo2bUo/t2vXDl999RUkScLmzZvxySefYNKkSUhISMCzzz6L9PR0eDwe/Pbbb/B6vQHt8d+pWZpat26Nbt264eOPP8ZDDz2Ejz/+GFlZWejXrx9dx+i+iNBSO76GDRsq9oEwceJEjBkzhn5OTk7WXD87OxszZ84EAOzevRvffPMNJk6ciOLiYrz//vua2/LUrFnT1G9oFPI7Hj9+XCaCt2zZAgBo27atpXYFAkGYEFoPtEAgCCVXXHGFlJmZKeXn59PvysrKpHbt2pmKAXzllVc091O9enXpjjvukCRJkn7//XcJgPT111/r9q9nz55SmzZtVJe/9957EgDpt99+k7xeb0BigtF9nT17NmgxgGpcdtllUteuXenn7OxsacCAAQHr9ezZU9afu+++W4qPj5eOHj0qW2/AgAGyGMDNmzdLAKTp06cb6s/WrVslj8cjvf7667LvH3roISkhIUE6c+aM0UMTCARhiLAACgRVmClTpqBv37649tprMW7cOMTFxWH69OnYunUrvvzyywDr29q1a/GXv/wFd9xxB3JycvD888+jbt26GD16NAB/zN306dNx6623onHjxpAk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0tLSSj1z8+bNowYNGlBERATNmDGDzpw5Q7GxsWQymejee++V9Wn+/Pl04sQJOnnyJN1zzz0yv95//30CQDqdjt599116+umnyd/fn9566y168803CQCFhobSX3/9RR07drTJq0aNGhEAWrduHZ08eZLy8vIoLy+P3nnnHWrQoAEBoIcffpiIiDZv3myTV++99x4BoGXLltELL7xAZrOZoqKiaPHixTR79mwym82ybr3wwgvk5+dHvr6+NHfuXJo2bRoZDAYKCgqif//73xQaGkrNmzenWbNm0cyZM8nPz0/mr7oNmjdvHiUmJpKiKNSnTx+ZNn/+fAoODqbevXuTn58fPfPMM7Ic69evT0ajkWbOnEnr1q2jnj17EgB6++23qV+/fhQREUG+vr70+uuv0+jRo8loNFJERAT99ddfFBkZSXFxcfT+++/TRx99RLGxsaTT6ejo0aPUr18/SklJoQ0bNtCcOXMoMjKSFEWh7OxsIiLq3r076fV66tixI919993UvXt3AkDTp08nIpLP4m233UZGo5FuvfVWAkCNGzeW7eaqVauoc+fOpNfrCQCNHj2aunXrRiaTidLS0mjo0KFkNBopKSmJAFB6ejrVrVuXbrjhBmrfvj117txZttd9+vSh6OhoAkAffvihbK/vueceAkCJiYkUHh5Ov/zyCz311FPUo0cPioyMJAAEgL744guaPHky6XQ6uvfee6ljx46UkpJCAOiBBx6gX375hTp37kzNmjWjIUOGUN26den222+XdiclJdE//vEPWrVqFfXu3Zv69+8vz92+fXv5Tnnvvfdo0qRJNHHiRAJA//znP2n37t20b98++vjjj+nKlSvUtWtXat26NW3evJkOHjwo7frll18q9H5lrsEC0AO56aab6MEHH7TZ1qhRI5o4cWKpfU+ePEkAaMOGDXLbhQsXKCkpiXJycigzM1MKwAkTJtDNN9/s8Lo9evSg4cOH22zr27dvKQFotVopKiqKXn75ZSIiAkAfffQRBQcH0xtvvGFzvDh2y5YtBID+/PNPIiI6evQoxcbGEgAKDw+XApCIqH///nTvvffaFZ6pqan0/PPP29x7UlISPfPMM6XsEun+/v6l7BJpb7zxhl27vvvuOwJAY8aMKWWXvTxX20VEFBISQgkJCfT000/b2EREdOXKFVIUhQYPHmy3HIKCguzatHv3bkpMTCQ/Pz966623bGxSX1ekpaam0tNPP21TF8LDw23yatKkSTK9Q4cOZDKZZF5p69GAAQNs7Pr9999Jr9fT/PnzyWw22wjAvn37UmBgYKk6mJ2dTT4+PjZ5RUTUsmVLKWaio6Nt8krUq+zsbGrWrJnNcep6lZ2dTSkpKTZ5JepVdnY21alTxyav1ISFhVFCQkIpm5555hn53Ngrx+DgYMrKyir1XAm7Ro8eLdO05ThjxgyaMGEChYWFObRLlKPIr7Fjx9INN9xALVq0KFW3xo4dSw0aNKCgoKBS9Z2IZPn98ccfcpuw6d577yWDwSAFi7ZeietarVbq0aMH1alTx6YM+/btS6GhofTMM89Qjx49yNfX1yav+vTpQ0ajkZo0aWK3jRHi4ZZbbqHhw4fb5JWfnx+lp6fL9kltW9++feX/L126RABo0KBBNuf39fWltm3bkl6vpzp16tjY1bRpUzKbzfTaa6+RXq+nlStXlirDBx98UKap7RJC7tKlS6QoCnXq1MnmugDorrvukmU4adKkUu1m3759Zf22Wq0UGRlJOp1Otn1XrlyR7UFISIjdNnfUqFFkNBrluQFQ3bp16Y8//pCCTaS1adPGYXvt7+8vRdq2bduIiCg0NJTeeustOnfuHBkMBhtRm5ubSzqdjlavXk1ERIcPH5bpH330EZlMJioqKrLJDwCUk5NTqm1v3ry5zXXV+Pv703vvvWezTdjFVA7uAvYwCgsLsXXrVnTr1s1me7du3fDDDz+U2v/8+fMAgNDQULnt4YcfRo8ePdC1a1ebfVesWIFWrVrh7rvvRkREBFq0aCG7KADg5ptvxjfffIN9+/YBAHbs2IH//e9/pa55+PBhHD9+3MZGo9GIzMxMuzYKO0X3gNVqxeDBgzF+/PhS+1mtVnz55Ze48cYbAQBDhw5FmzZtZBf0zTffjBUrViA3Nxfnzp0DABw9ehRZWVml7BJ507p161J2iTTRraG1Kzo6GgDg5+dXyq6+ffvKfNbadeTIESxevBj5+fk4deoUmjZtamNTSUkJPvvsMyiKIm0QlJSUYMmSJbh8+TIAlLKpUaNGuHjxIgoKCtCuXTsbm7p164agoCCcO3cOly5dkja98cYbyMzMRJcuXXDu3DmcO3fOJq9++uknWVfE2tYir7T1qKCgwCavMjMzcfPNN2PkyJGlynDFihVIS0vDK6+8gh9++AFLliyReVVcXIzJkycjISEBAwYMwKJFi7Bv3z40bdoUFy9exNmzZxETE4P69etj6NChaNWqlbRp//79Mm3AgAH47bffpE1EhN9++w0XLlxAz5498ffff+PUqVMArnZ3nzt3Dp9//jl8fX3h4+ODZs2a2dh05coV9OzZExEREUhKSsKePXuQlZWFFStWICkpCcePH8fUqVPlc2M2m5GZmYkff/yx1HO1ePFiKIqCb7/9Fq1atcJdd92F+vXrA4BNXVyxYgXOnz+Pbdu2wWQywWg0on79+jYhF6JuHT58GB988AE6deqE/fv329StwsJCfPDBBxgxYgQ6depUqr4XFhbK7syQkBBZToMHD8ajjz6Kr776CgEBAVAUxaZeZWVlye7dtm3bym7i4uJifPTRR8jNzcX27duxbt06XLx4EVlZWUhJScHly5eRnJwM4Go78sMPP6BJkyYwGAx225jmzZtDURR06NAB33zzDf7xj39g/PjxslxSUlJk+/TFF1/gxhtvREZGBj777DNs2rQJy5cvR3FxMQDgp59+Qm5uLogI69atQ0FBAS5evIiSkhKcO3fOpt3y8/NDQEAANm3ahJKSEvj4+JRqI7Zv346SkhKYTCb5LKampkJRFBw6dAiFhYUgIiQmJiIrKwsRERFo06YNgKthEKIMP/nkExw/fhy33nor1q1bBwBIT0+X7ebhw4dx4sQJWK1WaYPZbEanTp0QFBSEs2fP2m1zd+/ejYCAABw/fhwdOnQAAIwaNQqJiYnS/uPHj6NVq1bYvHkzgKvhFJcvX8azzz4r23jR/S/qxpIlS1BQUIBOnTph69atMn8FMTExSEtLc/heCgoKgsFgAADZJgGQIR2CkydPYvv27QCutveRkZHIzMy0sWvp0qU4c+ZMKbuYSlKz+pPRkpubSwDo+++/t9n+4osv0o033mizzWq1Uq9evWy8D4sXL6a0tDS6fPkyEZGN98VsNpPZbKYnn3ySfvnlF3rjjTfIx8eH3n33XXm+iRMnkqIoZDAYSFEUeumll0p9rX3//fcEgHJzc4nompdv1KhR1K1bNxsbAdDSpUspPT1dfpm/9NJLdOutt5LVai3lAczLyyMA5OfnJ78mp0yZQoqi0Pr166mgoICGDBlCAEhRFFIURX4dqu1S543WLpGWkZFh166SkhLq1asXmc3mUnb5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Dh2ivLw8uv/++0vla1xcHE2dOlXm+eTJk8lgMNArr7xCP/zwA02bNo30ej3de++90uv29ttv00MPPUSKopDRaKQ5c+ZQp06d5EjkTz/9VE6nsHz5cpowYQK1b9+eoqKi6OOPP6ZHHnmEdDodLVmyhAoKCujJJ5+k7777jg4fPkw7d+6koKAgUhSFvv76a3ryySfphRdeIIPBQM8++yyNHj1aeik2btwou3TXrVtHhw4douTkZNLr9TRnzhwiujoNTHBwMC1btox27dpFERERchqYoqIi6t27N8XFxdH27dupXbt2NHLkSMrLy6OCgoJS9Uw7CnjZsmVkNBrpzTffpJtuuok6depEer2eBgwYIPNq9uzZdMstt5CPj48sww4dOpC/vz/NnTuXFi1aRDExMaQoCu3evZseffRRysjIoKioKHr//ffp1ltvpYCAANqyZQsVFBTQv/71L1q/fj0dOnSIfvzxR/L19SWz2Ux//PEH/etf/5LlN3HiRDllhsirFi1aEAAaMWIEffvttzJmadiwYfK5ycrKooCAABo3bhz5+vpSu3btZF0S3uEVK1bQ7Nmz5VQj33//vd1nTsQAbtmyRU4Z9MILL9C0adPIZDKRoii0ceNGIiLq2LEjGY1GGjhwIB06dIgWLFhAPj4+NGfOHHrppZdIURS68847adeuXTRw4ECKjo6mM2fOUO/evSk2Npaio6NpzJgxsl6L8ispKaGEhASaMGECEZHNqOlly5aRwWCg0NBQuv/++2nWrFmk1+tp48aNNHToUDKZTJSQkECLFy+muXPnyumJ5syZQ0OHDqWgoCDy8/OjN954Qz6j/v7+dM8991BsbCy1adOGoqKiaPr06RQaGkoPP/ww5eXl0eDBg2UbdPjwYVq2bBnpdDq65ZZbZPv01FNPkcFgoNGjR1NISAh17dpV2takSRNKSEigDz/8kN59912Kj48nRVFo1qxZtHr1arrvvvsoMDCQnn32WUpOTqa6detSVFQUnTlzhtq2bUthYWH05Zdf0pIlS2Ssb35+Pq1evZq++uorOnToEH399dfUrFkzMplM9OqrrxIR0b///W/S6/WUnZ1NkyZNkt3BDz30EG3bto3atGlDqampdN9995Gfn5+cFiUuLk62mxcuXKBHHnlEtn39+vWjjIwMGYKQnZ1NAQEBlJCQQAAoJSWFQkNDacOG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", + "text/html": [ + "\n", + "
\n", + "
\n", + " Figure\n", + "
\n", + " \n", + "
\n", + " " + ], + "text/plain": [ + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "efaf76591fa64b9db766a4bfb73313f9", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "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", + "text/html": [ + "\n", + "
\n", + "
\n", + " Figure\n", + "
\n", + " \n", + "
\n", + " " + ], + "text/plain": [ + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, { "name": "stdout", "output_type": "stream", @@ -6799,928 +6168,4003 @@ "output_type": "stream", "text": [ "HEAD Starting iteration 1 (out of 4), block 1 (out of 2)\n", + "HEAD Giving shot 12 to worker:0:0\n", + "HEAD Giving shot 20 to worker:0:1\n", + "WORKER:0:1 (ShotID 20) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 gcc -march=native -O3 -g -fPIC -Wall -std=c99 -Wno-unused-result -Wno-unused-variable -Wno-unused-but-set-variable -ffast-math -shared -fopenmp /tmp/devito-jitcache-uid1000/5fbdc4140dbd11c63759b13050cbff7ce8ae11c5.c -lm -o /tmp/devito-jitcache-uid1000/5fbdc4140dbd11c63759b13050cbff7ce8ae11c5.so\n", + "WORKER:0:1 (ShotID 20) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 20) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 20) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", + "WORKER:0:1 (ShotID 20) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 20) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 20) Expected wavefield size 0.5158 GB\n", + "WORKER:0:1 Operator `acoustic_iso_state` instance configuration:\n", + "WORKER:0:1 \t * name=acoustic_iso_state\n", + "WORKER:0:1 \t * subs={h_x: 0.0005, h_y: 0.0005, dt: 8e-08}\n", + "WORKER:0:1 \t * opt=advanced-fsg\n", + "WORKER:0:1 \t * devicecreate=(p(t, x, y), p_saved(time_under, x, y))\n", + "WORKER:0:1 Operator `acoustic_iso_state` generated in 1.81 s\n", + "WORKER:0:1 * lowering.Clusters: 0.98 s (54.2 %)\n", + "WORKER:0:1 * specializing.Clusters: 0.55 s (30.4 %)\n", + "WORKER:0:1 * lowering.IET: 0.46 s (25.5 %)\n", + "WORKER:0:1 Flops reduction after symbolic optimization: [104 --> 59]\n", + "WORKER:0:1 Operator `acoustic_iso_state` jit-compiled `/tmp/devito-jitcache-uid1000/5fbdc4140dbd11c63759b13050cbff7ce8ae11c5.c` in 0.31 s with `GNUCompiler`\n", + "WORKER:0:1 (ShotID 20) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.58 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 44.81 GFlops/s, 0.96 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.49 s [OI=2.63, 48.81 GFlops/s, 1.14 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.07 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.05 s [OI=0.50, 47.93 GFlops/s, 11.99 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 20) Completed state equation run for shot\n", + "HEAD Functional value for shot 20: loss 1.946267e+00 for shot 20\n", + "WORKER:0:0 (ShotID 12) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 12) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 12) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", + "WORKER:0:0 (ShotID 12) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 12) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 12) Expected wavefield size 0.5158 GB\n", + "WORKER:0:0 Operator `acoustic_iso_state` instance configuration:\n", + "WORKER:0:0 \t * name=acoustic_iso_state\n", + "WORKER:0:0 \t * subs={h_x: 0.0005, h_y: 0.0005, dt: 8e-08}\n", + "WORKER:0:0 \t * opt=advanced-fsg\n", + "WORKER:0:0 \t * devicecreate=(p(t, x, y), p_saved(time_under, x, y))\n", + "WORKER:0:0 Operator `acoustic_iso_state` generated in 1.86 s\n", + "WORKER:0:0 * lowering.Clusters: 1.09 s (58.7 %)\n", + "WORKER:0:0 * specializing.Clusters: 0.54 s (29.1 %)\n", + "WORKER:0:0 * lowering.Expressions: 0.39 s (21.0 %)\n", + "WORKER:0:0 Flops reduction after symbolic optimization: [104 --> 59]\n", + "WORKER:0:0 Operator `acoustic_iso_state` fetched `/tmp/devito-jitcache-uid1000/5fbdc4140dbd11c63759b13050cbff7ce8ae11c5.c` in 1.04 s from jit-cache\n", + "WORKER:0:0 (ShotID 12) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.60 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 43.32 GFlops/s, 0.93 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.53 s [OI=2.63, 44.85 GFlops/s, 1.05 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.08 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.20 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.05 s [OI=0.50, 52.10 GFlops/s, 13.03 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 12) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 12) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 12: loss 1.523072e+00 for shot 12\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 gcc -march=native -O3 -g -fPIC -Wall -std=c99 -Wno-unused-result -Wno-unused-variable -Wno-unused-but-set-variable -ffast-math -shared -fopenmp /tmp/devito-jitcache-uid1000/9060b3840c89a6c5c9a96a8b9110f428af33ab06.c -lm -o /tmp/devito-jitcache-uid1000/9060b3840c89a6c5c9a96a8b9110f428af33ab06.so\n", + "WORKER:0:1 (ShotID 20) Preparing to run adjoint for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` instance configuration:\n", + "WORKER:0:1 \t * name=acoustic_iso_adjoint\n", + "WORKER:0:1 \t * subs={h_x: 0.0005, h_y: 0.0005, dt: 8e-08}\n", + "WORKER:0:1 \t * opt=advanced-fsg\n", + "WORKER:0:1 \t * devicecreate=(p_a(t, x, y),)\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` generated in 1.13 s\n", + "WORKER:0:1 * lowering.Clusters: 0.61 s (54.3 %)\n", + "WORKER:0:1 * specializing.Clusters: 0.30 s (26.7 %)\n", + "WORKER:0:1 * lowering.Expressions: 0.25 s (22.3 %)\n", + "WORKER:0:1 Flops reduction after symbolic optimization: [85 --> 47]\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` jit-compiled `/tmp/devito-jitcache-uid1000/9060b3840c89a6c5c9a96a8b9110f428af33ab06.c` in 0.27 s with `GNUCompiler`\n", + "WORKER:0:1 (ShotID 20) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.77 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 32.94 GFlops/s, 0.72 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.64 s [OI=2.63, 37.56 GFlops/s, 0.88 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.07 s [OI=6.00, 1.07 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.07 s [OI=0.25, 24.64 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 20) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 20\n", + "HEAD Giving shot 31 to worker:0:1\n", + "WORKER:0:0 (ShotID 12) Preparing to run adjoint for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` instance configuration:\n", + "WORKER:0:0 \t * name=acoustic_iso_adjoint\n", + "WORKER:0:0 \t * subs={h_x: 0.0005, h_y: 0.0005, dt: 8e-08}\n", + "WORKER:0:0 \t * opt=advanced-fsg\n", + "WORKER:0:0 \t * devicecreate=(p_a(t, x, y),)\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` generated in 1.13 s\n", + "WORKER:0:0 * lowering.Clusters: 0.56 s (50.0 %)\n", + "WORKER:0:0 * specializing.Clusters: 0.26 s (23.3 %)\n", + "WORKER:0:0 * lowering.IET: 0.24 s (21.5 %)\n", + "WORKER:0:0 * lowering.Expressions: 0.23 s (20.6 %)\n", + "WORKER:0:0 Flops reduction after symbolic optimization: [85 --> 47]\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` fetched `/tmp/devito-jitcache-uid1000/9060b3840c89a6c5c9a96a8b9110f428af33ab06.c` in 0.03 s from jit-cache\n", + "WORKER:0:0 (ShotID 12) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 1.10 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 23.06 GFlops/s, 0.51 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.95 s [OI=2.63, 25.22 GFlops/s, 0.59 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 1.84 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.11 s [OI=0.25, 13.95 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 12) Completed adjoint equation run for shot\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 31) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 31) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 31) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 31) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", + "WORKER:0:1 (ShotID 31) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 31) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 31) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.79 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 32.90 GFlops/s, 0.70 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.05 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.67 s [OI=2.63, 35.97 GFlops/s, 0.84 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.88 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 35.21 GFlops/s, 8.81 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 31) Completed state equation run for shot\n", + "HEAD Retrieved gradient for shot 12\n", + "HEAD Giving shot 34 to worker:0:0\n", + "HEAD Functional value for shot 31: loss 2.192256e+00 for shot 31\n", + "WORKER:0:0 (ShotID 34) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 34) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 34) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", + "WORKER:0:0 (ShotID 34) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 34) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 34) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.40 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 64.98 GFlops/s, 1.39 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.35 s [OI=2.63, 69.84 GFlops/s, 1.63 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.98 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.04 s [OI=0.50, 60.09 GFlops/s, 15.03 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 34) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 34) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 31) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 31) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.47 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 53.96 GFlops/s, 1.18 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.39 s [OI=2.63, 61.26 GFlops/s, 1.43 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 3.08 GFlops/s, 0.06 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.06 s [OI=0.25, 27.92 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 31) Completed adjoint equation run for shot\n", + "HEAD Functional value for shot 34: loss 2.359570e+00 for shot 34\n", + "HEAD Retrieved gradient for shot 31\n", + "HEAD Giving shot 39 to worker:0:1\n", + "WORKER:0:0 (ShotID 34) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 34) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.54 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 46.97 GFlops/s, 1.03 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.45 s [OI=2.63, 53.72 GFlops/s, 1.25 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 2.71 GFlops/s, 0.05 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.07 s [OI=0.25, 24.84 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 34) Completed adjoint equation run for shot\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 34\n", + "HEAD Giving shot 45 to worker:0:0\n", + "WORKER:0:1 (ShotID 39) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 39) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 39) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 39) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", + "WORKER:0:1 (ShotID 39) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 39) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 39) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.91 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 28.56 GFlops/s, 0.61 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.77 s [OI=2.63, 30.95 GFlops/s, 0.72 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.06 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.78 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 33.97 GFlops/s, 8.50 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 39) Completed state equation run for shot\n", + "HEAD Functional value for shot 39: loss 1.959321e+00 for shot 39\n", + "WORKER:0:0 (ShotID 45) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 45) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 45) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", + "WORKER:0:0 (ShotID 45) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 45) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 45) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.40 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 64.98 GFlops/s, 1.39 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.35 s [OI=2.63, 68.63 GFlops/s, 1.60 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 2.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.04 s [OI=0.50, 59.70 GFlops/s, 14.93 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 45) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 45) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 45: loss 1.496486e+00 for shot 45\n", + "WORKER:0:1 (ShotID 39) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 39) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.80 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 31.70 GFlops/s, 0.70 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.68 s [OI=2.63, 35.37 GFlops/s, 0.83 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 2.58 GFlops/s, 0.05 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.10 s [OI=0.25, 15.81 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 39) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 39\n", + "HEAD Giving shot 48 to worker:0:1\n", + "WORKER:0:0 (ShotID 45) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 45) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.62 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 40.91 GFlops/s, 0.90 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.52 s [OI=2.63, 46.52 GFlops/s, 1.09 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 3.67 GFlops/s, 0.07 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.09 s [OI=0.25, 17.14 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 45) Completed adjoint equation run for shot\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 45\n", + "HEAD Giving shot 58 to worker:0:0\n", + "WORKER:0:0 (ShotID 58) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 58) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 58) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", + "WORKER:0:0 (ShotID 58) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 58) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 58) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.53 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 49.04 GFlops/s, 1.05 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.45 s [OI=2.63, 53.60 GFlops/s, 1.25 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.07 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.12 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.06 s [OI=0.50, 39.04 GFlops/s, 9.76 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 58) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 58) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 48) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 48) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 48) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", + "WORKER:0:1 (ShotID 48) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 48) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 48) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.99 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 26.26 GFlops/s, 0.56 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.88 s [OI=2.63, 27.26 GFlops/s, 0.64 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.59 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.08 s [OI=0.50, 28.20 GFlops/s, 7.05 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 48) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 48) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 58: loss 1.289033e+00 for shot 58\n", + "HEAD Functional value for shot 48: loss 1.115091e+00 for shot 48\n", + "WORKER:0:0 (ShotID 58) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 58) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.65 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 39.02 GFlops/s, 0.86 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.53 s [OI=2.63, 45.04 GFlops/s, 1.05 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 2.19 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.09 s [OI=0.25, 17.31 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 58) Completed adjoint equation run for shot\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 58\n", + "HEAD Giving shot 59 to worker:0:0\n", + "WORKER:0:1 (ShotID 48) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 48) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 1.38 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 18.38 GFlops/s, 0.41 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 1.21 s [OI=2.63, 19.67 GFlops/s, 0.46 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.06 s [OI=6.00, 1.23 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.12 s [OI=0.25, 13.63 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 48) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 48\n", + "HEAD Giving shot 68 to worker:0:1\n", + "WORKER:0:0 (ShotID 59) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 59) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 59) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", + "WORKER:0:0 (ShotID 59) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 59) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 59) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.78 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 33.32 GFlops/s, 0.71 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.68 s [OI=2.63, 35.21 GFlops/s, 0.82 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.83 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 36.49 GFlops/s, 9.13 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 59) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 59) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 59: loss 1.324072e+00 for shot 59\n", + "WORKER:0:1 (ShotID 68) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 68) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 68) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", + "WORKER:0:1 (ShotID 68) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 68) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 68) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.52 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 49.98 GFlops/s, 1.07 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.44 s [OI=2.63, 54.79 GFlops/s, 1.28 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.49 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.05 s [OI=0.50, 48.05 GFlops/s, 12.02 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 68) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 68) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 68: loss 1.355873e+00 for shot 68\n", + "WORKER:0:0 (ShotID 59) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 59) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.88 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 28.82 GFlops/s, 0.63 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.73 s [OI=2.63, 32.74 GFlops/s, 0.77 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.07 s [OI=6.00, 1.15 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.09 s [OI=0.25, 18.56 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 59) Completed adjoint equation run for shot\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 59\n", + "HEAD Giving shot 77 to worker:0:0\n", + "WORKER:0:1 (ShotID 68) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 68) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.55 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 46.11 GFlops/s, 1.01 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.46 s [OI=2.63, 51.83 GFlops/s, 1.21 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 2.38 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.06 s [OI=0.25, 27.07 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 68) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 68\n", + "HEAD Giving shot 97 to worker:0:1\n", + "WORKER:0:0 (ShotID 77) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 77) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 77) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", + "WORKER:0:0 (ShotID 77) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 77) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 77) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.72 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 36.10 GFlops/s, 0.77 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.58 s [OI=2.63, 41.06 GFlops/s, 0.96 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.55 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 32.89 GFlops/s, 8.23 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 77) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 77) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 97) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 97) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 97) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", + "WORKER:0:1 (ShotID 97) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 97) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 97) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.59 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 44.05 GFlops/s, 0.94 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.02 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.49 s [OI=2.63, 49.43 GFlops/s, 1.15 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.09 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.62 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.06 s [OI=0.50, 38.84 GFlops/s, 9.71 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 97) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 97) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 77: loss 1.654528e+00 for shot 77\n", + "HEAD Functional value for shot 97: loss 1.617715e+00 for shot 97\n", + "WORKER:0:0 (ShotID 77) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 77) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.69 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 36.76 GFlops/s, 0.81 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.56 s [OI=2.63, 42.64 GFlops/s, 1.00 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.06 s [OI=6.00, 1.41 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 19.96 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 77) Completed adjoint equation run for shot\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 77\n", + "HEAD Giving shot 109 to worker:0:0\n", + "WORKER:0:1 (ShotID 97) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 97) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.89 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 28.50 GFlops/s, 0.63 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.73 s [OI=2.63, 32.90 GFlops/s, 0.77 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.06 s [OI=6.00, 1.42 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.11 s [OI=0.25, 14.27 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 97) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 97\n", + "HEAD Giving shot 110 to worker:0:1\n", + "WORKER:0:0 (ShotID 109) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 109) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 109) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", + "WORKER:0:0 (ShotID 109) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 109) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 109) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.62 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 41.92 GFlops/s, 0.90 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.53 s [OI=2.63, 45.40 GFlops/s, 1.06 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 34.29 GFlops/s, 8.58 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 109) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 109) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 109: loss 1.518434e+00 for shot 109\n", + "WORKER:0:1 (ShotID 110) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 110) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 110) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", + "WORKER:0:1 (ShotID 110) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 110) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 110) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.68 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 38.22 GFlops/s, 0.82 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.58 s [OI=2.63, 41.36 GFlops/s, 0.97 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.89 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 31.94 GFlops/s, 7.99 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 110) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 110) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 110: loss 1.544929e+00 for shot 110\n", + "WORKER:0:1 (ShotID 110) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 110) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.71 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 35.72 GFlops/s, 0.78 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.56 s [OI=2.63, 42.45 GFlops/s, 0.99 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 1.93 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.11 s [OI=0.25, 14.61 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 110) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 110\n", + "HEAD Giving shot 117 to worker:0:1\n", + "WORKER:0:0 (ShotID 109) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 109) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 1.16 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 21.87 GFlops/s, 0.48 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.99 s [OI=2.63, 24.09 GFlops/s, 0.57 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.07 s [OI=6.00, 1.04 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.10 s [OI=0.25, 15.83 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 109) Completed adjoint equation run for shot\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 109\n", + "WORKER:0:1 (ShotID 117) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 117) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 117) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", + "WORKER:0:1 (ShotID 117) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 117) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 117) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.48 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 54.15 GFlops/s, 1.16 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.42 s [OI=2.63, 57.40 GFlops/s, 1.34 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.09 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.52 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.04 s [OI=0.50, 62.46 GFlops/s, 15.62 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 117) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 117) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 117: loss 1.120244e+00 for shot 117\n", + "WORKER:0:1 (ShotID 117) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 117) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.43 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 58.98 GFlops/s, 1.29 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.37 s [OI=2.63, 64.57 GFlops/s, 1.51 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 4.92 GFlops/s, 0.09 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.05 s [OI=0.25, 34.71 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 117) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 117\n", + "MONITOR Pending barrier tasks 2\n", + "HEAD Updating variable vp,\n", + "HEAD \t grad before processing in range [-4.951813e-06, 4.739960e-06]\n", + "HEAD \t grad after processing in range [-1.000000e+00, 9.567541e-01]\n", + "HEAD \t variable range before update [1.500000e+03, 1.500000e+03]\n", + "HEAD \t variable range after update [1.490432e+03, 1.510000e+03]\n", + "HEAD Done iteration 1 (out of 4), block 1 (out of 2) - Total loss_freq 2.401689e+01\n", + "HEAD ====================================================================\n", + "HEAD Starting iteration 2 (out of 4), block 1 (out of 2)\n", + "HEAD Giving shot 0 to worker:0:0\n", + "HEAD Giving shot 1 to worker:0:1\n", + "WORKER:0:1 (ShotID 1) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 1) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 1) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:1 (ShotID 1) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 1) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 1) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.90 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 28.88 GFlops/s, 0.62 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.80 s [OI=2.63, 29.84 GFlops/s, 0.70 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.86 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.06 s [OI=0.50, 39.20 GFlops/s, 9.80 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 1) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 1) Spatial grid spacing (0.500 mm | 4.289 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 0) Spatial grid spacing (0.500 mm | 4.289 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 0) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 0) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 0) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:0 (ShotID 0) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 0) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 0) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.99 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 26.26 GFlops/s, 0.56 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.04 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.82 s [OI=2.63, 29.25 GFlops/s, 0.69 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.07 s [OI=5.80, 0.01 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.78 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.06 s [OI=0.50, 36.94 GFlops/s, 9.24 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 0) Completed state equation run for shot\n", + "HEAD Functional value for shot 1: loss 1.234129e+00 for shot 1\n", + "HEAD Functional value for shot 0: loss 1.485469e+00 for shot 0\n", + "WORKER:0:1 (ShotID 1) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 1) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.54 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 46.97 GFlops/s, 1.03 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.43 s [OI=2.63, 55.51 GFlops/s, 1.30 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.05 s [OI=6.00, 1.53 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.06 s [OI=0.25, 25.97 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 1) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 1\n", + "HEAD Giving shot 7 to worker:0:1\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 0) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 0) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 1.22 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 20.79 GFlops/s, 0.46 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 1.03 s [OI=2.63, 23.13 GFlops/s, 0.54 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.06 s [OI=6.00, 1.21 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.13 s [OI=0.25, 11.72 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 0) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 0\n", + "HEAD Giving shot 11 to worker:0:0\n", + "WORKER:0:1 (ShotID 7) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 7) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 7) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:1 (ShotID 7) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 7) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 7) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.85 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 30.58 GFlops/s, 0.66 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.73 s [OI=2.63, 33.00 GFlops/s, 0.77 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.48 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 34.53 GFlops/s, 8.64 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 7) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 7) Spatial grid spacing (0.500 mm | 4.289 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 7: loss 1.138809e+00 for shot 7\n", + "WORKER:0:0 (ShotID 11) Spatial grid spacing (0.500 mm | 4.289 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 11) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 11) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 11) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:0 (ShotID 11) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 11) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 11) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.58 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 44.81 GFlops/s, 0.96 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.50 s [OI=2.63, 48.17 GFlops/s, 1.13 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.06 s [OI=0.50, 39.56 GFlops/s, 9.89 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 11) Completed state equation run for shot\n", + "HEAD Functional value for shot 11: loss 1.347613e+00 for shot 11\n", + "WORKER:0:1 (ShotID 7) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 7) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.70 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 36.23 GFlops/s, 0.79 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.61 s [OI=2.63, 39.58 GFlops/s, 0.93 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 2.95 GFlops/s, 0.05 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.07 s [OI=0.25, 22.30 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 7) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 7\n", + "HEAD Giving shot 13 to worker:0:1\n", + "WORKER:0:1 (ShotID 13) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 13) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 13) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:1 (ShotID 13) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 13) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 13) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.54 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 48.13 GFlops/s, 1.03 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.05 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.47 s [OI=2.63, 51.18 GFlops/s, 1.20 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.65 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.05 s [OI=0.50, 49.04 GFlops/s, 12.26 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 13) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 13) Spatial grid spacing (0.500 mm | 4.289 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 11) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 11) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 1.03 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 24.63 GFlops/s, 0.54 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.86 s [OI=2.63, 27.67 GFlops/s, 0.65 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.08 s [OI=6.00, 0.97 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.09 s [OI=0.25, 17.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 11) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 11\n", + "HEAD Giving shot 19 to worker:0:0\n", + "HEAD Functional value for shot 13: loss 1.329176e+00 for shot 13\n", + "WORKER:0:0 (ShotID 19) Spatial grid spacing (0.500 mm | 4.289 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 19) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 19) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 19) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:0 (ShotID 19) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 19) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 19) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.80 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 32.49 GFlops/s, 0.70 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.69 s [OI=2.63, 34.84 GFlops/s, 0.82 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.89 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 33.29 GFlops/s, 8.33 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 19) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 13) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 13) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.83 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 30.56 GFlops/s, 0.67 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.69 s [OI=2.63, 34.46 GFlops/s, 0.81 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.05 s [OI=6.00, 1.67 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.10 s [OI=0.25, 16.14 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 13) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 13\n", + "HEAD Giving shot 78 to worker:0:1\n", + "HEAD Functional value for shot 19: loss 1.285756e+00 for shot 19\n", + "WORKER:0:1 (ShotID 78) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 78) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 78) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:1 (ShotID 78) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 78) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 78) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.53 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 49.04 GFlops/s, 1.05 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.47 s [OI=2.63, 51.46 GFlops/s, 1.20 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.92 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.04 s [OI=0.50, 61.22 GFlops/s, 15.31 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 78) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 78) Spatial grid spacing (0.500 mm | 4.289 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 78: loss 1.078353e+00 for shot 78\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 19) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 19) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.97 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 26.15 GFlops/s, 0.57 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.84 s [OI=2.63, 28.46 GFlops/s, 0.67 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 1.93 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.09 s [OI=0.25, 17.21 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 19) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 19\n", + "HEAD Giving shot 79 to worker:0:0\n", + "WORKER:0:0 (ShotID 79) Spatial grid spacing (0.500 mm | 4.289 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 79) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 79) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 79) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:0 (ShotID 79) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 79) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 79) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.68 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 38.22 GFlops/s, 0.82 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.03 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.58 s [OI=2.63, 41.27 GFlops/s, 0.96 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.95 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 32.73 GFlops/s, 8.19 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 79) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 78) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 78) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.69 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 36.76 GFlops/s, 0.81 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.58 s [OI=2.63, 41.48 GFlops/s, 0.97 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 2.28 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.09 s [OI=0.25, 18.34 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 78) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 78\n", + "HEAD Giving shot 82 to worker:0:1\n", + "HEAD Functional value for shot 79: loss 1.062664e+00 for shot 79\n", + "WORKER:0:1 (ShotID 82) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 82) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 82) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:1 (ShotID 82) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 82) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 82) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.41 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 63.39 GFlops/s, 1.35 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.03 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.34 s [OI=2.63, 71.37 GFlops/s, 1.66 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 2.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.04 s [OI=0.50, 62.18 GFlops/s, 15.55 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 82) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 82) Spatial grid spacing (0.500 mm | 4.289 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 82: loss 1.638023e+00 for shot 82\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 79) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 79) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.48 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 52.84 GFlops/s, 1.16 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.41 s [OI=2.63, 58.33 GFlops/s, 1.36 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 4.72 GFlops/s, 0.08 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.06 s [OI=0.25, 27.38 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 79) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 79\n", + "HEAD Giving shot 84 to worker:0:0\n", + "WORKER:0:1 (ShotID 82) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 82) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.78 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 32.52 GFlops/s, 0.71 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.63 s [OI=2.63, 37.99 GFlops/s, 0.89 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.07 s [OI=6.00, 1.15 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.09 s [OI=0.25, 17.65 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 82) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 82\n", + "HEAD Giving shot 87 to worker:0:1\n", + "WORKER:0:0 (ShotID 84) Spatial grid spacing (0.500 mm | 4.289 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 84) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 84) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 84) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:0 (ShotID 84) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 84) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 84) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.02 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 25.48 GFlops/s, 0.55 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.88 s [OI=2.63, 27.26 GFlops/s, 0.64 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.44 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.08 s [OI=0.50, 28.37 GFlops/s, 7.10 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 84) Completed state equation run for shot\n", + "HEAD Functional value for shot 84: loss 1.688484e+00 for shot 84\n", + "WORKER:0:1 (ShotID 87) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 87) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 87) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:1 (ShotID 87) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 87) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 87) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.39 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 66.64 GFlops/s, 1.42 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.35 s [OI=2.63, 69.75 GFlops/s, 1.63 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 2.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.04 s [OI=0.50, 60.08 GFlops/s, 15.02 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 87) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 87) Spatial grid spacing (0.500 mm | 4.289 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 87: loss 1.437833e+00 for shot 87\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 84) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 84) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 1.16 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 21.87 GFlops/s, 0.48 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 1.01 s [OI=2.63, 23.73 GFlops/s, 0.56 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.06 s [OI=6.00, 1.34 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.11 s [OI=0.25, 14.93 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 84) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 84\n", + "HEAD Giving shot 95 to worker:0:0\n", + "WORKER:0:1 (ShotID 87) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 87) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.85 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 29.84 GFlops/s, 0.66 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.71 s [OI=2.63, 33.77 GFlops/s, 0.79 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.07 s [OI=6.00, 1.15 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 20.37 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 87) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 87\n", + "HEAD Giving shot 103 to worker:0:1\n", + "WORKER:0:0 (ShotID 95) Spatial grid spacing (0.500 mm | 4.289 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 95) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 95) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 95) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:0 (ShotID 95) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 95) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 95) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.12 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 23.21 GFlops/s, 0.50 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 1.00 s [OI=2.63, 23.97 GFlops/s, 0.56 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.54 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.08 s [OI=0.50, 28.09 GFlops/s, 7.03 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 95) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 103) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 103) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 103) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:1 (ShotID 103) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 103) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 103) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.83 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 31.32 GFlops/s, 0.67 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.72 s [OI=2.63, 33.12 GFlops/s, 0.78 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.86 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 33.77 GFlops/s, 8.45 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 103) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 103) Spatial grid spacing (0.500 mm | 4.289 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 95: loss 1.354384e+00 for shot 95\n", + "HEAD Functional value for shot 103: loss 1.093024e+00 for shot 103\n", + "WORKER:0:1 (ShotID 103) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 103) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.62 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 40.91 GFlops/s, 0.90 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.50 s [OI=2.63, 48.46 GFlops/s, 1.13 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.05 s [OI=6.00, 1.70 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.09 s [OI=0.25, 18.61 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 103) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 103\n", + "HEAD Giving shot 111 to worker:0:1\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 95) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 95) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.98 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 25.88 GFlops/s, 0.57 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.85 s [OI=2.63, 28.00 GFlops/s, 0.66 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 1.83 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.09 s [OI=0.25, 17.94 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 95) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 95\n", + "HEAD Giving shot 115 to worker:0:0\n", + "WORKER:0:1 (ShotID 111) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 111) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 111) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:1 (ShotID 111) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 111) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 111) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.72 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 36.10 GFlops/s, 0.77 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.02 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.62 s [OI=2.63, 38.54 GFlops/s, 0.90 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.05 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.89 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 33.82 GFlops/s, 8.46 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 111) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 111) Spatial grid spacing (0.500 mm | 4.289 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 115) Spatial grid spacing (0.500 mm | 4.289 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 115) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 115) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 115) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:0 (ShotID 115) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 115) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 115) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.78 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 33.32 GFlops/s, 0.71 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.05 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.66 s [OI=2.63, 36.31 GFlops/s, 0.85 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.85 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 36.51 GFlops/s, 9.13 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 115) Completed state equation run for shot\n", + "HEAD Functional value for shot 111: loss 1.170157e+00 for shot 111\n", + "HEAD Functional value for shot 115: loss 1.260692e+00 for shot 115\n", + "WORKER:0:1 (ShotID 111) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 111) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.62 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 40.91 GFlops/s, 0.90 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.50 s [OI=2.63, 47.58 GFlops/s, 1.11 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 2.26 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.09 s [OI=0.25, 17.70 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 111) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 111\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 115) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 115) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.84 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 30.19 GFlops/s, 0.66 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.71 s [OI=2.63, 33.66 GFlops/s, 0.79 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.06 s [OI=6.00, 1.36 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 21.32 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 115) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 115\n", + "MONITOR Pending barrier tasks 3\n", + "HEAD Updating variable vp,\n", + "HEAD \t grad before processing in range [-7.922218e-06, 3.535966e-06]\n", + "HEAD \t grad after processing in range [-1.000000e+00, 4.461613e-01]\n", + "HEAD \t variable range before update [1.490432e+03, 1.510000e+03]\n", + "HEAD \t variable range after update [1.489276e+03, 1.514527e+03]\n", + "HEAD Done iteration 2 (out of 4), block 1 (out of 2) - Total loss_freq 1.960456e+01\n", + "HEAD ====================================================================\n", + "HEAD Starting iteration 3 (out of 4), block 1 (out of 2)\n", "HEAD Giving shot 5 to worker:0:0\n", + "HEAD Giving shot 10 to worker:0:1\n", + "WORKER:0:1 (ShotID 10) Spatial grid spacing (0.500 mm | 4.286 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 10) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 10) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 10) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:1 (ShotID 10) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 10) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 10) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.03 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 25.24 GFlops/s, 0.54 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.02 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.89 s [OI=2.63, 27.00 GFlops/s, 0.63 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.44 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 32.10 GFlops/s, 8.03 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 10) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 5) Spatial grid spacing (0.500 mm | 4.286 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 5) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 5) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 5) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:0 (ShotID 5) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 5) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 5) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.09 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 23.85 GFlops/s, 0.51 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.93 s [OI=2.63, 25.63 GFlops/s, 0.60 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.08 s [OI=5.80, 0.01 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.65 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 32.29 GFlops/s, 8.08 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 5) Completed state equation run for shot\n", + "HEAD Functional value for shot 10: loss 1.052294e+00 for shot 10\n", + "HEAD Functional value for shot 5: loss 1.044606e+00 for shot 5\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 10) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 10) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.81 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 31.31 GFlops/s, 0.69 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.67 s [OI=2.63, 35.48 GFlops/s, 0.83 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 2.10 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.10 s [OI=0.25, 15.53 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 10) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 10\n", + "HEAD Giving shot 21 to worker:0:1\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 5) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 5) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 1.14 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 22.25 GFlops/s, 0.49 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.97 s [OI=2.63, 24.60 GFlops/s, 0.58 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.08 s [OI=6.00, 0.91 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.10 s [OI=0.25, 16.29 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 5) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 5\n", + "HEAD Giving shot 24 to worker:0:0\n", + "WORKER:0:1 (ShotID 21) Spatial grid spacing (0.500 mm | 4.286 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 21) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 21) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 21) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:1 (ShotID 21) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 21) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 21) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.74 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 35.13 GFlops/s, 0.75 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.65 s [OI=2.63, 36.95 GFlops/s, 0.86 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.05 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.81 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 33.30 GFlops/s, 8.33 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 21) Completed state equation run for shot\n", + "HEAD Functional value for shot 21: loss 1.443231e+00 for shot 21\n", + "WORKER:0:0 (ShotID 24) Spatial grid spacing (0.500 mm | 4.286 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 24) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 24) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 24) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:0 (ShotID 24) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 24) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 24) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.26 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 20.63 GFlops/s, 0.44 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 1.13 s [OI=2.63, 21.05 GFlops/s, 0.49 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.51 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.09 s [OI=0.50, 26.43 GFlops/s, 6.61 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 24) Completed state equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 21) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 21) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.59 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 42.99 GFlops/s, 0.94 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.47 s [OI=2.63, 50.85 GFlops/s, 1.19 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 2.29 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.09 s [OI=0.25, 18.85 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 21) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 21\n", + "HEAD Giving shot 40 to worker:0:1\n", + "HEAD Functional value for shot 24: loss 1.615799e+00 for shot 24\n", + "WORKER:0:1 (ShotID 40) Spatial grid spacing (0.500 mm | 4.286 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 40) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 40) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 40) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:1 (ShotID 40) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 40) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 40) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.61 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 42.61 GFlops/s, 0.91 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.51 s [OI=2.63, 47.05 GFlops/s, 1.10 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.50 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.06 s [OI=0.50, 38.83 GFlops/s, 9.71 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 40) Completed state equation run for shot\n", + "HEAD Functional value for shot 40: loss 9.867871e-01 for shot 40\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 24) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 24) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 1.29 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 19.66 GFlops/s, 0.43 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 1.13 s [OI=2.63, 21.06 GFlops/s, 0.49 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.05 s [OI=6.00, 1.48 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.12 s [OI=0.25, 13.62 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 24) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 24\n", + "HEAD Giving shot 57 to worker:0:0\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 40) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 40) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.62 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 40.91 GFlops/s, 0.90 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.51 s [OI=2.63, 47.05 GFlops/s, 1.10 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 2.18 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 20.31 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 40) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 40\n", + "HEAD Giving shot 60 to worker:0:1\n", + "WORKER:0:1 (ShotID 60) Spatial grid spacing (0.500 mm | 4.286 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 60) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 60) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 60) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:1 (ShotID 60) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 60) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 60) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.66 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 39.38 GFlops/s, 0.84 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.54 s [OI=2.63, 44.26 GFlops/s, 1.03 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.06 s [OI=0.50, 37.96 GFlops/s, 9.49 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 60) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 57) Spatial grid spacing (0.500 mm | 4.286 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 57) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 57) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 57) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:0 (ShotID 57) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 57) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 57) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.92 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 28.25 GFlops/s, 0.61 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.81 s [OI=2.63, 29.44 GFlops/s, 0.69 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.65 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.08 s [OI=0.50, 29.87 GFlops/s, 7.47 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 57) Completed state equation run for shot\n", + "HEAD Functional value for shot 57: loss 6.731951e-01 for shot 57\n", + "HEAD Functional value for shot 60: loss 1.211993e+00 for shot 60\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 57) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 57) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.57 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 44.50 GFlops/s, 0.97 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.48 s [OI=2.63, 50.28 GFlops/s, 1.17 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 2.35 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.07 s [OI=0.25, 23.25 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 57) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 57\n", + "HEAD Giving shot 63 to worker:0:0\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 60) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 60) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.84 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 30.19 GFlops/s, 0.66 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.69 s [OI=2.63, 34.65 GFlops/s, 0.81 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.05 s [OI=6.00, 1.46 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.11 s [OI=0.25, 15.14 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 60) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 60\n", + "HEAD Giving shot 64 to worker:0:1\n", + "WORKER:0:0 (ShotID 63) Spatial grid spacing (0.500 mm | 4.286 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 63) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 63) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 63) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:0 (ShotID 63) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 63) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 63) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.50 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 51.98 GFlops/s, 1.11 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.44 s [OI=2.63, 54.82 GFlops/s, 1.28 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.10 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.53 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.05 s [OI=0.50, 51.67 GFlops/s, 12.92 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 63) Completed state equation run for shot\n", + "HEAD Functional value for shot 63: loss 6.177325e-01 for shot 63\n", + "WORKER:0:1 (ShotID 64) Spatial grid spacing (0.500 mm | 4.286 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 64) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 64) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 64) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:1 (ShotID 64) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 64) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 64) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.85 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 30.58 GFlops/s, 0.66 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.03 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.70 s [OI=2.63, 34.07 GFlops/s, 0.80 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.44 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 33.84 GFlops/s, 8.46 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 64) Completed state equation run for shot\n", + "HEAD Functional value for shot 64: loss 8.919188e-01 for shot 64\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 63) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 63) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.50 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 50.72 GFlops/s, 1.11 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.41 s [OI=2.63, 57.99 GFlops/s, 1.35 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 2.75 GFlops/s, 0.05 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.06 s [OI=0.25, 26.91 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 63) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 63\n", + "HEAD Giving shot 67 to worker:0:0\n", + "WORKER:0:0 (ShotID 67) Spatial grid spacing (0.500 mm | 4.286 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 67) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 67) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 67) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:0 (ShotID 67) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 67) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 67) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.49 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 53.04 GFlops/s, 1.13 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.03 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.41 s [OI=2.63, 58.86 GFlops/s, 1.37 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.88 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.04 s [OI=0.50, 60.71 GFlops/s, 15.18 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 67) Completed state equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 64) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 64) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 1.17 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 21.68 GFlops/s, 0.48 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.95 s [OI=2.63, 25.20 GFlops/s, 0.59 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.12 s [OI=6.00, 0.65 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.12 s [OI=0.25, 13.58 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 64) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 64\n", + "HEAD Giving shot 90 to worker:0:1\n", + "HEAD Functional value for shot 67: loss 9.410507e-01 for shot 67\n", + "WORKER:0:1 (ShotID 90) Spatial grid spacing (0.500 mm | 4.286 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 90) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 90) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 90) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:1 (ShotID 90) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 90) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 90) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.55 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 47.26 GFlops/s, 1.01 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.46 s [OI=2.63, 52.22 GFlops/s, 1.22 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.24 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.05 s [OI=0.50, 45.84 GFlops/s, 11.46 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 90) Completed state equation run for shot\n", + "HEAD Functional value for shot 90: loss 1.220387e+00 for shot 90\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 67) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 67) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.73 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 34.74 GFlops/s, 0.76 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.62 s [OI=2.63, 38.82 GFlops/s, 0.91 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 3.11 GFlops/s, 0.06 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.10 s [OI=0.25, 16.14 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 67) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 67\n", + "HEAD Giving shot 102 to worker:0:0\n", + "WORKER:0:0 (ShotID 102) Spatial grid spacing (0.500 mm | 4.286 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 102) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 102) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 102) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:0 (ShotID 102) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 102) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 102) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.66 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 39.38 GFlops/s, 0.84 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.57 s [OI=2.63, 41.95 GFlops/s, 0.98 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.95 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 33.44 GFlops/s, 8.36 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 102) Completed state equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 90) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 90) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 1.34 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 18.93 GFlops/s, 0.42 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 1.17 s [OI=2.63, 20.44 GFlops/s, 0.48 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.06 s [OI=6.00, 1.35 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.12 s [OI=0.25, 12.90 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 90) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 90\n", + "HEAD Giving shot 105 to worker:0:1\n", + "HEAD Functional value for shot 102: loss 8.162838e-01 for shot 102\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 102) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 102) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.75 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 33.82 GFlops/s, 0.74 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.62 s [OI=2.63, 38.85 GFlops/s, 0.91 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 2.06 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.10 s [OI=0.25, 15.36 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 102) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 102\n", + "HEAD Giving shot 108 to worker:0:0\n", + "WORKER:0:1 (ShotID 105) Spatial grid spacing (0.500 mm | 4.286 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 105) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 105) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 105) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:1 (ShotID 105) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 105) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 105) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.11 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 23.42 GFlops/s, 0.50 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.98 s [OI=2.63, 24.48 GFlops/s, 0.57 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.54 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.09 s [OI=0.50, 25.89 GFlops/s, 6.48 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 105) Completed state equation run for shot\n", + "HEAD Functional value for shot 105: loss 1.023904e+00 for shot 105\n", + "WORKER:0:0 (ShotID 108) Spatial grid spacing (0.500 mm | 4.286 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 108) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 108) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 108) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:0 (ShotID 108) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 108) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 108) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.72 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 36.10 GFlops/s, 0.77 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.03 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.62 s [OI=2.63, 38.75 GFlops/s, 0.91 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.97 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 32.73 GFlops/s, 8.19 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 108) Completed state equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 105) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 105) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.58 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 43.73 GFlops/s, 0.96 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.48 s [OI=2.63, 49.70 GFlops/s, 1.16 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 2.25 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.07 s [OI=0.25, 23.16 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 105) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 105\n", + "HEAD Giving shot 114 to worker:0:1\n", + "HEAD Functional value for shot 108: loss 8.095331e-01 for shot 108\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 108) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 108) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.78 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 32.52 GFlops/s, 0.71 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.64 s [OI=2.63, 37.70 GFlops/s, 0.88 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 1.96 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.11 s [OI=0.25, 14.35 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 108) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 108\n", + "WORKER:0:1 (ShotID 114) Spatial grid spacing (0.500 mm | 4.286 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 114) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 114) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 114) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:1 (ShotID 114) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 114) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 114) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.28 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 20.31 GFlops/s, 0.44 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 1.12 s [OI=2.63, 21.33 GFlops/s, 0.50 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.46 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.10 s [OI=0.50, 22.26 GFlops/s, 5.57 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 114) Completed state equation run for shot\n", + "HEAD Functional value for shot 114: loss 9.077051e-01 for shot 114\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 114) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 114) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.37 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 68.54 GFlops/s, 1.50 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.32 s [OI=2.63, 75.38 GFlops/s, 1.76 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 5.62 GFlops/s, 0.10 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.04 s [OI=0.25, 38.25 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 114) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 114\n", + "MONITOR Pending barrier tasks 2\n", + "HEAD Updating variable vp,\n", + "HEAD \t grad before processing in range [-4.327476e-06, 5.192824e-06]\n", + "HEAD \t grad after processing in range [-8.336912e-01, 1.000000e+00]\n", + "HEAD \t variable range before update [1.489276e+03, 1.514527e+03]\n", + "HEAD \t variable range after update [1.485060e+03, 1.517948e+03]\n", + "HEAD Done iteration 3 (out of 4), block 1 (out of 2) - Total loss_freq 1.525642e+01\n", + "HEAD ====================================================================\n", + "HEAD Starting iteration 4 (out of 4), block 1 (out of 2)\n", + "HEAD Giving shot 2 to worker:0:0\n", + "HEAD Giving shot 23 to worker:0:1\n", + "WORKER:0:0 (ShotID 2) Spatial grid spacing (0.500 mm | 4.274 PPW) is higher than dispersion limit (0.427 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 2) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 2) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 2) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:0 (ShotID 2) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 2) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 2) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.68 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 38.22 GFlops/s, 0.82 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.59 s [OI=2.63, 40.70 GFlops/s, 0.95 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.92 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 34.31 GFlops/s, 8.58 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 2) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 23) Spatial grid spacing (0.500 mm | 4.274 PPW) is higher than dispersion limit (0.427 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 23) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 23) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 23) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:1 (ShotID 23) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 23) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 23) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.83 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 31.32 GFlops/s, 0.67 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.03 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.73 s [OI=2.63, 32.70 GFlops/s, 0.77 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.83 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 35.98 GFlops/s, 9.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 23) Completed state equation run for shot\n", + "HEAD Functional value for shot 2: loss 8.408039e-01 for shot 2\n", + "HEAD Functional value for shot 23: loss 1.180892e+00 for shot 23\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 2) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 2) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.78 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 32.52 GFlops/s, 0.71 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.61 s [OI=2.63, 39.04 GFlops/s, 0.91 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.08 s [OI=6.00, 0.93 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.10 s [OI=0.25, 16.85 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 2) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 2\n", + "HEAD Giving shot 32 to worker:0:0\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 23) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 23) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 1.32 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 19.22 GFlops/s, 0.42 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 1.14 s [OI=2.63, 20.87 GFlops/s, 0.49 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.06 s [OI=6.00, 1.24 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.13 s [OI=0.25, 12.50 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 23) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 23\n", + "HEAD Giving shot 33 to worker:0:1\n", + "WORKER:0:0 (ShotID 32) Spatial grid spacing (0.500 mm | 4.274 PPW) is higher than dispersion limit (0.427 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 32) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 32) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 32) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:0 (ShotID 32) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 32) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 32) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.62 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 41.92 GFlops/s, 0.90 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.55 s [OI=2.63, 43.59 GFlops/s, 1.02 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.08 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.35 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.05 s [OI=0.50, 50.39 GFlops/s, 12.60 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 32) Completed state equation run for shot\n", + "HEAD Functional value for shot 32: loss 1.428600e+00 for shot 32\n", + "WORKER:0:1 (ShotID 33) Spatial grid spacing (0.500 mm | 4.274 PPW) is higher than dispersion limit (0.427 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 33) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 33) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 33) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:1 (ShotID 33) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 33) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 33) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.52 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 49.98 GFlops/s, 1.07 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.45 s [OI=2.63, 53.48 GFlops/s, 1.25 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.41 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.05 s [OI=0.50, 48.50 GFlops/s, 12.13 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 33) Completed state equation run for shot\n", + "HEAD Functional value for shot 33: loss 1.282188e+00 for shot 33\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 32) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 32) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.58 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 43.73 GFlops/s, 0.96 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.48 s [OI=2.63, 49.80 GFlops/s, 1.16 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 1.94 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.07 s [OI=0.25, 23.93 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 32) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 32\n", + "HEAD Giving shot 50 to worker:0:0\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 33) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 33) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.83 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 30.56 GFlops/s, 0.67 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.68 s [OI=2.63, 35.23 GFlops/s, 0.82 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.07 s [OI=6.00, 1.20 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.10 s [OI=0.25, 16.34 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 33) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 33\n", + "HEAD Giving shot 51 to worker:0:1\n", + "WORKER:0:0 (ShotID 50) Spatial grid spacing (0.500 mm | 4.274 PPW) is higher than dispersion limit (0.427 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 50) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 50) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 50) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:0 (ShotID 50) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 50) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 50) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.86 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 30.22 GFlops/s, 0.65 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.75 s [OI=2.63, 31.69 GFlops/s, 0.74 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.05 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.72 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.08 s [OI=0.50, 29.25 GFlops/s, 7.32 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 50) Completed state equation run for shot\n", + "HEAD Functional value for shot 50: loss 8.628743e-01 for shot 50\n", + "WORKER:0:1 (ShotID 51) Spatial grid spacing (0.500 mm | 4.274 PPW) is higher than dispersion limit (0.427 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 51) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 51) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 51) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:1 (ShotID 51) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 51) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 51) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.82 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 31.70 GFlops/s, 0.68 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.70 s [OI=2.63, 34.35 GFlops/s, 0.80 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.79 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 33.10 GFlops/s, 8.28 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 51) Completed state equation run for shot\n", + "HEAD Functional value for shot 51: loss 8.376154e-01 for shot 51\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 50) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 50) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.84 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 30.19 GFlops/s, 0.66 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.66 s [OI=2.63, 36.15 GFlops/s, 0.85 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.10 s [OI=6.00, 0.77 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.09 s [OI=0.25, 17.31 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 50) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 50\n", + "HEAD Giving shot 52 to worker:0:0\n", + "WORKER:0:0 (ShotID 52) Spatial grid spacing (0.500 mm | 4.274 PPW) is higher than dispersion limit (0.427 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 52) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 52) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 52) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:0 (ShotID 52) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 52) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 52) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.74 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 35.13 GFlops/s, 0.75 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.03 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.64 s [OI=2.63, 37.51 GFlops/s, 0.88 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.24 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 34.80 GFlops/s, 8.70 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 52) Completed state equation run for shot\n", + "HEAD Functional value for shot 52: loss 7.519278e-01 for shot 52\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 51) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 51) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 1.12 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 22.65 GFlops/s, 0.50 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.93 s [OI=2.63, 25.80 GFlops/s, 0.60 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.09 s [OI=6.00, 0.86 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.11 s [OI=0.25, 13.89 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 51) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 51\n", + "HEAD Giving shot 54 to worker:0:1\n", + "WORKER:0:1 (ShotID 54) Spatial grid spacing (0.500 mm | 4.274 PPW) is higher than dispersion limit (0.427 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 54) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 54) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 54) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:1 (ShotID 54) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 54) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 54) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.65 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 39.99 GFlops/s, 0.86 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.54 s [OI=2.63, 44.41 GFlops/s, 1.04 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.06 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 35.25 GFlops/s, 8.82 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 54) Completed state equation run for shot\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 52) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 52) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.99 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 25.62 GFlops/s, 0.56 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.82 s [OI=2.63, 29.25 GFlops/s, 0.69 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.07 s [OI=6.00, 1.09 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.11 s [OI=0.25, 14.22 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 52) Completed adjoint equation run for shot\n", + "HEAD Functional value for shot 54: loss 8.270466e-01 for shot 54\n", + "HEAD Retrieved gradient for shot 52\n", + "HEAD Giving shot 72 to worker:0:0\n", + "WORKER:0:0 (ShotID 72) Spatial grid spacing (0.500 mm | 4.274 PPW) is higher than dispersion limit (0.427 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 72) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 72) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 72) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:0 (ShotID 72) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 72) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 72) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.41 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 63.39 GFlops/s, 1.35 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.36 s [OI=2.63, 67.35 GFlops/s, 1.57 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 2.03 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.04 s [OI=0.50, 58.97 GFlops/s, 14.75 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 72) Completed state equation run for shot\n", + "HEAD Functional value for shot 72: loss 8.288234e-01 for shot 72\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 54) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 54) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 1.00 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 25.36 GFlops/s, 0.56 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.85 s [OI=2.63, 28.30 GFlops/s, 0.66 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.05 s [OI=6.00, 1.46 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.11 s [OI=0.25, 15.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 54) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 54\n", + "HEAD Giving shot 89 to worker:0:1\n", + "WORKER:0:1 (ShotID 89) Spatial grid spacing (0.500 mm | 4.274 PPW) is higher than dispersion limit (0.427 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 89) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 89) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 89) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:1 (ShotID 89) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 89) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 89) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.39 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 18.70 GFlops/s, 0.40 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 1.23 s [OI=2.63, 19.41 GFlops/s, 0.46 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.44 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.11 s [OI=0.50, 21.85 GFlops/s, 5.47 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 89) Completed state equation run for shot\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 72) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 72) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 1.65 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 15.37 GFlops/s, 0.34 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 1.45 s [OI=2.63, 16.48 GFlops/s, 0.39 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.07 s [OI=6.00, 1.10 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.14 s [OI=0.25, 11.30 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 72) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 72\n", + "HEAD Giving shot 93 to worker:0:0\n", + "HEAD Functional value for shot 89: loss 9.078940e-01 for shot 89\n", + "WORKER:0:1 (ShotID 89) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 89) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.91 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 27.87 GFlops/s, 0.61 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.76 s [OI=2.63, 31.56 GFlops/s, 0.74 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.05 s [OI=6.00, 1.48 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.11 s [OI=0.25, 14.15 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 89) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 89\n", + "HEAD Giving shot 94 to worker:0:1\n", + "WORKER:0:0 (ShotID 93) Spatial grid spacing (0.500 mm | 4.274 PPW) is higher than dispersion limit (0.427 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 93) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 93) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 93) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:0 (ShotID 93) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 93) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 93) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.34 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 19.40 GFlops/s, 0.42 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 1.19 s [OI=2.63, 20.14 GFlops/s, 0.47 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.51 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.09 s [OI=0.50, 24.75 GFlops/s, 6.19 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 93) Completed state equation run for shot\n", + "HEAD Functional value for shot 93: loss 1.018066e+00 for shot 93\n", + "WORKER:0:1 (ShotID 94) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 94) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 94) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:1 (ShotID 94) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 94) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 94) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.81 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 32.09 GFlops/s, 0.69 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.69 s [OI=2.63, 34.71 GFlops/s, 0.81 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.85 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 34.73 GFlops/s, 8.69 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 94) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 94) Spatial grid spacing (0.500 mm | 4.274 PPW) is higher than dispersion limit (0.427 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 93) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 93) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.63 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 40.26 GFlops/s, 0.88 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.51 s [OI=2.63, 46.97 GFlops/s, 1.10 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 1.88 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.09 s [OI=0.25, 18.08 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 93) Completed adjoint equation run for shot\n", + "HEAD Functional value for shot 94: loss 1.051884e+00 for shot 94\n", + "HEAD Retrieved gradient for shot 93\n", + "HEAD Giving shot 98 to worker:0:0\n", + "WORKER:0:0 (ShotID 98) Spatial grid spacing (0.500 mm | 4.274 PPW) is higher than dispersion limit (0.427 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 98) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 98) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 98) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:0 (ShotID 98) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 98) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 98) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.39 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 66.64 GFlops/s, 1.42 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.05 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.34 s [OI=2.63, 70.33 GFlops/s, 1.64 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 2.19 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.04 s [OI=0.50, 64.22 GFlops/s, 16.06 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 98) Completed state equation run for shot\n", + "HEAD Functional value for shot 98: loss 9.767208e-01 for shot 98\n", + "WORKER:0:1 (ShotID 94) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 94) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 1.69 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 15.01 GFlops/s, 0.33 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 1.44 s [OI=2.63, 16.61 GFlops/s, 0.39 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.11 s [OI=6.00, 0.68 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.15 s [OI=0.25, 10.54 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 94) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 94\n", + "HEAD Giving shot 100 to worker:0:1\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 98) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 98) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 1.00 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 25.36 GFlops/s, 0.56 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.86 s [OI=2.63, 27.78 GFlops/s, 0.65 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 2.07 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.11 s [OI=0.25, 14.61 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 98) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 98\n", + "HEAD Giving shot 118 to worker:0:0\n", + "WORKER:0:0 (ShotID 118) Spatial grid spacing (0.500 mm | 4.274 PPW) is higher than dispersion limit (0.427 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 118) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 118) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:0 (ShotID 118) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:0 (ShotID 118) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 118) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 118) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.25 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 20.80 GFlops/s, 0.45 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 1.09 s [OI=2.63, 21.97 GFlops/s, 0.52 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.56 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.12 s [OI=0.50, 18.69 GFlops/s, 4.68 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 118) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 100) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 100) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", + "WORKER:0:1 (ShotID 100) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:1 (ShotID 100) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 100) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 100) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.47 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 17.68 GFlops/s, 0.38 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.03 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 1.28 s [OI=2.63, 18.63 GFlops/s, 0.44 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.04 s [OI=1.32, 0.35 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.11 s [OI=0.50, 21.76 GFlops/s, 5.44 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 100) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 100) Spatial grid spacing (0.500 mm | 4.274 PPW) is higher than dispersion limit (0.427 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 118: loss 8.474549e-01 for shot 118\n", + "HEAD Functional value for shot 100: loss 8.085635e-01 for shot 100\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 118) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 118) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 1.06 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 23.93 GFlops/s, 0.53 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.86 s [OI=2.63, 27.82 GFlops/s, 0.65 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.10 s [OI=6.00, 0.79 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.11 s [OI=0.25, 14.09 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 118) Completed adjoint equation run for shot\n", + "WORKER:0:1 (ShotID 100) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 100) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.74 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 34.27 GFlops/s, 0.75 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.56 s [OI=2.63, 42.46 GFlops/s, 0.99 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.07 s [OI=6.00, 1.07 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.12 s [OI=0.25, 13.73 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 100) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 118\n", + "HEAD Retrieved gradient for shot 100\n", + "MONITOR Pending barrier tasks 2\n", + "HEAD Updating variable vp,\n", + "HEAD \t grad before processing in range [-5.911557e-06, 2.368513e-06]\n", + "HEAD \t grad after processing in range [-1.000000e+00, 4.006352e-01]\n", + "HEAD \t variable range before update [1.485060e+03, 1.517948e+03]\n", + "HEAD \t variable range after update [1.483172e+03, 1.522786e+03]\n", + "HEAD Done iteration 4 (out of 4), block 1 (out of 2) - Total loss_freq 1.445136e+01\n", + "HEAD ====================================================================\n", + "HEAD Starting iteration 1 (out of 4), block 2 (out of 2)\n", + "HEAD Giving shot 4 to worker:0:0\n", + "HEAD Giving shot 6 to worker:0:1\n", + "WORKER:0:0 (ShotID 4) Spatial grid spacing (0.500 mm | 4.149 PPW) is higher than dispersion limit (0.415 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 4) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 4) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 4) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:0 (ShotID 4) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 4) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 4) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.88 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 29.54 GFlops/s, 0.63 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.03 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.73 s [OI=2.63, 32.98 GFlops/s, 0.77 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.81 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 33.79 GFlops/s, 8.45 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 4) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 6) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 6) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 6) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:1 (ShotID 6) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 6) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 6) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.78 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 33.32 GFlops/s, 0.71 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.02 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.64 s [OI=2.63, 37.17 GFlops/s, 0.87 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.62 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.08 s [OI=0.50, 27.91 GFlops/s, 6.98 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 6) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 6) Spatial grid spacing (0.500 mm | 4.149 PPW) is higher than dispersion limit (0.415 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 6: loss 8.967083e-01 for shot 6\n", + "HEAD Functional value for shot 4: loss 9.750446e-01 for shot 4\n", + "WORKER:0:1 (ShotID 6) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 6) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 1.40 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 18.12 GFlops/s, 0.40 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 1.22 s [OI=2.63, 19.57 GFlops/s, 0.46 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.05 s [OI=6.00, 1.54 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.14 s [OI=0.25, 11.61 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 6) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 6\n", "HEAD Giving shot 16 to worker:0:1\n", - "WORKER:0:0 (ShotID 5) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 5) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:0 (ShotID 5) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 5) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", - "WORKER:0:0 (ShotID 5) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 5) Selected time stepping scheme OT2\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 4) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 4) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 1.48 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 17.14 GFlops/s, 0.38 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 1.26 s [OI=2.63, 18.92 GFlops/s, 0.44 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.09 s [OI=6.00, 0.88 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.14 s [OI=0.25, 11.53 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 4) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 4\n", + "HEAD Giving shot 26 to worker:0:0\n", + "WORKER:0:0 (ShotID 26) Spatial grid spacing (0.500 mm | 4.149 PPW) is higher than dispersion limit (0.415 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 26) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 26) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 26) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:0 (ShotID 26) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 26) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 26) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.70 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 37.13 GFlops/s, 0.79 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.60 s [OI=2.63, 39.67 GFlops/s, 0.93 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.91 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.08 s [OI=0.50, 31.46 GFlops/s, 7.87 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 26) Completed state equation run for shot\n", "WORKER:0:1 (ShotID 16) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 16) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:1 (ShotID 16) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 16) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", + "WORKER:0:1 (ShotID 16) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 16) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", "WORKER:0:1 (ShotID 16) Selected undersampling level 4\n", "WORKER:0:1 (ShotID 16) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 5) Expected wavefield size 0.5158 GB\n", - "WORKER:0:0 Operator `acoustic_iso_state` instance configuration:\n", - "WORKER:0:0 \t * name=acoustic_iso_state\n", - "WORKER:0:0 \t * subs={h_x: 0.0005, h_y: 0.0005, dt: 8e-08}\n", - "WORKER:0:0 \t * opt=advanced-fsg\n", - "WORKER:0:0 \t * devicecreate=(p(t, x, y), p_saved(time_under, x, y))\n", - "WORKER:0:1 (ShotID 16) Expected wavefield size 0.5158 GB\n", - "WORKER:0:1 Operator `acoustic_iso_state` instance configuration:\n", - "WORKER:0:1 \t * name=acoustic_iso_state\n", - "WORKER:0:1 \t * subs={h_x: 0.0005, h_y: 0.0005, dt: 8e-08}\n", - "WORKER:0:1 \t * opt=advanced-fsg\n", - "WORKER:0:1 \t * devicecreate=(p(t, x, y), p_saved(time_under, x, y))\n", - "WORKER:0:0 Operator `acoustic_iso_state` generated in 1.01 s\n", - "WORKER:0:0 * lowering.Clusters: 0.42 s (41.9 %)\n", - "WORKER:0:0 * specializing.Clusters: 0.29 s (28.9 %)\n", - "WORKER:0:0 * lowering.IET: 0.33 s (32.9 %)\n", - "WORKER:0:0 * specializing.IET: 0.25 s (24.9 %)\n", - "WORKER:0:0 * lowering.Expressions: 0.24 s (23.9 %)\n", - "WORKER:0:0 Flops reduction after symbolic optimization: [104 --> 58]\n", - "WORKER:0:1 Operator `acoustic_iso_state` generated in 1.04 s\n", - "WORKER:0:1 * lowering.Clusters: 0.42 s (40.6 %)\n", - "WORKER:0:1 * specializing.Clusters: 0.29 s (28.0 %)\n", - "WORKER:0:1 * lowering.IET: 0.33 s (31.9 %)\n", - "WORKER:0:1 * specializing.IET: 0.25 s (24.2 %)\n", - "WORKER:0:1 * lowering.Expressions: 0.26 s (25.1 %)\n", - "WORKER:0:1 Flops reduction after symbolic optimization: [104 --> 58]\n", - "WORKER:0:0 Operator `acoustic_iso_state` fetched `/tmp/devito-jitcache-uid1000/7b02ad731ae4c093dbe82ad76e237eca57ce8f6f.c` in 0.05 s from jit-cache\n", - "WORKER:0:0 (ShotID 5) Running state equation for shot\n", - "WORKER:0:1 Operator `acoustic_iso_state` fetched `/tmp/devito-jitcache-uid1000/7b02ad731ae4c093dbe82ad76e237eca57ce8f6f.c` in 0.05 s from jit-cache\n", "WORKER:0:1 (ShotID 16) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.36 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 19.11 GFlops/s, 0.41 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 1.21 s [OI=2.63, 19.78 GFlops/s, 0.46 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.46 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.10 s [OI=0.50, 22.78 GFlops/s, 5.70 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 16) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 16) Spatial grid spacing (0.500 mm | 4.149 PPW) is higher than dispersion limit (0.415 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 26: loss 1.607067e+00 for shot 26\n", + "HEAD Functional value for shot 16: loss 1.076450e+00 for shot 16\n", + "WORKER:0:1 (ShotID 16) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 16) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.76 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 33.37 GFlops/s, 0.73 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.64 s [OI=2.63, 37.52 GFlops/s, 0.88 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 3.01 GFlops/s, 0.06 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.11 s [OI=0.25, 15.03 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 16) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 26) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 26) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 1.02 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 24.87 GFlops/s, 0.55 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.87 s [OI=2.63, 27.51 GFlops/s, 0.64 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.06 s [OI=6.00, 1.30 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.10 s [OI=0.25, 15.64 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 26) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 16\n", + "HEAD Giving shot 38 to worker:0:1\n", + "HEAD Retrieved gradient for shot 26\n", + "HEAD Giving shot 42 to worker:0:0\n", + "WORKER:0:1 (ShotID 38) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 38) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 38) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:1 (ShotID 38) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 38) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 38) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.80 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 32.49 GFlops/s, 0.70 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.69 s [OI=2.63, 34.49 GFlops/s, 0.81 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.75 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 32.86 GFlops/s, 8.22 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 38) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 38) Spatial grid spacing (0.500 mm | 4.149 PPW) is higher than dispersion limit (0.415 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 38: loss 1.393568e+00 for shot 38\n", + "WORKER:0:0 (ShotID 42) Spatial grid spacing (0.500 mm | 4.149 PPW) is higher than dispersion limit (0.415 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 42) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 42) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 42) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:0 (ShotID 42) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 42) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 42) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.36 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 19.11 GFlops/s, 0.41 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 1.21 s [OI=2.63, 19.73 GFlops/s, 0.46 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.48 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.10 s [OI=0.50, 24.53 GFlops/s, 6.14 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 42) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 38) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 38) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.52 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 48.77 GFlops/s, 1.07 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.42 s [OI=2.63, 57.10 GFlops/s, 1.33 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 2.55 GFlops/s, 0.05 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.07 s [OI=0.25, 23.20 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 38) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 42: loss 9.380719e-01 for shot 42\n", + "HEAD Retrieved gradient for shot 38\n", + "HEAD Giving shot 49 to worker:0:1\n", + "WORKER:0:1 (ShotID 49) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 49) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 49) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:1 (ShotID 49) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 49) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 49) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.89 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 29.21 GFlops/s, 0.63 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.78 s [OI=2.63, 30.65 GFlops/s, 0.72 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.05 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.71 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.08 s [OI=0.50, 30.84 GFlops/s, 7.71 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 49) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 49) Spatial grid spacing (0.500 mm | 4.149 PPW) is higher than dispersion limit (0.415 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 42) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 42) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.80 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 31.70 GFlops/s, 0.70 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.66 s [OI=2.63, 36.20 GFlops/s, 0.85 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.07 s [OI=6.00, 1.05 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 20.66 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 42) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 42\n", + "HEAD Giving shot 53 to worker:0:0\n", + "HEAD Functional value for shot 49: loss 9.144747e-01 for shot 49\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 49) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 49) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.75 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 33.82 GFlops/s, 0.74 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.58 s [OI=2.63, 41.25 GFlops/s, 0.96 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.07 s [OI=6.00, 1.19 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.11 s [OI=0.25, 14.61 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 49) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 49\n", + "HEAD Giving shot 56 to worker:0:1\n", + "WORKER:0:0 (ShotID 53) Spatial grid spacing (0.500 mm | 4.149 PPW) is higher than dispersion limit (0.415 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 53) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 53) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 53) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:0 (ShotID 53) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 53) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 53) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.14 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 22.80 GFlops/s, 0.49 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.98 s [OI=2.63, 24.26 GFlops/s, 0.57 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.61 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.09 s [OI=0.50, 27.34 GFlops/s, 6.84 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 53) Completed state equation run for shot\n", + "HEAD Functional value for shot 53: loss 8.178948e-01 for shot 53\n", + "WORKER:0:1 (ShotID 56) Spatial grid spacing (0.500 mm | 4.149 PPW) is higher than dispersion limit (0.415 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 56) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 56) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 56) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:1 (ShotID 56) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 56) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 56) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.46 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 56.50 GFlops/s, 1.21 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.39 s [OI=2.63, 61.94 GFlops/s, 1.45 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.70 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.05 s [OI=0.50, 53.12 GFlops/s, 13.28 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 56) Completed state equation run for shot\n", + "HEAD Functional value for shot 56: loss 8.874173e-01 for shot 56\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 53) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 53) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.66 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 38.43 GFlops/s, 0.84 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.53 s [OI=2.63, 45.14 GFlops/s, 1.05 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.06 s [OI=6.00, 1.26 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 21.73 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 53) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 53\n", + "HEAD Giving shot 70 to worker:0:0\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 56) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 56) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 1.09 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 23.27 GFlops/s, 0.51 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.92 s [OI=2.63, 25.91 GFlops/s, 0.61 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.08 s [OI=6.00, 1.02 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.10 s [OI=0.25, 16.14 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 56) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 56\n", + "HEAD Giving shot 74 to worker:0:1\n", + "WORKER:0:0 (ShotID 70) Spatial grid spacing (0.500 mm | 4.149 PPW) is higher than dispersion limit (0.415 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 70) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 70) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 70) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:0 (ShotID 70) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 70) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 70) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.94 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 27.65 GFlops/s, 0.59 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.02 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.82 s [OI=2.63, 29.06 GFlops/s, 0.68 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.81 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 36.73 GFlops/s, 9.19 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 70) Completed state equation run for shot\n", + "HEAD Functional value for shot 70: loss 1.064770e+00 for shot 70\n", + "WORKER:0:1 (ShotID 74) Spatial grid spacing (0.500 mm | 4.149 PPW) is higher than dispersion limit (0.415 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 74) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 74) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 74) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:1 (ShotID 74) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 74) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 74) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.71 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 36.61 GFlops/s, 0.78 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.58 s [OI=2.63, 41.03 GFlops/s, 0.96 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.88 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 35.60 GFlops/s, 8.90 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 74) Completed state equation run for shot\n", + "HEAD Functional value for shot 74: loss 1.161542e+00 for shot 74\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 70) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 70) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.67 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 37.85 GFlops/s, 0.83 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.55 s [OI=2.63, 43.48 GFlops/s, 1.02 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 3.23 GFlops/s, 0.06 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.10 s [OI=0.25, 15.26 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 70) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 70\n", + "HEAD Giving shot 85 to worker:0:0\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 74) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 74) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.71 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 35.72 GFlops/s, 0.78 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.57 s [OI=2.63, 41.73 GFlops/s, 0.98 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 2.09 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.10 s [OI=0.25, 15.62 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 74) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 74\n", + "HEAD Giving shot 88 to worker:0:1\n", + "WORKER:0:0 (ShotID 85) Spatial grid spacing (0.500 mm | 4.149 PPW) is higher than dispersion limit (0.415 mm | 5.000 PPW)\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 85) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 85) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 85) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:0 (ShotID 85) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 85) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 85) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.76 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 34.20 GFlops/s, 0.73 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.67 s [OI=2.63, 35.72 GFlops/s, 0.84 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.98 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 36.26 GFlops/s, 9.07 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 85) Completed state equation run for shot\n", + "HEAD Functional value for shot 85: loss 1.481090e+00 for shot 85\n", + "WORKER:0:1 (ShotID 88) Spatial grid spacing (0.500 mm | 4.149 PPW) is higher than dispersion limit (0.415 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.70 s\n", - "WORKER:0:0 Global performance: [OI=2.06, 39.50 GFlops/s, 0.79 GPts/s]\n", + "WORKER:0:1 (ShotID 88) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 88) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 88) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:1 (ShotID 88) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 88) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 88) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.86 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 30.22 GFlops/s, 0.65 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.02 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.74 s [OI=2.63, 32.27 GFlops/s, 0.76 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.82 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 33.84 GFlops/s, 8.46 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 88) Completed state equation run for shot\n", + "HEAD Functional value for shot 88: loss 1.304745e+00 for shot 88\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 85) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 85) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.70 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 36.23 GFlops/s, 0.79 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.57 s [OI=2.63, 42.04 GFlops/s, 0.98 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 1.91 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.10 s [OI=0.25, 16.71 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 85) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 85\n", + "HEAD Giving shot 106 to worker:0:0\n", + "WORKER:0:0 (ShotID 106) Spatial grid spacing (0.500 mm | 4.149 PPW) is higher than dispersion limit (0.415 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 106) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 106) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 106) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:0 (ShotID 106) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 106) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 106) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.63 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 41.26 GFlops/s, 0.88 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.54 s [OI=2.63, 44.65 GFlops/s, 1.04 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.95 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 34.55 GFlops/s, 8.64 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 106) Completed state equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 88) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 88) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 1.29 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 19.66 GFlops/s, 0.43 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 1.12 s [OI=2.63, 21.30 GFlops/s, 0.50 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.05 s [OI=6.00, 1.44 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.12 s [OI=0.25, 12.72 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 88) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 88\n", + "HEAD Giving shot 113 to worker:0:1\n", + "HEAD Functional value for shot 106: loss 9.091188e-01 for shot 106\n", + "WORKER:0:1 (ShotID 113) Spatial grid spacing (0.500 mm | 4.149 PPW) is higher than dispersion limit (0.415 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 113) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 113) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 113) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.148 μs)\n", + "WORKER:0:1 (ShotID 113) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 113) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 113) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.69 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 37.67 GFlops/s, 0.81 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.05 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.52 s [OI=2.63, 45.81 GFlops/s, 1.07 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.12 s [OI=5.80, 0.01 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.78 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.05 s [OI=0.50, 53.62 GFlops/s, 13.41 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 113) Completed state equation run for shot\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 106) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 106) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.68 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 37.30 GFlops/s, 0.82 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.58 s [OI=2.63, 41.61 GFlops/s, 0.97 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 3.41 GFlops/s, 0.06 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.09 s [OI=0.25, 17.43 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 106) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 106\n", + "HEAD Functional value for shot 113: loss 8.574824e-01 for shot 113\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 113) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 113) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.73 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 34.74 GFlops/s, 0.76 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.63 s [OI=2.63, 37.96 GFlops/s, 0.89 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 2.93 GFlops/s, 0.05 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 19.62 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 113) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 113\n", + "MONITOR Pending barrier tasks 2\n", + "HEAD Updating variable vp,\n", + "HEAD \t grad before processing in range [-9.599932e-06, 9.604260e-06]\n", + "HEAD \t grad after processing in range [-1.000000e+00, 9.999275e-01]\n", + "HEAD \t variable range before update [1.483172e+03, 1.522786e+03]\n", + "HEAD \t variable range after update [1.479342e+03, 1.527958e+03]\n", + "HEAD Done iteration 1 (out of 4), block 2 (out of 2) - Total loss_freq 1.628544e+01\n", + "HEAD ====================================================================\n", + "HEAD Starting iteration 2 (out of 4), block 2 (out of 2)\n", + "HEAD Giving shot 15 to worker:0:0\n", + "HEAD Giving shot 18 to worker:0:1\n", + "WORKER:0:0 (ShotID 15) Spatial grid spacing (0.500 mm | 4.138 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 15) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 15) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 15) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.147 μs)\n", + "WORKER:0:0 (ShotID 15) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 15) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 15) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.49 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 53.04 GFlops/s, 1.13 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.44 s [OI=2.63, 55.09 GFlops/s, 1.29 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.72 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.04 s [OI=0.50, 60.19 GFlops/s, 15.05 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 15) Completed state equation run for shot\n", + "HEAD Functional value for shot 15: loss 1.131446e+00 for shot 15\n", + "WORKER:0:1 (ShotID 18) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 18) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 18) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.147 μs)\n", + "WORKER:0:1 (ShotID 18) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 18) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 18) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.22 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 21.31 GFlops/s, 0.46 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.02 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 1.03 s [OI=2.63, 23.16 GFlops/s, 0.54 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.08 s [OI=5.80, 0.01 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.65 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.08 s [OI=0.50, 29.14 GFlops/s, 7.29 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 18) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 18) Spatial grid spacing (0.500 mm | 4.138 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 18: loss 9.235082e-01 for shot 18\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 15) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 15) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.50 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 50.72 GFlops/s, 1.11 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.42 s [OI=2.63, 57.95 GFlops/s, 1.35 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 4.77 GFlops/s, 0.08 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.07 s [OI=0.25, 22.64 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 15) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 15\n", + "HEAD Giving shot 22 to worker:0:0\n", + "WORKER:0:1 (ShotID 18) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 18) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.81 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 31.31 GFlops/s, 0.69 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.67 s [OI=2.63, 35.75 GFlops/s, 0.84 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 1.93 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.11 s [OI=0.25, 14.64 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 18) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 18\n", + "HEAD Giving shot 35 to worker:0:1\n", + "WORKER:0:0 (ShotID 22) Spatial grid spacing (0.500 mm | 4.138 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 22) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 22) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 22) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.147 μs)\n", + "WORKER:0:0 (ShotID 22) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 22) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 22) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.79 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 14.52 GFlops/s, 0.31 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.02 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 1.54 s [OI=2.63, 15.52 GFlops/s, 0.37 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.04 s [OI=1.32, 0.34 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.17 s [OI=0.50, 13.59 GFlops/s, 3.40 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 22) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 35) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 35) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 35) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.147 μs)\n", + "WORKER:0:1 (ShotID 35) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 35) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 35) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.21 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 21.48 GFlops/s, 0.46 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 1.03 s [OI=2.63, 23.29 GFlops/s, 0.55 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.06 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.63 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.12 s [OI=0.50, 18.99 GFlops/s, 4.75 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 35) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 35) Spatial grid spacing (0.500 mm | 4.138 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 22: loss 1.258175e+00 for shot 22\n", + "HEAD Functional value for shot 35: loss 1.480431e+00 for shot 35\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 22) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 22) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.85 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 29.84 GFlops/s, 0.66 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.71 s [OI=2.63, 33.77 GFlops/s, 0.79 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 2.66 GFlops/s, 0.05 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.11 s [OI=0.25, 14.00 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 22) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 22\n", + "HEAD Giving shot 37 to worker:0:0\n", + "WORKER:0:1 (ShotID 35) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 35) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 1.18 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 21.50 GFlops/s, 0.47 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 1.00 s [OI=2.63, 23.90 GFlops/s, 0.56 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.05 s [OI=6.00, 1.72 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.14 s [OI=0.25, 10.88 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 35) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 35\n", + "HEAD Giving shot 41 to worker:0:1\n", + "WORKER:0:0 (ShotID 37) Spatial grid spacing (0.500 mm | 4.138 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 37) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 37) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 37) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.147 μs)\n", + "WORKER:0:0 (ShotID 37) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 37) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 37) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.75 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 34.66 GFlops/s, 0.74 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.64 s [OI=2.63, 37.44 GFlops/s, 0.88 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.91 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.09 s [OI=0.50, 25.63 GFlops/s, 6.41 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 37) Completed state equation run for shot\n", + "HEAD Functional value for shot 37: loss 1.235992e+00 for shot 37\n", + "WORKER:0:1 (ShotID 41) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 41) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 41) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.147 μs)\n", + "WORKER:0:1 (ShotID 41) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 41) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 41) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.78 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 33.32 GFlops/s, 0.71 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.66 s [OI=2.63, 36.22 GFlops/s, 0.85 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.05 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.84 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.09 s [OI=0.50, 26.41 GFlops/s, 6.61 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 41) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 41) Spatial grid spacing (0.500 mm | 4.138 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 41: loss 8.219580e-01 for shot 41\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 37) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 37) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.65 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 39.02 GFlops/s, 0.86 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.54 s [OI=2.63, 44.57 GFlops/s, 1.04 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 3.31 GFlops/s, 0.06 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.10 s [OI=0.25, 16.18 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 37) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 37\n", + "HEAD Giving shot 55 to worker:0:0\n", + "WORKER:0:1 (ShotID 41) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 41) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.77 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 32.94 GFlops/s, 0.72 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.63 s [OI=2.63, 37.76 GFlops/s, 0.88 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 3.02 GFlops/s, 0.06 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.11 s [OI=0.25, 14.22 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 41) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 41\n", + "HEAD Giving shot 62 to worker:0:1\n", + "WORKER:0:0 (ShotID 55) Spatial grid spacing (0.500 mm | 4.138 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 55) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 55) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 55) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.147 μs)\n", + "WORKER:0:0 (ShotID 55) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 55) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 55) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.23 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 21.13 GFlops/s, 0.45 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 1.08 s [OI=2.63, 22.06 GFlops/s, 0.52 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.51 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.11 s [OI=0.50, 21.99 GFlops/s, 5.50 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 55) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 62) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 62) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 62) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.147 μs)\n", + "WORKER:0:1 (ShotID 62) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 62) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 62) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.64 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 40.61 GFlops/s, 0.87 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.54 s [OI=2.63, 44.03 GFlops/s, 1.03 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.07 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.06 s [OI=0.50, 38.04 GFlops/s, 9.51 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 62) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 62) Spatial grid spacing (0.500 mm | 4.138 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 55: loss 8.927285e-01 for shot 55\n", + "HEAD Functional value for shot 62: loss 7.699997e-01 for shot 62\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 62) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 62) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.91 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 27.87 GFlops/s, 0.61 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.75 s [OI=2.63, 31.90 GFlops/s, 0.75 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 2.70 GFlops/s, 0.05 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.14 s [OI=0.25, 11.43 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 62) Completed adjoint equation run for shot\n", + "WORKER:0:0 (ShotID 55) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 55) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.90 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 28.18 GFlops/s, 0.62 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.76 s [OI=2.63, 31.42 GFlops/s, 0.74 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.05 s [OI=6.00, 1.58 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.10 s [OI=0.25, 16.60 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 55) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 62\n", + "HEAD Giving shot 69 to worker:0:1\n", + "HEAD Retrieved gradient for shot 55\n", + "HEAD Giving shot 71 to worker:0:0\n", + "WORKER:0:0 (ShotID 71) Spatial grid spacing (0.500 mm | 4.138 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 71) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 71) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 71) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.147 μs)\n", + "WORKER:0:0 (ShotID 71) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 71) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 71) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.75 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 34.66 GFlops/s, 0.74 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.03 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.68 s [OI=2.63, 35.23 GFlops/s, 0.82 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.84 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.05 s [OI=0.50, 54.39 GFlops/s, 13.60 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 71) Completed state equation run for shot\n", + "HEAD Functional value for shot 71: loss 1.004933e+00 for shot 71\n", + "WORKER:0:1 (ShotID 69) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 69) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 69) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.147 μs)\n", + "WORKER:0:1 (ShotID 69) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 69) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 69) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.39 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 18.70 GFlops/s, 0.40 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 1.24 s [OI=2.63, 19.23 GFlops/s, 0.45 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.47 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.10 s [OI=0.50, 22.94 GFlops/s, 5.74 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 69) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 69) Spatial grid spacing (0.500 mm | 4.138 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 69: loss 9.949073e-01 for shot 69\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 71) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 71) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.67 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 37.85 GFlops/s, 0.83 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.58 s [OI=2.63, 41.62 GFlops/s, 0.97 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 3.29 GFlops/s, 0.06 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 20.46 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 71) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 71\n", + "HEAD Giving shot 73 to worker:0:0\n", + "WORKER:0:0 (ShotID 73) Spatial grid spacing (0.500 mm | 4.138 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 73) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 73) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 73) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.147 μs)\n", + "WORKER:0:0 (ShotID 73) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 73) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 73) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.62 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 41.92 GFlops/s, 0.90 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.55 s [OI=2.63, 43.53 GFlops/s, 1.02 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.77 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.05 s [OI=0.50, 54.48 GFlops/s, 13.62 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 73) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 69) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 69) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 1.56 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 16.26 GFlops/s, 0.36 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 1.33 s [OI=2.63, 17.93 GFlops/s, 0.42 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.10 s [OI=6.00, 0.74 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.13 s [OI=0.25, 11.76 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 69) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 73: loss 1.036271e+00 for shot 73\n", + "HEAD Retrieved gradient for shot 69\n", + "HEAD Giving shot 76 to worker:0:1\n", + "WORKER:0:1 (ShotID 76) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 76) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 76) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.147 μs)\n", + "WORKER:0:1 (ShotID 76) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 76) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 76) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.03 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 25.24 GFlops/s, 0.54 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.87 s [OI=2.63, 27.46 GFlops/s, 0.64 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.06 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.80 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.09 s [OI=0.50, 25.34 GFlops/s, 6.34 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 76) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 76) Spatial grid spacing (0.500 mm | 4.138 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 76: loss 9.728077e-01 for shot 76\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 73) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 73) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 1.44 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 17.62 GFlops/s, 0.39 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 1.26 s [OI=2.63, 18.99 GFlops/s, 0.45 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.06 s [OI=6.00, 1.32 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.13 s [OI=0.25, 11.77 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 73) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 73\n", + "HEAD Giving shot 80 to worker:0:0\n", + "WORKER:0:1 (ShotID 76) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 76) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.85 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 29.84 GFlops/s, 0.66 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.71 s [OI=2.63, 33.61 GFlops/s, 0.79 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 2.46 GFlops/s, 0.05 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.12 s [OI=0.25, 13.59 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 76) Completed adjoint equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Retrieved gradient for shot 76\n", + "HEAD Giving shot 104 to worker:0:1\n", + "WORKER:0:0 (ShotID 80) Spatial grid spacing (0.500 mm | 4.138 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 80) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 80) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 80) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.147 μs)\n", + "WORKER:0:0 (ShotID 80) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 80) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 80) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.99 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 26.26 GFlops/s, 0.56 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.81 s [OI=2.63, 29.60 GFlops/s, 0.69 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.09 s [OI=5.80, 0.01 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.95 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.08 s [OI=0.50, 27.66 GFlops/s, 6.92 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 80) Completed state equation run for shot\n", + "HEAD Functional value for shot 80: loss 1.008627e+00 for shot 80\n", + "WORKER:0:1 (ShotID 104) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 104) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 104) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.147 μs)\n", + "WORKER:0:1 (ShotID 104) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 104) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 104) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.71 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 36.61 GFlops/s, 0.78 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.62 s [OI=2.63, 38.93 GFlops/s, 0.91 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.05 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.84 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 34.33 GFlops/s, 8.59 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 104) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 104) Spatial grid spacing (0.500 mm | 4.138 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 104: loss 7.571902e-01 for shot 104\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 80) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 80) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.52 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 48.77 GFlops/s, 1.07 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.63 s [OI=2.82, 40.43 GFlops/s, 0.88 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.10 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 1.91 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:0 * section3<2499,456,485> ran in 0.06 s [OI=0.50, 42.91 GFlops/s, 10.73 GPts/s]\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.43 s [OI=2.63, 56.44 GFlops/s, 1.32 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 3.09 GFlops/s, 0.06 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 21.05 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 5) Completed state equation run for shot\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.72 s\n", - "WORKER:0:1 Global performance: [OI=2.06, 38.40 GFlops/s, 0.77 GPts/s]\n", + "WORKER:0:0 (ShotID 80) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 80\n", + "HEAD Giving shot 112 to worker:0:0\n", + "WORKER:0:1 (ShotID 104) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 104) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.79 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 32.11 GFlops/s, 0.70 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.66 s [OI=2.82, 38.89 GFlops/s, 0.85 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.11 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 1.93 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:1 * section3<2499,456,485> ran in 0.06 s [OI=0.50, 42.21 GFlops/s, 10.56 GPts/s]\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.64 s [OI=2.63, 37.21 GFlops/s, 0.87 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 2.81 GFlops/s, 0.05 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.13 s [OI=0.25, 12.64 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 16) Completed state equation run for shot\n", - "HEAD Functional value for shot 5: loss 1.600541e+00 for shot 5\n", - "WORKER:0:0 (ShotID 5) Preparing to run adjoint for shot\n", - "HEAD Functional value for shot 16: loss 1.701027e+00 for shot 16\n", - "WORKER:0:0 Operator `acoustic_iso_adjoint` instance configuration:\n", - "WORKER:0:0 \t * name=acoustic_iso_adjoint\n", - "WORKER:0:0 \t * subs={h_x: 0.0005, h_y: 0.0005, dt: 8e-08}\n", - "WORKER:0:0 \t * opt=advanced-fsg\n", - "WORKER:0:0 \t * devicecreate=(p_a(t, x, y),)\n", - "WORKER:0:1 (ShotID 16) Preparing to run adjoint for shot\n", - "WORKER:0:1 Operator `acoustic_iso_adjoint` instance configuration:\n", - "WORKER:0:1 \t * name=acoustic_iso_adjoint\n", - "WORKER:0:1 \t * subs={h_x: 0.0005, h_y: 0.0005, dt: 8e-08}\n", - "WORKER:0:1 \t * opt=advanced-fsg\n", - "WORKER:0:1 \t * devicecreate=(p_a(t, x, y),)\n", - "WORKER:0:0 Operator `acoustic_iso_adjoint` generated in 0.75 s\n", - "WORKER:0:0 * lowering.Clusters: 0.27 s (36.1 %)\n", - "WORKER:0:0 * specializing.Clusters: 0.16 s (21.4 %)\n", - "WORKER:0:0 * lowering.IET: 0.26 s (34.8 %)\n", - "WORKER:0:0 * specializing.IET: 0.19 s (25.4 %)\n", - "WORKER:0:0 * lowering.Expressions: 0.21 s (28.1 %)\n", - "WORKER:0:0 Flops reduction after symbolic optimization: [85 --> 50]\n", - "WORKER:0:1 Operator `acoustic_iso_adjoint` generated in 0.74 s\n", - "WORKER:0:1 * lowering.Clusters: 0.27 s (36.9 %)\n", - "WORKER:0:1 * specializing.Clusters: 0.16 s (21.9 %)\n", - "WORKER:0:1 * lowering.IET: 0.25 s (34.1 %)\n", - "WORKER:0:1 * specializing.IET: 0.19 s (26.0 %)\n", - "WORKER:0:1 * lowering.Expressions: 0.20 s (27.3 %)\n", - "WORKER:0:1 Flops reduction after symbolic optimization: [85 --> 50]\n", - "WORKER:0:0 Operator `acoustic_iso_adjoint` fetched `/tmp/devito-jitcache-uid1000/c71c13400015fbfb98679d7d780e8fc1bd1d8577.c` in 0.04 s from jit-cache\n", - "WORKER:0:0 (ShotID 5) Running adjoint equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_adjoint` fetched `/tmp/devito-jitcache-uid1000/c71c13400015fbfb98679d7d780e8fc1bd1d8577.c` in 0.04 s from jit-cache\n", - "WORKER:0:1 (ShotID 16) Running adjoint equation for shot\n", + "WORKER:0:1 (ShotID 104) Completed adjoint equation run for shot\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.59 s\n", - "WORKER:0:1 Global performance: [OI=1.79, 45.80 GFlops/s, 0.94 GPts/s]\n", + "HEAD Retrieved gradient for shot 104\n", + "WORKER:0:0 (ShotID 112) Spatial grid spacing (0.500 mm | 4.138 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 112) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 112) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 112) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.147 μs)\n", + "WORKER:0:0 (ShotID 112) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 112) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 112) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.57 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 16.56 GFlops/s, 0.36 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 1.38 s [OI=2.63, 17.25 GFlops/s, 0.41 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.43 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.12 s [OI=0.50, 20.01 GFlops/s, 5.01 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 112) Completed state equation run for shot\n", + "HEAD Functional value for shot 112: loss 7.941182e-01 for shot 112\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 112) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 112) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.49 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 51.76 GFlops/s, 1.13 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.41 s [OI=2.63, 59.16 GFlops/s, 1.38 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 4.95 GFlops/s, 0.09 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.07 s [OI=0.25, 22.71 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 112) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 112\n", + "MONITOR Pending barrier tasks 2\n", + "HEAD Updating variable vp,\n", + "HEAD \t grad before processing in range [-1.401939e-05, 6.488457e-06]\n", + "HEAD \t grad after processing in range [-1.000000e+00, 4.626409e-01]\n", + "HEAD \t variable range before update [1.479342e+03, 1.527958e+03]\n", + "HEAD \t variable range after update [1.478884e+03, 1.536660e+03]\n", + "HEAD Done iteration 2 (out of 4), block 2 (out of 2) - Total loss_freq 1.508309e+01\n", + "HEAD ====================================================================\n", + "HEAD Starting iteration 3 (out of 4), block 2 (out of 2)\n", + "HEAD Giving shot 3 to worker:0:0\n", + "HEAD Giving shot 14 to worker:0:1\n", + "WORKER:0:1 (ShotID 14) Spatial grid spacing (0.500 mm | 4.137 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 14) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 14) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 14) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:1 (ShotID 14) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 14) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 14) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.63 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 15.95 GFlops/s, 0.34 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.50 s [OI=2.82, 51.21 GFlops/s, 1.12 GPts/s]\n", - "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 5.20 GFlops/s, 0.09 GPts/s]\n", - "WORKER:0:1 * section2<2499,376,405> ran in 0.07 s [OI=0.25, 21.93 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.03 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 1.35 s [OI=2.63, 17.66 GFlops/s, 0.42 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.13 s [OI=5.80, 0.01 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.48 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.10 s [OI=0.50, 22.33 GFlops/s, 5.59 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 16) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 16\n", - "HEAD Giving shot 18 to worker:0:1\n", - "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.68 s\n", - "WORKER:0:0 Global performance: [OI=1.79, 39.74 GFlops/s, 0.82 GPts/s]\n", - "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.59 s [OI=2.82, 43.65 GFlops/s, 0.95 GPts/s]\n", - "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 4.48 GFlops/s, 0.08 GPts/s]\n", - "WORKER:0:0 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 21.20 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WORKER:0:0 (ShotID 5) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 5\n", - "HEAD Giving shot 23 to worker:0:0\n", - "WORKER:0:1 (ShotID 18) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 18) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:1 (ShotID 18) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 18) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", - "WORKER:0:1 (ShotID 18) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 18) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 18) Running state equation for shot\n", + "WORKER:0:1 (ShotID 14) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 3) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 3) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 3) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:0 (ShotID 3) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 3) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 3) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.94 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 13.40 GFlops/s, 0.29 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 1.73 s [OI=2.63, 13.75 GFlops/s, 0.32 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.05 s [OI=1.32, 0.27 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.13 s [OI=0.50, 17.10 GFlops/s, 4.28 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 3) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 3) Spatial grid spacing (0.500 mm | 4.137 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "HEAD Functional value for shot 14: loss 9.333594e-01 for shot 14\n", + "HEAD Functional value for shot 3: loss 5.235272e-01 for shot 3\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 (ShotID 23) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 23) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:0 (ShotID 23) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 23) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", - "WORKER:0:0 (ShotID 23) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 23) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 23) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.63 s\n", - "WORKER:0:1 Global performance: [OI=2.06, 43.89 GFlops/s, 0.88 GPts/s]\n", + "WORKER:0:1 (ShotID 14) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 14) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.53 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 47.85 GFlops/s, 1.05 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.58 s [OI=2.82, 44.60 GFlops/s, 0.97 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.20 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:1 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 51.24 GFlops/s, 12.81 GPts/s]\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.44 s [OI=2.63, 54.64 GFlops/s, 1.28 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 2.57 GFlops/s, 0.05 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.07 s [OI=0.25, 22.99 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 18) Completed state equation run for shot\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.64 s\n", - "WORKER:0:0 Global performance: [OI=2.06, 43.20 GFlops/s, 0.87 GPts/s]\n", + "WORKER:0:1 (ShotID 14) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 14\n", + "HEAD Giving shot 28 to worker:0:1\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 3) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 3) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 1.65 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 15.37 GFlops/s, 0.34 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.59 s [OI=2.82, 43.58 GFlops/s, 0.95 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.11 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.00 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:0 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 51.38 GFlops/s, 12.85 GPts/s]\n", + "WORKER:0:0 * section0<2499,456,485> ran in 1.45 s [OI=2.63, 16.40 GFlops/s, 0.39 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.08 s [OI=6.00, 0.99 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.13 s [OI=0.25, 12.23 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 23) Completed state equation run for shot\n", - "HEAD Functional value for shot 18: loss 1.805686e+00 for shot 18\n", - "WORKER:0:1 (ShotID 18) Preparing to run adjoint for shot\n", - "WORKER:0:1 (ShotID 18) Running adjoint equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "HEAD Functional value for shot 23: loss 2.175705e+00 for shot 23\n", - "WORKER:0:0 (ShotID 23) Preparing to run adjoint for shot\n", - "WORKER:0:0 (ShotID 23) Running adjoint equation for shot\n", + "WORKER:0:0 (ShotID 3) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 3\n", + "HEAD Giving shot 30 to worker:0:0\n", + "WORKER:0:1 (ShotID 28) Spatial grid spacing (0.500 mm | 4.137 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 28) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 28) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 28) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:1 (ShotID 28) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 28) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 28) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.08 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 24.07 GFlops/s, 0.52 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.94 s [OI=2.63, 25.39 GFlops/s, 0.60 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.69 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.08 s [OI=0.50, 30.19 GFlops/s, 7.55 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 28) Completed state equation run for shot\n", + "HEAD Functional value for shot 28: loss 1.493753e+00 for shot 28\n", + "WORKER:0:0 (ShotID 30) Spatial grid spacing (0.500 mm | 4.137 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.58 s\n", - "WORKER:0:1 Global performance: [OI=1.79, 46.59 GFlops/s, 0.96 GPts/s]\n", + "WORKER:0:0 (ShotID 30) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 30) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 30) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:0 (ShotID 30) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 30) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 30) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.85 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 30.58 GFlops/s, 0.66 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.70 s [OI=2.63, 34.07 GFlops/s, 0.80 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.06 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.54 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.06 s [OI=0.50, 37.76 GFlops/s, 9.44 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 30) Completed state equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 28) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 28) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.64 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 39.63 GFlops/s, 0.87 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.50 s [OI=2.82, 51.57 GFlops/s, 1.13 GPts/s]\n", - "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 5.37 GFlops/s, 0.09 GPts/s]\n", - "WORKER:0:1 * section2<2499,376,405> ran in 0.07 s [OI=0.25, 24.00 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.54 s [OI=2.63, 44.65 GFlops/s, 1.04 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 3.52 GFlops/s, 0.06 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.09 s [OI=0.25, 17.87 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 18) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 18\n", - "HEAD Giving shot 31 to worker:0:1\n", - "WORKER:0:1 (ShotID 31) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 31) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:1 (ShotID 31) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 31) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", - "WORKER:0:1 (ShotID 31) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 31) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 31) Running state equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.69 s\n", - "WORKER:0:0 Global performance: [OI=1.79, 39.16 GFlops/s, 0.81 GPts/s]\n", + "WORKER:0:1 (ShotID 28) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 28\n", + "HEAD Giving shot 36 to worker:0:1\n", + "HEAD Functional value for shot 30: loss 1.461961e+00 for shot 30\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 30) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 30) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.87 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 29.15 GFlops/s, 0.64 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.60 s [OI=2.82, 42.82 GFlops/s, 0.94 GPts/s]\n", - "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 5.03 GFlops/s, 0.09 GPts/s]\n", - "WORKER:0:0 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 20.63 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.72 s [OI=2.63, 33.17 GFlops/s, 0.78 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 1.95 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.12 s [OI=0.25, 13.14 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 23) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 23\n", - "HEAD Giving shot 39 to worker:0:0\n", - "WORKER:0:0 (ShotID 39) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 39) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:0 (ShotID 39) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 39) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", - "WORKER:0:0 (ShotID 39) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 39) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 39) Running state equation for shot\n", + "WORKER:0:0 (ShotID 30) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 30\n", + "HEAD Giving shot 43 to worker:0:0\n", + "WORKER:0:1 (ShotID 36) Spatial grid spacing (0.500 mm | 4.137 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 36) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 36) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 36) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:1 (ShotID 36) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 36) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 36) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.12 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 23.21 GFlops/s, 0.50 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.96 s [OI=2.63, 24.79 GFlops/s, 0.58 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.56 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.10 s [OI=0.50, 23.02 GFlops/s, 5.76 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 36) Completed state equation run for shot\n", + "HEAD Functional value for shot 36: loss 1.318288e+00 for shot 36\n", + "WORKER:0:0 (ShotID 43) Spatial grid spacing (0.500 mm | 4.137 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.63 s\n", - "WORKER:0:1 Global performance: [OI=2.06, 43.89 GFlops/s, 0.88 GPts/s]\n", + "WORKER:0:0 (ShotID 43) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 43) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 43) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:0 (ShotID 43) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 43) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 43) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.62 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 41.92 GFlops/s, 0.90 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.53 s [OI=2.63, 45.63 GFlops/s, 1.07 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.12 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.06 s [OI=0.50, 39.43 GFlops/s, 9.86 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 43) Completed state equation run for shot\n", + "HEAD Functional value for shot 43: loss 8.781539e-01 for shot 43\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 36) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 36) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.66 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 38.43 GFlops/s, 0.84 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.58 s [OI=2.82, 44.34 GFlops/s, 0.97 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.11 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.19 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:1 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 52.98 GFlops/s, 13.25 GPts/s]\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.56 s [OI=2.63, 42.98 GFlops/s, 1.00 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 3.11 GFlops/s, 0.06 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.09 s [OI=0.25, 19.03 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 31) Completed state equation run for shot\n", - "HEAD Functional value for shot 31: loss 2.192240e+00 for shot 31\n", - "WORKER:0:1 (ShotID 31) Preparing to run adjoint for shot\n", - "WORKER:0:1 (ShotID 31) Running adjoint equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.66 s\n", - "WORKER:0:0 Global performance: [OI=2.06, 41.90 GFlops/s, 0.84 GPts/s]\n", + "WORKER:0:1 (ShotID 36) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 36\n", + "HEAD Giving shot 44 to worker:0:1\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 43) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 43) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.72 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 35.23 GFlops/s, 0.77 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.60 s [OI=2.82, 42.79 GFlops/s, 0.94 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.11 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.06 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:0 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 50.20 GFlops/s, 12.55 GPts/s]\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.59 s [OI=2.63, 40.56 GFlops/s, 0.95 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 1.87 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.10 s [OI=0.25, 16.12 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 39) Completed state equation run for shot\n", - "HEAD Functional value for shot 39: loss 1.959300e+00 for shot 39\n", - "WORKER:0:0 (ShotID 39) Preparing to run adjoint for shot\n", - "WORKER:0:0 (ShotID 39) Running adjoint equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.63 s\n", - "WORKER:0:1 Global performance: [OI=1.79, 42.89 GFlops/s, 0.88 GPts/s]\n", - "WORKER:0:1 Local performance:\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WORKER:0:1 * section0<2499,456,485> ran in 0.54 s [OI=2.82, 47.64 GFlops/s, 1.04 GPts/s]\n", - "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 4.97 GFlops/s, 0.09 GPts/s]\n", - "WORKER:0:1 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 21.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 (ShotID 43) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 43\n", + "HEAD Giving shot 47 to worker:0:0\n", + "WORKER:0:1 (ShotID 44) Spatial grid spacing (0.500 mm | 4.137 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 44) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 44) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 44) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:1 (ShotID 44) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 44) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 44) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.27 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 20.47 GFlops/s, 0.44 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 1.12 s [OI=2.63, 21.28 GFlops/s, 0.50 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.55 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.10 s [OI=0.50, 23.22 GFlops/s, 5.81 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 31) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 31\n", - "HEAD Giving shot 53 to worker:0:1\n", - "WORKER:0:1 (ShotID 53) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 53) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:1 (ShotID 53) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 53) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", - "WORKER:0:1 (ShotID 53) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 53) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 53) Running state equation for shot\n", + "WORKER:0:1 (ShotID 44) Completed state equation run for shot\n", + "WORKER:0:0 (ShotID 47) Spatial grid spacing (0.500 mm | 4.137 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 47) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 47) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 47) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:0 (ShotID 47) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 47) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 47) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.78 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 33.32 GFlops/s, 0.71 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.68 s [OI=2.63, 35.43 GFlops/s, 0.83 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.88 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.06 s [OI=0.50, 37.57 GFlops/s, 9.40 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 47) Completed state equation run for shot\n", + "HEAD Functional value for shot 44: loss 8.359061e-01 for shot 44\n", + "HEAD Functional value for shot 47: loss 9.200231e-01 for shot 47\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.67 s\n", - "WORKER:0:0 Global performance: [OI=1.79, 40.33 GFlops/s, 0.83 GPts/s]\n", + "WORKER:0:1 (ShotID 44) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 44) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.83 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 30.56 GFlops/s, 0.67 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.69 s [OI=2.63, 34.70 GFlops/s, 0.81 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 2.79 GFlops/s, 0.05 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.12 s [OI=0.25, 13.15 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 44) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 44\n", + "HEAD Giving shot 61 to worker:0:1\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 47) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 47) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.70 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 36.23 GFlops/s, 0.79 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.58 s [OI=2.82, 44.07 GFlops/s, 0.96 GPts/s]\n", - "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 4.39 GFlops/s, 0.08 GPts/s]\n", - "WORKER:0:0 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 20.93 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.57 s [OI=2.63, 42.07 GFlops/s, 0.98 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 3.29 GFlops/s, 0.06 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.11 s [OI=0.25, 14.62 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 39) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 39\n", - "HEAD Giving shot 64 to worker:0:0\n", - "WORKER:0:0 (ShotID 64) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 64) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:0 (ShotID 64) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 64) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", - "WORKER:0:0 (ShotID 64) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 64) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 64) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.64 s\n", - "WORKER:0:1 Global performance: [OI=2.06, 43.20 GFlops/s, 0.87 GPts/s]\n", + "WORKER:0:0 (ShotID 47) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 47\n", + "HEAD Giving shot 66 to worker:0:0\n", + "WORKER:0:1 (ShotID 61) Spatial grid spacing (0.500 mm | 4.137 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 61) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 61) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 61) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:1 (ShotID 61) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 61) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 61) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.67 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 38.79 GFlops/s, 0.83 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.58 s [OI=2.82, 43.99 GFlops/s, 0.96 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.20 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:1 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 50.69 GFlops/s, 12.68 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.03 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.53 s [OI=2.63, 44.86 GFlops/s, 1.05 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.26 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.06 s [OI=0.50, 39.18 GFlops/s, 9.80 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 53) Completed state equation run for shot\n", - "HEAD Functional value for shot 53: loss 1.263474e+00 for shot 53\n", - "WORKER:0:1 (ShotID 53) Preparing to run adjoint for shot\n", - "WORKER:0:1 (ShotID 53) Running adjoint equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.65 s\n", - "WORKER:0:0 Global performance: [OI=2.06, 42.54 GFlops/s, 0.86 GPts/s]\n", + "WORKER:0:1 (ShotID 61) Completed state equation run for shot\n", + "HEAD Functional value for shot 61: loss 7.898947e-01 for shot 61\n", + "WORKER:0:0 (ShotID 66) Spatial grid spacing (0.500 mm | 4.137 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 66) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 66) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 66) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:0 (ShotID 66) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 66) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 66) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.92 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 28.25 GFlops/s, 0.61 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.60 s [OI=2.82, 43.05 GFlops/s, 0.94 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.11 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.02 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:0 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 48.04 GFlops/s, 12.01 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.80 s [OI=2.63, 29.87 GFlops/s, 0.70 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.66 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.08 s [OI=0.50, 29.48 GFlops/s, 7.37 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 64) Completed state equation run for shot\n", - "HEAD Functional value for shot 64: loss 1.273688e+00 for shot 64\n", - "WORKER:0:0 (ShotID 64) Preparing to run adjoint for shot\n", - "WORKER:0:0 (ShotID 64) Running adjoint equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.62 s\n", - "WORKER:0:1 Global performance: [OI=1.79, 43.58 GFlops/s, 0.90 GPts/s]\n", + "WORKER:0:0 (ShotID 66) Completed state equation run for shot\n", + "HEAD Functional value for shot 66: loss 8.352350e-01 for shot 66\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 61) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 61) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.58 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 43.73 GFlops/s, 0.96 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.53 s [OI=2.82, 48.38 GFlops/s, 1.06 GPts/s]\n", - "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 5.04 GFlops/s, 0.09 GPts/s]\n", - "WORKER:0:1 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 21.33 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.47 s [OI=2.63, 50.73 GFlops/s, 1.18 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 2.18 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 21.29 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 53) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 53\n", - "HEAD Giving shot 69 to worker:0:1\n", - "WORKER:0:1 (ShotID 69) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 69) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:1 (ShotID 69) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 69) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", - "WORKER:0:1 (ShotID 69) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 69) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 69) Running state equation for shot\n", + "WORKER:0:1 (ShotID 61) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 61\n", + "HEAD Giving shot 86 to worker:0:1\n", + "WORKER:0:1 (ShotID 86) Spatial grid spacing (0.500 mm | 4.137 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.62 s\n", - "WORKER:0:0 Global performance: [OI=1.79, 43.58 GFlops/s, 0.90 GPts/s]\n", - "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.55 s [OI=2.82, 46.98 GFlops/s, 1.03 GPts/s]\n", - "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 5.17 GFlops/s, 0.09 GPts/s]\n", - "WORKER:0:0 * section2<2499,376,405> ran in 0.07 s [OI=0.25, 24.47 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 64) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 64\n", - "HEAD Giving shot 90 to worker:0:0\n", - "WORKER:0:0 (ShotID 90) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 90) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:0 (ShotID 90) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 90) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", - "WORKER:0:0 (ShotID 90) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 90) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 90) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.71 s\n", - "WORKER:0:1 Global performance: [OI=2.06, 38.95 GFlops/s, 0.78 GPts/s]\n", + "WORKER:0:1 (ShotID 86) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 86) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 86) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:1 (ShotID 86) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 86) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 86) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.73 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 35.61 GFlops/s, 0.76 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.65 s [OI=2.82, 39.30 GFlops/s, 0.86 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.04 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:1 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 51.72 GFlops/s, 12.93 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.64 s [OI=2.63, 37.26 GFlops/s, 0.87 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.82 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.05 s [OI=0.50, 54.91 GFlops/s, 13.73 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 69) Completed state equation run for shot\n", - "HEAD Functional value for shot 69: loss 1.551419e+00 for shot 69\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.60 s\n", - "WORKER:0:1 (ShotID 69) Preparing to run adjoint for shot\n", - "WORKER:0:0 Global performance: [OI=2.06, 46.08 GFlops/s, 0.93 GPts/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WORKER:0:1 (ShotID 69) Running adjoint equation for shot\n", + "WORKER:0:1 (ShotID 86) Completed state equation run for shot\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 66) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 66) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 1.22 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 20.79 GFlops/s, 0.46 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.55 s [OI=2.82, 46.51 GFlops/s, 1.02 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.20 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:0 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 52.68 GFlops/s, 13.17 GPts/s]\n", + "WORKER:0:0 * section0<2499,456,485> ran in 1.06 s [OI=2.63, 22.58 GFlops/s, 0.53 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.07 s [OI=6.00, 1.07 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.10 s [OI=0.25, 15.37 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 90) Completed state equation run for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "HEAD Functional value for shot 90: loss 1.882321e+00 for shot 90\n", - "WORKER:0:0 (ShotID 90) Preparing to run adjoint for shot\n", - "WORKER:0:0 (ShotID 90) Running adjoint equation for shot\n", + "WORKER:0:0 (ShotID 66) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 66\n", + "HEAD Giving shot 91 to worker:0:0\n", + "HEAD Functional value for shot 86: loss 1.180445e+00 for shot 86\n", + "WORKER:0:0 (ShotID 91) Spatial grid spacing (0.500 mm | 4.137 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.53 s\n", - "WORKER:0:0 Global performance: [OI=1.79, 50.98 GFlops/s, 1.05 GPts/s]\n", + "WORKER:0:0 (ShotID 91) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 91) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 91) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:0 (ShotID 91) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 91) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 91) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.89 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 29.21 GFlops/s, 0.63 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.45 s [OI=2.82, 57.01 GFlops/s, 1.24 GPts/s]\n", - "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 5.62 GFlops/s, 0.10 GPts/s]\n", - "WORKER:0:0 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 21.75 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.73 s [OI=2.63, 32.79 GFlops/s, 0.77 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.43 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.08 s [OI=0.50, 27.89 GFlops/s, 6.98 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 90) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 90\n", - "HEAD Giving shot 93 to worker:0:0\n", - "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.80 s\n", - "WORKER:0:1 Global performance: [OI=1.79, 33.78 GFlops/s, 0.70 GPts/s]\n", + "WORKER:0:0 (ShotID 91) Completed state equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 86) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 86) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.74 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 34.27 GFlops/s, 0.75 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.71 s [OI=2.82, 36.16 GFlops/s, 0.79 GPts/s]\n", - "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 4.48 GFlops/s, 0.08 GPts/s]\n", - "WORKER:0:1 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 20.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.63 s [OI=2.63, 38.28 GFlops/s, 0.90 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.05 s [OI=6.00, 1.79 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 21.62 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 69) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 69\n", - "HEAD Giving shot 97 to worker:0:1\n", - "WORKER:0:0 (ShotID 93) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 93) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:0 (ShotID 93) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 93) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", - "WORKER:0:0 (ShotID 93) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 93) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 93) Running state equation for shot\n", + "WORKER:0:1 (ShotID 86) Completed adjoint equation run for shot\n", + "HEAD Functional value for shot 91: loss 9.374047e-01 for shot 91\n", + "HEAD Retrieved gradient for shot 86\n", + "HEAD Giving shot 92 to worker:0:1\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 (ShotID 97) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 97) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:1 (ShotID 97) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 97) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", - "WORKER:0:1 (ShotID 97) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 97) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 97) Running state equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.51 s\n", - "WORKER:0:0 Global performance: [OI=2.06, 54.22 GFlops/s, 1.09 GPts/s]\n", + "WORKER:0:0 (ShotID 91) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 91) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 1.22 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 20.79 GFlops/s, 0.46 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.47 s [OI=2.82, 55.08 GFlops/s, 1.20 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.42 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:0 * section3<2499,456,485> ran in 0.04 s [OI=0.50, 57.90 GFlops/s, 14.48 GPts/s]\n", + "WORKER:0:0 * section0<2499,456,485> ran in 1.06 s [OI=2.63, 22.64 GFlops/s, 0.53 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.07 s [OI=6.00, 1.14 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.11 s [OI=0.25, 15.03 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 93) Completed state equation run for shot\n", - "HEAD Functional value for shot 93: loss 1.660076e+00 for shot 93\n", - "WORKER:0:0 (ShotID 93) Preparing to run adjoint for shot\n", - "WORKER:0:0 (ShotID 93) Running adjoint equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.75 s\n", - "WORKER:0:1 Global performance: [OI=2.06, 36.87 GFlops/s, 0.74 GPts/s]\n", + "WORKER:0:0 (ShotID 91) Completed adjoint equation run for shot\n", + "WORKER:0:1 (ShotID 92) Spatial grid spacing (0.500 mm | 4.137 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 92) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 92) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 92) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:1 (ShotID 92) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 92) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 92) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.26 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 20.63 GFlops/s, 0.44 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.69 s [OI=2.82, 37.24 GFlops/s, 0.81 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.03 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:1 * section3<2499,456,485> ran in 0.06 s [OI=0.50, 40.04 GFlops/s, 10.01 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 1.12 s [OI=2.63, 21.24 GFlops/s, 0.50 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.56 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.08 s [OI=0.50, 29.16 GFlops/s, 7.29 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 97) Completed state equation run for shot\n", - "HEAD Functional value for shot 97: loss 1.617731e+00 for shot 97\n", - "WORKER:0:1 (ShotID 97) Preparing to run adjoint for shot\n", - "WORKER:0:1 (ShotID 97) Running adjoint equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.67 s\n", - "WORKER:0:0 Global performance: [OI=1.79, 40.33 GFlops/s, 0.83 GPts/s]\n", + "WORKER:0:1 (ShotID 92) Completed state equation run for shot\n", + "HEAD Retrieved gradient for shot 91\n", + "HEAD Giving shot 99 to worker:0:0\n", + "HEAD Functional value for shot 92: loss 1.072309e+00 for shot 92\n", + "WORKER:0:0 (ShotID 99) Spatial grid spacing (0.500 mm | 4.137 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 99) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 99) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 99) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:0 (ShotID 99) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 99) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 99) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.48 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 54.15 GFlops/s, 1.16 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.58 s [OI=2.82, 44.54 GFlops/s, 0.97 GPts/s]\n", - "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 4.54 GFlops/s, 0.08 GPts/s]\n", - "WORKER:0:0 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 20.16 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.43 s [OI=2.63, 56.09 GFlops/s, 1.31 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.10 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.67 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.04 s [OI=0.50, 59.66 GFlops/s, 14.92 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 93) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 93\n", - "HEAD Giving shot 110 to worker:0:0\n", - "WORKER:0:0 (ShotID 110) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 110) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:0 (ShotID 110) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 110) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", - "WORKER:0:0 (ShotID 110) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 110) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 110) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.67 s\n", - "WORKER:0:1 Global performance: [OI=1.79, 40.33 GFlops/s, 0.83 GPts/s]\n", + "WORKER:0:0 (ShotID 99) Completed state equation run for shot\n", + "HEAD Functional value for shot 99: loss 8.530506e-01 for shot 99\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 92) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 92) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.48 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 52.84 GFlops/s, 1.16 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.58 s [OI=2.82, 44.14 GFlops/s, 0.96 GPts/s]\n", - "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 4.73 GFlops/s, 0.08 GPts/s]\n", - "WORKER:0:1 * section2<2499,376,405> ran in 0.07 s [OI=0.25, 21.91 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.41 s [OI=2.63, 58.78 GFlops/s, 1.37 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 4.59 GFlops/s, 0.08 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.06 s [OI=0.25, 26.55 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 97) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 97\n", - "HEAD Giving shot 116 to worker:0:1\n", - "WORKER:0:1 (ShotID 116) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 116) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:1 (ShotID 116) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 116) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", - "WORKER:0:1 (ShotID 116) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 116) Selected time stepping scheme OT2\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WORKER:0:1 (ShotID 116) Running state equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.58 s\n", - "WORKER:0:0 Global performance: [OI=2.06, 47.67 GFlops/s, 0.96 GPts/s]\n", + "WORKER:0:1 (ShotID 92) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 92\n", + "HEAD Giving shot 119 to worker:0:1\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 99) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 99) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.85 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 29.84 GFlops/s, 0.66 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.53 s [OI=2.82, 48.46 GFlops/s, 1.06 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.19 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:0 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 52.93 GFlops/s, 13.24 GPts/s]\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.72 s [OI=2.63, 33.42 GFlops/s, 0.78 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.05 s [OI=6.00, 1.74 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.10 s [OI=0.25, 16.74 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 110) Completed state equation run for shot\n", - "HEAD Functional value for shot 110: loss 1.544919e+00 for shot 110\n", - "WORKER:0:0 (ShotID 110) Preparing to run adjoint for shot\n", - "WORKER:0:0 (ShotID 110) Running adjoint equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.67 s\n", - "WORKER:0:1 Global performance: [OI=2.06, 41.27 GFlops/s, 0.83 GPts/s]\n", + "WORKER:0:0 (ShotID 99) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 99\n", + "WORKER:0:1 (ShotID 119) Spatial grid spacing (0.500 mm | 4.137 PPW) is higher than dispersion limit (0.414 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 119) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 119) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 119) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:1 (ShotID 119) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 119) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 119) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.12 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 23.21 GFlops/s, 0.50 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.62 s [OI=2.82, 41.40 GFlops/s, 0.90 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 1.91 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:1 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 52.13 GFlops/s, 13.04 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.05 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 1.01 s [OI=2.63, 23.68 GFlops/s, 0.56 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.58 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.08 s [OI=0.50, 29.14 GFlops/s, 7.29 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 116) Completed state equation run for shot\n", - "HEAD Functional value for shot 116: loss 1.563926e+00 for shot 116\n", - "WORKER:0:1 (ShotID 116) Preparing to run adjoint for shot\n", - "WORKER:0:1 (ShotID 116) Running adjoint equation for shot\n", + "WORKER:0:1 (ShotID 119) Completed state equation run for shot\n", + "HEAD Functional value for shot 119: loss 7.981235e-01 for shot 119\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.60 s\n", - "WORKER:0:0 Global performance: [OI=1.79, 45.03 GFlops/s, 0.93 GPts/s]\n", - "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.52 s [OI=2.82, 49.00 GFlops/s, 1.07 GPts/s]\n", - "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 5.13 GFlops/s, 0.09 GPts/s]\n", - "WORKER:0:0 * section2<2499,376,405> ran in 0.07 s [OI=0.25, 23.62 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 110) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 110\n", - "HEAD Giving shot 119 to worker:0:0\n", - "WORKER:0:0 (ShotID 119) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 119) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:0 (ShotID 119) Spatial grid spacing (0.500 mm | 4.317 PPW) is higher than dispersion limit (0.432 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 119) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.150 μs)\n", - "WORKER:0:0 (ShotID 119) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 119) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 119) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.68 s\n", - "WORKER:0:1 Global performance: [OI=1.79, 39.74 GFlops/s, 0.82 GPts/s]\n", + "WORKER:0:1 (ShotID 119) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 119) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.43 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 58.98 GFlops/s, 1.29 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.59 s [OI=2.82, 43.33 GFlops/s, 0.95 GPts/s]\n", - "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 4.66 GFlops/s, 0.08 GPts/s]\n", - "WORKER:0:1 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 20.49 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.37 s [OI=2.63, 65.62 GFlops/s, 1.53 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 4.93 GFlops/s, 0.09 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.06 s [OI=0.25, 30.41 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 116) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 116\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.62 s\n", - "WORKER:0:0 Global performance: [OI=2.06, 44.60 GFlops/s, 0.90 GPts/s]\n", - "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.56 s [OI=2.82, 45.80 GFlops/s, 1.00 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.11 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.08 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:0 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 47.78 GFlops/s, 11.95 GPts/s]\n", - "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 119) Completed state equation run for shot\n", - "HEAD Functional value for shot 119: loss 1.607940e+00 for shot 119\n", - "WORKER:0:0 (ShotID 119) Preparing to run adjoint for shot\n", - "WORKER:0:0 (ShotID 119) Running adjoint equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.47 s\n", - "WORKER:0:0 Global performance: [OI=1.79, 57.49 GFlops/s, 1.18 GPts/s]\n", - "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.42 s [OI=2.82, 61.70 GFlops/s, 1.35 GPts/s]\n", - "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 6.15 GFlops/s, 0.11 GPts/s]\n", - "WORKER:0:0 * section2<2499,376,405> ran in 0.04 s [OI=0.25, 38.52 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 119) Completed adjoint equation run for shot\n", + "WORKER:0:1 (ShotID 119) Completed adjoint equation run for shot\n", "HEAD Retrieved gradient for shot 119\n", - "MONITOR Pending barrier tasks 1\n", + "MONITOR Pending barrier tasks 2\n", "HEAD Updating variable vp,\n", - "HEAD \t grad before processing in range [-1.140484e-04, 1.501662e-04]\n", - "HEAD \t grad after processing in range [-7.594383e-01, 1.000000e+00]\n", - "HEAD \t variable range before update [1.500000e+03, 1.500000e+03]\n", - "HEAD \t variable range after update [1.490000e+03, 1.507594e+03]\n", - "HEAD Done iteration 1 (out of 4), block 1 (out of 2) - Total loss_freq 2.539999e+01\n", + "HEAD \t grad before processing in range [-9.135183e-06, 1.273635e-05]\n", + "HEAD \t grad after processing in range [-7.176374e-01, 1.000000e+00]\n", + "HEAD \t variable range before update [1.478884e+03, 1.536660e+03]\n", + "HEAD \t variable range after update [1.476284e+03, 1.537669e+03]\n", + "HEAD Done iteration 3 (out of 4), block 2 (out of 2) - Total loss_freq 1.483143e+01\n", "HEAD ====================================================================\n", - "HEAD Starting iteration 2 (out of 4), block 1 (out of 2)\n", + "HEAD Starting iteration 4 (out of 4), block 2 (out of 2)\n", "HEAD Giving shot 8 to worker:0:0\n", - "HEAD Giving shot 13 to worker:0:1\n", - "WORKER:0:1 (ShotID 13) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 13) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:1 (ShotID 13) Spatial grid spacing (0.500 mm | 4.288 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 13) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", - "WORKER:0:1 (ShotID 13) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 13) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 13) Running state equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", + "HEAD Giving shot 9 to worker:0:1\n", + "WORKER:0:0 (ShotID 8) Spatial grid spacing (0.500 mm | 4.129 PPW) is higher than dispersion limit (0.413 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", "WORKER:0:0 (ShotID 8) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 8) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:0 (ShotID 8) Spatial grid spacing (0.500 mm | 4.288 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 8) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", + "WORKER:0:0 (ShotID 8) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 8) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", "WORKER:0:0 (ShotID 8) Selected undersampling level 4\n", "WORKER:0:0 (ShotID 8) Selected time stepping scheme OT2\n", "WORKER:0:0 (ShotID 8) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.65 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 39.99 GFlops/s, 0.86 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.56 s [OI=2.63, 42.86 GFlops/s, 1.00 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.98 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 34.32 GFlops/s, 8.58 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 8) Completed state equation run for shot\n", + "WORKER:0:1 (ShotID 9) Spatial grid spacing (0.500 mm | 4.129 PPW) is higher than dispersion limit (0.413 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 9) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 9) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 9) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:1 (ShotID 9) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 9) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 9) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.82 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 31.70 GFlops/s, 0.68 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.72 s [OI=2.63, 33.29 GFlops/s, 0.78 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.90 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.08 s [OI=0.50, 30.49 GFlops/s, 7.63 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 9) Completed state equation run for shot\n", + "HEAD Functional value for shot 8: loss 7.206318e-01 for shot 8\n", + "HEAD Functional value for shot 9: loss 8.290170e-01 for shot 9\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.57 s\n", - "WORKER:0:1 Global performance: [OI=2.06, 48.51 GFlops/s, 0.97 GPts/s]\n", + "WORKER:0:0 (ShotID 8) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 8) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.62 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 40.91 GFlops/s, 0.90 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.50 s [OI=2.63, 47.82 GFlops/s, 1.12 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 2.16 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.09 s [OI=0.25, 18.88 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 8) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 8\n", + "HEAD Giving shot 17 to worker:0:0\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 9) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 9) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.89 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 28.50 GFlops/s, 0.63 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.52 s [OI=2.82, 49.17 GFlops/s, 1.07 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.10 GFlops/s, 0.00 GPts/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WORKER:0:1 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 54.53 GFlops/s, 13.64 GPts/s]\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.76 s [OI=2.63, 31.48 GFlops/s, 0.74 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.03 s [OI=6.00, 2.57 GFlops/s, 0.05 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.11 s [OI=0.25, 14.75 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 13) Completed state equation run for shot\n", - "HEAD Functional value for shot 13: loss 1.375278e+00 for shot 13\n", - "WORKER:0:1 (ShotID 13) Preparing to run adjoint for shot\n", - "WORKER:0:1 (ShotID 13) Running adjoint equation for shot\n", + "WORKER:0:1 (ShotID 9) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 9\n", + "HEAD Giving shot 25 to worker:0:1\n", + "WORKER:0:0 (ShotID 17) Spatial grid spacing (0.500 mm | 4.129 PPW) is higher than dispersion limit (0.413 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 17) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 17) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 17) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:0 (ShotID 17) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 17) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 17) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.87 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 29.88 GFlops/s, 0.64 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.05 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.75 s [OI=2.63, 32.01 GFlops/s, 0.75 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.77 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.09 s [OI=0.50, 26.51 GFlops/s, 6.63 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 17) Completed state equation run for shot\n", + "HEAD Functional value for shot 17: loss 8.305575e-01 for shot 17\n", + "WORKER:0:1 (ShotID 25) Spatial grid spacing (0.500 mm | 4.129 PPW) is higher than dispersion limit (0.413 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.73 s\n", - "WORKER:0:0 Global performance: [OI=2.06, 37.88 GFlops/s, 0.76 GPts/s]\n", + "WORKER:0:1 (ShotID 25) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 25) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 25) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:1 (ShotID 25) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 25) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 25) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.84 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 30.94 GFlops/s, 0.66 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.74 s [OI=2.63, 32.32 GFlops/s, 0.76 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.53 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.06 s [OI=0.50, 37.32 GFlops/s, 9.33 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 25) Completed state equation run for shot\n", + "HEAD Functional value for shot 25: loss 1.253885e+00 for shot 25\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 17) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 17) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 1.06 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 23.93 GFlops/s, 0.53 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.67 s [OI=2.82, 38.12 GFlops/s, 0.83 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.04 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:0 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 46.16 GFlops/s, 11.54 GPts/s]\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.89 s [OI=2.63, 26.93 GFlops/s, 0.63 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.08 s [OI=6.00, 1.00 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.10 s [OI=0.25, 15.29 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 8) Completed state equation run for shot\n", - "HEAD Functional value for shot 8: loss 1.075252e+00 for shot 8\n", - "WORKER:0:0 (ShotID 8) Preparing to run adjoint for shot\n", - "WORKER:0:0 (ShotID 8) Running adjoint equation for shot\n", + "WORKER:0:0 (ShotID 17) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 17\n", + "HEAD Giving shot 27 to worker:0:0\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 25) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 25) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.77 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 32.94 GFlops/s, 0.72 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.62 s [OI=2.63, 38.55 GFlops/s, 0.90 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.07 s [OI=6.00, 1.05 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 19.37 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 25) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 25\n", + "HEAD Giving shot 29 to worker:0:1\n", + "WORKER:0:0 (ShotID 27) Spatial grid spacing (0.500 mm | 4.129 PPW) is higher than dispersion limit (0.413 mm | 5.000 PPW)\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.60 s\n", - "WORKER:0:1 Global performance: [OI=1.79, 45.03 GFlops/s, 0.93 GPts/s]\n", + "WORKER:0:0 (ShotID 27) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 27) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 27) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:0 (ShotID 27) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 27) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 27) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.57 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 45.60 GFlops/s, 0.97 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.49 s [OI=2.63, 48.95 GFlops/s, 1.14 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.07 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 1.08 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 35.85 GFlops/s, 8.97 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 27) Completed state equation run for shot\n", + "HEAD Functional value for shot 27: loss 1.142029e+00 for shot 27\n", + "WORKER:0:1 (ShotID 29) Spatial grid spacing (0.500 mm | 4.129 PPW) is higher than dispersion limit (0.413 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 29) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 29) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 29) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:1 (ShotID 29) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 29) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 29) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.86 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 30.22 GFlops/s, 0.65 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.52 s [OI=2.82, 49.73 GFlops/s, 1.09 GPts/s]\n", - "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 5.04 GFlops/s, 0.09 GPts/s]\n", - "WORKER:0:1 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 21.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.72 s [OI=2.63, 33.29 GFlops/s, 0.78 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.06 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.66 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 31.73 GFlops/s, 7.94 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 13) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 13\n", - "HEAD Giving shot 17 to worker:0:1\n", - "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.58 s\n", - "WORKER:0:0 Global performance: [OI=1.79, 46.59 GFlops/s, 0.96 GPts/s]\n", + "WORKER:0:1 (ShotID 29) Completed state equation run for shot\n", + "HEAD Functional value for shot 29: loss 1.122254e+00 for shot 29\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 27) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 27) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.71 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 35.72 GFlops/s, 0.78 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.56 s [OI=2.63, 42.95 GFlops/s, 1.00 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.08 s [OI=6.00, 0.94 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 20.88 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 27) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 27\n", + "HEAD Giving shot 46 to worker:0:0\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 29) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 29) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.84 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 30.19 GFlops/s, 0.66 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.70 s [OI=2.63, 34.39 GFlops/s, 0.80 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.06 s [OI=6.00, 1.30 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.09 s [OI=0.25, 17.27 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 29) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 29\n", + "HEAD Giving shot 65 to worker:0:1\n", + "WORKER:0:0 (ShotID 46) Spatial grid spacing (0.500 mm | 4.129 PPW) is higher than dispersion limit (0.413 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 46) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 46) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 46) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:0 (ShotID 46) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 46) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 46) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.50 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 51.98 GFlops/s, 1.11 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.50 s [OI=2.82, 51.56 GFlops/s, 1.13 GPts/s]\n", - "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 5.10 GFlops/s, 0.09 GPts/s]\n", - "WORKER:0:0 * section2<2499,376,405> ran in 0.07 s [OI=0.25, 22.42 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.44 s [OI=2.63, 54.47 GFlops/s, 1.27 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.04 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.90 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.04 s [OI=0.50, 59.97 GFlops/s, 15.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 8) Completed adjoint equation run for shot\n", - "WORKER:0:1 (ShotID 17) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 17) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:1 (ShotID 17) Spatial grid spacing (0.500 mm | 4.288 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 17) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", - "WORKER:0:1 (ShotID 17) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 17) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 17) Running state equation for shot\n", + "WORKER:0:0 (ShotID 46) Completed state equation run for shot\n", + "HEAD Functional value for shot 46: loss 9.296777e-01 for shot 46\n", + "WORKER:0:1 (ShotID 65) Spatial grid spacing (0.500 mm | 4.129 PPW) is higher than dispersion limit (0.413 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "HEAD Retrieved gradient for shot 8\n", - "HEAD Giving shot 37 to worker:0:0\n", - "WORKER:0:0 (ShotID 37) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 37) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:0 (ShotID 37) Spatial grid spacing (0.500 mm | 4.288 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 37) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", - "WORKER:0:0 (ShotID 37) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 37) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 37) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.56 s\n", - "WORKER:0:1 Global performance: [OI=2.06, 49.38 GFlops/s, 0.99 GPts/s]\n", + "WORKER:0:1 (ShotID 65) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 65) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 65) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:1 (ShotID 65) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 65) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 65) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.50 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 51.98 GFlops/s, 1.11 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.50 s [OI=2.82, 50.93 GFlops/s, 1.11 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.18 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:1 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 52.73 GFlops/s, 13.19 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.44 s [OI=2.63, 55.27 GFlops/s, 1.29 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.08 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.40 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.05 s [OI=0.50, 46.04 GFlops/s, 11.51 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 17) Completed state equation run for shot\n", - "HEAD Functional value for shot 17: loss 1.306168e+00 for shot 17\n", - "WORKER:0:1 (ShotID 17) Preparing to run adjoint for shot\n", - "WORKER:0:1 (ShotID 17) Running adjoint equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.62 s\n", - "WORKER:0:0 Global performance: [OI=2.06, 44.60 GFlops/s, 0.90 GPts/s]\n", + "WORKER:0:1 (ShotID 65) Completed state equation run for shot\n", + "HEAD Functional value for shot 65: loss 7.687517e-01 for shot 65\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 46) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 46) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.62 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 40.91 GFlops/s, 0.90 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.57 s [OI=2.82, 45.17 GFlops/s, 0.99 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.16 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:0 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 52.18 GFlops/s, 13.05 GPts/s]\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.52 s [OI=2.63, 46.50 GFlops/s, 1.09 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 1.84 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.07 s [OI=0.25, 23.77 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 37) Completed state equation run for shot\n", - "HEAD Functional value for shot 37: loss 1.457678e+00 for shot 37\n", - "WORKER:0:0 (ShotID 37) Preparing to run adjoint for shot\n", - "WORKER:0:0 (ShotID 37) Running adjoint equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.61 s\n", - "WORKER:0:1 Global performance: [OI=1.79, 44.30 GFlops/s, 0.91 GPts/s]\n", + "WORKER:0:0 (ShotID 46) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 46\n", + "HEAD Giving shot 75 to worker:0:0\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 65) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 65) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.79 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 32.11 GFlops/s, 0.70 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.53 s [OI=2.82, 48.60 GFlops/s, 1.06 GPts/s]\n", - "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 5.22 GFlops/s, 0.09 GPts/s]\n", - "WORKER:0:1 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 21.07 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.67 s [OI=2.63, 35.97 GFlops/s, 0.84 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.05 s [OI=6.00, 1.70 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 19.30 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 17) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 17\n", - "HEAD Giving shot 57 to worker:0:1\n", - "WORKER:0:1 (ShotID 57) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 57) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:1 (ShotID 57) Spatial grid spacing (0.500 mm | 4.288 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 57) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", - "WORKER:0:1 (ShotID 57) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 57) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 57) Running state equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.71 s\n", - "WORKER:0:0 Global performance: [OI=1.79, 38.06 GFlops/s, 0.78 GPts/s]\n", + "WORKER:0:1 (ShotID 65) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 65\n", + "HEAD Giving shot 81 to worker:0:1\n", + "WORKER:0:0 (ShotID 75) Spatial grid spacing (0.500 mm | 4.129 PPW) is higher than dispersion limit (0.413 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 75) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 75) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 75) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:0 (ShotID 75) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 75) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 75) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.49 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 53.04 GFlops/s, 1.13 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.62 s [OI=2.82, 41.40 GFlops/s, 0.90 GPts/s]\n", - "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 4.41 GFlops/s, 0.08 GPts/s]\n", - "WORKER:0:0 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 19.96 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.05 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.42 s [OI=2.63, 56.88 GFlops/s, 1.33 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.03 s [OI=5.80, 0.03 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.88 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.04 s [OI=0.50, 59.29 GFlops/s, 14.83 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 37) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 37\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "HEAD Giving shot 60 to worker:0:0\n", - "WORKER:0:0 (ShotID 60) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 60) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:0 (ShotID 60) Spatial grid spacing (0.500 mm | 4.288 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 60) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", - "WORKER:0:0 (ShotID 60) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 60) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 60) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.66 s\n", - "WORKER:0:1 Global performance: [OI=2.06, 41.90 GFlops/s, 0.84 GPts/s]\n", + "WORKER:0:0 (ShotID 75) Completed state equation run for shot\n", + "HEAD Functional value for shot 75: loss 9.542434e-01 for shot 75\n", + "WORKER:0:1 (ShotID 81) Spatial grid spacing (0.500 mm | 4.129 PPW) is higher than dispersion limit (0.413 mm | 5.000 PPW)\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 81) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 81) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 81) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:1 (ShotID 81) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 81) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 81) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.94 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 27.65 GFlops/s, 0.59 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.60 s [OI=2.82, 42.91 GFlops/s, 0.94 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.11 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 1.84 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:1 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 49.26 GFlops/s, 12.32 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.79 s [OI=2.63, 30.11 GFlops/s, 0.71 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.03 s [OI=1.32, 0.45 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.08 s [OI=0.50, 27.87 GFlops/s, 6.97 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 57) Completed state equation run for shot\n", - "HEAD Functional value for shot 57: loss 9.006270e-01 for shot 57\n", - "WORKER:0:1 (ShotID 57) Preparing to run adjoint for shot\n", - "WORKER:0:1 (ShotID 57) Running adjoint equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.64 s\n", - "WORKER:0:0 Global performance: [OI=2.06, 43.20 GFlops/s, 0.87 GPts/s]\n", + "WORKER:0:1 (ShotID 81) Completed state equation run for shot\n", + "HEAD Functional value for shot 81: loss 1.097703e+00 for shot 81\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 75) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 75) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 1.04 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 24.39 GFlops/s, 0.54 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.59 s [OI=2.82, 43.69 GFlops/s, 0.95 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.13 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:0 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 52.49 GFlops/s, 13.13 GPts/s]\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.88 s [OI=2.63, 27.17 GFlops/s, 0.64 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.07 s [OI=6.00, 1.17 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.11 s [OI=0.25, 15.01 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 60) Completed state equation run for shot\n", - "HEAD Functional value for shot 60: loss 1.664085e+00 for shot 60\n", - "WORKER:0:0 (ShotID 60) Preparing to run adjoint for shot\n", - "WORKER:0:0 (ShotID 60) Running adjoint equation for shot\n", + "WORKER:0:0 (ShotID 75) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 75\n", + "HEAD Giving shot 83 to worker:0:0\n", + "WORKER:0:0 (ShotID 83) Spatial grid spacing (0.500 mm | 4.129 PPW) is higher than dispersion limit (0.413 mm | 5.000 PPW)\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.72 s\n", - "WORKER:0:1 Global performance: [OI=1.79, 37.53 GFlops/s, 0.77 GPts/s]\n", - "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.63 s [OI=2.82, 40.76 GFlops/s, 0.89 GPts/s]\n", - "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 4.58 GFlops/s, 0.08 GPts/s]\n", - "WORKER:0:1 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 20.80 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 57) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 57\n", - "HEAD Giving shot 61 to worker:0:1\n", - "WORKER:0:1 (ShotID 61) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 61) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:1 (ShotID 61) Spatial grid spacing (0.500 mm | 4.288 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 61) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", - "WORKER:0:1 (ShotID 61) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 61) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 61) Running state equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.64 s\n", - "WORKER:0:0 Global performance: [OI=1.79, 42.22 GFlops/s, 0.87 GPts/s]\n", + "WORKER:0:0 (ShotID 83) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 83) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 83) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:0 (ShotID 83) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 83) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 83) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.61 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 42.61 GFlops/s, 0.91 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.56 s [OI=2.82, 46.16 GFlops/s, 1.01 GPts/s]\n", - "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 4.78 GFlops/s, 0.08 GPts/s]\n", - "WORKER:0:0 * section2<2499,376,405> ran in 0.07 s [OI=0.25, 22.20 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.02 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.53 s [OI=2.63, 45.59 GFlops/s, 1.07 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.02 s [OI=5.80, 0.06 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.97 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 36.51 GFlops/s, 9.13 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 60) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 60\n", - "HEAD Giving shot 62 to worker:0:0\n", - "WORKER:0:0 (ShotID 62) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 62) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:0 (ShotID 62) Spatial grid spacing (0.500 mm | 4.288 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 62) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", - "WORKER:0:0 (ShotID 62) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 62) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 62) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.66 s\n", - "WORKER:0:1 Global performance: [OI=2.06, 41.90 GFlops/s, 0.84 GPts/s]\n", + "WORKER:0:0 (ShotID 83) Completed state equation run for shot\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 81) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 81) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 1.43 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 17.74 GFlops/s, 0.39 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.61 s [OI=2.82, 42.29 GFlops/s, 0.92 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.00 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:1 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 52.66 GFlops/s, 13.17 GPts/s]\n", + "WORKER:0:1 * section0<2499,456,485> ran in 1.25 s [OI=2.63, 19.13 GFlops/s, 0.45 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.06 s [OI=6.00, 1.30 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.13 s [OI=0.25, 12.23 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 61) Completed state equation run for shot\n", - "HEAD Functional value for shot 61: loss 1.203876e+00 for shot 61\n", - "WORKER:0:1 (ShotID 61) Preparing to run adjoint for shot\n", - "WORKER:0:1 (ShotID 61) Running adjoint equation for shot\n", + "WORKER:0:1 (ShotID 81) Completed adjoint equation run for shot\n", + "HEAD Functional value for shot 83: loss 1.162536e+00 for shot 83\n", + "HEAD Retrieved gradient for shot 81\n", + "HEAD Giving shot 96 to worker:0:1\n", + "WORKER:0:1 (ShotID 96) Spatial grid spacing (0.500 mm | 4.129 PPW) is higher than dispersion limit (0.413 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.61 s\n", - "WORKER:0:0 Global performance: [OI=2.06, 45.33 GFlops/s, 0.91 GPts/s]\n", + "WORKER:0:1 (ShotID 96) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 96) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 96) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:1 (ShotID 96) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 96) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 96) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.64 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 40.61 GFlops/s, 0.87 GPts/s]\n", + "WORKER:0:1 Local performance:\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 0.58 s [OI=2.63, 41.39 GFlops/s, 0.97 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.10 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.32, 1.44 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.05 s [OI=0.50, 45.92 GFlops/s, 11.48 GPts/s]\n", + "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:1 (ShotID 96) Completed state equation run for shot\n", + "HEAD Functional value for shot 96: loss 9.068089e-01 for shot 96\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 83) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 83) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 1.59 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 15.95 GFlops/s, 0.35 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.56 s [OI=2.82, 46.10 GFlops/s, 1.01 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.17 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:0 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 53.63 GFlops/s, 13.41 GPts/s]\n", + "WORKER:0:0 * section0<2499,456,485> ran in 1.31 s [OI=2.63, 18.15 GFlops/s, 0.43 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.14 s [OI=6.00, 0.53 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.14 s [OI=0.25, 10.92 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 62) Completed state equation run for shot\n", - "HEAD Functional value for shot 62: loss 1.095110e+00 for shot 62\n", - "WORKER:0:0 (ShotID 62) Preparing to run adjoint for shot\n", - "WORKER:0:0 (ShotID 62) Running adjoint equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.70 s\n", - "WORKER:0:1 Global performance: [OI=1.79, 38.60 GFlops/s, 0.79 GPts/s]\n", + "WORKER:0:0 (ShotID 83) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 83\n", + "HEAD Giving shot 101 to worker:0:0\n", + "WORKER:0:1 AutoTuner: could not perform any runs\n", + "WORKER:0:1 (ShotID 96) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 96) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 1.54 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 16.47 GFlops/s, 0.36 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.61 s [OI=2.82, 42.23 GFlops/s, 0.92 GPts/s]\n", - "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 4.63 GFlops/s, 0.08 GPts/s]\n", - "WORKER:0:1 * section2<2499,376,405> ran in 0.09 s [OI=0.25, 18.98 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<2499,456,485> ran in 1.35 s [OI=2.63, 17.73 GFlops/s, 0.42 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.08 s [OI=6.00, 0.92 GFlops/s, 0.02 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.12 s [OI=0.25, 13.59 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 61) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 61\n", - "HEAD Giving shot 63 to worker:0:1\n", - "WORKER:0:1 (ShotID 63) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 63) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "WORKER:0:1 (ShotID 63) Spatial grid spacing (0.500 mm | 4.288 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 63) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", - "WORKER:0:1 (ShotID 63) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 63) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 63) Running state equation for shot\n", + "WORKER:0:1 (ShotID 96) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 96\n", + "HEAD Giving shot 107 to worker:0:1\n", + "WORKER:0:0 (ShotID 101) Spatial grid spacing (0.500 mm | 4.129 PPW) is higher than dispersion limit (0.413 mm | 5.000 PPW)\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 101) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 101) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 101) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:0 (ShotID 101) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 101) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 101) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 1.20 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 21.66 GFlops/s, 0.47 GPts/s]\n", + "WORKER:0:0 Local performance:\n", + "WORKER:0:0 * section0<120> ran in 0.01 s [OI=0.50, 0.04 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 1.05 s [OI=2.63, 22.75 GFlops/s, 0.53 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.04 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.04 s [OI=1.32, 0.36 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.09 s [OI=0.50, 27.13 GFlops/s, 6.79 GPts/s]\n", + "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", + "WORKER:0:0 (ShotID 101) Completed state equation run for shot\n", + "HEAD Functional value for shot 101: loss 5.932735e-01 for shot 101\n", + "WORKER:0:1 (ShotID 107) Spatial grid spacing (0.500 mm | 4.129 PPW) is higher than dispersion limit (0.413 mm | 5.000 PPW)\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.68 s\n", - "WORKER:0:0 Global performance: [OI=1.79, 39.74 GFlops/s, 0.82 GPts/s]\n", - "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.59 s [OI=2.82, 43.49 GFlops/s, 0.95 GPts/s]\n", - "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 5.15 GFlops/s, 0.09 GPts/s]\n", - "WORKER:0:0 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 19.55 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 62) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 62\n", - "HEAD Giving shot 88 to worker:0:0\n", - "WORKER:0:0 (ShotID 88) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 88) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:0 (ShotID 88) Spatial grid spacing (0.500 mm | 4.288 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 88) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", - "WORKER:0:0 (ShotID 88) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 88) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 88) Running state equation for shot\n", - "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.62 s\n", - "WORKER:0:1 Global performance: [OI=2.06, 44.60 GFlops/s, 0.90 GPts/s]\n", + "WORKER:0:1 (ShotID 107) Preparing to run state for shot\n", + "WORKER:0:1 (ShotID 107) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:1 (ShotID 107) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:1 (ShotID 107) Selected undersampling level 4\n", + "WORKER:0:1 (ShotID 107) Selected time stepping scheme OT2\n", + "WORKER:0:1 (ShotID 107) Running state equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_state` ran in 1.52 s\n", + "WORKER:0:1 Global performance: [OI=1.93, 17.10 GFlops/s, 0.37 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.56 s [OI=2.82, 45.48 GFlops/s, 0.99 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.07 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:1 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 50.06 GFlops/s, 12.52 GPts/s]\n", + "WORKER:0:1 * section0<120> ran in 0.01 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section1<2499,456,485> ran in 1.35 s [OI=2.63, 17.70 GFlops/s, 0.42 GPts/s]\n", + "WORKER:0:1 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:1 * section3<<2499,120>,<2499,120,2,2>> ran in 0.04 s [OI=1.32, 0.42 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section4<2499,456,485> ran in 0.10 s [OI=0.50, 23.78 GFlops/s, 5.95 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 63) Completed state equation run for shot\n", - "HEAD Functional value for shot 63: loss 8.054955e-01 for shot 63\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.60 s\n", - "WORKER:0:0 Global performance: [OI=2.06, 46.08 GFlops/s, 0.93 GPts/s]\n", + "WORKER:0:1 (ShotID 107) Completed state equation run for shot\n", + "WORKER:0:0 AutoTuner: could not perform any runs\n", + "WORKER:0:0 (ShotID 101) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 101) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 1.47 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 17.26 GFlops/s, 0.38 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.55 s [OI=2.82, 46.98 GFlops/s, 1.03 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.24 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:0 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 54.78 GFlops/s, 13.70 GPts/s]\n", + "WORKER:0:0 * section0<2499,456,485> ran in 1.29 s [OI=2.63, 18.46 GFlops/s, 0.43 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.06 s [OI=6.00, 1.21 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.12 s [OI=0.25, 12.81 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 88) Completed state equation run for shot\n", - "WORKER:0:1 (ShotID 63) Preparing to run adjoint for shot\n", - "WORKER:0:1 (ShotID 63) Running adjoint equation for shot\n", + "WORKER:0:0 (ShotID 101) Completed adjoint equation run for shot\n", + "HEAD Functional value for shot 107: loss 7.493217e-01 for shot 107\n", + "HEAD Retrieved gradient for shot 101\n", + "HEAD Giving shot 116 to worker:0:0\n", "WORKER:0:1 AutoTuner: could not perform any runs\n", - "HEAD Functional value for shot 88: loss 1.396504e+00 for shot 88\n", - "WORKER:0:0 (ShotID 88) Preparing to run adjoint for shot\n", - "WORKER:0:0 (ShotID 88) Running adjoint equation for shot\n", + "WORKER:0:0 (ShotID 116) Spatial grid spacing (0.500 mm | 4.129 PPW) is higher than dispersion limit (0.413 mm | 5.000 PPW)\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.65 s\n", - "WORKER:0:1 Global performance: [OI=1.79, 41.57 GFlops/s, 0.86 GPts/s]\n", + "WORKER:0:1 (ShotID 107) Preparing to run adjoint for shot\n", + "WORKER:0:1 (ShotID 107) Running adjoint equation for shot\n", + "WORKER:0:1 Operator `acoustic_iso_adjoint` ran in 0.81 s\n", + "WORKER:0:1 Global performance: [OI=1.68, 31.31 GFlops/s, 0.69 GPts/s]\n", "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.56 s [OI=2.82, 45.74 GFlops/s, 1.00 GPts/s]\n", - "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 4.74 GFlops/s, 0.08 GPts/s]\n", - "WORKER:0:1 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 20.52 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:1 * section0<2499,456,485> ran in 0.68 s [OI=2.63, 35.02 GFlops/s, 0.82 GPts/s]\n", + "WORKER:0:1 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.04 s [OI=6.00, 1.91 GFlops/s, 0.04 GPts/s]\n", + "WORKER:0:1 * section2<2499,376,405> ran in 0.09 s [OI=0.25, 17.73 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 63) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 63\n", - "HEAD Giving shot 92 to worker:0:1\n", - "WORKER:0:1 (ShotID 92) Preparing to run state for shot\n", - "WORKER:0:1 (ShotID 92) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:1 (ShotID 92) Spatial grid spacing (0.500 mm | 4.288 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", - "WORKER:0:1 (ShotID 92) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", - "WORKER:0:1 (ShotID 92) Selected undersampling level 4\n", - "WORKER:0:1 (ShotID 92) Selected time stepping scheme OT2\n", - "WORKER:0:1 (ShotID 92) Running state equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.67 s\n", - "WORKER:0:0 Global performance: [OI=1.79, 40.33 GFlops/s, 0.83 GPts/s]\n", + "WORKER:0:1 (ShotID 107) Completed adjoint equation run for shot\n", + "WORKER:0:0 (ShotID 116) Preparing to run state for shot\n", + "WORKER:0:0 (ShotID 116) Estimated bandwidth for the propagated wavelet 0.245-0.715 MHz\n", + "WORKER:0:0 (ShotID 116) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.146 μs)\n", + "WORKER:0:0 (ShotID 116) Selected undersampling level 4\n", + "WORKER:0:0 (ShotID 116) Selected time stepping scheme OT2\n", + "WORKER:0:0 (ShotID 116) Running state equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.95 s\n", + "WORKER:0:0 Global performance: [OI=1.93, 27.36 GFlops/s, 0.59 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.58 s [OI=2.82, 44.42 GFlops/s, 0.97 GPts/s]\n", - "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.02 s [OI=6.00, 4.76 GFlops/s, 0.08 GPts/s]\n", - "WORKER:0:0 * section2<2499,376,405> ran in 0.08 s [OI=0.25, 20.30 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section0<120> ran in 0.02 s [OI=0.50, 0.01 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section1<2499,456,485> ran in 0.81 s [OI=2.63, 29.41 GFlops/s, 0.69 GPts/s]\n", + "WORKER:0:0 * section2<<2499,1,2,2>,<2499,1,2,2>> ran in 0.05 s [OI=5.80, 0.02 GFlops/s, 0.01 GPts/s]\n", + "WORKER:0:0 * section3<<2499,120>,<2499,120,2,2>> ran in 0.02 s [OI=1.32, 0.73 GFlops/s, 0.00 GPts/s]\n", + "WORKER:0:0 * section4<2499,456,485> ran in 0.07 s [OI=0.50, 34.68 GFlops/s, 8.67 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 88) Completed adjoint equation run for shot\n", - "HEAD Retrieved gradient for shot 88\n", - "HEAD Giving shot 96 to worker:0:0\n", - "WORKER:0:0 (ShotID 96) Preparing to run state for shot\n", - "WORKER:0:0 (ShotID 96) Estimated bandwidth for the propagated wavelet 0.235-0.695 MHz\n", - "WORKER:0:0 (ShotID 96) Spatial grid spacing (0.500 mm | 4.288 PPW) is higher than dispersion limit (0.429 mm | 5.000 PPW)\n", - "WORKER:0:0 (ShotID 96) Time grid spacing (0.080 μs | 24%) is below OT2 limit (0.149 μs)\n", - "WORKER:0:0 (ShotID 96) Selected undersampling level 4\n", - "WORKER:0:0 (ShotID 96) Selected time stepping scheme OT2\n", - "WORKER:0:0 (ShotID 96) Running state equation for shot\n", + "WORKER:0:0 (ShotID 116) Completed state equation run for shot\n", + "HEAD Retrieved gradient for shot 107\n", + "HEAD Functional value for shot 116: loss 7.557741e-01 for shot 116\n", "WORKER:0:0 AutoTuner: could not perform any runs\n", - "WORKER:0:1 Operator `acoustic_iso_state` ran in 0.59 s\n", - "WORKER:0:1 Global performance: [OI=2.06, 46.87 GFlops/s, 0.94 GPts/s]\n", - "WORKER:0:1 Local performance:\n", - "WORKER:0:1 * section0<2499,456,485> ran in 0.54 s [OI=2.82, 47.58 GFlops/s, 1.04 GPts/s]\n", - "WORKER:0:1 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.13 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:1 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 2.22 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:1 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 50.70 GFlops/s, 12.68 GPts/s]\n", - "WORKER:0:1 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:1 (ShotID 92) Completed state equation run for shot\n", - "HEAD Functional value for shot 92: loss 1.333199e+00 for shot 92\n", - "WORKER:0:1 (ShotID 92) Preparing to run adjoint for shot\n", - "WORKER:0:1 (ShotID 92) Running adjoint equation for shot\n", - "WORKER:0:1 AutoTuner: could not perform any runs\n", - "WORKER:0:0 Operator `acoustic_iso_state` ran in 0.63 s\n", - "WORKER:0:0 Global performance: [OI=2.06, 43.89 GFlops/s, 0.88 GPts/s]\n", + "WORKER:0:0 (ShotID 116) Preparing to run adjoint for shot\n", + "WORKER:0:0 (ShotID 116) Running adjoint equation for shot\n", + "WORKER:0:0 Operator `acoustic_iso_adjoint` ran in 0.66 s\n", + "WORKER:0:0 Global performance: [OI=1.68, 38.43 GFlops/s, 0.84 GPts/s]\n", "WORKER:0:0 Local performance:\n", - "WORKER:0:0 * section0<2499,456,485> ran in 0.58 s [OI=2.82, 44.59 GFlops/s, 0.97 GPts/s]\n", - "WORKER:0:0 * section1<<2499,1,2,2>,<2499,1,2,2>> ran in 0.01 s [OI=5.80, 0.12 GFlops/s, 0.01 GPts/s]\n", - "WORKER:0:0 * section2<<2499,120>,<2499,120,2,2>> ran in 0.01 s [OI=1.84, 1.95 GFlops/s, 0.00 GPts/s]\n", - "WORKER:0:0 * section3<2499,456,485> ran in 0.05 s [OI=0.50, 48.19 GFlops/s, 12.05 GPts/s]\n", + "WORKER:0:0 * section0<2499,456,485> ran in 0.56 s [OI=2.63, 42.71 GFlops/s, 1.00 GPts/s]\n", + "WORKER:0:0 * section1<<2499,120,2,2>,<2499,120,2,2>> ran in 0.05 s [OI=6.00, 1.56 GFlops/s, 0.03 GPts/s]\n", + "WORKER:0:0 * section2<2499,376,405> ran in 0.06 s [OI=0.25, 26.94 GFlops/s, 0.00 GPts/s]\n", "WORKER:0:0 Performance[mode=advanced-fsg] arguments: {'nthreads': 3, 'nthreads_nonaffine': 3}\n", - "WORKER:0:0 (ShotID 96) Completed state equation run for shot\n" + "WORKER:0:0 (ShotID 116) Completed adjoint equation run for shot\n", + "HEAD Retrieved gradient for shot 116\n", + "MONITOR Pending barrier tasks 2\n", + "HEAD Updating variable vp,\n", + "HEAD \t grad before processing in range [-1.473754e-05, 6.402976e-06]\n", + "HEAD \t grad after processing in range [-1.000000e+00, 4.342713e-01]\n", + "HEAD \t variable range before update [1.476284e+03, 1.537669e+03]\n", + "HEAD \t variable range after update [1.477268e+03, 1.543448e+03]\n", + "HEAD Done iteration 4 (out of 4), block 2 (out of 2) - Total loss_freq 1.381647e+01\n", + "HEAD ====================================================================\n" ] }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "426b84a0a648498e98549b14664cfb2e", + "version_major": 2, + "version_minor": 0 + }, + "image/png": "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Z883BID169dj0aJFePTRR7fbxzzR2LhxI/baay889thjmD179mSL0xNPN3mBJPOOwtNN5qebvECSeaJBRNi0aRMWLly43cro7+/HmjVrMDo6us15tVot9Pf3T4BUCVMR05YA7r777sjzvKLtW7duXUUryOjr60NfX1/l+uDg4JQbaHph9uzZTyuZn27yAknmHYWnm8xPN3mBJPNEYkcoC/r7+xNxS+iJaesE0mq1cMghh2DFihXe9RUrVuDwww+fJKkSEhISEhISErY/pq0GEADOOussLFu2DIceeihe8pKX4Morr8Sjjz6KU089dbJFS0hISEhISEjYbpjWBPDEE0/EH//4R3zwgx/E448/jgMOOAA33ngjFi1aNKbn+/r6cP7550e3hacqnm4yP93kBZLMOwpPN5mfbvICSeaEhJ0ZitKBfwkJCQkJCQkJ0wrT1gYwISEhISEhIWG6IhHAhISEhISEhIRphkQAExISEhISEhKmGRIBTEhISEhISEiYZkgE8CniM5/5DBYvXoz+/n4ccsghWLly5WSLZHHhhRfisMMOw6xZszBv3jy89rWvxS9+8QsvDRHhggsuwMKFCzEwMICjjz4aP/3pTydJYh8XXnghlFJYvny5vTYV5f3tb3+Lt7zlLZg7dy5mzJiB5z//+Vi1apW9P9Vk7nQ6OO+887B48WIMDAxgn332wQc/+EGUpTsvdLJlvv322/Ga17wGCxcuhFIK119/vXd/LPKNjIzgjDPOwO67746ZM2di6dKl+M1vfjMpMrfbbbz3ve/FgQceiJkzZ2LhwoV461vfit/97neTJnOvNpZ4xzveAaUULr300kmTd6wy/+xnP8PSpUsxODiIWbNm4cUvfjEeffTRSZM5IWGqIxHAp4BrrrkGy5cvx7nnnot77rkHRx55JI499lhvsJlM3HbbbTjttNPwwx/+ECtWrECn08GSJUuwZcsWm+YjH/kILrnkElx22WW4++67sWDBAvzVX/0VNm3aNImSA3fffTeuvPJKPO95z/OuTzV5n3zySbz0pS9Fs9nE//zP/+DBBx/Ev//7v2PXXXedsjJffPHFuOKKK3DZZZfhZz/7GT7ykY/gox/9KD71qU9NGZm3bNmCgw46CJdddln0/ljkW758Oa677jpcffXVuOOOO7B582Ycf/zxKIpih8s8NDSE1atX4/3vfz9Wr16Na6+9Fg899BCWLl3qpduRMvdqY8b111+Pu+66K3ps2VRqYwD45S9/iSOOOAL77rsvbr31VvzkJz/B+9//fu80jB0tc0LClAcljBsvfOEL6dRTT/Wu7bvvvnTOOedMkkTdsW7dOgJAt912GxERlWVJCxYsoIsuusimGR4epsHBQbriiismS0zatGkTPfvZz6YVK1bQUUcdRe985zuJaGrK+973vpeOOOKI2vtTUebjjjuO/u7v/s67dsIJJ9Bb3vIWIpp6MgOg6667zv4ei3zr16+nZrNJV199tU3z29/+lrIso5tuummHyxzDj370IwJAv/71r4locmWuk/c3v/kNPeMZz6AHHniAFi1aRB//+MftvanYxieeeKLtxzFMtswJCVMRSQM4ToyOjmLVqlVYsmSJd33JkiW48847J0mq7tiwYQMAYM6cOQCANWvWYO3atV4d+vr6cNRRR01qHU477TQcd9xxeOUrX+ldn4ry3nDDDTj00EPx+te/HvPmzcPBBx+Mz372s/b+VJT5iCOOwPe+9z089NBDAICf/OQnuOOOO/DqV796ysosMRb5Vq1ahXa77aVZuHAhDjjggClRB0B/j0opqy2eajKXZYlly5bh7LPPxv7771+5PxXl/c53voO/+Iu/wKte9SrMmzcPL3rRi7xt4qkmc0LCVEAigOPEE088gaIoMH/+fO/6/PnzsXbt2kmSqh5EhLPOOgtHHHEEDjjgAACwck6lOlx99dVYvXo1Lrzwwsq9qSjvr371K1x++eV49rOfjZtvvhmnnnoqzjzzTHz5y18GMDVlfu9734uTTjoJ++67L5rNJg4++GAsX74cJ510EoCpKbPEWORbu3YtWq0Wdtttt9o0k4nh4WGcc845eNOb3oTZs2cDmHoyX3zxxWg0GjjzzDOj96eavOvWrcPmzZtx0UUX4ZhjjsF3v/tdvO51r8MJJ5yA2267bUrKnJAwFTCtj4LbFiilvN9EVLk2FXD66afjvvvuwx133FG5N1Xq8Nhjj+Gd73wnvvvd73o2OyGmiryA1joceuih+PCHPwwAOPjgg/HTn/4Ul19+Od761rfadFNJ5muuuQZf/epX8fWvfx37778/7r33XixfvhwLFy7EySefbNNNJZljeCryTYU6tNttvPGNb0RZlvjMZz7TM/1kyLxq1Sp84hOfwOrVq8dd9mS1MTsx/fVf/zXe9a53AQCe//zn484778QVV1yBo446qvbZqdAvEhImC0kDOE7svvvuyPO8smpct25dRTMx2TjjjDNwww034Ac/+AH23HNPe33BggUAMGXqsGrVKqxbtw6HHHIIGo0GGo0GbrvtNnzyk59Eo9GwMk0VeQFgjz32wHOf+1zv2n777WcdgaZaGwPA2WefjXPOOQdvfOMbceCBB2LZsmV417veZbWuU1FmibHIt2DBAoyOjuLJJ5+sTTMZaLfbeMMb3oA1a9ZgxYoVVvsHTC2ZV65ciXXr1mHvvfe23+Kvf/1rvPvd78af//mfTzl5AT0mNxqNnt/jVJI5IWEqIBHAcaLVauGQQw7BihUrvOsrVqzA4YcfPklS+SAinH766bj22mvx/e9/H4sXL/buL168GAsWLPDqMDo6ittuu21S6vCXf/mXuP/++3Hvvffaf4ceeije/OY3495778U+++wzpeQFgJe+9KWV0DoPPfQQFi1aBGDqtTGgPVKzzP/k8zy3GpSpKLPEWOQ75JBD0Gw2vTSPP/44HnjggUmrA5O/hx9+GLfccgvmzp3r3Z9KMi9btgz33Xef9y0uXLgQZ599Nm6++eYpJy+gx+TDDjus6/c41WROSJgSmBzfk6c3rr76amo2m/T5z3+eHnzwQVq+fDnNnDmTHnnkkckWjYiI/vEf/5EGBwfp1ltvpccff9z+GxoasmkuuugiGhwcpGuvvZbuv/9+Oumkk2iPPfagjRs3TqLkDtILmGjqyfujH/2IGo0GfehDH6KHH36Yvva1r9GMGTPoq1/96pSV+eSTT6ZnPOMZ9O1vf5vWrFlD1157Le2+++70nve8Z8rIvGnTJrrnnnvonnvuIQB0ySWX0D333GM9Zsci36mnnkp77rkn3XLLLbR69Wp6xSteQQcddBB1Op0dLnO73aalS5fSnnvuSffee6/3PY6MjEyKzL3aOEToBbyj5R2LzNdeey01m0268sor6eGHH6ZPfepTlOc5rVy5ctJkTkiY6kgE8Cni05/+NC1atIharRa94AUvsCFWpgIARP9dddVVNk1ZlnT++efTggULqK+vj172spfR/fffP3lCBwgJ4FSU97//+7/pgAMOoL6+Ptp3333pyiuv9O5PNZk3btxI73znO2nvvfem/v5+2meffejcc8/1iMhky/yDH/wg2ndPPvnkMcu3detWOv3002nOnDk0MDBAxx9/PD366KOTIvOaNWtqv8cf/OAHkyJzrzYOESOAU6mNGZ///OfpWc96FvX399NBBx1E119//aTKnJAw1aGIiLavjjEhISEhISEhIWEqIdkAJiQkJCQkJCRMMyQCmJCQkJCQkJAwzZAIYEJCQkJCQkLCNEMigAkJCQkJCQkJ0wyJACYkJCQkJCQkTDMkApiQkJCQkJCQMM2QCGBCQkJCQkJCwjRDIoAJCQkJCQkJCdMMiQAmJCSMGZ///OexZMmSSSn7n//5n3HmmWdOStkJCQkJOxvSSSAJCQljwsjICPbZZx9cffXVOPLII3d4+evWrcMzn/lM3HfffVi8ePEOLz8hISFhZ0LSACYkJIwJ3/rWt7DLLrtMCvkDgHnz5mHJkiW44oorJqX8hISEhJ0JiQAmJEwz/OEPf8CCBQvw4Q9/2F6766670Gq18N3vfrf2uauvvhpLly71rp1yyil47Wtfiw9/+MOYP38+dt11V3zgAx9Ap9PB2WefjTlz5mDPPffEF77wBfvMI488AqUUvvnNb+LII4/EwMAADjvsMDz00EO4++67ceihh2KXXXbBMcccgz/84Q9eeUuXLsU3vvGNCWqJhISEhOmLRAATEqYZ/uzP/gxf+MIXcMEFF+DHP/4xNm/ejLe85S34p3/6p672fStXrsShhx5auf79738fv/vd73D77bfjkksuwQUXXIDjjz8eu+22G+666y6ceuqpOPXUU/HYY495z51//vk477zzsHr1ajQaDZx00kl4z3veg0984hNYuXIlfvnLX+Jf//VfvWde+MIX4rHHHsOvf/3riWmMhISEhGmKZAOYkDBNcdppp+GWW27BYYcdhp/85Ce4++670d/fH027fv167Lbbbrj99tu9LeBTTjkFt956K371q18hy/R6ct9998W8efNw++23AwCKosDg4CA+97nP4Y1vfCMeeeQRLF68GJ/73Ofwtre9DYDWLp500kn43ve+h1e84hUAgIsuughf/OIX8fOf/9yWt3HjRgwODuLWW2/FUUcdtV3aJSEhIWE6IGkAExKmKT72sY+h0+ngm9/8Jr72ta/Vkj8A2Lp1KwBE0+y///6W/AHA/PnzceCBB9rfeZ5j7ty5WLdunffc8573PO8ZAN5z8+fPrzwzMDAAABgaGupZv4SEhISEeiQCmJAwTfGrX/0Kv/vd71CWZc8t1blz50IphSeffLJyr9lser+VUtFrZVnWPqeUil4Ln/nTn/4EQG9jJyQkJCQ8dSQCmJAwDTE6Ooo3v/nNOPHEE/Fv//ZveNvb3obf//73telbrRae+9zn4sEHH9yBUlbxwAMPoNlsYv/9959UORISEhKe7kgEMCFhGuLcc8/Fhg0b8MlPfhLvec97sN9++1l7vDq86lWvwh133LGDJIxj5cqV1nM4ISEhIeGpIxHAhIRphltvvRWXXnopvvKVr2D27NnIsgxf+cpXcMcdd+Dyyy+vfe7tb387brzxRmzYsGEHSuvjG9/4Bt7+9rdPWvkJCQkJOwuSF3BCQsKY8YY3vAEHH3ww3ve+9+3wsr/zne/g7LPPxn333YdGo7HDy09ISEjYmZA0gAkJCWPGRz/6Ueyyyy6TUvaWLVtw1VVXJfKXkJCQMAFIGsCEhISEhISEhGmGpAFMSEhISEhISJhmSAQwISEhISEhIWGaIRHAhISEhISEhIRphkQAExISEhISEhKmGRIBTEhISEhISEiYZkgEMCEhISEhISFhmiERwISEhISEhISEaYZEABMSEhISEhISphkSAUxISEhISEhImGb4//dL9wKw/fFiAAAAAElFTkSuQmCC", + "text/html": [ + "\n", + "
\n", + "
\n", + " Figure\n", + "
\n", + " \n", + "
\n", + " " + ], + "text/plain": [ + "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + }, { "name": "stdout", "output_type": "stream", @@ -11991,7 +14435,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.5" + "version": "3.10.13" } }, "nbformat": 4,