Skip to content

Commit

Permalink
Merge pull request #3543 from karthikeyad-pnnl/issue3492_DirectEvapor…
Browse files Browse the repository at this point in the history
…ativeCooler

Issue3492 direct evaporative cooler
  • Loading branch information
JayHuLBL authored Mar 28, 2024
2 parents 2fc88f9 + 0229f85 commit 972e798
Show file tree
Hide file tree
Showing 47 changed files with 10,467 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
within Buildings.Fluid.Humidifiers.EvaporativeCoolers.Baseclasses;
block DirectCalculations
"Calculates the water vapor mass flow rate of a direct evaporative coolder"

replaceable package Medium = Modelica.Media.Interfaces.PartialMedium
"Medium";

parameter Modelica.Units.SI.Area padAre
"Area of the rigid media evaporative pad";

parameter Modelica.Units.SI.Length dep
"Depth of the rigid media evaporative pad";

parameter Real effCoe[11] = {0.792714, 0.958569, -0.25193, -1.03215, 0.0262659,
0.914869, -1.48241, -0.018992, 1.13137, 0.0327622,
-0.145384}
"Coefficients for evaporative medium efficiency calculation";

Real eff(
final unit="1")
"Evaporative humidifier efficiency";

Buildings.Controls.OBC.CDL.Interfaces.RealInput V_flow(
final unit="m3/s",
displayUnit="m3/s",
final quantity = "VolumeFlowRate")
"Air volume flow rate"
annotation (
Placement(
visible=true,
transformation(
origin={-120,-20},
extent={{-20,-20},{20,20}},
rotation=0),
iconTransformation(
origin={-120,-20},
extent={{-20,-20},{20,20}},
rotation=0)));

Buildings.Controls.OBC.CDL.Interfaces.RealInput TDryBulIn(
final unit="K",
displayUnit="degC",
final quantity="ThermodynamicTemperature")
"Dry bulb temperature of the inlet air"
annotation (Placement(
visible=true,
transformation(
origin={-120,60},
extent={{-20,-20},{20,20}},
rotation=0),
iconTransformation(
origin={-120,20},
extent={{-20,-20},{20,20}},
rotation=0)));

Buildings.Controls.OBC.CDL.Interfaces.RealInput TWetBulIn(
final unit="K",
displayUnit="degC",
final quantity="ThermodynamicTemperature")
"Wet bulb temperature of the inlet air"
annotation (Placement(
visible=true,
transformation(
origin={-120,20},
extent={{-20,-20},{20,20}},
rotation=0),
iconTransformation(
origin={-120,60},
extent={{-20,-20},{20,20}},
rotation=0)));

Buildings.Controls.OBC.CDL.Interfaces.RealInput p(
final unit="Pa",
displayUnit="Pa",
final quantity="AbsolutePressure")
"Pressure"
annotation (Placement(
visible=true,
transformation(
origin={-120,-60},
extent={{-20,-20},{20,20}},
rotation=0),
iconTransformation(
origin={-120,-60},
extent={{-20,-20},{20,20}},
rotation=0)));

Buildings.Controls.OBC.CDL.Interfaces.RealOutput dmWat_flow(
final unit="kg/s",
displayUnit="kg/s",
final quantity="MassFlowRate")
"Water vapor mass flow rate difference between inlet and outlet"
annotation (Placement(
visible=true,
transformation(
origin={120,0},
extent={{-20,-20},{20,20}},
rotation=0),
iconTransformation(
origin={120,0},
extent={{-20,-20},{20,20}},
rotation=0)));

Buildings.Fluid.Humidifiers.EvaporativeCoolers.Baseclasses.Xi_TDryBulTWetBul
XiOut(redeclare package Medium = Medium)
"Water vapor mass fraction at the outlet";

Buildings.Fluid.Humidifiers.EvaporativeCoolers.Baseclasses.Xi_TDryBulTWetBul
XiIn(redeclare package Medium = Medium)
"Water vapor mass fraction at the inlet";

Modelica.Units.SI.Velocity vel
"Air velocity";

Modelica.Units.SI.ThermodynamicTemperature TDryBulOut(
displayUnit="degC")
"Dry bulb temperature of the outlet air";

protected
parameter Medium.ThermodynamicState sta_default=Medium.setState_pTX(
T=Medium.T_default, p=Medium.p_default, X=Medium.X_default)
"Default state of medium";
parameter Modelica.Units.SI.Density rho_default=Medium.density(sta_default)
"Density, used to compute fluid volume";

equation
vel =abs(V_flow)/padAre;
eff = effCoe[1] + effCoe[2]*(dep) + effCoe[3]*(vel) + effCoe[4]*(dep^2) +
effCoe[5]*(vel^2) + effCoe[6]*(dep*vel) + effCoe[7]*(vel*dep^2) +
effCoe[8]*(dep*vel^3) + effCoe[9]*(dep^3*vel) + effCoe[10]*(vel^3*dep^2) +
effCoe[11]*(dep^3*vel^2);
TDryBulOut = TDryBulIn - eff*(TDryBulIn - TWetBulIn);
connect(TDryBulIn, XiIn.TDryBul);
connect(TWetBulIn, XiIn.TWetBul);
connect(p, XiIn.p);
connect(TWetBulIn, XiOut.TWetBul);
connect(p, XiOut.p);
TDryBulOut = XiOut.TDryBul;
dmWat_flow = (XiOut.Xi[1] - XiIn.Xi[1])*V_flow*rho_default;
annotation (Documentation(info="<html>
<p>Block that calculates the water vapor mass flow rate addition in the
direct evaporative cooler component. The calculations are based on the direct
evaporative cooler model in the Engineering Reference document from EnergyPlus v23.1.0.</p>
<p>
The effectiveness of the evaporative media <code>eff</code> is calculated using
the curve</p>
<p align=\"center\" style=\"font-style:italic;\">
eff = effCoe[1] + effCoe[2]*(dep) + effCoe[3]*(vel) + effCoe[4]*(dep<sup>2</sup>) +
effCoe[5]*(vel<sup>2</sup>) + effCoe[6]*(dep*vel) + effCoe[7]*(vel*dep<sup>2</sup>) +
effCoe[8]*(dep*vel<sup>3</sup>) + effCoe[9]*(dep<sup>3</sup>*vel) + effCoe[10]*(vel<sup>3</sup>*dep<sup>2</sup>) +
effCoe[11]*(dep<sup>3</sup>*vel<sup>2</sup>)</p>
<p>
where <code>effCoe</code> is the evaporative efficiency coefficients for the media,
<code>vel</code> is the velocity of the fluid media, and <code>dep</code> is the
depth of the evaporative media.<br>
<code>vel</code> is calculated from the volume flowrate <code>V_flow</code> and
evaporative media cross-sectional area <code>padAre</code> using
</p>
<p align=\"center\" style=\"font-style:italic;\">
vel = V_flow/padAre</p>
<p>
The outlet air drybulb temperature <code>TDryBulOut</code> is calculated using the heat-balance equation
</p>
<p align=\"center\" style=\"font-style:italic;\">
TDryBulOut = TDryBulIn - eff*(TDryBulIn - TWetBulIn)</p>
<p>
where <code>TDryBulIn</code> is the inlet air drybulb temperature and
<code>TWetBulIn</code> is the inlet air wetbulb temperature.<br>
The difference in humidity ratio between the inlet and outlet air is used to
calculate the added mass of water vapor <code>dmWat_flow</code>, with the humidity
ratios being determined from psychrometric relationships, while assuming the
outlet air wetbulb temperature is the same as inlet air wetbulb temperature.
</p>
</html>", revisions="<html>
<ul>
<li>
Semptember 14, 2023 by Cerrina Mouchref, Karthikeya Devaprasad, Lingzhe Wang:<br/>
First implementation.
</li>
</ul>
</html>"), Icon(graphics={ Text(
extent={{-152,144},{148,104}},
textString="%name",
textColor={0,0,255}), Rectangle(extent={{-100,100},{100,-100}},
lineColor={0,0,0},
fillColor={255,255,255},
fillPattern=FillPattern.Solid)}));
end DirectCalculations;
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
within Buildings.Fluid.Humidifiers.EvaporativeCoolers.Baseclasses;
block IndirectWetCalculations
"Calculates the heat transfer in an indirect wet evaporative cooler"

parameter Real maxEff(
displayUnit="1")
"Maximum efficiency of heat exchanger coil";

parameter Real floRat(
displayUnit="1")
"Coil flow efficency ratio of actual to maximum heat transfer rate";

Buildings.Controls.OBC.CDL.Interfaces.RealInput VPri_flow(
final unit="m3/s",
displayUnit="m3/s",
final quantity = "VolumeFlowRate")
"Primary air volume flow rate"
annotation (
Placement(
visible=true,
transformation(
origin={-120,-60},
extent={{-20,-20},{20,20}},
rotation=0),
iconTransformation(
origin={-140,-60},
extent={{-20,-20},{20,20}},
rotation=0)));

Buildings.Controls.OBC.CDL.Interfaces.RealInput VSec_flow(
final unit="m3/s",
displayUnit="m3/s",
final quantity = "VolumeFlowRate")
"Secondary air volume flow rate"
annotation (
Placement(
visible=true,
transformation(
origin={-120,-100},
extent={{-20,-20},{20,20}},
rotation=0),
iconTransformation(
origin={-140,-100},
extent={{-20,-20},{20,20}},
rotation=0)));

Buildings.Controls.OBC.CDL.Interfaces.RealInput TDryBulPriIn(
final unit="K",
displayUnit="degC",
final quantity="ThermodynamicTemperature")
"Dry bulb temperature of the primary inlet air"
annotation (Placement(
visible=true,
transformation(
origin={-120,100},
extent={{-20,-20},{20,20}},
rotation=0),
iconTransformation(
origin={-140,100},
extent={{-20,-20},{20,20}},
rotation=0)));

Buildings.Controls.OBC.CDL.Interfaces.RealInput TWetBulPriIn(
final unit="K",
displayUnit="degC",
final quantity="ThermodynamicTemperature")
"Wet bulb temperature of the primary inlet air"
annotation (Placement(
visible=true,
transformation(
origin={-120,60},
extent={{-20,-20},{20,20}},
rotation=0),
iconTransformation(
origin={-140,60},
extent={{-20,-20},{20,20}},
rotation=0)));

Buildings.Controls.OBC.CDL.Interfaces.RealInput TDryBulSecIn(
final unit="K",
displayUnit="degC",
final quantity="ThermodynamicTemperature")
"Dry bulb temperature of the secondary inlet air"
annotation (Placement(
visible=true,
transformation(
origin={-120,20},
extent={{-20,-20},{20,20}},
rotation=0),
iconTransformation(
origin={-140,20},
extent={{-20,-20},{20,20}},
rotation=0)));

Buildings.Controls.OBC.CDL.Interfaces.RealInput TWetBulSecIn(
final unit="K",
displayUnit="degC",
final quantity="ThermodynamicTemperature")
"Wet bulb temperature of the secondary inlet air"
annotation (Placement(
visible=true,
transformation(
origin={-120,-20},
extent={{-20,-20},{20,20}},
rotation=0),
iconTransformation(
origin={-140,-20},
extent={{-20,-20},{20,20}},
rotation=0)));

Buildings.Controls.OBC.CDL.Interfaces.RealOutput TDryBulPriOut(
displayUnit="degC",
final unit="K",
final quantity="ThermodynamicTemperature")
"Dry bulb temperature of the outlet air"
annotation (Placement(
transformation(
origin={120,0},
extent={{-20,-20},{20,20}},
rotation=0),
iconTransformation(
origin={140,0},
extent={{-20,-20},{20,20}},
rotation=0)));

Real eff(
displayUnit="1")
"Actual efficiency of component";

equation
eff = max((maxEff - floRat*abs(VPri_flow)/abs(VSec_flow)),0);
TDryBulPriOut = TDryBulPriIn - eff*(TDryBulSecIn - TWetBulSecIn);

annotation (defaultComponentName="indWetCal",
Documentation(info="<html>
<p>Block that calculates the water vapor mass flow rate addition in the
direct evaporative cooler component. The calculations are based on the indirect
wet evaporative cooler model in the Engineering Reference document from EnergyPlus
v23.1.0.</p>
<p>
The effective efficiency of the heat exchanger <code>eff</code> is calculated using
the formula</p>
<p align=\"center\" style=\"font-style:italic;\">
eff = max((maxEff - floRat*abs(VPri_flow)/abs(VSec_flow)),0)</p>
<p>
where <code>VPri_flow</code> and <code>VSec_flow</code> are the volume flow
rates of the primary and secondary fluid media respectively. The maximum
efficiency of the heat exchanger <code>maxEff</code> as well as the efficiency-reduction
coil flow ratio <code>floRat</code> are empirically determined for the specific
equipment using experiments.<br>
The outlet primary fluid drybulb temperature <code>TDryBulPriOut</code> is calculated
using the energy-balance equation
</p>
<p align=\"center\" style=\"font-style:italic;\">
TDryBulPriOut = TDryBulPriIn - eff*(TDryBulSecIn - TWetBulSecIn)</p>
<p>
where <code>TDryBulPriIn</code> is the inlet primary fluid drybulb temperature,
<code>TDryBulSecIn</code> is the inlet secondary air drybulb temperature and
<code>TWetBulSecIn</code> is the inlet secondary air wetbulb temperature.
</p>
</html>", revisions="<html>
<ul>
<li>
September 29, 2023 by Karthikeya Devaprasad:<br/>
First implementation.
</li>
</ul>
</html>"), Icon(coordinateSystem(extent={{-120,-120},{120,120}}),
graphics={ Text(
extent={{-150,160},{150,120}},
textString="%name",
textColor={0,0,255}), Rectangle(extent={{-120,120},{120,-120}},
lineColor={0,0,0},
fillColor={255,255,255},
fillPattern=FillPattern.Solid)}),
Diagram(coordinateSystem(extent={{-100,-120},{100,120}})));
end IndirectWetCalculations;
Loading

0 comments on commit 972e798

Please sign in to comment.