Files
simpeg/simpegPF/notebooks/SimPEG Tutorial - MAG Linear Problem.ipynb
T
D Fournier c0445e5db5 Modify Inv Integral function
Start example in a notebook
2016-01-15 00:01:24 -08:00

1291 lines
117 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Objective:** \n",
"\n",
"In this tutorial we will create a simple magnetic problem from scratch using the SimPEG framework.\n",
"\n",
"We are using the integral form of the magnetostatic problem. In the absence of free-currents or changing magnetic field, magnetic material can give rise to a secondary magnetic field according to:\n",
"\n",
"$$\\vec b = \\frac{\\mu_0}{4\\pi} \\int_{V} \\vec M \\cdot \\nabla \\nabla \\left(\\frac{1}{r}\\right) \\; dV $$\n",
"\n",
"Where $\\mu_0$ is the magnetic permealitity of free-space, $\\vec M$ is the magnetization per unit volume and $r$ defines the distance between the observed field $\\vec b$ and the magnetized object. Assuming a purely induced response, the strenght of magnetization can be written as:\n",
"\n",
"$$ \\vec M = \\mu_0 \\kappa \\vec H_0 $$\n",
"\n",
"where $\\vec H$ is an external inducing magnetic field, and $\\kappa$ the magnetic susceptibility of matter.\n",
"As derived by Sharma 1966, the integral can be evaluated for rectangular prisms such that:\n",
"\n",
"$$ \\vec b(P) = \\mathbf{T} \\cdot \\vec H_0 \\; \\kappa $$\n",
"\n",
"Where the tensor matrix $\\bf{T}$ relates the three components of magnetization $\\vec M$ to the components of the field $\\vec b$:\n",
"\n",
"$$\\mathbf{T} =\n",
"\t \\begin{pmatrix}\n",
" \t\tT_{xx} & T_{xy} & T_{xz} \\\\\n",
"\t\tT_{yx} & T_{yy} & T_{yz} \\\\\n",
"\t\tT_{zx} & T_{zy} & T_{zz} \n",
"\t\\end{pmatrix} $$\n",
" \n",
"In general, we discretize the earth into a collection of cells, each contributing to the magnetic data such that:\n",
"\n",
"$$\\vec b(P) = \\sum_{j=1}^{nc} \\mathbf{T}_j \\cdot \\vec H_0 \\; \\kappa_j$$\n",
"\n",
"giving rise to a linear problem.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Using matplotlib backend: nbAgg\n",
"Populating the interactive namespace from numpy and matplotlib\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\dominiquef.MIRAGEOSCIENCE\\AppData\\Local\\Continuum\\Anaconda\\lib\\site-packages\\IPython\\kernel\\__init__.py:13: ShimWarning: The `IPython.kernel` package has been deprecated. You should import from ipykernel or jupyter_client instead.\n",
" \"You should import from ipykernel or jupyter_client instead.\", ShimWarning)\n"
]
}
],
"source": [
"%matplotlib notebook\n",
"%pylab"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Efficiency Warning: Interpolation will be slow, use setup.py!\n",
"\n",
" python setup.py build_ext --inplace\n",
" \n"
]
}
],
"source": [
"from SimPEG import *\n",
"import simpegPF as PF"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [],
"source": [
"# First we need to define the direction of the inducing field\n",
"# As a simple case, we pick a vertical inducing field of magnitude 50,000nT. \n",
"# From old convention, field orientation is given as an azimuth from North \n",
"# (positive clockwise) and dip from the horizontal (positive downward).\n",
"H0 = np.array(([90.,0.,50000.]))\n",
"\n",
"# Assume all induced so the magnetization M is also in the same direction\n",
"M = np.array([90,0])\n",
"\n",
"# Create a mesh\n",
"hxind = [(5, 20)]\n",
"hyind = [(5, 20)]\n",
"hzind = [(5, 10)]\n",
"\n",
"mesh = Mesh.TensorMesh([hxind, hyind, hzind], 'CCC')\n",
"\n",
"# Assume flat topo for now, so all cells are active\n",
"nC = mesh.nC \n",
"actv = np.ones(nC)\n",
"\n",
"\n",
"# Create and array of observation points\n",
"xr = np.linspace(-20., 20., 20)\n",
"yr = np.linspace(-20., 20., 20)\n",
"X, Y = np.meshgrid(xr, yr)\n",
"Z = np.ones(X.size)*(mesh.vectorNz[-1]+1.) # Let just put the observation flat\n",
"\n",
"rxLoc = np.c_[Utils.mkvc(X.T), Utils.mkvc(Y.T), Utils.mkvc(Z.T)]\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now that we have all our spatial components, we can create our linear system. For a single location and single component of the data, the system would looks like this:\n",
"\n",
"$$ b_x =\n",
"\t\\begin{bmatrix}\n",
"\tT_{xx}^1 &... &T_{xx}^{nc} & T_{xy}^1 & ... & T_{xy}^{nc} & T_{xz}^1 & ... & T_{xz}^{nc}\\\\\n",
"\t \\end{bmatrix}\n",
"\t \\begin{bmatrix}\n",
"\t\t\\mathbf{M}_x \\\\ \\mathbf{M}_y \\\\ \\mathbf{M}_z\n",
"\t\\end{bmatrix} \\\\ $$\n",
"\n",
"where each of $T_{xx},\\;T_{xy},\\;T_{xz}$ are [nc x 1] long. For the $y$ and $z$ component, we need the two other rows of the tensor $\\mathbf{T}$.\n",
"In our simple induced case, the magnetization direction $\\mathbf{M_x,\\;M_y\\;,Mz}$ are known and assumed to be constant everywhere, so we can reduce the size of the system such that: \n",
"\n",
"$$ \\vec{\\mathbf{d}}_{\\text{pred}} = (\\mathbf{T\\cdot M})\\; \\kappa$$\n",
"\n",
"\n",
"\n",
"In most geophysical surveys, we are not collecting all three components, but rather the magnitude of the field, or $Total\\;Magnetic\\;Intensity$ (TMI) data.\n",
"Because the inducing field is really large, we will assume that the anomalous fields are parallel to $H_0$:\n",
"\n",
"$$ d^{TMI} = \\hat H_0 \\cdot \\vec d$$\n",
"\n",
"We then end up with a much smaller system:\n",
"\n",
"$$ d^{TMI} = \\mathbf{F\\; \\kappa}$$\n",
"\n",
"where $\\mathbf{F} \\in \\mathbb{R}^{nd \\times nc}$ is our $forward$ operator."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Begin calculation of forward operator: tmi\n",
"Done 0.0 %\n",
"Done 10.0 %\n",
"Done 20.0 %\n",
"Done 30.0 %\n",
"Done 40.0 %\n",
"Done 50.0 %\n",
"Done 60.0 %\n",
"Done 70.0 %\n",
"Done 80.0 %\n",
"Done 90.0 %\n",
"Done 100% ...forward operator completed!!\n",
"\n"
]
}
],
"source": [
"# First, convert the magnetization direction to Cartesian\n",
"mi = np.ones(mesh.nC) * M[0]\n",
"md = np.ones(mesh.nC) * M[1]\n",
"M_xyz = PF.Magnetics.dipazm_2_xyz( mi , md ) # Ouputs an nc x 3 array\n",
"\n",
"# Create the forward model operator\n",
"F = PF.Magnetics.Intrgl_Fwr_Op(mesh,H0,M_xyz,rxLoc,actv,'tmi')"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\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('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",
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(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",
" 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",
" fig.waiting = false;\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.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 = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\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",
"\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",
"\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]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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, 0, fig.canvas.width, fig.canvas.height);\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",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = 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.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",
" /* 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",
" evt.data.type = \"image/png\";\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",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://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",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\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",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step});\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",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value});\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",
"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\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";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.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",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['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 = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\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.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\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).html('<img src=\"' + dataURL + '\">');\n",
" fig.send_message('closing', {});\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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 () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-danger\" href=\"#\" title=\"Close figure\"><i class=\"fa fa-times icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Close figure', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('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",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\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('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# We can now create a susceptibility model and generate data\n",
"# Lets start with a simple block in half-space\n",
"model = np.zeros((mesh.nCx,mesh.nCy,mesh.nCz))\n",
"model[8:11,8:11,6:9] = 0.01\n",
"model = mkvc(model)\n",
"\n",
"# Create a few models\n",
"figure()\n",
"ax = subplot(211)\n",
"mesh.plotSlice(model, ax = ax, normal = 'Y', ind=10)\n",
"title('A simple block model.')\n",
"xlabel('x');ylabel('y')\n",
"plt.gca().set_aspect('equal', adjustable='box')\n",
"\n",
"# We can now generate data\n",
"data = F.dot(model) #: this is matrix multiplication!!\n",
"subplot(212)\n",
"imshow(data.reshape(X.shape))\n",
"title('Predicted data.')\n",
"plt.gca().set_aspect('equal', adjustable='box')\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"class LinearSurvey(Survey.BaseSurvey):\n",
" def projectFields(self, u):\n",
" return u\n",
" \n",
" @property\n",
" def nD(self):\n",
" return self.prob.G.shape[1]\n",
"\n",
"class LinearProblem(Problem.BaseProblem):\n",
" \n",
" surveyPair = LinearSurvey\n",
"\n",
" def __init__(self, mesh, G, **kwargs):\n",
" Problem.BaseProblem.__init__(self, mesh, **kwargs)\n",
" self.G = G\n",
"\n",
" def fields(self, m):\n",
" return self.G.dot(m)\n",
"\n",
" def Jvec(self, m, v, u=None):\n",
" return self.G.dot(v)\n",
"\n",
" def Jtvec(self, m, v, u=None):\n",
" return self.G.T.dot(v)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Once we have our problem, we can use the inversion tools in SimPEG to run our inversion:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"prob = LinearProblem(mesh, F)\n",
"prob.solverOpts['accuracyTol'] = 1e-4\n",
"survey = LinearSurvey()\n",
"survey.pair(prob)\n",
"#survey.makeSyntheticData(data, std=0.01)\n",
"survey.dobs=data\n",
"survey.std = np.ones(len(data))*0.01\n",
"survey.mtrue = model\n",
"\n",
"reg = Regularization.Tikhonov(mesh)\n",
"dmis = DataMisfit.l2_DataMisfit(survey)\n",
"opt = Optimization.ProjectedGNCG(maxIter=35,lower=0.,upper=1.)\n",
"invProb = InvProblem.BaseInvProblem(dmis, reg, opt)\n",
"beta = Directives.BetaSchedule()\n",
"betaest = Directives.BetaEstimate_ByEig()\n",
"target = Directives.TargetMisfit()\n",
"inv = Inversion.BaseInversion(invProb, directiveList=[beta, betaest, target])\n",
"m0 = np.zeros_like(survey.mtrue)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<SimPEG.Directives.BetaSchedule at 0x1653ed30>"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Directives.BetaSchedule()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Explore the documentation to see what other parameters you can tweak in the different elements of the inversion, but let's check how well we recovered the model just by using the default parameters:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"SimPEG.InvProblem is setting bfgsH0 to the inverse of the eval2Deriv.\n",
" ***Done using same solver as the problem***\n",
"=============================== Projected GNCG ===============================\n",
" # beta phi_d phi_m f |proj(x-g)-x| LS Comment \n",
"-----------------------------------------------------------------------------\n",
" 0 3.73e+12 1.37e+06 0.00e+00 1.37e+06 4.24e+01 0 \n",
"------------------------------------------------------------------\n",
"0 : ft = 1.7528e+14 <= alp*descent = 1.6470e+06\n",
"1 : maxIterLS = 10 <= iterLS = 10\n",
"------------------------- End Linesearch -------------------------\n",
"The linesearch got broken. Boo.\n"
]
}
],
"source": [
"mrec = inv.run(m0)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"min(mrec)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"plt.figure()\n",
"ax = subplot()\n",
"mesh.plotSlice(mrec, ax = ax, normal = 'Y', ind=10)\n",
"title('Recovered model.')\n",
"xlabel('x');ylabel('y')\n",
"plt.gca().set_aspect('equal', adjustable='box')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Hopefully you now have an idea of how to create a Problem class in SimPEG, and how this can be used with the other tools available."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"reg.W"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"class MagProblem(object):\n",
" \n",
" def __init__(self, mesh, **kwargs):\n",
" self.mesh = mesh\n",
" Utils.setKwargs(self, **kwargs)\n",
" \n",
" @property\n",
" def dtype(self):\n",
" return getattr(self, '_dtype', 'tmi')\n",
" @dtype.setter\n",
" def dtype(self, val):\n",
" assert type(val) is str, 'dtype must be a string'\n",
" assert val in ['tmi', 'xyz'], 'dtype must be either \"tmi\" or \"xyz\"'\n",
" self._dtype = val\n",
" \n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"p = MagProblem(M, dtype='xyz')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"p.dtype"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"p.dtype"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"d.height = 4\n",
"print d.height"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"M = Mesh.TensorMesh([5,5])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"M._cellGrad"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.11"
}
},
"nbformat": 4,
"nbformat_minor": 0
}