Example from the Modelica Conference 2021

Tutorial by Tobias Thummerer, Johannes Stoljar

This example was updated over time to keep track with developments and changes in FMI.jl.

🚧 This tutorial is under revision and will be replaced by an up-to-date version soon 🚧

License

# Copyright (c) 2021 Tobias Thummerer, Lars Mikelsons, Josef Kircher, Johannes Stoljar
# Licensed under the MIT license. 
# See LICENSE (https://github.com/thummeto/FMI.jl/blob/main/LICENSE) file in the project root for details.

Introduction to the example

FMUs can be simulated in multiple ways using FMI.jl. You can use a very simple interface, that offers possibilities that satisfy almost any user requirement. However, if you need to build a custom simulation loop for your use case using the core FMI functions, we show that too.

svg

Other formats

Besides, this Jupyter Notebook there is also a Julia file with the same name, which contains only the code cells and for the documentation there is a Markdown file corresponding to the notebook.

Code section

To run the example, the previously installed packages must be included.

# imports
using FMI
using FMIZoo
using Plots
┌ Warning: Error requiring `FMIImport` from `FMIZoo`
│   exception =
│    UndefVarError: `fmi2Load` not defined
│    Stacktrace:
│      [1] getproperty(x::Module, f::Symbol)
│        @ Base .\Base.jl:31
│      [2] top-level scope
│        @ C:\Users\runneradmin\.julia\packages\FMIZoo\Yw7SL\src\FMIZoo.jl:46
│      [3] eval
│        @ .\boot.jl:385 [inlined]
│      [4] eval
│        @ C:\Users\runneradmin\.julia\packages\FMIZoo\Yw7SL\src\FMIZoo.jl:6 [inlined]
│      [5] (::FMIZoo.var"#14#20")()
│        @ FMIZoo C:\Users\runneradmin\.julia\packages\Requires\1eCOK\src\require.jl:101
│      [6] macro expansion
│        @ timing.jl:395 [inlined]
│      [7] err(f::Any, listener::Module, modname::String, file::String, line::Any)
│        @ Requires C:\Users\runneradmin\.julia\packages\Requires\1eCOK\src\require.jl:47
│      [8] (::FMIZoo.var"#13#19")()
│        @ FMIZoo C:\Users\runneradmin\.julia\packages\Requires\1eCOK\src\require.jl:100
│      [9] withpath(f::Any, path::String)
│        @ Requires C:\Users\runneradmin\.julia\packages\Requires\1eCOK\src\require.jl:37
│     [10] (::FMIZoo.var"#12#18")()
│        @ FMIZoo C:\Users\runneradmin\.julia\packages\Requires\1eCOK\src\require.jl:99
│     [11] listenpkg(f::Any, pkg::Base.PkgId)
│        @ Requires C:\Users\runneradmin\.julia\packages\Requires\1eCOK\src\require.jl:20
│     [12] macro expansion
│        @ C:\Users\runneradmin\.julia\packages\Requires\1eCOK\src\require.jl:98 [inlined]
│     [13] __init__()
│        @ FMIZoo C:\Users\runneradmin\.julia\packages\FMIZoo\Yw7SL\src\FMIZoo.jl:42
│     [14] run_module_init(mod::Module, i::Int64)
│        @ Base .\loading.jl:1197
│     [15] register_restored_modules(sv::Core.SimpleVector, pkg::Base.PkgId, path::String)
│        @ Base .\loading.jl:1185
│     [16] _include_from_serialized(pkg::Base.PkgId, path::String, ocachepath::String, depmods::Vector{Any})
│        @ Base .\loading.jl:1129
│     [17] _require_search_from_serialized(pkg::Base.PkgId, sourcepath::String, build_id::UInt128)
│        @ Base .\loading.jl:1655
│     [18] _require(pkg::Base.PkgId, env::String)
│        @ Base .\loading.jl:2012
│     [19] __require_prelocked(uuidkey::Base.PkgId, env::String)
│        @ Base .\loading.jl:1886
│     [20] #invoke_in_world#3
│        @ .\essentials.jl:926 [inlined]
│     [21] invoke_in_world
│        @ .\essentials.jl:923 [inlined]
│     [22] _require_prelocked(uuidkey::Base.PkgId, env::String)
│        @ Base .\loading.jl:1877
│     [23] macro expansion
│        @ .\loading.jl:1864 [inlined]
│     [24] macro expansion
│        @ .\lock.jl:270 [inlined]
│     [25] __require(into::Module, mod::Symbol)
│        @ Base .\loading.jl:1827
│     [26] #invoke_in_world#3
│        @ .\essentials.jl:926 [inlined]
│     [27] invoke_in_world
│        @ .\essentials.jl:923 [inlined]
│     [28] require(into::Module, mod::Symbol)
│        @ Base .\loading.jl:1820
│     [29] eval
│        @ .\boot.jl:385 [inlined]
│     [30] include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::String, filename::String)
│        @ Base .\loading.jl:2160
│     [31] execute_request(socket::ZMQ.Socket, kernel::IJulia.Kernel, msg::IJulia.Msg)
│        @ IJulia C:\Users\runneradmin\.julia\packages\IJulia\Vl5w1\src\execute_request.jl:129
│     [32] #invokelatest#2
│        @ .\essentials.jl:892 [inlined]
│     [33] invokelatest
│        @ .\essentials.jl:889 [inlined]
│     [34] eventloop(socket::ZMQ.Socket, kernel::IJulia.Kernel)
│        @ IJulia C:\Users\runneradmin\.julia\packages\IJulia\Vl5w1\src\eventloop.jl:26
│     [35] (::IJulia.var"#40#43"{IJulia.Kernel})()
│        @ IJulia C:\Users\runneradmin\.julia\packages\IJulia\Vl5w1\src\eventloop.jl:71
└ @ Requires C:\Users\runneradmin\.julia\packages\Requires\1eCOK\src\require.jl:51

Simulation setup

Next, the start time and end time of the simulation are set. Finally, a step size is specified to store the results of the simulation at these time steps.

tStart = 0.0
tStep = 0.1
tStop = 8.0
tSave = tStart:tStep:tStop
0.0:0.1:8.0

Simple FMU Simulation

Next, the FMU model from FMIZoo.jl is loaded and the information about the FMU is shown.

# we use an FMU from the FMIZoo.jl
fmu = loadFMU("SpringFrictionPendulum1D", "Dymola", "2022x")
info(fmu)
#################### Begin information for FMU ####################
	Model name:			SpringFrictionPendulum1D
	FMI-Version:			2.0
	GUID:				{2e178ad3-5e9b-48ec-a7b2-baa5669efc0c}
	Generation tool:		Dymola Version 2022x (64-bit), 2021-10-08
	Generation time:		2022-05-19T06:54:12Z
	Var. naming conv.:		structured
	Event indicators:		24
	Inputs:				0
	Outputs:			0


	States:				2
		33554432 ["mass.s"]
		33554433 ["mass.v", "mass.v_relfric"]
	Parameters:			12
		16777216 ["fricScale"]
		16777217 ["s0"]
		16777218 ["v0"]
		16777219 ["fixed.s0"]
		...
		16777223 ["mass.smin"]
		16777224 ["mass.v_small"]
		16777225 ["mass.L"]
		16777226 ["mass.m"]
		16777227 ["mass.fexp"]
	Supports Co-Simulation:		true
		Model identifier:	SpringFrictionPendulum1D
		Get/Set State:		true
		Serialize State:	true
		Dir. Derivatives:	true
		Var. com. steps:	true
		Input interpol.:	true
		Max order out. der.:	1
	Supports Model-Exchange:	true
		Model identifier:	SpringFrictionPendulum1D
		Get/Set State:		true
		Serialize State:	true
		Dir. Derivatives:	true
##################### End information for FMU #####################

Easy Simulation

In the next commands the FMU is simulated, for which the start and end time and recorded variables are declared. Afterwards the simulation result is plotted. In the plot for the FMU, it can be seen that the oscillation keeps decreasing due to the effect of friction. If one simulates long enough, the oscillation comes to a standstill after a certain time.

simData = simulate(fmu, (tStart, tStop); recordValues=["mass.s"], saveat=tSave)
plot(simData)
Sim. CS-FMU ...   0%|█                                   |  ETA: N/A

Sim. CS-FMU ... 100%|████████████████████████████████████| Time: 0:00:01

<img src="data:image/png;base64,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N/3XxpdrdNtttxHR8uXLe/To8fXXX995551EFBQU9MADDxDR4MGDH3vssVmzZhFRY+hOmTKld+/eycnJ8fHxjf8Rd3f3FStWGFv7Pvvss8rKysP/U1JSsn79+qVLlz7++OODBg169dVXichgMGzZsoUxNmjQICIaNGiQ8Yd77713zZo169evNz7t6tWrP//88wMHDjSdgK7T6Wy81xXuv5bxy1XW15/zdmr/yGbmxGLsKIDyHTp0KCEh4Z///OecOXN69erV2A/Xs2fPdevWZWVlLV68+JVXXiGi0NDQV155JS0t7d13333mmWeaPU9UVNSaNWvOnz+/evXqv//9783+NS4u7sbuKiLSaDTOzs43TgV2d3e/8cGGhoarV6/6+fk1ezwvL884BLJbt24zZ84sLy8vLy+vr6/X6/XGHsT58+f7+/sbH2eMVVVV6XS6Zk/i5ubW+H9fu3bte++9t2/fvuDg4KbH5ObmNrbi2gZqhJaxJ180feJEU9O78I8cQesogMLFxcWdOHFix44dbm5uq1atMk6wy8zM/PDDD8eOHevs7Hz8+PEePXqIorh8+fLbbrvNz8/vl19+MfYpnjx5ctKkSdeuXdNqtS+++OKUKVO8vLySk5NvXIdk/PjxL730kvHnU6dOffLJJ0lJSRqNZvv27RUVFZMnTyailStXBgYGRkVF5ebmrl69esmSJUSUm5v7+uuvjxw5kuf5//73v25ubhMnTiSit99+m+O42NjYjIyMlStXGoeYJiUlNTbAvvDCCxcvXjQG9hNPPNFYkrfeeuvhhx82dlguWrRo0qRJPj4+qampmzdv3rt3LxF98cUXK1asePbZZ3ft2kVEHMfdd999xr9NTk5+9NFHrXUmWoIgtIw9+WzzzR0JQh8nuimU25krzkfrKIBsjR07tnGmea9evRqrWQEBAcuWLSOivn37btq0afPmzV5eXmvWrPnqq6/c3d1dXFw0Gs26detEUbz55puXLVvGcVxMTMyWLVu0Wm3//v23bdtGRP7+/nfddRcRubi4BAcHv/fee7W1tYMHD37kkUeaFWPixInLli3Lzs6OiYmJiIhwd3f/5JNPGGOJiYnGOX9ENGTIkO3bt+/atSsgIOC1116bOXMmEfn4+Hh5eX3yySccxyUlJW3dutXNzY2IEhMTP/744z179oSEhGzZsmXKlCnNXnHEiBHGLsZm/va3vzV2YQ4cOPCHH36orKyMiYk5cuRInz59iMjPz++JJ55oaGgwTupoHMian59/+fLlG1/IqjjbL1b01ltvXb58+caBv63RarV2vn5pfg0b8LXh6l2OfIcWBtiaIX6dw76eYL/b9WJlGXtg/xeCzcTGxu7fvx8b87Zo69atv/76a2MnnOw89thjPXv2bKwdNlqyZMmwYcMWL15sjQsBNUIL2JPPJoTzHUtBwthRALCcBQsWjB49WupSdNyKFSuMMzRsCc1xFrDHnAVlbuTlSKNC+B1XMLMeADqL5/nGiepyFBkZ2bhCqc0gCDtLYPRToTghvFPv5JxYDmNHAQAkgSDsrGMlLNKDC3Xr1JPM6MIfLBIr9e0fCQAAloUg7Kw9+WJn2kWNPB3p5lB+Ry5aRwEAbA1B2Fl78s3YeqkNc2LQOgoAIAGMGu2UMh1dqGAjgi2wn+KkCP6vRxpEpunw6FMA9fj++++DgoKkLgXYTnZ29rBhw6z05AjCTtlXIN4UwjtZol4d4EIBLtylStbDB0kI0Ja5c+cePHjQ9q/LGBNF0fZjGoGI/P39jTPxrQFB2CmdnDjRTFIQl1KMIARoR7Otf2xGEASdTmdccgWUBH2EnbK3wKJBGMillKCbEADAphCEHZelZUTUzctiQTgkkEspRhACANgUgrDj0kpZP39LNmP2D+DSK1mNwYJPCQAA7UAQdtzpMurTfMeuTnHiqZcfd/I6KoUAALaDIOy4M+Wst5+FB7YkBXK/opsQAMCGEIQdd6aM9bF4EAahmxAAwKYQhB1UZ6D8GhZnuZEyRkkYLwMAYFsIwg46W87ivTkHS79/sV5cncAKa5GFAAA2giDsoNNWaBclIo5oSCB3DN2EAAC2giDsIGuMlDFKCuLROgoAYDMIwg46U2a1IEQ3IQCADSEIO8gaQ0aNkoK449eZgCgEALAJBGFHFNUSIwpxtcqT+zhRiBt3oQJJCABgCwjCjjhTzvpapzpohNZRAACbQRB2xGmrdRAaJQVhGwoAABtBEHaE9UbKGA3F+jIAALaCIOwIK00ibNTHj8vSMm2D9V4BAAB+hyA0m0Gk9ErW05r7yDvy1MePO4FtKAAArA9BaLb0Khbhzrk5WPdVsFs9AIBtIAjNdrrUuu2iRtiGAgDANhCEZrPe4mpNJQVyvyIIAQCsD0FotjOW3pi+RdGenMBYfg2yEADAuhCEZjtdxnr7Wr1GSERDArH6NgCA1SEIzVOpp1Idi/G0RRBiWj0AgA0gCM1zpoz18uV4W+QgFloDALAFBKF5zpazXjZpFyWiwYHcyVJmEG3zakpWqqMVvwobL+CtBIAWIAjNY5sho0beThTpzp3DNhSdIDJ696KY+GWDXqT3L4nT9wrX66UuEwDYGQSheay9uFozAwK4U6UIwg46cZ0N32HYkiHuucVh3XBN8jSHBG/q/7VhfyHeUgD4A4LQDIzorJWX224m0Zc7V467ttkq9LT8qDB5t2FeLP/LrQ7GPbOceFo9RLPlZs3dB4XlRwU9GkoBgIgQhGbJrWbujpy/s+1esZcvdxZBaKardZT4paFBpEtzHJf34puNbBobxp2c6ZBTTSO+M6RX4r0FAAShOc6UUW9fm75iL186W2bTV1SA9eeF26O59SM0vq18ZQlwoW8maO7pzo/eZajU27ZwAGB/EIRmSCtjff1t1y5KRF08uQo9w83adDqB3r0o/jWxnQ82R7S0Jz81kn/llGCbggGA3UIQmuGMrdaUacQR9fDhzmPgqMk+zBQHB/Lx3iadppcHaT5IFzOr8PYCqBqC0AzW3pi+RYm+3Nky3KlN9fY58dFepn6qg1zpsV6aZ1MxbAZA1RCEptIJlFPNEqy5H2+LEn0xldBU+wqYyGhMmBnnaEVvPvU6O3QV7zCAeiEITXW+gnX14pxs/ob1wgwKk715Vnist3nr37lo6JVB/PKjgoj3GECtEISmOmPbqfSNevkSmkZNkVHJfrvO5nc1+yN9Z1fezYE+vowGUgCVQhCa6mw5S7TtSBmjcHdOJxIWBmvX2nPi/Qm8i8bsP+SI1iRpnk0Vaw1WKBYA2D0EoanSKyneW5qX7umD1tF2VOjpk8viQz3Mj0EiIhoWxI0I4f59BpVCADVCEJoqs4p185KgRkjoJjTBuxfF26L4ULeOP8OaIfzas0JeDd5nANVBEJqEEWVrWVeJghADR9smMNpwof1J9G2LcOfuT+D/cRyVQgDVQRCaJL+G+Thx7g7SvHovP0wlbMvXOWKkOw0K6OzXlGf6aXbni2l4qwFUBkFokswq6uYl2aujabRtb541YxJ9Gzwd6a89NZuwfy+AyiAITZJRyeJMW7XLGgJdiOfoap1Ur2/Xjl9nBbU0rYtlPsmL4rgvskUd1h8FUBMEoUkuV0nWQWjUCwuttWLjBXFZT15joZMT7s719eN25KJSCKAipvZ6VVZW7t+///jx49XV1WvXrr3xgJKSkm3btv36668NDQ2jRo166KGHnJ1tuHGflWVW0Z1dpSxAoi93tpyND5cyjO3TjwXs8T6W/D63MI7fmsFmx1jwKQHArpl6Bzlx4sS6deuysrI2b97c4gE///zz8ePHZ8yYcdddd23ZsuX++++3WBntQEYVi5O0Roit6lt0sYKJjEzca8JEs2L4w9dENEQDqIepNcIxY8aMGTMmJSXl+++/b/GAO+6444477jD+HBwcPHHixM2bN3OcEmowjCjLDppGt2agva65HwvYpAgLnxd3B5oWxX962TIDcADA/lnlUs/Ozg4PD1dGChJRYQ3zdCRPRynL0MuPO1vOUCVsZm+BOMEKzcWLuvNb8LUDQDUsPzPu6tWrTz755FtvvdXaAZmZmV9//fWZM2caH3nttdfi4uJaO766utrCRTTT6WI+xsNBq9VKWAYNkaejy8Vr1RFuEqShIAh6vd5gsK+1OBtE+qXI+a0B9Vqthd+TgR5UXu98NK+6l48dffeQ/EIA44UgCBhVLCVzLwQ3NzeNpp3FFy0chKWlpRMnTnzwwQdnz57d2jGRkZGDBw9eunSp8VdHR8devXo5OTm18bSenp6WLadZCgvFeF/m6Snx2J9evoZsvXuPYAnq2cbr39XV1fYv3YaDRay7txAT4GGNJ/9Ld+GrQtdhkR1cvNRKpL0QQBAEnU7n5taJpfzAEix+IVgyCMvLyydOnDh16tTnn3++jcOcnZ0jIyPHjx9vwZe2KglXGW2qlx93rpxNiZS+JHZib4E40dIdhI0WxfEjdxj+NVjjgI5CAKXr7FW+fft2YyNnZWXl5MmTb7rpplWrVlmiYHZE2mVlGmHgaDN7C9iEcGvFVDcvrqsX92MB3nAA5TP1PpKbm+vn5zdhwgStVuvn5zd48GDj46tXr/7pp5+IaNu2bceOHdu8ebPf/5SXl1ur1LZlLzVCX+4sgvB/ynV0sYINC7LieVkYhyEzAKpgatNoRETE5cuXG39t7Hvcv3+/sXtv8eLF8+bNa/onPj4+FiqkxC7bRxD29OGM0+Z46csivX2F4sgQztmaXXh3xvLPpDaU6zS+ylkZAgBaYGoQ8jzv6+t74+MeHr8PVXB2dlbSUjKNrtaRi4a82xrKYyMejhToykm4G5RdsWq7qJG3E00I5z/PFh9IQD8hgJLhCm9HZqVdVAeNevkSWkeN9hUw642UabQojsc6BgCKhyBsR0aVlPtONJPoy51VSMdrp2RUMr1IPXysfl4mhnPZWnapEl8+AJQMQdgOyfedaAoDR41+LGATw22xcJEDT/O78h9lolIIoGQIwnbYydwJo94YOEpERHsLbLcRx4Ju/CeX8Z4DKBmCsB12MnfCKMGHu1zFDOqunxhEOlgkjg+z0Ue3nz8nMLpQgSwEUCwEYTvsKghdNBThzmVUqfqm/Gsxi/Hkgmy43NstEdyuPFW/5wDKhiBsS3EdOXDkZ0+zQhJV3zpq1ZXVWjQ1it+FPesBlAtB2JbMKtbNboaMGvXyJZWPl7HBDMJmxoZyJ66zCr0tXxMAbAdB2Ba7ahc1SvTlzql4BkWFns6Us+HWXFntRq4OdFMotycflUIAZUIQtuVyFetqZ/ve9PRR9QyKnwvFEcGcq+W30WzH1Eh+V65633YAZUMQtiWjiuxnNr1RnDeXrVXvwNEfbd4uajQ1ivs+TxQQhQBKhCBsix02jbpoKMSNy6lW6S15bwGbaKsZhE1FunPh7tyxEpW+7QDKhiBsS6Y9LSvTKMGbLlZIXQgp5NcwbQPr5SfNGbk1isPYUQBFQhC2qlRHIqNAF6nLcYN4H06dq1/+WsyGBkm2CdXUSH4nugkBlAhB2KrMShZnf9VBIor3VmkQHithSYGSnZGkIK6gll1Ra6M0gIIhCFtlh5MIjeK9uUuqXPErpZgNkS4INRxNjuB356vxnQdQNgRhqzKqWJzdLLfdVLw3qbBGKDA6WcoGSReERDQ1ksMkCgDlQRC26nIV2eFIGSIKc+fqDKS2hU7OlbMId87HScoy3BLJHywSaw1SlgEALA5B2Co7nDthxBHFqa91NKWYJdl2QZkbeTtR/wDuQJG63nkAxUMQtiqj0k6DkFQ5XialRMoOwkZTI/ldeZhEAaAoCMKWVehJL1KwDff6MYsKZ1BIO2S00dQoDpMoABQGQdiyjEpmb4urNRXvTZcqpS6EDdUYKFvLeks0lb6pnj6cI08q3wkLQGEQhC2z2w5CowQfdfURppawPn6co318WqdEolIIoCj2cWuxP5lV1M0u504YdffiLmuZetaATim2i3ZRI3QTAigMgrBl9rnKaCNXBwp04dSzyskx+xgpYzQ6lDtTxkp1UpcDACwEQdiyy/bdNEoqW3o7tYQNkXruRCNnDd0cyu/FPr0ASoEgbFlGlZ0uNNpIPQNHi2qpXmCxnnZ0OsaFcfsLVfHmA6gBgrAF2gaqaaAQN6nL0Sb1rDiaUiLaT7uo0YRwbm+BKt58ADVAELYgW8tiPDn7uvXeQD1z6n8tZklB9vVB7eHDCYwyq1Tx/gMonn3dX+xEjpZFe0pdiPbE+6hl6e1jdrC42o3GhnH7UCkEUAQEYQuytRRjTz1SLYpw57QNVNUgdTmsTGR0opQNDrC704FuQgDFQBC2ILua2X8QckRxXsrvJjxfwUJcOV9nqctxg/Hh3P5CUT1TOQEUDEHYghwtRXtIXQgTqGHgqLSb8bYhzI0LdeVOlir8/QdQAwRhC4yDZaQuRfvUsEPvsRJ77CA0Gh+ObkIAJUAQtiBHy6LlEYTcJaXPqbfbGiH93k2IafUAsocgbK5URxqepN0J3UQJSm8arTVQZhXrYwebTrRoTBifUszqsGE9gMwhCJvL1rJoDzu98zbT3ZvLqFLy0tu/XWe9/ThnjdTlaIWnI/X245KvKfcEAKgDgrC5HJl0EBKRuwP5O3N5yl162547CI3Go3UUQP4cpC6A3cmpJvufTd8owYcuVsqpwGY5Vsymd7HvIAznH/tVWDVY6nLYsUo9Hb7GDl0VD11lv5Uwvey/NjgSKX32rn3zcHDOm2/h3isEYXPZWtbDx65vvk0ZVxydHCGbApvlWAl7ZbBdN1oMDeIyq1ipjvztb6ajtFJL2EeZ4i9XWVYVGxLEjQrhXx7EJwVyrnK+5QiCoNPp3NzsexlipdNqtZ5OFh7EIedPpXVka9mUSLu++TYV781dUOic+qt1VN1g17tCEpEjTyODuZ8LxdkxsvnM2MDOXLb4kOFvvTUbR/ADAzgHvDdg3/AJbS5bSzHyaWlU8Jz6lGJxSJC9L31OROPCeay11tSnl8XFhwzfTnB4sg+fFIQUBBnAh/RPGFFuNesik1Gj9PuceqkLYR2p9rQrfRvGh2FLpj+8e1F84pj40xSHofY9ygmgKQThn1ytJU9HcpdPg3GkO1ehY1oldt4fv84G2t9a2zfq5cfVGli2FllIb58TX0kTf5qiSfSVwYkDaIQg/JOcanmsKdOI56ibF5euxNbRU6Wsv78MzgVHNDYMraO0Ok1cf0E8dKsmzlsGZw2gKQThn8hlldGmFLm+TFEtGRhFuMvjXIxT/d6Ey48Kn2eLv9zqIJdTBtAUgvBP5LLvRFPx3qS8zZhOyqQ6aDQ+nPupUBSVdhJMtTld/OUq+2mKQ6CL1EUB6BAE4Z/IsUbY3ZtT3niZE9fZADl0EBpFunN+ztzpMjUmYVEtPZUqvFxnEE4AACAASURBVD9K4y2H5XkBWoQg/BM5BqEim0blVSMk45ZMquwmXHZEeKgHL6NvLQA3QhD+SU61/JpGu3tzGZVMYe1yp0pZP1kF4bgwbl+B7FcPM9cnl8XMKvZsP3tdFh3ANAjCPwiM8mtYlHwmERp5OpK3E5dfo5wkrNBTST2Ls+81ZZoZE8YfvcZ0gtTlsKHr9fS3FOGDmzROuIuAzOEj/IeCGhboYr+b/rTBuPS2YpwqZX38OF5OOUg+TtTDlztarJyvI+1amiwsiuMHoVEU5A9B+Ad5La7WVLy3oqYSymukTCNVbcn03RXxdBn7xwAZfm0EuAGC8A9yHCljZNyDQupSWIzsRsoYjQvnVTKbsFRHDyYL743SuCAHQREQhH/IqWZyrRH6cBcVVCOUaRCOCObOl7NyndTlsL7lR4X5XfmRIfI7RwAtQhD+IVtL0XIbKWMU702XKqQuhIXUGShby3rKcLFKJ56GBXMHryq8dXRnLkspZv8ciMogKAeC8A85WpktNNqoiwdXqmM1BqnLYQlnylm8NyfTgYjjwhTeOioweuKYsG64xk0+C9MDtEue9xvryNJSrDybRnmOunpxGYpoHZXpSBmj8eGcslff3pohBrrQpAi5niCAFiEIf6cXqaSehct2yeB4b+6iIsbLyLSD0KifP1daz/IUNKezKb1IK0+KKwehURSUxtQGjqKiomPHjqWnpw8aNGjMmDEtHnP27Nn33nuvvr5+/vz5N910k+UKaQu51SzcjdPI9Q6snB16T5ayRXFy/X72+5ZMBezu7rL9JLXuPxfFHj50E8bIgOKYesd58skn33jjjffee++HH35o8YDs7OyRI0cGBgb2799/+vTpBw4csFgZbUK+kwiN4hWx4qhBpPPlrI+fjG+148KU2TpaZ6DVaeJLqA6CEplaI/zwww+JaMmSJa0dsH79+hkzZjz33HNEVFFR8dprr40ePdoSJbQR+U4iNIr35t48K/vxihcqWIQ75+EodTk6YWIE9/fjAiP5Ni607K1z4rAgTr6t1gBtsFgb1JEjRxqbTMeMGXPkyBFLPbNtyHfIqJFxcRm510ROlsp4pIxRFw/O3YE7Vy73U/EnlXp6/azw4kC5NlkDtM1ig6CvXr0aEBBg/DkwMLC8vLyurs7V1fXGI3Nycnbt2pWfn2/8leO4F198MSYmprVnrqur02is3iCTWekwJVysrZVrpcqRyF3jkHm9NtzN8k8uCIJer2fWz9nUa5peXlRbK+9J6aODNd9nG2KdLfxZss2F0KLVp/mJoVwXp7raWkle314IgqDTyfvDqQDmXgguLi483853OIsFobOzs16vN/6s1+s1Go2TU8s7dfr7+3fv3n3u3LnGXzmOi4qKcnFpdXPrhoaGNv7VUnJrxThfjYuLjKsjCb7iFZ1LVz/LP7MgCDzP2+AsnKkUp0XzLi5ybhslmhjJPswUH+9n4Z1qbXMh3Oh6Pf0nQ/h1muzPS+cJgsBxnCRnARqZeyG0m4JkwSAMDw/Py8sz/pybmxsSEtJaaHt6esbFxd1xxx0mPjPP86b8TzopRyvEejlY/3WsKN6bpVfS+HDL/x8YYzY4C4worVToH2CDs21d4yPogWRRIN7Rov8R21wIN3r1jHBnV76bN4bJ2OhCgLZZ4xR06umqqqq+/vprURSJaObMmZ999pkgCET08ccfz5w50zIFtIk6A1U1UIgVGhVtKd5b3gNHs6qYpyMXIP9v2/7O1NWLS1HElkxFtfTfdPGZvrj1g5KZ+vl+5513Bg0a9O23327dunXQoEEfffQREWVnZ99+++3GRvNFixaJojh06NCJEycePHjwqaeesmKpLS27mnXx4GTcKkpE8p9BoYCRMo3Gh3H7FLEl00snhcXxvHwXmgAwhalNo/Pmzbvlllsaf/X39yeihISEixcvGptr3d3dDx8+fPTo0fr6+hEjRrQ4TMZuZWsp2kPqQnRagjddlPPS26dKWT9/qQthIePD+RdPCC8MkLocnZNbzT7PEi/dofauQVA8U4PQz8/Pz6/5MAxnZ+f4+PjGXzUazciRIy1WNBvK1rJYL9l/54325IrrWa2BZLog8olS9mCCQprgRoVwp8tYVQN5yTlEXjsjLo7n/Z2lLgeAlSnkvtNJOVom0w2YmtJwFOPBZVbJtXX05HXWXylNoy4aGhzI/VIk13NBRKU6+jhTXN4LtwhQPnzKieS/vloj+XYTXqujBpEiFdQXNS6M3y/nbsI3zwqzY/gwN+WcEYDWIAiJiLJlvqxMowTZ7tB7XM67L7VofDgn370JtQ208YL4t964P4Aq4INORJRTrYSmUSKK9+EuyrNGeKqU9VPWOpYDA7jCWlYkz6VYNl4QJ4Tzcd6KOiMArUEQUqWeDCIpYPoaGacSynNXQllvQ9giDUfjwvg9+fJrHdUJ9OZZ8SnMHQTVwGdd9vtONJXgw12S59Lbst6YvjVTo7hdefI7G5szxP7+1FfOm2EBmAVBSDnVCukgJCIfJ3J1oKJamd18K/VUXM+6yX8GSzO3RPD7CkS9rOqEAqM1p8Wn+2JBNVARBCFlVSlkyKhRvDeXLret6k+Wsr5+nNJ28CMKcqUEH+7QVTl9L/k8Swxzo5HYhh7UBEFIOdUsRhEjZYzivbmLcusmVN5ImUZTI/ldubKpEjKi1WmoDoLqIAiNfYRSF8Jy5DiVUJEdhEZTo7jvcmVzOr7PY0R0S6QyzwVAaxCExtn0yrny471JdkGovCGjjfr5czqBMmRyRv6VJjzTj1fmmQBoHYKQcpQym94owZuT15z6eoGytKynj3JOQVMc0ZRIbqccxo4evsqu1tLsGNwTQHXU/qEvriNXB/KU88rIzcR4coW1rF6QuhwmO1PGuntzzsrtlpoaycmim3BVmvBEH155Q5YA2qX2IFTSJEIjB56iPeW09PaJUjZAoe2iRuPD+dQSVqmXuhxtSitjJ0vZwji13xBAndT+uVdeEJLc1pdR0qYTLXJzoOHB3N4Cu64UvnxSfLy3xkW59XKANqg+CKsVNYnQKN6bLslnKqGCR8o0mhrF2/MSM5lV7OBV8X6lbAYJYC61f/SVsRNhMzKaQSEwOl/B+ih9Na9pUdz3eaJor+fklVPisp4aDwX1lAOYRe1BqNimUZkE4YUKFubGKWmwUouiPLhAF+636/Z4UvJr2DdXxGU91X4rADVT+6dfMVvyNtXDRzZ9hGpoFzWy27Gja06L98Xz/s5SlwNAOqoOQpFRfg2LUlzTqJ8zaTi6Vid1OUxw8rpqgjCKt8PZhKU62pYpLu+l6vsAgKovgIJa5u/CKXKknFy6CU+WKnZxtWZGBHNXtKygxr5OyutnhLld+TA3VZwCgNaoOggV2S5qJIsZFIworUyxy203o+FoYgT/Q74dnZSqBtp0QVyB6iConqqvgWytovadaEoW42VytMzdgQt0kboctjI1kttlTwtwrzsnTo3iuypuG0gAc6k9CKMVWiNM8CH734zpZCnr5y91IWxociT/c5Gos4/V72oN9NY54am+qr4DABip+jLI1lKs4uZOGCX6cuftfuntE9fZQHV0EBr5O1MvX+5AkV18QXnvkjgimFfqWucAZlF1ECps34mmYj254jpW3SB1Odp0qpT1VfpU+mamRvG78qSfRKET6N9nxKdRHQQgIpUHoYIHy/AcJfhw5+27dfRkKalk7kSj26O5L7NFg9RRuPGC2NePGxyorjcfoDXqDUK9SMX1LMJdsfeCRF/uXLn9BmFxHdUJrItCa+Stiffmoj24PQVSnpfqBlp9WnhpkHqvfYBm1HsxXNGycDdOwbuv2XkQGndfUu7b36pF3fkt6VJWCV87I0wM59XWKA3QBvUGYY4S951oyt6DUDVryjRzZyy/t0C8Xi/Nq1+vp3XnxOcHqPfCB7iReq8HRS633VSiD50tl7oQrTtZqvBtCFvj7US3RPKfZUlTKXzppLAgjlfqYGmAjkEQKlYXT65KzyrsdWP0k0rfmL4Ni+L4LRkSBOGVarYtU3ymrxIXFQToBDUHocKbRjmiHr7cebtsHa1qoKu1LM5bpUE4IZy7Wktnymx9ap4/Lv41kQ92tfHLAtg7NQehwmuERJToY6fdhKdKWR8/JY9UahvP0YJu3IeZNq0Uni1ne/LFFb1RHQRoDkGoZIm+3Dm7nEp44rpKOwgb3d2d/zDDphMKn00Vn+mr8VL6HsgAHaDSIKwxUI2BgpTeRtTLjztr8/Y3U6hnP97WdPfmYr1sN6EwpZidLmMP9lDp9Q7QNpVeGNlaFu2h/ElsiT5kn02jCEIiWhTHb7bVhMKnU4UXB/LOaBYFaImKg1DRI2WMwt05nUhSTVlrjU6gy1Us0VftQTg3lt9XIJbqrP5CO3NZST0t6KbSix2gXSq9NnK0pPgOQiM7nFZ/tpx18+JcVF878XaiKZH8J5etWymsaqC/HhHWDtOodmgSQLtUGoRqGCljZIcDR9Eu2uhu6y+39rdfhVsiuXFheMMBWqXaIFT4JMJGvfy4s3YWhL+VsEHY94CIiMaFcdfqyHonaHc+21/I1gxRfe0boE2qDUK11Ah72l+NMKWEJSEIiYiI5+gvcZyVKoWVenrgsLBppMYDUyYA2qTSIMypVksQ9vK1rxphrYEyKlkfbH3wP3fH8R9mig1WiMJHfxWmd+EmhOOtBmiHGoOwTEcckY+T1OWwiSBX0nBUVCt1Of7nxHWW6MthHH+jOG8u0Zf7wNKVwl157NBVtmow3miA9qkxCNXTLmqU6GtHW9WnlLChQSp6803x1jDNP44LJZab5VKpp6XJwvujNO4OFntOAAVDECpfL187Wl/mWAkbgg7CP0v05e7qxj99TLDUEz58RLg9mrs5FO8zgEnUGYRqGTJqZFcrjqYUIwhb8MIAzY8F7GCRBU7Tjlwx+Rp7aSAaRQFMpcYgzKlm0agRSqG4jrQNrJtad19qg6cjvT6Uf+So0MlluC9UsAcOC1tuxkhRADOoMQizqpiqdug29hHaQxKmlIhDApW/xGvHzInhw93p7fMdT8ILFWziD8K/BmtGhuA9BjCDGoNQbU2jvs7k7sDl10gfheggbNtbwzSrTgkFHTpTaWVs7C7DqsH8wjg1XtQAnaG6a4YR5dawLh7quh0n+tK5cqkLYewgDFLdR8503by4B3vwjx8zu1J4spTdstuwbrgGK2sDdIDqLpuiWubtSG4qG1aeaAfT6hnRb9fZYHXvx9uuZ/pqjhWzH/LMOFknrrMpuw3vDNfMilHd5QxgEaq7crK1pKqRMkb2sAdFeiXzceIUvxlyJ7k60DsjNMt/FXSmTab47TqbusewaaRmZrTqrmUAS1HdxZOjskmERvYwcDQVHYSmmRzBJfpwDx8VrtW1dVidgT5IF6fuMWy+2WFaF9VdyAAWpLrrR20jZYwSfbmLlUyUNAoxg9B0G0dqOKKeXzbc+ZNwoKj5iN/0Sva3FCHq04bt2eK3ExwmReBdBegUFQahGmuEno7k78zlVEuZhBgyarpgV9o0UpN9p+OoEO7hI0Lil4a3zomlOu6rbHHCD4abdxqceUqd7rBzkgPWqwPoPJUNGiHKqWbzuqou/un3gaOSTaDUCXSunA3ASBlzeDnSsp78sp78oats4wXxyWPOQ4PEh3rwM6N5JzV+hAGsRXVBmKWlWC+pCyGFRF/uXDndFiXNq58qZfE+nNoG61rKqBBuVIhmo7bW01N9zfoA1qeuL5YNIhXVskh3NdZLpN2Y8FgJJk4AgJ0y4yv60aNHd+3a5efnd/fdd/v5+d14wJkzZ3bs2KHX60eNGjVu3DjLFdJisrUs3I1zVFf6/y7Rl3vjrFV2QjdFSgkbF4YgBAB7ZGomfPvtt7fddpunp+eJEyeGDh1aW9t8p9d9+/aNGDHCYDB4e3vfc889r776qqWLagGZVRTnLXUhJNLDh0uvZIJEdcJjJSwJwzoAwC6ZWiN8+eWXX3311XvvvZcxNnTo0E8//fTee+9tesDnn3++aNGi559/nogCAgJef/31J5980vLl7ZyMStbNS6W3YzcHCnPjMqtYvM03fyjX0bValoBNJwDALplUI6yurk5NTZ00aRIRcRw3adKkn3/+udkx3bt3T09PFwSBiM6fP9+9e3eLl7XzMqpYnFqDkIgGBHCpJRJUCVNK2KBAjlfvGw8Ads2kGmFRURERBQUFGX8NDg5OTk5udsxjjz12+vTpLl26uLu7e3t779mzp7VnKyws3L9//5IlS4y/Ojo6Pv744+Hh4a0dX19f7+homd3V0iv48cGsvl76fRgkMdCXP1JEsyPM7ikUBEGv13Md3UDpSBE/wJfV1xs69udgZMELATpGEASdTsfzqhxlYDfMvRCcnJzaPWUmBaGDgwMRieLvN1CDwXBjObZs2fLbb79t3brVy8vr73//+7PPPrthw4YWn83V1TUoKGjgwIGNj3h5eWk0rW6ordFo2vhXs2RWUbwPZ6Enk5+kIPriCnXszezMWTheSvfEqfdttxQLXgjQYTgLkjP3FJjyDd6kIAwJCeE4rrCwMCYmhogKCwtDQ0ObHbN+/fonn3xy7NixRPTvf/+7T58+a9eudXJyuvHZfH19e/fu/dBDD5ny0kTk6OhokS/CepGK6hq6+Tqqc9QoEQ0JpgsVDQLv6GLmhczzPGOsw2fht9KG/4xycHRE22inWOpCgA7jeV4URZwFaVnjQjApE1xdXceOHbt9+3Yiamho2LFjx9SpU4morq7uyJEjxn5BHx+f3Nxc4/FXrlxxd3e3t49LtpZFuKt07oSRqwPF+3CnSm3aMpytZU48F67KuZsAIAumjhp98cUXp02bduHChYsXLwYEBEyfPp2IcnJyRowYUVFR4e3t/cwzz8yePfvy5cuenp6fffbZP//5zw53KVlJRiV1U+WaMk0lBXIpxcyWC1RirW0AsHOmBuGIESPS0tL2798/Y8aMSZMmGWt70dHRBw8e9PDwIKJx48ZduHDh8OHDOp3ukUcescNRo5lVLE71I/iTgrg9+TatEWKtbQCwc2asLBMREbFo0aKmj7i6ut50002Nv4aEhMyePdtiRbO0jCpMZaOkQO6fJ2y6vsyxErZykIrbowHA7qnoDpWp4tn0jeJ9uHI9K6m30cvpBDpdxgZilVEAsGMqCsIMFa+v1ogjGhTAHbPVtPrkayzRl/O0r1FTAAB/opYg1ItUVMu6eKBqQklBXEqxjVpH9xWIE8LxngOAXVNLEGZVsUgPVc+daJQUyKcU26hGuLeAjQ/Hmw4Adk0tN6mMKhan+rkTRklB3LESJlo/Cst1lF7JkjBkFADsm2qCsJIwd8Io0IV8nbmMKqsn4f5CcVQI54zlqADAvqklCDOrMGT0D0lBnA1aR/ehXRQA5EAt9ymVb8DUTFIgl2L9gaN7C9h4jJQBALunmiCsxNyJP9igRpijZbUGluiLIAQAe6eKINQJdK2ORWHd5/8Z4M9drGB11twfcE8BmxCOvXgBQAZUEYRZWhblwTmo4v9qEmcN9fDhTlpzG4p9aBcFAJlQRThkVGLuRHNJQVbsJhQZHSgSx4YhCAFABtQRhFWYO9GcVbsJT5SyYFcuAm3RACAHqghCzJ24kVUHjmK8KADIiCqCMKMSOxE2F+fNafXsWp1VnnxfgTg+TBUfLQBQAFXcrTKqCH2EzXBEgwK5YyWWX327XqDUEnZTKL55AIA8KD8IdQIV17Eo7Dtxg6RAq3QT/nKV9fPnvLD1EgDIhPKDMLOKRXtyGuTgDZKCeGt0E+4rELGyGgDIiPJvWBlVrBvaRVuSFMT9ZoVtKPYWsPGYOAEA8qH8IMysIqwy2iJ/Zwpw4S5VWjIJr9dTtpYNxtZLACAfyg9CDBltg8VnE+4tEEeH8tgAGQBkRPl3LEwibMOQQO5Xiwbh/kLMIAQAmVF+EGZUEvoIWzMxnNuVZ8luwn3oIAQAuVF4ENYZ6LoOcydaleDD+TtT8jXLJGF6JTMwSvDBuw0AcqLwILysZdEemDvRlrld+c+yLDOt/oc8NhHtogAgNwoPQoyUadfcWO6LbNFgiSh875J4d3eFf6IAQHkUftvKqEIHYTtiPbkuHtzBq51tHT1YxARGo0LwtQMAZEbhQZhZxTCJsF1zYy3QOrrhgri0J7akBwD5UXgQomnUFHfEctuzRX0norCknvYViH/ppvCPEwAoksLvXGgaNUWkO5fgw+0v6Hjr6H8uirNieG8nCxYKAMBGlByEdQYq0zHsk26KzrSOiozeuyQ+kKDkzxIAKJiSb16ZVSwGcydMMyeW/y5XrBc68rc7c8VQVxoQgDcaAGRJyUGYUYUOQlOFuFI/P25PfkcqhRsuiA/1VPIHCQCUTcn3r/RKbExvhrld+c+yzO4mzNKy49fZnBglf5AAQNmUfP86XcZ6+6FGaKpZ0fz3eWKNwby/2nRBvLs776KxTpkAAKxPyUGYVsr6+iMITRXgQkODuO/zzGgd1Qm0JUO8L17JnyIAUDzF3sJ0AuVUsx5YANocc2PNax39Ilvs78+hIxYAZE2xQXiunHXz4pwU+/+zipnR/L4CsarB1OM3XBAf6oG3GADkTbF3sbQy1hcdhGbycaKbQvgdV0xqHT1dxvKqaWqUYj9CAKASir2LnS5jfdBBaL65sZyJraPrz4sP9OAxTRMA5E7RQYgaofmmdeF/uSpma9vJwm+uiF9fERdjmAwAyJ9ib2QIwo7xdKTVQzSjdgrHSlrNwg8zxaXJwu7JDiGutiwaAIBVKDMI82sYzxFu0x3zQAL/wU2a2340fHK5hc7CjRfEZ1LFH29x6I+WZwBQBAepC2AVaWXUD9XBTpgYzu27xeG2H4VLleyFAX/Mll+dJm66KB6cqumKXR4BQCmUWSM8XYap9J3V2487Os1hZy5b/IvQIBIjeuqYsDVDPHQrUhAAFEWZNcLTZWxKJG7WnRXqRgemOsz72TBtL4tw489XsUO3Ofg5S10sAACLUmiNsBSTCC3Dw5G+meDQ05fLr6G9tyAFAUCBFFgjrDNQdjVLwOJqFqLh6N9DOL1edHWUuigAAFagwBrhuQoW743F1QAAwCQKjIu0UswgBAAAUykwCE9jlVEAADCZAoMwDXMnAADAZAoMwrNlrLcvghAAAEyitCDMrWZOGgrC4moAAGAapQXh6TJCByEAAJhOaUGIDkIAADCL0oIQuy8BAIBZlBaEaVhcDQAAzKGoIKwzUF4N6+6NIAQAAFOZsdbo2bNn9+/fHxYWNn36dCcnpxaPOXjw4MmTJ/39/SdMmBASEmKhQprqTDmL9+YcFRXuAABgXaaGxjfffDN69Oi8vLx33nln4sSJoth873LG2IIFC+67777Lly/v3bv3s88+s3RR25dWipEyAABgHlNrhP/4xz/eeOONv/zlL3q9PiEh4ccff5w8eXLTAz788MNjx46dOHHCw8PDCuU0CRZXAwAAc5lUIywsLDx9+vT06dOJyMnJafLkybt37252zJdffnnfffdlZGRs3749NzfX8iU1QRqGjAIAgJlMqhEWFhZ6eHh4eXkZfw0NDT179myzY7Kysq5du7Z79+7o6Oj77rvvvffemzlzZovPVlJSkpqa+vLLLzc+cvfddwcEBLT26jqdrrUuyaYY0dlyPsGjQadj7f+XwByCIOj1ep5H76uUTLwQwHoEQdDpdBqNRuqCqJq5F4KTkxPHtVNBMikIGWOMsWaPNDumoaHB29v7xx9/JKIxY8asWLGitSAURVGn01VUVBh/dXR0vLHHsQPyashVQ/7OSEEAADCDSUEYFhZWU1NTXV1t7P+7du1aaGjojcckJSUZfx46dGhOTk59fb2Li8uNzxYcHDxy5Mg1a9aYWES9Xu/s7NzuYReuiv38RVOOBHMJgsBxHN5baZl4IYD1CIJARDgL0rLGhWBSY1d4eHjPnj137dpFRAaDYc+ePRMmTCAinU6XlZVlPGby5Mnnz583/nzu3LnQ0NAWU9B60soIHYQAAGAuM0aNLlu27Ny5cykpKQEBAbfccgsRHT9+fMSIEcZm0vvuu2/Tpk333ntvly5dNm3a9Morr1ix1C05XcZmRSMIAQDAPKYOf7jjjjt2797t5eU1f/78n376ydhdHB8f//nnnxsP8PPzO378+NChQ318fH744Ye7777bSiVuzeky1hs1QgAAMJMZK8sMHDhw4MCBTR/x9/efM2dO46++vr7333+/xYpmjqJaKq1nCT4IQgAAMI9CBsT/kC9OiOA1yEEAADCTUoIwj90SgRgEAACzKSEIDSLtLxQnRSjh/wIAADamhPA4fI3FeXHBrlKXAwAAZEgJQfhDnnhLJNpFAQCgI5QQhN/nsSmRSviPAACA7ck+P/Jr2LU6NigANUIAAOgI2Qfhrjw2OYLnkYMAANAhsg/CH/IYOggBAKDD5B2EepEOFIkTMXECAAA6St4RcrCI9fLl/LEpCgAAdJS8g/CHPPEWjBcFAIBOkHeKfJ/HpqCDEAAAOkHGQZitZZV61s8fQQgAAB0n4yDclcemRGLeBAAAdIqMgxArqwEAQOfJNQjrDHT4KhsfLtfyAwCAnZBrkPxcxAYEcD5OUpcDAABkTq5BiIkTAABgEXLNkh/ysSU9AABYgCyD8FIl0wnUyw9BCAAAnSXLIPz3GXFmNIcYBACAznOQugBme/2MeOQaS75NfiUHAAA7JLM4+T6PvXFWTL5N443xogAAYAlyCsKTpezug4YdEx2iPNAsCgAAliGbPsLCWjZzr7BppCYpCCkIAAAWI48grG6gqXuEhxP5mdHyKDAAAMiFDHJFZLTggDAwgPtbbxmUFgAA5EUG0fLcKYc6A9s4QiN1QQAAQIFkEIRxXuzzcQ4OMigpAADIjwxGjd7bVfDEZAkAALAO1LMAAEDVEIQAAKBqMgjCvXv3CoIgDpDPfgAACEVJREFUdSlUrbCw8NSpU1KXQu327dtnMBikLoWqXb169cSJE1KXQu3279+v1+st+5wyCMJHHnmkqKhI6lKo2t69ezdu3Ch1KdTusccey8vLk7oUqrZ///7169dLXQq1e+KJJ3Jyciz7nDIIQpAcY0zqIgBIDxeCUiEIAQBA1RCEAACgahLMI8zJyfnmm2/Onz9v4vGlpaXz5893dna2aqmgDYWFheXl5RMmTJC6IKpWXFy8cOFCFxcXqQuiXkVFRaWlpbgQpFVYWHjPPfe4ubmZePzMmTOXLl3a9jGc7Vu9L1++nJqaGhAQYOLx2dnZ0dHRHHakl05tba1Wqw0ODpa6IKqWk5PTpUsXXAgSwoVgD8y9EGJiYrp27dr2MRIEIQAAgP1AHyEAAKgaghAAAFQNQQgAAKqGIAQAAFWz922Yzp07d+zYsW7duo0aNUrqsqjUuXPn0tLSXF1db775Zj8/P6mLo16iKB44cCAyMjIuLk7qsqjUuXPnUlNTfXx8Ro0a5e/vL3Vx1Cg1NfXChQtBQUHjxo1zdHS01NPadY3wv//979ixY1NSUpYsWbJs2TKpi6NGzz333K233rpz587333+/W7duKSkpUpdIvTZu3Dhp0qR3331X6oKo1NNPPz1hwoR9+/Zt3bp17dq1UhdHjZYuXTpv3rxTp06tXr16wIABWq3WUs9sv9MnGhoaunTpsmXLlgkTJhQXF8fGxqalpbU7HQQsKzs7OyoqSqPRENGKFSsyMjJ27NghdaHU6MqVK7feemvPnj27dOny6quvSl0c1dm9e/c999yTlpYWFBQkdVlUSqvV+vj4nD17tkePHqIoJiQkrFy58o477rDIk9tvjfDEiRP19fXjxo0joqCgoBEjRuzcuVPqQqlOTEyMMQWJKDQ0VKfTSVse1XrggQdWrVrl4eEhdUFU6pNPPrnnnnvq6+v3799fXFwsdXHUyMnJydPTs7a2logMBoNOpzN9VZZ22W8QFhQUhIWF8fzvJQwPDy8sLJS2SGpWVla2bt26JUuWSF0QNXr//feDgoJuvfVWqQuiXpcvXz5y5MiMGTM2btzYo0ePr7/+WuoSqY6zs/OXX365cOHCOXPmDBo06P777x87dqylntx+B8sIgtB0ER2NRoNdSaVSV1c3a9asyZMnW6ohAkxXVFT0r3/9Kzk5WeqCqFp9fT0RpaamajSazz77bNmyZTNnzpS6UOoiiuJbb73Vo0ePOXPmnD9//oMPPliwYEGXLl0s8uT2G4ShoaFNmyCuXbsWHx8vYXlUS6fTzZw5MyIiYsOGDVKXRY02bdrk5ub297//nYiSk5NdXFz8/f2feuopqculLmFhYbGxscZugtGjRxcVFV2/ft2CTXPQriNHjhw6dKi4uNg4WPTixYsbN25ctWqVRZ7cfoOwf//+Op3u1KlT/fr1q6urO3To0D/+8Q+pC6U6er1+zpw5np6e//3vfxubqcGWZs+enZiYaPw5IyPD09Nz8ODB0hZJhcaOHbtv3z7jzxkZGe7u7r6+vtIWSW00Go0gCIIgGINQr9c7OFgsv+x31CgRvfDCC59++umDDz64c+dOZ2fnXbt2SV0i1XnyySfXrl27YMEC42cuMDBw5cqVUhdKvRYvXuzv749Ro7ZXWVnZv3//KVOmxMfHr127dsmSJU8//bTUhVKXhoaG4cOH+/j4zJo16/z585s3b05NTbVUM6FdByERffPNNykpKbGxsQsXLsSWhLZ34MCB9PT0xl+9vLzuvPNOCcujcgcPHnRxcUlKSpK6IGp0/fr1LVu2VFVV3XzzzRYcpgGmq6+v//TTTzMyMgICAubMmRMREWGpZ7b3IAQAALAq9PoAAICqIQgBAEDVEIQAAKBqCEIAAFA1BCEAAKgaghAAAFTNfleWAQAiysvL++mnn4w/z5s3z8nJqY2DCwsL9+7da/z5jjvucHV1tXr5AOQPQQggpe+++87JyWny5MmtHXDixIm77757wIABrq6ut99+e9tBmJ+f/+677xYXF2dkZEycOBFBCGAKNI0CSGnNmjXr1q1r97Bt27YdPnzY09Oz7cOGDBly+PDhZ5991kKlA1AFBCGAXFVVVZWUlGBxKIBOQhACSGbo0KG//vrrjz/+6Ofn5+fnN3v2bBP/cNu2bV26dPH29g4KCnJzc5s3b55VywmgbOgjBJDMG2+8cf/997u7uxv39PD39zflr86fP79o0aKlS5fed999Tk5O2dnZR44csXJJAZQMQQggmWHDhvn4+Hh7e48fP970vzp58qQgCC+88IKfnx8RxcfHtzHWBgDahaZRAJnp27cvz/MzZsz48MMPr1+/LnVxAGQPQQggM7169friiy+qq6sXLlwYHBw8fPjwAwcOSF0oABlDEALIz+23337ixInCwsItW7bU1NRMmTIlPz9f6kIByBWCEEBKHh4edXV1Hfvb0NDQBQsWbNy4sa6uLi0tzbIFA1APBCGAlBITE1NTU7/44ovffvstIyPDlD/59NNP33jjjYyMDL1eX1xcvHnzZkdHx969e1u7qABKhVGjAFJ64oknMjIyHnzwwbKyskmTJu3evbvdP2GMvfLKKytWrDD+Gh4evm3btqioKCuXFECxEIQAUgoODv7222/N+pN58+bNnTv3ypUrJSUlfn5+0dHRDg64kAE6DtcPgAz06dOHiIqLi318fIiI5/mYmJiYmJhmh+3du3fq1KmiKEpQRADZ4rBQIYA9q66uzsvLM/4cHx/P823169fU1OTm5hp/jouLQ00RwBQIQgAAUDWMGgUAAFVDEAIAgKohCAEAQNUQhAAAoGr/D2JPDe+UkQIuAAAAAElFTkSuQmCC" />

After plotting the data, the FMU is unloaded and all unpacked data on disc is removed.

unloadFMU(fmu)

Custom Simulation

In the following type of simulation a more advanced variant is presented, which allows intervening more in the simulation process. Analogous to the simple variant, an FMU model must be loaded.

fmu = loadFMU("SpringFrictionPendulum1D", "Dymola", "2022x")
Model name:	SpringFrictionPendulum1D
Type:		1

Next, it is necessary to create an instance of the FMU, this is achieved by the command fmi2Instantiate!().

instanceFMU = fmi2Instantiate!(fmu)
FMU:            SpringFrictionPendulum1D
    InstanceName:   SpringFrictionPendulum1D
    Address:        Ptr{Nothing} @0x000001a485edb8c0
    State:          0
    Logging:        false
    FMU time:       -Inf
    FMU states:     nothing

In the following code block, start and end time for the simulation is set by the fmi2SetupExperiment() command. Next, the FMU is initialized by the calls of fmi2EnterInitializationMode() and fmi2ExitInitializationMode(). It would also be possible to set initial states, parameters or inputs at this place in code.

fmi2SetupExperiment(instanceFMU, tStart, tStop)
# set initial model states
fmi2EnterInitializationMode(instanceFMU)
# get initial model states
fmi2ExitInitializationMode(instanceFMU)
0x00000000

The actual simulation loop is shown in the following block. Here a simulation step fmi2DoStep() with the fixed step size tStep is executed. As indicated in the code by the comments, the input values and output values of the FMU could be changed in the simulation loop as desired, whereby the higher possibility of adjustments arises.

values = []

for t in tSave
    # set model inputs if any
    # ...

    fmi2DoStep(instanceFMU, tStep)
    
    # get model outputs
    value = fmi2GetReal(instanceFMU, "mass.s")
    push!(values, value)
end

plot(tSave, values)

<img src="data:image/png;base64,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" />

The instantiated FMU must be terminated and then the memory area for the instance can also be deallocated. The last step is to unload the FMU to remove all unpacked data on disc.

fmi2Terminate(instanceFMU)
fmi2FreeInstance!(instanceFMU)
unloadFMU(fmu)

Summary

The tutorial has shown how to use the default simulation command and how to deploy a custom simulation loop.