Skip to content

Commit

Permalink
Merge upsteam
Browse files Browse the repository at this point in the history
  • Loading branch information
kldjonge committed Jan 23, 2025
1 parent a0ff314 commit 07479a2
Show file tree
Hide file tree
Showing 123 changed files with 56,035 additions and 0 deletions.
237 changes: 237 additions & 0 deletions IDEAS/Airflow/Multizone/CrackOrOperableDoor.mo
Original file line number Diff line number Diff line change
@@ -0,0 +1,237 @@
within IDEAS.Airflow.Multizone;
model CrackOrOperableDoor
"Infiltration or large opening model used for the embeded airflow implementation in IDEAS.Buildings.Components"
extends IDEAS.Fluid.Interfaces.PartialFourPortInterface(
redeclare final package Medium1 = Medium,
redeclare final package Medium2 = Medium,
final allowFlowReversal1=true,
final allowFlowReversal2=true,
final m1_flow_nominal=10/3600*rho_default,
final m2_flow_nominal=m1_flow_nominal,
final m1_flow_small=1E-4*abs(m1_flow_nominal),
final m2_flow_small=1E-4*abs(m2_flow_nominal));
extends IDEAS.Airflow.Multizone.BaseClasses.ErrorControl(forceErrorControlOnFlow=true); //force error control on flow rates

replaceable package Medium =
Modelica.Media.Interfaces.PartialMedium "Medium in the component"
annotation (choices(
choice(redeclare package Medium = IDEAS.Media.Air "Moist air")));

parameter Modelica.Units.SI.Velocity vZer=0.001
"Minimum velocity to prevent zero flow. Recommended: 0.001";
parameter Modelica.Units.SI.Length wOpe=0.9 "Width of opening"
annotation (Dialog(group="Geometry"));
parameter Modelica.Units.SI.Length hOpe=2.1 "Height of opening"
annotation (Dialog(group="Geometry"));

parameter BoundaryConditions.Types.InterZonalAirFlow interZonalAirFlowType
"Interzonal air flow type";
final parameter Modelica.Units.SI.PressureDifference dpCloRat(displayUnit="Pa")=50
"Pressure drop at rating condition of closed door"
annotation (Dialog(group="Rating conditions"));

parameter Modelica.Units.SI.Length h_b1 "Height at port b1 (hasCavity=false)";
parameter Modelica.Units.SI.Length h_b2 = 0 "Height at port b2(hasCavity=false)";
parameter Modelica.Units.SI.Length h_a1 = 0 "Height at port a1(hasCavity=false)";
parameter Modelica.Units.SI.Length h_a2 "Height at port a2(hasCavity=false)";

parameter SI.Length hA=(h_a1 + h_b2)/2
"Height of reference pressure at port a1 for opening (hasCavity=true) model";
parameter SI.Length hB=(h_a2 + h_b1)/2
"Height of reference pressure at port b1 for opening (hasCavity=true) model";

final parameter Real CDCloRat(min=0, max=1)=1
"Discharge coefficient at rating conditions of closed door"
annotation (Dialog(group="Rating conditions"));
parameter Modelica.Units.SI.Area A_q50 "Surface area for leakage computation (closed door)";
parameter Real q50(unit="m3/(h.m2)") "Surface air tightness";

final parameter Modelica.Units.SI.Area LClo(min=0) = ((q50*A_q50/3600)/(dpCloRat)^mClo)/(((dpCloRat)^(0.5-mClo))*sqrt(2/rho_default))
"Effective leakage area of internal wall (when door is fully closed)"
annotation (Dialog(group="Crack or Closed door"));

parameter Real CDOpe=0.78 "Discharge coefficient of open door"
annotation (Dialog(group="Open door"));


parameter Real mOpe = 0.5 "Flow exponent for door of open door"
annotation (Dialog(group="Open door"));
parameter Real mClo= 0.65 "Flow exponent for crack or crack of closed door"
annotation (Dialog(group="Crack or Closed door"));

parameter Integer nCom=if abs(hOpe*sin(inc)) < 0.01 then 2 else max(2,integer(abs(hOpe*sin(inc))/4)) "Number of compartments for the discretization";

parameter Boolean useDoor = false "=true, to use operable door instead of a crack";
parameter Boolean use_y = true "=true, to use control input";
parameter Boolean openDoorOnePort = false "Sets whether a door is open or closed in one port configuration";

parameter Modelica.Units.SI.PressureDifference dp_turbulent(
min=0,
displayUnit="Pa") = 0.01
"Pressure difference where laminar and turbulent flow relation coincide. Recommended: 0.01";

parameter Modelica.Units.SI.PressureDifference dp_turbulent_ope(min=0,displayUnit="Pa") = (MFtrans/(rho_default*(CDOpe * hOpe*wOpe * sqrt(2/rho_default))))^(1/mOpe)
if useDoor and interZonalAirFlowType == IDEAS.BoundaryConditions.Types.InterZonalAirFlow.TwoPorts "Pressure difference where laminar and turbulent flow relation coincide for large cavities";
parameter Modelica.Units.SI.MassFlowRate MFtrans=(hOpe*wOpe)*VItrans*REtrans/DOpe if useDoor and interZonalAirFlowType == IDEAS.BoundaryConditions.Types.InterZonalAirFlow.TwoPorts "Recommended massflowrate used for reguralisation";
parameter Modelica.Units.SI.Length DOpe=4*hOpe*wOpe/(2*hOpe+2*wOpe) if useDoor and interZonalAirFlowType == IDEAS.BoundaryConditions.Types.InterZonalAirFlow.TwoPorts "Estimated hydraulic diameter of the opening - 4*A/Perimeter";
constant Modelica.Units.SI.ReynoldsNumber REtrans=30 if useDoor and interZonalAirFlowType == IDEAS.BoundaryConditions.Types.InterZonalAirFlow.TwoPorts "Assumed Reynolds number at transition";
constant Modelica.Units.SI.DynamicViscosity VItrans=0.0000181625 if useDoor and interZonalAirFlowType == IDEAS.BoundaryConditions.Types.InterZonalAirFlow.TwoPorts "Assumed dynamic viscosity of air at transition";

final parameter Medium.ThermodynamicState state_default=Medium.setState_pTX(
T=Medium.T_default,
p=Medium.p_default,
X=Medium.X_default[1:Medium.nXi]) "Medium state at default values";
final parameter Modelica.Units.SI.Density rho_default=Medium.density(state=state_default) "Medium default density";



Modelica.Blocks.Interfaces.RealInput y(min=0, max=1, unit="1") if useDoor and use_y
"Opening signal, 0=closed, 1=open"
annotation (Placement(transformation(extent={{-120,-10},{-100,10}}), iconTransformation(extent={{-120,-10},{-100,10}})));
IDEAS.Airflow.Multizone.Point_m_flow point_m_flow1(
redeclare package Medium = Medium,
dpMea_nominal = dpCloRat,
forceErrorControlOnFlow=true,
mMea_flow_nominal=if openDoorOnePort and interZonalAirFlowType == IDEAS.BoundaryConditions.Types.InterZonalAirFlow.OnePort
then wOpe*hOpe*rho_default*CDCloRat*(2*dpCloRat/rho_default)^mClo else (if
interZonalAirFlowType == IDEAS.BoundaryConditions.Types.InterZonalAirFlow.TwoPorts
then 0.5 else 1)*(q50/3600*rho_default)*A_q50,
m = if openDoorOnePort and interZonalAirFlowType == IDEAS.BoundaryConditions.Types.InterZonalAirFlow.OnePort then mOpe else mClo,
useDefaultProperties = false) if not useDoor or (useDoor and interZonalAirFlowType == IDEAS.BoundaryConditions.Types.InterZonalAirFlow.OnePort) "Pressure drop equation" annotation (
Placement(visible = true, transformation(origin = {0, 60}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
IDEAS.Airflow.Multizone.MediumColumnReversible col_b1(redeclare package
Medium = Medium, h=h_b1) if interZonalAirFlowType == IDEAS.BoundaryConditions.Types.InterZonalAirFlow.TwoPorts
and not useDoor "Column for port b1" annotation (Placement(visible=true,
transformation(
origin={0,70},
extent={{50,-10},{70,10}},
rotation=0)));
IDEAS.Airflow.Multizone.MediumColumnReversible col_a1(redeclare package
Medium = Medium, h=h_a1) if interZonalAirFlowType == IDEAS.BoundaryConditions.Types.InterZonalAirFlow.TwoPorts
and not useDoor "Column for port a1" annotation (Placement(visible=true,
transformation(
origin={0,70},
extent={{-70,-10},{-50,10}},
rotation=0)));
IDEAS.Airflow.Multizone.MediumColumnReversible col_b2(redeclare package
Medium = Medium, h=h_b2) if interZonalAirFlowType == IDEAS.BoundaryConditions.Types.InterZonalAirFlow.TwoPorts
and not useDoor "Column for port b2" annotation (Placement(visible=true,
transformation(
origin={0,-50},
extent={{-70,-10},{-50,10}},
rotation=0)));
IDEAS.Airflow.Multizone.MediumColumnReversible col_a2(redeclare package
Medium = Medium, h=h_a2) if interZonalAirFlowType == IDEAS.BoundaryConditions.Types.InterZonalAirFlow.TwoPorts
and not useDoor "Column for port a2" annotation (Placement(visible=true,
transformation(
origin={0,-50},
extent={{50,-10},{70,10}},
rotation=0)));
IDEAS.Airflow.Multizone.Point_m_flow point_m_flow2(
redeclare package Medium = Medium,
dpMea_nominal = dpCloRat,
forceErrorControlOnFlow=true,
m = mClo,
mMea_flow_nominal = (q50/3600*rho_default)*A_q50*0.5,
useDefaultProperties = false) if not useDoor and interZonalAirFlowType == IDEAS.BoundaryConditions.Types.InterZonalAirFlow.TwoPorts "Pressure drop equation" annotation (
Placement(visible = true, transformation(origin = {0, -60}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
IDEAS.Airflow.Multizone.DoorDiscretizedOperable doo(
final dh=doo.hOpe*sin(inc)/nCom,
redeclare package Medium = Medium,
final hA=hA,
final hB=hB,
dp_turbulent=dp_turbulent_ope,
nCom=nCom,
CDOpe=CDOpe,
CDClo=CDCloRat,
mOpe=mOpe,
mClo=mClo,
CDCloRat=CDCloRat,
wOpe=wOpe,
hOpe=hOpe,
dpCloRat=dpCloRat,
LClo=LClo,
vZer=vZer*MFtrans*rho_default)
if useDoor and interZonalAirFlowType == IDEAS.BoundaryConditions.Types.InterZonalAirFlow.TwoPorts annotation (
Placement(visible = true, transformation(origin={-2,0}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
IDEAS.Fluid.Sources.Boundary_pT bou(
redeclare package Medium = Medium,
nPorts = 2)
if interZonalAirFlowType <> IDEAS.BoundaryConditions.Types.InterZonalAirFlow.TwoPorts
"Sets absolute pressure when the ports are not connected externally" annotation (
Placement(visible = true, transformation(origin = {0, -90}, extent = {{-10, 10}, {10, -10}}, rotation = 90)));
Modelica.Blocks.Sources.Constant constOne(final k=1)
if not use_y
"Door constantly opened" annotation (
Placement(visible = true, transformation(origin = {-54, -14}, extent = {{-6, -6}, {6, 6}}, rotation = 0)));

parameter SI.Angle inc=Modelica.Constants.pi/2
"inclination angle (vertical=pi/2)";
initial equation
assert( not (interZonalAirFlowType <> IDEAS.BoundaryConditions.Types.InterZonalAirFlow.TwoPorts and useDoor and use_y),
"In " +getInstanceName() + ": Cannot use a controllable door unless interZonalAirFlowType == TwoPorts.");

equation
connect(col_a1.port_a, point_m_flow1.port_a) annotation (
Line(points = {{-60, 80}, {-60, 84}, {-20, 84}, {-20, 60}, {-10, 60}}, color = {0, 127, 255}));
connect(col_b1.port_a, point_m_flow1.port_b) annotation (
Line(points = {{60, 80}, {60, 84}, {20, 84}, {20, 60}, {10, 60}}, color = {0, 127, 255}));
connect(col_b2.port_a, point_m_flow2.port_a) annotation (
Line(points = {{-60, -40}, {-60, -36}, {-20, -36}, {-20, -60}, {-10, -60}}, color = {0, 127, 255}));
connect(col_a2.port_a, point_m_flow2.port_b) annotation (
Line(points = {{60, -40}, {60, -36}, {20, -36}, {20, -60}, {10, -60}}, color = {0, 127, 255}));
connect(col_b2.port_b, port_b2) annotation (
Line(points = {{-60, -60}, {-100, -60}}, color = {0, 127, 255}));
connect(col_a2.port_b, port_a2) annotation (
Line(points = {{60, -60}, {100, -60}}, color = {0, 127, 255}));
connect(col_b1.port_b, port_b1) annotation (
Line(points = {{60, 60}, {100, 60}}, color = {0, 127, 255}));
connect(col_a1.port_b, port_a1) annotation (
Line(points = {{-60, 60}, {-100, 60}}, color = {0, 127, 255}));
connect(y, doo.y) annotation (
Line(points={{-110,0},{-13,0}}, color = {0, 0, 127}));
connect(bou.ports[1], port_a2) annotation (
Line(points={{-1,-80},{100,-80},{100,-60}}, color = {0, 127, 255}));
if interZonalAirFlowType <> IDEAS.BoundaryConditions.Types.InterZonalAirFlow.TwoPorts then
connect(point_m_flow1.port_a, port_a1) annotation (
Line(points = {{-10, 60}, {-100, 60}}, color = {0, 127, 255}));
connect(point_m_flow1.port_b, port_b1) annotation (
Line(points = {{10, 60}, {100, 60}}, color = {0, 127, 255}));
end if;
connect(constOne.y, doo.y) annotation (
Line(points={{-47.4,-14},{-32,-14},{-32,0},{-13,0}}, color = {0, 0, 127}));
connect(bou.ports[2], port_b2) annotation (
Line(points={{1,-80},{-100,-80},{-100,-60}}, color = {0, 127, 255}));
connect(doo.port_a1, port_a1) annotation (
Line(points={{-12,6},{-30,6},{-30,60},{-100,60}}, color = {0, 127, 255}));
connect(doo.port_b1, port_b1) annotation (
Line(points={{8,6},{30,6},{30,60},{100,60}}, color = {0, 127, 255}));
connect(doo.port_b2, port_b2) annotation (
Line(points={{-12,-6},{-20,-6},{-20,-34},{-100,-34},{-100,-60}}, color = {0, 127, 255}));
connect(doo.port_a2, port_a2) annotation (
Line(points={{8,-6},{20,-6},{20,-34},{100,-34},{100,-60}}, color = {0, 127, 255}));

annotation(Documentation(info="<html>
<p>
This models an open/closed door depending on the number of available fluid ports.
</p>
<p>
When only one port is available then an orrifice equation is used to approximate the closed door.
There is no support for open doors when using only a single fluid port.
</p>
</html>",
revisions="<html>
<ul>
<li>
October 30, 2024, by Klaas De Jonge:<br/>
Changes for column heights,used default density and transition point to laminar flow at low dp.
</li>
<li>
October 20, 2023 by Filip Jorissen:<br/>
First documented version.
</li>
</ul>
</html>"),
Diagram,
Icon(graphics={ Polygon(lineColor = {0, 0, 255}, pattern = LinePattern.None, fillPattern = FillPattern.Solid, points = {{-30, -10}, {-16, -8}, {-16, -14}, {-30, -16}, {-30, -10}}), Line(points = {{-54, 48}, {-36, 48}}), Line(points = {{-54, 20}, {-36, 20}}), Rectangle(fillColor = {255, 255, 255}, pattern = LinePattern.None, fillPattern = FillPattern.Solid, extent = {{-100, 100}, {100, -100}}), Line(points = {{-54, -58}, {-36, -58}}), Rectangle(lineColor = {0, 0, 255}, fillColor = {255, 128, 0}, pattern = LinePattern.None, fillPattern = FillPattern.Solid, extent = {{-46, -16}, {-20, -20}}), Rectangle(lineColor = {0, 0, 255}, fillColor = {85, 75, 55}, pattern = LinePattern.None, fillPattern = FillPattern.Solid, extent = {{-60, 80}, {60, -84}}), Rectangle(fillColor = {215, 215, 215}, fillPattern = FillPattern.Solid, extent = {{-54, 72}, {56, -84}}), Polygon(fillColor = {95, 95, 95}, fillPattern = FillPattern.Solid, points = {{56, 72}, {-36, 66}, {-36, -90}, {56, -84}, {56, 72}}), Rectangle(lineColor = {0, 0, 255}, fillColor = {255, 128, 0}, pattern = LinePattern.None, fillPattern = FillPattern.Solid, extent = {{-100, 2}, {-46, -2}}), Polygon(visible = false, origin = {75, 50}, rotation = 360, lineColor = {0, 128, 255}, fillColor = {0, 128, 255}, fillPattern = FillPattern.Solid, points = {{-5, 10}, {25, 10}, {-5, -10}, {-5, 10}}), Text(textColor = {0, 0, 127}, extent = {{-118, 34}, {-98, 16}}, textString = "y"), Line(points = {{-54, -6}, {-36, -6}}), Line(points = {{-54, -32}, {-36, -32}}), Polygon(visible = false, origin = {-79, -50}, rotation = 360, lineColor = {0, 128, 255}, fillColor = {0, 128, 255}, fillPattern = FillPattern.Solid, points = {{10, 10}, {-20, -10}, {10, -10}, {10, 10}}), Rectangle(lineColor = {0, 0, 255}, fillColor = {255, 128, 0}, pattern = LinePattern.None, fillPattern = FillPattern.Solid, extent = {{-46, 2}, {-40, -16}})}, coordinateSystem(extent = {{-100, -100}, {100, 100}})));
end CrackOrOperableDoor;
51 changes: 51 additions & 0 deletions IDEAS/Airflow/Multizone/Examples/TrickleVentIDEAS.mo
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
within IDEAS.Airflow.Multizone.Examples;
model TrickleVentIDEAS
"Model with a trickle vent modelled using the models with flow based on tabulated data"
extends IDEAS.Airflow.Multizone.Examples.TrickleVent(west(nPorts=2), east(nPorts=2));

IDEAS.Airflow.Multizone.TrickleVent vent(
redeclare package Medium = Medium,
dp_nominal = 10,
m_flow_nominal = 0.02614,
use_y = true)
"Analytic trickle vent implementation" annotation (
Placement(visible = true, transformation(origin = {20, -70}, extent = {{-10, 10}, {10, -10}}, rotation = 0)));
Modelica.Blocks.Sources.Ramp ramp(
duration = 1e6,
height = -1,
offset = 1,
startTime = 1592000)
"Step control signal" annotation (
Placement(visible = true, transformation(origin = {-90, -88}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
equation
connect(vent.port_a, east.ports[2]) annotation (
Line(points = {{10, -70}, {-25, -70}, {-25, -30}, {-30, -30}}, color = {0, 127, 255}));
connect(vent.port_b, west.ports[2]) annotation (
Line(points = {{30, -70}, {65, -70}, {65, -30}, {70, -30}}, color = {0, 127, 255}));
connect(ramp.y, vent.y) annotation (
Line(points = {{-79, -88}, {20.5, -88}, {20.5, -82}, {20, -82}}, color = {0, 0, 127}));
annotation (__Dymola_Commands(file="modelica://IDEAS/Resources/Scripts/Dymola/Airflow/Multizone/Examples/TrickleVentIDEAS.mos"
"Simulate and plot"),
experiment(
StopTime=2592000,
Interval=600,
Tolerance=1e-06),
Documentation(info="<html>
<p>
This model illustrates the use of the models
<a href=\"modelica://IDEAS.Airflow.Multizone.TrickleVent\">
IDEAS.Airflow.Multizone.Table_V_flow</a>,
which is an analytic alternative to the table implementation of
<a href=\"modelica://IDEAS.Airflow.Multizone.Table_m_flow\">
IDEAS.Airflow.Multizone.Table_m_flow</a> for modelling self regulating inlet vents.
</p>
</html>", revisions="<html>
<ul>
<li>
July 9, 2023 by Filip Jorissen:<br/>
First implementation.
</li>
</ul>
</html>"),
Diagram);
end TrickleVentIDEAS;
42 changes: 42 additions & 0 deletions IDEAS/Airflow/Multizone/MediumColumnReversible.mo
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
within IDEAS.Airflow.Multizone;
model MediumColumnReversible
"Vertical shaft with no friction and no storage of heat and mass, reversible because it can handle negative column heights"

extends IDEAS.Airflow.Multizone.MediumColumn(
h(min=-Modelica.Constants.inf),
final densitySelection = IDEAS.Airflow.Multizone.Types.densitySelection.fromBottom);
// by convention, port_b must be connected to a zone instead of a flow element
// h is allowed to be negative to accomodate for this convention

annotation (
Icon(graphics={
Line(
points={{0,100},{0,-100},{0,-98}}),
Text(origin = {-126, 2},lineColor = {0, 0, 127}, extent = {{24, -78}, {106, -100}}, textString = "Zone/Amb"),
Text(origin = {-130, 4}, lineColor = {0, 0, 127}, extent = {{32, 104}, {98, 70}}, textString = "FlowElem"),
Text(lineColor = {0, 0, 127}, extent = {{36, 26}, {88, -10}}, textString = "h=%h"),
Rectangle(fillColor = {255, 0, 0}, pattern = LinePattern.None, fillPattern = FillPattern.Solid, extent = {{-16, 80}, {16, -80}}),
Rectangle(visible = false, fillColor = {85, 170, 255}, pattern = LinePattern.None, fillPattern = FillPattern.Solid, extent = {{-16, 80}, {16, 0}}),
Rectangle(visible = false, fillColor = {85, 170, 255}, pattern = LinePattern.None, fillPattern = FillPattern.Solid, extent = {{-16, 80}, {16, 54}}),
Rectangle(fillColor = {85, 170, 255}, pattern = LinePattern.None, fillPattern = FillPattern.Solid, extent = {{-16, 0}, {16, -82}}),
Rectangle(visible = false, fillColor = {85, 170, 255}, pattern = LinePattern.None, fillPattern = FillPattern.Solid, extent = {{-16, -55}, {16, -80}})}),
defaultComponentName="col",
Documentation(info="<html>
<p>
This model describes the pressure difference of a vertical medium
column. It can be used to model the pressure difference caused by
stack effect.
It is a variation on IDEAS.Airflow.Multizone.MediumColumn.
</p>
</html>",
revisions="<html>
<ul>
<li>
January 19, 2022, by Klaas De Jonge:<br/>
Adapted IDEAS.Airflow.Multizone.MediumColumn to obtain the current model where input of
h can be negative and cleaned out the model as the density should always be set by port_b.
This makes port_a not nececarilly always the top port.
</li>
</ul>
</html>"));
end MediumColumnReversible;
Loading

0 comments on commit 07479a2

Please sign in to comment.