{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Source : \n", "\n", "gits https://gist.github.com/Juanlu001/10305c7730a5b17f6148\n", "original post https://jasmcole.com/2014/08/25/helmhurts/\n", "\n", "\n", "Other cool stuff:\n", "https://fenicsproject.org/qa/6386/helmholtz-equation-with-absorbent-subdomain" ] }, { "cell_type": "code", "execution_count": 91, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib notebook" ] }, { "cell_type": "code", "execution_count": 92, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from fenics import *" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, we will solve this on the unit square. Let's build a mesh." ] }, { "cell_type": "code", "execution_count": 93, "metadata": { "collapsed": true }, "outputs": [], "source": [ "nx = ny = 30\n", "mesh = RectangleMesh(Point(-1, -1), Point(1, 1), nx, ny)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's define the function space upon which we will build." ] }, { "cell_type": "code", "execution_count": 94, "metadata": { "collapsed": true }, "outputs": [], "source": [ "V = FunctionSpace(mesh, 'P', 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our field will be $E$ and also, we'll define a test function.\n", "\n", "Woah I learned this the hard way:\n", "\n", "- the unknown is a trial function\n", "- the v field is a test function\n", "\n", "Later, I overwrite E with a function." ] }, { "cell_type": "code", "execution_count": 109, "metadata": { "collapsed": true }, "outputs": [], "source": [ "u = TrialFunction(V)\n", "v = TestFunction(V)" ] }, { "cell_type": "code", "execution_count": 110, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABcAAAAcCAYAAACK7SRjAAAABHNCSVQICAgIfAhkiAAAAX9JREFU\nSInt1L9LVWEcBvCPGSEpLUE0hEncQUjwSpMIkoOIuyAEQv+AWKNDu0KDm2NuQVspgTQEgogtaYmL\nBhEFNmQmRoVKDu974HC8p+u59w4RPXB4z3l43uf7k8Nfin48wyf8xt2s4Fwd5m3YwAR+1OFTFQca\nnHlV/Bvmk8LUx3O0N/ALr9BU1Hw9nl052mlcwP2YRFWcT72/iefNCro+jOAJliPXhlIqyXaUsYsP\nlYJ9wdcM14RV/ERHir8tVJB95vIqeRkF11LcnchN5V06K2ai0VD8bsF7fMalombZVUz6ngz1Hq7j\nAfYz2mm8KBLslpD5I1zBN7xFcwXtIh4WMW/BkbDLszHQYI52B2NFzGFT2IwjLORorsbAo3iO73iH\ngWrmj+PFQ3TmaIajZkmorISneH3WCv6ESewJFSQYw8e0qNYfVxnzQt8TlLDdKPOVDNeDtXrNLwpZ\nZvt7yrwW9OIYrSnusjDgclpYS+bd2BLWL0GPsF2bNfj9RwNxAvh3UJ3D0p/VAAAAAElFTkSuQmCC\n", "text/latex": [ "${v_h^{1}}$" ], "text/plain": [ "Argument(FunctionSpace(Mesh(VectorElement(FiniteElement('Lagrange', triangle, 1), dim=2), 98), FiniteElement('Lagrange', triangle, 1)), 1, None)" ] }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "u" ] }, { "cell_type": "code", "execution_count": 111, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAABcAAAAcCAYAAACK7SRjAAAABHNCSVQICAgIfAhkiAAAAbNJREFU\nSInt1b1rVEEUxuEnChIUbBRJEVQkhYJgQioVBYsg/gULQjptAoKWKaw1YKFYWFhYiqUogkkhiCgK\nwS9Io6KFhVsEPzAQTUSLMxfGMTdm725h4dsM886Z35yZOXcu/7Am8BaLmMWhXoFbWMJJ7MFlfMX2\nXsAf42rhvcK5qrOuIXgDRjFd+NM40C18K9ajXfhtDHQLr/Sz6PflXg6fTAOnakC78A1PMI8feZZJ\n22S7yeHPU7u3Bj4lzvpMWmQWY0XMGB6uNHkwZf5ghbGDaexG5rXwHSdEKV4SpbijJjnz+Fh4faLs\nFrGzGJvAu2wnh+vAcC9lOJh5x5N3frWJa9HFBDqa+v0pszY2dworS/FFaqtLPS3O8Cy+FLFTmOlk\nsVGR+TVRVp/xUnwwpe7iQifwfiyLWr6SFirLrdIHjHcChzlRGcu4XRMzkBZu4Q4W8AZH/ga/niYu\nYXdNzLEUc1/sbAg38XStO1hNk/jk989/HO/zoKYP1zBuiXOvNITXvYI/KrwRPOsWvlFkWZ7vH/Am\n2i+e202Zt0Vc8HAe2CTzfeJfuZB5I6K65hrw/quH+gV7m13JgkalrAAAAABJRU5ErkJggg==\n", "text/latex": [ "${v_h^{0}}$" ], "text/plain": [ "Argument(FunctionSpace(Mesh(VectorElement(FiniteElement('Lagrange', triangle, 1), dim=2), 98), FiniteElement('Lagrange', triangle, 1)), 0, None)" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our boundary conditions will be null values on the boundary." ] }, { "cell_type": "code", "execution_count": 112, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def boundary(x, on_boundary):\n", " \"Function to call for boundary conditions.\"\n", " return on_boundary" ] }, { "cell_type": "code", "execution_count": 124, "metadata": { "collapsed": false }, "outputs": [], "source": [ "u_D = Expression('0.', degree=2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now define a Dirichlet boundary condition that gets applied to the function space V, and evaluates u_D when on the boundary." ] }, { "cell_type": "code", "execution_count": 125, "metadata": { "collapsed": true }, "outputs": [], "source": [ "bc = DirichletBC(V, u_D, boundary)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's now define the terms used in the equation: the speed of light." ] }, { "cell_type": "code", "execution_count": 166, "metadata": { "collapsed": false }, "outputs": [], "source": [ "one_over_c_squared = Constant(100.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, let's write the problem:" ] }, { "cell_type": "code", "execution_count": 167, "metadata": { "collapsed": false }, "outputs": [], "source": [ "a = Constant(-1) * dot(grad(u), grad(v))*dx + one_over_c_squared*u*v*dx\n", "L = v*dx" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Applying a point source:\n", "https://fenicsproject.org/qa/2893/point-source-in-rhs-of-heat-eq" ] }, { "cell_type": "code", "execution_count": 168, "metadata": { "collapsed": false }, "outputs": [], "source": [ "A, b = assemble_system(a, L, bc)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And the point source." ] }, { "cell_type": "code", "execution_count": 169, "metadata": { "collapsed": false }, "outputs": [], "source": [ "source = Point(0.0, 0.0)" ] }, { "cell_type": "code", "execution_count": 170, "metadata": { "collapsed": true }, "outputs": [], "source": [ "delta = PointSource(V, source, 1)\n", "delta.apply(b)" ] }, { "cell_type": "code", "execution_count": 171, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 171, "metadata": {}, "output_type": "execute_result" } ], "source": [ "E = Function(V)\n", "solve(A, E.vector(), b)" ] }, { "cell_type": "code", "execution_count": 172, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 173, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\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 = $('
');\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", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\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", " 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", " '
');\n", " var titletext = $(\n", " '
');\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 = $('
');\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 = $('');\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 backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband = $('');\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 * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\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 = $('
')\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 = $('');\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 = $('');\n", " nav_element.append(status_bar);\n", " this.message = status_bar[0];\n", "\n", " // Add the close button to the window.\n", " var buttongrp = $('
');\n", " var button = $('');\n", " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", " buttongrp.append(button);\n", " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", " titlebar.prepend(buttongrp);\n", "}\n", "\n", "mpl.figure.prototype._root_extra_style = function(el){\n", " var fig = this\n", " el.on(\"remove\", function(){\n", "\tfig.close_ws(fig, {});\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", " // 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", "\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= 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": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 186, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plt.figure()\n", "plt.pcolormesh(x, y, vals)" ] }, { "cell_type": "code", "execution_count": 191, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 213, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from moviepy.video.io.bindings import mplfig_to_npimage\n", "\n", "fig, ax = plt.subplots(1, figsize=(4, 4), facecolor=(1,1,1))\n", "duration = 2.\n", "def make_frame(t):\n", " ax.clear()\n", " ax.pcolormesh(x, y, vals * np.sin(2 * np.pi * t / duration), vmin=vals.min(), vmax=vals.max())\n", " return mplfig_to_npimage(fig)\n", "animation = moviepy.editor.VideoClip(make_frame, duration=duration)" ] }, { "cell_type": "code", "execution_count": 216, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ " 95%|█████████▌| 20/21 [00:01<00:00, 12.22it/s]\n" ] }, { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "execution_count": 216, "metadata": {}, "output_type": "execute_result" } ], "source": [ "moviepy.editor.ipython_display(animation, fps=10)" ] }, { "cell_type": "code", "execution_count": 215, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "[MoviePy] Building file test2.gif with imageio\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " 98%|█████████▊| 40/41 [00:04<00:00, 8.94it/s]\n" ] } ], "source": [ "animation.write_gif('test2.gif', fps=20)" ] }, { "cell_type": "code", "execution_count": 212, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 212, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nQNDJRlGUQPg/wJrNt3nIzRIAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "t=0.3\n", "fig, ax = plt.subplots(1, figsize=(4, 4), facecolor=(1,1,1))\n", "duration = 2.\n", "ax.clear()\n", "ax.pcolormesh(x, y, vals * np.sin(2 * np.pi * t / duration), vmin=vals.min(), vmax=vals.max())" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "vmin=vals.min()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" }, "widgets": { "state": { "935db5c055bc4c4dbb1b52d87955c071": { "views": [ { "cell_index": 30 } ] } }, "version": "1.2.0" } }, "nbformat": 4, "nbformat_minor": 0 }