Examples¶
Simulating a model with two different parameter values¶
This module provides an example that illustrates the use of the python to run a Modelica simulation.
The module
buildingspy.simulate.Simulator
that can be used to automate running simulations.
For example, to translate and simulate the model
Buildings.Controls.Continuous.Examples.PIDHysteresis.mo
with controller parameters con.eOn = 1
and con.eOn = 5
, use
the following commands:
from multiprocessing import Pool
import buildingspy.simulate.Simulator as si
# Function to set common parameters and to run the simulation
def simulateCase(s):
''' Set common parameters and run a simulation.
:param s: A simulator object.
'''
s.setStopTime(86400)
# Kill the process if it does not finish in 1 minute
s.setTimeOut(60)
s.showProgressBar(False)
s.printModelAndTime()
s.simulate()
def main():
''' Main method that configures and runs all simulations
'''
import shutil
# Build list of cases to run
li = []
# First model
model = 'Buildings.Controls.Continuous.Examples.PIDHysteresis'
s = si.Simulator(model, 'dymola', 'case1')
s.addParameters({'con.eOn': 0.1})
li.append(s)
# second model
s = si.Simulator(model, 'dymola', 'case2')
s.addParameters({'con.eOn': 1})
li.append(s)
# Run all cases in parallel
po = Pool()
po.map(simulateCase, li)
# Clean up
shutil.rmtree('case1')
shutil.rmtree('case2')
# Main function
if __name__ == '__main__':
main()
This will run the two test cases and store the results in the directories
case1
and case2
.
Simulating a model with two different parameter values but without recompilation¶
In the above example, the value of the parameter con.eOn
can be
changed after the model has been translated.
To avoid unrequired translations, the functions
buildingspy.simulate.Simulator.translate()
and
buildingspy.simulate.Simulator.simulate_translated()
can
be used to translate a model, and then simulate it with different
parameter values.
The following commands accomplish this:
import buildingspy.simulate.Simulator as si
# Function to set common parameters and to run the simulation
def simulateTranslatedModel(s):
''' Set common parameters and run a simulation
of an already translated model.
:param s: A simulator object that has already been translated.
'''
s.setStopTime(86400)
# Kill the process if it does not finish in 1 minute
s.setTimeOut(60)
s.showProgressBar(False)
s.printModelAndTime()
s.simulate_translated()
def main():
''' Main method that configures and runs all simulations
'''
import copy
import shutil
from multiprocessing import Pool
# Build list of cases to run
li = []
# First model
model = 'Buildings.Controls.Continuous.Examples.PIDHysteresis'
s1 = si.Simulator(model, 'dymola')
s1.setOutputDirectory('case1')
s1.addParameters({'con.eOn': 0.1})
s1.setSolver('dassl')
s1.showGUI(False)
# Translate the model
s1.translate()
# Add the model to the list of models to be simulated
li.append(s1)
# Second model
s2 = copy.deepcopy(s1)
s2.setOutputDirectory('case2')
s2.addParameters({'con.eOn': 1})
li.append(s2)
# Run both models in parallel
po = Pool()
po.map(simulateTranslatedModel, li)
# Clean up
# Clean up
shutil.rmtree('case1')
shutil.rmtree('case2')
s1.deleteTranslateDirectory()
# Main function
if __name__ == '__main__':
main()
Note
If a parameter cannot be changed after
model translation, then
buildingspy.simulate.Simulator.simulate_translated()
will throw an exception.
Plotting of Time Series¶
This module provides an example that illustrates the
use of the python to plot results from a Dymola simulation.
See also the class buildingspy.io.postprocess.Plotter
for more advanced plotting.
The file plotResult.py
illustrates how to plot results from a
Dymola output file. To run the example, proceed as follows:
Open a terminal or dos-shell.
Set the PYTHONPATH environment variables to the directory that contains
`buildingspy`
as a subdirectory, such ascd buildingspy/examples/dymola export PYTHONPATH=${PYTHONPATH}:../../..Type
python plotResult.py
This will execute the script plotResult.py
, which contains
the following instructions:
def main():
''' Main method that plots the results
'''
from buildingspy.io.outputfile import Reader
import matplotlib.pyplot as plt
import os
# Optionally, change fonts to use LaTeX fonts
#from matplotlib import rc
#rc('text', usetex=True)
#rc('font', family='serif')
# Read results
ofr1=Reader(os.path.join("buildingspy", "examples", "dymola", "case1", "PIDHysteresis.mat"), "dymola")
ofr2=Reader(os.path.join("buildingspy", "examples", "dymola", "case2", "PIDHysteresis.mat"), "dymola")
(time1, T1) = ofr1.values("cap.T")
(time1, y1) = ofr1.values("con.y")
(time2, T2) = ofr2.values("cap.T")
(time2, y2) = ofr2.values("con.y")
# Plot figure
fig = plt.figure()
ax = fig.add_subplot(211)
ax.plot(time1/3600, T1-273.15, 'r', label='$T_1$')
ax.plot(time2/3600, T2-273.15, 'b', label='$T_2$')
ax.set_xlabel('time [h]')
ax.set_ylabel('temperature [$^\circ$C]')
ax.set_xticks(range(25))
ax.set_xlim([0, 24])
ax.legend()
ax.grid(True)
ax = fig.add_subplot(212)
ax.plot(time1/3600, y1, 'r', label='$y_1$')
ax.plot(time2/3600, y2, 'b', label='$y_2$')
ax.set_xlabel('time [h]')
ax.set_ylabel('y [-]')
ax.set_xticks(range(25))
ax.set_xlim([0, 24])
ax.legend()
ax.grid(True)
# Save figure to file
plt.savefig('plot.pdf')
plt.savefig('plot.png')
# To show the plot on the screen, uncomment the line below
#plt.show()
# Main function
if __name__ == '__main__':
main()
The script generates the following plot:
