{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "ModelicaRes Advanced Topics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This IPython notebook demonstrates some of the advanced features and use cases of [ModelicaRes](http://kdavies4.github.io/ModelicaRes)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Table of contents:**\n", "- [Sankey diagrams](#Sankey-diagrams)\n", "- [Testing simulations based on criteria](#Testing-simulations-based-on-criteria)\n", "- [Indexing lists of simulations](#Indexing-lists-of-simulations)\n", "- [Speed considerations](#Speed-considerations)\n", "- [Contributing](#Contributing)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, we'll load the [ModelicaRes](http://kdavies4.github.io/ModelicaRes) classes we'll need:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from modelicares import SimRes, SimResList" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "and some standard modules and settings for this IPython notebook:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from pandas import DataFrame\n", "%matplotlib inline\n", "%precision 3" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 2, "text": [ "u'%.3f'" ] } ], "prompt_number": 2 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Sankey diagrams" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[SimRes](http://kdavies4.github.io/ModelicaRes/simres.html#modelicares.simres.SimRes) has a built-in method ([sankey](http://kdavies4.github.io/ModelicaRes/simres.html#modelicares.simres.SimRes.sankey)) to produce Sankey diagrams. We'll plot subfigures with the Sankey diagrams of [ThreeTanks](https://build.openmodelica.org/Documentation/Modelica.Fluid.Examples.Tanks.ThreeTanks.html) at several times over the simulation:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "sim = SimRes('ThreeTanks.mat')\n", "sankeys = sim.sankey(title=\"Sankey Diagrams of Modelica.Fluid.Examples.Tanks.ThreeTanks\",\n", " times=[0, 50, 100, 150], n_rows=2, format='%.1f ',\n", " names=['tank1.ports[1].m_flow', 'tank2.ports[1].m_flow',\n", " 'tank3.ports[1].m_flow'],\n", " labels=['Tank 1', 'Tank 2', 'Tank 3'],\n", " orientations=[-1, 0, 1],\n", " scale=0.1, margin=6, offset=1.5,\n", " pathlengths=2, trunklength=10)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Unfortunately, the formatting arguments (`scale`, `margin`, `offset`, `pathlengths`, and `trunklength`) usually require manual adjustment." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Testing simulations based on criteria" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As demonstrated in the tutorial, [ModelicaRes](http://kdavies4.github.io/ModelicaRes) has a special class for lists of simulation results. We'll use it to load a group of files by wildcard: " ] }, { "cell_type": "code", "collapsed": false, "input": [ "sims = SimResList('*', '*/*/*')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see which simulations are in the list:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print(sims)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "List of simulation results (SimRes instances) from the following files\n", "in the /media/kld/Storage/Documents/Python/ModelicaRes/examples directory:\n", " ChuaCircuit/2/dsres.mat\n", " ThreeTanks.mat\n", " ChuaCircuit/1/dsres.mat\n", " ChuaCircuit.mat\n" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The directory contained some linearization results, but they were excluded automatically." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's see which variables are available:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "sims.names()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ "['Time']" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Only time is available! [names](http://kdavies4.github.io/ModelicaRes/simres.html#modelicares.simres.SimResList.names)() only returns the variables that the simulations have in common, and there are no others. We'll address that by filtering the list of simulations. To do so, we'll first introduce the concept of a test condition. We'll create a test that checks if a simulation has a variable named \"L.L\" (indicating that an inductor \"L\" is at the base of the model):" ] }, { "cell_type": "code", "collapsed": false, "input": [ "has_inductor = lambda sim: 'L.L' in sim" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see if each simulation passes the test:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "[has_inductor(sim) for sim in sims]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 8, "text": [ "[True, False, True, True]" ] } ], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "There's actually another way to access the same information: [unique_names](http://kdavies4.github.io/ModelicaRes/simres.html#modelicares.simres.SimResList.unique_names)(). It returns a dictionary of the variable names that aren't in all of the simulations. The value of each entry is a Boolean list indicating if the variable is in each simulation. For example, we can do:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "sims.unique_names()['L.L']" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 9, "text": [ "[True, False, True, True]" ] } ], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Anyway, let's go ahead and filter our simulation list to those that have the inductor: " ] }, { "cell_type": "code", "collapsed": false, "input": [ "sims = SimResList(filter(has_inductor, sims))\n", "print(sims)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "List of simulation results (SimRes instances) from the following files\n", "in the /media/kld/Storage/Documents/Python/ModelicaRes/examples directory:\n", " ChuaCircuit/2/dsres.mat\n", " ChuaCircuit/1/dsres.mat\n", " ChuaCircuit.mat\n" ] } ], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The [ThreeTanks](https://build.openmodelica.org/Documentation/Modelica.Fluid.Examples.Tanks.ThreeTanks.html) example has been removed. Now the [names](http://kdavies4.github.io/ModelicaRes/simres.html#modelicares.simres.SimResList.names) method returns so many variables that we'll use a pattern to limit it:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "sims.names('L*v')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 11, "text": [ "[u'L.p.v', u'L.v', u'L.n.v']" ] } ], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this case, we could have excluded the [ThreeTanks](https://build.openmodelica.org/Documentation/Modelica.Fluid.Examples.Tanks.ThreeTanks.html) example in the first place, but there may be situations where we have a directory of simulation results that we need to sort. We could have also used a test condition that looks at the values of constants, e.g., " ] }, { "cell_type": "code", "collapsed": false, "input": [ "has_small_inductance = lambda sim: 'L.L' in sim and sim['L.L'].value() < 14" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": {}, "source": [ "This idea isn't limited to Boolean test functions. We could just as easily map a cost function to a list of simulations." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Indexing lists of simulations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As mentioned in the [tutorial](http://nbviewer.ipython.org/github/kdavies4/ModelicaRes/blob/release/examples/advanced.ipynb), the get item method can be used on a [SimResList](http://kdavies4.github.io/ModelicaRes/simres.html#modelicares.simres.SimResList) of simulations to retrieve an attribute across all of the simulations, e.g., " ] }, { "cell_type": "code", "collapsed": false, "input": [ "sims['L.L'].value()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 13, "text": [ "[10.0, 18.0, 18.0]" ] } ], "prompt_number": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "However, the method is overloaded so that it can still be used to index a simulation from the list of simulations:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "sims[0]['L.L'].value()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 14, "text": [ "10.0" ] } ], "prompt_number": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this case, the first index was for the simulation result (a [SimRes](http://kdavies4.github.io/ModelicaRes/simres.html#modelicares.simres.SimRes) instance) and the second was for the variable within the result." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The [in operator](https://docs.python.org/2/library/operator.html#operator.__contains__) is also overloaded. It can be used to check if a variable is in all of the simulations:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "'L.L' in sims" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 15, "text": [ "True" ] } ], "prompt_number": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "or if a simulation is in the list of simulations:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "sims[0] in sims" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 16, "text": [ "True" ] } ], "prompt_number": 16 }, { "cell_type": "markdown", "metadata": {}, "source": [ "However, it is not appropriate to overload some Python [list methods](https://docs.python.org/2/tutorial/datastructures.html) in this context. Those that are not overloaded (e.g.,\n", "[insert](https://docs.python.org/2/tutorial/datastructures.html),\n", "[remove](https://docs.python.org/2/tutorial/datastructures.html),\n", "[pop](https://docs.python.org/2/tutorial/datastructures.html),\n", "[index](https://docs.python.org/2/tutorial/datastructures.html), and\n", "[count](https://docs.python.org/2/tutorial/datastructures.html)) only accept integer indices or the actual list elements ([SimRes](http://kdavies4.github.io/ModelicaRes/simres.html#modelicares.simres.SimRes) instances) as applicable, not variable names." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is possible to use slices to extract a [SimResList](http://kdavies4.github.io/ModelicaRes/simres.html#modelicares.simres.SimResList) with selected simulations:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print(sims[:2])" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[SimRes('/media/kld/Storage/Documents/Python/ModelicaRes/examples/ChuaCircuit/2/dsres.mat'), SimRes('/media/kld/Storage/Documents/Python/ModelicaRes/examples/ChuaCircuit/1/dsres.mat')]\n" ] } ], "prompt_number": 17 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Compare this to the last `print(sims)` in the [previous section](#Testing-simulations-based-on-criteria)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the call method is not available for a list of simulations (only for a single simulation; see [\\_\\_call\\_\\_](http://kdavies4.github.io/ModelicaRes/simres.html#modelicares.simres.SimRes.__call__)). The return value would be too confusing. However, it's possible to retrieve information from multiple variables manually, e.g.," ] }, { "cell_type": "code", "collapsed": false, "input": [ "{\"Final value of \" + name: sims[name].FV() for name in ['C1.v', 'C2.v', 'L.v']}" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 18, "text": [ "{'Final value of C1.v': [2.2080979, 2.4209836, 2.4209836],\n", " 'Final value of C2.v': [0.0014105374, -0.22792035, -0.22792035],\n", " 'Final value of L.v': [-0.012604702, -0.25352862, -0.25352862]}" ] } ], "prompt_number": 18 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we iterated over the variables. For a single simulation we could do this automatically:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "sims[0](['C1.v', 'C2.v', 'L.v']).FV()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 19, "text": [ "[2.2080979, 0.0014105374, -0.012604702]" ] } ], "prompt_number": 19 }, { "cell_type": "markdown", "metadata": {}, "source": [ "where these values form the first \"column\" of the previous dictionary." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Speed considerations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the [tutorial](http://nbviewer.ipython.org/github/kdavies4/ModelicaRes/blob/release/examples/advanced.ipynb), we saw two ways to access variables: the get item method (square brackets) and the call method (parentheses). The get item method allows access to only one variable at a time but is a little faster:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "sim = SimRes('ChuaCircuit.mat')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 20 }, { "cell_type": "code", "collapsed": false, "input": [ "timeit sim['L.i'].values()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1000000 loops, best of 3: 1.33 \u00b5s per loop\n" ] } ], "prompt_number": 21 }, { "cell_type": "code", "collapsed": false, "input": [ "timeit sim('L.i').values()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1000000 loops, best of 3: 1.58 \u00b5s per loop\n" ] } ], "prompt_number": 22 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Both of these approaches consist of two steps: accessing the variable (`sim['L.i']` or `sim('L.i')`) and reading the values. The first step takes almost as much time as the second, but it only needs to be performed once. If we need to access a variable or a group of variables multiple times (to get their values, units, times, etc.), it's best to assign a variable to the entry or entries:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "Li = sim['L.i']" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 23 }, { "cell_type": "markdown", "metadata": {}, "source": [ "With the first step out of the way, we can now retrieve information more quickly:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "timeit Li.values()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1000000 loops, best of 3: 712 ns per loop\n" ] } ], "prompt_number": 24 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The same holds for the call method. We'll access the voltages of all of the components in the [ChuaCircuit](http://reference.wolfram.com/system-modeler/libraries/Modelica/Modelica_Electrical_Analog_Examples_ChuaCircuit.html):" ] }, { "cell_type": "code", "collapsed": false, "input": [ "voltages = sim.names('^[^.]*.v$', re=True)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 25 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Running both steps at once " ] }, { "cell_type": "code", "collapsed": false, "input": [ "timeit sim(voltages).values()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "100000 loops, best of 3: 9.82 \u00b5s per loop\n" ] } ], "prompt_number": 26 }, { "cell_type": "markdown", "metadata": {}, "source": [ "takes almost twice as long as the second step alone:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "v = sim(voltages)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 27 }, { "cell_type": "code", "collapsed": false, "input": [ "timeit v.values()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "100000 loops, best of 3: 6.06 \u00b5s per loop\n" ] } ], "prompt_number": 28 }, { "cell_type": "markdown", "metadata": {}, "source": [ "As shown in the plot below, the simulation file loading time is not extremely quick, but it is but manageable -- slightly better than half a second for a 2 MB file. The `constants_only` initialization option of [SimRes](http://kdavies4.github.io/ModelicaRes/simres.html#modelicares.simres.SimRes) saves about 15 to 25% of the load time and may be useful if it is only necessary to read parameters." ] }, { "cell_type": "code", "collapsed": false, "input": [ "d = DataFrame({'file size / B':[14679, 19835, 43027, 100403, 176259, 278277, \n", " 347461, 380311, 924934, 1863585, 2141881],\n", " 'load time / s': [0.0044, 0.0012, 0.00334, 0.0093, 0.0279, 0.0242,\n", " 0.0639, 0.0333, 0.0766, 0.166, 0.458]})\n", "plt.plot(d['file size / B']/1e6, d['load time / s']*1e3, 'o-')\n", "plt.title(\"File loading time using ModelicaRes\\n\"\n", " \"Samsung ATIV Book 8, Intel Core i7-3635QM, Ubuntu 14.04\")\n", "plt.xlabel('File size / MB')\n", "plt.ylabel('Loading time / ms')\n", "plt.grid(True)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nlt6o5NKSd0r077//XjkuHB0dqVq1KjY2NsoUJw+LjIykffv2VK9enWrVqtGlSxf279+v957jx4/T\nrVs3ZQrxvPNy+fn5Ubt2bZycnGjevDlLly5VXouIiMDGxkYvntzpZHKFhITQsWNHHBwcqFmzJqNG\njdIb6Lly5UpsbGyUOb1ybdmyBRsbG+XWbmMM/b5zp3zPHQhYmksBFHdtmY0bN/LUU09RtWpV/Pz8\n8n3fqlWrsLGxKfDv4MGDB4wbNw5nZ2fq1KnDwoULH3tbYEEFIzU1lX79+jF58mRSUlKIi4vjo48+\nyve++/Ji7969PHjwgOvXryvFcfv27co05iNHjmTq1KnK4yVLluj9/NixY9m8eTP37t3Te3716tX0\n79+fatWqPbJPlUqlbDM1NZXXXnuNQYMGmXxq9NGjR9O1a1dSUlLYs2cPS5Ys0ZsttSCl+QdfUB4y\nMjLo3r07586d49dff+XOnTv8/vvv1KxZkyNHjhR5X/mNZC6MkSNHKsdF7rHh6emJj4+Pwfe7ubmx\nadMmbt68SUpKCsOHD2fIkCHK6zdu3KB379689tprJCcnEx0djb+/v/L64sWLiYuLIzU1leDgYCZO\nnKg3xYabm5tePHmv0n744QdGjhzJ22+/zc2bNzl79iyVKlXi6aefVr7UqFQqPD092bRpk95I8ODg\nYJo0aVLo37clrAtTnL+lGjVq8Pbbb/Pee+/l+56UlBTmzp1Ly5YtC/ysM2fOJDo6mitXrrB7924+\n++wzfv3118faFlhQwYiKikKlUvHcc8+hUqmoXLkyPXv2pFWrVoDxqY89PDz44osvaN26NY6Ojrz4\n4oskJSXRu3dvnJ2d6dmzp3JgpqenM2rUKGrWrImLiwsdO3bk+vXrynbyXqrmbZ7I/ZayatUqnnji\nCWrVqsXcuXOV996/f5+goCCqV6+Ol5cXn3322SNz9TwsODiYwYMHM2DAAL2pqPMq6OB78skncXNz\n48cff1Sey87OZt26dY9MNpefESNGkJycrMwDpNFomD17Nh4eHqjVaoKCgvQGrW3dupUWLVrg4uKC\nn59fvovjnDt3joYNG7JhwwaDr0dGRjJy5EhUKhUNGzbk6aefVqb+LoqCpgb/3//+x9q1a/nss89w\ndHRkwIABQNGmL89r1apVxMbG8tNPPymryNWqVYvp06fTu3dv5XPnN2X42LFjee211+jTpw8ODg5E\n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\n", "text": [ "" ] } ], "prompt_number": 29 }, { "cell_type": "markdown", "metadata": {}, "source": [ "There appears to be about a 60% memory overhead associated with the data. A 278.3 kB file took approximately 4.5 GB of system memory when loaded 10,000 times:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "4.5e9/(1e4*278.3e3) - 1" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 30, "text": [ "0.617" ] } ], "prompt_number": 30 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Contributing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now you've seen the main features of [ModelicaRes](http://kdavies4.github.io/ModelicaRes) besides the [exps](http://kdavies4.github.io/ModelicaRes/exps.html) module (tools to help set up and run simulation experiments). If there is a compelling use case or feature you'd like to see added, please consider developing it yourself and sharing it by a pull request to the ``master`` branch of the [GitHub repository](https://github.com/kdavies4/ModelicaRes). The [ModelicaRes](http://kdavies4.github.io/ModelicaRes) source code is well documented and organized to allow expansion." ] } ], "metadata": {} } ] }