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.
Files changed (44) hide show
  1. opensimula/Child.py +19 -0
  2. opensimula/Component.py +214 -0
  3. opensimula/Iterative_process.py +47 -0
  4. opensimula/Message.py +19 -0
  5. opensimula/Parameter_container.py +80 -0
  6. opensimula/Parameters.py +755 -0
  7. opensimula/Project.py +674 -0
  8. opensimula/Simulation.py +212 -0
  9. opensimula/Variable.py +37 -0
  10. opensimula/__init__.py +8 -0
  11. opensimula/components/Building.py +511 -0
  12. opensimula/components/Building_surface.py +318 -0
  13. opensimula/components/Calculator.py +51 -0
  14. opensimula/components/Construction.py +309 -0
  15. opensimula/components/Day_schedule.py +64 -0
  16. opensimula/components/File_data.py +117 -0
  17. opensimula/components/File_met.py +1035 -0
  18. opensimula/components/Frame.py +35 -0
  19. opensimula/components/Glazing.py +122 -0
  20. opensimula/components/HVAC_DX_equipment.py +210 -0
  21. opensimula/components/HVAC_DX_system.py +254 -0
  22. opensimula/components/HVAC_MZW_system.py +554 -0
  23. opensimula/components/HVAC_SZW_system.py +338 -0
  24. opensimula/components/HVAC_coil_equipment.py +206 -0
  25. opensimula/components/HVAC_fan_equipment.py +44 -0
  26. opensimula/components/HVAC_perfect_system.py +137 -0
  27. opensimula/components/Material.py +14 -0
  28. opensimula/components/Opening.py +409 -0
  29. opensimula/components/Opening_type.py +90 -0
  30. opensimula/components/Solar_surface.py +114 -0
  31. opensimula/components/Space.py +388 -0
  32. opensimula/components/Space_type.py +81 -0
  33. opensimula/components/Surface.py +129 -0
  34. opensimula/components/Test_component.py +76 -0
  35. opensimula/components/Week_schedule.py +30 -0
  36. opensimula/components/Year_schedule.py +65 -0
  37. opensimula/components/__init__.py +40 -0
  38. opensimula/visual_3D/Environment_3D.py +257 -0
  39. opensimula/visual_3D/Polygon_3D.py +262 -0
  40. opensimula-0.5.1.dist-info/METADATA +49 -0
  41. opensimula-0.5.1.dist-info/RECORD +44 -0
  42. opensimula-0.5.1.dist-info/WHEEL +5 -0
  43. opensimula-0.5.1.dist-info/licenses/LICENSE +21 -0
  44. 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)