921 lines
89 KiB
Text
921 lines
89 KiB
Text
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Flame Temperature\n",
|
|
"\n",
|
|
"This example demonstrates calculation of the adiabatic flame temperature for a methane/air mixture, comparing calculations which assume either complete or incomplete combustion."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"%matplotlib notebook\n",
|
|
"import cantera as ct\n",
|
|
"import numpy as np\n",
|
|
"import matplotlib.pyplot as plt"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Complete Combustion\n",
|
|
"\n",
|
|
"The stoichiometric equation for complete combustion of a lean methane/air mixture ($\\phi < 1$) is:\n",
|
|
"\n",
|
|
"$$\\mathrm{\\phi CH_4 + 2(O_2 + 3.76 N_2) \\rightarrow \\phi CO_2 + 2\\phi H_2O + 2 (1-\\phi) O_2 + 7.52 N_2}$$\n",
|
|
"\n",
|
|
"For a rich mixture ($\\phi > 1$), this becomes:\n",
|
|
"\n",
|
|
"$$\\mathrm{\\phi CH_4 + 2(O_2 + 3.76 N_2) \\rightarrow CO_2 + 2 H_2O + (\\phi - 1) CH_4 + 7.52 N_2}$$\n",
|
|
"\n",
|
|
"To find the flame temperature resulting from these reactions using Cantera, we create a gas object containing only the species in the above stoichiometric equations, and then use the `equilibrate()` function to find the resulting mixture composition and temperature, taking advantage of the fact that equilibrium will strongly favor conversion of the fuel molecule."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Get all of the Species objects defined in the GRI 3.0 mechanism\n",
|
|
"species = {S.name: S for S in ct.Species.listFromFile('gri30.cti')}\n",
|
|
"\n",
|
|
"# Create an IdealGas object with species representing complete combustion\n",
|
|
"complete_species = [species[S] for S in ('CH4','O2','N2','CO2','H2O')]\n",
|
|
"gas1 = ct.Solution(thermo='IdealGas', species=complete_species)\n",
|
|
"\n",
|
|
"phi = np.linspace(0.5, 2.0, 100)\n",
|
|
"T_complete = np.zeros(phi.shape)\n",
|
|
"for i in range(len(phi)):\n",
|
|
" gas1.TP = 300, ct.one_atm\n",
|
|
" gas1.set_equivalence_ratio(phi[i], 'CH4', 'O2:1, N2:3.76')\n",
|
|
" gas1.equilibrate('HP')\n",
|
|
" T_complete[i] = gas1.T "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Incomplete Combustion\n",
|
|
"\n",
|
|
"In the case of incomplete combustion, the resulting mixture composition is not known in advance, but must be found by calculating the equilibrium composition at constant enthalpy and temperature:\n",
|
|
"\n",
|
|
"$$\\mathrm{\\phi CH_4 + 2(O_2 + 3.76 N_2) \\rightarrow ? CO_2 + ? CO + ? H_2 + ? H_2O + ? O_2 + 7.52 N_2 + minor\\ species}$$\n",
|
|
"\n",
|
|
"Now, we use a gas phase object containing all 53 species defined in the GRI 3.0 mechanism, and compute the equilibrium composition as a function of equivalence ratio."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Create an IdealGas object including incomplete combustion species\n",
|
|
"gas2 = ct.Solution(thermo='IdealGas', species=species.values())\n",
|
|
"T_incomplete = np.zeros(phi.shape)\n",
|
|
"for i in range(len(phi)):\n",
|
|
" gas2.TP = 300, ct.one_atm\n",
|
|
" gas2.set_equivalence_ratio(phi[i], 'CH4', 'O2:1, N2:3.76')\n",
|
|
" gas2.equilibrate('HP')\n",
|
|
" T_incomplete[i] = gas2.T"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"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",
|
|
" };\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",
|
|
" fig.waiting = false;\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",
|
|
" 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(\"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",
|
|
"/*\n",
|
|
" * return a copy of an object with only non-object keys\n",
|
|
" * we need this to avoid circular references\n",
|
|
" * http://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",
|
|
" 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",
|
|
" {\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",
|
|
" guiEvent: simpleKeys(event)});\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",
|
|
" 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",
|
|
"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",
|
|
" fig.root.unbind('remove')\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).html('<img src=\"' + dataURL + '\">');\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 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-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></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",
|
|
" 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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4XuydB3gU5faH39ARkKJIRKUpTZCiCKiASO9d6UUEwYLw517FWK8VUS9eEUuwUFQwVOkgTVGpSpMqRQTBCEovoeb/nJmNWWJIdnd2Z3d2zvc83AtmvnLe883mt185JwYtSkAJKAEloASUgBJQAq4iEOMqa9VYJaAElIASUAJKQAkoAVQA6iRQAkpACSgBJaAElIDLCKgAdJnD1VwloASUgBJQAkpACagA1DmgBJSAElACSkAJKAGXEVAB6DKHq7lKQAkoASWgBJSAElABqHNACSgBJaAElIASUAIuI6AC0GUOV3OVgBJQAkpACSgBJaACUOeAElACSkAJKAEloARcRkAFoMscruYqASWgBJSAElACSkAFoM4BJaAElIASUAJKQAm4jIAKQJc5XM1VAkpACSgBJaAElIAKQJ0DSkAJKAEloASUgBJwGQEVgC5zuJqrBJSAElACSkAJKAEVgDoHlIASUAJKQAkoASXgMgIqAF3mcDVXCSgBJaAElIASUAIqAHUOKAEloASUgBJQAkrAZQRUALrM4WquElACSkAJKAEloARUAOocUAJKQAkoASWgBJSAywioAHSZw9VcJaAElIASUAJKQAmoANQ5oASUgBJQAkpACSgBlxFQAegyh6u5SkAJKAEloASUgBJQAahzQAkoASWgBJSAElACLiOgAtBlDldzlYASUAJKQAkoASWgAlDngBJQAkpACSgBJaAEXEZABaDLHK7mKgEloASUgBJQAkpABaDOASWgBJSAElACSkAJuIyACkCXOVzNVQJKQAkoASWgBJSACkCdA0pACSgBJaAElIAScBkBFYAuc7iaqwSUgBJQAkpACSgBFYA6B5SAElACSkAJKAEl4DICKgBd5nA1VwkoASWgBJSAElACKgB1DigBJaAElIASUAJKwGUEVAC6zOFqrhJQAkpACSgBJaAEVADqHFACSkAJKAEloASUgMsIqAB0mcPVXCWgBJSAElACSkAJqADUOaAElIASUAJKQAkoAZcRUAHoMoeruUpACSgBJaAElIASUAGoc0AJKAEloASUgBJQAi4joALQZQ5Xc5WAElACSkAJKAEloAJQ54ASUAJKQAkoASWgBFxGQAWgyxyu5ioBJaAElIASUAJKwGkC8Cmg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\">"
|
|
],
|
|
"text/plain": [
|
|
"<IPython.core.display.HTML object>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plt.plot(phi, T_complete, label='complete combustion', lw=2)\n",
|
|
"plt.plot(phi, T_incomplete, label='incomplete combustion', lw=2)\n",
|
|
"plt.grid(True)\n",
|
|
"plt.xlabel('Equivalence ratio, $\\phi$')\n",
|
|
"plt.ylabel('Temperature [K]');"
|
|
]
|
|
},
|
|
{
|
|
"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.4.3"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 0
|
|
}
|