Source code for eppy.constructions.thermal_properties

# -*- coding: utf-8 -*-
# Copyright (c) 2016 Jamie Bull
# =======================================================================
#  Distributed under the MIT License.
#  (See accompanying file LICENSE or copy at
#  http://opensource.org/licenses/MIT)
# =======================================================================
"""Functions to calculate the thermal properties of constructions and materials.
"""

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

from itertools import product
import warnings


INSIDE_FILM_R = 0.12
OUTSIDE_FILM_R = 0.03


[docs]def rvalue(ddtt): """ R value (m2-K/W) of a construction or material. thickness (m) / conductivity (W/m-K) """ object_type = ddtt.obj[0] if object_type == "Construction": rvalue = INSIDE_FILM_R + OUTSIDE_FILM_R layers = ddtt.obj[2:] field_idd = ddtt.getfieldidd("Outside_Layer") validobjects = field_idd["validobjects"] for layer in layers: found = False for key in validobjects: try: rvalue += ddtt.theidf.getobject(key, layer).rvalue found = True except AttributeError: pass if not found: raise AttributeError("%s material not found in IDF" % layer) elif object_type == "Material": thickness = ddtt.obj[ddtt.objls.index("Thickness")] conductivity = ddtt.obj[ddtt.objls.index("Conductivity")] rvalue = thickness / conductivity elif object_type == "Material:AirGap": rvalue = ddtt.obj[ddtt.objls.index("Thermal_Resistance")] elif object_type == "Material:InfraredTransparent": rvalue = 0 elif object_type == "Material:NoMass": rvalue = ddtt.obj[ddtt.objls.index("Thermal_Resistance")] elif object_type == "Material:RoofVegetation": warnings.warn( "Material:RoofVegetation thermal properties are based on dry soil", UserWarning, ) thickness = ddtt.obj[ddtt.objls.index("Thickness")] conductivity = ddtt.obj[ddtt.objls.index("Conductivity_of_Dry_Soil")] rvalue = thickness / conductivity else: raise AttributeError("%s rvalue property not implemented" % object_type) return rvalue
[docs]def ufactor(ddtt): """ U factor (W/m2-K) of a construction or material. 1 / R value (W/K) """ return 1 / rvalue(ddtt)
[docs]def ufactor_ip(ddtt): """ U factor (BTU/(h °F ft^2)) of a construction or material. 1 / R value (ft^2 °F hr/Btu) """ # quick fix for Santosh. Needs to thought thru mult = 0.076 / 0.429 # base on doing conversion in the table report return ufactor(ddtt) * mult
[docs]def rvalue_ip(ddtt): """return R value in IP units""" # quick fix for Santosh. Needs to thought thru return 1 / ufactor_ip(ddtt)
[docs]def heatcapacity(ddtt): """ Heat capacity (kJ/m2-K) of a construction or material. thickness (m) * density (kg/m3) * specific heat (J/kg-K) * 0.001 """ object_type = ddtt.obj[0] if object_type == "Construction": heatcapacity = 0 layers = ddtt.obj[2:] field_idd = ddtt.getfieldidd("Outside_Layer") validobjects = field_idd["validobjects"] for layer in layers: found = False for key in validobjects: try: heatcapacity += ddtt.theidf.getobject(key, layer).heatcapacity found = True except AttributeError: pass if not found: raise AttributeError("%s material not found in IDF" % layer) elif object_type == "Material": thickness = ddtt.obj[ddtt.objls.index("Thickness")] density = ddtt.obj[ddtt.objls.index("Density")] specificheat = ddtt.obj[ddtt.objls.index("Specific_Heat")] heatcapacity = thickness * density * specificheat * 0.001 elif object_type == "Material:AirGap": heatcapacity = 0 elif object_type == "Material:InfraredTransparent": heatcapacity = 0 elif object_type == "Material:NoMass": warnings.warn( "Material:NoMass materials included in heat capacity calculation", UserWarning, ) heatcapacity = 0 elif object_type == "Material:RoofVegetation": warnings.warn( "Material:RoofVegetation thermal properties are based on dry soil", UserWarning, ) thickness = ddtt.obj[ddtt.objls.index("Thickness")] density = ddtt.obj[ddtt.objls.index("Density_of_Dry_Soil")] specificheat = ddtt.obj[ddtt.objls.index("Specific_Heat_of_Dry_Soil")] heatcapacity = thickness * density * specificheat * 0.001 else: raise AttributeError("%s has no heatcapacity property" % object_type) return heatcapacity