Coverage for teaser/logic/buildingobjects/buildingphysics/material.py: 67%
183 statements
« prev ^ index » next coverage.py v7.4.4, created at 2025-04-29 16:01 +0000
« prev ^ index » next coverage.py v7.4.4, created at 2025-04-29 16:01 +0000
1# created June 2015
2# by TEASER4 Development Team
5import re
6import uuid
7import teaser.data.input.material_input_json as material_input
8import teaser.data.output.material_output as material_output
11class Material(object):
12 """Material class
14 This class holds information of Material used for building element layer.
17 Parameters
18 ----------
19 parent : Layer
20 The parent class of this object, the layer the material
21 belongs to. Allows for better control of hierarchical structures. If
22 not None this adds this Material to Layer.material.
23 Default is None
25 Attributes
26 ----------
27 name : str
28 Name of material
29 density : float [kg/m3]
30 Density of material
31 thermal_conduc : float [W/(m*K)]
32 Thermal conductivity of material
33 heat_capac : float [kJ/(kg*K)]
34 Specific heat capacity of material
35 solar_absorp : float [-]
36 Coefficient of absorption of solar short wave
37 ir_emissivity : float [-]
38 Coefficient of longwave emissivity of material
39 transmittance : float [-]
40 Coefficient of transmittance of material
41 thickness_default : float [m]
42 Default value for material thickness
43 thickness_list : list
44 List of usual values for material thickness, float [m]
45 material_id : str(uuid)
46 UUID of material, this is used to have similar behaviour like foreign
47 key in SQL data bases for use in TypeBuildingElements and Material json
49 """
51 def __init__(self, parent=None):
52 """Constructor of Material.
53 """
55 self.parent = parent
56 self._name = ""
57 self._density = 0.0
58 self._thermal_conduc = 0.0
59 self._heat_capac = 0.0
60 self._solar_absorp = 0.0
61 if parent is not None:
62 if type(self.parent.parent).__name__ != "Window":
63 self._solar_absorp = 0.7
64 self._ir_emissivity = 0.9
65 self._transmittance = 0.0
66 self._thickness_default = 0.0
67 self._thickness_list = []
69 self.material_id = str(uuid.uuid1())
71 def load_material_template(self, mat_name, data_class=None):
72 """Material loader.
74 Loads Material specified in the json.
76 Parameters
77 ----------
79 mat_name : str
80 Code list for Material
82 data_class : DataClass()
83 DataClass containing the bindings for TypeBuildingElement and
84 Material (typically this is the data class stored in prj.data,
85 but the user can individually change that. Default is
86 self.parent.parent.parent.parent.data which is data in project
88 """
90 if data_class is None:
91 data_class = self.parent.parent.parent.parent.data
92 else:
93 data_class = data_class
95 material_input.load_material(material=self,
96 mat_name=mat_name,
97 data_class=data_class)
99 def save_material_template(self, data_class):
100 """Material saver.
102 Saves Material specified in the json.
104 Parameters
105 ----------
107 data_class : DataClass()
108 DataClass containing the bindings for TypeBuildingElement and
109 Material (typically this is the data class stored in prj.data,
110 but the user can individually change that. Default is
111 self.parent.parent.parent.parent.data which is data in project
113 """
115 if data_class is None:
116 data_class = self.parent.parent.parent.parent.data
117 else:
118 data_class = data_class
120 material_output.save_material(
121 material=self, data_class=data_class)
123 def modify_material_template(self, data_class):
124 """Material modifier.
126 Modify Material specified in the json.
128 Parameters
129 ----------
131 data_class : DataClass()
132 DataClass containing the bindings for TypeBuildingElement and
133 Material (typically this is the data class stored in prj.data,
134 but the user can individually change that. Default is
135 self.parent.parent.parent.parent.data which is data in project
137 """
139 if data_class is None:
140 data_class = self.parent.parent.parent.parent.data
141 else:
142 data_class = data_class
144 material_output.modify_material(material=self, data_class=data_class)
146 @property
147 def material_id(self):
148 return self.__material_id
150 @material_id.setter
151 def material_id(self, value):
152 self.__material_id = value
154 @property
155 def parent(self):
156 return self.__parent
158 @parent.setter
159 def parent(self, value):
161 if value is not None:
163 ass_error_1 = "Parent has to be an instance of a layer"
165 assert type(value).__name__ == "Layer", ass_error_1
167 self.__parent = value
168 self.__parent.material = self
170 else:
171 self.__parent = None
173 @property
174 def name(self):
175 return self._name
177 @name.setter
178 def name(self, value):
179 if isinstance(value, str):
180 regex = re.compile('[^a-zA-z0-9]')
181 self._name = regex.sub('', value)
182 else:
183 try:
184 value = str(value)
185 regex = re.compile('[^a-zA-z0-9]')
186 self._name = regex.sub('', value)
187 except ValueError:
188 print("Can't convert name to string")
190 @property
191 def thermal_conduc(self):
192 return self._thermal_conduc
194 @thermal_conduc.setter
195 def thermal_conduc(self, value):
197 if isinstance(value, float):
198 pass
199 elif value is None:
200 pass
201 else:
202 try:
203 value = float(value)
204 except:
205 raise ValueError("Can't convert thermal conduction to float")
207 if value is not None:
208 self._thermal_conduc = float(value)
209 if self.parent is not None:
210 if self.parent.parent is not None:
211 if self.parent.thickness is not None and \
212 self.parent.parent.inner_convection is \
213 not None and \
214 self.parent.parent.inner_radiation is \
215 not None and \
216 self.parent.parent.area is not None:
217 self.parent.parent.calc_ua_value()
219 @property
220 def density(self):
221 return self._density
223 @density.setter
224 def density(self, value):
226 if isinstance(value, float):
227 self._density = value
228 elif value is None:
229 self._density = value
230 else:
231 try:
232 value = float(value)
233 self._density = value
234 except:
235 raise ValueError("Can't convert density to float")
237 @property
238 def heat_capac(self):
239 return self._heat_capac
241 @heat_capac.setter
242 def heat_capac(self, value):
244 if isinstance(value, float):
245 self._heat_capac = value
246 elif value is None:
247 self._heat_capac = value
248 else:
249 try:
250 value = float(value)
251 self._heat_capac = value
252 except:
253 raise ValueError("Can't convert heat capacity to float")
255 @property
256 def solar_absorp(self):
257 return self._solar_absorp
259 @solar_absorp.setter
260 def solar_absorp(self, value):
262 if isinstance(value, float):
263 self._solar_absorp = value
264 elif value is None:
265 self._solar_absorp = 0.7
266 else:
267 try:
268 value = float(value)
269 self._solar_absorp = value
270 except:
271 raise ValueError("Can't convert solar absorption to float")
273 @property
274 def ir_emissivity(self):
275 return self._ir_emissivity
277 @ir_emissivity.setter
278 def ir_emissivity(self, value):
280 if isinstance(value, float):
281 self._ir_emissivity = value
282 elif value is None:
283 self._ir_emissivity = 0.9
284 else:
285 try:
286 value = float(value)
287 self._ir_emissivity = value
288 except:
289 raise ValueError("Can't convert emissivity to float")
291 @property
292 def transmittance(self):
293 return self._transmittance
295 @transmittance.setter
296 def transmittance(self, value):
298 if isinstance(value, float):
299 self._transmittance = value
300 elif value is None:
301 self._transmittance = value
302 else:
303 try:
304 value = float(value)
305 self._transmittance = value
306 except:
307 raise ValueError("Can't convert transmittance to float")
309 @property
310 def thickness_default(self):
311 return self._thickness_default
313 @thickness_default.setter
314 def thickness_default(self, value):
316 if isinstance(value, float):
317 self._thickness_default = value
318 elif value is None:
319 pass
320 else:
321 try:
322 value = float(value)
323 except:
324 raise ValueError("Can't convert thickness to float")
326 @property
327 def thickness_list(self):
328 return self._thickness_list
330 @thickness_list.setter
331 def thickness_list(self, value):
333 if value is None:
334 self._thickness_list = []
336 # elif type(value) != list:
337 # raise TypeError("must be list, not ", type(value))
339 else:
340 for i in value:
341 if isinstance(i, float):
342 pass
343 else:
344 try:
345 value = float(value)
346 except:
347 raise ValueError(
348 "Can't convert entry of thickness_list to float")
350 self._thickness_list = value