def test_translate_simulate(self): ''' Tests the :mod:`buildingspy.simulate.Simulator.translate` and the :mod:`buildingspy.simulate.Simulator.simulate_translated` method. ''' import numpy as np from buildingspy.io.outputfile import Reader s = Simulator("MyModelicaLibrary.MyModel", "dymola", packagePath=self._packagePath) s.addModelModifier( "redeclare Modelica.Blocks.Sources.Step source(offset=-0.1, height=1.1, startTime=0.5)" ) s.setStartTime(-1) s.setStopTime(5) s.setTimeOut(600) s.setTolerance(1e-4) s.setSolver("dassl") s.setNumberOfIntervals(50) s.setResultFile("myResults") s.translate() s.simulate_translated() # Read the result and test their validity outDir = s.getOutputDirectory() resultFile = os.path.abspath(os.path.join(outDir, "myResults.mat")) r = Reader(resultFile, "dymola") np.testing.assert_allclose(1.0, r.max('source.y')) np.testing.assert_allclose(-0.1, r.min('source.y')) np.testing.assert_allclose(0.725, r.mean('source.y')) np.testing.assert_allclose(0.725 * 6, r.integral('source.y')) # Delete output files s.deleteOutputFiles() s.deleteLogFiles() # Make another simulation, but now the start time is at -2, and the height is 2.1 s.setStartTime(-2) s.addParameters({'source.height': 2.1}) s.simulate_translated() outDir = s.getOutputDirectory() resultFile = os.path.abspath(os.path.join(outDir, "myResults.mat")) r = Reader(resultFile, "dymola") np.testing.assert_allclose(2.0, r.max('source.y')) np.testing.assert_allclose(-0.1, r.min('source.y')) np.testing.assert_allclose(1.25, r.mean('source.y')) np.testing.assert_allclose(7 * 1.25, r.integral('source.y')) # clean up translate temporary dir s.deleteOutputFiles() s.deleteLogFiles() s.deleteTranslateDirectory()
def _simulate(spec): import os from buildingspy.simulate.Simulator import Simulator if not spec["simulate"]: return wor_dir = create_working_directory() out_dir = os.path.join(wor_dir, "simulations", spec["name"]) os.makedirs(out_dir) # Update MODELICAPATH to get the right library version os.environ["MODELICAPATH"] = ":".join([spec['lib_dir'], out_dir]) # Copy the models # print("Copying models from {} to {}".format(CWD, wor_dir)) shutil.copytree(os.path.join(CWD, "VAVMultiZone"), os.path.join(wor_dir, "VAVMultiZone")) # Change the working directory so that the right checkout is loaded os.chdir(os.path.join(wor_dir, "VAVMultiZone")) # Write git information if the simulation is based on a github checkout if 'git' in spec: with open(os.path.join(out_dir, "version.txt"), "w+") as text_file: text_file.write("branch={}\n".format(spec['git']['branch'])) text_file.write("commit={}\n".format(spec['git']['commit'])) s = Simulator(spec["model"], "dymola", outputDirectory=out_dir) s.addPreProcessingStatement("OutputCPUtime:= true;") s.addPreProcessingStatement("Advanced.ParallelizeCode = false;") # s.addPreProcessingStatement("Advanced.EfficientMinorEvents = true;") if not 'solver' in spec: s.setSolver("Cvode") if 'parameters' in spec: s.addParameters(spec['parameters']) s.setStartTime(spec["start_time"]) s.setStopTime(spec["stop_time"]) s.setTolerance(1E-5) s.showGUI(False) print("Starting simulation in {}".format(out_dir)) s.simulate() # Copy results back res_des = os.path.join(CWD, "simulations", spec["name"]) if os.path.isdir(res_des): shutil.rmtree(res_des) print("Copying results to {}".format(res_des)) shutil.move(out_dir, res_des) # Delete the working directory shutil.rmtree(wor_dir)
def test_translate_simulate(self): """ Tests the :mod:`buildingspy.simulate.Simulator.translate` and the :mod:`buildingspy.simulate.Simulator.simulate_translated` method. """ import numpy as np from buildingspy.io.outputfile import Reader s = Simulator("MyModelicaLibrary.MyModel", "dymola", packagePath=self._packagePath) s.addModelModifier( "redeclare Modelica.Blocks.Sources.Step source(offset=-0.1, height=1.1, startTime=0.5)") s.setStartTime(-1) s.setStopTime(5) s.setTimeOut(600) s.setTolerance(1e-4) s.setSolver("dassl") s.setNumberOfIntervals(50) s.setResultFile("myResults") s.translate() s.simulate_translated() # Read the result and test their validity outDir = s.getOutputDirectory() resultFile = os.path.abspath(os.path.join(outDir, "myResults.mat")) r = Reader(resultFile, "dymola") np.testing.assert_allclose(1.0, r.max('source.y')) np.testing.assert_allclose(-0.1, r.min('source.y')) np.testing.assert_allclose(0.725, r.mean('source.y')) np.testing.assert_allclose(0.725 * 6, r.integral('source.y')) # Delete output files s.deleteOutputFiles() s.deleteLogFiles() # Make another simulation, but now the start time is at -2, and the height is 2.1 s.setStartTime(-2) s.addParameters({'source.height': 2.1}) s.simulate_translated() outDir = s.getOutputDirectory() resultFile = os.path.abspath(os.path.join(outDir, "myResults.mat")) r = Reader(resultFile, "dymola") np.testing.assert_allclose(2.0, r.max('source.y')) np.testing.assert_allclose(-0.1, r.min('source.y')) np.testing.assert_allclose(1.25, r.mean('source.y')) np.testing.assert_allclose(7 * 1.25, r.integral('source.y')) # clean up translate temporary dir s.deleteOutputFiles() s.deleteLogFiles() s.deleteTranslateDirectory()
def test_addMethods(self): ''' Tests the various add methods. ''' import numpy as np from buildingspy.io.outputfile import Reader s = Simulator("MyModelicaLibrary.MyModel", "dymola", packagePath=self._packagePath) s.addPreProcessingStatement("Advanced.StoreProtectedVariables:= true;") s.addPostProcessingStatement( "Advanced.StoreProtectedVariables:= false;") s.addModelModifier( "redeclare Modelica.Blocks.Sources.Step source(offset=-0.1, height=1.1, startTime=0.5)" ) s.setStartTime(-1) s.setStopTime(5) s.setTimeOut(600) s.setTolerance(1e-4) s.setSolver("dassl") s.setNumberOfIntervals(50) s.setResultFile("myResults") s.exitSimulator(True) # s.deleteOutputFiles() s.showGUI(False) # s.printModelAndTime() s.showProgressBar(False) s.simulate() # Read the result and test their validity outDir = s.getOutputDirectory() resultFile = os.path.abspath(os.path.join(outDir, "myResults.mat")) r = Reader(resultFile, "dymola") np.testing.assert_allclose(1.0, r.max('source.y')) np.testing.assert_allclose(0.725, r.mean('source.y')) np.testing.assert_allclose(0.725 * 6, r.integral('source.y')) np.testing.assert_allclose(-0.1, r.min('source.y')) # Delete output files s.deleteOutputFiles() s.deleteLogFiles()
def test_addMethods(self): ''' Tests the various add methods. ''' import os import numpy as np from buildingspy.io.outputfile import Reader s = Simulator("MyModelicaLibrary.MyModel", "dymola") s.addPreProcessingStatement("Advanced.StoreProtectedVariables:= true;") s.addPostProcessingStatement("Advanced.StoreProtectedVariables:= false;") s.addModelModifier('redeclare Modelica.Blocks.Sources.Step source(offset=-0.1, height=1.1, startTime=0.5)') s.setStartTime(-1) s.setStopTime(5) s.setTimeOut(600) s.setTolerance(1e-4) s.setSolver("dassl") s.setNumberOfIntervals(50) s.setResultFile("myResults") s.exitSimulator(True) s.deleteOutputFiles() s.showGUI(False) # s.printModelAndTime() s.showProgressBar(False) s.simulate() # Read the result and test their validity outDir = s.getOutputDirectory() resultFile = os.path.abspath(os.path.join(outDir, "myResults.mat")) r=Reader(resultFile, "dymola") np.testing.assert_allclose(1.0, r.max('source.y')) np.testing.assert_allclose(0.725, r.mean('source.y')) np.testing.assert_allclose(0.725*6, r.integral('source.y')) np.testing.assert_allclose(-0.1, r.min('source.y')) # Delete output files s.deleteOutputFiles() s.deleteLogFiles()
def _profile_dymola(result): ''' Run simulation with dymola. The function returns CPU time used for compile and simulation. ''' import datetime import time from buildingspy.simulate.Simulator import Simulator from buildingspy.io.outputfile import Reader model=result['model'] modelName = model.split(".")[-1] worDir = create_working_directory() # Update MODELICAPATH to get the right library version s=Simulator(model, "dymola", outputDirectory=worDir) s.setSolver(result['solver']) s.setStartTime(result['start_time']) s.setStopTime(result['stop_time']) s.setTolerance(result['tolerance']) timeout = result['timeout'] if float(timeout) > 0.01: s.setTimeOut(timeout) tstart_tr = datetime.datetime.now() s.simulate() tend_tr = datetime.datetime.now() # total time tTotTim = (tend_tr-tstart_tr).total_seconds() resultFile = os.path.join(worDir, "{}.mat".format(modelName)) # In case of timeout or error, the output file may not exist if not os.path.exists(resultFile): shutil.rmtree(worDir) return {'tTra': 0, 'tCPU': 0, 'nTimeEvent': 0, 'nStateEvent': 0, 'nStepEvent': 0} r=Reader(resultFile, "dymola") tCPU=r.max("CPUtime") tTra = tTotTim-tCPU nEve=r.max('EventCounter') eveLog = N.zeros(3) searchEve = list() searchEve.append("Number of (model) time events :") searchEve.append("Number of time events :") searchEve.append("Number of step events :") # ------ search and retrieve times from compile log file ------ with open(os.path.join(worDir,'dslog.txt'), "r") as f: for line in f: for index, strLin in enumerate(searchEve): if strLin in line: sect1 = line.split(": ") sect2 = sect1[1].split("\n") eveLog[index] = sect2[0] f.close() shutil.rmtree(worDir) return {'tTra': float(tTra), 'tCPU': float(tCPU), 'nTimeEvent': float(eveLog[0]), 'nStateEvent': float(eveLog[1]), 'nStepEvent': float(eveLog[2])}