"""
Goals of this part of the examples:
1. Learn how to use the `DymolaAPI`
2. Learn the different result options of the simulation
3. Learn how to convert inputs into the Dymola format
"""
import pathlib
import time
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from ebcpy import DymolaAPI, load_time_series_data, FMU_API
from ebcpy.utils.conversion import convert_tsd_to_modelica_txt
def main(
aixlib_mo,
working_directory=None,
n_cpu=1,
with_plot=True
):
"""
Arguments of this example:
:param str aixlib_mo:
Path to the package.mo of the AixLib.
This example was tested for AixLib version 3.0.0.
:param str working_directory:
Path in which to store the output.
Default is the examples\results folder
:param int n_cpu:
Number of processes to use
:param bool with_plot:
Show the plot at the end of the script. Default is True.
"""
if working_directory is None:
working_directory = pathlib.Path(__file__).parent.joinpath("results")
model_name = "AixLib.Fluid.HeatPumps.ModularReversible.Examples.AirToWater2D_OneRoomRadiator"
dym_api = DymolaAPI(
model_name=model_name,
working_directory=working_directory,
n_cpu=n_cpu,
packages=[aixlib_mo],
show_window=True,
n_restart=-1,
equidistant_output=False,
)
print("Number of variables:", len(dym_api.variables))
print("Number of outputs:", len(dym_api.outputs))
print("Number of inputs:", len(dym_api.inputs))
print("Number of parameters:", len(dym_api.parameters))
print("Number of states:", len(dym_api.states))
print("Fields of DymolaAPISetup", DymolaAPI.get_simulation_setup_fields())
print("Fields of FMU_APISetup", FMU_API.get_simulation_setup_fields())
simulation_setup = {"start_time": 0,
"stop_time": 3600,
"output_interval": 100}
dym_api.set_sim_setup(sim_setup=simulation_setup)
p_el_name = "heaPum.sigBus.PEleMea"
dym_api.result_names = [p_el_name]
dym_api.result_names = [p_el_name, 'timTab.y[1]']
table_name = "myCustomInput"
file_name = pathlib.Path(aixlib_mo).parent.joinpath("Resources", "my_custom_input.txt")
time_index = np.arange(
dym_api.sim_setup.start_time,
dym_api.sim_setup.stop_time,
dym_api.sim_setup.output_interval
)
internal_gains = np.sin(time_index/3600*np.pi) * 1000
tsd_input = pd.DataFrame({"InternalGains": internal_gains}, index=time_index)
filepath = convert_tsd_to_modelica_txt(
tsd=tsd_input,
table_name=table_name,
save_path_file=file_name
)
print("Successfully created Dymola input file at", filepath)
use_modifier = True
if use_modifier:
dym_api.model_name = (
f'{model_name}(\n'
f'timTab(tableOnFile=true,\n'
f'tableName="{table_name}",\n'
f'fileName="{file_name.as_posix()}"))'
)
print(dym_api.model_name)
dym_api.result_names = [p_el_name, 'timTab.y[1]']
result_time_series = dym_api.simulate(
return_option="time_series",
inputs=tsd_input,
table_name=table_name,
file_name=file_name
)
print(type(result_time_series))
print(result_time_series)
result_last_point = dym_api.simulate(
return_option="last_point"
)
print(type(result_last_point))
print(result_last_point)
result_sp = dym_api.simulate(
return_option="savepath"
)
print(result_sp)
result_sp_2 = dym_api.simulate(
return_option="savepath",
savepath=r"D:\00_temp",
result_file_name="anotherResultFile"
)
print(result_sp_2)
file = dym_api.save_for_reproduction(
title="MyDymolaStudy",
files=[result_sp, result_sp_2],
log_message="This is just an example."
)
print("ZIP-File to reproduce all this:", file)
dym_api.close()
tsd_1 = load_time_series_data(result_sp)
tsd_2 = load_time_series_data(result_sp_2)
print("Both .mat's are equal:", all(tsd_1 == tsd_2))
print("Number of points for return option 'time_series':", len(result_time_series.index))
print("Number of points for return option 'savepath':", len(tsd_1.index))
plt.plot(tsd_1[p_el_name], color="blue", label="savepath", marker="^")
plt.plot(result_time_series[p_el_name], color="red", label="time_series", marker="^")
plt.scatter(result_last_point["Time"], result_last_point[p_el_name],
color="black", label="last_point", marker="s", s=100)
plt.legend()
plt.title("Difference in output for different return_options")
plt.figure()
plt.plot(tsd_1['timTab.y[1]'], color="blue")
plt.title("Input of CombiTimeTable 'timTab'")
if with_plot:
plt.show()
if __name__ == '__main__':
main(
aixlib_mo=r"D:\04_git\AixLib\AixLib\package.mo",
n_cpu=1
)