From ce6d283bc29438fcbac1d7cfacb237056889cd90 Mon Sep 17 00:00:00 2001 From: rch <rostislav.chudoba@rwth-aachen.de> Date: Wed, 6 May 2020 10:09:33 +0200 Subject: [PATCH] after lesson 5 --- .../4_1_PO_multilinear_unloading.ipynb | 543 ++ bmcs_course/4_1_Pullout_with_unloading.ipynb | 456 -- ...slip.ipynb => 4_2_BS_elasto_plastic.ipynb} | 7 + bmcs_course/4_3_BS_EP_SH_IK.ipynb | 1123 +++ ...tropic_kinematic_hardening_softening.ipynb | 6022 ----------------- index.ipynb | 20 +- 6 files changed, 1692 insertions(+), 6479 deletions(-) create mode 100644 bmcs_course/4_1_PO_multilinear_unloading.ipynb delete mode 100644 bmcs_course/4_1_Pullout_with_unloading.ipynb rename bmcs_course/{4_2_BS_elastic_plastic_slip.ipynb => 4_2_BS_elasto_plastic.ipynb} (99%) create mode 100644 bmcs_course/4_3_BS_EP_SH_IK.ipynb delete mode 100644 bmcs_course/4_3_BS_isotropic_kinematic_hardening_softening.ipynb diff --git a/bmcs_course/4_1_PO_multilinear_unloading.ipynb b/bmcs_course/4_1_PO_multilinear_unloading.ipynb new file mode 100644 index 0000000..0e053f8 --- /dev/null +++ b/bmcs_course/4_1_PO_multilinear_unloading.ipynb @@ -0,0 +1,543 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Example 4.1: Pull-out multilinear bond-slip law unloading\n", + "\n", + "This notebook uses the `bmcs` package to show the unphysical \n", + "nature of a model without physical representation of irreversible\n", + "processes in the material structure. It unloads along the original\n", + "pull-out curve.\n", + "\n", + "Further, the notebook shows how to define non-monotonic loading scenario\n", + "using a time-function and how to use the function of the `PullOutModel`\n", + "to plot the results into a prepared plotting area." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from bmcs.api import PullOutModel" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model parameters\n", + "Let us consider the case of the CFRP sheet debonding from concrete" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "A_f = 16.67 # [mm^2]\n", + "A_m = 1540.0 # [mm^2]\n", + "p = 1.0 #\n", + "E_f = 170000 # [MPa]\n", + "E_m = 28000 # [MPa]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Construct the finite element pullout model\n", + "The model uses a multilinear bond-slip law specified by the attributes \n", + "s_arr and tau_arr specifying the pairs of slip and bond stress values." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "\n", + " \\begin{array}{lrrl}\\hline\n", + " \\textrm{k_max} & k_{\\max} = 200 & \\textrm{[-]} & \\textrm{maximum number of iterations} \\\\\n", + " \\textrm{tolerance} & \\epsilon = 0.0001 & \\textrm{[-]} & \\textrm{required accuracy} \\\\\n", + " \\textrm{n_e_x} & n_\\mathrm{E} = 50 & \\textrm{[-]} & \\textrm{number of finite elements along the embedded length} \\\\\n", + " \\textrm{mats_eval_type} & \\textrm{multilinear} & & \\textrm{material model type} \\\\\n", + " \\textrm{control_variable} & \\textrm{u} & & \\textrm{displacement or force control: [u|f]} \\\\\n", + " \\textrm{w_max} & w_{\\max} = 1.84 & \\textrm{[mm]} & \\textrm{maximum pullout slip} \\\\\n", + " \\textrm{fixed_boundary} & \\textrm{non-loaded end (matrix)} & & \\textrm{which side of the specimen is fixed [non-loaded end [matrix], loaded end [matrix], non-loaded end [reinf]]} \\\\\n", + " \\hline\n", + " \\textbf{loading_scenario} & \\textrm{LoadingScenario} & & \\textrm{object defining the loading scenario} \\\\\n", + " \\textbf{cross_section} & \\textrm{CrossSection} & & \\textrm{cross section parameters} \\\\\n", + " \\textbf{geometry} & \\textrm{Geometry} & & \\textrm{geometry parameters of the boundary value problem} \\\\\n", + " \\textbf{mats_eval} & \\textrm{MATSBondSlipMultiLinear} & & \\textrm{material model of the interface} \\\\\n", + " \\hline\n", + " \\end{array}\n", + " " + ], + "text/plain": [ + "<bmcs.pullout.pullout_sim.PullOutModel at 0x7f8ead32b2f0>" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pm = PullOutModel(mats_eval_type='multilinear',\n", + " n_e_x=50, k_max=200, w_max=1.84)\n", + "pm.sim.tline.step = 0.001\n", + "pm.mats_eval.s_tau_table = [[0, 0.1, 0.4, 4],\n", + " [0, 800, 0, 0]]\n", + "# w = pm.get_window()\n", + "# w.configure_traits()\n", + "pm" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "\n", + " \\begin{array}{lrrl}\\hline\n", + " \\textrm{loading_type} & option = monotonic & \\textrm{[-]} & \\textrm{possible values: [monotonic, cyclic]} \\\\\n", + " \\textrm{number_of_cycles} & n_\\mathrm{cycles} = 1 & \\textrm{[-]} & \\textrm{for cyclic loading} \\\\\n", + " \\textrm{maximum_loading} & \\phi_{\\max} = 1.0 & \\textrm{[-]} & \\textrm{load factor at maximum load level} \\\\\n", + " \\textrm{unloading_ratio} & \\phi_{\\mathrm{unload}} = 0.5 & \\textrm{[-]} & \\textrm{fraction of maximum load at lowest load level} \\\\\n", + " \\textrm{number_of_increments} & n_{\\mathrm{incr}} = 20 & \\textrm{[-]} & \\textrm{number of values within a monotonic load branch} \\\\\n", + " \\textrm{amplitude_type} & option = increasing & \\textrm{[-]} & \\textrm{possible values: [increasing, constant]} \\\\\n", + " \\textrm{loading_range} & option = non-symmetric & \\textrm{[-]} & \\textrm{possible values: [non-symmetric, symmetric]} \\\\\n", + " \\hline\n", + " \\hline\n", + " \\end{array}\n", + " " + ], + "text/plain": [ + "<bmcs.time_functions.loading_scenario.LoadingScenario at 0x7f8eb1ee5b30>" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "pm.loading_scenario.plot(plt.axes())\n", + "pm.loading_scenario" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "\n", + " \\begin{array}{lrrl}\\hline\n", + " \\textrm{loading_type} & option = cyclic & \\textrm{[-]} & \\textrm{possible values: [monotonic, cyclic]} \\\\\n", + " \\textrm{number_of_cycles} & n_\\mathrm{cycles} = 2 & \\textrm{[-]} & \\textrm{for cyclic loading} \\\\\n", + " \\textrm{maximum_loading} & \\phi_{\\max} = 1.0 & \\textrm{[-]} & \\textrm{load factor at maximum load level} \\\\\n", + " \\textrm{unloading_ratio} & \\phi_{\\mathrm{unload}} = 0.0 & \\textrm{[-]} & \\textrm{fraction of maximum load at lowest load level} \\\\\n", + " \\textrm{number_of_increments} & n_{\\mathrm{incr}} = 20 & \\textrm{[-]} & \\textrm{number of values within a monotonic load branch} \\\\\n", + " \\textrm{amplitude_type} & option = constant & \\textrm{[-]} & \\textrm{possible values: [increasing, constant]} \\\\\n", + " \\textrm{loading_range} & option = non-symmetric & \\textrm{[-]} & \\textrm{possible values: [non-symmetric, symmetric]} \\\\\n", + " \\hline\n", + " \\hline\n", + " \\end{array}\n", + " " + ], + "text/plain": [ + "<bmcs.time_functions.loading_scenario.LoadingScenario at 0x7f8eb1ee5b30>" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pm.loading_scenario.loading_type='cyclic'\n", + "pm.loading_scenario.trait_set(number_of_cycles=2,\n", + " unloading_ratio=0.0,\n", + " amplitude_type='constant',\n", + " loading_range='non-symmetric')\n", + "pm.loading_scenario" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "pm.loading_scenario.plot(plt.axes())" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "\n", + " \\begin{array}{lrrl}\\hline\n", + " \\textrm{A_m} & A_\\mathrm{m} = 1540.0 & \\textrm{[$\\mathrm{mm}^2$]} & \\textrm{matrix area} \\\\\n", + " \\textrm{A_f} & A_\\mathrm{f} = 16.67 & \\textrm{[$\\mathrm{mm}^2$]} & \\textrm{reinforcement area} \\\\\n", + " \\textrm{P_b} & p_\\mathrm{b} = 1.0 & \\textrm{[$\\mathrm{mm}$]} & \\textrm{perimeter of the bond interface} \\\\\n", + " \\hline\n", + " \\hline\n", + " \\end{array}\n", + " " + ], + "text/plain": [ + "<bmcs.pullout.pullout_sim.CrossSection at 0x7f8eacdf6530>" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pm.cross_section.trait_set(A_f=A_f, P_b=p, A_m=A_m)\n", + "pm.cross_section # display the cross section parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "\n", + " \\begin{array}{lrrl}\\hline\n", + " \\textrm{L_x} & L = 45 & \\textrm{[$\\mathrm{mm}$]} & \\textrm{embedded length} \\\\\n", + " \\hline\n", + " \\hline\n", + " \\end{array}\n", + " " + ], + "text/plain": [ + "<bmcs.pullout.pullout_sim.Geometry at 0x7f8eacdf6470>" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pm.geometry # geometry of the boundary value problem" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plot the current bond-slip law" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "\n", + " \\begin{array}{lrrl}\\hline\n", + " \\textrm{E_m} & E_\\mathrm{m} = 28000.0 & \\textrm{[MPa]} & \\textrm{E-modulus of the matrix} \\\\\n", + " \\textrm{E_f} & E_\\mathrm{f} = 170000.0 & \\textrm{[MPa]} & \\textrm{E-modulus of the reinforcement} \\\\\n", + " \\textrm{s_data} & s = & \\textrm{[mm]} & \\textrm{slip values} \\\\\n", + " \\textrm{tau_data} & \\tau = & \\textrm{[MPa]} & \\textrm{shear stress values} \\\\\n", + " \\hline\n", + " \\hline\n", + " \\end{array}\n", + " " + ], + "text/plain": [ + "<ibvpy.mats.mats1D5.vmats1D5_bondslip1D.MATSBondSlipMultiLinear at 0x7f8eacdbb2f0>" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pm.mats_eval # configuration of the material model" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "pm.mats_eval.bs_law.plot(plt, color='green')" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "c='red'\n", + "pm.geometry.L_x = 200\n", + "pm.sim.run()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAckAAAEGCAYAAAAOgW4QAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3de5hU1Znv8e/LpQEBEWxApOVAxBugYmwRVAiijASjoGLA0XiJhkliThydyVHPM0/iOUcn5jmJZhxPzEFhFIMBxBiJB7zfFS8oKAjqoKK2jdA0t0ZpoLvf80ftLqqbuuxuqmpXd/0+z1MPq9a+vbvaqte19t5rmbsjIiIi++sQdQAiIiKFSklSREQkBSVJERGRFJQkRUREUlCSFBERSaFT1AHkW2lpqQ8ePDjqMEREpIC8/fbbm929b/P6okuSgwcPZvny5VGHISIiBcTMPktWr+5WERGRFJQkRUREUlCSFBERSUFJUkREJAUlSRERkRSUJEVERFJQkhQREUmh6J6TbJVlwGBgQMRxFLGqqiqefvpp6uvr6dq1K1u3bk27fmlpKZs3b065/PDDD2fDhg2kmirusMMOo7q6mr179yZdftBBB+Hu7Nq1K+Ux+vTpw5YtW9LGWF1dnTKGww8/nOrqanbv3p10ef/+/amtrWX79u1Jl3fo0IFOnTqxZ8+etDFs2bKFhoaGlOewa9eulOd52GGHUVtby7Zt21Ju37VrVzZu3Eh9fX3SdXr06MHOnTtTxjhw4EB27tyZ8jxLS0vp1KkTX331VdLlhx9+OF26dGHDhg3U1tbut7x3794cccQRbNy4kY0bN+633Mw49thj2bx5M1VVVUmPUV5eTm1tLZWVlUn/5qeccgolJSVs2LCBysrK/eIYNWoU/fv3Z8OGDfFX4t/ktNNO4+ijj2bjxo3x5Ymxjh8/nqOPPpq9e/eyceNGvvrqKzZs2MCmTZvo0qUL48ePp6ysDAB3p6amho0bN1JVVUVdXR0nnngivXr1ahJTXV0dNTU1uDu9e/fGzJKee3tnxTafZHl5ubd4MIFZCeW/B3pkMyJJpqamhiVLlqT8YRSRwtKpUyfq6uqSLuvfvz+TJk1i8+bNbNq0iU2bNlFVVcU333zDuHHjOPbYY/Mc7f7M7G13L9+vXkkyhFnN3vcFLshWRNLohRde4KOPPmr19j179qSmpibl8pKSkrStKjNL2aoLK90PBUDXrl2TtmbyKdPnIFJIDj74YL7//e+zY8cOtmzZwtatW9m7dy/l5eV06pS9zlAlyUCrk+S3gEOBtxLqZ2YvrmK2cOHClN11AP369WPixIl07949j1GJFI6GhgbcnY4dOyZdvnPnTmpqaujXr1/SdT777DMqKyvp378//fr1o3v37k26T19//XU+/fRT+vbtS2lpKaWlpfTp04cuXbrQ0NDAf/zHfzTZX58+feLrbNu2jQ8++CC7J9wCY8aMYdeuXdTW1rJ792769u3LyJEjW7wfJclAq5Pk0cD4hPeNlChb7bPPPuPJJ5/cr75z586cd955lJaWRhCViORCQ0MDHTrsf69oZWUlS5YsoaGhgY4dO8aTdElJCStWrGj18aZOnUq/fv1Cr5/3JGlmXYGXgC7EbhBa5O6/MrM+wAJit8KsB77v7luDbW4GrgbqgZ+7+5NB/cnA/UA3YAlwnbu7mXUB5gInA9XAdHdfny6uVifJYcAZCXX3AQ3Ad4EjWra7YldXV8ecOXP2q7/yyispKSmJICIRKVQNDQ00NDTs17X68MMPZ7yBr2fPnlxyySWhjpMqSeby7tbdwAR332lmnYFXzGwpcCHwrLvfbmY3ATcBN5rZMGAGMBw4HHjGzI5293rgHmJttteJJclJwFJiCXWruw81sxnAb4DpOTmb5p/UNcBDQHE1xA/YSy+9tF/XzIQJExg6dGhEEYlIIevQoUPSFujFF1+cdP1ly5axatUqgJR3hrdEzpKkx5qojfd1dw5eDkxhX8flA8ALwI1B/Xx33w18ambrgFFmth442N2XAZjZXGAqsSQ5Bbgl2Nci4G4zM89F8zjZJ/X3WT9Ku7V161YefvjhJnVdunThiiuuiCgiEWmPxowZw5gxY9ixY0dWbuzJ6XOSZtYReBsYCvwfd3/DzPq7+wYAd99gZo2dxgOJtRQbVQR1e4Ny8/rGbb4I9lVnZtuJ3V7T5AE5M5tJcPVw0KBBrTsZPVHaas899xzr1q1rUjdjxgwOPvjgiCISkfYuW78vOf3pD7pKR5rZIcCjZjYizerJnlT1NPXptmkexyyC223Ky8tb18pUkmyVBQsWNHnW8YQTTmD06NERRiQiEl5efvrdfZuZvUDsWuJGMxsQtCIHAJuC1SpoegtMGVAZ1JclqU/cpsLMOgG9gNRDnBwIJckWmzWr6QOmV111FZ07d44oGhGRlsvZ2K1m1jdoQWJm3YCzgQ+AxUDjhagrgMeC8mJghpl1MbMhwFHAm0HXbI2ZjbbYgz2XN9umcV/TgOdycj0SlCRbqHmCvOaaa5QgRaTNyeVP/wDggeC6ZAdgobs/bmbLgIVmdjXwOXAxgLu/b2YLgTVAHXBt0F0L8BP2PQKyNHgBzAYeDG7y2ULs7tjcUJIMrXmCnDlTD5OKSNukwQTCmAVMpmmnrySlBCkibVEUz0m2L+opTKuhoYH77ruvSZ0SpIi0dUqSYemTSqn5CDqdO3fmqquuijAiEZHs0E9/WPqkkqqtrWXu3Lnx94ceeigXXXRRhBGJiGSPfvrD0ieVVGKCHDJkCBMnTowwGhGR7NJPf1j6pPaTeJPOsGHDOOOMM9KsLSLS9uTsOcl2R0myiaeeeqrJeyVIEWmPlCQzaQj+TT7XaVH6/PPPWb9+ffy97mIVkfZKSTKTuqgDKCx79uzhiSeeiL/XXawi0p4pSWZSn3mVYnL//ffHy+eee66GmhORdk1JMpO9UQdQOBJv1Bk6dCgDBw5Ms7aISNunJJmJuluB2GzfiSZMmBBRJCIi+aMkmYmSJFVVVaxatSr+XjfqiEixUJLMpMiTZH19PY8++mj8/WWXXRZhNCIi+aUkmUmRJ8nZs2fHy2eeeSYHHXRQhNGIiOSXkmQmRZwk//znP8fLpaWlHHXUURFGIyKSf0qSmRRpkty2bRs1NTXx9xdeeGGE0YiIRENJMpMiTZILFy6Ml6+55poIIxERiY6SZCZFmCRffvnlePn444+nQwf9ZyIixUm/fpkUWZKsr69n7dq18fdjxoyJMBoRkWgpSWZSZEky8W7W6dOnRxiJiEj0lCQzKaIk+dlnn8XLJSUl9OrVK8JoRESipySZSRGN3frkk0/Gy1deeWV0gYiIFAglyUyKpCW5YMGCeFnjsoqIxOQsSZrZEWb2vJmtNbP3zey6oP4WM/vSzFYGr8kJ29xsZuvM7EMzOyeh/mQzWxUsu8vMLKjvYmYLgvo3zGxw1k+kCKbK+vrrr9m+fXv8/dChQyOMRkSkcOSyJVkH/JO7HweMBq41s2HBsjvdfWTwWgIQLJsBDAcmAX8ws47B+vcAM4GjgtekoP5qYKu7DwXuBH6T9bMogu7WefPmxcvqZhUR2SdnSdLdN7j7O0G5BlgLpJuAcAow3913u/unwDpglJkNAA5292Xu7sBcYGrCNg8E5UXAWY2tzKxp592t77zzTrw8ZMgQSkpKIoxGRKSw5OWaZNANehLwRlD1MzN7z8zmmFnvoG4g8EXCZhVB3cCg3Ly+yTbuXgdsBw5NcvyZZrbczJZXVVW1LPh2nCTdneXLl8ffT5w4McJoREQKT86TpJn1AB4B/tHddxDrOj0SGAlsAH7XuGqSzT1Nfbptmla4z3L3cncv79u3b8tOoB0nyXvvvTdenjp1apo1RUSKU06TpJl1JpYg57n7XwDcfaO717t7A3AvMCpYvQI4ImHzMqAyqC9LUt9kGzPrBPQCtmT1JNppkty6dWuT9/369YsoEhGRwpXLu1sNmA2sdfc7EuoHJKx2AbA6KC8GZgR3rA4hdoPOm+6+Aagxs9HBPi8HHkvY5oqgPA14LrhumT3tNEk+/PDD8bIGMBcRSa5TDvd9OvADYJWZrQzq/jtwiZmNJNYtuh74BwB3f9/MFgJriKWma9298QGMnwD3A92ApcELYkn4QTNbR6wFOSPrZ9EOk+THH38cL48YMUIDmIuIpJCzJOnur5D8muGSNNvcBtyWpH45MCJJfS1w8QGEmVk7fE7y2WefjZdPO+20CCMRESlsakIUmQ8//DBePvXUUyOMRESk8ClJFpkXX3wxXj7xxBMjjEREpPApSRaR1atXx8unn356hJGIiLQNSpJF5LXXXouXhw8fHmEkIiJtg5JkkVi5cmW8PH78+OgCERFpQ5Qki8Sbb74ZLx999NERRiIi0nYoSRaBt956K14+++yzI4xERKRtUZIsAitWrIiXv/Wtb0UYiYhI26Ik2c4l3qwzadKkNGuKiEhzKUfcMbMbQmz/tbv/3yzGI1mW+NjHoEGDIoxERKTtSdeS/AXQA+iZ5vVPuQ5QWi9x4IBzzz03wkhERNqmdGO3Puju/zPdxmbWPcvxSBYlDkE3cODANGuKiEgyKVuS7v7fMm0cZh2JxjPPPBMvT5kyJcJIRETarnTXJC9Pt6G7z81+OJItn3zySbzcv3//CCMREWm70nW3npKkzoDzgIGAkmSBSnzk44ILLogwEhGRti1lknT3/9pYNjMDLgVuBF4nyZyPUjgSBw/o27dvhJGIiLRtaSddNrNOwJXE7mJ9A5jm7h+m20aitWXLlnj529/+doSRiIi0femuSV4LXAc8C0xy98/yFpW02qJFi+Ll8vLyCCMREWn70rUk/x3YBJwB/C3W4wrErku6u5+Q49ikhRoaGuLlkpKSCCMREWkf0iXJIXmLQrJiwYIF8fJll10WYSQiIu1Duht31L3axtTU1MTLnTqlvdwsIiIhpBxMwMwez7RxmHUkP9577714eerUqRFGIiLSfqRrbpxhZovTLDdgWJbjkVZ6/fXX4+V+/fpFGImISPuRLkmGGctsT6oFZnYEsQEHDgMagFnu/m9m1gdYAAwG1gPfd/etwTY3A1cD9cDP3f3JoP5k4H6gG7AEuM7d3cy6BMc4GagGprv7+hBxtyvbtm2Ll084QfdTiYhkS7prki+mWhZSHfBP7v6OmfUE3jazp4k9d/msu99uZjcBNwE3mtkwYAYwHDgceMbMjnb3euAeYCaxgQyWAJOApcQS6lZ3H2pmM4DfANMPMO42Z+HChfHy6NGjI4xERKR9ydmky+6+wd3fCco1wFpiw9lNAR4IVnsAaLyANgWY7+673f1TYB0wyswGAAe7+zJ3d2Itx8RtGve1CDjLEp5VyZoCvgcm8bGPDh00h7aISDbl5VfVzAYDJxEbtae/u2+AWCIFGi+gDQS+SNisIqgbGJSb1zfZxt3rgO3AoUmOP9PMlpvZ8qqqqpafQAEnyUceeSRevuKKKyKMRESk/UmbJM3sJDObZmbHtfYAZtYDeAT4R3ffkW7VJHWepj7dNk0r3Ge5e7m7l7dqLNMCTpJbt26Nlzt37hxhJCIi7U+6R0B+SewGm4uA/2dmP2rpzs2sM7EEOc/d/xJUbwy6UAn+3RTUVwBHJGxeBlQG9WVJ6ptsE4wz2wvYQrYVaJJ8//334+Xzzz8/wkhERNqndC3J6cBId7+E2LRZM1uy4+Da4GxgrbvfkbBoMdDYL3gF8FhC/Qwz62JmQ4CjgDeDLtkaMxsd7PPyZts07msa8Fxw3TK7CjRJvvrqq/HyYYcdFmEkIiLtU7qf/1p3/wbA3avNrKXXL08HfgCsMrOVQd1/B24HFprZ1cDnwMXBMd43s4XAGmJ3xl4b3NkK8BP2PQKyNHhBLAk/aGbriLUgZ7QwxnAKMEnu2LGv53r48OERRiIi0n6l+/k/MmEwAWv2HndP27/n7q+Q/JohwFkptrmNJHNVuvtyYESS+lqCJJtTBZgk58+fHy+ffvrpEUYiItJ+tWQwgd/mMpCCpvthRESKUi4HE2g/OkYdQFOJQ9DpsQ8RkdzR0+dhFFhLMnEw8y5dukQYiYhI+6YkGUYBXZOsr6+Pl4cM0ZSfIiK5FDpJmln3XAZS0AooSS5evG9ilrPPPjvCSERE2r+MSdLMTjOzNcTGXsXMTjSzP+Q8skJSQEkycVi9XAxTKyIi+4RpSd4JnENsKirc/V1gXC6DKjgFkiR37twZL5922mkRRiIiUhxCdbe6+xfNquqTrtheFUiSfOihh+LlESP2e2xURESyLMzP/xdmdhrgZlYC/Jyg67VoFEiSFBGR/ArTkvwxcC37pqwaGbwvHgWQJCsrK+Pl8847L8JIRESKR8aff3ffDFyah1gKVwE8J/n444/HywMGDIgwEhGR4hHm7tYHzOyQhPe9zWxObsMqMAU24o6IiORHmO7WE9x9W+Mbd98KnJS7kApQxC3JxBF2Lr20uBv1IiL5FCZJdjCz3o1vzKwPBXGVLo8iPtvEsVq7dy/eMR1ERPItzM//74DXzGwR4MD3STKdVbsWYZJMnEO6X79+0QUiIlKE0v78BxMtrwMuAiYQmx/yQndfk4fYCkeESfLpp5+Ol3VXq4hIfqX9+Xf3BjP7nbuPAYorMSaKMEmuX78+Xu7YUXcQiYjkU5hrkk+Z2UVWjAOFNvZ0RpSbdu/eHS+feOKJ0QQhIlLEwrSRbgC6A/VmVhvUubsfnLuwCkTj4HsR/e/B/Pnz4+VTTz01miBERIpYmMEEeuYjkIJUF+3hE1uSIiKSf6GutpnZ+eyb+eMFd3883frtRoRJMnHGjwkTJkQXiIhIEQsz4s7twHXEbtxZA1wX1LV/ESbJxK7WoUOHRheIiEgRC9OSnAyMdPcGiA1TB6wAbsplYAUhwiTZ0NAQ3cFFRAQIOZ8kcEhCuVeYDcxsjpltMrPVCXW3mNmXZrYyeE1OWHazma0zsw/N7JyE+pPNbFWw7K7Gu2zNrIuZLQjq3zCzwSHPJbyIkuTXX38dL48fPz6aIEREJFSS/DWwwszuD1qRbwP/GmK7+4FJServdPeRwWsJgJkNA2YAw4Nt/mBmjQ9e3APMBI4KXo37vBrY6u5DgTuB34SIqWUiSpILFiyIl48++uhoghARkdRJ0sxOD4p/AUYH//4FGOPu81Nt18jdXwK2hIxjCjDf3Xe7+6fERvkZZWYDgIPdfZnHxmebC0xN2OaBoLwIOCvrz3JGlCTr6iK+rVZERID0Lcm7gn+XufsGd1/s7o+5+1cHeMyfmdl7QXds48DpA4EvEtapCOoaJ3puXt9kG3evA7YDhyY7oJnNNLPlZra8qqoqfKQR5KpvvvkmXh43blyaNUVEJNfS3biz18z+AxhoZnc1X+juP2/F8e4B/hexsWz+F7HB039I8sf1PU09GZY1rXSfBcwCKC8vT7pOUntDr5k1ixYtipePPfbY/AcgIiJx6ZLk94CziQ1s/nY2DubuGxvLZnYv0Pi8ZQVwRMKqZUBlUF+WpD5xmwoz60TshqKw3bvhRNCSrK2tzbySiIjkRcok6e6bgflmttbd383GwcxsgLtvCN5eADTe+boYeMjM7gAOJ3aDzpvuXm9mNWY2GngDuBz494RtrgCWAdOA5zxxXqlsyHOSTEyQY8aMye/BRURkP2GGpWtVgjSzPwPjgVIzqwB+BYw3s5HEukXXA/8QHON9M1tIbLCCOuBad28cOfUnxO6U7QYsDV4As4EHzWwdsRbkjNbEmVaek+Sjjz4aLx9//PH5PbiIiOwnZ5NAufslSapnp1n/NpJM5uzuy4ERSeprgYsPJMaM8pwka2pq8ntAERFJK8ywdEPC1LVLeUySe/bsiZdPOeWU/B1YRERSCjOYwCNJ6hYlqWt/8pgkFy9eHC+fdNJJ+TuwiIiklLK71cyOJTYCTi8zuzBh0cFA11wHVhDymCS3bMnujbkiInLg0l2TPIbYYyCHAOcl1NcAP8plUAUjT0ly7959D2SOHDkyPwcVEZGM0j0C8hjwmJmNcfdleYypcOQpSS5ZsiReHjVqVH4OKiIiGYW5u3Wmme3XcnT3H+YgnsKSpxF3Nm7cmHklERHJuzBJ8vGEcldigwBUpli3fclDS7K+vj5eHj58eO4PKCIioYUZTKDJ3a3BIAHP5CyiQpKHJPnkk0/Gy6eddlruDygiIqGFnXQ50VHAoGwHUpDykCQrKvZNcpLtmb5EROTAZGxJmlkN+2bkcOAr4MYcx1UYcpwkGxoa4mVNriwiUnjCdLf2zEcgBSnHSfK5556LlzV3pIhI4Qk1dquZnQ80/oq/4O6Pp1tfwvnkk0/i5Q4dWtPzLSIiuRRm7NbbgeuIzdCxBrjOzH6d68Dau8RZvQYPHhxdICIiklKYluRkYKS7NwCY2QPACuDmXAbW3r300kvx8tlnnx1hJCIikkrYPr5DEsq9chFIsfnwww/jZXW1iogUpjAtyV8DK8zseWJ3uI5DrcgDktjVWlZWFmEkIiKSTpi7W/9sZi8ApxBLkje6+1e5Dqw9W7Zs31C455xzToSRiIhIOqH6+dx9g7svBvorQR641atXx8sdO3aMMBIREUmnpRfDfpyTKIpUv379og5BRETSaGmS1LhpB+itt96Kl7/3ve9FGImIiGTS0iR5XuZVJJ0VK1bEy506hRrLQUREIpLyV9rMbkhRD4C735GjmIpC7969ow5BREQySNeS7JnhlZaZzTGzTWa2OqGuj5k9bWb/GfzbO2HZzWa2zsw+NLNzEupPNrNVwbK7LMjSZtbFzBYE9W+Y2eCWnXr+rVy5Ml6eMmVKhJGIiEgYKVuS7v4/DnDf9wN3A3MT6m4CnnX3283spuD9jWY2DJgBDAcOB54xs6PdvR64B5gJvA4sASYBS4Grga3uPtTMZgC/AaYfYMw59eabb8bLJSUlEUYiIiJhpOtuvSvdhu7+8wzLX0rSupsCjA/KDwAvEJt2awow3913A5+a2TpglJmtBw5292VBTHOBqcSS5BTglmBfi4C7zcw88Un9AtWjR4+oQxARkRDS3Tnydg6O19/dN0Ds2Usza3wGYiCxlmKjiqBub1BuXt+4zRfBvurMbDtwKLC5+UHNbCax1iiDBkUzX3Tis5EXXnhhJDGIiEjLpOtufSCPcSR7tMTT1KfbZv9K91nALIDy8vJIWpqvvfZavNy1a9coQhARkRbK+AxCMGbrfonF3Se04ngbzWxA0IocAGwK6iuAIxLWKwMqg/qyJPWJ21SYWSdiA69vaUVMedWlS5eoQxARkZDCPKj3zwnlrsBFQF0rj7cYuAK4Pfj3sYT6h8zsDmI37hwFvOnu9WZWY2ajgTeAy4F/b7avZcA04LlCvR6ZOOPHxRdfHGEkIiLSEmEGOG9+bfJVM3sx03Zm9mdiN+mUmlkF8CtiyXGhmV0NfA5cHBzjfTNbSGxS5zrg2uDOVoCfELtTthuxG3aWBvWzgQeDm3y2ELs7tiC9+OK+j+uggw6KMBIREWmJMN2tfRLedgBOBg7LtJ27X5Ji0Vkp1r8NuC1J/XJgRJL6WoIk21Y0DsQgIiJtQ5ju1rfZdxNNHfApsWcUJYRPPvkkXp4xo2AbuyIikkSY7tYh+QikvXrmmWfi5Z49Mw5UJCIiBSRMd2tX4KfAGcRalK8A9wTdnSIiIu1WmO7WuUAN++4qvQR4kDZ2PTAKn3/+ebw8fXpBj5gnIiJJhEmSx7j7iQnvnzezd3MVUHvyxBNPxMu9evWKMBIREWmNMPNJrgieUwTAzE4FXs1dSAWmY9QBiIhIVMK0JE8FLjezxr7DQcBaM1sFuLufkLPoCkEr50WurKyMl6dNm5alYEREJJ/CpIBJOY+ikLUyST7++OPxcp8+fdKsKSIihSrMIyCf5SOQgtXKJCkiIm1fmGuSxa0VSXLjxo3x8gUXXJDFYEREJJ+UJDNpRZJ87LHH4uW+fftmMRgREcknJclM1N0qIlK0lCQzaWGS3Lx5c7x83nnnZTkYERHJJyXJTFqYJP/yl7/EywMGDMhyMCIikk9Kkpl0jjoAERGJipJkJi1oSW7bti1enjx5cg6CERGRfFKSzKQFSXLhwoXxcllZWQ6CERGRfFKSzER3t4qIFC0lyUxCJskdO3bEyxMnTsxRMCIikk9KkpmETJLz58+Pl4cMGZKjYEREJJ+UJDNRd6uISNFSkswkRJL8+uuv4+Uzzzwzh8GIiEg+KUlmEiJJLliwIF4+6qijchiMiIjkUyRJ0szWm9kqM1tpZsuDuj5m9rSZ/Wfwb++E9W82s3Vm9qGZnZNQf3Kwn3VmdpeZWdaDDZEk6+rqsn5YERGJXpQtyTPdfaS7lwfvbwKedfejgGeD95jZMGAGMJzYBNB/MLOOwTb3ADOBo4JX9ieIzpAkd+3aFS+PHTs264cXEZHoFFJ36xTggaD8ADA1oX6+u+9290+BdcAoMxsAHOzuy9zdgbkJ22RPhiT5yCOPxMvHHXdc1g8vIiLRiSpJOvCUmb1tZjODuv7uvgEg+LdfUD8Q+CJh24qgbmBQbl6/HzObaWbLzWx5VVVVyyLNkCS/+eablu1PRETajKgecDjd3SvNrB/wtJl9kGbdZNcZPU39/pXus4BZAOXl5UnXSSnNJ7R79+54efTo0S3arYiIFL5IWpLuXhn8uwl4FBgFbAy6UAn+3RSsXgEckbB5GVAZ1Jclqc+uNEnyr3/9a7x8wgknZP3QIiISrbwnSTPrbmY9G8vA3wGrgcXAFcFqVwCPBeXFwAwz62JmQ4jdoPNm0CVbY2ajg7taL0/YJnvSJMnt27dn/XAiIlI4ouhu7Q88Gjyt0Ql4yN2fMLO3gIVmdjXwOXAxgLu/b2YLgTVAHXCtu9cH+/oJcD/QDVgavLKj8Qgp/jdi79698fLJJ5+ctcOKiKSyd+9eKioqqK2tjTqUNqtr166UlZXRuXO4yYLzniTd/RPgxCT11cBZKba5DbgtSf1yYES2YwT2JckU/va3v8XLSpIikg8VFRX07NmTwYMHk4vHwts7d6e6upqKiorQY2wX0iMghWVv+sWbN2/OTxwiIoHa2loOPfRQJchWMjMOPfTQFrXElSRTSbGp7cMAAA/vSURBVDOITuIIO7phR0TySQnywLT081OSTCVNknziiSfiZT36ISLSfilJppImSVZWZv9JExGRtqBjx46MHDmSESNGcPHFF8cHVNm1axff+c53qK/PcENHFt1yyy389re/bVK3Z88exo0bl7UxtZUkU0nx+TY0NMTLGoZORIpNt27dWLlyJatXr6akpIQ//vGPAMyZM4cLL7yQjh07ZthDbpWUlHDWWWc1mZ3pQGhK4VRSJMmnnnoqXj7jjDPyFIyISFOzZs3KyX5nzpyZeaXA2LFjee+99wCYN28eDz30EAA//elPmTRpEueffz4XXHABvXv3Zs6cOcyePZtPP/2UW2+9lcmTJ3PffffRvXt3Ro0axeLFiznmmGO45JJLmDBhAj/60Y9afQ5Tp07l5ptv5tJLL231PhqpJZlKiiT5+eefx8u6gC4ixaquro6lS5dy/PHHs2fPHj755BMGDx4MwLhx43j55ZcB+PLLL1mzZg0Ar7zySny2pCVLlnD44YfTq1cv7r77bq688krmz5/P1q1b4wly+vTpjBw5cr/X3Llz08Y2YsQI3nrrraycp1qSqSR5BCSxq/XII4/MYzAiIk21pMWXTbt27WLkyJFArCV59dVXs3nzZg455JD4OmPHjuX3v/89a9asYdiwYWzdupUNGzawbNky7rrrrv32OXHiRB5++GGuvfZa3n333Xh9a7tMO3bsSElJCTU1NfTs2bNV+2ikJJlKkpbkCy+8EC+feeaZ+YtFRKRANF6TbF6X+OzhwIED2bp1K0888QTjxo1jy5YtLFy4kB49eiRNWg0NDaxdu5Zu3bqxZcsWyspiw3JPnz6dDz/8cL/1b7jhBi6//PK0ce7evZuuXbu25hSbUJJMJckNWuvWrYuXO3RQT7WICEDv3r2pr6+ntrY2npjGjBnD73//e5577jmqq6uZNm0a06ZNi29z1llnMXfuXAYOHMidd97Jcccdx7/+67/ywx/+kGXLltG5c+dWtySrq6vp27dv6KHn0tEvfSrNultj8zrHDBo0KM/BiIgUtr/7u7/jlVdeib8fO3YsdXV1DB06lG9/+9ts2bIlfj2yoaGBdevW0adPHz766CPuu+8+fve73zF27FjGjRvHrbfeGvq4t956K2VlZfEXwPPPP8/kyZOzcl6W+ONfDMrLy3358uWZV3wdeA8Iuv1feuklPvggNu3lNddco5akiOTd2rVrC/bRsxUrVnDHHXfw4IMPZlx39erVzJkzhzvuuCMnsVx44YX8+te/5phjjkm6PNnnaGZvu3t583X1S59Ks2uSjQkS1NUqItLcSSedxJlnnhlqMIERI0bkLEHu2bOHqVOnpkyQLaVrkqmkeARkwIAB+Y1DRKSN+OEPfxh1CJSUlGS8qacl1CRKJSFJvv766/Hyd7/73QiCERGRKChJppKQJBtHlADo1EmNbxGRYqEkmUqS7tbS0tL8xyEiIpFRkmzuY9h+2XZ2Td1Fwz80sMN24D91Xpj9AsOGDYs6OhERySMlyURLoW54Hd3mdaNbfTc60IGDOZir6q/i3jfv5eaRN7N06dKooxQRiUwhTZW1e/dupk+fztChQzn11FNZv349AFVVVUyaNCkrx1CSbPQxNFzUQKfdnSihpMmiEkroTnf+tPtP/OLCX/Dxxx9HFKSISLQKaaqs2bNn07t3b9atW8f111/PjTfeCEDfvn0ZMGAAr7766gEfQ0my0e+gobYh7Sqd6cxPd/+UO++8M09BiYgUrrFjx8aH65w3bx5TpkwBYlNlLV68GIALLrgg/mjI7Nmz+Zd/+RcAJk+eTGVlJdu3b+eYY46Jj9F6ySWXcO+994Y6/mOPPcYVV1wBwLRp03j22Wfjo6NNnTqVefPmHfA56lbNRn+CTp7+4yihhEv9UgY9OIi77747T4GJiKSQiyklQ04u0jhV1qRJk1JOlXX++efz5ZdfsmHDBiA2VdaMGTOA2FRZjRqnyrruuuv2myor3QDnX375JUcccQQQe/KgV69eVFdXU1paSnl5eTwhHwglyUY7w63Wgx7s3BlyZRGRXIpgtqxCmior2bCqjfP89uvXj8rKyladY6I2nyTNbBLwb0BH4D53v71VO+oB1GRebSc76dGjR6sOISLS1hXSVFllZWV88cUXlJWVUVdXx/bt2+nTpw8AtbW1dOvW7YDPt00nSTPrCPwfYCJQAbxlZovdfU2Ld3YZ1P2xLm2X6x72MM/m8YMf/KC1IYuItDtRTZV1/vnn88ADDzBmzBgWLVrEhAkT4i3Jjz76iBEjRhzwubX1G3dGAevc/RN33wPMB6a0ak//BB26pv849rKXP3T5A9dff32rDiEi0l5FMVXW1VdfTXV1NUOHDuWOO+7g9tv3dSQ+//zznHvuuQd+Yu7eZl/ANGJdrI3vfwDcnWS9mcByYPmgQYM8pSXue7vs9d3sbrKH3ez2nez0qV2m+pIlS1JvLyKSQ2vWrIk6hJTeeecdv+yyy0Ktu2rVKr/++utzGs/YsWN9y5YtSZcl+xyB5Z4kz7Tp7lbAktTtdyXX3WcR3AdWXl6eegLN70Kn9zux7VfbqH+4ni57ulBDDQs6L6ByeiW/veW3HHnkkVkLXkSkvUicKivTs5K5nCoLYoMJ3HDDDfTu3fuA99XWk2QFcETC+zLgwG5nOhIO+dMh8KfY2170YmYUt5CJiLQxhTBVFsQGE5g6dWpW9tXWr0m+BRxlZkPMrASYASyOOCYRkZzxJI89SHgt/fzadJJ09zrgZ8CTwFpgobu/H21UIiK50bVrV6qrq5UoW8ndqa6ujt+BG0Zb727F3ZcASzKuKCLSxpWVlVFRUUFVVVXUobRZXbt2jT+HGUabT5IiIsWic+fODBkyJOowikqb7m4VERHJJSVJERGRFJQkRUREUrBiu0vKzKqAz0KuXgpszmE4+aLzKCw6j8LSXs4D2s+5RHEe/8Xd+zavLLok2RJmttzdy6OO40DpPAqLzqOwtJfzgPZzLoV0HupuFRERSUFJUkREJAUlyfRmRR1Alug8CovOo7C0l/OA9nMuBXMeuiYpIiKSglqSIiIiKShJioiIpFC0SdLMJpnZh2a2zsxuSrLczOyuYPl7ZvbtsNvmU4jzuDSI/z0ze83MTkxYtt7MVpnZSjNbnt/I94sz03mMN7PtQawrzeyXYbfNpxDn8YuEc1htZvVm1idYVhB/DzObY2abzGx1iuVt5buR6Tzayncj03m0ie9GEE+mcym874e7F90L6Ah8DHwLKAHeBYY1W2cysBQwYDTwRthtC+w8TgN6B+XvNp5H8H49UNpG/h7jgcdbs20hnUez9c8DnivAv8c44NvA6hTLC/67EfI8Cv67EfI8Cv67EfZcmq1bEN+PYm1JjgLWufsn7r4HmA9MabbOFGCux7wOHGJmA0Jumy8ZY3H319x9a/D2dSD8HDH5cyCfaZv6ezRzCfDnvETWAu7+ErAlzSpt4buR8TzayHcjzN8jlYL6e0CLz6Ugvh/FmiQHAl8kvK8I6sKsE2bbfGlpLFcTawE0cuApM3vbzGbmIL6wwp7HGDN718yWmtnwFm6bD6FjMbODgEnAIwnVhfL3yKQtfDdaqlC/G2EV+nejRQrp+1Gs80lakrrmz8KkWifMtvkSOhYzO5PYD8EZCdWnu3ulmfUDnjazD4L/08u3MOfxDrGxFXea2WTgr8BRIbfNl5bEch7wqrsn/l91ofw9MmkL343QCvy7EUZb+G60VMF8P4q1JVkBHJHwvgyoDLlOmG3zJVQsZnYCcB8wxd2rG+vdvTL4dxPwKLHumShkPA933+HuO4PyEqCzmZWG2TaPWhLLDJp1JRXQ3yOTtvDdCKUNfDcyaiPfjZYqnO9Hvi+CFsKLWAv6E2AI+y5oD2+2zrk0vTnhzbDbFth5DALWAac1q+8O9EwovwZMKuDzOIx9g1+MAj4P/jZt6u8RrNeL2HWZ7oX49whiGEzqG0UK/rsR8jwK/rsR8jwK/rsR9lyC5QX1/SjK7lZ3rzOznwFPErsDbI67v29mPw6W/xFYQuwuvnXAN8BV6baN4DTCnscvgUOBP5gZQJ3HRtfvDzwa1HUCHnL3JyI4jbDnMQ34iZnVAbuAGR77xrS1vwfABcBT7v51wuYF8/cwsz8Tu2Oy1MwqgF8BnaHtfDcg1HkU/HcDQp1HwX83GoU4Fyiw74eGpRMREUmhWK9JioiIZKQkKSIikoKSpIiISApKkiIiIikoSYqIiKSgJCmSB2Z2pZndHZRvMbN/ztJ+p5rZsBasP97MHg/K5+dyZohgBoeVZnZ4Dvb9v83sq2x9jiKpFOVzkiLtyFTgcWBNSzd098XA4qxHtM8udx+Zix27+y/M7OvMa4ocGLUkRVrIzAab2Qdm9kAwF+GiYEDmxjnvSoNyuZm90MJ9XxLMmbfazH6TUL8zoTzNzO43s9OA84H/HbTYjmy2r4uD/bxrZvuNcdmsdXu/mf3RzF42s4/M7HtJ1v+DmZ0flB81szlB+WozuzXEue00s98EA1Q/Y2ajzOwFM/skYb9XmtlfzexvZvapmf3MzG4wsxVm9roFcwuK5IuSpEjrHAPMcvcTgB3ATw90h0G35G+ACcBI4BQzm5pqfXd/jVhL8BfuPtLdP262yi+Bc9z9RGLJNJPBwHeIDTv3RzPr2mz5S8DYoDwQaOzmPQN4OcT+uwMvuPvJQA1wKzCR2Agr/zNhvRHA3xMbYu024Bt3PwlYBlwe4jgiWaMkKdI6X7j7q0H5TzSdQaK1TiGWRKrcvQ6YR2yS2tZ6FbjfzH5EbFiyTBa6e4O7/yexMT+Pbbb8ZWBscA10DbDRYvNIjiE2lmYme4DGocRWAS+6+96gPDhhvefdvcbdq4DtwN8StklcTyTndE1SpHWaj+fY+L6Off/z2bwl1oSZHcG+BPBH4KuQx0u73/gG7j82s1OJtQxXmlmm64Opzqlxf1+aWW9i8/y9BPQBvg/sdPeaECHt9X3jYDYAu4P9NphZ4m/R7oRyQ8L7BvSbJXmmlqRI6wwyszFB+RLglaC8Hjg5KF+Ubgfu/kXQTToyGNz5DeA7ZlZqZh2D/b4YrL7RzI4zsw7Euicb1QA9k+3fzI509zfc/ZfAZppOm5TMxWbWIbi2+S3gwyTrLAP+kViSfBn4Z8J1tYq0SUqSIq2zFrjCzN4j1qK6J6j/H8C/mdnLQH1LdujuG4CbgeeJTWv0jrs/Fiy+idhdrM8BGxI2mw/8IrixpcmNO8Ru6FllZquJJbV3M4TwIbGkvBT4sbvXJlnnZaCTu68jNtlvH5QkpR3TLCAiLWRmg4HH3X1ExKFkjZndT+ycFmVxnzvdvUe29pdk/7cQ6+r9ba6OIaKWpIjkyo5cDiYAXAboWUnJKbUkRUREUlBLUkREJAUlSRERkRSUJEVERFJQkhQREUlBSVJERCSF/w+L15cdZaRKBwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "<Figure size 504x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(1,1,figsize=(7,4))\n", + "pm.hist.plot_Pw(ax,0.68)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "ax = plt.axes()\n", + "for t in np.linspace(0.,0.62,4):\n", + " pm.plot_sf(ax,t)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "ax = plt.axes()\n", + "for t in np.linspace(0.,.99,5):\n", + " pm.plot_s(ax,t)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "ax = plt.axes()\n", + "for t in np.linspace(0.,.99,5):\n", + " pm.plot_eps_p(ax,t)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAEGCAYAAACUzrmNAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAdX0lEQVR4nO3de7SddX3n8fcHUBCEIhCYQIgJNDDlMgY4gzBUioPKzQLaFoOOILKMMDCK1o5ErVK7spYXLgOiwVgYwHIvULI0cpFVQVsiJBBIuJVAohyTJpGLSQdNSfjOH8/veHZO9t7PPufs53n25fNa66w8+/dc9pfnbPb3/C7P76eIwMzMrJmtqg7AzMw6n5OFmZnlcrIwM7NcThZmZpbLycLMzHJtU3UARdltt91iypQpVYdhZtZVFi1a9OuImDCyvGeTxZQpU1i4cGHVYZiZdRVJv6hX7mYoMzPL5WRhZma5nCzMzCyXk4WZmeVysjAzs1xOFmZmlsvJwszMcvXscxZm1id+chKsnF91FJ3lw+1fesLJwqyT+YvQOoSbocw6mROFdQjXLKz7+a9vs8K5ZmHdz4nCrHCuWVj3yKtBHN/FE0fePdB4387vgD/6XHmxVO3pi+HVxxvvP/ir5cXSjQ7+60Iu62Rh3aNZophwVHlxFOnI71cdQfWaJYodp5UXh23GycK6TzfXIKx1rkF0FPdZmJlZLicLMzPLVViykHSNpDWSltaU3SJpcfpZIWlxKp8i6bc1+66qOecwSUskLZN0hSQVFbOZmdVXZJ/FtcCVwPVDBRHxoaFtSZcAv6k5/vmImF7nOnOAmcACYD5wPPCjAuK1TtHLz00s+jSs/eeqo+gMeaOerKMUVrOIiAeBl+vtS7WD04Cbml1D0kRgp4h4KCKCLPGc2u5YrcP08qinZoli53eUF0cn8KinrlLVaKh3Aasj4rmasqmSHgPWAV+KiJ8CewGDNccMpjLrB7086slDZId51FNXqCpZnM7mtYpVwOSIeEnSYcA/SjoQqNc/0XA6RUkzyZqsmDx5chvDNTPrb6WPhpK0DfBB4JahsojYEBEvpe1FwPPAfmQ1iUk1p08CVja6dkTMjYiBiBiYMGFCEeGbmfWlKobOvgd4JiJ+37wkaYKkrdP2PsA04IWIWAWsl3RE6uc4A7irgpjNzPpakUNnbwIeAvaXNCjp7LRrBlt2bB8NPCHpceAfgHMiYqhz/Fzg74BlZDUOj4QyMytZYX0WEXF6g/KP1Sm7Hbi9wfELgYPaGpyZmY2K54ay6vTy8xRmPcbJwqrTy89T+OE76zFOFla9Xnyewg/fDfOT2j3BycKsSH74zk9q9wgnCzMrh5/Ubp8V34f1z9Xft+TL8OGGzy6PmacoNzPrNo0SRYFcszAz61Z/eM6WZYfPKeStXLMwM7NcThZmZpbLycLMzHI5WZiZWS53cFvxPK2HWddzsrDieVoPs67nZGHl8bQeZl3LycKsHTyth+eA6nHu4Daz9vAcUD3NNQszay/PAdU+zeaAKplrFmZmnapZoth+cnlxUGDNQtI1wPuBNRFxUCq7CPgEsDYd9oWImJ/2zQLOBjYBn4qIe1L5YcC1wFuA+cCnI6L9UyqamXWqenNAlazImsW1wPF1yi+LiOnpZyhRHADMAA5M53xH0tbp+DnATGBa+ql3TTMzK1BhySIiHgRebvHwU4CbI2JDRCwHlgGHS5oI7BQRD6XaxPXAqcVEbGZmjVTRZ3G+pCckXSPpbalsL+DFmmMGU9leaXtkeV2SZkpaKGnh2rVrGx1mZmajVHaymAPsC0wHVgGXpHLVOTaalNcVEXMjYiAiBiZMmDDeWM3MLCk1WUTE6ojYFBFvAN8DDk+7BoG9aw6dBKxM5ZPqlJuZWYlKfc5C0sSIWJVefgBYmrbnATdKuhTYk6wj++GI2CRpvaQjgJ8DZwDfKjNmGwVPGGjWs4ocOnsTcAywm6RB4CvAMZKmkzUlrQA+CRART0q6FXgK2AicFxGb0qXOZXjo7I/Sj3WiXp4w0KzPFZYsIuL0OsVXNzl+NjC7TvlC4KA2hmZF68UJA836nKf7MGuFpyK3PudkYdYKT0U+zLPL9iUnC7PR8FTknl22TzlZmNnYeHbZvuJkYWZWtQ6airwRT1FuZla1DpqKvBHXLMzMOkUHTEXeiGsWZmaWy8nCzMxyOVmYmVkuJwszM8vlZGFmZrmcLMzMLJeHztroed0Ks77jmoWNntetMOs7rlnY2HndCrO+4WRhVsvrVpjVVVgzlKRrJK2RtLSm7JuSnpH0hKQ7Je2cyqdI+q2kxennqppzDpO0RNIySVdIUlExm3ndCrP6iqxZXAtcCVxfU3YfMCsiNkr6OjAL+Hza93xETK9znTnATGABMB84Hq/DbUXzuhVe5Mg2U1jNIiIeBF4eUXZvRGxMLxcAk5pdQ9JEYKeIeCgigizxnFpEvGY2ghc5shpV9ll8HLil5vVUSY8B64AvRcRPgb2AwZpjBlOZmZXFixwZFSULSV8ENgI3pKJVwOSIeEnSYcA/SjoQqNc/EU2uO5OsyYrJkztjDngzs9/rgkWOGin9OQtJZwLvBz6SmpaIiA0R8VLaXgQ8D+xHVpOobaqaBKxsdO2ImBsRAxExMGHChKL+E8zMxqYLFjlqpNSahaTjyTq0/yQiXqspnwC8HBGbJO0DTANeiIiXJa2XdATwc+AM4Ftlxmxm1nYdvMhRI4UlC0k3AccAu0kaBL5CNvppW+C+NAJ2QUScAxwNfFXSRmATcE5EDHWOn0s2suotZKOgPBLKzKxkTZOFpF1auMYbEfHqyMKIOL3OsVfXu0BE3A7c3mDfQuCgFuIwM7OC5NUsVqafZg/CbQ10dmObmZmNS16yeDoiDml2QBruamZmPSxvNNSRLVyjlWPMzKyLNa1ZRMTval9L2h3Yrmb/L0ceY2Zmvael5ywknSzpOWA58ACwAo9KMjPrG60Onf1b4AjgxxFxiKR3A/VGO1kv8Yp4Zpa0+gT36+kJ660kbRUR/wTUmyHWeolXxDOzpNWaxauS3go8CNwgaQ3Z3E7WD7winlnfa7VmcTLwGvAZ4G6yuZv+tKigzMyss+Q9wf1OYC6wL7AEODsirisjMLNCeflUs1HJq1l8G/gcsCtwKXBZ4RGZlcHLp5qNSl6fxVYRcV/avk3SrKIDMiuVl0/18qnWkrxksbOkDzZ6HRF3FBOWmZXGy6daC/KSxQNs3pFd+zoAJwuzXuHlU62JvOk+ziorEDOzntHFy6c2kjca6rPN9kfEpe0Nx8ysB3Tx8qmN5DVDXQwsJpsHagPN17UwM7NaXbh8aiN5yeJQYAZwErAIuAm4PyKi6MDMzKxzNH3OIiIWR8SFETGdbEnUU4CnJJ2cd2FJ10haI2lpTdkuku6T9Fz69201+2ZJWibpWUnH1ZQfJmlJ2neF0uLdZmZWnlanKJ8AHAIcDAwCa1o47Vrg+BFlF5LVTKYB96fXSDqArAZzYDrnO5K2TufMAWYC09LPyGuamVnBmiYLSWdJuhu4jay/4rSIeG9ELMi7cEQ8CLw8ovgUYGi6kOuAU2vKb46IDRGxHFgGHC5pIrBTRDyUmr6urznHzMxKktdncTXZnFC/BI4D3lfbChQRuc1RI+wREavSuavSynsAewG1CWgwlb2etkeW1yVpJlkthMmTu3PEgZlZJ8pLFu8uJYr6o6yiSXldETGXbOJDBgYG3AlvZtYmeQ/lPdDm91staWKqVUxkuO9jENi75rhJwMpUPqlOuZmZlSivz2Ju3gVaOabGPODMtH0mcFdN+QxJ20qaStaR/XBqslov6Yg0CuqMmnOsXX5yEtyoLX/MzJK8ZqhTJf2uyX7RoKlK0k3AMcBukgaBrwBfA26VdDZZP8hfAETEk5JuBZ4iW4HvvIjYlC51LtnIqreQPRz4o/z/LBsVL59qZjnyksVftXCNn9YrjIjTGxx/bIPjZwOz65QvBA5qIQ4bLy+famYN5PVZeFU8MzNreQ1uMzPrY3nNUGbdzWttm7XFqGsWkraStFMRwZi1ndfaNmuLlmoWkm4EzgE2kc0++weSLo2IbxYZnFnbeK1tr7Vt49JqzeKAiFhHNi/TfGAy8NHCojKz9vNa2zYOrfZZvEnSm8iSxZUR8bokT6dh1o281nb79ODyqY20WrP4LrAC2AF4UNLbgXVFBWVm1hV6cPnURlqqWUTEFcAVNUW/kFTWJINmZp2th5ZPbaTVxY8+LWknZa6W9Cjw3wuOzczMOkSrzVAfTx3c7wMmAGeRzfNkZmZ9oNVkMTQF6YnA/42Ix6m/1oSZmfWgVpPFIkn3kiWLeyTtCLxRXFhmZtZJWh06ezYwHXghIl6TtCtZU5SZmfWBVmsWARwAfCq93gHYrpCIzMys47SaLL4DHAkMrVGxHvh2IRGZmVnHabUZ6p0RcaikxwAi4hVJby4wLivCT05qviqemVkDrdYsXpe0NVlzFJImMMYObkn7S1pc87NO0gWSLpL0q5ryE2vOmSVpmaRnJR03lvc1vHyqmY1ZqzWLK4A7gd0lzQb+HPjSWN4wIp4l6ywnJaBfpWufBVwWERfXHi/pAGAGcCCwJ/BjSfvVrNFto9Vry6d6zQqzwuUmC0lbAcuB/022fraAUyPi6Ta8/7HA8xHxC6nhYxunADdHxAZguaRlwOHAQ214f+sFeYnC61aYjVtusoiINyRdEhFHAs+0+f1nADfVvD5f0hnAQuAvI+IVYC9gQc0xg6nMbHNes8JrVlhhWu2zuFfSn6nJn/+jlTrITwZuS0VzgH3JmqhWAZcMHVrn9LrTo0uaKWmhpIVr165tV6hm3SMvUXjdChujVvssPkv2bMVGSb8j+wKPiBjP8qonAI9GxGqyi60e2iHpe8AP0stBYO+a8yYBK+tdMCLmAnMBBgYGvN6G9S+vWdFefbRuRSMt1SwiYseI2Coi3hwRO6XX412H+3RqmqAkTazZ9wFgadqeB8yQtK2kqcA04OFxvreZWev6aN2KRlpdg/v+iDg2r6xVkrYH3gt8sqb4G5KmkzUxrRjaFxFPSroVeArYCJznkVBmVok+WLeikabJQtJ2wPbAbpLexnD/wU5kw1jHJCJeA3YdUdZwTe+ImA3MHuv7mZnZ+OTVLD4JXECWGBYxnCzW4ek+zMz6RtNkERGXA5dL+l8R8a2SYjIzsw7T6tDZf0trWCDpS5LukHRogXGZmVkHaTVZ/HVErJf0x8BxwHVkz0WYmVkfaDVZDI0+OgmYExF3AZ511sysT7T6UN6vJH0XeA/wdUnb0nqisbJ5KnIza7NWk8VpwPHAxRHxanqA7q+KC8vGpVenIvfssmaVaSlZpOci7qh5vYps/ibrZL02FXmzRNFvM8t6wkArWas1C7PO4dllmycKTxZoBXCyMOtmnjCwvTxhYEPupDYzG+IJAxtyzcLMbKQ+njCwEdcszMwsl5OFmZnlcrIwM7NcThZmZpbLycLMzHJ5NFQ369U5oDyth1nHqSRZSFoBrCebzXZjRAxI2gW4BZhCtgb3aRHxSjp+FnB2Ov5TEXFPBWF3nl6dA8rTegzztB7WIaqsWbw7In5d8/pC4P6I+JqkC9Prz0s6AJgBHEi2vOuPJe0XEZu2vGSf6rU5oIZ4Wg9P62Edo5OaoU4Bjknb1wE/AT6fym+OiA3AcknLgMOBhyqI0awantajfTylx5hU1cEdwL2SFkmamcr2SLPZDs1qu3sq3wt4sebcwVS2BUkzJS2UtHDt2rUFhW5mXS0vUfT5tB6NVFWzOCoiVkraHbhP0jNNjlWdsqh3YETMBeYCDAwM1D3GzAzwlB6jVEnNIiJWpn/XAHeSNSutTosqkf5dkw4fBPauOX0SsLK8aM3MrPRkIWkHSTsObQPvA5YC84Az02FnAnel7XnADEnbSpoKTAMeLjdqM7P+VkUz1B7AnZKG3v/GiLhb0iPArZLOBn4J/AVARDwp6VbgKWAjcJ5HQpmZlav0ZBERLwBbDJaPiJeAYxucMxuYXXBoVjY/fDfMz1NYh/N0H1YdP3w3zM9TWIfrpOcsrJ5endKjlh++G+bnKdrHz1O0lWsWnS4vUXTztB5mRfISqW3lmkW36NUpPcyK5ucp2sI1CzMzy+VkYWZmudwMZcXzENlhHiJrXco1Cyueh8gO8xBZ61KuWVh5PER2mIfIto+HyJbCNQsz624eIlsK1yw6RT88fGdWJA+RLZRrFp2iV9fTNrOe4JpFp+nmh+886mmYRz1Zj3GysPbxqKdhHvXUfu7IrpSThbWfRz0N86in9nFHdqWcLMysu7gjuxJOFjZ67psY5r4J6xOlJwtJewPXA/8JeAOYGxGXS7oI+ASwNh36hYiYn86ZBZwNbAI+FRH3lB132/TCEFn3TQxz30T7uW+iI1VRs9gI/GVEPCppR2CRpPvSvssi4uLagyUdAMwADgT2BH4sab+uXYe7l4bIum9imPsm2sd9Ex2pijW4VwGr0vZ6SU8DezU55RTg5ojYACyXtAw4HHio8GCL1M1DZPuRm5vK576JjlJpn4WkKcAhwM+Bo4DzJZ0BLCSrfbxClkgW1Jw2SIPkImkmMBNg8mT/BTJu7psY5uYm63OVJQtJbwVuBy6IiHWS5gB/C0T69xLg44DqnB71rhkRc4G5AAMDA3WPsVFw38SW3NzUPu6b6CqVJAtJbyJLFDdExB0AEbG6Zv/3gB+kl4PA3jWnTwJWlhSqQX/1Tbi5qTzum+gqVYyGEnA18HREXFpTPjH1ZwB8AFiatucBN0q6lKyDexrwcIkh9z43Nw1zc1P75dUg3DfRFaqoWRwFfBRYImlxKvsCcLqk6WRNTCuATwJExJOSbgWeIhtJdV5XjITqpiGybm7akpub2sc1iJ5QxWion1G/H6LhN2tEzAZmFxZUEbpxiKybm6xIrkF0NT/BXbROGiLbj81NY0kKbm4aG3dY9zQni37Sj81NeX0QUz5aXiy9zs1NPc3Johfl1SB6rbmpldqD+yDaxx3WfcnJohf1ag1irP0MblYam7E0K7kG0bOcLMarylFPvVqDGGs/g5uUxmasSWHPE4uJxzqSk8V4VTnqqdtrEE4K5XJSsHFwsmiXokY9tTKCqVNqEO0cjuqk0Fy7Rx45KVgOJ4tOl5coiqxBlPEsgpNCpqxhp04KNkZOFp2ijP4Hf/nn66ZnBfzFbyVysugU7ex/KLo5qNkX6vrnYMmX2/Pe/cZf/tbBnCxa1a5RT6OtQQx98T9U0V/r/fjl7y9tsy04WbRqtKOexjq1RlVJYbT8hWrWV5wsRqvVUU+dOgeTv+TNbAycLMarjMn5/AVvZhVzshivdiYKJwUz61BOFlVwUjCzLuNkMVp3D7R+7FbbwT4fKywUM7OyOFmMdGO9Rfxa4GmZzayHdU2ykHQ8cDmwNfB3EfG1smP44WMn8v6Lf1j225pZm53435bww8u+U3UYXaUrkoWkrYFvA+8FBoFHJM2LiKfa/l4fiXZf0sw6zPx/ORi9c07VYWym0xNYVyQL4HBgWUS8ACDpZuAUoO3JYvrbxfK19fdt3AT/b0O737EIBwG7Vh2EmY3C/H8BvbMdV7qAiP/TjgttpluSxV7AizWvB4EtbqukmcBMgMmTx7Zi15IXYdMbYzq1gyytOoARnLzMul23JIt6vc5btBdFxFxgLsDAwMCY2pM2bnIzlJnZSFtVHUCLBoG9a15PAlZWFIuZWd/plmTxCDBN0lRJbwZmAPMqjsnMrG90RTNURGyUdD5wD9nQ2Wsi4smKwzIz6xtdkSwAImI+0IYFJczMbLS6pRnKzMwq5GRhZma5nCzMzCyXk4WZmeVSRG8+hCZpLfCLMZ6+G/DrNobTLo5rdBzX6Diu0enVuN4eERNGFvZsshgPSQsjYhQLV5TDcY2O4xodxzU6/RaXm6HMzCyXk4WZmeVysqhvbtUBNOC4RsdxjY7jGp2+ist9FmZmlss1CzMzy+VkYWZmuZwsakg6XtKzkpZJurDCOPaW9E+Snpb0pKRPp/KLJP1K0uL0c2IFsa2QtCS9/8JUtouk+yQ9l/59W8kx7V9zTxZLWifpgqrul6RrJK2RtLSmrOE9kjQrfeaelXRcyXF9U9Izkp6QdKeknVP5FEm/rbl3V5UcV8PfXcX365aamFZIWpzKS7lfTb4biv98RYR/sn6brYHngX2ANwOPAwdUFMtE4NC0vSPwr8ABwEXA5yq+TyuA3UaUfQO4MG1fCHy94t/jvwFvr+p+AUcDhwJL8+5R+r0+DmwLTE2fwa1LjOt9wDZp++s1cU2pPa6C+1X3d1f1/Rqx/xLgy2XerybfDYV/vlyzGHY4sCwiXoiI/wBuBk6pIpCIWBURj6bt9cDTZOuQd6pTgOvS9nXAqRXGcizwfESM9en9cYuIB4GXRxQ3ukenADdHxIaIWA4sI/sslhJXRNwbERvTywVkq1CWqsH9aqTS+zVEkoDTgJuKeO8mMTX6bij88+VkMWwv4MWa14N0wBe0pCnAIcDPU9H5qcngmrKbe5IA7pW0SNLMVLZHRKyC7MMM7F5BXENmsPn/wFXfryGN7lEnfe4+Dvyo5vVUSY9JekDSuyqIp97vrlPu17uA1RHxXE1ZqfdrxHdD4Z8vJ4thqlNW6bhiSW8FbgcuiIh1wBxgX2A6sIqsGly2oyLiUOAE4DxJR1cQQ13Kltw9GbgtFXXC/crTEZ87SV8ENgI3pKJVwOSIOAT4LHCjpJ1KDKnR764j7hdwOpv/UVLq/arz3dDw0DplY7pfThbDBoG9a15PAlZWFAuS3kT2YbghIu4AiIjVEbEpIt4AvkdB1e9mImJl+ncNcGeKYbWkiSnuicCasuNKTgAejYjVKcbK71eNRveo8s+dpDOB9wMfidTQnZotXkrbi8jauvcrK6Ymv7tOuF/bAB8EbhkqK/N+1ftuoITPl5PFsEeAaZKmpr9QZwDzqggktYdeDTwdEZfWlE+sOewDwNKR5xYc1w6SdhzaJuscXUp2n85Mh50J3FVmXDU2+2uv6vs1QqN7NA+YIWlbSVOBacDDZQUl6Xjg88DJEfFaTfkESVun7X1SXC+UGFej312l9yt5D/BMRAwOFZR1vxp9N1DG56vo3vtu+gFOJBtd8DzwxQrj+GOyquITwOL0cyLwfWBJKp8HTCw5rn3IRlY8Djw5dI+AXYH7gefSv7tUcM+2B14C/qCmrJL7RZawVgGvk/1ld3azewR8MX3mngVOKDmuZWRt2kOfs6vSsX+WfsePA48Cf1pyXA1/d1Xer1R+LXDOiGNLuV9NvhsK/3x5ug8zM8vlZigzM8vlZGFmZrmcLMzMLJeThZmZ5XKyMDOzXE4W1rfSTKGFPHuRZiTdrdXycb7XFEkfrnn9MUlXtvM9zJwszLrfFODDeQeZjYeThfW7bSRdlyas+wdJ2wNIOjZNCrckTWS3bSpfIelvJD2a9v3nVL6rpHvTOd+l/pw8m5H0PyQ9nNY/+G7NE8D/Lmm2pMclLZC0RyrfN71+RNJXJf17utTXgHel63wmle0p6e60vsE32nvLrB85WVi/2x+YGxH/BVgH/E9J25E9pfuhiDgY2AY4t+acX0c2meIc4HOp7CvAzyKbSG4eMLnZm0r6I+BDZBMzTgc2AR9Ju3cAFkTEO4AHgU+k8suByyPiv7L5/D4XAj+NiOkRcVkqm56ufzDwIUm18wOZjZqThfW7FyPin9P235NNp7A/sDwi/jWVX0e2EM6QocnbFpE1AZH2/z1ARPwQeCXnfY8FDgMeUbba2rFk06kA/AfwgzrvcSTDM+remHP9+yPiNxHxO+ApssWgzMZsm6oDMKvYyPlugvwmpA3p301s/v/QaObOEXBdRMyqs+/1GJ6HZ+R7tGpDzfZYr2H2e65ZWL+bLOnItH068DPgGWCKpD9M5R8FHsi5zoOkZiRJJwB5Cy3dD/y5pN3TObtIyvvrfwHZhHWQzYo8ZD3ZEptmhXGysH73NHCmpCeAXYA5qenmLOA2SUuAN4Crcq7zN8DRkh4lm7r9l80OjoingC+RrTr4BHAf2frKzVwAfFbSw+nY36TyJ4CNqUP8Mw3PNhsHzzpr1iXSSK3fRkRImgGcHhGVrBNv/cftmGbd4zDgyrQAzqtka2ablcI1CzMzy+U+CzMzy+VkYWZmuZwszMwsl5OFmZnlcrIwM7Nc/x/GiyIl4NlIIwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "ax = plt.axes()\n", + "for t in np.linspace(0.,.99,5):\n", + " pm.plot_sig_p(ax,t)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Questions and Tasks" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1 Define a symmetric loading scenario with increasing amplitude and 3 cycles" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "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.7.6" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": true, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": true + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/bmcs_course/4_1_Pullout_with_unloading.ipynb b/bmcs_course/4_1_Pullout_with_unloading.ipynb deleted file mode 100644 index c403cab..0000000 --- a/bmcs_course/4_1_Pullout_with_unloading.ipynb +++ /dev/null @@ -1,456 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Example 4.1: Pull-out with unloading" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "from bmcs.api import PullOutModel" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Model parameters\n", - "Let us consider the case of the CFRP sheet debonding from concrete" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "A_f = 16.67 # [mm^2]\n", - "A_m = 1540.0 # [mm^2]\n", - "p = 1.0 #\n", - "E_f = 170000 # [MPa]\n", - "E_m = 28000 # [MPa]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Construct the finite element pullout model\n", - "The model uses a multilinear bond-slip law specified by the attributes \n", - "s_arr and tau_arr specifying the pairs of slip and bond stress values." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "\n", - " \\begin{array}{lrrl}\\hline\n", - " \\textrm{k_max} & k_{\\max} = 200 & \\textrm{[-]} & \\textrm{maximum number of iterations} \\\\\n", - " \\textrm{tolerance} & \\epsilon = 0.0001 & \\textrm{[-]} & \\textrm{required accuracy} \\\\\n", - " \\textrm{n_e_x} & n_\\mathrm{E} = 50 & \\textrm{[-]} & \\textrm{number of finite elements along the embedded length} \\\\\n", - " \\textrm{mats_eval_type} & \\textrm{multilinear} & & \\textrm{material model type} \\\\\n", - " \\textrm{control_variable} & \\textrm{u} & & \\textrm{displacement or force control: [u|f]} \\\\\n", - " \\textrm{w_max} & w_{\\max} = 1.84 & \\textrm{[mm]} & \\textrm{maximum pullout slip} \\\\\n", - " \\textrm{fixed_boundary} & \\textrm{non-loaded end (matrix)} & & \\textrm{which side of the specimen is fixed [non-loaded end [matrix], loaded end [matrix], non-loaded end [reinf]]} \\\\\n", - " \\hline\n", - " \\textbf{loading_scenario} & \\textrm{LoadingScenario} & & \\textrm{object defining the loading scenario} \\\\\n", - " \\textbf{cross_section} & \\textrm{CrossSection} & & \\textrm{cross section parameters} \\\\\n", - " \\textbf{geometry} & \\textrm{Geometry} & & \\textrm{geometry parameters of the boundary value problem} \\\\\n", - " \\textbf{mats_eval} & \\textrm{MATSBondSlipMultiLinear} & & \\textrm{material model of the interface} \\\\\n", - " \\hline\n", - " \\end{array}\n", - " " - ], - "text/plain": [ - "<bmcs.pullout.pullout_sim.PullOutModel at 0x7f05d5785530>" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pm = PullOutModel(mats_eval_type='multilinear',\n", - " n_e_x=50, k_max=200, w_max=1.84)\n", - "pm.sim.tline.step = 0.001\n", - "pm.mats_eval.s_tau_table = [[0, 0.1, 0.4, 4],\n", - " [0, 800, 0, 0]]\n", - "# w = pm.get_window()\n", - "# w.configure_traits()\n", - "pm" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "\n", - " \\begin{array}{lrrl}\\hline\n", - " \\textrm{loading_type} & option = monotonic & \\textrm{[-]} & \\textrm{possible values: [monotonic, cyclic]} \\\\\n", - " \\textrm{number_of_cycles} & n_\\mathrm{cycles} = 1 & \\textrm{[-]} & \\textrm{for cyclic loading} \\\\\n", - " \\textrm{maximum_loading} & \\phi_{\\max} = 1.0 & \\textrm{[-]} & \\textrm{load factor at maximum load level} \\\\\n", - " \\textrm{unloading_ratio} & \\phi_{\\mathrm{unload}} = 0.5 & \\textrm{[-]} & \\textrm{fraction of maximum load at lowest load level} \\\\\n", - " \\textrm{number_of_increments} & n_{\\mathrm{incr}} = 20 & \\textrm{[-]} & \\textrm{number of values within a monotonic load branch} \\\\\n", - " \\textrm{amplitude_type} & option = increasing & \\textrm{[-]} & \\textrm{possible values: [increasing, constant]} \\\\\n", - " \\textrm{loading_range} & option = non-symmetric & \\textrm{[-]} & \\textrm{possible values: [non-symmetric, symmetric]} \\\\\n", - " \\hline\n", - " \\hline\n", - " \\end{array}\n", - " " - ], - "text/plain": [ - "<bmcs.time_functions.loading_scenario.LoadingScenario at 0x7f0590610e90>" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "<Figure size 432x288 with 1 Axes>" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "pm.loading_scenario.plot(plt.axes())\n", - "pm.loading_scenario" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "\n", - " \\begin{array}{lrrl}\\hline\n", - " \\textrm{loading_type} & option = cyclic & \\textrm{[-]} & \\textrm{possible values: [monotonic, cyclic]} \\\\\n", - " \\textrm{number_of_cycles} & n_\\mathrm{cycles} = 2 & \\textrm{[-]} & \\textrm{for cyclic loading} \\\\\n", - " \\textrm{maximum_loading} & \\phi_{\\max} = 1.0 & \\textrm{[-]} & \\textrm{load factor at maximum load level} \\\\\n", - " \\textrm{unloading_ratio} & \\phi_{\\mathrm{unload}} = 0.0 & \\textrm{[-]} & \\textrm{fraction of maximum load at lowest load level} \\\\\n", - " \\textrm{number_of_increments} & n_{\\mathrm{incr}} = 20 & \\textrm{[-]} & \\textrm{number of values within a monotonic load branch} \\\\\n", - " \\textrm{amplitude_type} & option = constant & \\textrm{[-]} & \\textrm{possible values: [increasing, constant]} \\\\\n", - " \\textrm{loading_range} & option = non-symmetric & \\textrm{[-]} & \\textrm{possible values: [non-symmetric, symmetric]} \\\\\n", - " \\hline\n", - " \\hline\n", - " \\end{array}\n", - " " - ], - "text/plain": [ - "<bmcs.time_functions.loading_scenario.LoadingScenario at 0x7f0590610e90>" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pm.loading_scenario.loading_type='cyclic'\n", - "pm.loading_scenario.trait_set(number_of_cycles=2,\n", - " unloading_ratio=0.0,\n", - " amplitude_type='constant',\n", - " loading_range='non-symmetric')\n", - "pm.loading_scenario" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "<Figure size 432x288 with 1 Axes>" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "pm.loading_scenario.plot(plt.axes())" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "\n", - " \\begin{array}{lrrl}\\hline\n", - " \\textrm{A_m} & A_\\mathrm{m} = 1540.0 & \\textrm{[$\\mathrm{mm}^2$]} & \\textrm{matrix area} \\\\\n", - " \\textrm{A_f} & A_\\mathrm{f} = 16.67 & \\textrm{[$\\mathrm{mm}^2$]} & \\textrm{reinforcement area} \\\\\n", - " \\textrm{P_b} & p_\\mathrm{b} = 1.0 & \\textrm{[$\\mathrm{mm}$]} & \\textrm{perimeter of the bond interface} \\\\\n", - " \\hline\n", - " \\hline\n", - " \\end{array}\n", - " " - ], - "text/plain": [ - "<bmcs.pullout.pullout_sim.CrossSection at 0x7f058b14fa70>" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pm.cross_section.trait_set(A_f=A_f, P_b=p, A_m=A_m)\n", - "pm.cross_section # display the cross section parameters" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "\n", - " \\begin{array}{lrrl}\\hline\n", - " \\textrm{L_x} & L = 45 & \\textrm{[$\\mathrm{mm}$]} & \\textrm{embedded length} \\\\\n", - " \\hline\n", - " \\hline\n", - " \\end{array}\n", - " " - ], - "text/plain": [ - "<bmcs.pullout.pullout_sim.Geometry at 0x7f058b14f9b0>" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pm.geometry # geometry of the boundary value problem" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plot the current bond-slip law" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "\n", - " \\begin{array}{lrrl}\\hline\n", - " \\textrm{E_m} & E_\\mathrm{m} = 28000.0 & \\textrm{[MPa]} & \\textrm{E-modulus of the matrix} \\\\\n", - " \\textrm{E_f} & E_\\mathrm{f} = 170000.0 & \\textrm{[MPa]} & \\textrm{E-modulus of the reinforcement} \\\\\n", - " \\textrm{s_data} & s = & \\textrm{[mm]} & \\textrm{slip values} \\\\\n", - " \\textrm{tau_data} & \\tau = & \\textrm{[MPa]} & \\textrm{shear stress values} \\\\\n", - " \\hline\n", - " \\hline\n", - " \\end{array}\n", - " " - ], - "text/plain": [ - "<ibvpy.mats.mats1D5.vmats1D5_bondslip1D.MATSBondSlipMultiLinear at 0x7f058b08e8f0>" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pm.mats_eval # configuration of the material model" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pm.mats_eval.bs_law.plot(plt, color='green')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "c='red'\n", - "pm.geometry.L_x = 200\n", - "pm.sim.run()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fig, ax = plt.subplots(1,1,figsize=(7,4))\n", - "pm.hist.plot_Pw(ax,0.68)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ax = plt.axes()\n", - "for t in np.linspace(0.,0.62,4):\n", - " pm.plot_sf(ax,t)\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ax = plt.axes()\n", - "for t in np.linspace(0.,.99,5):\n", - " pm.plot_s(ax,t)\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ax = plt.axes()\n", - "for t in np.linspace(0.,.99,5):\n", - " pm.plot_eps_p(ax,t)\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ax = plt.axes()\n", - "for t in np.linspace(0.,.99,5):\n", - " pm.plot_sig_p(ax,t)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Questions and Tasks" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1 Define a symmetric loading scenario with increasing amplitude and 3 cycles" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "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.7.6" - }, - "toc": { - "base_numbering": 1, - "nav_menu": {}, - "number_sections": true, - "sideBar": true, - "skip_h1_title": true, - "title_cell": "Table of Contents", - "title_sidebar": "Contents", - "toc_cell": false, - "toc_position": {}, - "toc_section_display": true, - "toc_window_display": true - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/bmcs_course/4_2_BS_elastic_plastic_slip.ipynb b/bmcs_course/4_2_BS_elasto_plastic.ipynb similarity index 99% rename from bmcs_course/4_2_BS_elastic_plastic_slip.ipynb rename to bmcs_course/4_2_BS_elasto_plastic.ipynb index f12403d..4960758 100644 --- a/bmcs_course/4_2_BS_elastic_plastic_slip.ipynb +++ b/bmcs_course/4_2_BS_elasto_plastic.ipynb @@ -633,6 +633,13 @@ "\\end{align}" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, diff --git a/bmcs_course/4_3_BS_EP_SH_IK.ipynb b/bmcs_course/4_3_BS_EP_SH_IK.ipynb new file mode 100644 index 0000000..92ad5d5 --- /dev/null +++ b/bmcs_course/4_3_BS_EP_SH_IK.ipynb @@ -0,0 +1,1123 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Bond-slip elasto-plstic model with isotropic and kinematic hardening \n", + "This notebook is a work in progress on an abstract and general implementation of time integration algorithm for general damage-plasticity modes. It serves for the development of a package that can be configured by specifying the ingredients of thermodynamically based model\n", + "\n", + " - Vector of state variables $\\boldsymbol{\\mathcal{E}}$\n", + " - Vector of streses $\\boldsymbol{\\mathcal{S}}$\n", + " - Yield condition $f(\\boldsymbol{\\mathcal{S}},\\boldsymbol{\\mathcal{E}})$\n", + " - Flow potential $\\varphi(\\boldsymbol{\\mathcal{S}},\\boldsymbol{\\mathcal{E}})$\n", + "\n", + "as symbolic equations using the sympy package. The time-stepping algorithm gets generated automatically within the thermodynamically framework. The derived evolution equations and return-mapping to the yield surface is performed using Newton-Raphson scheme. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "%matplotlib notebook\n", + "import sympy as sp\n", + "sp.init_printing()\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Material parameters" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "E_b = sp.Symbol('E_b', real=True, nonnegative=True)\n", + "gamma = sp.Symbol('gamma', real=True, nonnegative=True)\n", + "K = sp.Symbol('K', real=True)\n", + "tau_bar = sp.Symbol(r'\\bar{\\tau}', real=True, nonnegative=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "py_vars = ('E_b', 'gamma', 'K', 'tau_bar')\n", + "map_py2sp = {py_var : globals()[py_var] for py_var in py_vars}\n", + "sp_vars = tuple(map_py2sp[py_var] for py_var in py_vars)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## State variables" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "s = sp.Symbol('s', real=True)\n", + "s_pi = sp.Symbol(r's_pi', real=True)\n", + "alpha = sp.Symbol('alpha', real=True)\n", + "z = sp.Symbol('z', real=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "Eps = sp.Matrix([s_pi, z, alpha])\n", + "Eps.T" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Thermodynamic forces" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "tau = sp.Symbol('tau', real=True)\n", + "X = sp.Symbol('X', real=True)\n", + "Z = sp.Symbol('Z', real=True, nonnegative=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "Sig = sp.Matrix([tau, Z, X])\n", + "Sig.T" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Sig_Eps = sp.Matrix([[E_b * (s - s_pi), K * z, alpha * gamma]]).T\n", + "Sig_Eps" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "**Executable code for** $\\boldsymbol{\\mathcal{S}}(s,\\boldsymbol{\\mathcal{E}})$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "get_Sig = sp.lambdify(\n", + " (s, Eps) + sp_vars, Sig_Eps.T, 'numpy'\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "To derive the time stepping procedure we will need also the matrix of derivatives of the generalized stresses $\\boldsymbol{\\mathcal{S}}$ with respect to the kinematic variables $\\boldsymbol{\\mathcal{E}}$ \n", + "\\begin{align}\n", + " \\partial_\\boldsymbol{\\mathcal{E}} \\boldsymbol{\\mathcal{S}}\n", + "\\end{align}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "dSig_dEps = sp.Matrix([Sig_Eps.T.diff(eps) for eps in Eps]).T\n", + "dSig_dEps" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "**Executable Python code generation** $\\partial_\\boldsymbol{\\mathcal{E}} \\boldsymbol{\\mathcal{S}}(s,\\boldsymbol{\\mathcal{E}})$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "get_dSig_dEps = sp.lambdify(\n", + " (s, Eps) + sp_vars, dSig_dEps, 'numpy'\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Threshold function" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "To keep the framework general for different stress norms and hardening definitions let us first introduce a general function for effective stress. Note that the observable stress $\\tau$ is identical with the plastic stress $\\tau_\\pi$ due to the performed sign switch in the definition of the thermodynamic forces." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "f_Sig = sp.sqrt((tau - X)*(tau - X)) - (tau_bar + Z)\n", + "f_Sig" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "**Executable code generation** $f(\\boldsymbol{\\mathcal{E}}, \\boldsymbol{\\mathcal{S}})$\n", + "\n", + "Note that this is a function of both the forces and kinematic state variables" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "get_f_Sig = sp.lambdify(\n", + " (Eps, Sig) + sp_vars, f_Sig, 'numpy'\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "The derivative of $f$ required for time-stepping $\\partial_\\boldsymbol{\\mathcal{S}} f$ is obtained as" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "df_dSig = f_Sig.diff(Sig)\n", + "sp.simplify(df_dSig).T" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "**Executable code generation** $\\partial_\\boldsymbol{\\mathcal{S}}f(\\boldsymbol{\\mathcal{E}}, \\boldsymbol{\\mathcal{S})}$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "get_df_dSig = sp.lambdify(\n", + " (Eps, Sig) + sp_vars, df_dSig, 'numpy'\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Flow direction\n", + "Evolution equations have the form\n", + "\\begin{align}\n", + " \\dot{\\boldsymbol{\\mathcal{E}}} = \\lambda \\, \\boldsymbol{\\Phi}\n", + "\\end{align}\n", + "with the vector $\\Phi$ representing the flow direction within \n", + "the stress space. Assuming the normality condition, i.e. that \n", + "the flow direction coincides with the vector normal to the \n", + "yield condition we can write\n", + "\\begin{align}\n", + " \\boldsymbol{\\Phi} = \\boldsymbol{\\Upsilon} \\frac{\\partial f}{\\partial \\boldsymbol{\\mathcal{S}}}\n", + "\\end{align}\n", + "The sign matrix $\\boldsymbol{\\Upsilon}$ is used to direct all the derivatives in the outward direction from the elastic range." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Sig_signs = sp.diag(-1,1,1)\n", + "Phi = -Sig_signs * df_dSig\n", + "Phi" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "get_Phi = sp.lambdify(\n", + " (Eps, Sig) + sp_vars, Phi, 'numpy'\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Time integration scheme" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "## Summary of the backward Euler scheme\n", + "The derived expressions can be now plugged-in into a generic return mapping algorithm that efficiently identifies a state that satisfies the discrete consistency condition. The general structure of an implicit integration scheme reads\n", + "\\begin{align}\n", + "\\boldsymbol{\\mathcal{E}}_{n+1} &= \\boldsymbol{\\mathcal{E}}_{n} + \n", + "\\lambda_\\Delta \\, \\boldsymbol{\\Phi}_{n+1} \\\\\n", + "f(\\boldsymbol{\\mathcal{E}}_{n+1}; \\lambda_\\Delta) &= 0\n", + "\\end{align}\n", + "To reach an admissible state let us linearize the threshold function at an intermediate state $k$ as\n", + "\\begin{align}\n", + "f(\\boldsymbol{\\mathcal{E}}^{(k)}; \\lambda_\\Delta^{(k)} )\n", + "& \\approx\n", + "f^{(k)} \n", + " + \n", + "\\left. \\frac{\\partial f}{\\partial \\lambda} \\right|^{(k)}\n", + "\\Delta \\lambda\n", + "\\end{align}" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "Thus, by rewriting the linearized equation as a recurrence formula, the iteration algorithm is obtained\n", + "\\begin{align}\n", + "&\\left. \\frac{\\partial f}{\\partial \\lambda} \\right|^{(k)}\n", + "\\Delta \\lambda =\n", + "- f ^{(k)}\n", + "\\\\\n", + "&\\lambda_{\\Delta}^{(k+1)} = \\lambda_{\\Delta}^{(k)} + \\Delta \\lambda \\\\\n", + "& \\boldsymbol{\\mathcal{E}}^{(k+1)} = \n", + "\\boldsymbol{\\mathcal{E}}^{(k)} + \n", + " \\lambda_\\Delta \\, \\boldsymbol{\\Phi}^{(k)}\n", + " \\\\\n", + "&k = k + 1\n", + "\\end{align}" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "To define a generic return mapping we need to construct the derivatives of the flow rule $f$ with respect to $\\lambda$. The dependency of $f$ on $\\lambda$ is intermediated via the stresses $\\boldsymbol{\\mathcal{S}}$ and state variables $\\boldsymbol{\\mathcal{E}}$\n", + "\\begin{align}\n", + "f(\\boldsymbol{\\mathcal{S}}(\\boldsymbol{\\mathcal{E}}(\\lambda))).\n", + "\\end{align}\n", + "To correctly resolve the dependencies in the derivative $\\frac{\\partial f}{\\partial_\\lambda}$, we need to apply rules for chaining of derivatives. Let us start with the derivative with respect to $\\boldsymbol{\\mathcal{E}}$ in the form\n", + "\\begin{align}\n", + "\\frac{\\partial f(\\boldsymbol{\\mathcal{S}}(\\boldsymbol{\\mathcal{E}}))}{\\partial \\boldsymbol{\\mathcal{E}}}\n", + " &=\n", + "\\frac{\\partial f(\\boldsymbol{\\mathcal{S}})}{\\partial \\boldsymbol{\\mathcal{S}}} \\, \n", + "\\frac{\\partial \\boldsymbol{\\mathcal{S}}(\\boldsymbol{\\mathcal{E}})}{\\partial \\boldsymbol{\\mathcal{E}}}.\n", + "\\end{align}\n", + "By expanding the derivatives of $\\boldsymbol{\\mathcal{E}}$ with respect to $\\lambda_\\Delta$ that will be abbreviate in index position as $\\lambda$ for brevity we obtain\n", + "\\begin{align}\n", + "\\frac{\\partial f(\\boldsymbol{\\mathcal{S}}(\\boldsymbol{\\mathcal{E}}(\\lambda)))}{\\partial \\lambda}\n", + " &=\n", + "\\frac{\\partial f}{\\partial \\boldsymbol{\\mathcal{S}}} \\, \n", + "\\frac{\\partial \\boldsymbol{\\mathcal{S}}}{\\partial \\boldsymbol{\\mathcal{E}}}\n", + "\\frac{\\partial \\boldsymbol{\\mathcal{E}}}{\\partial \\lambda}.\n", + "\\end{align}" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "The last term $\\frac{\\partial \\boldsymbol{\\mathcal{E}} }{ \\partial \\lambda}$ can be obtained from the evolution equations\n", + "\\begin{align}\n", + "\\boldsymbol{\\mathcal{E}} = \\lambda \\, \\boldsymbol{\\Phi} \\; \\implies\n", + "\\frac{\\partial \\boldsymbol{\\mathcal{E}} }{\\partial \\lambda} = \n", + " \\boldsymbol{\\Phi}\n", + "\\end{align}" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "**Summarizing**: the algorithm can be written in a compact way as follows:\n", + "\\begin{align}\n", + "&\n", + "\\left(\n", + "\\frac{\\partial f}{\\partial \\boldsymbol{\\mathcal{S}}}\n", + "^{(k)} \\, \n", + "\\frac{\\partial \\boldsymbol{\\mathcal{S}}}{\\partial \\boldsymbol{\\mathcal{E}}}\n", + "^{(k)} \\, \n", + "\\boldsymbol{\\Phi}^{(k)}\n", + "\\right)\n", + "\\Delta \\lambda = -\n", + "f^{(k)}\\\\\n", + "&\\lambda_{\\Delta}^{(k+1)} = \\lambda_{\\Delta}^{(k)} + \\Delta \\lambda \\\\\n", + "& \\boldsymbol{\\mathcal{E}}^{(k+1)} = \\boldsymbol{\\mathcal{E}}^{(k)} + \n", + " \\lambda_\\Delta \\, \\boldsymbol{\\Phi}^{(k)}\n", + " \\\\\n", + "&k = k + 1\n", + "\\end{align}" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "## Implementation concept\n", + "The gradient operators needed for the time-stepping scheme have been derived above and are now available for the implementation of the numerical algorithm both in `Python` and `C89` languages\n", + "\n", + "<table style=\"width:50%\">\n", + "<tr>\n", + "<th>Symbol</th>\n", + "<th>Python</th>\n", + "<th>C89</th>\n", + "</tr>\n", + "<tr>\n", + "<td>$\\mathcal{S}(\\boldsymbol{\\mathcal{E}}) $ \n", + "</td>\n", + "<td>get_Sig</td>\n", + "<td>get_Sig_C</td>\n", + "</tr>\n", + "<tr>\n", + "<td>$ f(\\boldsymbol{\\mathcal{S}}, \\boldsymbol{\\mathcal{E}})$</td>\n", + "<td>get_f</td>\n", + "<td>get_f_C</td>\n", + "</tr>\n", + "<tr>\n", + "<td>\n", + "$\\displaystyle{\\frac{\\partial f}{\\partial \\boldsymbol{\\mathcal{S}}}}(\\boldsymbol{\\mathcal{S}}, \\boldsymbol{\\mathcal{E}})$\n", + " </td>\n", + "<td>get_df_dSig</td>\n", + "<td>get_df_dSig_C</td>\n", + "</tr>\n", + "<tr>\n", + "<td>\n", + "$\\displaystyle{\\frac{\\partial \\boldsymbol{\\mathcal{S}}}{\\partial \\boldsymbol{\\mathcal{E}}}}(\\boldsymbol{\\mathcal{E}})$</td>\n", + "<td>get_dSig_dEps</td>\n", + "<td>get_dSig_dEps_C</td>\n", + "</tr>\n", + "<tr>\n", + "<td>$\\boldsymbol{\\Phi}(\\boldsymbol{\\mathcal{S}}, \\boldsymbol{\\mathcal{E}}) $</td>\n", + "<td>get_Phi</td>\n", + "<td>get_Phi_C</td>\n", + "</tr>\n", + "</table>" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "To avoid repeated calculation of the same expressions, let us put the evaluation of $f$ and $\\frac{\\partial f}{\\partial \\lambda}$ into a single procedure. Indeed, the iteration loop can be constructed in such a way that the predictor $\\frac{\\partial f}{\\partial \\lambda}$ for the next step is calculated along with the residuum $f$. In case that the residuum is below the required tolerance, the overhead for an extra calculated derivative is negligible or, with some care, it can be even reused in the next time step. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "def get_f_df(s_n1, Eps_k, *margs):\n", + " Sig_k = get_Sig(s_n1, Eps_k, *margs)[0]\n", + " f_k = np.array([get_f_Sig(Eps_k, Sig_k, *margs)])\n", + " df_dSig_k = get_df_dSig(Eps_k, Sig_k, *margs)\n", + " Phi_k = get_Phi(Eps_k, Sig_k, *margs)\n", + " dSig_dEps_k = get_dSig_dEps(s_n1, Eps_k, *margs)\n", + " df_dSigEps_k = np.einsum(\n", + " 'ik,ji->jk', df_dSig_k, dSig_dEps_k)\n", + " dEps_dlambda_k = Phi_k\n", + " df_dlambda = np.einsum(\n", + " 'ki,kj->ij', df_dSigEps_k, dEps_dlambda_k)\n", + " df_k = df_dlambda\n", + " return f_k, df_k, Sig_k" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "The update of state variables $\\boldsymbol{\\mathcal{E}}^{(k+1)}$ for an newly obtained $\\lambda_\\Delta^{(k+1)}$ is performed using the evolution equations. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "def get_Eps_k1(s_n1, Eps_n, lam_k, Eps_k, *margs):\n", + " Sig_k = get_Sig(s_n1, Eps_k, *margs)[0]\n", + " Phi_k = get_Phi(Eps_k, Sig_k, *margs)\n", + " Eps_k1 = Eps_n + lam_k * Phi_k[:,0]\n", + " return Eps_k1" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "The double loop over the time increments and over the return mapping iteration. The inner loop represents the material point level in a standard finite element calculation. The input is the maximum slip value, the number of time steps, the maximum number of iterations and a load function which can define cyclic loading as shown below. The procedure returns the record of $\\boldsymbol{\\mathcal{E}}(t)$ and $\\boldsymbol{\\mathcal{S}}(t)$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [], + "source": [ + "def get_response(margs, s_max=3, n_steps = 10, k_max=20, get_load_fn=lambda t: t):\n", + " Eps_n = np.zeros((len(Eps),), dtype=np.float_)\n", + " Eps_k = np.copy(Eps_n)\n", + " Sig_record, Eps_record, iter_record = [], [], []\n", + " t_arr = np.linspace(0,1,n_steps+1)\n", + " s_t = s_max * get_load_fn(t_arr) + 1e-9\n", + " for s_n1 in s_t:\n", + " lam_k = 0\n", + " f_k, df_k, Sig_k = get_f_df(s_n1, Eps_k, *margs)\n", + " f_k_norm = np.linalg.norm(f_k)\n", + " f_k_trial = f_k[-1]\n", + " k = 0\n", + " while k < k_max:\n", + " if f_k_trial < 0 or f_k_norm < 1e-8:\n", + " Eps_n[...] = Eps_k[...]\n", + " Sig_record.append(Sig_k)\n", + " Eps_record.append(np.copy(Eps_k))\n", + " iter_record.append(k+1)\n", + " break\n", + " dlam = np.linalg.solve(df_k, -f_k)\n", + " lam_k += dlam\n", + " Eps_k = get_Eps_k1(s_n1, Eps_n, lam_k, Eps_k, *margs)\n", + " f_k, df_k, Sig_k = get_f_df(s_n1, Eps_k, *margs)\n", + " f_k_norm = np.linalg.norm(f_k)\n", + " k += 1\n", + " else:\n", + " print('no convergence')\n", + " Sig_arr = np.array(Sig_record, dtype=np.float_)\n", + " Eps_arr = np.array(Eps_record, dtype=np.float_)\n", + " iter_arr = np.array(iter_record,dtype=np.int_)\n", + " return t_arr, s_t, Eps_arr, Sig_arr, iter_arr" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Support functions\n", + "To run some examples, let us define some infrastructure including a more complex loading history and postprocessing" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Loading history\n", + "This implementation uses the symbolic machinery which is not necessary a simpler data point based implementation with `numpy.interp1d` would be better ... later " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [], + "source": [ + "t, theta = sp.symbols(r't, \\theta')\n", + "n_cycles = 5\n", + "A = 2\n", + "ups = np.array([((theta-2*cycle)*A+(1-A), theta-2*cycle<=1) \n", + " for cycle in range(n_cycles)])\n", + "downs = np.array([((1-(theta-(2*cycle+1)))*A+(1-A),(theta-(2*cycle+1))<=1) \n", + " for cycle in range(n_cycles)])\n", + "ups[0,0] = theta\n", + "updowns = np.einsum('ijk->jik',np.array([ups, downs])).reshape(-1,2)\n", + "load_fn = sp.Piecewise(*updowns).subs(theta,t*n_cycles)\n", + "get_load_fn = sp.lambdify(t, load_fn,'numpy')\n", + "t_arr = np.linspace(0,1,600)\n", + "plt.plot(t_arr, get_load_fn(t_arr));" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Plotting functions\n", + "To simplify postprocessing examples, here are two aggregate plotting functions, one for the state and force variables, the other one for the evaluation of energies" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [], + "source": [ + "def plot_Sig_Eps(t_arr, s_t, Sig_arr, Eps_arr, iter_arr, ax1, ax11, ax2, ax22, ax3, ax33):\n", + " colors = ['blue','red', 'green', 'black', 'magenta' ]\n", + " s_pi_, z_, alpha_ = Eps_arr.T\n", + " sig_pi_, Z_, X_ = Sig_arr.T\n", + " n_step = len(s_pi_)\n", + " ax1.plot(s_t, sig_pi_, color='black', \n", + " label='n_steps = %g' % n_step)\n", + " ax1.set_xlabel('$s$'); ax1.set_ylabel(r'$\\tau$')\n", + " ax1.legend()\n", + " if ax11:\n", + " ax11.plot(s_t, iter_arr, '-.')\n", + " ax2.plot(t_arr, z_, color='green', \n", + " label='n_steps = %g' % n_step)\n", + " ax2.set_xlabel('$t$'); ax2.set_ylabel(r'$z$')\n", + " if ax22:\n", + " ax22.plot(t_arr, Z_, '-.', color='green')\n", + " ax22.set_ylabel(r'$Z$')\n", + " ax3.plot(t_arr, alpha_, color='blue', \n", + " label='n_steps = %g' % n_step)\n", + " ax3.set_xlabel('$t$'); ax3.set_ylabel(r'$\\alpha$')\n", + " if ax33:\n", + " ax33.plot(t_arr, X_, '-.', color='blue')\n", + " ax33.set_ylabel(r'$X$')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [], + "source": [ + "from scipy.integrate import cumtrapz\n", + "def plot_work(ax, t_arr, s_t, Eps_arr, Sig_arr):\n", + " W_arr = cumtrapz(Sig_arr[:,0], s_t, initial=0)\n", + " U_arr = Sig_arr[:,0] * (s_t-Eps_arr[:,0]) / 2.0\n", + " G_arr = W_arr - U_arr\n", + " ax.plot(t_arr, W_arr, lw=2, color='black', label=r'$W$')\n", + " ax.plot(t_arr, G_arr, color='black', label=r'$G$')\n", + " ax.fill_between(t_arr, W_arr, G_arr, color='green', alpha=0.2)\n", + " ax.set_xlabel('$s$'); ax3.set_ylabel(r'$E$')\n", + " ax.legend()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [], + "source": [ + "def plot_dissipation(ax, t_arr, s_t, Eps_arr, Sig_arr): \n", + " colors = ['blue','red', 'green', 'black', 'magenta' ]\n", + " E_i = cumtrapz(Sig_arr, Eps_arr, initial=0, axis=0)\n", + " c = 'black'\n", + " ax.plot(t_arr, E_i[:,0], '-.', lw=1, color=c)\n", + " ax.fill_between(t_arr, E_i[:,0], 0, color=c, alpha=0.1)\n", + " c = 'black'\n", + " ax.plot(t_arr, E_i[:,0], color=c, lw=1)\n", + " ax.fill_between(t_arr, E_i[:,0], E_i[:,0], \n", + " color=c, alpha=0.2);\n", + " c = 'blue'\n", + " ax.plot(t_arr, E_i[:,1], '-.', lw=1, color='black')\n", + " ax.fill_between(t_arr, E_i[:,1], 0, color=c, alpha=0.1)\n", + " c = 'blue'\n", + " ax.plot(t_arr, E_i[:,1] + E_i[:,2], color='black', lw=1)\n", + " ax.fill_between(t_arr, E_i[:,1] + E_i[:,2], E_i[:,1], \n", + " color=c, alpha=0.3);" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Examples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "material_params = {\n", + " E_b:1, gamma: 0.0, K:0.1, tau_bar:1, \n", + "}\n", + "margs = [material_params[map_py2sp[name]] for name in py_vars]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Monotonic load \n", + "Let's first run the example with different size of the time step to see if there is any difference" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false, + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "fig, ((ax1,ax2,ax3)) = plt.subplots(1,3,figsize=(14,4), tight_layout=True)\n", + "ax11, ax22, ax33 = ax1.twinx(), ax2.twinx(), ax3.twinx()\n", + "for n_steps in [20, 40, 200, 2000]: \n", + " t_arr, s_t, Eps_arr, Sig_arr, iter_arr = get_response(\n", + " margs=margs, s_max=8, n_steps=n_steps, k_max=10\n", + " )\n", + " plot_Sig_Eps(t_arr, s_t, Sig_arr, Eps_arr, iter_arr, ax1, ax11, ax2, ax22, ax3, ax33)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(1,1,figsize=(9, 5))\n", + "plot_work(ax, t_arr, s_t, Eps_arr, Sig_arr)\n", + "plot_dissipation(ax, t_arr, s_t, Eps_arr, Sig_arr)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Cyclic loading" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false, + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "fig, ((ax1,ax2,ax3)) = plt.subplots(1,3,figsize=(14,4), tight_layout=True)\n", + "ax11,ax22,ax33 = ax1.twinx(), ax2.twinx(), ax3.twinx()\n", + "t_arr, s_t, Eps_arr, Sig_arr, iter_arr = get_response(\n", + " margs, s_max=2, n_steps=20000, k_max=20, get_load_fn=get_load_fn\n", + ")\n", + "plot_Sig_Eps(t_arr, s_t, Sig_arr, Eps_arr, iter_arr, ax1, ax11, ax2, ax22, ax3, ax33);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false, + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(1,1,figsize=(9, 5))\n", + "plot_work(ax, t_arr, s_t, Eps_arr, Sig_arr)\n", + "plot_dissipation(ax, t_arr, s_t, Eps_arr, Sig_arr)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hide_input": false, + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Interactive application" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "hide_input": true, + "scrolled": false, + "slideshow": { + "slide_type": "fragment" + } + }, + "outputs": [], + "source": [ + "def init():\n", + " global Eps_record, Sig_record, iter_record, t_arr, s_t, s0, t0, Eps_n\n", + " s0 = 0\n", + " t0 = 0\n", + " Sig_record = []\n", + " Eps_record = []\n", + " iter_record = []\n", + " t_arr = []\n", + " s_t = []\n", + " Eps_n = np.zeros((len(Eps),), dtype=np.float_)\n", + " \n", + "def get_response_i(s1, margs, n_steps = 60, k_max=20):\n", + " global Eps_record, Sig_record, iter_record, t_arr, s_t, s0, t0, Eps_n\n", + " Eps_k = np.copy(Eps_n)\n", + " t1 = t0+n_steps+1\n", + " ti_arr = np.linspace(t0, t1, n_steps+1 )\n", + " si_t = np.linspace(s0,s1,n_steps+1)\n", + " for s_n1 in si_t:\n", + " lam_k = 0\n", + " f_k, df_k, Sig_k = get_f_df(s_n1, Eps_k, *margs)\n", + " f_k_norm = np.linalg.norm(f_k)\n", + " f_k_trial = f_k[-1]\n", + " k = 0\n", + " while k < k_max:\n", + " if f_k_trial < 0 or f_k_norm < 1e-6:\n", + " Eps_n[...] = Eps_k[...]\n", + " Sig_record.append(Sig_k)\n", + " Eps_record.append(np.copy(Eps_k))\n", + " iter_record.append(k+1)\n", + " break\n", + " dlam = np.linalg.solve(df_k, -f_k)\n", + " lam_k += dlam\n", + " Eps_k = get_Eps_k1(s_n1, Eps_n, lam_k, Eps_k, *margs)\n", + " f_k, df_k, Sig_k = get_f_df(s_n1, Eps_k, *margs)\n", + " f_k_norm = np.linalg.norm(f_k)\n", + " k += 1\n", + " else:\n", + " print('no convergence')\n", + " t_arr = np.hstack([t_arr, ti_arr])\n", + " s_t = np.hstack([s_t, si_t])\n", + " t0 = t1\n", + " s0 = s1\n", + " return\n", + "\n", + "import ipywidgets as ipw\n", + "fig, ((ax1,ax2,ax3)) = plt.subplots(1,3,figsize=(14,4), tight_layout=True)\n", + "ax11 = ax1.twinx()\n", + "ax22 = ax2.twinx()\n", + "ax33 = ax3.twinx()\n", + "axes = ax1, ax11, ax2, ax22, ax3, ax33\n", + "axes = ax1, None, ax2, ax22, ax3, ax33\n", + "def update(s1):\n", + " global Eps_record, Sig_record, iter_record, t_arr, s_t, s0, t0, Eps_n, axes\n", + " global margs\n", + " get_response_i(s1, margs)\n", + " Sig_arr = np.array(Sig_record, dtype=np.float_)\n", + " Eps_arr = np.array(Eps_record, dtype=np.float_)\n", + " iter_arr = np.array(iter_record,dtype=np.int_)\n", + " for ax in axes:\n", + " if ax:\n", + " ax.clear()\n", + " plot_Sig_Eps(t_arr, s_t, Sig_arr, Eps_arr, iter_arr, *axes)\n", + " \n", + "init()\n", + "\n", + "s1_slider = ipw.FloatSlider(value=0,min=-4, max=+4, step=0.1,\n", + " continuous_update=False)\n", + "\n", + "ipw.interact(update, s1 = s1_slider);\n", + "\n", + "def reset(**material_params):\n", + " global margs\n", + " init()\n", + " s1_slider.value = 0\n", + " margs = [material_params[name] for name in py_vars]\n", + "\n", + "n_steps = 20\n", + "margs_sliders = {\n", + " name : ipw.FloatSlider(description=name, value=val, \n", + " min=minval, max=maxval, step=(maxval-minval) / n_steps,\n", + " continuous_update=False)\n", + " for name, val, minval, maxval in [('E_b', 50, 0.5, 100),\n", + " ('gamma', 1, -20, 20),\n", + " ('K', 1, -20, 20),\n", + " ('tau_bar', 1, 0.5, 20)]\n", + "}\n", + "\n", + "ipw.interact(reset, **margs_sliders);" + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "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.7.6" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": { + "height": "calc(100% - 180px)", + "left": "10px", + "top": "150px", + "width": "165px" + }, + "toc_section_display": true, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/bmcs_course/4_3_BS_isotropic_kinematic_hardening_softening.ipynb b/bmcs_course/4_3_BS_isotropic_kinematic_hardening_softening.ipynb deleted file mode 100644 index 525881f..0000000 --- a/bmcs_course/4_3_BS_isotropic_kinematic_hardening_softening.ipynb +++ /dev/null @@ -1,6022 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# Plasticity model isotropic and kinematic hardening \n", - "This notebook is a work in progress on an abstract and general implementation of time integration algorithm for general damage-plasticity modes. It serves for the development of a package that can be configured by specifying the ingredients of thermodynamically based model\n", - "\n", - " - Vector of state variables $\\boldsymbol{\\mathcal{E}}$\n", - " - Vector of streses $\\boldsymbol{\\mathcal{S}}$\n", - " - Yield condition $f(\\boldsymbol{\\mathcal{S}},\\boldsymbol{\\mathcal{E}})$\n", - " - Flow potential $\\varphi(\\boldsymbol{\\mathcal{S}},\\boldsymbol{\\mathcal{E}})$\n", - "\n", - "as symbolic equations using the sympy package. The time-stepping algorithm gets generated automatically within the thermodynamically framework. The derived evolution equations and return-mapping to the yield surface is performed using Newton-Raphson scheme. " - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "outputs": [], - "source": [ - "%matplotlib notebook\n", - "import sympy as sp\n", - "sp.init_printing()\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Material parameters" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "E_b = sp.Symbol('E_b', real=True, nonnegative=True)\n", - "gamma = sp.Symbol('gamma', real=True, nonnegative=True)\n", - "K = sp.Symbol('K', real=True)\n", - "tau_bar = sp.Symbol(r'\\bar{\\tau}', real=True, nonnegative=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "py_vars = ('E_b', 'gamma', 'K', 'tau_bar')\n", - "map_py2sp = {py_var : globals()[py_var] for py_var in py_vars}\n", - "sp_vars = tuple(map_py2sp[py_var] for py_var in py_vars)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## State variables" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "s = sp.Symbol('s', real=True)\n", - "s_pi = sp.Symbol(r's_pi', real=True)\n", - "alpha = sp.Symbol('alpha', real=True)\n", - "z = sp.Symbol('z', real=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGAAAAAZCAYAAADOtSsxAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADDUlEQVRoBe2a7VHbQBCGRSYFeJIOnA6AEkwHECogdBAmv+x/GacDpwTsDpwOQugAUkEIHTjPo5E0Z418CJA0nsztzM7e5+7q3bu9k+yD6XS6zLLsEC7pZDab3ZeVJLtDAFwnaFsEGlcHBOCOjg9BYyoOgACYjzEzfzOArWQigkAKQAScIbpSAIZAOWIjBSACzhBdKQBDoByxkQIQAWeIrrdtjHBlmjPuTzH2EXlD222buUOMwZfyfv0Oe2fUf8C+2xwjvw/kQ4iR1/qlfjxl+8kAoOQXSi6QOeDINfUj+PIp5UP0488IO1ewAFg2AGfIMfIE2SthY4wBMbmknAOO1I/fyCP4vqhPkKu6M9EAMEHlh8hwtfuwe/WmjH8V0IXPi7Ct/tAd1wV/hb1qtVN+hG9oFysX6ie4cSdGA8CkBzhD2V/ENdxqWzlnKPJhS1uUTTvuBHdA74Q9Pyu4SL82GHORHhft70M/w7HRQ7iY5OoymkZxTZsR3zvCL8+BL0i/ZVVB6dnRj+j3vGmyZ5tp0AXRFKDctZ07gIll+jFvlbntM+W5ffDepCF8OcWvc+QgK1/ksDVCyGF6tisk+38y1mA00s4AMNqvpCqoDg4UfYMNQAU+ZQNV/6JKU0UeRDEnq4EvKaBb8F31W+BTN11utb1E/6456DbP2323awztjqnwaxoXC4D5f+sBUOYO8GAJyfpF0TBBeti47fJxOlr0dS7QXeZ8F4U2BcNFcw7X/aSpc/JZTdFbByy+mK4lfcn0E25chLEAeHqfMlEdgqgyr1RVRCmPYMdlSIPjbSBfGUrbeyavfvmndKQPbRDcnVfUq1tJXz5gQ/th8HNTtOUBQYqPPvkO1RiAzN8DNptN9lpGz1odyDG8eK2+/31+gdMyegtqu3KIsudASZZ9I03UAoFOAoAd860HseTZ4VmQqAUCXQVAwH1Ry9gN5roHZH4A2ZZoNwKxQ3j3rFoPYG/9plyv14anaoBAVzsgUJmKz0EgBeA5aPUwNv9bSk1v+l9QDZCuqqRmz8rwf0G3/wARrh6V0tmKEwAAAABJRU5ErkJggg==\n", - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}s_{\\pi} & z & \\alpha\\end{matrix}\\right]$" - ], - "text/plain": [ - "[sₚᵢ z α]" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Eps = sp.Matrix([s_pi, z, alpha])\n", - "Eps.T" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Thermodynamic forces" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "tau = sp.Symbol('tau', real=True)\n", - "X = sp.Symbol('X', real=True)\n", - "Z = sp.Symbol('Z', real=True, nonnegative=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGEAAAAZCAYAAAAhd0APAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADJ0lEQVRoBe2a7U0bQRBATZQCkNMBdAAlAB0EpYJAB0H8sv9FTgeQDsAdkFQQ4g5CCQkl5L3LrXV3Xtt31nodSzfSaPb29uZ7Z2cxB6PR6HEwGJyAAS7G4/FLeOhpWg/g23M43lW4Tg8Iwi9eHFcm+2EmD+D3I0RN3mSS14tZ4YG3K979V6/Imj8odAi+gs8l/Q0VzCi3+Yx1p05sE5BxBf9LUJmC5XvC/L0PUPX8DoYy/43xHfNT6ALsRRBQXmM17LJpSGnwT94ZnDNw64BMnX0P9Tx9D95U9WL8Clr3L8CPPkOXwl4EAe3NuoUAlFaZcUPwdJ2x5fqU5DPMDMItOM9y9HAH2OCo91rYlzNhiEFzI4NVzD0x1uAzxtk7OmTOkC2eMC5KD9TSeAttFQDWDvYlCGZcDTDS7W6ZMuN0xK4g6KbjDYBnQ+sAqPTKcgSzT6xxq1mPY2At/BJ7kXIOGTUn8zyBv4fjNWMPvZ0B8qegNd+ypJ86BUDFl+6E0tB3rPGw8x5hObDzcFwga7YeAGTVAJk63+QwAYpupLZgNw9Bjyd0WnkIx9SL7gQYWd9+QOd1mPEhWMvIGMNtziHfbLMM2ZlkT4AVtlmGBKtGZ72iO0Fng9UAGJTOEVarVIA+1n9bQrf/dZUvz8EJ1eksY2SbFDeg/jJRTZROEA1ChMMH5uxEdgIYZhIo3+SI1VydkB3KAHgJszMLB3QtQdoo1TYIRve5DcPUazDQLPcu8MJ44TbMnDvEy1pWQK7NwSO0KNElNRjnjNW5NawNQsnwKAhrzTnBQmTabYQduBCAUoTl4CGBuNYs0MvGwEO42ZkZGKHTzlwbBBi6C7JfhLQEWHobxgFekNwB7pBs5xWyPJeOoc0ADJgLXdIVYxOoFUS7o8aXtqNmW1bAiPA7hwngBUj5GjYE3e7ByM41mG87AbI9k76CUqH42xDz826xsubfCkqk78HYGRbWFLT/PaHmjrwPBMhk6n9PyOv2uLQ2Z0L8y342mQf6ICRz5eaM+iBs7rtkX/ZBSObKzRn1Qdjcd8m+LFrUBrf+/44aDkn5SFvqn1mq967ZXy34CSrx3MmyAAAAAElFTkSuQmCC\n", - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\tau & Z & X\\end{matrix}\\right]$" - ], - "text/plain": [ - "[τ Z X]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Sig = sp.Matrix([tau, Z, X])\n", - "Sig.T" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}E_{b} \\left(s - s_{\\pi}\\right)\\\\K z\\\\\\alpha \\gamma\\end{matrix}\\right]$" - ], - "text/plain": [ - "⎡E_b⋅(s - sₚᵢ)⎤\n", - "⎢ ⎥\n", - "⎢ K⋅z ⎥\n", - "⎢ ⎥\n", - "⎣ α⋅γ ⎦" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Sig_Eps = sp.Matrix([[E_b * (s - s_pi), K * z, alpha * gamma]]).T\n", - "Sig_Eps" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "source": [ - "**Executable code for** $\\boldsymbol{\\mathcal{S}}(s,\\boldsymbol{\\mathcal{E}})$" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "get_Sig = sp.lambdify(\n", - " (s, Eps) + sp_vars, Sig_Eps.T, 'numpy'\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "To derive the time stepping procedure we will need also the matrix of derivatives of the generalized stresses $\\boldsymbol{\\mathcal{S}}$ with respect to the kinematic variables $\\boldsymbol{\\mathcal{E}}$ \n", - "\\begin{align}\n", - " \\partial_\\boldsymbol{\\mathcal{E}} \\boldsymbol{\\mathcal{S}}\n", - "\\end{align}" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}- E_{b} & 0 & 0\\\\0 & K & 0\\\\0 & 0 & \\gamma\\end{matrix}\\right]$" - ], - "text/plain": [ - "⎡-E_b 0 0⎤\n", - "⎢ ⎥\n", - "⎢ 0 K 0⎥\n", - "⎢ ⎥\n", - "⎣ 0 0 γ⎦" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dSig_dEps = sp.Matrix([Sig_Eps.T.diff(eps) for eps in Eps]).T\n", - "dSig_dEps" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "source": [ - "**Executable Python code generation** $\\partial_\\boldsymbol{\\mathcal{E}} \\boldsymbol{\\mathcal{S}}(s,\\boldsymbol{\\mathcal{E}})$" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "get_dSig_dEps = sp.lambdify(\n", - " (s, Eps) + sp_vars, dSig_dEps, 'numpy'\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Threshold function" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "source": [ - "To keep the framework general for different stress norms and hardening definitions let us first introduce a general function for effective stress. Note that the observable stress $\\tau$ is identical with the plastic stress $\\tau_\\pi$ due to the performed sign switch in the definition of the thermodynamic forces." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJ4AAAAVCAYAAAC38ldgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADs0lEQVRoBe2a7VHcMBCGSYYCGEqADiAdBDqASQXhOgjDP/5lSAeQDgIdQCoIoQQ6CKED8jyO7fh8Pse+ky178M4s+rR29Wq1Wul48/LysjFRHATOz8/3kPxI+hxHg/6lZnN+27/oSWIBgQ/k3xXKryGbzHkz9Eyx6N+MuQW7i+/T9IlU2oEP4Af67Vsx0XIEwOiE1mNYzKRH+IL6Kwuk4vwd1nNKd/Al9TdJacB/ghoeExYgwTguTz4F6SdtGuR7eKL/IABmGtgV6TXpEXxaxJX8M3xJ/SH80TLpKCio4TFjd+eC0aVIuDO34f0YACHThXOBKon2WWVDTWU65g7pl5puIZo+M4j6n8G5N0Ounu6QVNxHRaENbxsQcmAyJKi7JS9IGp3HRe+U6rWgW++KrCAQ3Q1NHvh0j1S2bNhyRjo6oxOC0JcLd+YcAYxHgUewO1PwJloNgQxbjU2jM9YbpdE5/aAer2xYlC+QYYA8I2/gG42Q/wnhHlXGoFVk/NT1kVklt1Edut3AxnAeuc5hMEa3CrZBDa+IIMpocC62C5rcwortfeaR7waQvNS4eJb1IOYTok+UECCT3zAVRzG9Rd9c94bfdtJtVWw7MTyUcVd6xHoji+pFkG9s+YM0j+/Ib8FjPPY9YiU9d1RcVQIMV8Z200VgDG+cbcire+XCUW885/Xfo2FWHJSyN8Baz0J7aH3UM9eV8QWrlbfgGz2k8yqTunqh8lG0TP4iEew4ZCw38mkq5IiynG+msvCqMv0Hg62G5yIEecxlLBfVG6y3rirQBW7OGCnPUUh95gb+V9BI1LExoVO24HPfUK9n7/w5BTkanQ/DGrMhgnLFsa3hBVtrZFdRY2yD3WoBxGNAzyk4C4ZMnR7DB+TY5KLdx1aiqXxw09tekyZeO009NQ7IZ0dv0+G67tcY2yCGBwC68MyLLBhdOlt37beuZ143frpQeqj86K3rH7sNPbOLRPlFILssVXriGHq3xTaI4THRpb9KoJAPnnq6IfwXhjuyNsaMsWhVMsHMOHmXtGx0G9RlrwQn5N30Q6BW2K59q2XiAmRs54L6qEmyIRjbsEdBBkxtbEe/PmgXIXreQRLYieNX2FRKfoulPvfQhT5/exC+2A5XxdRZnz7SVtiGMLzYE24MKoszBONfqq8GROOyUCX5rkmfpQI6bGiL7dqG1+FcxjD0wjE4BqWHoONkeGusArv8eY3PX/WnoS4XrxrEafLtEZgMrz1mIb/4xWBPIQccwVjJnP8AH7ZnRmtTxKsAAAAASUVORK5CYII=\n", - "text/latex": [ - "$\\displaystyle - Z - \\bar{\\tau} + \\left|{X - \\tau}\\right|$" - ], - "text/plain": [ - "-Z - \\bar{\\tau} + │X - τ│" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f_Sig = sp.sqrt((tau - X)*(tau - X)) - (tau_bar + Z)\n", - "f_Sig" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "source": [ - "**Executable code generation** $f(\\boldsymbol{\\mathcal{E}}, \\boldsymbol{\\mathcal{S}})$\n", - "\n", - "Note that this is a function of both the forces and kinematic state variables" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "get_f_Sig = sp.lambdify(\n", - " (Eps, Sig) + sp_vars, f_Sig, 'numpy'\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "The derivative of $f$ required for time-stepping $\\partial_\\boldsymbol{\\mathcal{S}} f$ is obtained as" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}- \\operatorname{sign}{\\left(X - \\tau \\right)} & -1 & \\operatorname{sign}{\\left(X - \\tau \\right)}\\end{matrix}\\right]$" - ], - "text/plain": [ - "[-sign(X - τ) -1 sign(X - τ)]" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_dSig = f_Sig.diff(Sig)\n", - "sp.simplify(df_dSig).T" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "source": [ - "**Executable code generation** $\\partial_\\boldsymbol{\\mathcal{S}}f(\\boldsymbol{\\mathcal{E}}, \\boldsymbol{\\mathcal{S})}$" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "get_df_dSig = sp.lambdify(\n", - " (Eps, Sig) + sp_vars, df_dSig, 'numpy'\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Flow direction\n", - "Evolution equations have the form\n", - "\\begin{align}\n", - " \\dot{\\boldsymbol{\\mathcal{E}}} = \\lambda \\, \\boldsymbol{\\Phi}\n", - "\\end{align}\n", - "with the vector $\\Phi$ representing the flow direction within \n", - "the stress space. Assuming the normality condition, i.e. that \n", - "the flow direction coincides with the vector normal to the \n", - "yield condition we can write\n", - "\\begin{align}\n", - " \\boldsymbol{\\Phi} = \\boldsymbol{\\Upsilon} \\frac{\\partial f}{\\partial \\boldsymbol{\\mathcal{S}}}\n", - "\\end{align}\n", - "The sign matrix $\\boldsymbol{\\Upsilon}$ is used to direct all the derivatives in the outward direction from the elastic range." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}- \\operatorname{sign}{\\left(X - \\tau \\right)}\\\\1\\\\- \\operatorname{sign}{\\left(X - \\tau \\right)}\\end{matrix}\\right]$" - ], - "text/plain": [ - "⎡-sign(X - τ)⎤\n", - "⎢ ⎥\n", - "⎢ 1 ⎥\n", - "⎢ ⎥\n", - "⎣-sign(X - τ)⎦" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Sig_signs = sp.diag(-1,1,1)\n", - "Phi = -Sig_signs * df_dSig\n", - "Phi" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "get_Phi = sp.lambdify(\n", - " (Eps, Sig) + sp_vars, Phi, 'numpy'\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# Time integration scheme" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "source": [ - "## Summary of the backward Euler scheme\n", - "The derived expressions can be now plugged-in into a generic return mapping algorithm that efficiently identifies a state that satisfies the discrete consistency condition. The general structure of an implicit integration scheme reads\n", - "\\begin{align}\n", - "\\boldsymbol{\\mathcal{E}}_{n+1} &= \\boldsymbol{\\mathcal{E}}_{n} + \n", - "\\lambda_\\Delta \\, \\boldsymbol{\\Phi}_{n+1} \\\\\n", - "f(\\boldsymbol{\\mathcal{E}}_{n+1}; \\lambda_\\Delta) &= 0\n", - "\\end{align}\n", - "To reach an admissible state let us linearize the threshold function at an intermediate state $k$ as\n", - "\\begin{align}\n", - "f(\\boldsymbol{\\mathcal{E}}^{(k)}; \\lambda_\\Delta^{(k)} )\n", - "& \\approx\n", - "f^{(k)} \n", - " + \n", - "\\left. \\frac{\\partial f}{\\partial \\lambda} \\right|^{(k)}\n", - "\\Delta \\lambda\n", - "\\end{align}" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Thus, by rewriting the linearized equation as a recurrence formula, the iteration algorithm is obtained\n", - "\\begin{align}\n", - "&\\left. \\frac{\\partial f}{\\partial \\lambda} \\right|^{(k)}\n", - "\\Delta \\lambda =\n", - "- f ^{(k)}\n", - "\\\\\n", - "&\\lambda_{\\Delta}^{(k+1)} = \\lambda_{\\Delta}^{(k)} + \\Delta \\lambda \\\\\n", - "& \\boldsymbol{\\mathcal{E}}^{(k+1)} = \n", - "\\boldsymbol{\\mathcal{E}}^{(k)} + \n", - " \\lambda_\\Delta \\, \\boldsymbol{\\Phi}^{(k)}\n", - " \\\\\n", - "&k = k + 1\n", - "\\end{align}" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "To define a generic return mapping we need to construct the derivatives of the flow rule $f$ with respect to $\\lambda$. The dependency of $f$ on $\\lambda$ is intermediated via the stresses $\\boldsymbol{\\mathcal{S}}$ and state variables $\\boldsymbol{\\mathcal{E}}$\n", - "\\begin{align}\n", - "f(\\boldsymbol{\\mathcal{S}}(\\boldsymbol{\\mathcal{E}}(\\lambda))).\n", - "\\end{align}\n", - "To correctly resolve the dependencies in the derivative $\\frac{\\partial f}{\\partial_\\lambda}$, we need to apply rules for chaining of derivatives. Let us start with the derivative with respect to $\\boldsymbol{\\mathcal{E}}$ in the form\n", - "\\begin{align}\n", - "\\frac{\\partial f(\\boldsymbol{\\mathcal{S}}(\\boldsymbol{\\mathcal{E}}))}{\\partial \\boldsymbol{\\mathcal{E}}}\n", - " &=\n", - "\\frac{\\partial f(\\boldsymbol{\\mathcal{S}})}{\\partial \\boldsymbol{\\mathcal{S}}} \\, \n", - "\\frac{\\partial \\boldsymbol{\\mathcal{S}}(\\boldsymbol{\\mathcal{E}})}{\\partial \\boldsymbol{\\mathcal{E}}}.\n", - "\\end{align}\n", - "By expanding the derivatives of $\\boldsymbol{\\mathcal{E}}$ with respect to $\\lambda_\\Delta$ that will be abbreviate in index position as $\\lambda$ for brevity we obtain\n", - "\\begin{align}\n", - "\\frac{\\partial f(\\boldsymbol{\\mathcal{S}}(\\boldsymbol{\\mathcal{E}}(\\lambda)))}{\\partial \\lambda}\n", - " &=\n", - "\\frac{\\partial f}{\\partial \\boldsymbol{\\mathcal{S}}} \\, \n", - "\\frac{\\partial \\boldsymbol{\\mathcal{S}}}{\\partial \\boldsymbol{\\mathcal{E}}}\n", - "\\frac{\\partial \\boldsymbol{\\mathcal{E}}}{\\partial \\lambda}.\n", - "\\end{align}" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "The last term $\\frac{\\partial \\boldsymbol{\\mathcal{E}} }{ \\partial \\lambda}$ can be obtained from the evolution equations\n", - "\\begin{align}\n", - "\\boldsymbol{\\mathcal{E}} = \\lambda \\, \\boldsymbol{\\Phi} \\; \\implies\n", - "\\frac{\\partial \\boldsymbol{\\mathcal{E}} }{\\partial \\lambda} = \n", - " \\boldsymbol{\\Phi}\n", - "\\end{align}" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "**Summarizing**: the algorithm can be written in a compact way as follows:\n", - "\\begin{align}\n", - "&\n", - "\\left(\n", - "\\frac{\\partial f}{\\partial \\boldsymbol{\\mathcal{S}}}\n", - "^{(k)} \\, \n", - "\\frac{\\partial \\boldsymbol{\\mathcal{S}}}{\\partial \\boldsymbol{\\mathcal{E}}}\n", - "^{(k)} \\, \n", - "\\boldsymbol{\\Phi}^{(k)}\n", - "\\right)\n", - "\\Delta \\lambda = -\n", - "f^{(k)}\\\\\n", - "&\\lambda_{\\Delta}^{(k+1)} = \\lambda_{\\Delta}^{(k)} + \\Delta \\lambda \\\\\n", - "& \\boldsymbol{\\mathcal{E}}^{(k+1)} = \\boldsymbol{\\mathcal{E}}^{(k)} + \n", - " \\lambda_\\Delta \\, \\boldsymbol{\\Phi}^{(k)}\n", - " \\\\\n", - "&k = k + 1\n", - "\\end{align}" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Implementation concept\n", - "The gradient operators needed for the time-stepping scheme have been derived above and are now available for the implementation of the numerical algorithm both in `Python` and `C89` languages\n", - "\n", - "<table style=\"width:50%\">\n", - "<tr>\n", - "<th>Symbol</th>\n", - "<th>Python</th>\n", - "<th>C89</th>\n", - "</tr>\n", - "<tr>\n", - "<td>$\\mathcal{S}(\\boldsymbol{\\mathcal{E}}) $ \n", - "</td>\n", - "<td>get_Sig</td>\n", - "<td>get_Sig_C</td>\n", - "</tr>\n", - "<tr>\n", - "<td>$ f(\\boldsymbol{\\mathcal{S}}, \\boldsymbol{\\mathcal{E}})$</td>\n", - "<td>get_f</td>\n", - "<td>get_f_C</td>\n", - "</tr>\n", - "<tr>\n", - "<td>\n", - "$\\displaystyle{\\frac{\\partial f}{\\partial \\boldsymbol{\\mathcal{S}}}}(\\boldsymbol{\\mathcal{S}}, \\boldsymbol{\\mathcal{E}})$\n", - " </td>\n", - "<td>get_df_dSig</td>\n", - "<td>get_df_dSig_C</td>\n", - "</tr>\n", - "<tr>\n", - "<td>\n", - "$\\displaystyle{\\frac{\\partial \\boldsymbol{\\mathcal{S}}}{\\partial \\boldsymbol{\\mathcal{E}}}}(\\boldsymbol{\\mathcal{E}})$</td>\n", - "<td>get_dSig_dEps</td>\n", - "<td>get_dSig_dEps_C</td>\n", - "</tr>\n", - "<tr>\n", - "<td>$\\boldsymbol{\\Phi}(\\boldsymbol{\\mathcal{S}}, \\boldsymbol{\\mathcal{E}}) $</td>\n", - "<td>get_Phi</td>\n", - "<td>get_Phi_C</td>\n", - "</tr>\n", - "</table>" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "To avoid repeated calculation of the same expressions, let us put the evaluation of $f$ and $\\frac{\\partial f}{\\partial \\lambda}$ into a single procedure. Indeed, the iteration loop can be constructed in such a way that the predictor $\\frac{\\partial f}{\\partial \\lambda}$ for the next step is calculated along with the residuum $f$. In case that the residuum is below the required tolerance, the overhead for an extra calculated derivative is negligible or, with some care, it can be even reused in the next time step. " - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "def get_f_df(s_n1, Eps_k, *margs):\n", - " Sig_k = get_Sig(s_n1, Eps_k, *margs)[0]\n", - " f_k = np.array([get_f_Sig(Eps_k, Sig_k, *margs)])\n", - " df_dSig_k = get_df_dSig(Eps_k, Sig_k, *margs)\n", - " Phi_k = get_Phi(Eps_k, Sig_k, *margs)\n", - " dSig_dEps_k = get_dSig_dEps(s_n1, Eps_k, *margs)\n", - " df_dSigEps_k = np.einsum(\n", - " 'ik,ji->jk', df_dSig_k, dSig_dEps_k)\n", - " dEps_dlambda_k = Phi_k\n", - " df_dlambda = np.einsum(\n", - " 'ki,kj->ij', df_dSigEps_k, dEps_dlambda_k)\n", - " df_k = df_dlambda\n", - " return f_k, df_k, Sig_k" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "The update of state variables $\\boldsymbol{\\mathcal{E}}^{(k+1)}$ for an newly obtained $\\lambda_\\Delta^{(k+1)}$ is performed using the evolution equations. " - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "def get_Eps_k1(s_n1, Eps_n, lam_k, Eps_k, *margs):\n", - " Sig_k = get_Sig(s_n1, Eps_k, *margs)[0]\n", - " Phi_k = get_Phi(Eps_k, Sig_k, *margs)\n", - " Eps_k1 = Eps_n + lam_k * Phi_k[:,0]\n", - " return Eps_k1" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "The double loop over the time increments and over the return mapping iteration. The inner loop represents the material point level in a standard finite element calculation. The input is the maximum slip value, the number of time steps, the maximum number of iterations and a load function which can define cyclic loading as shown below. The procedure returns the record of $\\boldsymbol{\\mathcal{E}}(t)$ and $\\boldsymbol{\\mathcal{S}}(t)$" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [], - "source": [ - "def get_response(margs, s_max=3, n_steps = 10, k_max=20, get_load_fn=lambda t: t):\n", - " Eps_n = np.zeros((len(Eps),), dtype=np.float_)\n", - " Eps_k = np.copy(Eps_n)\n", - " Sig_record, Eps_record, iter_record = [], [], []\n", - " t_arr = np.linspace(0,1,n_steps+1)\n", - " s_t = s_max * get_load_fn(t_arr) + 1e-9\n", - " for s_n1 in s_t:\n", - " lam_k = 0\n", - " f_k, df_k, Sig_k = get_f_df(s_n1, Eps_k, *margs)\n", - " f_k_norm = np.linalg.norm(f_k)\n", - " f_k_trial = f_k[-1]\n", - " k = 0\n", - " while k < k_max:\n", - " if f_k_trial < 0 or f_k_norm < 1e-8:\n", - " Eps_n[...] = Eps_k[...]\n", - " Sig_record.append(Sig_k)\n", - " Eps_record.append(np.copy(Eps_k))\n", - " iter_record.append(k+1)\n", - " break\n", - " dlam = np.linalg.solve(df_k, -f_k)\n", - " lam_k += dlam\n", - " Eps_k = get_Eps_k1(s_n1, Eps_n, lam_k, Eps_k, *margs)\n", - " f_k, df_k, Sig_k = get_f_df(s_n1, Eps_k, *margs)\n", - " f_k_norm = np.linalg.norm(f_k)\n", - " k += 1\n", - " else:\n", - " print('no convergence')\n", - " Sig_arr = np.array(Sig_record, dtype=np.float_)\n", - " Eps_arr = np.array(Eps_record, dtype=np.float_)\n", - " iter_arr = np.array(iter_record,dtype=np.int_)\n", - " return t_arr, s_t, Eps_arr, Sig_arr, iter_arr" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# Support functions\n", - "To run some examples, let us define some infrastructure including a more complex loading history and postprocessing" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Loading history\n", - "This implementation uses the symbolic machinery which is not necessary a simpler data point based implementation with `numpy.interp1d` would be better ... later " - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "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 = $('<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", - " 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", - " '<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 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 = $('<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 * 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 = $('<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'] / 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 / mpl.ratio, fig.canvas.height / mpl.ratio);\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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(\"<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", - " 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('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\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'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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", - " // 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<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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nOzdeXRV1dk/8HQxVVnV9euw1tvVVzcOTIpa0aL1rVJbB6zWDtahVUptbUVbAdv3dYfJyJAwKKAoIiBEmQQZ1Z0BAgkJZGIKEEggjCGEEMKQkUz3nu/vj5N7IULMcO69+5x7vp+17h9eb+59lIc8zz1n72dHgIiIiIhcJUJ3AEREREQUWmwAiYiIiFyGDSARERGRy7ABJCIiInIZNoBERERELsMGkIiIiMhl2AASERERuQwbQCIiIiKXYQNIRERE5DJsAImIiIhchg0gERERkcuwASQiIiJyGTaARERERC7DBpCIiIjIZdgAEhEREbkMG0AiIiIil2EDSEREROQybACJiIiIXIYNIBEREZHLsAEkIiIichk2gEREREQuwwaQiIiIyGXYABIRERG5DBtAIiIiIpdhA0hERETkMmwAiYiIiFyGDSARERGRy7ABJCIiInIZNoBERERELsMGkIiIiMhl2AASERERuQwbQCIiIiKXYQNIRERE5DJsAImIiIhchg0gERERkcuwASQiIiJyGTaARERERC7DBpCIiIjIZdgAEhEREbkMG0AiIiIil2EDSEREROQybACJiIiIXIYNIBEREZHLsAEkIiIichk2gEREREQuwwaQiIiIyGXYABIRERG5DBtAIiIiIpdhA0hERETkMmwAiYiIiFyGDSARERGRy7ABJCIiInIZNoBERERELsMGkIiIiMhl2AASERERuQwbQCIiIiKXYQNogdfrRVFREcrLy1FRUcEHH3zwwQcffDjgUV5ejqKiIni9Xt2thDZsAC0oKipCREQEH3zwwQcffPDhwEdRUZHuVkIbNoAWlJeX+xNI97cZPvjggw8++OCjbQ/fBZzy8nLdrYQ2bAAtqKioQEREBCoqKnSHQkRERG3E+s0G0BImEBERkfOwfrMBtIQJRERE5Dys32wALWECEREROQ/rNxtAS5hAREREzsP6zQbQEiYQERGR87B+swG0hAlERETkPKzfbAAtYQIRERE5D+s3G0BLmEBERETOw/rNBtASJhAREZHzsH47pAFMTU3FE088gR/+8IeIiIjAmjVrWv2ZTZs2oX///ujWrRtuuOEGzJ49+7LXrFy5En379kXXrl3Rt29frF69ul1xMYGIiIich/Xb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ifbt26O2ttZtsRpdW+71z1ksFvz617/Gp59+6o4QfUJb7/OKFSswaNAg1NXVsQF0QFvu8yuvvIKHHnoIUkr86le/QnBwMN58801UVVV5ImRDast9TkhIQIcOHRAVFQWr1YqioiIMHjwYY8eO9UTIPsGRBpC10LXYAHpYfn4+TCZTk69gwsPD0bt372Y/ExwcjPDwcLt9CQkJMJlMKCgocFusRteWe/1z8+bNQ9euXXH69Gl3hOgT2nKfs7Oz8ctf/hKHDx8GADaADmjLfX7kkUfQsWNH/PGPf0RKSgqioqIghMALL7zgiZANqa3/b6xbtw7XXXcd2rdvD5PJhFGjRrEpcYIjDSBroWuxAfSwhv9cEhMT7fbPnDkTISEhzX4mODgYs2bNstu3c+dOmEwmFBYWui1Wo2vLvb7cmjVr0KlTJ8TGxrorRJ/g7H2ur6/HoEGD7F7eZgPYurbk88MPP4xrrrkGZWVljfvWr1+Pq666ik8BW9CW+3zw4EF069YN8+bNw759+xATE4M777wTf//73z0Rsk9wtAFkLXQdNoAexq+APUfLV8AREREIDAyEUsqdIfoEZ+9zaWkpTCYTrr766sbtqquuaty3ZcsWT4VuKG3J5+eeew633Xab3b7MzEyYTCZkZ2e7LVYja8t9HjNmDJ588km7fTt27OCTKSfwK2DPYwOog3vuuQevvPKK3b7bb7/9ioNAbr/9drt948aN44uvDnD2XgO2J3/XXHONQ1MSkI0z99lisSAjI8Nue+WVVxASEoKMjAycP3/eU2EbjrP5vHTpUgQGBqKysrJx34YNG9CuXTs+AbwCZ+/zE088gaeeespuX2JiIkwmE/Lz890Wpy9xdBAIa6HrsAHUQcMUA8uXL0dmZiZee+01XHvttThx4gQAYNKkSXj22Wcbj28Y+v76668jMzMTy5cv59B3Bzl7r9esWYP27dtj4cKFKCwsbNwu/wqNmnL2Pv8cvwJ2jLP3ubKyEt27d8eTTz6JgwcPIj4+HsHBwXjxxRf1+isYgrP3eeXKlWjfvj0WLVqEnJwc7Ny5E4MGDcI999yj11/BECorK5Geno709HSYTCbMnz8f6enpjdPtsBa6FxtAnSxcuBBCCHTo0AEDBw5EfHx8489CQ0MxZMgQu+O3bduGu+66Cx06dECPHj04+aUTnLnXQ4YMgclkarKFhoZ6PnCDcTanL8cG0HHO3uesrCwMGzYMgYGB6N69O9544w0+/XOAs/d5wYIF6Nu3LwIDA9GtWzeMHj0ap06d8nDUxhIXF3fF/29ZC92LDSARERGRn2EDSERERORn2AASERER+Rk2gERERER+hg0gERERkZ9hA0hERETkZ9gAEhEREfkZNoBEREREfoYNIBEREZGfYQNIRERE5GfYABIRERH5GTaARERERH6GDSARERGRn2EDSERERORn2AASERER+Rk2gERERER+hg0gERERkZ9hA0hERETkZ9gAEhEREfkZNoBEREREfoYNIBEREZGfYQNIRERE5GfYABIRERH5GTaARERERH6GDSARERGRn2EDSERERORn2AASERER+Rk2gERERER+hg0gERERkZ9hA0hERETkZ9gAEhEREfkZNoBEREREfub/A+e4h3Q6zx3VAAAAAElFTkSuQmCC\" width=\"640\">" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "t, theta = sp.symbols(r't, \\theta')\n", - "n_cycles = 5\n", - "A = 2\n", - "ups = np.array([((theta-2*cycle)*A+(1-A), theta-2*cycle<=1) \n", - " for cycle in range(n_cycles)])\n", - "downs = np.array([((1-(theta-(2*cycle+1)))*A+(1-A),(theta-(2*cycle+1))<=1) \n", - " for cycle in range(n_cycles)])\n", - "ups[0,0] = theta\n", - "updowns = np.einsum('ijk->jik',np.array([ups, downs])).reshape(-1,2)\n", - "load_fn = sp.Piecewise(*updowns).subs(theta,t*n_cycles)\n", - "get_load_fn = sp.lambdify(t, load_fn,'numpy')\n", - "t_arr = np.linspace(0,1,600)\n", - "plt.plot(t_arr, get_load_fn(t_arr));" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Plotting functions\n", - "To simplify postprocessing examples, here are two aggregate plotting functions, one for the state and force variables, the other one for the evaluation of energies" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [], - "source": [ - "def plot_Sig_Eps(t_arr, s_t, Sig_arr, Eps_arr, iter_arr, ax1, ax11, ax2, ax22, ax3, ax33):\n", - " colors = ['blue','red', 'green', 'black', 'magenta' ]\n", - " s_pi_, z_, alpha_ = Eps_arr.T\n", - " sig_pi_, Z_, X_ = Sig_arr.T\n", - " n_step = len(s_pi_)\n", - " ax1.plot(s_t, sig_pi_, color='black', \n", - " label='n_steps = %g' % n_step)\n", - " ax1.set_xlabel('$s$'); ax1.set_ylabel(r'$\\tau$')\n", - " ax1.legend()\n", - " if ax11:\n", - " ax11.plot(s_t, iter_arr, '-.')\n", - " ax2.plot(t_arr, z_, color='green', \n", - " label='n_steps = %g' % n_step)\n", - " ax2.set_xlabel('$t$'); ax2.set_ylabel(r'$z$')\n", - " if ax22:\n", - " ax22.plot(t_arr, Z_, '-.', color='green')\n", - " ax22.set_ylabel(r'$Z$')\n", - " ax3.plot(t_arr, alpha_, color='blue', \n", - " label='n_steps = %g' % n_step)\n", - " ax3.set_xlabel('$t$'); ax3.set_ylabel(r'$\\alpha$')\n", - " if ax33:\n", - " ax33.plot(t_arr, X_, '-.', color='blue')\n", - " ax33.set_ylabel(r'$X$')\n" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [], - "source": [ - "from scipy.integrate import cumtrapz\n", - "def plot_work(ax, t_arr, s_t, Eps_arr, Sig_arr):\n", - " W_arr = cumtrapz(Sig_arr[:,0], s_t, initial=0)\n", - " U_arr = Sig_arr[:,0] * (s_t-Eps_arr[:,0]) / 2.0\n", - " G_arr = W_arr - U_arr\n", - " ax.plot(t_arr, W_arr, lw=2, color='black', label=r'$W$')\n", - " ax.plot(t_arr, G_arr, color='black', label=r'$G$')\n", - " ax.fill_between(t_arr, W_arr, G_arr, color='green', alpha=0.2)\n", - " ax.set_xlabel('$s$'); ax3.set_ylabel(r'$E$')\n", - " ax.legend()" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [], - "source": [ - "def plot_dissipation(ax, t_arr, s_t, Eps_arr, Sig_arr): \n", - " colors = ['blue','red', 'green', 'black', 'magenta' ]\n", - " E_i = cumtrapz(Sig_arr, Eps_arr, initial=0, axis=0)\n", - " c = 'black'\n", - " ax.plot(t_arr, E_i[:,0], '-.', lw=1, color=c)\n", - " ax.fill_between(t_arr, E_i[:,0], 0, color=c, alpha=0.1)\n", - " c = 'black'\n", - " ax.plot(t_arr, E_i[:,0], color=c, lw=1)\n", - " ax.fill_between(t_arr, E_i[:,0], E_i[:,0], \n", - " color=c, alpha=0.2);\n", - " c = 'blue'\n", - " ax.plot(t_arr, E_i[:,1], '-.', lw=1, color='black')\n", - " ax.fill_between(t_arr, E_i[:,1], 0, color=c, alpha=0.1)\n", - " c = 'blue'\n", - " ax.plot(t_arr, E_i[:,1] + E_i[:,2], color='black', lw=1)\n", - " ax.fill_between(t_arr, E_i[:,1] + E_i[:,2], E_i[:,1], \n", - " color=c, alpha=0.3);" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# Examples" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "material_params = {\n", - " E_b:1, gamma: 0.0, K:0.1, tau_bar:1, \n", - "}\n", - "margs = [material_params[map_py2sp[name]] for name in py_vars]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Monotonic load \n", - "Let's first run the example with different size of the time step to see if there is any difference" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "scrolled": false, - "slideshow": { - "slide_type": "fragment" - } - }, - "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 = $('<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", - " 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", - " '<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 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 = $('<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 * 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 = $('<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'] / 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 / mpl.ratio, fig.canvas.height / mpl.ratio);\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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(\"<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", - " 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('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\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'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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", - " // 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<ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code'){\n", - " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] == html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "}\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel != null) {\n", - " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", - "}\n" - ], - "text/plain": [ - "<IPython.core.display.Javascript object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "<img src=\"data:image/png;base64,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GKV2wSFlZWUoKChAQUEBBEHA/PnzUVBQgJKSEgDuvc6RbdgL2Qs9qReyD3peHwTYC7WOAa8TLF26FGazGQaDAdHR0cjNzVW6JFUTBMHqWLNmjdKlaRIDXtt9/vnn6NixI3x9fREZGYmVK1cqXZLq3bhxA4mJiWjbti38/PzwxBNPYOrUqaioqFC6NHKx+npdfHw8YmNjJffPyclBly5dYDAYEBoaKjkfndbYs++xsbFWe1x8fLzrC3cCe+f9YVr9UFvN3n0/ceIEXnzxRfj7+yMkJATvvPOOZn95be++L168GB06dIC/vz+Cg4MxZMgQXLhwwcVVN052dna9/++6+zpHtmEvZC/0pF7IPuhZfRBgL9Q6BrxEREREREREREREGsWAl4iIiIiIiIiIiEijGPASERERERERERERaRQDXiIiIiIiIiIiIiKNYsBLREREREREREREpFEMeImIiIiIiIiIiIg0igEvERERERERERERkUYx4CUiIiIiIiIiIiLSKAa8RERERERERERERBrFgJeIiIiIiIiIiIhIoxjwEhEREZHmJCYmon///kqXQUREpAj2QSJ6GANeIiIiItKcX/3qV0hNTVW6DCIiIkWwDxLRwxjwEmnM/fv3kZqaivbt28PX1xctW7bE0KFDlS6LiIjIJe7evQu9Xg9BEMQRExOjdFlEREQuwT5IRNYw4CXSmJkzZ+Kpp57C119/jXPnzmH//v1YvXq10mURERG5xP3793H48GEIgoAjR46gtLQU165dU7osIiIil2AfJCJrGPASaUyPHj2QlJSkdBlERESK2bZtGx577DGlyyAiIlIE+yAR1caAl0hjPvroI3h7e6NXr15Yvnw5rl69qnRJRERELvWXv/wFL7zwgtJlEBERKYJ9kIhqY8BLpEGnTp3CnDlz0KFDBzRr1gzFxcVKl0REROQycXFxmDhxotJlEBERKYJ9kIhqY8BLpGF37tyBr68vMjMzlS6FiIjIZdq1a4c1a9YoXQYREZEi2AeJqDYGvEQaMmfOHHz66ac4fvw4Tp48iUmTJiEoKAg//fST0qURERG5jNlsxsSJE3Hx4kVcv35d6XKIiIhcin2QiGpjwEukIdOnT0d4eDj8/PzQokUL9O/fHxaLRemyiIiIXOq//uu/0Lp1awiCgHfeeUfpcoiIiFyKfZCIamPAS0RERERERERERKRRDHiJiIiIiIiIiIiINIoBLxEREREREREREZFGMeAlIiIiIiIiIiIi0igGvEREREREREREREQaxYCXiIiIiIiIiIiISKMY8BIRERERERERERFpFANeIiIiIiIiIiIiIo1iwEtERERERERERESkUQx4iYiIiIiIiIiIiDSKAS8RERERERERERGRRjHgJSIiIiIiIiIiItIoBrxEREREREREREREGsWAl4iIiIiIiIiIiEijGPASERERERERERERaRQDXiIiIiIiIiIiIiKNYsBLREREREREREREpFEMeImIiIiIiIiIiIg06n8B80GarMDSZdEAAAAASUVORK5CYII=\" width=\"1400\">" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ((ax1,ax2,ax3)) = plt.subplots(1,3,figsize=(14,4), tight_layout=True)\n", - "ax11, ax22, ax33 = ax1.twinx(), ax2.twinx(), ax3.twinx()\n", - "for n_steps in [20, 40, 200, 2000]: \n", - " t_arr, s_t, Eps_arr, Sig_arr, iter_arr = get_response(\n", - " margs=margs, s_max=8, n_steps=n_steps, k_max=10\n", - " )\n", - " plot_Sig_Eps(t_arr, s_t, Sig_arr, Eps_arr, iter_arr, ax1, ax11, ax2, ax22, ax3, ax33)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "scrolled": false, - "slideshow": { - "slide_type": "subslide" - } - }, - "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 = $('<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", - " 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", - " '<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 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 = $('<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 * 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 = $('<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'] / 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 / mpl.ratio, fig.canvas.height / mpl.ratio);\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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(\"<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", - " 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('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\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'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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", - " // 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<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,iVBORw0KGgoAAAANSUhEUgAAA4QAAAH0CAYAAABl8+PTAAAgAElEQVR4nOzdd3hUdaL/8ZlkUiGEEnoNHUSQIkYEERULIKh4RYqIIqCrLNgQAQWULiKisogFEOkCioD0XlIQ6QIBEkjguraVcqnJfH5/7M9hz0YkgWS+OXPer+f5/HGzS5YTn+/ued8zmXEJAAAAAOBILtN/AQAAAACAGQQhAAAAADgUQQgAAAAADkUQAgAAAIBDEYQAAAAA4FAEIQAAAAA4FEEIAAAAAA5FEAIAAACAQxGEAAAAAOBQBCEAAAAAOBRBCAAAAAAORRACAAAAgEMRhAAAAADgUAQhAAAAADgUQQgAAAAADkUQAgAAAIBDEYQAAAAA4FAEIQAAAAA4FEEIAAAAAA5FEAIAAACAQxGEAAAAAOBQBCEAAAAAOBRBCAAAAAAORRACAAAAgEMRhAAAAADgUAQhAAAAADgUQQgAAAAADkUQAgAAAIBDEYQAAAAA4FAEIQAAAAA4FEEIAAAAAA5FEAIAAACAQxGEAAAAAOBQBCEAAAAAOBRBCAAAAAAORRACAAAAgEMRhAAAAADgUAQhAAAAADgUQQgAAAAADkUQAgAAAIBDEYQAAAAA4FAEIQAAAAA4FEEIAAAAAA5FEAIAAACAQxGEAAAAAOBQBCEAAAAAOBRBCAAAAAAORRACAAAAgEMRhAAAAADgUAQhAAAAADgUQQgAAAAADkUQAgAAAIBDEYQAAAAA4FAEIQAAAAA4FEEIAAAAAA5FEAIAAACAQxGEAAAAAOBQBCEAAAAAOBRBaHOZmZlKS0vT77//rpMnTzLGGGOMMWb7/f7770pLS1NmZqbp2+2ARxDaXFpamlwuF2OMMcYYYwG3tLQ007fbAY8gtLnff//dd1hM/39yGGOMMcYYy4398dDj999/N327HfAIQps7efKkXC6XTp48afqvAgAAAOQK7nH9hyDMQ+vXr1ebNm1UunRpuVwuLVy40PKve71eDR48WKVLl1Z4eLiaN2+uPXv25Og/g8MCAACAQMM9rv8QhHlo6dKlGjhwoObPn/+nQThq1ChFRUVp/vz52r17tzp06KDSpUvr1KlT2f7P4LAAAAAg0HCP6z8EoZ/8dxB6vV6VKlVKo0aN8n3t/Pnzio6O1qRJk7L9fTksAAAACDTc4/oPQegn/x2Ehw8flsvl0vbt2y3/vrZt26pr167Z/r7ZOSwZGRk6d+6cI5eRkZHzf1gAAAAwiiD0H4LQT/47CDdv3iyXy6Xjx49b/n09evTQPffcc8Xvc/78+T99B6Y/Oyxer1cnTpzQvn37HL0TJ07I6/Xm3j9MAAAA5CmC0H8IQj+5UhCeOHHC8u97+umnde+9917x+wwePPhPP6Plzw7LHzH4yy+/6OzZs8af1vl7Z8+e1S+//OKLQgAAANgDQeg/BKGf5NZLRrP7hDAjI8MXg073RxTy8lEAAAB7IAj9hyD0kyu9qczo0aN9X7tw4UKuvanMuXPntG/fPp09e/b6//I2d/bsWe3bt0/nzp0z/VcBAABANhCE/kMQ5qHTp0/r+++/1/fffy+Xy6Vx48bp+++/19GjRyX9+2MnoqOjtWDBAu3evVsdO3bMtY+d+CMIiSB+FgAAAHZDEPoPQZiH1q5d+6e/7/fEE09IuvzB9KVKlVJYWJhuv/127d69O0f/GQTh1fGzAAAAsBeC0H8IQpsjCK+OnwUAAIC9EIT+QxDaXKAGYdeuXfXAAw9YvrZ69Wq5XC7179/f8vVx48apRIkSV7xWu/8sAAAAnIYg9B+C0OYCNQj//ve/6/bbb7d8rXXr1goLC9Ozzz7r+1pGRoYqVaqkoUOHXvF72f1nAQAA4G9er1eJiYnG/vMJQv8hCG0uUIPwjTfeUL169Xz/9w8//KDQ0FD16tVLnTp18n197ty5ioiI0M8//3zF72X3nwUAAIA/nTp1Sp06dZLL5dLSpUuN/B0IQv8hCG0uUIPwnXfeUWxsrO//7tGjhx5//HG99957at26te/rcXFx6tWr119+L7v/LAAAAPzlu+++U9WqVX1vhhgTE6N//etffv97EIT+QxDaXE6DsGHDhipbtqzf17Bhwxxd16effqqiRYtKkn766SdFRERo586dmjp1qpo2bSpJ2rp1q9xut/bv3/+X34sgBAAA+Gter1cTJkxQaGioLwYjC0Zq4mcTjfx9CEL/IQhtLqdBWLZs2T/9KIy8XtmyZXN0XV9++aU8Ho8kafDgwWrZsqUkacGCBbrxxhslSY888ojatm171e9FEAIAAFzZr7/+qgcffNBy71alThV98O0HOnHqhJG/E0HoPwShzQXqE8JVq1bJ5XLp119/VYkSJbR8+XLf1ytUqKCUlBQFBwdr/fr1V/1eBCEAAMCf27x5sypUqGCJwXbd2mnLkS1auG8hQegABKHNBervEG7btk0ul0tDhw5V3bp1fV9PSkpSdHS0+vbtq0aNGmXre9n9ZwEAAJDbMjMzNWLECAUHB/tCsGB0QY34eIS2Hd+mbce3EYQOQRDaXKAGYXJyslwulwoXLqxp06b5vn7gwAEFBQUpKipKs2bNytb3svvPAgAAIDf9+OOPatmypeWpYO2GtfV1wte+GCQInYMgtLlADcKff/7Z97uHFy9e9H39xx9/lMvlUoUKFXTp0qVsfS+7/ywAAAByy8qVK1WyZElfCLrdbnV8rqO2pm61xCBB6BwEoc0FahDmJn4WAADA6S5duqSBAwfK7Xb7YrBwTGGNmzEuSwgShM5CENocQXh1/CwAAICTHTt2TE2bNrW8RLR+0/pa+v3SK8YgQegcBKHNEYRXx88CAAA41ddff62iRYv6QjAoOEjdX+muhGMJfxmDBKFzEIQ2RxBeHT8LAADgNOfPn1ffvn0tTwWLlymuifMnXjUECUJnIQhtjiC8On4WAADASQ4cOKAGDRpYYjCuZZxW7F6R7RgkCJ2DILQ5gvDq+FkAAACnmDZtmgoUKOALQU+IR88Pfl5J6Uk5ikGC0DkIQpsjCK+OnwUAAAh0J0+eVJcuXSxPBcvEltGUpVNyHIIEobMQhDZHEF4dPwsAABDIEhMTVaVKFUsM3t3+bq07sO6aY5AgdA6C0OYIwqvjZwEAAAJRZmam3n77bXk8Hl8IRhaM1MDxA68rBAlCZyEIbY4gvDp+FgAAIND8+OOPuvfeey1PBavVraa5G+fmSgwShM5BENpcoAfhrl271KVLF5UpU0ahoaGqUKGC2rRpo8WLF8vr9WbrewTKzwIAAECSli9frpIlS/pC0O1265Gej2hrytZci0GC0DkIQpsL5CCcO3euQkJC1LVrV61fv16pqanasmWL3n33XdWpU0eZmZnZ+j6B8LMAAAC4cOGCXnnlFctTwcIxhTV2+thcDUGC0FkIQpsL1CDcvn27PB6Pxo4d+6f/enafDkr2/1kAAAAcOnRIN998syUGGzRroKXfL82TGCQInYMgtLlADcLmzZurfv36OQq/K7H7zwIAADjbjBkzFBUVZflswZ4DeirhWEKexSBB6BwEoc3lJAi9Xq/OnDljZDkJu9TUVLlcLs2ePdtyPdHR0SpQoIAKFCigF154IdvfjyAEAAB2dPr0aXXr1s3yVLBUhVL6+JuP8zQECUJnIQhtLidBeObMGct/ofhzZ86cyfY1ffPNN3K5XEpNTfV97dKlS0pOTtbBgwcVHh6uf/zjH9n+fgQhAACwm+3bt6t69eqW+6kW7VpozQ9r/BKDBKFzEIQ2F4hBOHPmTLlcLqWlpWX5144cOSKXy6UtW7Zk+/sRhAAAwC68Xq/effddhYaG+u6jwiPD1f+d/n4LQYLQWQhCmwvEl4zu2rVLLpdLs2bNyvKvLVq0SG63W6dPn8729yMIAQCAHfz0009q3bq15f+pXqVOFc1ZP8fvMUgQOgdBaHOB+qYy7dq1U/HixfXpp59q//792rdvn2bOnKn69eurRo0aOfpedv9ZAACAwLd69WqVLl3aEoMPP/WwNh/ZbCQGCULnIAhtLlCD8MKFCxo1apRuuOEGRUREqFChQoqLi9P48eNz/F8Mdv9ZAACAwHXx4kW99tprcrvdvhCMLhat0VNHGwtBgtBZCEKbC9QgzE38LAAAQH505MgR3XrrrZangvWa1NOS75YYj0GC0DkIQpsjCK+OnwUAAMhvZsyYoUKFCvlCMNgTrO79uuf5ZwsShPhvBKHNEYRXx88CAADkFydPnlSXLl0sTwVLli+pj776yHgAEoTORBDaHEF4dfwsAABAfrBlyxbFxsZm+WzB1ftWG48/gtC5CEKbIwivjp8FAAAwKSMjQ2+++aaCg4N9IRhZMFID3h1gPPoIQhCENkcQXh0/CwAAYMrRo0fVrFkzy1PBGvVraP7m+caDjyCERBDa3tWC8OzZs4b+ZvnH2bNnCUIAAOB3c+bMUXR0tC8Eg4KC1Ll3Z21N3Wo89ghC/IEgtLkrHZaMjAzt27dPv/zyi6G/Wf7xyy+/aN++fcrIyDD9VwEAAA5w+vRpPfnkk5angsXLFNcH8z4wHnkEIf4bQWhzf3VYTpw44YvCs2fP6ty5c47a2bNnfTF44oSZ/zIDAADOkpiYqKpVq1pisFmrZlq5Z6XxwCMI8WcIQpv7q8Pi9Xp9UejknThxQl6v18A/HQAA4BQZGRkaOXKkPB6PLwTDI8PV7+1+SkpPMh53BCGuhCC0uewcloyMDONP60yNl4kCAIC8lpaWphYtWlieCla7sZrmbJhjPOoIQlwNQWhzHBYAAABz5s+fryJFivhC0O12q8MzHbQ1xR5vHEMQgiC0OQ4LAACA/505c0Y9e/a0PBUsVqqYxs8abzzkCELkBEFocxwWAAAA/9q+fbtq1KhhicEm9zbR8l3LjUccQYicIghtjsMCAADgH5mZmRo7dqxCQkJ8IRgWEaYXRrxg2zeOIQhBENochwUAACDvnThxQi1btrQ8Faxcu7JmrplpPNwIQlwPgtDmOCwAAAB5a9GiRYqJibHEYPun22vzkc3Go40gxPUiCG2OwwIAAJA3zpw5o169ellCsEjxIho7fazxWCMIkVsIQpvjsAAAAOS+pKQkVa9e3RKDje9qrGU7lxkPNYIQuYkgtDkOCwAAQO7JyMjQ8OHD5fF4LG8c0+etPgH5xjEEIQhCm+OwAAAA5I6UlBQ1bdrU8lSwSp0qmrV2lvE48/cWJy7W/Z3uV/rv6Ub+WXCP6z8Eoc1xWAAAAK6P1+vV9OnTVahQIV8IBgUFqcMzHbQ1ZavxOPPnktKT9PeBf5fb7ZbL5VLffn2N/DPhHtd/CEKb47AAAABcu99++00dOnSwPBUsUbaE3p/7vvE48/eWbluqcpXK+X4OBaIKaO7CuUb+uXCP6z8Eoc1xWAAAAK7NmjVrVK5cOUsMtmjXQqv2rjIeZ/5+Ktjn9T6+p4Iul0txd8Rp0dJFOnXqlJF/Ntzj+g9BaHMcFgAAgJw5f/68Xn75ZUsAFShUQIMmDDIeZ/7et999qxtuusH3c4goEKFBwwbpSMoR7dmzhyB0AILQ5jgsAAAA2bdnzx7Vq1fP8lTwxrgb9VXCV8bjzN9PBV8Y8oKCgoL+/XNwu9T0rqZatXaVjh8/ruPHjxOEDkEQ2hyHBQAA4Oq8Xq8mTJig8PBwXwh6Qjzq0b+HEo4lGA80f27Z98tUp0Ed38+hYFRBvT7sdR0+ctgXgwShcxCENsdhAQAA+GsnTpzQvffea3kqWL5qeU1ZOsV4nPn7qeDLb76soOAg38+hSYsmWrF6hSUECUJnIQhtjsMCAABwZQsXLlSxYsUsMdi2a1ttSN5gPND8/VQwtlqs5R1EB7w5QIcOH/rTGCQInYMgtDkOCwAAQFanT5/W008/bQnBwjGFNXrqaONx5u+ngq8Me+Xy7wq6XGp0WyMtXbn0iiFIEDoLQWhzHBYAAACr+Ph4Va1a1RKDcXfHadnOZcYDzZ9bvmO5Kteo7PsZhEWEqf+Q/jqYfPCqMUgQOgdBaNClS5c0cOBAVapUSeHh4YqNjdXQoUOVmZmZ7e/BYQEAAPi3S5cuaejQoQoODvZFUHhkuF4c8aKS0pOMB5o/99rI1yxPBRs0aaClK67+VJAgdB6C0KBhw4apWLFiWrx4sVJSUjRv3jwVLFhQ48ePz/b34LAAAABIhw8f1q233mp5KlitbjXNWT/HeJz5cyt2rlD9W+pffioYHqZ+b/TL9lNBgtB5CEKDWrduraeeesrytYcfflhdunTJ9vfgsAAAACfzer365JNPVLBgQV8EBQUHqXPvztqautV4oPlzA0YPkCfE4/s51I+rr8XLFuc4BAlCZyEIDRo5cqQqVqyoAwcOSJJ27NihEiVKaObMmdn+HhwWAADgVD/++KMeeOABy1PBkuVLauL8icbjzJ9buWulGt7a0PIOotf6VJAgdB6C0CCv16v+/fvL7XbL4/HI7XZrxIgRf/lnzp8/r5MnT/qWlpbGYQEAAI6zcOFCFS9e3BKDLR9pqTU/rDEeaP7c62NfV0hoiO9nUK9xPX2z7JvrCkGC0FkIQoNmzZqlcuXKadasWdq1a5c+//xzFS1aVFOnTr3inxk8eLDlv/j+GIcFAAA4wcmTJ/XUU09Z7oOii0Vr2ORhxuPMn1u1e5Vq1KlheSr4yhuvXPdTQYLQeQhCg8qVK6cPPvjA8rW33npLNWrUuOKf4QkhAABwqg0bNqhSpUqWGGx8V2Mt/X6p8UDz91PB/3wn1bqN6uqbb3PnqSBB6DwEoUFFixbVxIkTLV8bMWKEqlWrlu3vwWEBAACB7vz58+rXr5/cbrcvgiIKROilUS856uMkVuxcoao1L3++YmhYqF587cVcfSpIEDoPQWjQE088obJly/o+dmLBggWKiYlRv379sv09OCwAACCQ7dy5U3Xr1rU8FazdsLbmbZxnPND8taT0JL3y1iuWzxWsd3M9LV5+7e8gShDiDwShQadOnVKfPn1UoUIFhYeHq3Llyho4cKAuXLiQ7e/BYQEAAIEoIyNDY8aMUWhoqC+CPCEedX+lu+KPxhuPNH9t2fZlqtOgjuVzBV9941UlH0rO0xgkCJ2DILQ5DgsAAAg0KSkpatasmeWpYIXqFTTl2ynGA82fTwX7DOpj+VzBhk0aaunKpXkeggShsxCENsdhAQAAgcLr9eqzzz5TVFSUL4Lcbrce7v6wNh3eZDzS/LXFiYtV88aal99FtWi0Br01SIcOH/JbDBKEzkEQ2hyHBQAABIJ//vOfateuneWpYPEyxfXe7PeMB5o/nwr2ermX5R1E4+6I04rVK/waggShsxCENsdhAQAAdrdo0SKVKFHCEoN3PXyXVu9bbTzS/LWvt36tkmVK+q6/SEwRDR4xWEdSjhiJQYLQOQhCm+OwAAAAuzp16pSefvppSwgWKlJIQ/8x1Hig+WuJaYl64vknLD+DZnc30+r1q42FIEHoLAShzXFYAACAHW3atEmxsbGWELq5xc1asn2J8Ujz175c/6WKlSjmu/6o6CgNGTPE6FNBgtB5CEKb47AAAAA7uXDhgvr372/5TL3wyHC9MPwFx3zIfMKxBHXs3tESw3fef6fWbVpnPAIJQuchCG2OwwIAAOxi9+7duummmywhVKN+Dc3ZMMd4pPlrc9bMUamypSzvIDp83HClpqYaD0CC0JkIQpvjsAAAgPwuIyNDo0ePzvIh80++/KRjPmQ+PjVe7bu2l9vt9n2cxn3t7tPm+M3Gw48gdDaC0OY4LAAAID9LTk5WkyZNLE8Fy1ctrylLnfMh8zOWz1DxksV911+mQhmNeW+Mjh49ajz6CEIQhDbHYQEAAPlRZmamPvjgA0VGRlo+ZL599/baeGij8Ujzx7ambNUDHR64fP1BbrV9tK3it8Ubjz2CEH8gCG2OwwIAAPKbY8eO6e6777Y8FSxZvqTen/u+8Ujz16Z8M0UFogpcfipaubwmfDRBaWlpxkOPIMR/IghtjsMCAADyC6/Xq6lTp6pQoUKWGGzVqZXW7l9rPNL8sU2HNqlFqxaWp4Ltu7TXtu+3GQ88ghB/hiC0OQ4LAADID/73f/9Xbdu2tYRgsVLF9Pa0t41Hmr82YfoEhYWH+a6/VLlS+mjKR0pPTzcedwQhroQgtDkOCwAAMG3evHkqVqyYJQbvfPBOrdyz0nik+WPrflinhrc29F17UHCQuvToop17dhqPOoIQV0MQ2hyHBQAAmPLrr7+qU6dOlhCMLhatof8YajzS/LVRH41SaNjlj9OIrR6rqbOnGo85ghDZRRDaHIcFAACYsGTJEpUuXdoSg3Et4/Ttjm+NR5o/tmLnCtW7uZ7lcxV79e2lvT/sNR5yBCFygiC0OQ4LAADwp1OnTqlHjx6WECxQqIBee/c1JaUnGQ+1vF5SepJeG/Wagj3BvutveFtDzf9mvvGAIwhxLQhCm+OwAAAAf1m3bp0qVapkicH6Tevr68SvjYeaP/ZNwjeqUrOK79rDIsL0yuuv6MDBA8bjjSDEtSIIbY7DAgAA8trZs2fVt29fSwiGR4arz7A+jngqmJiWqG69u8ntdvuuv1nLZlq6cqnxaCMIcb0IQpvjsAAAgLyUkJCgGjVqWGKwdqPamrtxrvFQ88fmrp2rojFFLS+PfWPEGzp85LDxYCMIkRsIQpvjsAAAgLxw4cIFDRw4UEFBQb4YCgkNUc8BPZVwLMF4qOX14lPj9VCnh6wfpXH/nVq7ca3xUCMIkZsIQpvjsAAAgNy2c+dO1atXzxJDVW+sqi9WfWE81PyxzxZ9poJRBX3XXiSmiEaNH6XU1FTjkUYQIrcRhDbHYQEAALnl0qVLGjFihEJCQnwxFOwJVte+XbU1davxUMvrbTq0SW0fa+u7drfbrQc7PKgtiVuMxxlBiLxCENochwUAAOSGvXv36uabb7Y8FaxQrYI+W/KZ8VDzxyZMn6Co6CjftZcqV0offvKh0tLSjIcZQYi8RBDaHIcFAABcj0uXLmnUqFEKDQ31xVBQUJD+p8f/aNPhTcZDLa+37od1uuO+O3zXHhoWqm7PdtP3u743HmSmRxA6A0FocxwWAABwrfbt26fGjRtbngqWrVxWkxZOMh5q/tjQCUMVHhnuu/bYGrGaOnuq8RDLLyMInYEgtDkOCwAAyKmMjAyNGTNGYWFhlqeCD3d/WBsPbTQeanm9ZduXqVqtar5rjygQob+99Dft27/PeITlpxGEzkAQ2hyHBQAA5MQPP/yguLg4y1PBMpXKaOL8icZDLa+XmJaoZ/s9a/mA+Rvq36CFixcaj6/8OILQGQhCm+OwAACA7MjIyNDYsWMtTwXdbrceeuohbUjeYDzW8npz185VTMmYy08FIyPU/43+OnT4kPHwyq8jCJ2BILQ5DgsAALiaAwcOqEmTJpangqUrltYH8z4wHmp5va0pW9XusXaWa296V1OtWrfKeHDl9xGEzkAQ2hyHBQAAXElGRobGjRun8PBwy1PBdt3aaf3B9cZjLa/3yYJPVLhoYcsHzI98d6TjPmCeIMRfIQhtjsMCAAD+zMGDB3XbbbdZnoyVqlBKE+ZMMB5qeb11+9fptrsuX3tQUJAeeuwhxW+LNx5ZdhpB6AwEoc1xWAAAwH/KzMzU+PHjFRERYYnBtl3bOuKp4MhJIy1PRKvVrqZJUycpPT3deGDZbQShMxCENsdhAQAAf0hOTlazZs0sIViyfEmNnzXeeKjl9ZZtX6YadWr4rjskNERP935au/buMh5Wdh1B6AwEoc1xWAAAQGZmpiZMmJDlqWCbzm207sA647GWl0tMS1Svl3tZPkqi0W2NNPerucaDyu4jCJ2BILQ5DgsAAM52+PBhNW/e3BKCJcqW0Luz3jUea3m9uWvnKqbEf3yURIEI9R/cXwcOHjAeU4EwgtAZCEKb47AAAOBMmZmZ+uCDDxQZGWmJwVadWmnt/rXGYy0vtzVlq9o+1tZy3c1aNtPKtSuNR1QgjSB0BoLQ5jgsAAA4z+HDh9WiRQtLEBUvU1zjZowzHmt5vYlzJyqiwOWXxhYpXkSjxo9SSmqK8YAKtBGEzkAQ2hyHBQAA5/jjHUT/+6ng/Y/drzU/rDEea3m5dT+s091t7r78eYpBbj3UkY+SIAhxvQhCm+OwAADgDPv378/yuYIxpWM0dvpY47GW1xsyfojCwsN8112hcgV9PO1jPkqCIEQuIAhtjsMCAEBgu3TpksaMGWP5bD2Xy6XWnVoH/FPBb7/7VvVurue75vDIcD37wrPavXe38VhywghCZyAIbY7DAgBA4NqzZ49uvvlmx32uYMKxBHXv011BwUG+676x4Y1asHiB8Uhy0ghCZyAIbY7DAgBA4Ll48aLeeusthYSEXP6dObdb7Z5op/UH1xsPtrzc9G+nq3DRwr7rji4arYFvDtShw4eMB5LTRhA6A0FocxwWAAACy/bt23XTTTdZngqWiS2jD7/80His5eU2Jm9Ui/ut75x6Z6s7tW7TOuNh5NQRhM5AENochwUAgMBw/vx5DRo0SB6PxxdEQUFBeqTnI9p4aKPxYMvLDf9wuEJCLz8NLVGmhN6d+K6OHj1qPIqcPILQGQhCm+OwAABgfwkJCbrhhhssT8cqVKugyYsmG4+1vNy3332rqjWr+q45ODhYXXp20fe7vjceQ4wgdAqC0OY4LAAA2NfZs2f1yiuvKCjo8punBHuC1em5Ttp8ZLPxYMurJRxL0PMDnlewJ9h33bXq1dLsBbONRxAjCJ2GILQ5DgsAAPa0adMmVa9e3fJUMLZWrKYsnWI82PJy05ZMU3SRaN81RxWOUv8h/XXg4AHjAcQIQiciCG2OwwIAgL2cOXNGffr0kdvt9kWRJ8SjJ154QltTthoPtrzahoMb9MCjD1jeNfW+B+/T6vWrjYcPIwidjCC0OQ4LAAD2sWbNGsXGxlqeClarW03TV043Hmx5uf9+05hyseU07sNxvGlMPh9B6AwEoc1xWAAAyP9OnuqMNDAAACAASURBVDypZ555xhKCoWGh6tG/h+KPxhsPtrza0m1LVaVGFcuT0Cf/9qS279huPHYYQYh/IwhtjsMCAED+tmzZMpUvX94Sg7Ub1tbsdbONB1teLeFYgp78+5OWl8XWvqm2Zi2YZTxyGEEIK4LQ5jgsAADkT7/++qu6detmCcHwyHA998ZzSjiWYDza8mr//aYxEQUi1H8obxpjxxGEzkAQ2hyHBQCA/MXr9Wru3LkqWbKkJQZvvOVGfbnpS+PBllfbcHCDmt/b3HLNd7a6U6s38KYxdh1B6AwEoc1xWAAAyD+OHz+uBx980BJFkQUj1XdYXyWlJxmPtrza6MmjVSCqgO+aS5YtqfH/GM+bxth8BKEzEIQ2x2EBAMA8r9erjz/+WNHR0ZYYbHxnYy1KXGQ82PJqS5KWqErNy28aExoeqq7PdNWO3TuMxwwjCJE9BKHNcVgAADArOTlZLVq0sIRgdLFovT7h9YB9Khh/NF49Xuyh4OBg3zU3uLWB5n01z3jEMIIQOUMQ2hyHBQAAMy5duqS3335bERERlhhs0a6Flu9abjza8mqT501WwaiCvustHFNYA4YO0KHDh4wHDCMIkXMEoc1xWAAA8L8dO3aoYcOGlhAsXqa4xkwdYzzY8mqr96xWg1sb+K7X7Xar7f+01aatm4yHCyMIce0IQpvjsAAA4D/nzp3TwIED5fF4LGH0wOMPaO3+tcajLS+WlJ6kPoP6KCgoyHfN5WPLa9KUSUpLSzMeLYwgxPUhCG2OwwIAgH9s3LhRNWvWtDwVLFe5nD6c/6HxaMurzVo1S8VKFLv8pjFhoXru5ee0Z98e47HCCELkDoLQsPT0dHXu3FlFixZVRESE6tWrp23btmX7z3NYAADIW6dOndJzzz1nCcFgT7A6PddJmw5vMh5tebGNyRvVqn0ryzU3adFES1cuNR4pjCBE7iIIDfrtt99UsWJFdevWTQkJCUpJSdGqVat06NChbH8PDgsAAHlnyZIlKl++vCWMqt1YTdOWTzMebXm1YR8Ms3ymYEzJGI0aP0opqSnGA4URhMh9BKFBr776qpo2bXpd34PDAgBA7vv555/VuXNnSwiGRYSp54Ceij8abzza8mLfJHyj6jdUv3y94WF64pkntG3HNuNhwghC5B2C0KBatWqpb9++euSRR1S8eHHddNNNmjx5co6+B4cFAIDc4/V6NXPmTMXExFhisG5cXc3dONd4tOXFtqZsVcceHS1vGlOnQR3NWjDLeJAwgpB73LxHEBoUFhamsLAwvfbaa9q+fbsmTZqk8PBwTZs27Yp/5vz58zp58qRvaWlpHBYAAHLBsWPH1Lp1a0sIFihUQC+NeilgP2D+/ZnvK6JAhOXloa8Pf10Hkw8ajxFmfgShMxCEBoWEhOjWW2+1fK13796Ki4u74p8ZPHiw5X+o/hiHBQCAa5OZmamJEycqKirK8r+tt95zq5Z8t8R4tOXFVuxcoTr161z+6Iwgt9o80kab4zcbjxCWf0YQOgNBaFCFChXUvXt3y9cmTpyoMmXKXPHP8IQQAIDcs3fvXt12222WECwcU1hDJg4xHm15scS0RPV6uZfcbrfvemOrx+rjaR/zmYIsywhCZyAIDerYsWOWN5Xp27dvlqeGf4XDAgBAzp07d05vvPGGQkJCLDHY8pGWWrl7pfFwy4t9vvRzFS5W2PImOX1e7aN9+/cZDw+WP0cQOgNBaFBiYqI8Ho+GDx+u5ORkzZgxQ5GRkfriiy+y/T04LAAA5Mz69etVo0YNSwiWqlBK785413i05cXWH1iv+x++33K9zVo208o1K40HB8vfIwidgSA07JtvvlGdOnUUFhammjVr8i6jAADkkd9++009evTI8gHzHZ7poA3JG4yHW24vKT1Jr454VWERYb7rLVGmhN6d+K6OHj1qPDZY/h9B6AwEoc1xWAAA+Gter1dz585VyZIlrR8wXzdwP2B+zpo5qly9su9awyPC1bN3T+3cs9N4ZDD7jCB0BoLQ5jgsAABc2bFjx9SmTRtLCIZHhutvb/wtID9gfsPBDbqz9Z2Xr9ftUqMmjbTo20XG44LZbwShMxCENsdhAQAgq4yMDL333nsqWLCgJQZvvvNmfRX/lfFwy+0lpSdp0JhB8oR4fNdatmJZjRg3QimpKcbDgtlzBKEzEIQ2x2EBAMBq586daty4cZaPkhj84eCA/ID5uWvnqlTZUr5r9Xg86tKji7bv2G48KJi9RxA6A0FocxwWAAD+7ezZs+rfv788Ho8lBu/rcJ9W7gm8j5LYmLxR97S9x3KtDeIa6MtFXxoPCRYYIwidgSC0OQ4LAADSqlWrVKVKFUscla1cVu/Pfd94uOX2ktKTNPjdwQoJvfwZikViiuitsW/pSMoR4xHBAmcEoTMQhDbHYQEAONkvv/yiJ554whKCnhCPOvfurE2HNxmPt9ze/A3zVaPO5c9QDA4OVqenOilxe6LxeGCBN4LQGQhCm+OwAACcyOv16osvvlBMTIwlBms1qKUvVn1hPNxye5sObVKr9q0s7x7asElDzVkwx3g0sMAdQegMBKHNcVgAAE5z5MgR3XvvvZYQjIyKVJ9hfZRwLMF4vOX2Rn00SgULXX631GIlimnI6CE6dPiQ8WBggT2C0BkIQpvjsAAAnOLSpUt6++23FRERYYnBJvc20TdJ3xgPt9zeV1u+UvnY8r7rDA0PVcfuHRW/Ld54KDBnjCB0BoLQ5jgsAAAnSEhI0E033WQJwWKlimnY5GHGwy23t+nQJrXp0MZyrfVurqdZC2YZDwTmrBGEzkAQ2hyHBQAQyH7//Xc999xzcrvdvjhyu9164PEHtOaHNcbjLbc3YuIIhYaF+q61UJFCemPkG7w8lBkZQegMBKHNcVgAAIHI6/Vq7ty5Kl26tOVJWcUaFTVp4STj4ZbbWxS/SBWrVPRdZ1BwkNp3ac/LQ5nREYTOQBDaHIcFABBoUlJS1KpVK0sIhkWE6elXn9bWlK3G4y03t+nQJnV8uqPlWmvXq62ZX840HgOMEYTOQBDaHIcFABAoLl68qNGjR2d505hGdzTS/C3zjcdbbi4pPUlvTnhTBaIK+K4zKjpKg0YM4uWhLN+MIHQGgtDmOCwAgECwefNm3XjjjZYQLFqyqIZMHKKk9CTjAZebm7dunqrfUP3yu4eGheqxJx9TwncJxgOAsf8cQegMBKHNcVgAAHb222+/qWfPnpYQDAoKUtuubQPuTWPWH1ivO1vfKZf78rXWbVRXcxby4fIsf44gdAaC0OY4LAAAO/J6vZoxY4ZKlChhicHKtSvrk28+MR5vubmk9CS9/ObL8ng8vussXaG03nz7TR1JOWL8pp+xK40gdAaC0OY4LAAAu0lOTlbLli0tIRgeGa5nBj6jramB9aYxXyz7QsVKFPNdpyfEoy49umjbjm3Gb/YZu9oIQmcgCG2OwwIAsIsLFy5o2LBhCgsLs8Rg3N1x+jrha+PxlptbvWe1bml2i+U6b256sxYuWWj8Jp+x7I4gdAaC0OY4LAAAO1i/fr1q1aplCaSY0jEa9vEw4/GWm0s4lqBn+z2roKAg33WWKFtCY94bo5TUFOM3+IzlZAShMxCENsdhAQDkZ7/88ouefPJJ65vGBAfp4ace1tr9a40HXG7u04WfqlTZUpZ3D+35957asXuH8Rt7xq5lBKEzEIQ2x2EBAORHXq9XU6dOVUxMjCUGq9WtpinfTjEeb7m55TuWq27DupZ3Sb295e1aunKp8Rt6xq5nBKEzEIQ2x2EBAOQ3+/fv1x133GEJwciCkXp+yPOKPxpvPOBya/Gp8er5Uk/Lu4dWrVVV73/0vo4ePWr8Zp6x6x1B6AwEoc1xWAAA+cXZs2c1aNAghYaGWmKwaaumWrxtsfGAy829N+09RRSI8F1jdJFo9Xm1j/bs22P8Jp6x3BpB6AwEoc1xWAAA+cGSJUsUGxtrCcES5Upo9NTRxuMtN7c4cbGq1qzqu0Z3kFsP/M8DWrNxjfGbd8ZyewShMxCENsdhAQCYdPToUT300EOWEPSEePRor0e1IXmD8YDLrW0+vFntOrazXGeVWlX06YxPlZaWZvzGnbG8GEHoDAShzXFYAAAmXLx4UWPGjFFkZKQlkurcUkczVs0wHnC5taT0JA0dP1ShYZdfBluwUEENGDpABw4eMH7DzlhejiB0BoLQ5jgsAAB/W79+vW644QZLCBYuVlivjXtNSelJxiMutzZr1SxVrFzR8u6hD3d6WFsStxi/UWfMHyMInYEgtDkOCwDAX/75z3/qiSeesISg2+1W606ttWrPKuMBl1tbvWe1br/ndst11m1UV7MXzDZ+g86YP0cQOgNBaHMcFgBAXsvMzNSkSZNUpEgR6+/Q1amiT775xHjA5dbij8ar94Delo+RKB9bXiPGjdCRlCPGb84Z8/cIQmcgCG2OwwIAyEvfffedGjdubP1MwahI9R7aO6A+U3DC5xNUqEgh3zWGhYepR+8e2rF7h/GbcsZMjSB0BoLQ5jgsAIC88Pvvv6t3794KCgqyxOAd7e7Qku1LjAdcbm1R/CJVqV7l8u8JBgfpvgfv04rVK4zfjDNmegShMxCENsdhAQDkJq/Xq5kzZ6pUqVKWECxXuZzGzxpvPOByaxuTN+r+h+63XGPlmpU1aeokPkaCsf8/gtAZCEKb47AAAHLL/v37ddddd1kiKSwiTE+9/JQ2H9lsPOJyY0npSeo3rJ88IZd/TzCqcJQGvjlQ+w/uN34Dzlh+GkHoDAShzXFYAADX6//+7/80cOBAhYSEWGKw8V2NNX/LfOMRl1ubuniqisYU9V1fsCdYj3V7jI+RYOwKIwidgSC0OQ4LAOB6LF68WJUqVbKEYImyJTT84+HGAy63tmLniiwfI9Hotkaa/8184zfcjOXnEYTOQBDaHIcFAHAtUlNT9eCDD1oiyRPiUYdnOmhD8gbjEZcb25qyVd2e6ya32+27xtjqsRr7/lilpKYYv9lmLL+PIHQGgtDmOCwAgJw4f/68hg0bpoiICEsM1rmljmaunmk84nJrYz4eo8JFC/uuL6JAhPq82ke79+42fpPNmF1GEDoDQWhzHBYAQHYtXbpUVatWtYRg4WKFNeDdAUpKTzIecbmxeevmqVylcpanng92eFBrN641fnPNmN1GEDoDQWhzHBYAwNWkpKRkeXloUHCQ2nZtq9V7VxuPuNzY2n1r1fze5pZrrFWvlqbOnqr09HTjN9aM2XEEoTMQhDbHYQEAXMm5c+f01ltvKTw83BpKDWtp6rKpxiMuNxZ/NF49X+ypoKAg3/UViSmiIaOG6NDhQ8ZvqBmz8whCZyAIbY7DAgD4M0uXLlWVKlWyvDy0/zv9A+bloWOnjFVkgUjf9YWEhejJZ57U97u+N34jzVggjCB0BoLQ5jgsAID/lJKSonbt2mV5eWi7J9oFzMtD562bp9r1avuuz+12q8X9LbR89XLjN9CMBdIIQmcgCG2OwwIAkP798tA333wzy8tDazesrWnLpxmPuNzYmr1r1PSuppbrq16nuj6d8anS0tKM3zwzFmgjCJ2BILQ5DgsAYMmSJVlfHhpTWK+Ney0gXh4anxqv5157TqGhob7rK1OhjAaPHqyDyQeN3zQzFqgjCJ2BILQ5DgsAONcVXx7arZ1W7wuMl4eOnjxaEZGXPzMxsmCknn7+aW3fsd34zTJjgT6C0BkIQpvjsACA81zx5aGNAufloXPWzFGZCmUu/55gkFutHm6lFatXGL9JZswpIwidgSC0OQ4LADjL4sWLA/rloat2r1Jc8zjL9dW8saY+m/EZvyfImJ9HEDoDQWhzHBYAcIYjR46obdu2Afvy0PjUeHV9tqvcbrfv+oqVKKY3336T3xNkzNAIQmcgCG2OwwIAge3cuXMaOnTon7489PMVnxsPuetdUnqSxkweowIFC/iuLTQ8VD3/3pPfE2TM8AhCZyAIbY7DAgCByev1auHChYqNjbWEYJHiRTTg3QEB8fLQmStnqlLVSpbfE7yv3X1atW6V8RthxhhB6BQEoc1xWAAg8Pzwww+65557srw89KEnHwqIl4eu3LVSd7W+y3J9jW5rpGmzpyk9Pd34TTBj7N8jCJ2BILQ5DgsABI6TJ0/qpZdeksfjscRSnVvqaPqK6cZD7nq35cgWde7RWcGeYN+1FS9dXCPGjdDhI4eN3/wyxqwjCJ2BILQ5DgsA2F9mZqamTJmikiVLWkIwpnSMBn8w2PYvD01KT9KgMYMUGnb5g+ULFS6k3i/31q69u4zf9DLG/nwEoTMQhDbHYQEAe0tMTNQtt9xiCcHQsFB1fr6zNiRvMB5z17vJ8yarSLEil1/6GhSkVu1baf3m9cZvdhljfz2C0BkIQpvjsACAPf3zn/9U9+7dLR+z4HK5FNcyTvM3zzcecte7r7d+rWq1q1murUFcA81ZOMf4TS5jLHsjCJ2BILQ5DgsA2MvFixc1fvx4RUdHW2KpXOVyGvv5WOMhd71bu2+t7mpjfcOY8pXLa/zE8UpNTTV+g8sYy/4IQmcgCG2OwwIA9rF69WrdcMMNlliKLBipngN6amvKVuMxdz2LT43XM688Y/09wSKFNGDoAO0/sN/4jS1jLOcjCJ2BILQ5DgsA5H+pqalq3769JQRdLpfuevguLdm+xHjMXc+S0pM08qORlg+Wj4yK1FN/e0qJ2xON39Ayxq59BKEzEIQ2x2EBgPzr7NmzGjJkiMLDwy0hWPXGqpr01STjMXe9m/LNFJWtWNbywfL3PHCPlq9abvxGljF2/SMInYEgtDkOCwDkP16vV/Pnz1fFihUtIRhdLFovjXpJCccSjMfc9Wxx4mLVvqn25Wtzu3Rz05s1bfY0paWlGb+JZYzlzghCZyAI85ERI0bI5XKpT58+2f4zHBYAyF/27t2ru+++2xKCQcFBatetnVbtXWU85q5n6w+s130P3me5ttLlS2v0+NE6knLE+M0rYyx3RxA6A0GYTyQmJqpSpUqqW7cuQQgANvT777+rb9++Cg4OtgRT3bi6mr5yuvGYu57FH43Xs/2etVxbwUIF9fKgl7Vn3x7jN62MsbwZQegMBGE+cPr0aVWrVk0rV65U8+bNCUIAsJGMjAxNnjxZxYsXt4Rg8TLFNWTiECWlJxkPuuvZ6MmjFVEgwnddnhCPOnXvpC2JW4zfrDLG8nYEoTMQhPlA165d1bdvX0kiCAHARtavX6+bbrrJEoKhYaF6/O+Pa0PyBuMxdz2buWKm5YPl3W63mt/TXEuWLzF+k8oY888IQmcgCA2bNWuW6tSpo3Pnzkm6ehCeP39eJ0+e9C0tLY3DAgB+lpKSokceeSTLx0jcdt9tWrBlgfGYu559+923anRbI8t13djoRn024zPeMIYxh40gdAaC0KBjx46pRIkS2rFjh+9rVwvCwYMHZ7kB4bAAgH+cPn1aAwcOVFhYmOW/g2NrxWrCnAnGY+56tm7/Oj3U+SEFBQVZ3jBmxLgROnzksPEbU8aY/0cQOgNBaNDChQvlcrkUHBzs2x8vywkODlZGRkaWP8MTQgDwv8zMTE2fPl1lypSxhGChooX04ogXFX803njQXeviU+P1dN+nLW8YUySmiF547QXeMIYxh48gdAaC0KBTp05p9+7dljVq1EhdunTR7t27s/U9OCwAkLfi4+N1yy23WELQE+LRw089rNV7VxsPumtdUnqSBo8brLDwMMt1dXyyI28YwxjT8eMEoVMQhPkMbyoDAPnD8ePH9fjjj2d5if7NLW7W7HWzjQfd9eyjuR+pSLEil98wJsitu1vfrW9XfWv8BpQxln9GEDoDQZjPEIQAYNa5c+c0fPhwFShQwBKC5aqU09vT3jYec9ezeevmKbZ6rOW6bmp8k6bPna709HTjN5+Msfw1gtAZCEKb47AAQO7wer368ssvValSJUswFSxUUH97/W/amrLVeNBd65bvWK6729xtua6KVStq3MRxSklNMX7TyRjLnyMInYEgtDkOCwBcvx07dqh58+aWYAoKDlLrTq21fNdy40F3rduYvFHtu7SX2+32XVeJMiU06K1B2n9gv/GbTcZY/h5B6AwEoc1xWADg2v3000/q1auX5aMWXC6X6sbV1ecrPjcedNe6+KPx6vtGX0VERviuqUBUAT330nPavmO78ZtMxpg9RhA6A0FocxwWAMi5Cxcu6J133lF0dLQlBEuVL6W3PnpLSelJxqPuWpaUnqSRE0cqosDlEAyPCNejTzyqdZvWGb+5ZIzZawShMxCENsdhAYDs83q9Wrx4sapXr24JwfDIcHV/pbs2Hd5kPOqudZ9+/aliSsZcfudQt1vN72mur5d8bfymkjFmzxGEzkAQ2hyHBQCyZ9euXWrZsqUlBN1ut1q2b6kl3y0xHnTXuq+2fKXqta2Be0P9GzRlxhSlpaUZv6FkjNl3BKEzEIQ2x2EBgL/2448/qmfPnll+T7Bmg5r6ZPEnxoPuWrdq9yo1vaup5ZrKViqr0eNH60jKEeM3kowx+48gdAaC0OY4LADw586dO6eRI0cqKirKEk3FyxTX6xNet+3vCW46tEld/9ZVnhCP75qii0ZrwNABvHMoYyxXRxA6A0FocxwWALDyer2aPXu2KlasaAnBiAIReurlp7Tx0EbjUXcti0+N17OvPiuP53IIRhaM1NPPP807hzLG8mQEoTMQhDbHYQGAy+Lj43XrrbdaP08wKEj3dbhPS7bb8/cEk9KTNOS9ISpctLDvmjwhHj3a9VFt3LLR+A0jYyxwRxA6A0FocxwWAJCOHj2qTp06WULQ5XKpXpN6mrZ8mvGou9ZN+GKCootEW0Kw5QMttXjZYuM3ioyxwB9B6AwEoc1xWAA42enTpzVw4ECFh4db31ylclmN/HSkbX9PcPq301W6fGnLNTWIa6Dp86YrPT3d+E0iY8wZIwidgSC0OQ4LACfKyMjQJ598olKlSlmiKapwlJ4f/Ly2pmw1HnXXsq+2fKUadWpYrqlKzSr6YPIHSk1NNX5zyBhz1ghCZyAIbY7DAsBpVq9erXr16lmiyRPi0YNPPqgVu1cYj7pr2YqdK3TrHdbffSxZtqSGjR2mg8kHjd8UMsacOYLQGQhCm+OwAHCKAwcOqG3btll+TzCuZZzmrJ9jPOquZesPrFeH7h0UHBzsu55CRQqp/+D+2rNvj/GbQcaYs0cQOgNBaHMcFgCB7tdff1WfPn0sH7fgcrlUuXZlvTfrPeNRdy3bmrJVT7/wtCUEowpFqUfvHtq2Y5vxm0DGGDt+nCB0CoLQ5jgsAALVxYsXNX78eBUpUsQSgkVLFFW/Mf2UcCzBeNjldIlpiRowZoCioqN81xMSFqKO3Ttqw5YNxm/+GGPsP0cQOgNBaHMcFgCBxuv1auHChapevbolBEPDQ9X5+c5af3C98bDL6ZLSkzTmkzEqGFXw8u89hnrU6uFWWrpyqfGbPsYY+7MRhM5AENochwVAIImPj1fTpk2z/J5gi3Yt9HXC18bD7lr2yVefqHip4pbrady0sWYvmM1HSDDG8vUIQmcgCG2OwwIgEBw5ckQdOnTIEoK1G9bWJ998YjzqrmVz185V5RqVLddT48Ya+mjqRzp69KjxGz3GGLvaCEJnIAhtjsMCwM5+/fVXvfjiiwoNDbWEU5lKZfTWR2/Z8oPlFycuVt1GdS3XU65SOb094W0dSTli/AaPMcayO4LQGQhCm+OwALCj8+fPa9y4cVneMKZQkULqPaS3LT9YfsXOFbr/ofvldrsvvwFO8aIaOGyg9h/cb/zGjjHGcjqC0BkIQpvjsACwE6/Xqzlz5qhyZetLKUPDQvVor0e1eu9q42GX0637YZ3adWxnCcEixYvoxQEvavfe3cZv6Bhj7FpHEDoDQWhzHBYAdrFp0ybFxcVZQtDtdqtFuxb6Kv4r42GX0206tEmde3ZWSGiI73oiC0aqV59eSvo+yfiNHGOMXe8IQmcgCG2OwwIgvzt48KAefvjhLG8Yc+MtN+qzJZ8ZD7ucLj41Xj1f7CmPx3M5BKMi9XiPx7U5frPxGzjGGMutEYTOQBDaHIcFQH71888/q3fv3pZwcrlcKlelnEZ+OtJ2bxiTcCxBr7z1ikLDLr8BTnBwsNo80kYr1640fuPGGGO5PYLQGQhCm+OwAMhvzp49q1GjRqlQoUKWECwcU1gvDHtBW1Pt9YYxSelJeuvDtxRZMPLyS12D3Lrzvjv19ZKvjd+wMcZYXo0gdAaC0OY4LADyi8zMTE2fPl3ly5e3hGBYRJg6P99Za/evNR53Od37M95X4aKFLb/z2Pj2xpq1YBYfKs8YC/gRhM5AENochwVAfrBmzRo1aNDAEoJBQUFq+UhLLUpcZDzscrrPFn2mqrWqWq6nToM6+nj6x3yoPGPMMSMInYEgtDkOCwCT9uzZozZt2mR5w5gGzRpo2vJpxsMup5uzZo5q16ttuZba9WtrwkcT+FB5xpjjRhA6A0FocxwWACakpaXpqaeeUlBQkCWeKtWopLGfjzUedjndovhFuqnxTdY3v4ktpxHjRij5ULLxmzLGGDMxgtAZCEKb47AA8Kd//etfevXVVxUeHm6Jp6Ili6rfmH5KOJZgPO5ysmXfL1Nc87gsIfj6iNe1/8B+4zdjjDFmcgShMxCENsdhAeAP58+f1zvvvKOiRYta4ikyKlJPvfyUNiRvMB53Odmq3avU4v4WlmuJKhylfq/30+69u43fhDHGWH4YQegMBKHNcVgA5KXMzEx9/vnnqlixoiWePCEePfTkQ1q+a7nxuMvJ1u5bq1YPt5Lb7fZdS0SBCD37wrP6ftf3xm++GGMsP40gdAaC0OY4LADygtfr1bJly1SvXj1LCLrdbt3R9g4t2LzAeNzlZOsPrFenHp0sIRgeEa4nn3lSCd8lGL/pYoyx/DiC0BkIQpvjsADIbdu2bdOd6jRX8gAAIABJREFUd96Z5Z1D6zetrynfTjEedznZpkOb1KVnF4WGhfquIzQsVB2f6qjN8ZuN32wxxlh+HkHoDAShzXFYAOSWQ4cO6bHHHssSglVuqKJ3vnjHeNzlZFuObNHzA55XWHiY5aWhj3Z7VKs3rDZ+k8UYY3YYQegMBKHNcVgAXK+ffvpJvXv3VkhIiCUES5YvqUHvDVJiWqLxwMvu4lPj9Vz/5yxPBD0ej1q1b6Xlq5Ybv7lijDE7jSB0BoLQ5jgsAK7VmTNn9OabbyoqKsoSgoWKFNLfXv+bthzZYjzwsruEYwl66c2XLE8EPaH/DsFF3y4yflPFGGN2HEHoDAShzXFYAOTUxYsXNWnSJJUqVcoSgmERYer4XEet3rfaeOBld4lpiRo0dpAiIiMuv/FNkFvNWjbTl4u+VHp6uvEbKsYYs+sIQmcgCG2OwwIgu7xer+bPn6/q1atbQjAoOEj3dbhPi7ctNh542V1SepKGfzhcBaMKWt4B9Zbbb9HM+TOVlpZm/EaKMcbsPoLQGQhCm+OwAMiOdevWKS4uLssbxsS1jNPMNTONB15OQvC9z99TqbL/8XTT7VKDuAaaOmuqjh07ZvwGijHGAmUEoTMQhDbHYQHwV7Zv36777rsvSwjWalBL/5j/D+OBl5N9OPtDxZSMsYRgnQZ1NHnaZB09etT4jRNjjAXaCEJnIAhtjsMC4M8cPHhQHTp0yBKC5aqU04iPRygpPcl44GV3n371qarWrGq5jnqN6+nDTz5USmqK8RsmxhgL1BGEzkAQ2hyHBcB/On78uHr16qXg4GBLQBUvU1z9xvRTwrEE44GX3X2y8BOVLlfa+pmINato/D/G60jKEeM3SowxFugjCJ2BILQ5DgsASfrtt9/06quvKjw83PoREkUL6dnXn9Xmw5uNB162nwh+/anKlC9juY6qtapqzIQxOnzksPEbJMYYc8oIQmcgCG2OwwI425kzZzRixAhFR0dbAiqiQIQe7/O41vywxnjgZXfTlkxT2YplLddRPra8Ro4bqeRDycZvjBhjzGkjCJ2BILQ5DgvgTBcuXNCHH36Y5bMEQ0JD9OCTD2rZzmXGAy+7+3zp5ypfqbzlOspWLKvhY4frYPJB4zdEjDHm1BGEzkAQ2hyHBXCWzMxMzZgxQ5UrV7Z+lmBQkO5uf7cWbl1oPPCyuy+WfaEb6t9guY7SFUrrzbff1P6D+43fCDHGmNNHEDoDQWhzHBbAGbxer5YsWaJ69epleefQW++5VV+s+sJ44GV3M1fMzPKuoeUqldPQMUO1/wAhyBhj+WUEoTMQhDbHYQEC38aNG9W0adMsIVjv1nqa/PVk44GXkxCsXa+2NQRjy2nwqMGEIGOM5cMRhM5AENochwUIXDt37lSbNm2yhGCVOlU0dvpY44GX3c1aNUtValSxXEPFqhX1+sjXtW//PuM3PIwxxv58BKEzEIQ2x2EBAs/hw4fVpUsXud1u6xutVC6rIROH2OZD5Wevnq2qtawvDS1eurgGDhuovT/sNX6jwxhj7K9HEDoDQWhzHBYgcKSnp+uZZ56Rx+OxRFRMqRi9NOolbU3dajzysrO5a+eq+g3Vs1zDwDcHas++PcZvcBhjjGVvBKEzEIQ2x2EB7O+nn37SCy+8oLCwMEtERRWOUq8BvbTx0EbjkZedzd8wX3Ua1LFcQ7GSxTRg6ABCkDHGbDiC0BkIQpvjsAD29a9//UsDBw5UgQIFsnyofOfnO9vmQ+XnrJmj+rfUt1xD0RJF1X9If0KQMcZsPILQGQhCm+OwAPZz+vRpDR8+XIULF7ZEVGh4qNo/3d42Hyo/a9UsNbi1geUaylQoo/6DCUHGGAuEEYTOQBDaHIcFsI9z585p3LhxKl68uCWiPCEete7cWou3LTYeednZjOUzVLl6ZetLQ0sUIwQZYyzARhA6A0FocxwWIP+7ePGiJk2apLJly1oiKigoSHe3v1vzt8w3HnnZ2efffq6KVSparqF85fIa8NYA3jWUMcYCcAShMxCENsdhAfKvjIwMff7556pc2fo0zeVyqVmrZpq1dpbxyMvOpnwzReUrlbf8/UuUKaGBwwbyOYKMMRbAIwidgSC0OQ4LkP9kZmZq3rx5qlWrVpYQbHxnY01dNtV45GVnHy/4WGXKl7H8/UuVK6VBIwbphwM/GL9RYYwxlrcjCJ2BILQ5DguQf3i9Xi1ZskT169fPEoL1mtTTpIWTjEdedjZ5/uQsHyhfpkIZDR0zVPsP7Dd+g8IYY8w/IwidgSA0aMSIEWrUqJEKFiyo4sWLq127dtq/f3+OvgeHBcgf1q5dqyZNmmQJwZoNauq9We8Zj7zs7B9z/qESpUtY/v7lYstp+Njh2n+QEGSMMaeNIHQGgtCge++9V1OmTNGePXu0Y8cOtW7dWhUqVNCZM2ey/T04LIBZ8fHxuvvuu7OEYOXalTV6ymglpScZD72/WlJ6kt6b/p4qVra+WUzNujU1YtwIHTh4wPgNCWOMMTMjCJ2BIMxHfvrpJ7lcLq1fvz7bf4bDApixfft2PfDAA1lCsFzlchry4RBbhOC4z8apSEwRy9+/Vt1aGj1+tA4mHzR+I8IYY8zs1q1bRxA6AEGYjyQnJ8vlcmn37t3Z/jMcFsC/du7cqYceeihLCJYsX1L9x/ZX/NF447F3tRAc/fFoFS5a2PL3r1qrqsZ+MFaHDh8yfgPCGGPMzFauXKlu3bopNraygoOD5fGEae/eX4387y33uP5DEOYTXq9XDzzwgJo2bfqX/77z58/r/7V330FVXYsawE+lHHoREBAEQZqCgAJKVOwNOxqMRI3BAirYYg8qgRixo1iCWKJRo6LG2A0KKATEXGM0GLCBYIyN6E3evd77ot/7g6fJESwosDns7zfzTWZOwFnOcuH63Gvv/fDhw2cpKSnhYiGqBRcvXsSgQYMqFEFTS1NMjJuI765/J3jZe1nOlJxB7KpYGBobqo3f2cMZK9aswLXr1wTfiDAMwzC1m/z8fEyYMAFubu5QKrWe/d0gl2vBysoDXbt+grQ0FsL6joWwjoiMjIS9vT1KSkpe+nVz586tsCHlYiGqOZcuXUJoaCikUqnamjNpYIJxMeNw+sppwcvey5J7IxcxS2OgZ6BX4R7BpPVJuF50XfANCcMwDFM7uXLlCpYsWQI/Pz+4u7eAVCqDRCKBTCaHubkT/P3DMX78KSxeXIa9e28jNbUQN2/yyGh9x0JYB4wfPx62tra4du3aK7+WVwiJakdhYSHCwsIgk8nUipSxmTEi5kQg83Km4GXvZfnu+neImhOlfkVQKkEzn2ZYu3EtioqKBN+YMAzDMDWbixcvIiYmBv7+/nB0dIZCUX4VUCqVwcOjF/r1W45x405hwYIyfPXVHeTk3ML33/+VfftYCMWAhVBAT548wbhx42BtbY3CwsI3+jW4WIiq19WrVzFixAjI5XK1ImhoYohRM0bV+SKYdTULE2ZNgJ7+X1cE5Qo53un0DjZu34ji4mLBNygMwzBMzSQ/Px/z589H69atoa//91sEpLC0dENw8EJERmYiLu4etm69i+xs9QL4fFgIxYGFUEAREREwMjJCeno6bt269Sz/+te/XvvX4GIhqh5FRUUIDw+HQqFQK4L6RvoYOXUk0gvSBS97L0tmYSbeG/We2vjlcjkCOwRie+p2lJSUCL5RYRiGYao3V69exZ49ezBmzBgYGhqpFUADA0u4uwcjNHQTYmPvYNOmuzh16uUFkIVQnFgIBVTZvYASiQQbN2587V+Di4Xo7dy4cQNjx46FUqlUW4d6hnoYPmk40vLTBC97L8vJ/JPoG9pX7WirQkuBHv17YM+BPSgtLRV8w8IwDMNUTwoKCrB7925MmzYNNja2z3726+gYwsDAEm5uPTF4cApiY+9g/fq7SE//tUoFkIVQnFgINRwXC9GbuXnzJsaPHw8tLS21IqjSVyFsQhjSfqrbRfD4j8fRpXcXtYfdKJQK9BzQEweOHBB808IwDMO8fS5fvoyEhAS0b98exsZ/vTdWR8cANjYt4O4ejMjIdMTF3UVy8j2cOPF2BZCFUJxYCDUcFwtR1dy6dQvR0dHQ1tZWK4I6Kh2ERobi2IVjgpe9l+XQ2UMI7BgIifSvsWtpayEkLATHThwTfPPCMAzDvHkKCgrw2WefISgoCCYmpuonV/TM4OLSBWFhO/DJJ3fw+ef3kJZWvQWQhVCcWAg1HBcL0eu5ffs2pkyZAl1d3QpFcNDoQTj641HBy97Lsj9nPzr06KB2RVBHpYOw8DCkn04XfBPDMAzDVD2FhYWYPXs2hg8fjlat2kAu/+s+cJXKFM7OndCvXyLmzfsFyck1XwBZCMWJhVDDcbEQvdydO3cwbdo06Ompv4dPS0cLA0YOwKFzhwQvey/L7ozd8Pb3Vhu7kYkRwseFIys3S/DNDMMwDPP6ycnJwaRJk9C6dWt4evo+K4AKhQ48PHqhU6cZGDhwLebN+wXr19+t9iOgLIRUGRZCDcfFQlS527dvY+rUqVCpVOpFUFsLfYf3xcHvDwpe9l6WrUe2ws3TTW3sJg1MEDUtCmd/OCv4poZhGIZ5dU6cOIExY8bA3d0d2to6z36eS6UyNG/eF336LMYHH+xDbOwdbNjw9g+BYSGkN8FCqOG4WIjU3bp1C5MnT65wNFShVCA4LBjf5H0jeNl7WdbtXgcbexu1sds0tsH0mOk4f/G84JsbhmEY5sXJzc1FYmIimjf3hELx19OrZTIFzMwc4esbhg8+2I+4uHvYvLnqr4FgIaSawEKo4bhYiMr98ssvmDhxInR0dNTKlFJLid7v98b+M/sFL3svSl5pHhKSE2DaQP0BApY2lpgTNwf5P+cLvslhGIZh1HPjxg0cPHgQCQkJCArqCJlM/tc7bPUbwMLCFQEBozB2bBoWLCjDtm13Xvki+LoWFkJxYCHUcFwsJHY3b95EVFRUhSKopa2FvsP61ukrgrk3cjHzs5nQM1C/v9HO0Q7xi+NRUFgg+IaHYRiGKU9+fj7i4+MRFBQEMzNzSCTSZ8c/ra2bw9raC/36rcDs2VewaFEZdu26g5wc4UsdCyG9CguhhuNiIbEqLS3F+PHjK7w+QktHC/1G9MOBswcEL3wvStbVLEyaOwl6+upF0NXTFSvWrsDVa1cF3/gwDMOIPXl5eZgwYQK8vLygUqn/vNbVNUbjxm3Qo0c8YmKKkZh4H/v330ZenvAljoWQqoqFUMNxsZDY3LhxA5GRkRVeKK+lo4X+I/vX6YfFZBRkIPTDUCi1/rqvRCqVwreNLzZs3YCioiLBN0AMwzBiTGlpKTIyMjB69Gi0aOGNRo2aqD0AxsjIBu7uvTFoUDLmzfsFa9few7FjdesBMCyE9KZYCDUcFwuJRXFxMcaOHVuhCGrramPghwPr9Osjjv94HCHDQqBU/lUEldpKdO3TFTv27EBJSYngmyGGYRgx5dKlS/jss8/QqVMnmJtbQE/P8K9/YNTSQ0DAhxg06HOMHZuG+Pj72Lz5LjIz638BZCEUJxZCDcfFQvVdUVERRo8erVamnr6UPWRUCA7/cFjwwveifJP7DQLaB6gfM9LTRXBIML458o3gGyKGYRixJD09HdHR0fDx8YGenv5zxz+N4O0diuHDd2P27OtYvLgMu3dr/v1/LIT0ulgINRwXC9VX165dQ3h4OBQKRYUiOHjMYBw5f0Twwvei7EjbAXcvd/UNh0oX749+HycyTwi+MWIYhqnPKSoqQlJSEqZOnYp+/QbA2Nj8ueOf1nBz64WBA9dg3rxSrF59D4cO3cbZs8IXsLoWFkJxYCHUcFwsVN9cvXoVI0eOrFAEdfV0ERoRiqM/HhW88L0o6/euh52jndq4DYwNMDZ6LLLPZAu+SWIYhqmPOXHiBCZMmIDAwEC0bNka2tq6z8pfo0Y+8PYOhb9/OD788ADi4u5hyxZxHv9kIaQXYSHUcFwsVF8UFBRgxIgRkMvlaoVKpa/CkHFDcOzHY4IXvsqSV5qHFVtWwLKhpdq4zSzNMO3jaTj34znBN0sMwzD1JZcvX8aKFSvQq1cv2NraQi5XqF39c3fviR495iMkZB1mz76CxMT72Lev/j39k4WQqhMLoYbjYiFN9+OPPyI0NBRSqVS9CBqoMHTCUBy/cFzw0ldZcm/kImZJDBpYNVAbt629LeZ9No8vk2cYhqmGHD9+HMnJyYiIiICpqbnaz1stLT00bNgcrVuPxqhRRxEXdw8bN97FyZO8+sdCSFXBQqjhuFhIU+Xl5aFfv35qf7lLJBLoGeohLCoM3178VvDSV1mevkPQyNhI7dURzX2bY8mqJbh85bLgGyiGYRhNzE8//YSEhARERESgV68+MDIye/Zz1sjIGtbWnnB17Y6+fZdh9uxrSEy8j717byM3V/jiVF/DQigOLIQajouFNE1WVha6d+9eoQgamhpi5NSROHHphOClr7KkXUxD/6H91Y60ymQytPBrgeQtybhedF3wzRTDMIym5Pr160hJSUFoaCicnZs+u+/v6dFPe3s/+PuPRGBgJKKjc7FgQRm++OIu0tN59Y+FkKobC6GG42IhTfDkyROkpaWhQ4cOFYqgqYUpxs4ei8zLmYKXvspy4MwBBHYMVDvSqlAq+A5BhmGY10xJSQkyMzOxbt06hIWFwcDAUO3vAblcC2ZmjmjefCBCQtYiJuYGVq++hwMHeO+f0GEhFAcWQg3HxUJ12ZMnT3Dw4EG0bt26QhFsYN0AUbFROH3ltOClr7J8efRLuDZ3Vb9fRUcLA94bgKNpRwXfYDEMw9TVZGdnY+bMmZg8eTI6duwCpVJb7eingYEVnJ07oUePOHz00QUsXlyGnTvvIDtb+ALEsBCKEQuhhuNiobro8ePHSE1Nhbe3d4Ui2NC+IT5a+BG+u/6d4KXv+eSV5mHVtlVoaNtQbcz6RvoIHxeOrJwswTdaDMMwdSn5+flISEhAz549YWvbCAqFUu2hL87OQfD0HIhOnWZg+vR8fPppGTZtuosTJ3j0UxPCQigOLIQajouF6pI///wT27Ztg4eHR4Ui2MipEWYvn42c4hzBi9/zyb2Ri3nL5sHKxkptzBYNLTA9ZjpfHcEwDHPzJgoKCvDNN99g4cKF8PPzV7vv72kBtLLyQKtWH2D48F2Ijb2Ddev40ndNDguhOLAQajguFqoL/vvf/2LDhg1wdnauUAQd3R0RuyYWZ0rOCF78ns/pK6cRNTsKevp6ak8MdfF0QfySePxc8LPgGzCGYRghUlBQgJUrVyIiIgJDhw6Fk5Ob2kNfjIysYWbmgObN+2PgwNWIibmBVavK3/nHp37Wn7AQigMLoYbjYiEh/fvf/8bq1athb29foQi6erti4caFyCvNE7z4PZ9vL3yLPqF9IFfI1YqgT4AP1mxYg2vXrwm+GWMYhqmtFBQUYNWqVRg4cCCcnZ2ho6N+5c/Kyg0+PqFo1qwf3ntvC+bOLcXy5WXYvfsOvvtO+NLCsBDS22Eh1HBcLCSEP/74A8uWLYO1tXWFItjcvzmWbVtWJ4vg/pz9CAgKgESq/qCY7n27Y8eeHbhx44bgGzOGYZiaTGFhIb744gskJCRgyJAhFcqfQqENU1MHeHj0Qd++yzBr1mUsXVqGr766g6ws4QsKw0JI1Y+FUMNxsVBtKisrQ2xsLMzMzCoUQd92vlidulrw0ldZvjj8BZq6N1Ubr7auNkLCQnD0Wz4xlGGY+pn8/HwsX74cAwcORL9+A+Dm5gWZTPbs2KelpSssLJrCw6M3+vRZipkzC7BkSRm2b7+DU6eELyOM8GEhFAcWQg3HxUK14ZdffsHUqVOhr69foQi27tIaKQdSBC99zyevNA9LNy2FpbWl2ngNTQwxJnoMsnKzBN+sMQzDVFeys7MRExODrl27olEjO7VXPZS/7sEGPj6hCAqagj59lmLu3BIsXVqGHTtY/pgXh4VQHFgINRwXC9WkK1euYPTo0dDS0lLbWMjkMgT1DsKWY1sEL37P57vr32HmgpkwtzBXvwfGxgoz5s/A+YvnBd+4MQzDvGlKS0uRk5OD6OhohIeHo3Pn7jAwMK7wtM8GDZrC0zME/fuvxKxZl7FixX3s3Mljn0zVwkIoDiyEGo6LhWrC+fPnERoa+uxo0dMotZToOaQnUk+nCl78nk/axTQMixwGpfKvd2BJpVI4uztjUeIiFF4uFHwjxzAMU5Vcv34dmzdvxvDhw9GiRQtYWVnD0PCvI/tKpS6cnNrDx+c9+Pl9iKFDv8S8eb9g1ar72LPnDnJyhC8UjGaHhVAcWAg1HBcLVafTp0+jV69eFY6F6urpYtCoQTj4/UHBi9/z2Ze9DwHtA9TKq0wuQ/uu7bFx+0YUFxcLvqljGIZ5VQoLC7FkyRIMGDAAzs5NoaurUj+ZIZPDyMganTrNQFjYl4iMPIm4uHtYt+4eDhy4jbw84csDU//CQigOLIQajouF3taTJ09w+PBhtG3btkIRNDQxxIjJI/DtxW8FL37P5/PUz9HYqbHaePWN9BHyfggOHj0o+OaOYRimshQXFyMzMxMpKSkYOHAgGjWyh42NI6RSqdqTPk1M7OHq2h09esRh0qR/4LPPyrB5810cP/6r4CWBEU9YCMWBhVDDcbHQm/rzzz/x1Vdfwdvbu0IRNLcyR2RMJDIvZwpe/P6e3Bu5mLdiHoxN1e+XMTIx4oNiGIapc8nNzUV8fDx69+4NJycnqFR66k871taHrq4x2rQZiwEDVuG997Zizpwrz+7348NeGKHDQigOLIQajouFqurRo0dITk6Gs7NzhSJo42iDjxZ+hOxr2YKXv7/n1OVTGBk9Eto66k/Ns21si9lxs/HjTz8KvvFjGEa8uXr1Ko4ePYo1a9agf//+MDMzh0wmf+79fjowMbGHi0sX9O+/AtOnX0J8/H2sX38XBw/yyCdTN8NCKA4shBqOi4Ve1++//44lS5bAxsamQhFs0qwJ5q+ejzMlZwQvf3/PkX8cwYCwAVBqqT8oxquVF1Z+vhJXrl4RfCPIMIx4UlJSgqNHj2LWrFkICQlBSMi7cHHxVPt5qlKZQKUyg62tL/z8PkRo6BeIibmB5cvL3++Xmckjn4zmhIVQHFgINRwXC73K/fv3MW/ePJiamlYogs39m2PJliXIK80TvPz9Pdu/3Q7/tv7qR6t0tNGpZyfs2LMDN27cEHxjyDBM/U56ejrmzp2L4OBgODs3hZ6eASQSqfopBdsWaNlyKLy8BqN//yTMnHkZCxaUISXlLg4d4lU/RvPDQigOLIQajouFXqS4uBgTJ06Enp5ehSLo39kfa/euFbz4/T15pXlYunkpbOzUr2DqG+pj+JjhSMtIE3yDyDBM/cvFixexd+9eREREwNvbG61aBcLYWP09pgqFNoyNbeHo2A5t207E8OGpiI39FUlJ97Bnzx1kZwu/cWeYmggLoTiwEGo4LhZ63vnz5xEWFga5XP3+FZlchg59O2DL8br1Mvnsa9mYPG8y9PTVi2sjx0aY9vE0fP/D94JvGBmG0fycPXsWCQkJGDRoEJo1awYjI2NIpX+9rkYqlUEu10KzZn3QseM0dOgwA2Fh2zFvXilWrLiP7dvvID2dxz0ZcYWFUBxYCDUcFwsB5a+OOHnyJHr06FHhaqCWjhaChwZjT/Yewcvf33Ps/DH0frc35Ar14urs7oyEFQn4ufBnwTeQDMNoXrKysvDll19i0aJF6NmzF0xMzCo84EUmU8LAwBJ2dv7o2nUuxo07jdjYW1iypAxbt/LVDgzzNCyE4sBCqOG4WMTtzz//xO7du9GqVasKRVDfSB9DJwzFkR+OCF7+/p5tx7ahuW/zClcvA4ICsGnHJr5InmGYV+bGjRvYv38/pk+fju7du8Pb2wc+PgEwMjJTewCVgYEl9PTM0aiRL1q2HIGQkGTMmXMFixeXYcuWuzh27FecPSv8ppth6mpYCMWBhVDDcbGI07///W+sXbsWTk5OFYpgA+sGGBczDhmFGYKXv6c5U3IGi9YvgmNTR7Wx6qh0MChsEI6mHRV8g8kwTN3L9evXkZaWhjFjxqBt27awtW0EbW3diichtPTg6dkfnTpNR9u20Rg+fDfmz/8FS5f+dcWPxY9hqh4WQnFgIdRwXCziUlZWhvj4eFhaWlbYEDV2aYxZy2bhu6LvBC+AT5NZmIkJsydApadSG6uFjQWmzp6KvHN5gm84GYYRPmfOnMGSJUsQHx+P8ePHw8XFHTo6queOekqhra0Pc/MmcHXtho4dZ2DkyP2Ijf0ViYnl9/idOMGjngxTnWEhFAcWQg3HxSION27cwOTJk6Gvr1/pqyMWbV5Up14dceDMAQR1D4JCofhrrFIJWvi1wKKVi3h/IMOIMPn5+UhJSUFkZCQ6dOgABwcH6OnpQypVf5WDiYktrK09YW3thT59luLDDw9g4sQ8xMXdw5o195CaegenTgm/UWYYMYSFUBxYCDUcF0v9duHCBQwbNky9WEkkkMlkCOweiPXfrBe8/P09KftS0MSlidpYdVW66NGvB7albuP9gQxTz3P9+nUcO3YM27Ztw6xZs+Dm5gYvL19YWjaq8I9ZSqUKJiZ2cHB4B61bj0ZIyFrMnFmAxYvLsHFj+Xv8cnOF3xAzjJjDQigOLIQajoul/nny5AkyMzPRq1evivfJaGuh55Ce2Jm5U/Dy9zQ5RTmYlTALRiZGFR5qM2LsCJzIPCH4JpVhmOpLSUkJTpw4gfj4eAwePBg+Pj5o0MASSqWW2s8AuVwLcrkW7Oz80K5dFDp3noPg4IWYMCELcXH3kJR0D7t28VUODFOXw0IoDiyEGo6Lpf54/Pgx9uzZg4CAgIpPDDXUx5DIITh07pDgBfBp0i6mYdAHg6BQql+9tLW3xaxPZuGHCz8IvnFlGObNUlxcjDNnzmD37t0IDw9H165d0aNHbzRp4l7h55OaFCmpAAAcx0lEQVRMJodKZQJLS3e4u/dGt27zMXnyOcTF3cWyZeVP8zx8+Dby8oTf3DIMU7WwEIoDC6GG42LRfP/zP/+DNWvWwNnZucJGy9zKHGNnj0V6QbrgBfBpdmfsRoceHSCT/+2FzjIpfFv7Iml9Eq5cvSL4ZpZhmFfn8uXL2LFjB6ZPn47evXujWbNmMDNrUOFKn0QigUKhjSZN2qJly/fh7NwJbdtOwJAhWzBnzrVnRzy/+eY2cnKE38AyDFN9YSEUBxZCDcfForlu376NmJgYmJmZVdh82TnbYcaSGfjuet14YmheaR5WbFmBph5N1capZ6CHvoP74uuDX6O0tFTwDS7DMOq5fPky0tLSsHjxYnTu3BnvvvsuAgLaQaWq+IAquVwJPT0zWFl5wM2tF0JC1iEqKgfz5t3E4sVl2LDhLvbvv43sbOE3qQzD1E5YCMWBhVDDcbFonkuXLmHUqFHQ1tau9ImhCzcsrDNPDM0oyED4pHDoqtTf+2VmYYaoj6KQfSZb8A0vw4g5V65cQWpqKj7++GMMGjQIrVq1go1NI6hU+pBKZRVPHZg3gYdHMNzdg+HpGYKuXechPPwgYmN/xdKlZdi06S4OHOCVPoZhysNCKA4shBqOi0UzPHnyBGlpaQgODq54/41chvbB7ZFyIEXwAvg0e0/vRZuObdQeBy+VSeHZ0hOfLfsMPxfwtREMUxspLi7G0aNHsXfvXiQmJqJjx45o0+Yd+Pq2gYmJRYWfJ1KpDNraBjAxsYe9fQDeeWcCwsMP4aOPfkJc3D2sXHkf27bdwZEjv/KePoZhXhkWQnFgIdRwXCx128OHD7Fy5Uq4ublV2Ljp6uliwMgB2JezT/AC+PRY6NJNS2FjZ6N+75BSgY49O2L77u18bQTDVHNKS0uRkZGBZcuWITw8HB06dICTkzOMjEygUCgrPdZpaNgQnp790br1KHh6hqBz548xfPhuxMQUYdGiMqxffxd79txBRgaf3skwzNuFhVAcWAg1HBdL3XThwgVERERU+iJ5cytzjJ4xGifyTwheAs/ePIvMwkyMmTKmwrFQY1NjhEeGIyMrQ/BNM8NoavLz87Fjxw7MmTMHMTExmDp1KgID28LExAw2Nk2gVOpU8gAXHRgYWMHa2gvu7r3RocNHiIzMxNy5JViwoAyrV9/Djh13cOwYr/IxDFOzYSEUBxZCDcfFUnf88ccf2Lx5M9q1a1dhgyeRSODu646PEz+uMw+K2Ze1Dx17dVR/bYRUAic3J3yy6BNczL8o+GaaYepySkpKcO7cORw+fBgxMTHo1q0bmjVrBgsLK+joqNSOXD+NgYElzM2dYGjYEIGBEejZ81N07jwHISHJmDr1PBYsKENS0j1s315+rJP38jEMI2RYCMWBhVDDcbEI68mTJ8jOzkZ4eDgMDAwqbP50dHXQ/d3u+OLoF4IXwKfHQldsXQG35upHWHX1dNE5uDO27NqCoqIiwTfaDCN0SkpKkJWVhXXr1mHq1KkYOHAgAgIC0KKFD/z82sHa2qHSf/iRy5VQqUxgbt4EDg7vwNc3DN27f4IPPtiHmJgiLFxYhrVr72HnzvIrfLm5wm/4GIZhXhQWQnFgIdRwXCzCKCkpwcKFC+Hq6lrpptDGwQbjPh5Xp46Fjpo0qsKxUCNTI4SPC8fJUycF34AzTG3l6tWryMvLwzfffIOpU6di2LBhiIyMRNeuPaGvbwi5XFHpupZKZVCpTNG8eR8EBkbC3T0YvXsvRmTkSUyfno+4uHtYvrz8nXx7995Gejrv4WMYRrPDQigOLIQajoul9ty+fRtJSUlo27ZtpZtFHZUOuoZ0xZrUNXXmtRH7svYhsGOg+tE1qQTNfZvzWChTL1NQUICdO3di3rx5GDZsGDp06AA3N3c0aGD5/8c4K76KQSqVwdS0MRo3DoCxcSPY2HjDza0XAgPHoW/f5Rg9+hjmzSvF4sXlD2zZtYtX9xiGEUdYCMWBhVDDcbHUrLKyMmzYsAFdu3aFXC6v/N7Alu6YljANGYUZghfAp8dCl25+wdNCe3TE1l1beSyU0agUFxcjPT0d69atw/Tp0zFkyBAEBQWhZ89e6NatNxwcXCCXK6CtrXrBMU4tqFSmMDdvgsaNW8PLaxDefXcDxo3LxEcfXUBc3D0sXcqyxzAM83xYCMWBhVDDcbFUv6KiIqxYsQIdO3Z8YQm0cbTB+1HvY1fmLsEL4NOk/5yOyBmRUOmpb4qNTY3xYeSHSD+dLvjGnmH+nkuXLuH48eM4ePAgUlJS0L9/f7z//vsYMmQomjVrAR0dFWSyilf0yiOFgYEFnJzaw9W1K2xsvNG58xwMGpSMAQOSMGzYTsyc+fOzh7Rs2XIXX39dfozz7FnhN1kMwzCaEBZCcWAh1HBcLG/v8ePHOHv2LGJiYuDl5fWCzacEFjYWGDxmMDYf2VxnjoSevXkW245vg0+AD2Ry9Y2zk5sT4hbFIf/nfME3/ow4UlpaipycHKSmpiI1NRWrVq1C79694e/vD2fnpmjQwBIqlQHk8orv13t29FrHEDY2XrCzawVz8yawtw9As2b90bZtNPr2XYbw8IOYM+caFiwow8qV97F5c/k79779llf1GIZhqjsshOLAQqjhuFjeTElJCTZs2IAhQ4bA3Nz8hZtTy0aW6P9Bf6zbt65OlcCcohzMWzYP9o72auNV6avQc0BPvkSeqZaUlpaioKAAX3/9NZYvX46pU6ciNDQUHTt2hKenJ2xt7WBkZAItLR0YGzd46cNYlEodqFSmMDGxh41NCzRt2gUtWw5Dly4xiIxMx4wZlxAbexuLF5c/hfPLL+9i/35e0WMYhhEyLITiwEKo4bhYXs+dO3ewd+9eTJw4Ee7u7i8sgBKJBE7NnTB80nBsOb6lTpXAszfP4vD3h9FrUC8oFOobb0sbS4ybMg5ZuVmClwimbqakpARnzpzBzp07sWTJEkyZMgVhYWHo1q0bWrVqBScnZ3h7t4KPTxtYWdlBKpW99EqeXK6EtrYBDA2tYGHhisDACAQHL0L37rHo23cZoqNzMWfONcTF3cPixWVYs+Yetm69i337biMtjVfzGIZhNCEshOLAQqjhuFgqevLkCa5cuYJNmzYhPDwcLi4uLy2Aunq68O/kj+jYaHxz5hvBS9/zySvNQ9KOJDg6O6pfdZFJ4dvGF8tXL0dBYYHghYOpnRQXFyM7Oxu7du1CYmIiZs2ahVGjRmHAgAHo0KED2rdvj3ffHYoOHXpAT88QDRrYwNjYotKna/51BU8OpVIXlpau8PIaiBYtBsPBIRDdu8fi3XfXo2/f5Rg0KBkREWmIiSnGwoXlxzU3bryLnTvv4NCh28jM5JU8hmGY+hYWQnFgIdRwYl8sT548QXFxMfbs2YPZs2ejW7duLz0CKpFIIJPJ4NLCBUPHD8Xq3auRU5QjeOmrLBkFGRgzZUyFh8So9FUYPGwwDhw5gNLSUsELClP1XLp0Cenp6dixYweWL1+OmTNnIjw8HP3790dQUBC8vb0xcOBgdOkSjIYNG8HY2ByWlnZQqQxf+mdbIpFCqdT9/yOZHWFq2hju7sHo1GkmOnacjjZtxqJbt1gMHrwBY8d+izlzruLTT8uwdGn5Mc0tW8rvxzt69FdkZQm/EWEYhmGEDQuhOLAQ1gFJSUlo3LgxtLW14ePjg8zMzNf+XjEtlvv37+PUqVP4/PPPMXHiRHTp0uWV5U8ikUChUMDFywUh4SH4NPlTnPipbrws/kXZlb4LnXt3rvCEU3tHe8yKnYV/nP+H4IVGrLl8+TJ++OEHZGdnY9u2bYiNjUV0dDSGDRuGPn36ICgoCL6+vnBxcYGtrR08PVvC27v8CKZcroChoRkUCq1XljqZTAErKw84OwfB2toTjRq1RPv2E9Gly8fw8hqMwMBx6NZtPkJC1uHDDw/go4/OIzb2DhYtKr9yt379XWzffgdff30bx4//iuxs4TcVDMMwjOaFhVAcWAgFtmPHDiiVSiQnJyM/Px/R0dHQ09NDcXHxa31/fVosjx8/xs2bN3H69Gls3boVn3zyCUaOHImgoCBYWlq+svg9jaGJIbzf8caISSOQuCMRpy6fErzkvSo5xTn4dPWnsLRW/30qlAoEdQvCpm2bcO36NcELkaakpKQEFy5cwIkTJ7Br1y58/vnn+Prrr7F9+3ZMmTIFkydPxoIFCzBp0iQEBATA09MTTk7OsLGxg7m5BQwNjaGrqwelUhu6uvowNDSHUqn9Gn/+pJDJ5FAodKCtbQgbmxbw8hoID4/esLX1RceOMxEcvBDvvBOFdu0moXv3TzBoUDJGjTqIadN+RGzsHSQklCEx8T6Sk8vvuUtNLT+SefLkr8jJEX5zwDAMw4gnLITiwEIoMD8/P4wdO1btM1dXV8yYMeO1vr+uLpY///wTv/32G4qLi3HhwgVkZWXh8OHD+Oqrr5CUlISPP/4Yo0ePRt++fREQEAAHBwdoa7/Ohrvy8jckYgg+WfsJ9n23r849COZlOfrDUfR9ry90Vbpqvy9rO2tETIrQ+HcHlpSU4OrVqzh//jyysrJw/PhxHD9+HKdOncKhQ4eQmJiI7du3Y9u2bZg7dy5GjhyJ0NBQ9O7dG507d0ZgYCB8fX3h4dEMTk7O6NChC7p27Q0Xl2YwMTGHh0dLNGnSDFpaupDJ5JBKpa/9Z0cmk0NbW//Zw1OUSl3o6BhCT88MRkbWMDNz/P+rdJ3QufNsdO/+CXx9w9CnzxKMGLEHw4fvxrBhuzB+fAZmzbqMuLh7WLiwDCtW3MfatfewcWP5Vbq9e2/j8OHyp2Wy0DEMwzCaFBZCcWAhFNB//vMfyOVy7NmzR+3zqKgotGvX7rV+DaEWy48//gh9fX0oFArI5XLIZLIqbcarGqlMCl2VLsytzNGwUUNY2VjBztEODs4OcGzqWCEeXh4IaBcA7wBvODg7oGXrlvBv5w/X5q5wcHJAY6fGL4xXKy/4tfWDm6cbHF0c4dfWD35t/eDg7AD7JvYvTat3WqHVO63g2NQRLh4uaBXYCi1atYCdg12FGJsZqxcUuQxOrk7o2qMrFiYsxObNm7Fo0SJMmjQJkyZNwsSJEzFx4kRER0erJSEhARs3bsTixYsRFRWF5ORkrFu3DlFRUXj//fcRGhqKkJAQ9OvXD8HBwejWrRs6d+6MoKAgTJgwAVOmTEHPnj3RoUMHjBkzFiNGfAgXFzc4OTWFg4MT7OwcYGNjB0tLa5iZWcDY2AxmZhZo3twfLi7lLw83MbGApaU9DAxMq/XPgVQqg0wmh1yuBaVSF1ZW7nB2DoKtrTdMTe3h4zME/v4jYW8fAHv7ADRpEgRX1x7w8hoEf/8P0b79ZHTrNh/9+q3AuHGnMWXKeUydeg4ff3wd8fH38dln5ffPrVp1D8nJ97B5c3mJ27On/Krct9/+ilOnbiEvT/i/lBmGYRimtsNCKA4shAK6efMmJBIJsrKy1D6Pj49H06ZNK/2eR48e4eHDh89SUlIiyGI5d+5cjZU/prYihUplCkNDK2hr60NLSwUzM0eYmztDodCGQqEDpVIFLS09aGsbQEfHGCqVGfT1LWFq6gBPzxB4ew+FlVVzuLj0QOvW4+Hr+wEcHNrByakzXFx6wcNjALy8hsDH5wP4+UWgTZuJ6N49Ae+9txuhobsQHJyE4cOPYsyYXIwenYPIyHOYPPk6pk27iRkzbmL27FLMnVuK2NgSfPrpDSQkFGPp0iKsXFmENWuuY/36a9i8+Sq2bbuCnTsvY+/eQuzbxzAMwzBMdWT37gIWQhFgIRTQ00KYnZ2t9nlcXBxcXFwq/Z65c+dWurmv7cVy6dIl6OrqQipVQCqVl/9XpoBMpoRMrgW5XBtyhQ4UShV0dEyhZ2ABXV0z6KoawNjUAaZmTWFo2AhGJo1hauoEMzPnimngikZ2rdHIrjXMzF1g1bAFGtm1RkNrH5iZN31pLBt6opF9GzS0bQkzcxfYNPJHI/s2sLTygrm5q3oaqKehbSvYNQ6ElbU3zC08YNc4EHaN34G5hQfMG7hVSIMG7s9i1/gd2DV+BxZWzWHZ0Bt2jd+BrX0AGli4V4iVjS/adZqDyHGHMHPmd4iLK8Qnn/yMadNOYe7cHxEffxlz5/6AGTOyMWNGNmbO/O7/k4OZM3OfZf78C1iw4BpiY/Mxe/YZfPrpNSQklGDBgvL/Ll16F4mJD7Fq1e9Ytep3JCX9E2vW/BPr1v0Tn3/+T6Sk/BMbNvwTmzf/E1988RBffvkQ27c/xM6dD7F790Ps3fsA+/c/wMGDD3DkyAMcP/4AJ0/+hszM35Cd/Rtyc3/D99+X4fz5Mly8WIaffy7DlSsMwzAMw9SH/P77f2p1j/kUC2HtYSEU0JscGa0rVwiJiIiIiGoKC2HtYSEUmJ+fHyIiItQ+c3Nz0/iHyhARERERvSnucWsPC6HAnr52IiUlBfn5+Zg4cSL09PRQVFT0Wt/PxUJERERE9Q33uLWHhbAOSEpKgr29PbS0tODj44OMjIzX/l4uFiIiIiKqb7jHrT0shBqOi4WIiIiI6hvucWsPC6GG42IhIiIiovqGe9zaw0Ko4bhYiIiIiKi+4R639rAQajguFiIiIiKqb7jHrT0shBqOi4WIiIiI6hvucWsPC6GG42IhIiIiovqGe9zaw0Ko4bhYiIiIiKi+4R639rAQajguFiIiIiKqb7jHrT0shBqOi4WIiIiI6hvucWsPC6GG42IhIiIiovqGe9zaw0Ko4bhYiIiIiKi+4R639rAQargHDx5AIpGgpKQEDx8+ZBiGYRiGYRiNT0lJCSQSCR48eCD0drveYyHUcE8XC8MwDMMwDMPUt5SUlAi93a73WAg13OPHj1FSUoIHDx4I9i83vDopvnDuxRvOvXjDuRdnOO/ijdBz/+DBA5SUlODx48dCb7frPRZCemMPH/Jst1hx7sWLcy9enHtx4ryLF+dePFgI6Y3xB4V4ce7Fi3MvXpx7ceK8ixfnXjxYCOmN8QeFeHHuxYtzL16ce3HivIsX5148WAjpjT169Ahz587Fo0ePhB4K1TLOvXhx7sWLcy9OnHfx4tyLBwshERERERGRSLEQEhERERERiRQLIRERERERkUixEBIREREREYkUCyEREREREZFIsRDSSyUlJaFx48bQ1taGj48PMjMzX/r16enp8PHxgba2NhwcHLBmzZpaGilVt6rMfWpqKjp37gxzc3MYGBggICAAR44cqcXRUnWq6rp/6vTp05DL5fDy8qrhEVJNqOq8P3r0CLNmzYKdnR20tLTg6OiIlJSUWhotVaeqzv3WrVvh6ekJXV1dWFlZYcSIEbh3714tjZaqS0ZGBoKDg9GwYUNIJBLs3bv3ld/DfV79xEJIL7Rjxw4olUokJycjPz8f0dHR0NPTQ3FxcaVff+3aNahUKkRHRyM/Px/JyclQKpXYvXt3LY+c3lZV5z46OhoLFy7EmTNnUFhYiJkzZ0KpVOIf//hHLY+c3lZV5/6pBw8ewNHREV27dmUh1EBvMu99+vSBv78/jh8/juvXryM3NxdZWVm1OGqqDlWd+1OnTkEmk2HFihW4du0aTp06BQ8PD/Tr16+WR05v69ChQ5g9ezZSU1NfqxByn1d/sRDSC/n5+WHs2LFqn7m6umLGjBmVfv20adPg6uqq9tmYMWMQEBBQY2OkmlHVua+Mu7s75s+fX91Doxr2pnP/7rvvYs6cOZg7dy4LoQaq6rwfPnwYRkZGuH//fm0Mj2pQVed+0aJFcHR0VPssMTERtra2NTZGqnmvUwi5z6u/WAipUv/5z38gl8uxZ88etc+joqLQrl27Sr+nbdu2iIqKUvtsz549UCgU+O9//1tjY6Xq9SZz/7zHjx+jUaNGWLlyZU0MkWrIm879hg0b0LJlS/zv//4vC6EGepN5j4iIQKdOnTB9+nRYW1vD2dkZU6ZMwb/+9a/aGDJVkzeZ+6ysLGhpaeHgwYN48uQJfv31V7Rr1w5jxoypjSFTDXmdQsh9Xv3FQkiVunnzJiQSSYXjP/Hx8WjatGml3+Ps7Iz4+Hi1z7KysiCRSPDLL7/U2Fiper3J3D8vISEBpqamuH37dk0MkWrIm8x9YWEhLCwsUFBQAAAshBroTea9W7du0NbWRq9evZCbm4uDBw/C3t4eH3zwQW0MmarJm/6837VrF/T19aFQKCCRSNCnTx8WAg33OoWQ+7z6i4WQKvX0L4ns7Gy1z+Pi4uDi4lLp9zg7O+PTTz9V++z06dOQSCS4detWjY2VqtebzP3fbdu2DSqVCsePH6+pIVINqerc//nnn2jZsqXaQwVYCDXPm6z5Ll26QEdHBw8ePHj2WWpqKqRSKa8SapA3mfuffvoJDRs2REJCAs6fP48jR46gefPmGDlyZG0MmWrI6xZC7vPqJxZCqhSPjIrX2xwZ3bFjB3R1dXHgwIGaHCLVkKrO/W+//QaJRAK5XP4sUqn02WdpaWm1NXR6C2+y5ocNG4YmTZqofZafnw+JRILCwsIaGytVrzeZ+7CwMISEhKh9durUKV4l0nA8MipuLIT0Qn5+foiIiFD7zM3N7aUPlXFzc1P7bOzYsbzZWANVde6B8iuDOjo6r/XYaqq7qjL3jx8/xoULF9QSEREBFxcXXLhwAX/88UdtDZveUlXX/Lp166Crq4vff//92Wf79u2DTCbjFUINU9W5HzBgAAYPHqz2WXZ2NiQSCW7evFlj46Sa9boPleE+r35iIaQXevoo6pSUFOTn52PixInQ09NDUVERAGDGjBl4//33n33908cRT5o0Cfn5+UhJSeHjiDVUVed+27ZtUCgUSEpKwq1bt57l78fJSDNUde6fxyOjmqmq8/7777/D1tYWISEh+Omnn5CRkQFnZ2eEh4cL9VugN1TVud+4cSMUCgVWr16Nq1ev4vTp02jZsiX8/PyE+i3QG/r9999x7tw5nDt3DhKJBEuXLsW5c+eevXKE+zzxYCGkl0pKSoK9vT20tLTg4+ODjIyMZ/9v+PDhaN++vdrXp6enw9vbG1paWmjcuDFfWKrBqjL37du3h0QiqZDhw4fX/sDprVV13f8dC6Hmquq8X7p0CZ07d4auri5sbW0xefJkXh3UUFWd+8TERLi7u0NXVxcNGzbE0KFDUVpaWsujprd18uTJl/7dzX2eeLAQEhERERERiRQLIRERERERkUixEBIREREREYkUCyEREREREZFIsRASERERERGJFAshERERERGRSLEQEhERERERiRQLIRERERERkUixEBIREREREYkUCyEREREREZFIsRASERERERGJFAshERHRKzx+/Bjx8fFwcnKCtrY2LCwsEBYWJvSwiIiI3hoLIRER0SvExcXBw8MDJ06cQFFREU6fPo3169cLPSwiIqK3xkJIRET0Cm3btsW0adOEHgYREVG1YyEkIiJ6hUWLFkEmk6FLly5Ys2YN7t+/L/SQiIiIqgULIRER0WsoKCjAwoUL4e7uDhMTE1y7dk3oIREREb01FkIiIqIqePToEbS1tXHgwAGhh0JERPTWWAiJiIheYuHChdi0aRN++ukn/Pzzz5g6dSqsrKxQVlYm9NCIiIjeGgshERHRS8yfPx9NmzaFjo4OzM3N0bdvX+Tn5ws9LCIiomrBQkhERERERCRSLIREREREREQixUJIREREREQkUiyEREREREREIsVCSEREREREJFIshERERERERCLFQkhERERERCRSLIREREREREQixUJIREREREQkUiyEREREREREIsVCSEREREREJFIshERERERERCLFQkhERERERCRSLIREREREREQixUJIREREREQkUv8HdRjeP6GQ1GAAAAAASUVORK5CYII=\" width=\"900\">" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(1,1,figsize=(9, 5))\n", - "plot_work(ax, t_arr, s_t, Eps_arr, Sig_arr)\n", - "plot_dissipation(ax, t_arr, s_t, Eps_arr, Sig_arr)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Cyclic loading" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "scrolled": false, - "slideshow": { - "slide_type": "fragment" - } - }, - "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 = $('<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", - " 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", - " '<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 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 = $('<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 * 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 = $('<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'] / 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 / mpl.ratio, fig.canvas.height / mpl.ratio);\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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(\"<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", - " 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('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\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'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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", - " // 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<ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code'){\n", - " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] == html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "}\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel != null) {\n", - " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", - "}\n" - ], - "text/plain": [ - "<IPython.core.display.Javascript object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "<img src=\"data:image/png;base64,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Y1NrO3TokNxDMSkY50k2NjY1N86RVBPOk2xsbGpunCdNgwGvBGVlZTh06BAyMzMN/heL1NRUCCGQmpoq+7+eKLHlADDHAAANcElEQVTx+vAa8foo+xplZmbi0KFDKCsrk3soJgWTOk+q5edXLeeppnPleVpXk3qenCNJX5wneZ48T+trajnPBzlXzpOmxYDXzK5fvw4hBK5fvy53KYrE61MzXqPq8frUjNeIlEotfVMt5wmo51x5ntZFLedJlkctfZPnaV14ntZHTedqSRjwmhl/EKrH61MzXqPq8frUjNeIlEotfVMt5wmo51x5ntZFLedJlkctfZPnaV14ntZHTedqSRjwmhl/EKrH61MzXqPq8frUjNeIlEotfVMt5wmo51x5ntZFLedJlkctfZPnaV14ntZHTedqSRjwmllxcTGCgoJQXFwsdymKxOtTM16j6vH61IzXiJRKLX1TLecJqOdceZ7WRS3nSZZHLX2T52ldeJ7WR03nakkY8BIRERERERERERFZKAa8RERERERERERERBaKAS8RERERERERERGRhWLAS0RERERERERERGShGPDK5OzZs3j//ffRrFkz1KlTBy1atMCUKVNQUlIid2mKERISgm7dusHR0RFubm5yl6MICxcuRLNmzeDg4IDOnTtj7969cpekKDExMfDz84O7uzuEENiwYYPcJSnKtGnT0LVrV9StWxf169dHv379kJ6eLndZpDKGjmN79uxB586d4eDggObNm2PRokVmqvTBGHKe69atQ69evVCvXj24uLjg6aefRnR0tBmrlU7qvLR//37UqlULnTp1MnGFxmHoeRYXF2PixIlo2rQp7O3t0aJFC4SHh5up2gdj6LmuWLECHTt2hKOjIxo1aoShQ4fi2rVrZqrWcFJ+V7DUcYgsE+fJe3GeVD61zJPWPkcCnCctGQNemfz5558YOnQotm7dijNnzmDTpk1o0KABxo8fL3dpijFlyhTMmTMH48aNY8ALIDIyEnZ2dggLC0NqaioCAgLg7OyMzMxMuUtTjC1btmDSpElYt24dA94q9OnTBxERETh27BiSk5PxyiuvoGnTprh586bcpZFKGDqOZWRkwMnJCQEBAUhNTUVYWBjs7Oywdu1aM1duGEPPMyAgADNnzsShQ4dw8uRJfPHFF7Czs0NiYqKZKzeM1HmpoKAALVq0QO/e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ERERERGRhWLAS0RERERERERERGShGPASERERERERERERWSgGvEREREREREREREQWigEvERERERERERERkYViwEtERERERERERERkoRjwEhEREREREREREVkoBrxEREREZDUCAgLQr18/ucsgIiJSHM6RRNaLAS8RERERWY1nnnkGoaGhcpdBRESkOJwjiawXA14iC1FRUYHQ0FC0bNkSDg4OaNCgAQYPHix3WURERIpQWloKOzs7CCG0zdvbW+6yiIiIZMc5ksj6MeAlshAhISFo164ddu3ahXPnzmH//v1YsmSJ3GUREREpQkVFBQ4ePAghBJKTk5GTk4P8/Hy5yyIiIpId50gi68eAl8hCPPfcc/j888/lLoOIiEixNmzYgEceeUTuMoiIiBSHcySRdWPAS2QhZs+eDVtbW7z44otYtGgRcnNz5S6JiIhIUaZMmYKePXvKXQYREZHicI4ksm4MeIksyIkTJzBz5ky0bdsWDz30EDIyMuQuiYiISDH69u2LsWPHyl0GERGR4nCOJLJuDHiJLFBxcTEcHBwQFRUldylERESK0bx5c0RERMhdBhERkeJwjiSybgx4iSzAzJkz8fPPP+P48eNIT0/Hp59+ikaNGiEvL0/u0oiIiBTDw8MDY8eORVZWFgoKCuQuh4iISDE4RxJZNwa8RBZg6tSpaNWqFerUqYN69eqhX79+SE1NlbssIiIiRfnll1/w6KOPQgiBcePGyV0OERGRYnCOJLJuDHiJiIiIiIiIiIiILBQDXiIiIiIiIiIiIiILxYCXiIiIiIiIiIiIyEIx4CUiIiIiIiIiIiKyUAx4iYiIiIiIiIiIiCwUA14iIiIiIiIiIiIiC8WAl4iIiIiIiIiIiMhCMeAlIiIiIiIiIiIislAMeImIiIiIiIiIiIgsFANeIiIiIiIiIiIiIgvFgJeIiIiIiIiIiIjIQjHgJSIiIiIiIiIiIrJQDHiJiIiIiIiIiIiILBQDXiIiIiIiIiIiIiILxYCXiIiIiIiIiIiIyEIx4CUiIiIiIiIiIiKyUAx4iYiIiIiIiIiIiCwUA14iIiIiIiIiIiIiC/V/VycMC91E5FEAAAAASUVORK5CYII=\" width=\"1400\">" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ((ax1,ax2,ax3)) = plt.subplots(1,3,figsize=(14,4), tight_layout=True)\n", - "ax11,ax22,ax33 = ax1.twinx(), ax2.twinx(), ax3.twinx()\n", - "t_arr, s_t, Eps_arr, Sig_arr, iter_arr = get_response(\n", - " margs, s_max=2, n_steps=20000, k_max=20, get_load_fn=get_load_fn\n", - ")\n", - "plot_Sig_Eps(t_arr, s_t, Sig_arr, Eps_arr, iter_arr, ax1, ax11, ax2, ax22, ax3, ax33);" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "scrolled": false, - "slideshow": { - "slide_type": "subslide" - } - }, - "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 = $('<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", - " 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", - " '<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 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 = $('<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 * 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 = $('<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'] / 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 / mpl.ratio, fig.canvas.height / mpl.ratio);\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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(\"<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", - " 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('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\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'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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", - " // 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<ncells; i++) {\n", - " var cell = cells[i];\n", - " if (cell.cell_type === 'code'){\n", - " for (var j=0; j<cell.output_area.outputs.length; j++) {\n", - " var data = cell.output_area.outputs[j];\n", - " if (data.data) {\n", - " // IPython >= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] == html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "}\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel != null) {\n", - " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", - "}\n" - ], - "text/plain": [ - "<IPython.core.display.Javascript object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "<img src=\"data:image/png;base64,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M8POnTvL6hCpjBT13P/111+oV6+e3osKcBDKT3Gu+bZt28LExAT37t0TP5acnAyVSsVHCWWkOOf+9OnTcHFxwSeffILjx49j27ZtCAoKwoABAwxxyFRGXnUQ8j6vYuIgpELxKaPKVZKnjK5evRqmpqbYtGlTWR4ilZGinvtffvkFgiBAo9GIqVQq8WO7d+821KFTCRTnmu/bty98fHz0PpabmwtBEHD+/PkyO1YqXcU592FhYejRo4fexw4cOMBHiWSOTxlVNg5C+lchISEYMmSI3scCAgJe+qIyAQEBeh+Ljo7mDxvLUFHPPfDkkUETE5NXetlqKr+Kcu4fP36MkydP6jVkyBD4+/vj5MmT+O233wx12FRCRb3mv/zyS5iamuLBgwfix9avXw+1Ws1HCGWmqOe+e/fueOutt/Q+lpGRAUEQcP369TI7Tipbr/qiMrzPq5g4COlf/f1S1EuWLEFubi6GDx8Oc3NzXL16FQAwZswYhIeHi7/+75cjHjFiBHJzc7FkyRK+HLFMFfXcr1y5ElqtFomJifjpp5/Enn86GclDUc/9P/Epo/JU1PP+4MEDuLm5oUePHjh9+jRSU1Ph6+uLyMhIqb4EKqainvukpCRotVosWLAAly5dQlpaGurVq4eQkBCpvgQqpgcPHuDo0aM4evQoBEHA7NmzcfToUfEtR3ifpxwchPRSiYmJ8PDwgLGxMYKDg5Gamir+f/369UPz5s31fv2+fftQp04dGBsbw9PTk29YKmNFOffNmzeHIAgv1K9fP8MfOJVYUa/753EQyldRz/uZM2fQpk0bmJqaws3NDe+99x4fHZSpop77efPmITAwEKampnBxcUGfPn2Qn59v4KOmktq7d+9L/93N+zzl4CAkIiIiIiJSKA5CIiIiIiIiheIgJCIiIiIiUigOQiIiIiIiIoXiICQiIiIiIlIoDkIiIiIiIiKF4iAkIiIiIiJSKA5CIiIiIiIiheIgJCIiIiIiUigOQiIiIiIiIoXiICQiIiIiIlIoDkIiIqL/4fHjx5g6dSqqVq0KnU4HR0dHhIWFSX1YREREJcZBSERE9D/Ex8ejevXq2LNnD65evYq0tDQsXrxY6sMiIiIqMQ5CIiKi/6Fp06b44IMPpD4MIiKiUsdBSERE9D98+umnUKvVaNu2LRYuXIg7d+5IfUhERESlgoOQiIjoFZw7dw4zZ85EYGAgbGxscPnyZakPiYiIqMQ4CImIiIrg4cOH0Ol02LRpk9SHQkREVGIchERERC8xc+ZMLFu2DKdPn8bZs2fx/vvvw9nZGXfv3pX60IiIiEqMg5CIiOglJk2aBD8/P5iYmMDe3h5vvPEGcnNzpT4sIiKiUsFBSEREREREpFAchERERERERArFQUhERERERKRQHIREREREREQKxUFIRERERESkUByERERERERECsVBSEREREREpFAchERERERERArFQUhERERERKRQHIREREREREQKxUFIRERERESkUByERERERERECsVBSEREREREpFAchERERERERArFQUhERERERKRQ/w8Iajup3wqCIAAAAABJRU5ErkJggg==\" width=\"900\">" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(1,1,figsize=(9, 5))\n", - "plot_work(ax, t_arr, s_t, Eps_arr, Sig_arr)\n", - "plot_dissipation(ax, t_arr, s_t, Eps_arr, Sig_arr)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "hide_input": false, - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Interactive application" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "hide_input": true, - "scrolled": false, - "slideshow": { - "slide_type": "fragment" - } - }, - "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 = $('<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", - " 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", - " '<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 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 = $('<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 * 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 = $('<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'] / 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 / mpl.ratio, fig.canvas.height / mpl.ratio);\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\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\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(\"<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", - " 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('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\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'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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", - " // 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<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,iVBORw0KGgoAAAANSUhEUgAABXgAAAGQCAYAAAAUUwjLAAAgAElEQVR4nOzdaXgUVdYH8JN9JewiawLIKoIigzgiKIK4oDi+igsKqKiAILw6oyijaVYFRRZFBEREURjZRRGFEZBFFjUg0OxLgBARIoRAFpLu//uh3lQTCKG6u7pvdff/9zz1pem6dcK5OTc5XbklICIiIiIiIiIiIqKAJKoDICIiIiIiIiIiIiLPsMFLREREREREREREFKDY4CUiIiIiIiIiIiIKUGzwEhEREREREREREQUoNniJiIiIiIiIiIiIAhQbvEREREREREREREQBig1eIiIiIiIiIiIiogDFBi8RERERERERERFRgGKDl4iIiIiIiIiIiChAscFLREREREREREREFKDY4CUiIiIiIiIiIiIKUGzwEhEREREREREREQUoNniJiIiIiIiIiIiIAhQbvEREREREREREREQBig1eIiIiIiIiIiIiogDFBi8REQWN1atXo0uXLqhevTpEBAsXLrziOatWrULLli0RExODunXrYvLkyX6IlIiIiIiIiMgcbPASEVHQWLp0KYYMGYL58+cbavAeOHAA8fHxGDhwIOx2O6ZNm4aoqCjMmzfPTxETEREREREReYcNXiIiCkpGGryvvPIKGjduXOK1559/Hm3atPFlaERERGQxo0aNQqtWrZCYmIiqVauia9eu2LVrl+qwiIjIZMFa79ngJSKioGSkwXvrrbfixRdfLPHaggULEBkZifPnz/syPCIiIrKQzp07Y8aMGdi+fTu2bNmCe++9F3Xq1MHZs2dVh0ZERCYK1nrPBq8BhYWF2LRpE9LT03HkyBEePHjw4OGnIz09HWvWrEFWVhays7P1Iz8//4q120iDt0GDBhg5cmSJ19atWwcRwbFjx7xaO4IZ10UePHjwUHOkp6dj06ZNKCwsVL0UBL0///wTIoLVq1cbej/XRh48ePBQc3i7Nrpb762KDV4DNm3aBBHhwYMHDx4WOVJTU69Yu0WMNXhHjRpV4rW1a9dCRJCZmenN0hHUuC7y4MGDh9pj06ZNqpeCoLd3716ICLZt22bo/VwbefDgwUPt4ena6G69tyo2eA1IT0/XJ4vqTyZ48ODBI5SO4l+Wtm/f7pM7eLlFg2e4LvLgwYOHmqN4XUxPT1e9FAQ1p9OJ++67D23btr3se/Lz80v8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vDn8/f0RExODlJQU5d+GDh2KXr16OTz+l19+wc033wx/f39ER0djzpw5Lq+JHOnx/wG9HZPejgfQ3zHp7XgA/R2T3o6H3EuP60Vvx6S34wH0d0x6Ox5Af8ekt+PREga8HlBSUoLY2FhNnsLtKfwa8GtwCb8O/BoA/Br4Oj32X2/HpLfjAfR3THo7HkB/x6S34yH30uN60dsx6e14AP0dk96OB9DfMenteLSEAS8RERERERERERGRl2LAS0REREREREREROSlGPASEREREREREREReSkGvEREREREREREREReigGvhz344INo2rQpAgIC0KBBAzz99NPIyckRXZbHHDlyBM899xyio6MRGBiIli1bYuLEiSgtLRVdmkfFx8eje/fuCAoKQnh4uOhyPCYxMRHR0dEICAhATEwMNm/eLLokj0pJScEDDzyAhg0bQpIkfPvtt6JL8ripU6eiS5cuCA0NRWRkJAYOHIh9+/aJLos8zFtngZr1a7fbERsbi4YNGyIwMBC9evVCZmamoIqdM3XqVEiShNGjRyv3eePxZGdn46mnnkLdunURFBSETp064ffff1f+3ZuOyWq14s0331S+b2rRogUmTZoEm82mPEbrx3OtvU9N/SUlJRg5ciQiIiIQHByMBx98EMeOHfPkYSiudjxlZWUYN24cbrzxRgQHB6Nhw4YYMmTIFd/ra+l4SDu4N2oT90bt4d4o09Jewr1RGxjwetjMmTOxfft2HD16FFu3bkX37t3RvXt30WV5zI8//ohnn30Wa9euxV9//YVVq1YhKioKY8eOFV2aR02cOBEzZ87Ea6+95jMBb1JSEsxmM+bPnw+LxYLRo0cjJCQEWVlZokvzmOTkZLz55ptYsWKFzwa8ffv2xaJFi5CZmYldu3ahf//+aNasGS5cuCC6NPIQb54Fatbv9OnTERYWhhUrViAjIwOPP/44GjZsiPPnzwus/NpSU1MRHR2Njh07OvwQ623Hc+bMGTRv3hzPPvssduzYgSNHjmD9+vU4dOiQ8hhvOqb4+HhERERgzZo1OHLkCJYtW4bQ0FDMmjVLeYzWj+dae5+a+ocPH47GjRtj3bp1+OOPP3DXXXehU6dOKC8v9/ThXPV4zp07h3vuuQdLly7Fvn37sH37dtx6663o3Lmzw2to6XhIG7g3ahP3Rm0eE/dGmZb2Eu6N2sCAV7BV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\" width=\"1400\">" - ], - "text/plain": [ - "<IPython.core.display.HTML object>" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "3a62cf0387304a1ead559bc095e64dcc", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(FloatSlider(value=0.0, continuous_update=False, description='s1', max=4.0, min=-4.0), Ou…" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "aa6037de0b35435e9aea0559417df4d6", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "interactive(children=(FloatSlider(value=50.0, continuous_update=False, description='E_b', min=0.5, step=4.975)…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "def init():\n", - " global Eps_record, Sig_record, iter_record, t_arr, s_t, s0, t0, Eps_n\n", - " s0 = 0\n", - " t0 = 0\n", - " Sig_record = []\n", - " Eps_record = []\n", - " iter_record = []\n", - " t_arr = []\n", - " s_t = []\n", - " Eps_n = np.zeros((len(Eps),), dtype=np.float_)\n", - " \n", - "def get_response_i(s1, margs, n_steps = 60, k_max=20):\n", - " global Eps_record, Sig_record, iter_record, t_arr, s_t, s0, t0, Eps_n\n", - " Eps_k = np.copy(Eps_n)\n", - " t1 = t0+n_steps+1\n", - " ti_arr = np.linspace(t0, t1, n_steps+1 )\n", - " si_t = np.linspace(s0,s1,n_steps+1)\n", - " for s_n1 in si_t:\n", - " lam_k = 0\n", - " f_k, df_k, Sig_k = get_f_df(s_n1, Eps_k, *margs)\n", - " f_k_norm = np.linalg.norm(f_k)\n", - " f_k_trial = f_k[-1]\n", - " k = 0\n", - " while k < k_max:\n", - " if f_k_trial < 0 or f_k_norm < 1e-6:\n", - " Eps_n[...] = Eps_k[...]\n", - " Sig_record.append(Sig_k)\n", - " Eps_record.append(np.copy(Eps_k))\n", - " iter_record.append(k+1)\n", - " break\n", - " dlam = np.linalg.solve(df_k, -f_k)\n", - " lam_k += dlam\n", - " Eps_k = get_Eps_k1(s_n1, Eps_n, lam_k, Eps_k, *margs)\n", - " f_k, df_k, Sig_k = get_f_df(s_n1, Eps_k, *margs)\n", - " f_k_norm = np.linalg.norm(f_k)\n", - " k += 1\n", - " else:\n", - " print('no convergence')\n", - " t_arr = np.hstack([t_arr, ti_arr])\n", - " s_t = np.hstack([s_t, si_t])\n", - " t0 = t1\n", - " s0 = s1\n", - " return\n", - "\n", - "import ipywidgets as ipw\n", - "fig, ((ax1,ax2,ax3)) = plt.subplots(1,3,figsize=(14,4), tight_layout=True)\n", - "ax11 = ax1.twinx()\n", - "ax22 = ax2.twinx()\n", - "ax33 = ax3.twinx()\n", - "axes = ax1, ax11, ax2, ax22, ax3, ax33\n", - "axes = ax1, None, ax2, ax22, ax3, ax33\n", - "def update(s1):\n", - " global Eps_record, Sig_record, iter_record, t_arr, s_t, s0, t0, Eps_n, axes\n", - " global margs\n", - " get_response_i(s1, margs)\n", - " Sig_arr = np.array(Sig_record, dtype=np.float_)\n", - " Eps_arr = np.array(Eps_record, dtype=np.float_)\n", - " iter_arr = np.array(iter_record,dtype=np.int_)\n", - " for ax in axes:\n", - " if ax:\n", - " ax.clear()\n", - " plot_Sig_Eps(t_arr, s_t, Sig_arr, Eps_arr, iter_arr, *axes)\n", - " \n", - "init()\n", - "\n", - "s1_slider = ipw.FloatSlider(value=0,min=-4, max=+4, step=0.1,\n", - " continuous_update=False)\n", - "\n", - "ipw.interact(update, s1 = s1_slider);\n", - "\n", - "def reset(**material_params):\n", - " global margs\n", - " init()\n", - " s1_slider.value = 0\n", - " margs = [material_params[name] for name in py_vars]\n", - "\n", - "n_steps = 20\n", - "margs_sliders = {\n", - " name : ipw.FloatSlider(description=name, value=val, \n", - " min=minval, max=maxval, step=(maxval-minval) / n_steps,\n", - " continuous_update=False)\n", - " for name, val, minval, maxval in [('E_b', 50, 0.5, 100),\n", - " ('gamma', 1, -20, 20),\n", - " ('K', 1, -20, 20),\n", - " ('tau_bar', 1, 0.5, 20)]\n", - "}\n", - "\n", - "ipw.interact(reset, **margs_sliders);" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "celltoolbar": "Slideshow", - "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.7.6" - }, - "toc": { - "base_numbering": 1, - "nav_menu": {}, - "number_sections": true, - "sideBar": true, - "skip_h1_title": false, - "title_cell": "Table of Contents", - "title_sidebar": "Contents", - "toc_cell": false, - "toc_position": { - "height": "calc(100% - 180px)", - "left": "10px", - "top": "150px", - "width": "165px" - }, - "toc_section_display": true, - "toc_window_display": false - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/index.ipynb b/index.ipynb index a09134c..b65e85b 100644 --- a/index.ipynb +++ b/index.ipynb @@ -22,8 +22,26 @@ "## Nonlinear bond-slip law\n", "- [J0301 - Pull-out with softening and hardening](bmcs_course/3_1_PO_LF_LM_EL_FE_CB.ipynb) \n", "- [J0302 - EXTRA - Newton iterative scheme](extras/newton_method.ipynb)\n", - "- [J0303 - EXTRA - Nonlinear finite-element solver for 1d pullout](extras/pullout1d.ipynb)" + "- [J0303 - EXTRA - Nonlinear finite-element solver for 1d pullout](extras/pullout1d.ipynb)\n", + "\n", + "## Unloading, reloading and inelasticity\n", + "\n", + "- [J0401 - Unloading with multi-linear bond-slip law](bmcs_course/4_1_PO_multilinear_unloading.ipynb) (PO_BS_ML)\n", + "\n", + "### Plasticity\n", + "- [J0402 - Plasticity framework](bmcs_course/4_2_BS_EP_SH_IK_analytical.ipynb) (BS_EP_SH_IK_A)\n", + "- [J0403 - Iterative numerical simulation](bmcs_course/4_3_BS_EP_SH_IK_numerical.ipynb) (BS_EP_SH_IK_N)\n", + "\n", + "### Damage\n", + "- [J0404 - Damage framework](bmcs_course)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { -- GitLab