Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue834 modular ahu #1437

Open
wants to merge 67 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
3b18e94
Create new branch, add empty package for modular AHU
martinkremer Jan 9, 2020
8bdd32b
Provide first version of modular ahu.
martinkremer Jan 9, 2020
fe1a9c7
Adapt unit tests. fixes bug in wrong correlation. [skip ci]
martinkremer Jan 9, 2020
17862aa
typo
Mar 18, 2020
e8dae65
add test cases to compare the model based on state machines and the m…
Mar 18, 2020
ab302ba
Fixing some bugs. Adding example for cooling to dewpoint if dehumidif…
martinkremer Mar 23, 2020
193efba
adds PartialHumidifier [ci skip]
martinkremer Apr 15, 2020
544fdb1
changes limitation in plateheatexchanger [ci skip]
martinkremer Apr 15, 2020
cd4281f
WIP: adds modular AHU [ci skip]
martinkremer Apr 15, 2020
dcdffe6
adds simple fan model, adds output of heat flow to hea, hum, coo [ski…
martinkremer Apr 15, 2020
9d9941b
updates modular air handling unit For #834 [skip ci]
martinkremer Apr 15, 2020
822bf23
move two connections into an "if" condition and add visibility options
Oct 29, 2020
d22255e
correct connection
Oct 29, 2020
f040326
move two connections into an "if" condition and add visibility option…
Oct 29, 2020
4681361
[skip ci] Updates UnitTests and removes bug in PartialCooler.mo and S…
martinkremer Feb 4, 2021
769c265
[skip ci] updates icon for example ahus
martinkremer Feb 4, 2021
2fe2e03
[skip ci] deletes old fan models, updates examples and unit tests due…
martinkremer Feb 4, 2021
a2980eb
[skip ci] Adds model for pass through if one component is not used in…
martinkremer Feb 4, 2021
107ddca
[skip ci] Reworks the modular air handling unit model.
martinkremer Feb 4, 2021
d3abaf0
[skip ci] adds parameters for air handling unit
martinkremer Feb 4, 2021
639251f
Changes control of heat recovery system
martinkremer Oct 21, 2021
ba5f443
Changes calculation of outlet temperature for cooler when dehumidific…
martinkremer Oct 21, 2021
e09c147
Adds Example for only humidification
martinkremer Nov 12, 2021
25bfaa5
[skip-ci] Updates water temperature of adiabatic humidifier
martinkremer Nov 12, 2021
cbbe90d
[skip-ci] Add an example for the only heating case
Jan 27, 2022
f136279
[skip-ci] correct typo
Jan 27, 2022
9328123
Implements limit for spray humidifier (not exceeds saturation)
martinkremer Jan 27, 2022
c0f7fdc
Merge branch 'issue834_modularAHU' of https://github.com/RWTH-EBC/Aix…
martinkremer Jan 27, 2022
bbb9669
Merge branch 'issue834_modularAHU' of https://github.com/RWTH-EBC/Aix…
Jan 27, 2022
0db09bd
[skip-ci] Updates limits of spray-humidifier to work with mass flow r…
martinkremer Jan 27, 2022
6299e9f
Merge branch 'issue834_modularAHU' of https://github.com/RWTH-EBC/Aix…
Jan 27, 2022
affdb95
[skip-ci] use relative humidity in the modular AHU model and check th…
Mar 3, 2022
f1abb92
Merge remote-tracking branch 'origin/development' into issue834_modul…
Mar 3, 2022
f9bc818
ci_correct_html
ebc-aixlib-bot Mar 3, 2022
6efd100
Merge pull request #1247 from RWTH-EBC/Correct_HTML_issue834_modularAHU
Mar 3, 2022
096122b
Bug fix for UnitTest Test_Cooler
PatrickHenkel1 May 10, 2022
14c7a5c
Added TestCases for AHU Validation
PatrickHenkel1 May 12, 2022
a206475
Updated Validation/package.order
PatrickHenkel1 May 16, 2022
7a823cc
Updated Validation Use Cases
PatrickHenkel1 May 23, 2022
c1b10fb
Updated Validation UseCases for ModularAHU
PatrickHenkel1 May 30, 2022
96f0db1
Updated UnitTest for Spray and Steam Humidifier in ModularAHU
PatrickHenkel1 Jun 14, 2022
6ecc701
[skip-ci] #834 add a new control module for cooler or sensible cooler
Jul 14, 2022
f9be82d
[skip-ci] Update cooler model.
martinkremer Jul 14, 2022
1ecc03b
Merge branch 'issue834_modularAHU' of https://github.com/RWTH-EBC/Aix…
martinkremer Jul 14, 2022
b496e93
[skip-ci] Update AHU due to changes in cooler model
martinkremer Jul 14, 2022
4a8ed93
[ski-ci] WIP: Update cooler and cooler control
martinkremer Jul 14, 2022
f8d8045
Updated Validation due to changes in ModularAHU
PatrickHenkel1 Jul 27, 2022
9e546fb
Updated conversion from relToAbsHum and absToRelHum
PatrickHenkel1 Jul 27, 2022
1678425
Merge branch 'issue834_modularAHU' into issue834_modularAHU
Aug 2, 2022
d350aad
[skip-ci] delete an unnecessary file
Aug 2, 2022
261ea08
Changed control of cooler from Controler/ControlerCoolerPID to Contro…
PatrickHenkel1 Aug 2, 2022
1d3cc22
Merge branch 'issue834_modularAHU' of https://github.com/RWTH-EBC/Aix…
PatrickHenkel1 Aug 2, 2022
2aa4a5f
Bug fix in controler cooler
PatrickHenkel1 Aug 2, 2022
2c35f06
Adjusted calculations: now differentiation between wet and dry air ma…
PatrickHenkel1 Aug 2, 2022
0c206eb
Added enthalpy of condensed water to energy balance in PartialCooler.mo
PatrickHenkel1 Aug 11, 2022
db96261
Merge development into issue834
KremerMartin Jun 6, 2023
d2984df
Delete auto-generated strings in package.mo
KremerMartin Jun 6, 2023
9775ca3
[skip-ci] Update models to new structure of units in Modelica-Lib.
KremerMartin Jun 6, 2023
be2cbdd
[skip-ci] Update SensibleCooler due to deletion of heat transfer models
KremerMartin Jun 6, 2023
f9cdeb3
[skip-ci] Delete heat transfer models, add posiility to define heat flow
KremerMartin Jun 6, 2023
f0f30f7
[skip-ci] Change input of humidifier to part load variable
KremerMartin Jun 6, 2023
d1d3035
[skip-ci] Change name of heat recovery; delete non-fixed hrs
KremerMartin Jun 6, 2023
33b6b58
[skip-ci] Delete non-fixed hrs
KremerMartin Jun 6, 2023
0f1b18e
[skip-ci] Update ModularAHU due to changes before. Delete ExampleAHUs
KremerMartin Jun 6, 2023
8110c61
[skip-ci] Fix bug in PartialHeater
KremerMartin Jun 6, 2023
64b9488
[skip-ci] Rename validation package; delete old test cases
KremerMartin Jun 6, 2023
fc9daa6
[skip-ci] delete old example and unit test files
KremerMartin Jun 6, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
within AixLib.Airflow.AirHandlingUnit.ModularAirHandlingUnit.Components.BaseClasses.HeatTransfer;
model ConvectiveHeatTransferCoefficient
"model that calculates the convective heat transfer coefficient for plane gaps in an air heat exchanger"

//Inputs
input Modelica.Units.SI.MassFlowRate m_flow "mass flow rate of air";

//parameters
parameter Modelica.Units.SI.Length s "distance between fins";
parameter Modelica.Units.SI.Length length "length of heat exchanger";
parameter Modelica.Units.SI.Length width "width of heat exchanger";
parameter Real nFins "number of parallel plates in heat exchanger";

//Variables
Real Pr "Prandtl number";
Real Re "Reynolds number";
Real Nu "Nusselt number";
Modelica.Units.SI.Velocity v "velocity of air";

//outputs
output Modelica.Units.SI.CoefficientOfHeatTransfer alpha "convective heat transfer coefficient";

protected
constant Modelica.Units.SI.Density rho = 1.18 "density of air";
constant Modelica.Units.SI.DynamicViscosity mu = 17.1E-6 "dynamic viscosity of air";
constant Modelica.Units.SI.ThermalConductivity lambda = 0.0262 "thermal conductivity of air";
constant Modelica.Units.SI.SpecificHeatCapacity cp = 1006 "heat capacity of air";

Modelica.Units.SI.Length diameter "hydraulic diameter";

equation
Pr = mu*cp/lambda;
Re = abs(v)*rho*diameter/mu;

diameter = 2 * s;
v = m_flow/(nFins * width * s);

Nu = 7.55 + (0.024*(Re*Pr*diameter/length)^1.14)/(1+0.0358*(Re*Pr*diameter/length)^0.64*Pr^0.17);
// Nusselt number according to: VDI-Waermeatlas 2013, p.800 eq.45

Nu = alpha * diameter / lambda;

annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(
coordinateSystem(preserveAspectRatio=false)));
end ConvectiveHeatTransferCoefficient;
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
within AixLib.Airflow.AirHandlingUnit.ModularAirHandlingUnit.Components.BaseClasses;
package HeatTransfer
end HeatTransfer;
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ConvectiveHeatTransferCoefficient
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
within AixLib.Airflow.AirHandlingUnit.ModularAirHandlingUnit.Components.BaseClasses;
partial model PartialCooler
"BaseClass for cooling heat exchangers in air handling units"

// parameters
parameter Modelica.Units.SI.SpecificHeatCapacity c_wat = 4180 "specific heat capacity of water" annotation (HideResult = (use_T_set));
parameter Modelica.Units.SI.SpecificHeatCapacity cp_air = 1005 "specific heat capacity of dry air";
parameter Modelica.Units.SI.SpecificHeatCapacity cp_steam = 1860 "specific heat capacity of steam";
parameter Modelica.Units.SI.Density rho_air = 1.2 "Density of air";

parameter Boolean use_T_set=false "if true, a set temperature is used to calculate the necessary heat flow rate";

parameter Modelica.Units.SI.HeatFlowRate Q_flow_nominal(min=0) = 45E3 "maximum cooling power of cooler (design point)";

// constants
constant Modelica.Units.SI.SpecificEnthalpy r0 = 2500E3 "specific heat of vaporization at 0°C";

// Variables
Modelica.Units.SI.SpecificEnthalpy h_airIn "specific enthalpy of incoming air";
Modelica.Units.SI.SpecificEnthalpy h_airOut "specific enthalpy of outgoing air";
Modelica.Units.SI.SpecificEnthalpy h_wat "specific enthalpy of extracted water";

Modelica.Units.SI.MassFlowRate m_flow_dryairIn "mass flow rate of incoming dry air";
Modelica.Units.SI.MassFlowRate m_flow_dryairOut "mass flow rate of outgoing dry air";

Modelica.Units.SI.HeatFlowRate Q_flow "heat flow";

replaceable model PartialPressureDrop =
Components.PressureDrop.BaseClasses.partialPressureDrop annotation(choicesAllMatching=true);

PartialPressureDrop partialPressureDrop(m_flow = m_flow_airIn,
rho = rho_air);

Modelica.Blocks.Interfaces.RealInput m_flow_airIn(
final quantity = "MassFlowRate",
final unit = "kg/s")
"mass flow rate of incoming air"
annotation (Placement(transformation(extent={{-140,50},{-100,90}}),
iconTransformation(extent={{-120,70},{-100,90}})));
Modelica.Blocks.Interfaces.RealInput T_airIn(
final quantity="ThermodynamicTemperature",
final unit="K",
displayUnit="degC")
"Temperature of incoming air"
annotation (Placement(transformation(extent={{-140,20},{-100,60}}),
iconTransformation(extent={{-120,40},{-100,60}})));
Modelica.Blocks.Interfaces.RealInput X_airIn(
final quantity = "MassFraction",
final unit = "kg/kg")
"absolute humidity of incoming air"
annotation (Placement(transformation(extent={{-140,-10},{-100,30}}),
iconTransformation(extent={{-120,10},{-100,30}})));
Modelica.Blocks.Interfaces.RealOutput m_flow_airOut(
final quantity = "MassFlowRate",
final unit = "kg/s") "mass flow rate of outgoing air"
annotation (Placement(transformation(extent={{100,70},{120,90}})));
Modelica.Blocks.Interfaces.RealOutput T_airOut(
final quantity="ThermodynamicTemperature",
final unit="K",
displayUnit="degC") "temperature of outgoing air"
annotation (Placement(transformation(extent={{100,40},{120,60}}),
iconTransformation(extent={{100,40},{120,60}})));
Modelica.Blocks.Interfaces.RealOutput X_airOut(
final quantity = "MassFraction",
final unit = "kg/kg") "absolute humidity of outgoing air"
annotation (Placement(transformation(extent={{100,10},{120,30}}),
iconTransformation(extent={{100,10},{120,30}})));

Modelica.Blocks.Interfaces.RealInput T_set if use_T_set annotation (Placement(
transformation(
extent={{-20,-20},{20,20}},
rotation=-90,
origin={0,110}), iconTransformation(
extent={{-10,-10},{10,10}},
rotation=-90,
origin={0,100})));

Modelica.Blocks.Interfaces.RealOutput dp "pressure difference"
annotation (Placement(transformation(extent={{100,-30},{120,-10}})));
Modelica.Blocks.Interfaces.RealOutput Q "heat flow rate"
annotation (Placement(transformation(extent={{100,-70},{120,-50}})));
Modelica.Blocks.Interfaces.RealInput u(min=0,max=1) if not use_T_set "input connector scaling heat flow rate [0..1]" annotation (Placement(transformation(
extent={{-20,-20},{20,20}},
rotation=-90,
origin={40,110}), iconTransformation(
extent={{-10,-10},{10,10}},
rotation=-90,
origin={0,100})));
protected
Modelica.Units.SI.MassFlowRate mb_flow "mass flow over boundary";
Modelica.Blocks.Interfaces.RealInput T_intern "internal temperature";
Modelica.Blocks.Interfaces.RealInput X_intern "internal mass fraction";
Modelica.Blocks.Interfaces.RealInput u_intern "internal input connector for heat flow scaling";
Modelica.Blocks.Math.Min min_T if use_T_set
annotation (Placement(transformation(extent={{-48,68},{-36,80}})));
equation

// mass balances
m_flow_airIn - m_flow_airOut = mb_flow;

m_flow_dryairIn * (1 + X_airIn) = m_flow_airIn;
m_flow_dryairOut - m_flow_dryairIn = 0;

mb_flow = m_flow_dryairIn * (X_airIn - X_airOut); // condensate

// heat flows
Q_flow = m_flow_dryairIn * h_airIn - m_flow_dryairOut * h_airOut - mb_flow * h_wat;
Q = Q_flow;
if not use_T_set then
Q_flow = u_intern * Q_flow_nominal;
T_intern = T_airIn;
else
T_airOut = T_intern;
u_intern = 0;
end if;

// sepcific enthalpies
h_airIn = cp_air * (T_airIn - 273.15) + X_airIn * (cp_steam * (T_airIn - 273.15) + r0);
h_airOut = cp_air * (T_airOut - 273.15) + X_airOut * (cp_steam * (T_airOut - 273.15) + r0);
h_wat = c_wat * (T_airOut - 273.15);

partialPressureDrop.dp = dp;

// conditional connectors
connect(min_T.y,T_intern);
connect(u, u_intern);

// connectors
connect(T_set, min_T.u1) annotation (Line(points={{0,110},{0,86},{-56,86},{-56,
77.6},{-49.2,77.6}}, color={0,0,127}));
connect(T_airIn, min_T.u2) annotation (Line(points={{-120,40},{-80,40},{-80,70.4},
{-49.2,70.4}}, color={0,0,127}));
annotation (Icon(graphics={
Rectangle(
extent={{-100,94},{100,-94}},
lineColor={0,0,0},
fillColor={175,175,175},
fillPattern=FillPattern.Solid,
lineThickness=0.5),
Line(
points={{-100,94},{100,-94}},
color={0,0,0},
thickness=0.5),
Text(
extent={{-14,66},{62,48}},
lineColor={0,0,0},
lineThickness=1,
fillColor={175,175,175},
fillPattern=FillPattern.Solid,
textString="%name")}), Documentation(info="<html><p>
This partial model provides a idealized heat exchanger. The model
considers the convective heat transfer from the heat transfer surface
in the air stream. Moreover the heat capacity of the heating surface
and the housing of the heat exchanger is considered.
</p>
</html>", revisions="<html>
<ul>
<li>April, 2019, by Martin Kremer:<br/>
First implementation.
</li>
<li>August, 2019, by Martin Kremer:<br/>
Added possibility to use set temperature.
</li>
<li>December, 2019, by Martin Kremer:<br/>
Removed internal PID. Output temperature and humidity are now
directly set to set temperature.
</li>
</ul>
</html>"));
end PartialCooler;
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
within AixLib.Airflow.AirHandlingUnit.ModularAirHandlingUnit.Components.BaseClasses;
partial model PartialHeater
"BaseClass for heat exchangers in air handling units"

// parameters
parameter Modelica.Units.SI.SpecificHeatCapacity c_wat = 4180 "specific heat capacity of water" annotation (HideResult = (use_T_set));
parameter Modelica.Units.SI.SpecificHeatCapacity cp_air = 1005 "specific heat capacity of dry air";
parameter Modelica.Units.SI.SpecificHeatCapacity cp_steam = 1860 "specific heat capacity of steam";
parameter Modelica.Units.SI.Density rho_air = 1.2 "Density of air";

parameter Boolean use_T_set=false "if true, a set temperature is used to calculate the necessary heat flow rate";

parameter Modelica.Units.SI.HeatFlowRate Q_flow_nominal = 45E3 "maximum heat output of heater at design point. Only used, if use_T_set = true" annotation (HideResult = (not use_T_set));

// constants
constant Modelica.Units.SI.SpecificEnthalpy r0 = 2500E3 "specific heat of vaporization at 0°C";

// Variables
Modelica.Units.SI.SpecificEnthalpy h_airIn "specific enthalpy of incoming air";
Modelica.Units.SI.SpecificEnthalpy h_airOut "specific enthalpy of outgoing air";

Modelica.Units.SI.MassFlowRate m_flow_dryairIn "mass flow rate of incoming dry air";
Modelica.Units.SI.MassFlowRate m_flow_dryairOut "mass flow rate of outgoing dry air";

Modelica.Units.SI.HeatFlowRate Q_flow "heat flow";

Modelica.Blocks.Interfaces.RealInput m_flow_airIn(
final quantity = "MassFlowRate",
final unit = "kg/s")
"mass flow rate of incoming air"
annotation (Placement(transformation(extent={{-140,50},{-100,90}}),
iconTransformation(extent={{-120,70},{-100,90}})));
Modelica.Blocks.Interfaces.RealInput T_airIn(
final quantity="ThermodynamicTemperature",
final unit="K",
displayUnit="degC")
"Temperature of incoming air"
annotation (Placement(transformation(extent={{-140,20},{-100,60}}),
iconTransformation(extent={{-120,40},{-100,60}})));
Modelica.Blocks.Interfaces.RealInput X_airIn(
final quantity = "MassFraction",
final unit = "kg/kg")
"absolute humidity of incoming air"
annotation (Placement(transformation(extent={{-140,-10},{-100,30}}),
iconTransformation(extent={{-120,10},{-100,30}})));
Modelica.Blocks.Interfaces.RealOutput m_flow_airOut(
final quantity = "MassFlowRate",
final unit = "kg/s") "mass flow rate of outgoing air"
annotation (Placement(transformation(extent={{100,70},{120,90}})));
Modelica.Blocks.Interfaces.RealOutput T_airOut(
final quantity="ThermodynamicTemperature",
final unit="K",
displayUnit="degC") "temperature of outgoing air"
annotation (Placement(transformation(extent={{100,40},{120,60}}),
iconTransformation(extent={{100,40},{120,60}})));
Modelica.Blocks.Interfaces.RealOutput X_airOut(
final quantity = "MassFraction",
final unit = "kg/kg") "absolute humidity of outgoing air"
annotation (Placement(transformation(extent={{100,10},{120,30}}),
iconTransformation(extent={{100,10},{120,30}})));

Modelica.Blocks.Interfaces.RealInput T_set if use_T_set annotation (Placement(
transformation(
extent={{-20,-20},{20,20}},
rotation=-90,
origin={0,110}), iconTransformation(
extent={{-10,-10},{10,10}},
rotation=-90,
origin={0,100})));

Modelica.Blocks.Interfaces.RealOutput dp "pressure difference"
annotation (Placement(transformation(extent={{100,-30},{120,-10}})));
replaceable model PartialPressureDrop =
Components.PressureDrop.BaseClasses.partialPressureDrop annotation(choicesAllMatching=true);

PartialPressureDrop partialPressureDrop(m_flow = m_flow_airIn,
rho = rho_air);

Modelica.Blocks.Interfaces.RealOutput Q "heat flow rate"
annotation (Placement(transformation(extent={{100,-70},{120,-50}})));
Modelica.Blocks.Interfaces.RealInput u(min=0, max=1)
if not use_T_set "input connector scaling heat flow rate [0..1]" annotation (Placement(transformation(
extent={{-20,-20},{20,20}},
rotation=-90,
origin={48,110}), iconTransformation(
extent={{-10,-10},{10,10}},
rotation=-90,
origin={0,100})));
protected
parameter Real Q_in=0 "dummy heat flow rate, if use_T_set = false";
Modelica.Blocks.Interfaces.RealInput Q_in_internal "internal heat flow rate";
Modelica.Blocks.Interfaces.RealInput T_intern "internal temperature";
Modelica.Blocks.Math.Max max
annotation (Placement(transformation(extent={{-18,74},{-8,84}})));
Modelica.Blocks.Sources.Constant Q_nominal(k=Q_flow_nominal) if not use_T_set
annotation (Placement(transformation(extent={{12,40},{32,60}})));
Modelica.Blocks.Math.Product product1 if not use_T_set
annotation (Placement(transformation(extent={{52,22},{72,42}})));
equation

// mass balances
m_flow_airIn - m_flow_airOut = 0;
m_flow_dryairIn - m_flow_dryairOut = 0;
m_flow_dryairIn * (1 + X_airIn) = m_flow_airIn;

// heat flows
Q_flow = -(m_flow_dryairIn * h_airIn - m_flow_dryairOut * h_airOut);
Q = Q_flow;

Q_flow = Q_in_internal;

// sepcific enthalpies
h_airIn = cp_air * (T_airIn - 273.15) + X_airIn * (cp_steam * (T_airIn - 273.15) + r0);
h_airOut = cp_air * (T_intern - 273.15) + X_airOut * (cp_steam * (T_intern - 273.15) + r0);

T_airOut = T_intern;

partialPressureDrop.dp = dp;

// Conditional connectors
connect(max.y,T_intern);
connect(product1.y, Q_in_internal);

// Connectors
connect(T_set, max.u1) annotation (Line(points={{0,110},{0,88},{-22,88},{-22,82},
{-19,82}}, color={0,0,127}));
connect(T_airIn, max.u2) annotation (Line(points={{-120,40},{-80,40},{-80,76},
{-19,76}}, color={0,0,127}));
connect(Q_nominal.y, product1.u1) annotation (Line(points={{33,50},{42,50},{42,
38},{50,38}}, color={0,0,127}));
connect(u, product1.u2) annotation (Line(points={{48,110},{48,82},{42,82},{42,
26},{50,26}}, color={0,0,127}));
annotation (Icon(graphics={
Rectangle(
extent={{-100,94},{100,-94}},
lineColor={0,0,0},
fillColor={175,175,175},
fillPattern=FillPattern.Solid,
lineThickness=0.5),
Line(
points={{-100,94},{100,-94}},
color={0,0,0},
thickness=0.5),
Text(
extent={{-14,66},{62,48}},
lineColor={0,0,0},
lineThickness=1,
fillColor={175,175,175},
fillPattern=FillPattern.Solid,
textString="%name")}), Documentation(info="<html><p>
This partial model provides a idealized heat exchanger. The model
considers the convective heat transfer from the heat transfer surface
in the air stream. Moreover the heat capacity of the heating surface
and the housing of the heat exchanger is considered.
</p>
</html>", revisions="<html>
<ul>
<li>April, 2019, by Martin Kremer:<br/>
First implementation.
</li>
<li>August, 2019, by Martin Kremer:<br/>
Added possibility to use set temperature.
</li>
<li>December, 2019, by Martin Kremer:<br/>
Removed internal PID. Output temperature is now directly set to set
temperature.
</li>
</ul>
</html>"));
end PartialHeater;