Multi-Circuited Evaporator

In an evaporator, there is always the possibility that the distribution of refrigerant or air may be unequal between the circuits, which usually results in lower evaporator performance. In the case of equal distribution between circuits, the analysis of the Evaporator can be used, otherwise the multi-circuited evaporator is needed. The multi-circuited evaporator (MCE) analyzed as being a set of evaporators, each comprising one circuit, that are then each fed some (not necessarily even) distribution of refrigerant and air. The tubes per banks are distributed among the different circuits. If the tubes per bank is divisible by number of circuits, all the circuits will have the same number of tubes. Otherwise, the circuits are ordered from fewer to more if not evenly distributed.

Mathematical Description

The MCE model is capable of handling the following types of maldistribution:

  • Volumetric air flow mal-distribution
  • Air-side inlet condition mal-distribution
  • Refrigerant mass-flow-per-circuit mal-distribution
  • Refrigerant quality-per-circuit mal-distribution

For the MCE, there are \(N_{circuits}\) circuits, and each circuit is treated as an individual evaporator, since then the analysis for each circuit can be provided by the analysis for the conventional evaporator with one circuit.

For the MCE, the total refrigerant mass flow rate \(\dot m_r\) is known as an input (which arises from the compressor map). The total refrigerant mass flow rate per circuit can be given by

(1)\[\dot m_{r,i} = \gamma _i \dot m_r\]

where \(\gamma_i\) is the mass flow distribution factor for the i-th circuit of the evaporator. The sum of the indices is given by

(2)\[\sum_{i=0}^{N_{circuits}-1}[\gamma_i]=1\]

and if the flow is equally distributed, all the terms \(\gamma_i\) are equal.

If the inlet refrigerant quality is not balanced between circuits, the refrigerant vapor mal-distribution can be given by a set of weighting parameters that distribute refrigerant vapor among the circuits. The total amount of vapor entering the evaporator can be given by

(3)\[\dot m_v=x\dot m_r\]

and the amount of vapor entering the i-th circuit can be given by

(4)\[\dot m_{v,i}=\xi_i \dot m_v\]

where the factors \(\xi_i\) also must sum to unity. The inlet quality for each circuit is then equal to

(5)\[x_i=\frac{\dot m_{v,i}}{\dot m_{r,i}}\]

where all the \(x_i\) values must be greater than zero. The evaporator component model takes enthalpy as the inlet, which can be calculated from

(6)\[h_i=h(p_{evap},x_i)\]

using the CoolProp property routines.

MCE Sample Code

Minimal Component Test:

from __future__ import print_function

from ACHP.FinCorrelations import FinInputs
from ACHP.Evaporator import EvaporatorClass
from ACHP.MultiCircuitEvaporator import MultiCircuitEvaporatorClass
from CoolProp.CoolProp import PropsSI
import numpy as np

FinsTubes=FinInputs()

FinsTubes.Tubes.NTubes_per_bank=32
FinsTubes.Tubes.Ncircuits=5
FinsTubes.Tubes.Nbank=3
FinsTubes.Tubes.Ltube=0.452
FinsTubes.Tubes.OD=0.009525
FinsTubes.Tubes.ID=0.0089154
FinsTubes.Tubes.Pl=0.0254
FinsTubes.Tubes.Pt=0.0219964

FinsTubes.Fins.FPI=14.5
FinsTubes.Fins.Pd=0.001
FinsTubes.Fins.xf=0.001
FinsTubes.Fins.t=0.00011
FinsTubes.Fins.k_fin=237

FinsTubes.Air.Vdot_ha=0.5663
FinsTubes.Air.Tmean=299.8
FinsTubes.Air.Tdb=299.8
FinsTubes.Air.p=101325
FinsTubes.Air.RH=0.51
FinsTubes.Air.RHmean=0.51
FinsTubes.Air.FanPower=438

# This uses the normal baseline evaporator model
Ref = 'R32'
kwargs={'Ref': Ref,
        'mdot_r': 0.0708,
        'psat_r': PropsSI('P','T',282.0,'Q',1.0,Ref),
        'Fins': FinsTubes,
        'FinsType': 'WavyLouveredFins',
        'hin_r': PropsSI('H','T',282.0,'Q',0.15,Ref),
        'Verbosity':0
        }
Evap=EvaporatorClass(**kwargs)
Evap.Calculate()
print('Evap Q=' + str(Evap.Q) + ' W')

#This uses the multi-circuited evaporator model but with no mal-distribution
kwargs={'Ref': Ref,
        'mdot_r': 0.0708,
        'psat_r': PropsSI('P','T',282.0,'Q',1.0,Ref),
        'Fins': FinsTubes,
        'FinsType': 'WavyLouveredFins',
        'hin_r': PropsSI('H','T',282.0,'Q',0.15,Ref),
        'Verbosity':0
        }
MCE=MultiCircuitEvaporatorClass(**kwargs)
MCE.Calculate()
print('MCE Q='+str(MCE.Q)+' W w/o mal-distribution')

#Not exactly the same since
# This uses the multi-circuited evaporator model with mal-distribution of 
# refrigerant, refrigerant quality, and air volumetric flow rate 
kwargs={'Ref': Ref,
        'mdot_r': 0.0708,
        'psat_r': PropsSI('P','T',282.0,'Q',1.0,Ref),
        'mdot_r_coeffs': [0.3,0.2,0.1,0.2,0.2],
        'mdot_v_coeffs': [0.4,0.2,0.1,0.2,0.1],
        'Vdot_ha_coeffs': [0.3,0.2,0.2,0.2,0.1],
        'Fins': FinsTubes,
        'FinsType': 'WavyLouveredFins',
        'hin_r': PropsSI('H','T',282.0,'Q',0.15,Ref),
        'Verbosity':0
        }
MCE=MultiCircuitEvaporatorClass(**kwargs)
MCE.Calculate()
print('MCE Q='+str(MCE.Q)+' W w/ mal-distribution')


#Another way to express air maldirtribution for the last example, 
#using a vector of Vdot_ha and m_dot_r instead of vector of coefficients
FinsTubes.Air.Vdot_ha=0.5663*np.array([0.3,0.2,0.2,0.2,0.1])
kwargs={'Ref': Ref,
        'mdot_r': 0.0708*np.array([0.3,0.2,0.1,0.2,0.2]),
        'mdot_v_coeffs': [0.4,0.2,0.1,0.2,0.1],
        'psat_r': PropsSI('P','T',282.0,'Q',1.0,Ref),
        'Fins': FinsTubes,
        'FinsType': 'WavyLouveredFins',
        'hin_r': PropsSI('H','T',282.0,'Q',0.15,Ref),
        'Verbosity':0
        }
MCE=MultiCircuitEvaporatorClass(**kwargs)
MCE.Calculate()
print('MCE Q='+str(MCE.Q)+' W w/ mal-distribution')

If you open an IPython shell in the root of the documentation (folder Documentation/Web relative to the main trunk), and run the commands below, you should get output similar to

In [1]: %run 'ACHPComponents/ComponentTests/MCETest.py'
Evap Q=15431.23873425192 W
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~/checkouts/readthedocs.org/user_builds/achp/checkouts/latest/Documentation/Web/ACHPComponents/ComponentTests/MCETest.py in <module>()
     56         }
     57 MCE=MultiCircuitEvaporatorClass(**kwargs)
---> 58 MCE.Calculate()
     59 print('MCE Q='+str(MCE.Q)+' W w/o mal-distribution')
     60 

~/checkouts/readthedocs.org/user_builds/achp/conda/latest/lib/python3.5/site-packages/ACHP-1.5-py3.5.egg/ACHP/MultiCircuitEvaporator.py in Calculate(self)
    120             # Make a deep copy to break all the links between the Fins structs
    121             # of each of the evaporator instances
--> 122             ED=copy.deepcopy(EvapDict)
    123             #Create new evaporator instanciated with new deep copied dictionary
    124             E=EvaporatorClass(**ED)

~/checkouts/readthedocs.org/user_builds/achp/conda/latest/lib/python3.5/copy.py in deepcopy(x, memo, _nil)
    153     copier = _deepcopy_dispatch.get(cls)
    154     if copier:
--> 155         y = copier(x, memo)
    156     else:
    157         try:

~/checkouts/readthedocs.org/user_builds/achp/conda/latest/lib/python3.5/copy.py in _deepcopy_dict(x, memo)
    241     memo[id(x)] = y
    242     for key, value in x.items():
--> 243         y[deepcopy(key, memo)] = deepcopy(value, memo)
    244     return y
    245 d[dict] = _deepcopy_dict

~/checkouts/readthedocs.org/user_builds/achp/conda/latest/lib/python3.5/copy.py in deepcopy(x, memo, _nil)
    180                             raise Error(
    181                                 "un(deep)copyable object of type %s" % cls)
--> 182                 y = _reconstruct(x, rv, 1, memo)
    183 
    184     # If is its own copy, don't memoize.

~/checkouts/readthedocs.org/user_builds/achp/conda/latest/lib/python3.5/copy.py in _reconstruct(x, info, deep, memo)
    290     if deep:
    291         args = deepcopy(args, memo)
--> 292     y = callable(*args)
    293     memo[id(x)] = y
    294 

~/checkouts/readthedocs.org/user_builds/achp/conda/latest/lib/python3.5/copyreg.py in __newobj__(cls, *args)
     86 
     87 def __newobj__(cls, *args):
---> 88     return cls.__new__(cls, *args)
     89 
     90 def __newobj_ex__(cls, args, kwargs):

CoolProp/AbstractState.pyx in CoolProp.CoolProp.AbstractState.__cinit__ (CoolProp/CoolProp.cpp:11120)()

TypeError: __cinit__() takes exactly 2 positional arguments (0 given)

If not, first stop should be the Frequently Asked Questions

Component Class Documentation

class ACHP.MultiCircuitEvaporator.MultiCircuitEvaporatorClass(**kwargs)[source]
Calculate()[source]
OutputList()[source]

Return a list of parameters for this component for further output

It is a list of tuples, and each tuple is formed of items:
[0] Description of value [1] Units of value [2] The value itself
Update(**kwargs)[source]