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
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
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
and the amount of vapor entering the i-th circuit can be given by
where the factors \(\xi_i\) also must sum to unity. The inlet quality for each circuit is then equal to
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
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