Source code for honeybee_energy.ventcool.crack

# coding=utf-8
"""Definition of surface crack for multizone airflow."""
from __future__ import division

from honeybee._lockable import lockable
from honeybee.typing import float_in_range, float_positive


[docs]@lockable class AFNCrack(object): """Airflow leakage through surface due to cracks or porous surface material. Note that this whole class only has bearing on the simulation when the Model that the AFNCrack is a part of has its ventilation_simulation_control set for MultiZone air flow, thereby triggering the use of the AirflowNetwork. Args: flow_coefficient: A number in kg/s-m at 1 Pa per meter of crack length at the conditions defined in the ReferenceCrack condition; required to run an AirflowNetwork simulation. Some common values for this coefficient from the DesignBuilder Cracks template include the following: * 0.00001 - Tight low-leakage external wall * 0.001 - Tight, low-leakage internal wall * 0.0004 - Poor, high-leakage external wall * 0.019 - Poor, high-leakage internal wall flow_exponent: An optional dimensionless number between 0.5 and 1 used to calculate the crack mass flow rate; required to run an AirflowNetwork simulation. This value represents the leak geometry impact on airflow, with 0.5 generally corresponding to turbulent orifice flow and 1 generally corresponding to laminar flow. The default of 0.65 is representative of many cases of wall and window leakage, used when the exponent cannot be measured. (Default: 0.65). Properties: * flow_coefficient * flow_exponent """ __slots__ = ('_flow_coefficient', '_flow_exponent', '_locked') def __init__(self, flow_coefficient, flow_exponent=0.65): """Initialize AFNCrack.""" self.flow_coefficient = flow_coefficient self.flow_exponent = flow_exponent @property def flow_coefficient(self): """Get or set the air mass flow coefficient defined at the reference crack.""" return self._flow_coefficient @flow_coefficient.setter def flow_coefficient(self, value): self._flow_coefficient = float_positive(value, 'flow_coefficient') @property def flow_exponent(self): """Get or set the air mass flow exponent for the surface crack.""" return self._flow_exponent @flow_exponent.setter def flow_exponent(self, value): self._flow_exponent = float_in_range(value, 0.5, 1.0, 'flow_exponent')
[docs] @classmethod def from_dict(cls, data): """Create a AFNCrack object from a dictionary. Args: data: A AFNCrack dictionary following the format below. .. code-block:: python { "type": "AFNCrack", "flow_coefficient": 0.01 # coefficient at reference crack "flow_exponent": 0.65 # exponent for the surface crack } """ assert data['type'] == 'AFNCrack', \ 'Expected AFNCrack dictionary. Got {}.'.format(data['type']) assert 'flow_coefficient' in data, 'The flow_coefficient must be defined to ' \ 'create a AFNCrack object.' air_coeff = data['flow_coefficient'] air_exp = data['flow_exponent'] if 'flow_exponent' in data \ and data['flow_exponent'] is not None else 0.65 return cls(air_coeff, air_exp)
[docs] def to_dict(self): """AFNCrack dictionary representation.""" base = {'type': 'AFNCrack'} base['flow_coefficient'] = self.flow_coefficient base['flow_exponent'] = self.flow_exponent return base
[docs] def duplicate(self): """Get a copy of this object.""" return self.__copy__()
def __copy__(self): return AFNCrack( self.flow_coefficient, self.flow_exponent) def __key(self): """A tuple based on the object properties, useful for hashing.""" return (self.flow_coefficient, self.flow_exponent) def __hash__(self): return hash(self.__key()) def __eq__(self, other): return isinstance(other, AFNCrack) and self.__key() == other.__key() def __ne__(self, other): return not self.__eq__(other)
[docs] def ToString(self): """Overwrite .NET ToString.""" return self.__repr__()
def __repr__(self): return 'AFNCrack: [coefficient: {}] [exponent: {}]'.format( self.flow_coefficient, self.flow_exponent)