Source code for cea.technologies.heating_coils

# -*- coding: utf-8 -*-
"""
Heating and cooling coils of Air handling units
"""
from __future__ import division
import scipy.optimize as sopt
import scipy
import numpy as np

__author__ = "Jimeno A. Fonseca"
__copyright__ = "Copyright 2015, Architecture and Building Systems - ETH Zurich"
__credits__ = ["Jimeno A. Fonseca"]
__license__ = "MIT"
__version__ = "0.1"
__maintainer__ = "Daren Thomas"
__email__ = "cea@arch.ethz.ch"
__status__ = "Production"


[docs]def calc_heating_coil(Qhsf, Qhsf_0, Ta_sup_hs, Ta_re_hs, Ths_sup_0, Ths_re_0, ma_sup_hs, ma_sup_0,Ta_sup_0, Ta_re_0, Cpa, gv): tasup = Ta_sup_hs + 273 tare = Ta_re_hs + 273 tsh0 = Ths_sup_0 + 273 trh0 = Ths_re_0 + 273 mCw0 = Qhsf_0 / (tsh0 - trh0) # log mean temperature at nominal conditions TD10 = Ta_sup_0 - trh0 TD20 = Ta_re_0 - tsh0 LMRT0 = (TD10 - TD20) / scipy.log(TD20 / TD10) UA0 = Qhsf_0 / LMRT0 if Qhsf > 0 and ma_sup_hs > 0: AUa = UA0 * (ma_sup_hs / ma_sup_0) ** 0.77 NTUc = AUa / (ma_sup_hs * Cpa * 1000) ec = 1 - scipy.exp(-NTUc) tc = (tare - tasup + tasup * ec) / ec # contact temperature of coil # minimum LMRT = abs((tsh0 - trh0) / scipy.log((tsh0 - tc) / (trh0 - tc))) k1 = 1 / mCw0 def fh(x): Eq = mCw0 * k2 - Qhsf_0 * (k2 / (scipy.log((x + k2 - tc) / (x - tc)) * LMRT)) return Eq k2 = Qhsf * k1 try: result = sopt.newton(fh, trh0, maxiter=1000, tol=0.01).real - 273 except RuntimeError: print (Qhsf, Qhsf_0, Ta_sup_hs, Ta_re_hs, Ths_sup_0, Ths_re_0, ma_sup_hs, ma_sup_0,Ta_sup_0, Ta_re_0) result = sopt.bisect(fh, 0, 350, xtol=0.01, maxiter=500).real - 273 trh = result tsh = trh + k2 mcphs = Qhsf / (tsh - trh) else: tsh = trh = mcphs = 0 # return floats with numpy function. Needed when np.vectorize is use to call this function return np.float(tsh), np.float(trh), np.float(mcphs) # C,C, W/C
[docs]def calc_cooling_coil(Qcsf, Qcsf_0, Ta_sup_cs, Ta_re_cs, Tcs_sup_0, Tcs_re_0, ma_sup_cs, ma_sup_0, Ta_sup_0, Ta_re_0,Cpa, gv): # Initialize temperatures tasup = Ta_sup_cs + 273 tare = Ta_re_cs + 273 tsc0 = Tcs_sup_0 + 273 trc0 = Tcs_re_0 + 273 mCw0 = Qcsf_0 / (tsc0 - trc0) # log mean temperature at nominal conditions TD10 = Ta_sup_0 - trc0 TD20 = Ta_re_0 - tsc0 LMRT0 = (TD20 - TD10) / scipy.log(TD20 / TD10) UA0 = Qcsf_0 / LMRT0 if Qcsf < -0 and ma_sup_cs > 0: AUa = UA0 * (ma_sup_cs / ma_sup_0) ** 0.77 NTUc = AUa / (ma_sup_cs * Cpa * 1000) ec = 1 - scipy.exp(-NTUc) tc = (tare - tasup + tasup * ec) / ec # contact temperature of coil def fh(x): TD1 = tc - (k2 + x) TD2 = tc - x LMRT = (TD2 - TD1) / scipy.log(TD2 / TD1) Eq = mCw0 * k2 - Qcsf_0 * (LMRT / LMRT0) return Eq k2 = -Qcsf / mCw0 try: result = sopt.newton(fh, trc0, maxiter=1000, tol=0.01) - 273 except RuntimeError: print('Newton optimization failed in cooling coil, using slower bisect algorithm...') try: result = sopt.bisect(fh, 0, 350, xtol=0.01, maxiter=500) - 273 except RuntimeError: print ('Bisect optimization also failed in cooing coil, using sample:') #if Ta_sup_cs == Ta_re_cs: # print 'Ta_sup_cs == Ta_re_cs:', Ta_sup_cs tsc = result.real trc = tsc + k2 #Control system check - close to optimal flow min_AT = 5 # Its equal to 10% of the mass flowrate tsc_min = Tcs_sup_0 # to consider coolest source possible trc_max = Tcs_re_0 tsc_max = 12 AT = tsc - trc if AT < min_AT: if tsc < tsc_min: tsc = tsc_min trc = tsc_min + min_AT if tsc > tsc_max: tsc = tsc_max trc = tsc_max + min_AT else: trc = tsc + min_AT elif tsc > tsc_max or trc > trc_max or tsc < tsc_min: trc = trc_max tsc = tsc_max mcpcs = Qcsf / (tsc - trc) else: tsc = trc = mcpcs = 0 # return floats with numpy function. Needed when np.vectorize is use to call this function return np.float(tsc), np.float(trc), np.float(mcpcs) # C,C, W/C