Source code for teaser.logic.buildingobjects.buildingphysics.material

# created June 2015
# by TEASER4 Development Team


import re
import uuid
import teaser.data.input.material_input_json as material_input
import teaser.data.output.material_output as material_output


[docs] class Material(object): """Material class This class holds information of Material used for building element layer. Parameters ---------- parent : Layer The parent class of this object, the layer the material belongs to. Allows for better control of hierarchical structures. If not None this adds this Material to Layer.material. Default is None Attributes ---------- name : str Name of material density : float [kg/m3] Density of material thermal_conduc : float [W/(m*K)] Thermal conductivity of material heat_capac : float [kJ/(kg*K)] Specific heat capacity of material solar_absorp : float [-] Coefficient of absorption of solar short wave ir_emissivity : float [-] Coefficient of longwave emissivity of material transmittance : float [-] Coefficient of transmittance of material thickness_default : float [m] Default value for material thickness thickness_list : list List of usual values for material thickness, float [m] material_id : str(uuid) UUID of material, this is used to have similar behaviour like foreign key in SQL data bases for use in TypeBuildingElements and Material json """ def __init__(self, parent=None): """Constructor of Material. """ self.parent = parent self._name = "" self._density = 0.0 self._thermal_conduc = 0.0 self._heat_capac = 0.0 self._solar_absorp = 0.0 if parent is not None: if type(self.parent.parent).__name__ != "Window": self._solar_absorp = 0.7 self._ir_emissivity = 0.9 self._transmittance = 0.0 self._thickness_default = 0.0 self._thickness_list = [] self.material_id = str(uuid.uuid1())
[docs] def load_material_template(self, mat_name, data_class=None): """Material loader. Loads Material specified in the json. Parameters ---------- mat_name : str Code list for Material data_class : DataClass() DataClass containing the bindings for TypeBuildingElement and Material (typically this is the data class stored in prj.data, but the user can individually change that. Default is self.parent.parent.parent.parent.data which is data in project """ if data_class is None: data_class = self.parent.parent.parent.parent.data else: data_class = data_class material_input.load_material(material=self, mat_name=mat_name, data_class=data_class)
[docs] def save_material_template(self, data_class): """Material saver. Saves Material specified in the json. Parameters ---------- data_class : DataClass() DataClass containing the bindings for TypeBuildingElement and Material (typically this is the data class stored in prj.data, but the user can individually change that. Default is self.parent.parent.parent.parent.data which is data in project """ if data_class is None: data_class = self.parent.parent.parent.parent.data else: data_class = data_class material_output.save_material( material=self, data_class=data_class)
[docs] def modify_material_template(self, data_class): """Material modifier. Modify Material specified in the json. Parameters ---------- data_class : DataClass() DataClass containing the bindings for TypeBuildingElement and Material (typically this is the data class stored in prj.data, but the user can individually change that. Default is self.parent.parent.parent.parent.data which is data in project """ if data_class is None: data_class = self.parent.parent.parent.parent.data else: data_class = data_class material_output.modify_material(material=self, data_class=data_class)
@property def material_id(self): return self.__material_id @material_id.setter def material_id(self, value): self.__material_id = value @property def parent(self): return self.__parent @parent.setter def parent(self, value): if value is not None: ass_error_1 = "Parent has to be an instance of a layer" assert type(value).__name__ == "Layer", ass_error_1 self.__parent = value self.__parent.material = self else: self.__parent = None @property def name(self): return self._name @name.setter def name(self, value): if isinstance(value, str): regex = re.compile('[^a-zA-z0-9]') self._name = regex.sub('', value) else: try: value = str(value) regex = re.compile('[^a-zA-z0-9]') self._name = regex.sub('', value) except ValueError: print("Can't convert name to string") @property def thermal_conduc(self): return self._thermal_conduc @thermal_conduc.setter def thermal_conduc(self, value): if isinstance(value, float): pass elif value is None: pass else: try: value = float(value) except: raise ValueError("Can't convert thermal conduction to float") if value is not None: self._thermal_conduc = float(value) if self.parent is not None: if self.parent.parent is not None: if self.parent.thickness is not None and \ self.parent.parent.inner_convection is \ not None and \ self.parent.parent.inner_radiation is \ not None and \ self.parent.parent.area is not None: self.parent.parent.calc_ua_value() @property def density(self): return self._density @density.setter def density(self, value): if isinstance(value, float): self._density = value elif value is None: self._density = value else: try: value = float(value) self._density = value except: raise ValueError("Can't convert density to float") @property def heat_capac(self): return self._heat_capac @heat_capac.setter def heat_capac(self, value): if isinstance(value, float): self._heat_capac = value elif value is None: self._heat_capac = value else: try: value = float(value) self._heat_capac = value except: raise ValueError("Can't convert heat capacity to float") @property def solar_absorp(self): return self._solar_absorp @solar_absorp.setter def solar_absorp(self, value): if isinstance(value, float): self._solar_absorp = value elif value is None: self._solar_absorp = 0.7 else: try: value = float(value) self._solar_absorp = value except: raise ValueError("Can't convert solar absorption to float") @property def ir_emissivity(self): return self._ir_emissivity @ir_emissivity.setter def ir_emissivity(self, value): if isinstance(value, float): self._ir_emissivity = value elif value is None: self._ir_emissivity = 0.9 else: try: value = float(value) self._ir_emissivity = value except: raise ValueError("Can't convert emissivity to float") @property def transmittance(self): return self._transmittance @transmittance.setter def transmittance(self, value): if isinstance(value, float): self._transmittance = value elif value is None: self._transmittance = value else: try: value = float(value) self._transmittance = value except: raise ValueError("Can't convert transmittance to float") @property def thickness_default(self): return self._thickness_default @thickness_default.setter def thickness_default(self, value): if isinstance(value, float): self._thickness_default = value elif value is None: pass else: try: value = float(value) except: raise ValueError("Can't convert thickness to float") @property def thickness_list(self): return self._thickness_list @thickness_list.setter def thickness_list(self, value): if value is None: self._thickness_list = [] # elif type(value) != list: # raise TypeError("must be list, not ", type(value)) else: for i in value: if isinstance(i, float): pass else: try: value = float(value) except: raise ValueError( "Can't convert entry of thickness_list to float") self._thickness_list = value