OpenSimula 0.5.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- opensimula/Child.py +19 -0
- opensimula/Component.py +214 -0
- opensimula/Iterative_process.py +47 -0
- opensimula/Message.py +19 -0
- opensimula/Parameter_container.py +80 -0
- opensimula/Parameters.py +755 -0
- opensimula/Project.py +674 -0
- opensimula/Simulation.py +212 -0
- opensimula/Variable.py +37 -0
- opensimula/__init__.py +8 -0
- opensimula/components/Building.py +511 -0
- opensimula/components/Building_surface.py +318 -0
- opensimula/components/Calculator.py +51 -0
- opensimula/components/Construction.py +309 -0
- opensimula/components/Day_schedule.py +64 -0
- opensimula/components/File_data.py +117 -0
- opensimula/components/File_met.py +1035 -0
- opensimula/components/Frame.py +35 -0
- opensimula/components/Glazing.py +122 -0
- opensimula/components/HVAC_DX_equipment.py +210 -0
- opensimula/components/HVAC_DX_system.py +254 -0
- opensimula/components/HVAC_MZW_system.py +554 -0
- opensimula/components/HVAC_SZW_system.py +338 -0
- opensimula/components/HVAC_coil_equipment.py +206 -0
- opensimula/components/HVAC_fan_equipment.py +44 -0
- opensimula/components/HVAC_perfect_system.py +137 -0
- opensimula/components/Material.py +14 -0
- opensimula/components/Opening.py +409 -0
- opensimula/components/Opening_type.py +90 -0
- opensimula/components/Solar_surface.py +114 -0
- opensimula/components/Space.py +388 -0
- opensimula/components/Space_type.py +81 -0
- opensimula/components/Surface.py +129 -0
- opensimula/components/Test_component.py +76 -0
- opensimula/components/Week_schedule.py +30 -0
- opensimula/components/Year_schedule.py +65 -0
- opensimula/components/__init__.py +40 -0
- opensimula/visual_3D/Environment_3D.py +257 -0
- opensimula/visual_3D/Polygon_3D.py +262 -0
- opensimula-0.5.1.dist-info/METADATA +49 -0
- opensimula-0.5.1.dist-info/RECORD +44 -0
- opensimula-0.5.1.dist-info/WHEEL +5 -0
- opensimula-0.5.1.dist-info/licenses/LICENSE +21 -0
- opensimula-0.5.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
from bisect import bisect
|
|
2
|
+
from opensimula.Message import Message
|
|
3
|
+
from opensimula.Parameters import (
|
|
4
|
+
Parameter_int_list,
|
|
5
|
+
Parameter_float_list,
|
|
6
|
+
Parameter_options,
|
|
7
|
+
)
|
|
8
|
+
from opensimula.Component import Component
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Day_schedule(Component):
|
|
12
|
+
def __init__(self, name, project):
|
|
13
|
+
Component.__init__(self, name, project)
|
|
14
|
+
self.parameter("type").value = "Day_schedule"
|
|
15
|
+
self.parameter("description").value = "Time schedule for a day"
|
|
16
|
+
self.add_parameter(Parameter_int_list(
|
|
17
|
+
"time_steps", [3600], "s", min=1))
|
|
18
|
+
self.add_parameter(Parameter_float_list("values", [0, 10]))
|
|
19
|
+
self.add_parameter(
|
|
20
|
+
Parameter_options("interpolation", "STEP", ["STEP", "LINEAR"])
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
def check(self):
|
|
24
|
+
errors = super().check()
|
|
25
|
+
# Test time_steps and values sizes
|
|
26
|
+
if (
|
|
27
|
+
len(self.parameter("time_steps").value)
|
|
28
|
+
!= len(self.parameter("values").value) - 1
|
|
29
|
+
):
|
|
30
|
+
msg = f"Error: {self.parameter('name').value}, time_steps size must be values size minus 1"
|
|
31
|
+
errors.append(Message(msg,"ERROR"))
|
|
32
|
+
|
|
33
|
+
# Test total time steps
|
|
34
|
+
total_time = 0
|
|
35
|
+
for dt in self.parameter("time_steps").value:
|
|
36
|
+
total_time += dt
|
|
37
|
+
if total_time > 24 * 3600:
|
|
38
|
+
msg = f"Error: {self.parameter('name').value}, the sum of the time_steps is greater than one day (86400 s)"
|
|
39
|
+
errors.append(Message(msg,"ERROR"))
|
|
40
|
+
return errors
|
|
41
|
+
|
|
42
|
+
def pre_simulation(self, n_time_steps, delta_t):
|
|
43
|
+
# Create array of periods
|
|
44
|
+
self._periods_ = [0]
|
|
45
|
+
acumulated = 0
|
|
46
|
+
for period in self.parameter("time_steps").value:
|
|
47
|
+
acumulated += period
|
|
48
|
+
self._periods_.append(acumulated)
|
|
49
|
+
self._periods_.append(24 * 3600)
|
|
50
|
+
|
|
51
|
+
def get_value(self, date):
|
|
52
|
+
seconds = date.hour * 3600 + date.minute * 60 + date.second
|
|
53
|
+
index = bisect(self._periods_, seconds)
|
|
54
|
+
if self.parameter("interpolation").value == "LINEAR":
|
|
55
|
+
x_i = self._periods_[index - 1]
|
|
56
|
+
x_f = self._periods_[index]
|
|
57
|
+
y_i = self.parameter("values").value[index - 1]
|
|
58
|
+
if index < len(self.parameter("values").value):
|
|
59
|
+
y_f = self.parameter("values").value[index]
|
|
60
|
+
else:
|
|
61
|
+
y_f = self.parameter("values").value[0]
|
|
62
|
+
return (seconds - x_i) / (x_f - x_i) * (y_f - y_i) + y_i
|
|
63
|
+
else:
|
|
64
|
+
return self.parameter("values").value[index - 1]
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import pandas as pd
|
|
2
|
+
import datetime as dt
|
|
3
|
+
import numpy as np
|
|
4
|
+
import math
|
|
5
|
+
from opensimula.Message import Message
|
|
6
|
+
from opensimula.Parameters import Parameter_string, Parameter_options, Parameter_int
|
|
7
|
+
from opensimula.Component import Component
|
|
8
|
+
from opensimula.Variable import Variable
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class File_data(Component):
|
|
12
|
+
def __init__(self, name, project):
|
|
13
|
+
Component.__init__(self, name, project)
|
|
14
|
+
self.parameter("type").value = "File_data"
|
|
15
|
+
self.parameter("description").value = "Data file with varables"
|
|
16
|
+
self.add_parameter(Parameter_string("file_name", "data.csv"))
|
|
17
|
+
self.add_parameter(Parameter_options(
|
|
18
|
+
"file_type", "CSV", ["CSV", "EXCEL"]))
|
|
19
|
+
self.add_parameter(Parameter_options(
|
|
20
|
+
"file_step", "SIMULATION", ["SIMULATION", "OWN"]))
|
|
21
|
+
self.add_parameter(Parameter_string(
|
|
22
|
+
"initial_time", "01/01/2001 00:00:00"))
|
|
23
|
+
self.add_parameter(Parameter_int("time_step", 3600, "s", min=1))
|
|
24
|
+
self._df_ = pd.DataFrame()
|
|
25
|
+
|
|
26
|
+
def check(self):
|
|
27
|
+
errors = super().check()
|
|
28
|
+
if self.parameter("file_step").value == "OWN": # Check initial time
|
|
29
|
+
try:
|
|
30
|
+
dt.datetime.strptime(self.parameter("initial_time").value, "%d/%m/%Y %H:%M:%S")
|
|
31
|
+
except ValueError:
|
|
32
|
+
msg = f"Error in component: {self.parameter('name').value}, initial_time: {self.parameter('initial_time').value} does not match format (dd/mm/yyyy HH:MM:SS)"
|
|
33
|
+
errors.append(Message(msg, "ERROR"))
|
|
34
|
+
|
|
35
|
+
# Read the file
|
|
36
|
+
try:
|
|
37
|
+
if self.parameter("file_type").value == "CSV":
|
|
38
|
+
self._df_ = pd.read_csv(self.parameter("file_name").value)
|
|
39
|
+
elif self.parameter("file_type").value == "EXCEL":
|
|
40
|
+
self._df_ = pd.read_excel(self.parameter("file_name").value)
|
|
41
|
+
# Create Variable
|
|
42
|
+
for col in self._df_.columns:
|
|
43
|
+
self.add_variable(Variable(self._extract_name_(
|
|
44
|
+
col), unit=self._extract_unit_(col)))
|
|
45
|
+
|
|
46
|
+
except Exception as ex:
|
|
47
|
+
if type(ex).__name__ == "FileNotFoundError":
|
|
48
|
+
msg = f"Error in component: {self.parameter('name').value}, No such file: {self.parameter('file_name').value}"
|
|
49
|
+
errors.append(Message(msg, "ERROR"))
|
|
50
|
+
else:
|
|
51
|
+
msg = f"Error in component: {self.parameter('name').value}, error reading file: {self.parameter('file_name').value}"
|
|
52
|
+
errors.append(Message(msg, "ERROR"))
|
|
53
|
+
return errors
|
|
54
|
+
|
|
55
|
+
def pre_simulation(self, n_time_steps, delta_t):
|
|
56
|
+
super().pre_simulation(n_time_steps, delta_t)
|
|
57
|
+
|
|
58
|
+
self.data_array = self._df_.to_numpy()
|
|
59
|
+
|
|
60
|
+
if self.parameter("file_step").value == "SIMULATION":
|
|
61
|
+
i = 0
|
|
62
|
+
k = 0
|
|
63
|
+
n = len(self._df_)
|
|
64
|
+
for key, var in self._variables_.items():
|
|
65
|
+
for j in range(n_time_steps):
|
|
66
|
+
var.values[j] = self.data_array[k][i]
|
|
67
|
+
k = k + 1
|
|
68
|
+
if k == n:
|
|
69
|
+
k = 0
|
|
70
|
+
i = i + 1
|
|
71
|
+
elif self.parameter("file_step").value == "OWN":
|
|
72
|
+
n = len(self._df_)
|
|
73
|
+
self._initial_date_ = dt.datetime.strptime(
|
|
74
|
+
self.parameter("initial_time").value, "%d/%m/%Y %H:%M:%S")
|
|
75
|
+
delta_t = self.parameter("time_step").value
|
|
76
|
+
date = self._initial_date_
|
|
77
|
+
self.dates = np.empty(n, dtype=object)
|
|
78
|
+
for i in range(n):
|
|
79
|
+
self.dates[i] = date
|
|
80
|
+
date = date + dt.timedelta(0, delta_t)
|
|
81
|
+
|
|
82
|
+
def pre_iteration(self, time_index, date, daylight_saving):
|
|
83
|
+
super().pre_iteration(time_index, date, daylight_saving)
|
|
84
|
+
if self.parameter("file_step").value == "OWN":
|
|
85
|
+
i, j, f = self._get_interpolation_tuple_(date)
|
|
86
|
+
k = 0
|
|
87
|
+
for key, var in self._variables_.items():
|
|
88
|
+
var.values[time_index] = self.data_array[i][k] * \
|
|
89
|
+
(1 - f) + self.data_array[j][k] * f
|
|
90
|
+
k = k + 1
|
|
91
|
+
|
|
92
|
+
def _extract_name_(self, name):
|
|
93
|
+
if name.rfind("[") == -1:
|
|
94
|
+
return name
|
|
95
|
+
else:
|
|
96
|
+
return name[0: name.rfind("[")].strip()
|
|
97
|
+
|
|
98
|
+
def _extract_unit_(self, name):
|
|
99
|
+
if name.rfind("[") == -1:
|
|
100
|
+
return ""
|
|
101
|
+
else:
|
|
102
|
+
return name[name.rfind("[") + 1: name.rfind("]")].strip()
|
|
103
|
+
|
|
104
|
+
def _get_interpolation_tuple_(self, date):
|
|
105
|
+
seconds = (date-self._initial_date_).total_seconds()
|
|
106
|
+
index = seconds / self.parameter("time_step").value
|
|
107
|
+
n = len(self._df_)
|
|
108
|
+
if index < 0:
|
|
109
|
+
index = 0
|
|
110
|
+
elif index >= n:
|
|
111
|
+
index = n-1
|
|
112
|
+
i = math.floor(index)
|
|
113
|
+
j = i + 1
|
|
114
|
+
if j >= n:
|
|
115
|
+
j = n-1
|
|
116
|
+
f = index - i
|
|
117
|
+
return (i, j, f)
|