{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Airy stress functions method" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The method of Airy stress functions is a method to find the stress distribution in an\n", "elastic solid. The method uses a Airy stress function $\\varphi$, a\n", "[scalar potential](https://en.wikipedia.org/wiki/Potential_theory), and can be used\n", "when:\n", "\n", "- The problem is two dimensional.\n", "- The body forces are derivable from a potential function $V$, i.e.,\n", "\n", "$$\\mathbf{b} = -\\nabla V\\, .$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Computation of stresses" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The stresses are computed from the Airy functions as\n", "\n", "\\begin{align}\n", "\\sigma_{xx} &= \\frac{\\partial^2 \\varphi}{\\partial y^2}\\\\\n", "\\sigma_{yy} &= \\frac{\\partial^2 \\varphi}{\\partial x^2}\\\\\n", "\\sigma_{xy} &= -\\frac{\\partial^2 \\varphi}{\\partial x \\partial y}\\, ,\n", "\\end{align}\n", "\n", "in Cartesian coordinates, and\n", "\n", "\\begin{align}\n", "\\sigma_{rr} &= \\frac{1}{r}\\frac{\\partial \\varphi}{\\partial r} + \\frac{1}{r^2}\\frac{\\partial^2 \\varphi}{\\partial r^2}\\\\\n", "\\sigma_{\\theta\\theta} &= \\frac{\\partial^2 \\varphi}{\\partial r^2}\\\\\n", "\\sigma_{r\\theta} &= -\\frac{\\partial}{\\partial r}\\left(\\frac{1}{r}\\frac{\\partial \\varphi}{\\partial \\theta}\\right)\\, ,\n", "\\end{align}\n", "\n", "in polar coordinates.\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Airy stress functions are biharmonic" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In 2D, the compatibility equations and equilibrium imply\n", "\n", "$$\\nabla^2 \\sigma_v = \\frac{4}{1 + \\kappa} \\nabla^2 V\\, ,$$\n", "\n", "where $\\sigma_v = \\mathrm{Tr}\\,(\\sigma)$ is the volumetric component of the\n", "stress tensor, and\n", "\n", "$$\\kappa =\n", "\\begin{cases}\n", "3 - 4\\nu\\quad \\text{plane strain}\\\\\n", "\\frac{3 - \\nu}{1 + \\nu}\\quad \\text{plane strain}\n", "\\end{cases}$$\n", "\n", "Then, plugging the Airy stress function into this equation leads to\n", "\n", "$$\\nabla^2 \\nabla^2 \\varphi = -\\frac{2(\\kappa - 1)}{(1 + \\kappa)} \\nabla^2 V$$\n", "\n", "or, just\n", "\n", "$$\\nabla^4 \\varphi = -\\frac{2(\\kappa - 1)}{(1 + \\kappa)} \\nabla^2 V$$\n", "\n", "for short.\n", "\n", "This means that the Airy stress functions are biharmonic, that is,\n", "they satisfy the above equation." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from sympy import *\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from matplotlib import rcParams" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "x, y, z, t = symbols('x y z t')\n", "f, g, h = symbols('f g h', cls=Function)\n", "init_printing()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "%matplotlib notebook\n", "plt.style.use(\"seaborn-notebook\")\n", "plt.rcParams[\"image.cmap\"] = \"RdYlBu_r\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following cell contains the routines that we will use in the remaining\n", "part of the notebook." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def poly_airy(x, y, order, coeff=\"c\"):\n", " \"\"\"Return a polynomial of a given order in x and y\n", " \n", " The coefficients of the polynomial are returned as a set in the\n", " variable ``c``.\n", " \"\"\"\n", " num = (order**2 + 3*order + 2)/2\n", " c = symbols('%s0:%d' % (coeff, num))\n", " terms = [x**(order - k - j) * y**k\n", " for j in range(0, order - 1)\n", " for k in range(0, order + 1 - j)]\n", " phi = sum(c[k]*term for k, term in enumerate(terms))\n", " return phi, c\n", "\n", "\n", "def airy_stress(phi, x, y):\n", " \"\"\"Return stresses from the Airy stress function\n", " \n", " The coordinate system is Cartesian\n", " \"\"\"\n", " return diff(phi, y, 2), diff(phi, x, 2), -diff(phi, y, 1, x, 1)\n", "\n", "\n", "def conds2eqs(conds, var=(x, y)):\n", " \"\"\"Turn the list of boundary conditions into equations to be solved\n", " \n", " In general, the final list can have repeated equations. Thus, we\n", " are removing those before returning it.\n", " \"\"\"\n", " eqlist = [coef for cond in conds for coef in Poly(cond, var).coeffs()]\n", " return list(set(eqlist))\n", "\n", "\n", "def plot_contours(x_coord, y_coord, field, fig=None, figsize=(7, 2), lines=True):\n", " \"\"\"Plot the contours for a solution\"\"\"\n", " if fig is None:\n", " fig = plt.figure(figsize=figsize)\n", " f_max = max(np.max(field), -np.min(field))\n", " plt.contourf(x_coord, y_coord, field, vmin=-f_max, vmax=f_max)\n", " plt.colorbar()\n", " if lines:\n", " plt.contour(x_coord, y_coord, field, colors=\"k\")\n", " plt.axis(\"image\")\n", " return fig" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solutions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Cantilever beam with load at the end\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A cantilever beam is a beam that is *anchored* at one end. In this case,\n", "the beam has length $L$ and height $h$. The force $F$ is applied at\n", "$x=L$." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "L, h, F = symbols(\"L h F\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To choose the Airy polynomial we need to fix the maximum power. This\n", "seem to be arbitrary, but we can use the intuition that we have grasped\n", "in the study of resistance of materials. Taking that into account,\n", "we should have stresses with powers of two, then the Airy stress functions\n", "should have at least powers of 4.\n", "\n", "Picking 4 as maximum power will let us recover the desired\n", "solution, but in general we don't know this beforehand, and we should\n", "use a trial and error procedure. You could try with a maximum power of\n", "10 for this example and it should still give you the same answer. \n", "It will take a while, though." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle c_{0} x^{4} + c_{1} x^{3} y + c_{10} x y + c_{11} y^{2} + c_{2} x^{2} y^{2} + c_{3} x y^{3} + c_{4} y^{4} + c_{5} x^{3} + c_{6} x^{2} y + c_{7} x y^{2} + c_{8} y^{3} + c_{9} x^{2}$" ], "text/plain": [ " 4 3 2 2 2 3 4 3 \n", "c₀⋅x + c₁⋅x ⋅y + c₁₀⋅x⋅y + c₁₁⋅y + c₂⋅x ⋅y + c₃⋅x⋅y + c₄⋅y + c₅⋅x + c₆⋅x\n", "\n", "2 2 3 2\n", " ⋅y + c₇⋅x⋅y + c₈⋅y + c₉⋅x " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "phi, c = poly_airy(x, y, 4)\n", "\n", "phi" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle 2 \\left(c_{11} + c_{2} x^{2} + 3 c_{3} x y + 6 c_{4} y^{2} + c_{7} x + 3 c_{8} y\\right)$" ], "text/plain": [ " ⎛ 2 2 ⎞\n", "2⋅⎝c₁₁ + c₂⋅x + 3⋅c₃⋅x⋅y + 6⋅c₄⋅y + c₇⋅x + 3⋅c₈⋅y⎠" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle 2 \\left(6 c_{0} x^{2} + 3 c_{1} x y + c_{2} y^{2} + 3 c_{5} x + c_{6} y + c_{9}\\right)$" ], "text/plain": [ " ⎛ 2 2 ⎞\n", "2⋅⎝6⋅c₀⋅x + 3⋅c₁⋅x⋅y + c₂⋅y + 3⋅c₅⋅x + c₆⋅y + c₉⎠" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY8AAAAYCAYAAAACjnGoAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAJtUlEQVR4Ae2di3HVOBSGkwwFBLaCJR3AUAHQAWwHkA5CCQx0wNLBQgdABQE6gA6AdJD9P0dSJPlt617r2tKMsHQsy+f856GXbzi+vr4+2kI6Pj5+IzlPle8r/1R+JdmvdC2pIFAQ8BAovuKBUYqtCBxvYfAwzvBOsjJoHKn+QZf7qj9sRabcKAhsEIHiKxtU+kSRTyY+d2iPPYsYfq36AzkKq5CSCgIFgVsEiq/cYlFKHQhsZfAAAn+gsNtVPq0DpnKrILApBHy/KL6yKdUPF/bO8KaH21LbU2cR9w9M/WtEL9WCwKYRKL6yafWPEn5LKw8fGA7Py4G5j0gpFwSaESi+0ozL5qlJDszN2cG5hyYzew6oP3q0LIrmQPBUvPn8ZsHbGpgQvuj+vODbrs1D8ZelfcXg9MogabfSmPR9b0d3fXeyxUGKOJqTpSqUykDh+lGdQze+AX7p05cuw49ywOvSPK3t/cL3h/KntcmVSh5hcxD+Ij4X9RW9n8/qP/i4q84qiLjyxKevuSxZs8UhxbYVA8VLjY7uKw0p06447KxBTZZN4u+JODgTb9WKg7qyPftYlrmVvF14XkiUeysRZ1diZO8vmfjKeyngha8E+S7xhAN8PrXfSsoWhxSDB0tIFEqukoyP0ZLkaDfVZf41gwSzlkuVn5FVxhCr330sw9W63ipMmVGj74Jpt2qz9peMfIXJ3rcGKD+Ldmr4bLi9OlK2OMz+2kqzAZR5N1IZApPe3VwW//eLOGBAC2Ys4j2LwW1xdNIwwDnHKzl1OUvqwPMA/CUXX2ESwm+xOJ/csp9mi0OSA3PfV1C26swYPhJM/Hu2rDasAn7Zuq6f1XbUIZh5D/uypEfKvIvZL1tRfyn/Up9vdc0ypcAgF8EkC3pAhz9VRve/VX7axF8KudUHNjZI915bPtf+4duE7mEv8Pu36IsEKMPfTv0ldwyE/+AkWThTQ293Y53p3mbiyi5xGGov7pBbiphVNgpFeSiXFQczhqBP04b7z+w9lXGcb7bOVYkBIKBF9wkebyxNZQIJ/V6Y5ym3Pm+fW+IqvjD8WRggpzJYV9cl5LDvFA/oosIdmhL6rB2Yi9Yrt9ogE7bzyVybbGiU7unT8MVW5R/Lt6GBn4qhne6jrveCx2x/MX0gB7ixsm7CLEsMxuIs2djRwMic79OHUq9tmXbgbf2m9jGP7o2yrbH8p2ovPifhYGTHD5DT5Zgv2hm8On0mCO5xJ1Prhsk/ugZfRagOLVY8Bl8NJroyaFgnYJbYyB99KDsnMXWsqKLpitD87arG55eki69ZGOh5BkqHocrIGnyVsk/5fF54r1Lb4NEnNzp1OlMZu6hNAEQbrHv6U7a2hV0F/anOIFUb6PaJn8EMmab4CzK5IKgy9UAe1Q8CgyGYSxYmXTVbF63Ttjy7rOKRwSSYSHh6yD6uTMUB7JRx0jg7m9G9wfaittUIhMOjmCGZtg/6lK02KJRsAzqG7QJ81/NqR0DsGjycgj3DcAB09T3mHrwrJ8NGfc3GAFyU40F5KK6p5UFPgS2oXhs8ROuVW22Qyx88mEggl6MZXQ/WvZ51bVXGFt0KyfRF/wHNtw+eV06mf7/vuKz3jPYXPQOu/kSCiYW6vp00qT4LA7+vrjLvUd4ZVuobWWuf2Rt6p/2rDSszN+ioDK81vUP3ZVS9Zsv+/aay6TtXHBg8WLX4mQmUkzsqd/rM7Jm5XsZIFTg4oCrBFAU784ORQQGeZ5RbB49YaWrbGQTi9kvVxecsDPQ8Ro+sccCmX7cVuA/5DC8ucNl3il5zONF65VabYFBUHbtC1mCgtO+xV9OmFgjsfa70Ydr5TmIHpwBL/7ldlMVHcn+xfKpvAmyjj4meDQaW36FX8V5tyzW1170htjXJP9R3VnElAQ5BjFB/xNlG/4KujPytPnNHN+cmnJ4/c147wLIdmwMYAt+oQ3H7fNdVfRMESHz1lW1KhAGBh3R1c3H//lbpnqvtp4Bx3ZdczGb8hD6uDP1S5X+Ve3WvwDD674+N0P1z8fBd7/Bxg/8r0ZLbpPrtSjvxF2Nf/+jFj1tenhMGLSzWyZKLAOd+n0UL0awfYPe9tmXa8ByDEAlb6/zzRGqbVVxJgYNs3f7+DizA7ZFojR816V6vvZyo0dyEQ/Klje+Y9GkV7Dtt5TjxCw0wMbm1TnsjPG0IAqygXBDQvQvvPrcXTx4+KTDAaeKEMewtSR6+pnseZzGAHXw19Le6WrsYKzfnADUHn6h7bDH+/Qlfgy0x4QCPpP6CvavPL8qvhbfzA9X9lBMGPl+tZclFAH8qmeLPvxlQ8Ple21IfNg7RD/bIF5hMeFghB2mibQV97KKSAocGvt6L9rqBbkm99nJiW864MnIFs0+UIBovx/mt0zIDDT7fVDt+7MNS27ZRsTupPYMF76sGDV3jPnkvM0prWKpmk5JgIGniVUZcX1Lg04aXj5JbOmbgIMAGn1rP0D325fgy/WA/bK3uOyX3F3BS5j82O5NsbTLlhEEv5pIDP8bPWcW+MfmdrtD4TZGNGX22ZSdaDhc9y6SBVbONIczEs4wr4isVDhL5JqlPBmW2o7piZK+9JPmdhwGeZY5NCMx+eDCzUzuCAsnOQhEgCBDcVDsGH56PtzLscotR85K2ShgPB4W0rWYTeg5almkOBnqWAMj+7UPJ6GaYorM3ycwqwHufABi5MErrkCyR2X+vdDFCbnSJfPFsc7LuDW7YDA7xSxlbqWxG77FBSKT9JPEDRsn8xXKtfvE7fIsVodui4H5uGMBTVxK/+DL21JR+Sj4XG9S2M67ofs0/DI1ByNonvpVdXEmJgwXS4EXsrfmY18bi0e4z6mD2oXnqPiQAg8fgA/PU78+hvzYMwEU5OORSPTjYyoH/KTwgl7I7hDf15Afa6pfVbvDZ7hR+l3xG/NuJhMNHNAYPbMF9vtvGo9ocPAZtssV0ycpAFGCiOjgFfhQ/t9a6wcP52RA59UzNXk5EzDXltBWzFEZNGKBEN2vVLIKBlvOHq6WYTPFeycEskxlk0r8/pn4/KFcrUvhUmaDLqqPtoJBm2Sejb7ZkfL1jC9T/8wVYKwa+jD1ldB37DGexi63Ue/jd9W27Qm18z1B7udP49EJEMY1QKJoZKOch7G9eSsm1rS3RV5n6MAALtWEPmEGEQEEwfLECMDjwRRZ07pIJkq4+oWAHJfso/XMWt4bAQUA8ly2wFcef5MF/2PLDLvy0Zgx8ORvL6Bq/inzmcWPjbRCZdHRt1w6ylyRnHtvAu0h5iAgoYDARwRlI7JPzQzN3XlRRV/5PwWDlCk4s3lB7+R+WCVQJmRYDpAAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle - 3 c_{1} x^{2} - c_{10} - 4 c_{2} x y - 3 c_{3} y^{2} - 2 c_{6} x - 2 c_{7} y$" ], "text/plain": [ " 2 2 \n", "- 3⋅c₁⋅x - c₁₀ - 4⋅c₂⋅x⋅y - 3⋅c₃⋅y - 2⋅c₆⋅x - 2⋅c₇⋅y" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "s11, s22, s12 = airy_stress(phi, x, y)\n", "display(s11, s22, s12)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " The stress\n", "boundary conditions for this problem are:\n", "\n", "\\begin{align}\n", "&\\sigma_{22}(x, y=h/2) = 0\\\\\n", "&\\sigma_{12}(x, y=h/2) = 0\\\\\n", "&\\sigma_{22}(x, y=-h/2) = 0\\\\\n", "&\\sigma_{12}(x, y=-h/2) = 0\n", "\\end{align}\n", "\n", "Additionally, we have weak boundary conditions. That means, that\n", "we are not satisfying a distribution of tractions point-wise but\n", "in an average sense, namely\n", "\n", "\\begin{align}\n", "&\\int_{-h/2}^{h/2} \\sigma_{11} \\mathrm{d}y = 0\\\\\n", "&\\int_{-h/2}^{h/2} \\sigma_{12} \\mathrm{d}y = F\\\\\n", "&\\int_{-h/2}^{h/2} y\\sigma_{11} \\mathrm{d}y = 0\\, .\n", "\\end{align}\n", "\n", "With the weak conditions we are imposing that the system satisfy\n", "global equilibrium" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "t1 = s22.subs(y, h/2)\n", "t2 = s12.subs(y, h/2)\n", "t3 = s22.subs(y, -h/2)\n", "t4 = s12.subs(y, -h/2)\n", "t5 = s11.subs(x, L)\n", "t6 = s12.subs(x, L)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "conds = [t1, t2, t3, t4,\n", " integrate(t5, (y, -h/2, h/2)),\n", " integrate(t6, (y, -h/2, h/2)) - F,\n", " integrate(y*t5, (y, -h/2, h/2)),\n", " diff(phi, x, 4) + diff(phi, y, 4) + 2*diff(phi, x, 2, y, 2)]" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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Ghtl4VJgERABERABERABEShGQOOwYiiVUMMENCfXsHEaEU2LdxoxhMQQAREQAREQARFYRIBvDXmDBQhPF6Vyrshidi57j2n7C+rNi7GL8j8sAdX/w5pWiomACIiACCwkoLHRQoCKLgIiIAIiIAIiIAIzCWgcNhOcou2KgObkdmWu9YXV4p31mStHERABERABERCBggSwWp0D3rdYgPCoYLKHTkrMDm3eZOVQDn5A4N+SIyjgIQio/h/CjFJCBERABESgAgGNjSpAVZIiIAIiIAIiIAIikEBA47AESAqyewKak9u9CVdRQIt3VsGsTERABERABERABGoQwID3CdPFwp2fa6R/xDTF7IhWzdcJ5YCfy/oWdeev/NiKsVcCqv97tZzkFgEREAERqE1AY6PahJW+CIiACIiACIiACIQJaBwW5iLfYxHQnNyx7FlTm1s1E1faIiACIiACIiACIlCLAAa8fGvIPXfhDvzuMj/4fayV757TFbM9W6+47N8hxbsoE6+9lO/j/Mr4/4m6pE9qeYD2eqr6v1fLSW4REAEREIGVCGhstBJoZSMCIiACIiACIiACHgGNwzwgOj0WAc3JHcuetbXR4p3ahJW+CIiACIiACIhAcQIY8HKBwffuwh2TCRf0vCme4QESFLMDGLGgCqg7rCcXdQXl5DP83+O6PkNXkPfWSan+b20B5S8CIiACItA6AY2NWreQ5BMBERABERABETgqAY3DjmpZ6UUCmpNTOcglcAMROEH/EI2jXpmfS0/hRUAEREAEREAEVieAAS/frvMHNnfhAT8BdAfbfYxp7mEv5xAQMweGDicJoKx8QYC3qEffTwbUxd0QUP3fjakkqAiIgAiIQIMENDZq0CgSSQREQAREQARE4BQENA47hZkPraTm5A5t3uLKobzwD+vvtHinOFolKAIiIAIiIAIiUJMABjEfkD4HMiH3UYt3LrGI2SUT+QwJoIw8hw/rFV9VTMfFcX+gPr3qzvSzWwKq/7s1nQQXAREQARHYkIDGRhvCV9YiIAIiIAIiIAKnJqBx2KnNfyjlNSd3KHNWVwblRYt3qlNWBiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIQIGAX79wMXJOXCIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIjACgS0eGcFyMpCBERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABEIEtHgnREV+IiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIiACIrACgVsmj7v4jpab3ccvX75cuR46FgEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAEREAERmEcAa3NuI+ZdJ3Z3zBU7n7HxouteYPHOU9dDxyIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAvMIYPHOc8R84sW++n//FIVEIZ1OqQAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle \\left[ 12 c_{0}, \\ 2 L^{2} c_{2} h + 2 L c_{7} h + 2 c_{11} h + c_{4} h^{3}, \\ 24 c_{0} + 8 c_{2} + 24 c_{4}, \\ \\frac{L c_{3} h^{3}}{2} + \\frac{c_{8} h^{3}}{2}, \\ - c_{10} - \\frac{3 c_{3} h^{2}}{4} - c_{7} h, \\ \\frac{c_{2} h^{2}}{2} + c_{6} h + 2 c_{9}, \\ - F - 3 L^{2} c_{1} h - 2 L c_{6} h - c_{10} h - \\frac{c_{3} h^{3}}{4}, \\ - 2 c_{2} h - 2 c_{6}, \\ 3 c_{1} h + 6 c_{5}, \\ - 3 c_{1} h + 6 c_{5}, \\ 2 c_{2} h - 2 c_{6}, \\ - c_{10} - \\frac{3 c_{3} h^{2}}{4} + c_{7} h, \\ - 3 c_{1}, \\ \\frac{c_{2} h^{2}}{2} - c_{6} h + 2 c_{9}\\right]$" ], "text/plain": [ "⎡ 3 \n", "⎢ 2 3 L⋅c₃⋅h \n", "⎢12⋅c₀, 2⋅L ⋅c₂⋅h + 2⋅L⋅c₇⋅h + 2⋅c₁₁⋅h + c₄⋅h , 24⋅c₀ + 8⋅c₂ + 24⋅c₄, ─────── \n", "⎣ 2 \n", "\n", " 3 2 2 \n", " c₈⋅h 3⋅c₃⋅h c₂⋅h 2 \n", "+ ─────, -c₁₀ - ─────── - c₇⋅h, ───── + c₆⋅h + 2⋅c₉, -F - 3⋅L ⋅c₁⋅h - 2⋅L⋅c₆⋅h\n", " 2 4 2 \n", "\n", " 3 \n", " c₃⋅h \n", " - c₁₀⋅h - ─────, -2⋅c₂⋅h - 2⋅c₆, 3⋅c₁⋅h + 6⋅c₅, -3⋅c₁⋅h + 6⋅c₅, 2⋅c₂⋅h - 2⋅c₆\n", " 4 \n", "\n", " 2 2 ⎤\n", " 3⋅c₃⋅h c₂⋅h ⎥\n", ", -c₁₀ - ─────── + c₇⋅h, -3⋅c₁, ───── - c₆⋅h + 2⋅c₉⎥\n", " 4 2 ⎦" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eqlist = conds2eqs(conds, (x, y))\n", "eqlist" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "sol = solve(eqlist, c)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle \\left\\{ c_{0} : 0, \\ c_{1} : 0, \\ c_{10} : - \\frac{3 F}{2 h}, \\ c_{11} : 0, \\ c_{2} : 0, \\ c_{3} : \\frac{2 F}{h^{3}}, \\ c_{4} : 0, \\ c_{5} : 0, \\ c_{6} : 0, \\ c_{7} : 0, \\ c_{8} : - \\frac{2 F L}{h^{3}}, \\ c_{9} : 0\\right\\}$" ], "text/plain": [ "⎧ -3⋅F 2⋅F \n", "⎪c₀: 0, c₁: 0, c₁₀: ─────, c₁₁: 0, c₂: 0, c₃: ───, c₄: 0, c₅: 0, c₆: 0, c₇: 0,\n", "⎨ 2⋅h 3 \n", "⎪ h \n", "⎩ \n", "\n", " -2⋅F⋅L ⎫\n", " c₈: ───────, c₉: 0⎪\n", " 3 ⎬\n", " h ⎪\n", " ⎭" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sol" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle - \\frac{12 F L y}{h^{3}} + \\frac{12 F x y}{h^{3}}$" ], "text/plain": [ " 12⋅F⋅L⋅y 12⋅F⋅x⋅y\n", "- ──────── + ────────\n", " 3 3 \n", " h h " ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s11.subs(sol)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle \\frac{3 F}{2 h} - \\frac{6 F y^{2}}{h^{3}}$" ], "text/plain": [ " 2\n", "3⋅F 6⋅F⋅y \n", "─── - ──────\n", "2⋅h 3 \n", " h " ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s12.subs(sol)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOCAYAAAAWo42rAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAyUlEQVQoFXVSiQ3CMBBLIgaoYIOwAc8EdITOwA6MwCioI9AV2g1gAygbFDucpRPQky5ufHYvX5ymKTBijBXgjHwhb8g18oL6AAyBQhP3mDZuTiMNudRNdAQxSiQExw69F15BtBIIwTVIrq1KGBj1B35GrpdRJ9sEJ08OM5H5x6UV5fZamVdqzSJ3ORsUyvVPpG6PhB2qpUhvUJe7WneoivRCmTsJW1R3XmHfW+BQurrD5XV9X+EIbkPNwpwEuk8412zcHniAqDyKNz6nat0C44eNAAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle 0$" ], "text/plain": [ "0" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s22.subs(sol)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "x_vec, y_vec = np.mgrid[0:10:100j, -1:1:100j]\n", "s11_fun = lambdify((x, y, h, L, F), s11.subs(sol), \"numpy\")\n", "s12_fun = lambdify((x, y, h, L, F), s12.subs(sol), \"numpy\")" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "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", " fig.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\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.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 = $('');\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 = $('');\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 = $('');\n", "\n", " var fmt_picker = $('');\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", " '', {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 = $('');\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'] / mpl.ratio;\n", " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n", " var x1 = msg['x1'] / mpl.ratio;\n", " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n", " x0 = Math.floor(x0) + 0.5;\n", " y0 = Math.floor(y0) + 0.5;\n", " x1 = Math.floor(x1) + 0.5;\n", " y1 = Math.floor(y1) + 0.5;\n", " var min_x = Math.min(x0, x1);\n", " var min_y = Math.min(y0, y1);\n", " var width = Math.abs(x1 - x0);\n", " var height = Math.abs(y1 - y0);\n", "\n", " fig.rubberband_context.clearRect(\n", " 0, 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 * mpl.ratio;\n", " var y = canvas_pos.y * mpl.ratio;\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 overridden (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(\"\");\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", " var width = fig.canvas.width/mpl.ratio\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('');\n", " fig.close_ws(fig, msg);\n", "}\n", "\n", "mpl.figure.prototype.close_ws = function(fig, msg){\n", " fig.send_message('closing', msg);\n", " // fig.ws.close()\n", "}\n", "\n", "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n", " // Turn the data on the canvas into data in the output cell.\n", " var width = this.canvas.width/mpl.ratio\n", " var dataURL = this.canvas.toDataURL();\n", " this.cell_info[1]['text/html'] = '';\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 = $('');\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 = $('');\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", " 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