From f6679b98f9b775cdb6aeb130a814889606224027 Mon Sep 17 00:00:00 2001 From: Huang <7q0@ornl.gov> Date: Thu, 28 Mar 2024 13:56:33 -0400 Subject: [PATCH 01/16] first implementation --- .../Desiccant/BaseClasses/PartialDesiccant.mo | 322 ++++++++++++++++++ .../Desiccant/BaseClasses/Performance.mo | 231 +++++++++++++ .../BaseClasses/Validation/Performance.mo | 110 ++++++ .../BaseClasses/Validation/package.mo | 20 ++ .../BaseClasses/Validation/package.order | 1 + .../Desiccant/BaseClasses/package.mo | 11 + .../Desiccant/BaseClasses/package.order | 4 + .../Desiccant/BaseClasses/performanceCurve.mo | 67 ++++ .../Dehumidifiers/Desiccant/Data/Default.mo | 51 +++ .../Dehumidifiers/Desiccant/Data/Generic.mo | 35 ++ .../Dehumidifiers/Desiccant/Data/package.mo | 8 + .../Desiccant/Data/package.order | 2 + .../Desiccant/ElectricCoilVariableSpeedFan.mo | 110 ++++++ .../Examples/ElectricCoilVariableSpeedFan.mo | 138 ++++++++ .../Desiccant/Examples/package.mo | 4 + .../Desiccant/Examples/package.order | 1 + .../Fluid/Dehumidifiers/Desiccant/package.mo | 10 + .../Dehumidifiers/Desiccant/package.order | 4 + Buildings/Fluid/Dehumidifiers/package.mo | 10 + Buildings/Fluid/Dehumidifiers/package.order | 1 + 20 files changed, 1140 insertions(+) create mode 100644 Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo create mode 100644 Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Performance.mo create mode 100644 Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mo create mode 100644 Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/package.mo create mode 100644 Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/package.order create mode 100644 Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/package.mo create mode 100644 Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/package.order create mode 100644 Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/performanceCurve.mo create mode 100644 Buildings/Fluid/Dehumidifiers/Desiccant/Data/Default.mo create mode 100644 Buildings/Fluid/Dehumidifiers/Desiccant/Data/Generic.mo create mode 100644 Buildings/Fluid/Dehumidifiers/Desiccant/Data/package.mo create mode 100644 Buildings/Fluid/Dehumidifiers/Desiccant/Data/package.order create mode 100644 Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilVariableSpeedFan.mo create mode 100644 Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilVariableSpeedFan.mo create mode 100644 Buildings/Fluid/Dehumidifiers/Desiccant/Examples/package.mo create mode 100644 Buildings/Fluid/Dehumidifiers/Desiccant/Examples/package.order create mode 100644 Buildings/Fluid/Dehumidifiers/Desiccant/package.mo create mode 100644 Buildings/Fluid/Dehumidifiers/Desiccant/package.order create mode 100644 Buildings/Fluid/Dehumidifiers/package.mo create mode 100644 Buildings/Fluid/Dehumidifiers/package.order diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo new file mode 100644 index 00000000000..5f47e307a92 --- /dev/null +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo @@ -0,0 +1,322 @@ +within Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses; +partial model PartialDesiccant + "Partial model for desiccant dehumidifiers" + replaceable package Medium1 = + Modelica.Media.Interfaces.PartialCondensingGases + "Process air"; + replaceable package Medium2 = + Modelica.Media.Interfaces.PartialCondensingGases + "Regeneration air"; + parameter Modelica.Units.SI.MassFlowRate m1_flow_nominal + "Nominal process air mass flow rate" + annotation (Dialog(group="Nominal condition")); + parameter Modelica.Units.SI.MassFlowRate m2_flow_nominal + "Nominal regeneration air mass flow rate" + annotation (Dialog(group="Nominal condition")); + parameter Modelica.Units.SI.PressureDifference dp1_nominal( + displayUnit="Pa") + "Nominal process air pressure drop" + annotation (Dialog(group="Nominal condition")); + parameter Modelica.Units.SI.PressureDifference dp2_nominal( + displayUnit="Pa") + "Nominal regeneration air pressure drop" + annotation (Dialog(group="Nominal condition")); + parameter Modelica.Units.SI.Time tau=30 + "Time constant of the regeneration air at nominal flow "; + parameter Real PMot_nominal( + final unit="W") + "Nominal power consumption of the motor" + annotation (Dialog(group="Nominal condition")); + parameter Real vPro_nominal + "Nominal velocity of the process air" + annotation (Dialog(group="Nominal condition")); + final parameter Modelica.Units.SI.VolumeFlowRate VPro_flow_nominal = m1_flow_nominal/rho_Pro_default + "Nominal volumetric flow rate of the process air" + annotation (Dialog(group="Nominal condition")); + parameter Real vReg_nominal + "Nominal velocity of the regeneration air" + annotation (Dialog(group="Nominal condition")); + final parameter Modelica.Units.SI.VolumeFlowRate VReg_flow_nominal = m2_flow_nominal/rho_Reg_default + "Nominal volumetric flow rate of the regeneration air" + annotation (Dialog(group="Nominal condition")); + parameter Modelica.Units.SI.HeatFlowRate QReg_flow_nominal + "Nominal regeneration heating capacity" + annotation (Dialog(group="Nominal condition")); + parameter Buildings.Fluid.Dehumidifiers.Desiccant.Data.Generic perDat + "Performance data" + annotation (Placement(transformation(extent={{60,-78},{80,-58}}))); + Modelica.Blocks.Interfaces.RealInput uBypDamPos( + final unit="1", + final min=0, + final max=1) + "Bypass damper position" + annotation (Placement(transformation(extent={{-280,-20},{-240,20}}), + iconTransformation(extent={{-140,-20},{-100,20}}))); + Modelica.Blocks.Interfaces.BooleanInput uRot + "True when the wheel is operating" annotation (Placement(transformation( + extent={{-278,-140},{-238,-100}}), + iconTransformation(extent={{-140,-80}, + {-100,-40}}))); + Modelica.Blocks.Interfaces.RealOutput P( + final unit="W") + "Electric power consumption" + annotation (Placement(transformation(extent={{100,-10},{120,10}}), + iconTransformation(extent={{100,-10},{120,10}}))); + Modelica.Fluid.Interfaces.FluidPort_a port_a1( + redeclare final package Medium = Medium1) + "Fluid connector a1 of the supply air (positive design flow direction is from port_a1 to port_b1)" + annotation (Placement(transformation(extent={{-250,-112},{-230,-92}}), + iconTransformation(extent={{-110,-90},{-90,-70}}))); + Modelica.Fluid.Interfaces.FluidPort_b port_b2( + redeclare final package Medium = Medium2) + "Fluid connector b2 of the exhaust air (positive design flow direction is from port_a2 to port_b2)" + annotation (Placement(transformation(extent={{-230,70},{-250,90}}), + iconTransformation(extent={{-110,70},{-90,90}}))); + Modelica.Fluid.Interfaces.FluidPort_b port_b1( + redeclare final package Medium = Medium1) + "Fluid connector b1 of the supply air (positive design flow direction is from port_a1 to port_b1)" + annotation (Placement(transformation(extent={{110,-112},{90,-92}}), + iconTransformation(extent={{110,-90},{90,-70}}))); + Modelica.Fluid.Interfaces.FluidPort_a port_a2( + redeclare final package Medium = Medium2) + "Fluid connector a2 of the exhaust air (positive design flow direction is from port_a2 to port_b2)" + annotation (Placement(transformation(extent={{90,70},{110,90}}), + iconTransformation(extent={{90,70},{110,90}}))); +protected + Buildings.Fluid.Actuators.Dampers.Exponential bypDamPro( + redeclare package Medium = Medium1, + final m_flow_nominal=m1_flow_nominal, + final dpDamper_nominal=dp1_nominal) "Process air bypass damper" + annotation (Placement(transformation(extent={{-170,-130},{-150,-110}}))); + Buildings.Fluid.Actuators.Dampers.Exponential damPro( + redeclare package Medium = Medium1, + final m_flow_nominal=m1_flow_nominal, + final dpDamper_nominal=dp1_nominal) "Process air damper" + annotation (Placement(transformation( + extent={{-10,-10},{10,10}},rotation=0,origin={-134,-102}))); + Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter PEleMot( + final k= PMot_nominal) + "Calculate the motor power consumption" + annotation (Placement(transformation(extent={{-18,-40},{0,-22}}))); + Modelica.Blocks.Math.BooleanToReal booleanToReal + "Convert boolean input to real output" + annotation (Placement(transformation(extent={{-200,0},{-180,20}}))); + Buildings.Fluid.Interfaces.PrescribedOutlet outCon( + redeclare package Medium = Medium1, + final m_flow_nominal=m1_flow_nominal, + energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial) + "Model to set outlet conditions" + annotation (Placement(transformation(extent={{-6,-112},{14,-92}}))); + Modelica.Blocks.Sources.Constant uni( + final k=1) + "Unity signal" + annotation (Placement(transformation(extent={{-220,-30},{-200,-10}}))); + Buildings.Controls.OBC.CDL.Reals.Subtract sub + "Difference of the two inputs" + annotation (Placement(transformation(extent={{-166,-36},{-146,-16}}))); + Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.Performance dehPer( + final vPro_nominal=vPro_nominal, + final VPro_flow_nominal=vPro_nominal, + final vReg_nominal=vReg_nominal, + final VReg_flow_nominal=VReg_flow_nominal, + final QReg_flow_nominal=QReg_flow_nominal, + final per=perDat) + "Calculate the performance of the dehumidifier" + annotation (Placement(transformation(extent={{-58,-94},{-38,-74}}))); + Modelica.Blocks.Sources.RealExpression VPro_flow( + final y(final unit="m3/s")= damPro.port_a.m_flow/Medium1.density( + state=Medium1.setState_phX( + p=port_a1.p, + h=port_a1.h_outflow, + X=port_a1.Xi_outflow))) + "Process air volume flow rate" + annotation (Placement(transformation(extent={{-110,-106},{-90,-86}}))); + Modelica.Blocks.Sources.RealExpression TProEnt( + final y(final unit="K")= + Medium1.temperature(Medium1.setState_phX( + p=port_a1.p, + h=inStream(port_a1.h_outflow), + X=inStream(port_a1.Xi_outflow)))) + "Temperature of the process air entering the dehumidifier" + annotation (Placement(transformation(extent={{-110,-38},{-90,-18}}))); + Modelica.Blocks.Sources.RealExpression TRegEnt( + final y(final unit="K")= + Medium2.temperature(Medium2.setState_phX( + p=port_a2.p, + h=inStream(port_a2.h_outflow), + X=inStream(port_a2.Xi_outflow)))) + "Temperature of the regeneration air entering the dehumidifier" + annotation (Placement(transformation(extent={{-110,-54},{-90,-34}}))); + Modelica.Blocks.Sources.RealExpression X_w_ProEnt( + final y(final unit="1") = port_a1.Xi_outflow[i1_w]) + "Humidity ratio of the process air entering the dehumidifier" + annotation (Placement(transformation(extent={{-110,-72},{-90,-52}}))); + Buildings.Fluid.MixingVolumes.MixingVolumeMoistAir + vol(redeclare final package Medium = Medium2, + massDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + final m_flow_nominal=m2_flow_nominal, + energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + V=m2_flow_nominal*tau/rho_Reg_default, + nPorts=1) + "Volume for the regeneration air stream" + annotation (Placement(transformation(extent={{-105,66},{-85,46}}))); + Modelica.Blocks.Math.Gain gai1( + final k=-1) + "Find the opposite number of the input" + annotation (Placement(transformation(extent={{0,0},{-20,20}}))); + Modelica.Blocks.Math.Gain gai2( + final k=-1) + "Find the opposite number of the input" + annotation (Placement(transformation(extent={{0,30},{-20,50}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow prescribedHeatFlow + annotation (Placement(transformation(extent={{-62,50},{-82,30}}))); + Modelica.Blocks.Sources.RealExpression mPro_flow( + final y(final unit="kg/s")= damPro.port_a.m_flow) "Process air mass flow rate" + annotation (Placement(transformation(extent={{-110,-124},{-90,-104}}))); + + parameter Integer i1_w(min=1, fixed=false) "Index for water substance"; + parameter Medium2.ThermodynamicState sta_Reg_default=Medium2.setState_pTX( + T=Medium2.T_default, + p=Medium2.p_default, + X=Medium2.X_default) + "Default state of the regeneration air"; + parameter Modelica.Units.SI.Density rho_Reg_default=Medium2.density(sta_Reg_default) + "Default density of the regeneration air"; + parameter Medium2.ThermodynamicState sta_Pro_default=Medium2.setState_pTX( + T=Medium2.T_default, + p=Medium2.p_default, + X=Medium2.X_default) + "Default state of the process air"; + parameter Modelica.Units.SI.Density rho_Pro_default=Medium2.density(sta_Pro_default) + "Default density of the process air"; + +initial algorithm + i1_w:= -1; + for i in 1:Medium1.nXi loop + if Modelica.Utilities.Strings.isEqual(string1=Medium1.substanceNames[i], + string2="Water", + caseSensitive=false) then + i1_w := i; + end if; + end for; + +equation + connect(booleanToReal.u, uRot) annotation (Line(points={{-202,10},{-226,10},{ + -226,-86},{-220,-86},{-220,-120},{-258,-120}}, + color={255,0,255})); + connect(PEleMot.u, booleanToReal.y) annotation (Line(points={{-19.8,-31},{-22, + -31},{-22,-32},{-54,-32},{-54,10},{-179,10}}, color={0,0,127})); + connect(bypDamPro.port_a, port_a1) annotation (Line(points={{-170,-120},{-184, + -120},{-184,-102},{-240,-102}}, + color={0,127,255})); + connect(bypDamPro.port_b, port_b1) annotation (Line(points={{-150,-120},{80,-120}, + {80,-102},{100,-102}}, + color={0,127,255})); + connect(dehPer.TProLea, outCon.TSet) annotation (Line(points={{-37,-76},{-12,-76}, + {-12,-94},{-7,-94}}, color={0,0,127})); + connect(dehPer.X_w_ProLea, outCon.X_wSet) annotation (Line(points={{-37,-80},{ + -14,-80},{-14,-98},{-7,-98}}, color={0,0,127})); + connect(uni.y, sub.u1) annotation (Line(points={{-199,-20},{-168,-20}}, + color={0,0,127})); + connect(sub.u2, uBypDamPos) annotation (Line(points={{-168,-32},{-192,-32},{-192, + -52},{-230,-52},{-230,0},{-260,0}}, + color={0,0,127})); + connect(sub.y, damPro.y) + annotation (Line(points={{-144,-26},{-134,-26},{-134,-90}}, + color={0,0,127})); + connect(bypDamPro.y, uBypDamPos) annotation (Line(points={{-160,-108},{-160,-52}, + {-230,-52},{-230,0},{-260,0}}, color={0,0,127})); + connect(dehPer.onDeh, uRot) annotation (Line(points={{-59,-75.8},{-59,-76},{ + -220,-76},{-220,-120},{-258,-120}}, color={255,0,255})); + connect(VPro_flow.y, dehPer.VPro_flow) annotation (Line(points={{-89,-96},{-78, + -96},{-78,-92.2},{-59,-92.2}}, color={0,0,127})); + connect(damPro.port_a, port_a1) + annotation (Line(points={{-144,-102},{-240,-102}}, color={0,127,255})); + connect(damPro.port_b,outCon. port_a) + annotation (Line(points={{-124,-102},{-6,-102}}, color={0,127,255})); + connect(outCon.port_b, port_b1) + annotation (Line(points={{14,-102},{100,-102}}, color={0,127,255})); + connect(TProEnt.y, dehPer.TProEnt) annotation (Line(points={{-89,-28},{-70,-28}, + {-70,-79.8},{-59,-79.8}}, color={0,0,127})); + connect(TRegEnt.y, dehPer.TRegEnt) annotation (Line(points={{-89,-44},{-84,-44}, + {-84,-84},{-59,-84}}, color={0,0,127})); + connect(X_w_ProEnt.y, dehPer.X_w_ProEnt) annotation (Line(points={{-89,-62},{-86, + -62},{-86,-88},{-59,-88}}, color={0,0,127})); + connect(outCon.mWat_flow, gai1.u) annotation (Line(points={{15,-98},{18,-98},{ + 18,-92},{20,-92},{20,10},{2,10}}, + color={0,0,127})); + connect(gai1.y, vol.mWat_flow) annotation (Line(points={{-21,10},{-40,10},{ + -40,20},{-130,20},{-130,48},{-107,48}}, + color={0,0,127})); + connect(prescribedHeatFlow.Q_flow, gai2.y) + annotation (Line(points={{-62,40},{-21,40}}, color={0,0,127})); + connect(prescribedHeatFlow.port, vol.heatPort) annotation (Line(points={{-82,40}, + {-120,40},{-120,56},{-105,56}}, color={191,0,0})); + connect(gai2.u,outCon. Q_flow) annotation (Line(points={{2,40},{40,40},{40,-94}, + {15,-94}}, color={0,0,127})); + connect(vol.ports[1], port_b2) annotation (Line(points={{-95,66},{-144,66},{ + -144,80},{-240,80}}, + color={0,127,255})); + connect(mPro_flow.y, dehPer.mPro_flow) annotation (Line(points={{-89,-114},{-48, + -114},{-48,-95}}, color={0,0,127})); + annotation (Dialog(group="Nominal condition"), + Icon(coordinateSystem(preserveAspectRatio=false, extent={{-100,-100}, + {100,100}}), graphics={ + Rectangle( + extent={{-86,92},{6,-90}}, + lineColor={28,108,200}, + fillPattern=FillPattern.CrossDiag, + fillColor={255,255,255}), + Rectangle( + extent={{-94,86},{-86,76}}, + lineColor={238,46,47}, + pattern=LinePattern.None, + fillColor={238,46,47}, + fillPattern=FillPattern.Solid), + Rectangle( + extent={{-92,-74},{-86,-84}}, + lineColor={238,46,47}, + pattern=LinePattern.None, + fillColor={28,108,200}, + fillPattern=FillPattern.Solid), + Rectangle( + extent={{6,-74},{98,-84}}, + lineColor={238,46,47}, + pattern=LinePattern.None, + fillColor={106,162,200}, + fillPattern=FillPattern.Solid), + Text( + extent={{-149,-104},{151,-144}}, + textColor={0,0,255}, + textString="%name")}), Diagram( + coordinateSystem(preserveAspectRatio=false, extent={{-240,-140},{100,100}})), + Documentation(info=" +

+Partial model of a desiccant dehumidifier. +Specifically, this model considers the following configuration. +

+

+ +

+

+This model should be extended with a heating coil and/or a fan in the regeneration air stream. +

+This model takes two inputs: a boolean signal for dehumidification and a real signal for the bypass damper position. + +", revisions=" + +")); +end PartialDesiccant; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Performance.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Performance.mo new file mode 100644 index 00000000000..a7760693984 --- /dev/null +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Performance.mo @@ -0,0 +1,231 @@ +within Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses; +model Performance + "Model calculates the outlet condition of the process air through a desiccant dehumidifier" + extends Modelica.Blocks.Icons.Block; + + parameter Real vPro_nominal( + final unit="m/s") + "Nominal velocity of the process air"; + parameter Modelica.Units.SI.VolumeFlowRate VPro_flow_nominal + "Nominal volumetric flow rate of the process air"; + parameter Real vReg_nominal( + final unit="m/s") + "Nominal velocity of the regeneration air"; + parameter Modelica.Units.SI.VolumeFlowRate VReg_flow_nominal + "Nominal volumetric flow rate of the regeneration air"; + parameter Modelica.Units.SI.HeatFlowRate QReg_flow_nominal + "Nominal regeneration heating capacity"; + parameter Buildings.Fluid.Dehumidifiers.Desiccant.Data.Generic per + "Performance data" + annotation (Placement(transformation(extent={{60,64},{80,84}}))); + Modelica.Blocks.Interfaces.BooleanInput onDeh + "Set to true to enable the dehumidification process" annotation (Placement( + transformation(extent={{-124,68},{-100,92}}), iconTransformation(extent= + {{-120,72},{-100,92}}))); + Modelica.Blocks.Interfaces.RealInput TProEnt( + final unit="K") + "Temperature of the process air entering the dehumidifier" + annotation (Placement(transformation(extent={{-124,28},{-100,52}}), + iconTransformation(extent={{-120,32},{-100,52}}))); + Modelica.Blocks.Interfaces.RealInput X_w_ProEnt( + final unit="1") + "Humidity ratio of the process air entering the dehumidifier" + annotation (Placement(transformation( + extent={{-124,-54},{-100,-30}}),iconTransformation(extent={{-120,-50}, + {-100,-30}}))); + Modelica.Blocks.Interfaces.RealInput VPro_flow( + final unit="m3/s") + "Volumetric flow rate of the process air" + annotation (Placement(transformation( + extent={{-124,-92},{-100,-68}}), + iconTransformation(extent={{-120,-92},{-100,-72}}))); + Modelica.Blocks.Interfaces.RealInput mPro_flow( + final unit="kg/s") + "Mass flow rate of the process air" annotation (Placement(transformation( + extent={{-12,-12},{12,12}}, + rotation=90, + origin={0,-112}), iconTransformation( + extent={{-10,-10},{10,10}}, + rotation=90, + origin={0,-110}))); + Modelica.Blocks.Interfaces.RealInput TRegEnt( + final unit="K") + "Temperature of the regeneration air entering the dehumidifier" annotation ( + Placement(transformation(extent={{-124,-14},{-100,10}}), + iconTransformation(extent={{-120,-10},{-100,10}}))); + Modelica.Blocks.Interfaces.RealOutput TProLea( + final unit="K") + "Temperature of the process air leaving the dehumidifier" annotation ( + Placement(transformation(extent={{100,70},{120,90}}), iconTransformation( + extent={{100,70},{120,90}}))); + Modelica.Blocks.Interfaces.RealOutput X_w_ProLea( + final unit="1") + "Humidity ratio of the process air leaving the dehumidifier" + annotation (Placement(transformation(extent={{100,30},{120,50}}), + iconTransformation(extent={{100,30},{120,50}}))); + Modelica.Blocks.Interfaces.RealOutput VReg_flow(final unit="m3/s") + "Volumetric flow rate of the regeneration air" annotation (Placement(transformation( + extent={{100,-50},{120,-30}}), iconTransformation(extent={{100,-50},{120, + -30}}))); + Modelica.Blocks.Interfaces.RealOutput yQReg(final unit="1") + "Regeneration heating output ratio" annotation (Placement(transformation( + extent={{100,-90},{120,-70}}), iconTransformation(extent={{100,-90},{120, + -70}}))); +protected + Real CpReg(final unit="J/kg") + "Specific regeneration energy"; + +equation + if onDeh then + // Check the inlet condition of the process inlet condition. + assert(TProEnt <= per.TProEnt_max and TProEnt >= per.TProEnt_min, + "In " + getInstanceName() + ": temperature of the process air entering the dehumidifier in + the range that is defined in the performance curve.", + level=AssertionLevel.error); + assert(X_w_ProEnt <= per.X_w_ProEnt_max and X_w_ProEnt >= per.X_w_ProEnt_min, + "In " + getInstanceName() + ": humidity ratio of the process air entering the dehumidifier in + the range that is defined in the performance curve.", + level=AssertionLevel.error); + VReg_flow = + Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.performanceCurve( + TProEnt=TProEnt, + X_w_ProEnt=X_w_ProEnt, + vPro=VPro_flow/VPro_flow_nominal*vPro_nominal, + a=per.vRegCoe)/vReg_nominal*VReg_flow_nominal; + assert(VReg_flow < VReg_flow_nominal, + "In " + getInstanceName() + ": regeneration flow rate is not sufficient.", + level=AssertionLevel.error); + TProLea = Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.performanceCurve( + TProEnt = TProEnt, + X_w_ProEnt = X_w_ProEnt, + vPro = VPro_flow/VPro_flow_nominal*vPro_nominal, + a = per.TProLeaCoe) + 273.15; + X_w_ProLea = Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.performanceCurve( + TProEnt = TProEnt, + X_w_ProEnt = X_w_ProEnt, + vPro = VPro_flow/VPro_flow_nominal*vPro_nominal, + a = per.X_w_ProLeaCoe); + assert(X_w_ProLea > 0, + "In " + getInstanceName() + ": humidity ratio of the process air leaving + the dehumidifier becomes negative.", + level=AssertionLevel.error); + CpReg = Buildings.Utilities.Math.Functions.smoothMax( + x1 = Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.performanceCurve( + TProEnt = TProEnt, + X_w_ProEnt = X_w_ProEnt, + vPro = VPro_flow/VPro_flow_nominal*vPro_nominal, + a = per.QReg_flowCoe), + x2 = 0, + deltaX = 0.01); + yQReg = CpReg*(X_w_ProEnt - X_w_ProLea)*mPro_flow*(per.TRegEnt_nominal - + TRegEnt)/(per.TRegEnt_nominal - TProEnt)/QReg_flow_nominal; + assert(yQReg < 1, + "In " + getInstanceName() + ": regeneration heating output is not sufficient.", + level=AssertionLevel.error); + else + //No dehumidification occurs. + TProLea = TProEnt; + X_w_ProLea = X_w_ProEnt; + VReg_flow = 0; + CpReg = 0; + yQReg = 0; + end if; + annotation ( + defaultComponentName="dehPer", + Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( + coordinateSystem(preserveAspectRatio=false)), + Documentation(info=" +

+This model calculates the outlet condition of the process air of a desiccant dehumidifier based on +the inlet condition of the process air. +Specifically, this calculation is configured as follows. +

+ +

References

+ + +", revisions=" + +")); +end Performance; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mo new file mode 100644 index 00000000000..4b889b1b1f2 --- /dev/null +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mo @@ -0,0 +1,110 @@ +within Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.Validation; +model Performance + "Validate the performance calculation for a desiccant dehumidifier" + extends Modelica.Icons.Example; + Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.Performance dehumPer( + vPro_nominal=2, + VPro_flow_nominal=1, + vReg_nominal=4, + VReg_flow_nominal=1, + QReg_flow_nominal=50000, + per=perDat) + "Performance calculation" + annotation (Placement(transformation(extent={{-10,-10},{10,10}}))); + Modelica.Blocks.Sources.BooleanStep onDeh(startTime=50, startValue=false) + "Dehumidification signal" + annotation (Placement(transformation(extent={{-80,70},{-60,90}}))); + Buildings.Fluid.Dehumidifiers.Desiccant.Data.Default perDat + "Performance data" + annotation (Placement(transformation(extent={{60,64},{80,84}}))); + Modelica.Blocks.Sources.Ramp TProEnt( + height=10, + duration=100, + offset=273.15 + 20) + "Temperature of the process air entering the dehumidifier" + annotation (Placement(transformation(extent={{-80,30},{-60,50}}))); + Modelica.Blocks.Sources.Ramp X_w_ProEnt( + height=0.005, + duration=100, + offset=0.02) + "Humidity ratio of the process air entering the dehumidifier" + annotation (Placement(transformation(extent={{-80,-50},{-60,-30}}))); + Modelica.Blocks.Sources.Ramp TRegEnt( + height=-10, + duration=100, + offset=273.15 + 80) + "Temperature of the regeneration air entering the dehumidifier" + annotation (Placement(transformation(extent={{-80,-10},{-60,10}}))); + Modelica.Blocks.Sources.Ramp VPro_flow( + height=0.5, + duration=100, + offset=0.5) + "Volumetric flow rate of the process air" + annotation (Placement(transformation(extent={{-80,-90},{-60,-70}}))); + Modelica.Blocks.Math.Gain gai(k=1.2) + "Converts the volumetric flow rate to the mass flow rate" + annotation (Placement(transformation(extent={{-22,-86},{-10,-74}}))); +equation + connect(onDeh.y, dehumPer.onDeh) annotation (Line(points={{-59,80},{-44,80},{ + -44,8.2},{-11,8.2}}, color={255,0,255})); + connect(TProEnt.y, dehumPer.TProEnt) annotation (Line(points={{-59,40},{-20, + 40},{-20,4.2},{-11,4.2}}, color={0,0,127})); + connect(TRegEnt.y, dehumPer.TRegEnt) + annotation (Line(points={{-59,0},{-11,0}}, color={0,0,127})); + connect(dehumPer.X_w_ProEnt, X_w_ProEnt.y) annotation (Line(points={{-11,-4}, + {-40,-4},{-40,-40},{-59,-40}}, color={0,0,127})); + connect(VPro_flow.y, dehumPer.VPro_flow) annotation (Line(points={{-59,-80},{ + -34,-80},{-34,-8.2},{-11,-8.2}}, color={0,0,127})); + connect(gai.u, VPro_flow.y) + annotation (Line(points={{-23.2,-80},{-59,-80}}, color={0,0,127})); + connect(gai.y, dehumPer.mPro_flow) annotation (Line(points={{-9.4,-80},{0,-80}, + {0,-11}}, color={0,0,127})); + annotation (experiment(Tolerance=1e-6, StopTime=100), + __Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mos" + "Simulate and Plot"), Documentation(info=" +

+Validation test for the block + +Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.Performance. +

+

+The input signals are configured as follows: +

+ +

+The expected outputs are: +

+ +", revisions=" + +")); +end Performance; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/package.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/package.mo new file mode 100644 index 00000000000..57400052658 --- /dev/null +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/package.mo @@ -0,0 +1,20 @@ +within Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses; +package Validation "Validation of the baseclasses" +extends Modelica.Icons.ExamplesPackage; + +annotation (Documentation(info=" +

+This package contains validation models for the classes in + +Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses. +

+

+Note that most validation models contain simple input data +which may not be realistic, but for which the correct +output can be obtained through an analytic solution. +The examples plot various outputs, which have been verified against these +solutions. These model outputs are stored as reference data and +used for continuous validation whenever models in the library change. +

+")); +end Validation; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/package.order b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/package.order new file mode 100644 index 00000000000..76ca7b0a63a --- /dev/null +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/package.order @@ -0,0 +1 @@ +Performance diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/package.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/package.mo new file mode 100644 index 00000000000..364288ed567 --- /dev/null +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/package.mo @@ -0,0 +1,11 @@ +within Buildings.Fluid.Dehumidifiers.Desiccant; +package BaseClasses "Package with base classes for desiccant dehumidifier model" +extends Modelica.Icons.BasesPackage; + +annotation (Documentation(info=" +

+This package contains base classes that are used to construct the models in +Buildings.Fluid.Dehumidifiers.Desiccant. +

+")); +end BaseClasses; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/package.order b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/package.order new file mode 100644 index 00000000000..730ca6984f4 --- /dev/null +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/package.order @@ -0,0 +1,4 @@ +PartialDesiccant +Performance +performanceCurve +Validation \ No newline at end of file diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/performanceCurve.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/performanceCurve.mo new file mode 100644 index 00000000000..b020ab267b3 --- /dev/null +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/performanceCurve.mo @@ -0,0 +1,67 @@ +within Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses; +function performanceCurve + "Performance curve of a generic desiccant dehumidifiers" + input Modelica.Units.SI.Temperature TProEnt + "Temperature of the process air entering the dehumidifier"; + input Modelica.Units.SI.MassFraction X_w_ProEnt + "Humidity ratio of the process air entering the dehumidifier"; + input Modelica.Units.SI.Velocity vPro + "Velocity of the process air"; + input Real a[16] + "Performance coefficients"; + output Real y + "Return value"; +protected + Modelica.Units.NonSI.Temperature_degC TProEnt_degC + "Temperature of the process air entering the dehumidifier"; + +algorithm + TProEnt_degC := Modelica.Units.Conversions.to_degC(TProEnt); + y:= a[1] + a[2]*TProEnt_degC + a[3]* X_w_ProEnt + a[4]*vPro + + a[5]*TProEnt_degC*X_w_ProEnt + + a[6]*TProEnt_degC*vPro + + a[7]*X_w_ProEnt*vPro + a[8]*TProEnt_degC*TProEnt_degC + + a[9]*X_w_ProEnt*X_w_ProEnt+ a[10]*vPro*vPro + + a[11]*TProEnt_degC*TProEnt_degC*X_w_ProEnt*X_w_ProEnt + + a[12]*TProEnt_degC*TProEnt_degC*vPro*vPro + + a[13]*X_w_ProEnt*X_w_ProEnt*vPro*vPro + + a[14]*Modelica.Math.log(TProEnt_degC) + + a[15]*Modelica.Math.log(X_w_ProEnt) + + a[16]*Modelica.Math.log(vPro); + + annotation (Documentation(info=" +This function computes a performance curve of desiccant dehumidifiers, with the following form +

+ y = a1 + a2 TProEnt + a3 X_w_ProEnt + a4 vPro + + a5 TProEnt X_w_ProEnt + a6 TProEnt vPro + + a7 X_w_ProEnt vPro + a8 TProEnt TProEnt + + a9 X_w_ProEnt X_w_ProEnt + a10 vPro vPro + + a11 TProEnt TProEnt X_w_ProEnt X_w_ProEnt + + a12 TProEnt TProEnt vPro vPro + + a13 X_w_ProEnt X_w_ProEnt vPro vPro + + a14log(TProEnt) + + a15log(X_w_ProEnt) + + a16log(vPro) +

+

+where TProEnt is the temperature of the process air entering the dehumidifier (°C); +
+X_w_ProEnt is the humidity ratio of the process air entering the dehumidifier (kg/kg); +
+vPro is the velocity of the process air (m/s); +
+a1,...a16 are coefficients. +

+

References

+ +", revisions=" + +")); +end performanceCurve; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/Data/Default.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/Data/Default.mo new file mode 100644 index 00000000000..e8403dcf91b --- /dev/null +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/Data/Default.mo @@ -0,0 +1,51 @@ +within Buildings.Fluid.Dehumidifiers.Desiccant.Data; +record Default = + Buildings.Fluid.Dehumidifiers.Desiccant.Data.Generic ( + TRegEnt_nominal = 273.15 + 121, + TProEnt_min = 273.15 + 1.67, + TProEnt_max = 273.15 + 48.9, + X_w_ProEnt_min = 0.002857, + X_w_ProEnt_max = 0.02857, + TProLeaCoe = {-38.7782841989449, 2.0127655837628, + 5212.49360216097,15.2362536782665, + -80.4910419759181,-0.105014122001509, + -229.668673645144,-0.015424703743461, + -69440.0689831847,-1.6686064694322, + 38.5855718977592, 0.000196395381206009, + 386.179386548324,-0.801959614172614, + -3.33080986818745,-15.203438606571}, + X_w_ProLeaCoe = {0.0148880824323806,-0.000283393198398211, + -0.87802168940547, -0.000713615831236411, + 0.0311261188874622, 1.51738892142485e-06, + 0.0287250198281021, 4.94796903231558e-06, + 24.0771139652826, 0.000122270283927978, + -0.0151657189566474, 3.91641393230322e-08, + 0.126032651553348, 0.000391653854431574, + 0.002160537360507, 0.00132732844211593}, + vRegCoe = {-4.67358908091488, 0.0654323095468338, + 396.950518702316, 1.52610165426736, + -11.3955868430328,0.00520693906104437, + 57.783645385621, -0.000464800668311693, + -5958.78613212602, -0.205375818291012, + 5.26762675442845, -8.88452553055039e-05, + -182.382479369311, -0.100289774002047, + -0.486980507964251, -0.972715425435447}, + QReg_flowCoe = {-27794046.6291107, -235725.171759615, + 975461343.331328, -686069.373946731, + -17717307.3766266, 31482.2539662489, + 55296552.8260743, 6195.36070023868, + -8304781359.40435, -188987.543809419, + 3933449.40965846, -6.66122876558634, + -349102295.417547, 83672.179730172, + -6059524.33170538, 1220523.39525162}) + "Default data record for desiccant dehumidifiers" annotation (Documentation( + info=" +Performance data for desiccant dehumidifier model. +This data corresponds to the default operation curves for the EnergyPlus object, +Dehumidifier:Desiccant:NoFans + +", revisions=" + +")); diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/Data/Generic.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/Data/Generic.mo new file mode 100644 index 00000000000..548dcd1f9fa --- /dev/null +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/Data/Generic.mo @@ -0,0 +1,35 @@ +within Buildings.Fluid.Dehumidifiers.Desiccant.Data; +record Generic "Generic data record for desiccant dehumidifiers" + extends Modelica.Icons.Record; + + parameter Modelica.Units.SI.Temperature TRegEnt_nominal + "Nominal temperature of the regeneration air entering the dehumidifier"; + parameter Modelica.Units.SI.Temperature TProEnt_max + "Maximum allowable temperature of the process air entering the dehumidifier"; + parameter Modelica.Units.SI.Temperature TProEnt_min + "Minimum allowable temperature of the process air entering the dehumidifier"; + parameter Modelica.Units.SI.MassFraction X_w_ProEnt_max + "Maximum allowable humidity ratio of the process air entering the dehumidifier"; + parameter Modelica.Units.SI.MassFraction X_w_ProEnt_min + "Minimum allowable humidity ratio of the process air entering the dehumidifier"; + parameter Real TProLeaCoe[16] + "Coefficients for calculating the temperature of the process air leaving the dehumidifier"; + parameter Real X_w_ProLeaCoe[16] + "Coefficients for calculating the humidity ratio of the process air leaving the dehumidifier"; + parameter Real vRegCoe[16] + "Coefficients for calculating the velocity of the regeneration air"; + parameter Real QReg_flowCoe[16] + "Coefficients for calculating the regeneration heat flow"; + + annotation (Documentation(info=" +

This record is used as a template for performance data +for the desiccant dehumidifier models in + +Buildings.Fluid.Dehumidifiers.Desiccant. +

+", revisions=" + +")); +end Generic; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/Data/package.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/Data/package.mo new file mode 100644 index 00000000000..12b69a7d4de --- /dev/null +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/Data/package.mo @@ -0,0 +1,8 @@ +within Buildings.Fluid.Dehumidifiers.Desiccant; +package Data "Performance data for desiccant dehumidifier" +extends Modelica.Icons.MaterialPropertiesPackage; + +annotation (Documentation(info=" +Package with performance data for desiccant dehumidifiers. +")); +end Data; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/Data/package.order b/Buildings/Fluid/Dehumidifiers/Desiccant/Data/package.order new file mode 100644 index 00000000000..bcb28246de8 --- /dev/null +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/Data/package.order @@ -0,0 +1,2 @@ +Default +Generic diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilVariableSpeedFan.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilVariableSpeedFan.mo new file mode 100644 index 00000000000..c2c924c386b --- /dev/null +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilVariableSpeedFan.mo @@ -0,0 +1,110 @@ +within Buildings.Fluid.Dehumidifiers.Desiccant; +model ElectricCoilVariableSpeedFan + "Desiccant dehumidifier with a electric heating coil and a variable speed fan" + extends BaseClasses.PartialDesiccant( + vol(nPorts=2)); + parameter Real etaHea( + final min=0, + final max=1) + "Heater efficiency" + annotation (Dialog(group="Efficiency")); + Buildings.Fluid.HeatExchangers.HeaterCooler_u hea( + redeclare package Medium = Medium2, + final m_flow_nominal=m2_flow_nominal, + final dp_nominal=dp2_nominal, + final energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + final Q_flow_nominal=QReg_flow_nominal) + "Heating coil for the regeneration air" + annotation (Placement(transformation(extent={{16,56},{-4,76}}))); + Modelica.Blocks.Math.Add3 add3 + "Sum of the three inputs" + annotation (Placement(transformation(extent={{60,-10},{80,10}}))); + Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter PEleHea( + final k=1/etaHea) + "Calculate the heater power consumption" + annotation (Placement(transformation(extent={{-18,-70},{0,-52}}))); + Buildings.Fluid.Movers.Preconfigured.FlowControlled_m_flow fan( + redeclare package Medium = Medium2, + final m_flow_nominal=m2_flow_nominal, + final dp_nominal=dp2_nominal) + "Regeneration fan" + annotation (Placement(transformation(extent={{80,56},{60,76}}))); + Modelica.Blocks.Sources.RealExpression mReg_flow( + final y(final unit="kg/s")= + dehPer.VReg_flow*Medium2.density(state=Medium2.setState_phX( + p=port_a2.p, + h=port_a2.h_outflow, + X=port_a2.Xi_outflow))) + "Regeneration air mass flow rate" + annotation (Placement(transformation(extent={{20,76},{40,96}}))); +equation + connect(add3.y, P) + annotation (Line(points={{81,0},{110,0}}, color={0,0,127})); + connect(dehPer.yQReg, hea.u) + annotation (Line(points={{-37,-92},{30,-92},{30,72}, + {18,72}}, color={0,0,127})); + connect(hea.port_b, vol.ports[2]) + annotation (Line(points={{-4,66},{-95,66}}, color={0,127,255})); + connect(fan.port_a, port_a2) + annotation (Line(points={{80,66},{84,66},{84,80},{100,80}}, + color={0,127,255})); + connect(fan.port_b, hea.port_a) + annotation (Line(points={{60,66},{16,66}}, color={0,127,255})); + connect(mReg_flow.y,fan. m_flow_in) + annotation (Line(points={{41,86},{70,86},{70,78}}, color={0,0,127})); + connect(add3.u1,fan. P) + annotation (Line(points={{58,8},{34,8},{34,75},{59,75}}, color={0,0,127})); + connect(add3.u2, PEleMot.y) + annotation (Line(points={{58,0},{34,0},{34,-31}, + {1.8, -31}}, color={0,0,127})); + connect(PEleHea.y, add3.u3) + annotation (Line(points={{1.8,-61},{46,-61},{46,-8}, + {58,-8}}, color={0,0,127})); + connect(hea.Q_flow, PEleHea.u) + annotation (Line(points={{-5,72},{-40,72},{-40,-61},{-19.8,-61}}, + color={0,0,127})); + annotation ( + defaultComponentName="deh", + Icon(coordinateSystem(preserveAspectRatio=false), graphics={ + Polygon( + points={{76,94},{50,74},{76,58},{76,94}}, + lineColor={28,108,200}, + fillColor={0,140,72}, + fillPattern=FillPattern.Solid), + Ellipse(extent={{48,98},{86,54}}, lineColor={28,108,200}), + Rectangle( + extent={{16,94},{36,52}}, + lineColor={28,108,200}, + fillColor={238,46,47}, + fillPattern=FillPattern.Solid), + Line(points={{36,94},{16,52}}, color={28,108,200})}), + Diagram( + coordinateSystem(preserveAspectRatio=false)), + Documentation(info=" +

+This model considers a desiccant dehumidifier system with aN electric coil and a variable speed fan, +as shown below. +

+ +

+

+The detailed configuration of the dehumidifier is provided in + +Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.PartialDesiccant. +

+

+Note that the operation of the coil and the fan is assumed to be ideal, meaning they can +provide the required regeneration heating power and the regeneration flow rate, which +are calculated by + +Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.Performance, +when their capacities permit. +

+ +", revisions=" + +")); +end ElectricCoilVariableSpeedFan; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilVariableSpeedFan.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilVariableSpeedFan.mo new file mode 100644 index 00000000000..946e3521726 --- /dev/null +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilVariableSpeedFan.mo @@ -0,0 +1,138 @@ +within Buildings.Fluid.Dehumidifiers.Desiccant.Examples; +model ElectricCoilVariableSpeedFan + "Model that demonstrates the usage of a desiccant dehumidifier model with a electric heater and a variable speed fan" + extends Modelica.Icons.Example; + package Medium1 = Buildings.Media.Air + "Process air"; + package Medium2 = Buildings.Media.Air + "Regeneration air"; + Buildings.Fluid.Sources.Boundary_pT sin_2( + redeclare package Medium = Medium2, + nPorts=1) "Regeneration air sink" + annotation (Placement(transformation(extent={{-60,40},{-40,60}}))); + Buildings.Fluid.Sources.Boundary_pT sou_2( + redeclare package Medium = Medium2, + T(displayUnit="K") = 303.15, + nPorts=1) "Regeneration air source" + annotation (Placement(transformation(extent={{60,40},{40,60}}))); + Modelica.Blocks.Sources.Ramp TProEnt( + height=10, + duration=600, + offset=273.15 + 30, + startTime=600) "Temperature of the process air" + annotation (Placement(transformation(extent={{-98,-70},{-78,-50}}))); + Buildings.Fluid.Sources.Boundary_pT sin_1( + redeclare package Medium = Medium1, + p(displayUnit="Pa") = 101325 - 600, + nPorts=1) "Process air sink" + annotation (Placement(transformation(extent={{90,-50},{70,-30}}))); + Buildings.Fluid.Sources.Boundary_pT sou_1( + redeclare package Medium = Medium1, + T=273.15 + 50, + X={0.025,1 - 0.025}, + use_T_in=true, + p(displayUnit="Pa") = 101325, + nPorts=1) "Process air source" + annotation (Placement(transformation(extent={{-60,-40},{-40,-20}}))); + Buildings.Fluid.Dehumidifiers.Desiccant.ElectricCoilVariableSpeedFan deh( + redeclare package Medium1 = Medium1, + redeclare package Medium2 = Medium2, + m1_flow_nominal=0.4333*1.2, + m2_flow_nominal=3*1.2, + dp1_nominal=600, + dp2_nominal=600, + PMot_nominal=10, + vPro_nominal=2.5, + vReg_nominal=2.5, + perDat=perDat, + QReg_flow_nominal=10000, + etaHea=0.8) "Dehumidifier" + annotation (Placement(transformation(extent={{-10,-10},{10,10}}))); + Buildings.Fluid.Dehumidifiers.Desiccant.Data.Default perDat + "Performance data" + annotation (Placement(transformation(extent={{20,72},{40,92}}))); + Modelica.Blocks.Sources.Step uBypDamPos( + height=0.5, + offset=0, + startTime=600) "Bypass damper position signal" + annotation (Placement(transformation(extent={{-90,20},{-70,40}}))); + Modelica.Blocks.Sources.BooleanPulse uRot(period=1200, startTime=300) + "Wheel operating signal" + annotation (Placement(transformation(extent={{-90,-16},{-70,4}}))); + Buildings.Fluid.Sensors.MassFractionTwoPort senX_w_ProEnt( + redeclare package Medium = Medium1, + m_flow_nominal=0.4333*1.2) + "Humidity sensor of the process air entering the dehumidifier" + annotation (Placement(transformation(extent={{-34,-40},{-14,-20}}))); + Buildings.Fluid.Sensors.MassFractionTwoPort senX_w_ProLea( + redeclare package Medium = Medium1, + m_flow_nominal=0.4333*1.2) + "Humidity sensor of the process air leaving the dehumidifier" + annotation (Placement(transformation(extent={{26,-18},{46,2}}))); +equation + connect(sou_2.ports[1], deh.port_a2) annotation (Line(points={{40,50},{18,50}, + {18,8},{10,8}}, color={0,127,255})); + connect(sin_2.ports[1], deh.port_b2) annotation (Line(points={{-40,50},{-20,50}, + {-20,8},{-10,8}}, color={0,127,255})); + connect(TProEnt.y, sou_1.T_in) annotation (Line(points={{-77,-60},{-68,-60},{-68, + -26},{-62,-26}}, color={0,0,127})); + connect(uBypDamPos.y, deh.uBypDamPos) annotation (Line(points={{-69,30},{-22,30}, + {-22,0},{-12,0}}, color={0,0,127})); + connect(uRot.y, deh.uRot) + annotation (Line(points={{-69,-6},{-12,-6}}, color={255,0,255})); + connect(deh.port_b1, senX_w_ProLea.port_a) + annotation (Line(points={{10,-8},{26,-8}}, color={0,127,255})); + connect(senX_w_ProLea.port_b, sin_1.ports[1]) annotation (Line(points={{46,-8}, + {60,-8},{60,-40},{70,-40}}, color={0,127,255})); + connect(sou_1.ports[1], senX_w_ProEnt.port_a) + annotation (Line(points={{-40,-30},{-34,-30}}, color={0,127,255})); + connect(senX_w_ProEnt.port_b, deh.port_a1) annotation (Line(points={{-14,-30}, + {-6,-30},{-6,-16},{-16,-16},{-16,-8},{-10,-8}}, color={0,127,255})); + annotation (experiment(Tolerance=1e-6, StopTime=1200), + __Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilVariableSpeedFan.mos" + "Simulate and Plot"), Documentation(revisions=" + +", info=" +

+Validation test for the block + +Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.Examples.ElectricCoilVariableSpeedFan. +

+

+The input signals are configured as follows: +

+ +

+The expected outputs are: +

+ +")); +end ElectricCoilVariableSpeedFan; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/package.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/package.mo new file mode 100644 index 00000000000..85d60d42043 --- /dev/null +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/package.mo @@ -0,0 +1,4 @@ +within Buildings.Fluid.Dehumidifiers.Desiccant; +package Examples "Collection of models that illustrate model use and test models" +extends Modelica.Icons.ExamplesPackage; +end Examples; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/package.order b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/package.order new file mode 100644 index 00000000000..1bd344e44bb --- /dev/null +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/package.order @@ -0,0 +1 @@ +ElectricCoilVariableSpeedFan diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/package.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/package.mo new file mode 100644 index 00000000000..bec2ca0e040 --- /dev/null +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/package.mo @@ -0,0 +1,10 @@ +within Buildings.Fluid.Dehumidifiers; +package Desiccant "Package with desiccant dehumidifiers" +extends Modelica.Icons.VariantsPackage; + +annotation (Documentation(info=" +

+Package with desiccant dehumidifiers. +

+")); +end Desiccant; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/package.order b/Buildings/Fluid/Dehumidifiers/Desiccant/package.order new file mode 100644 index 00000000000..29295bf56a3 --- /dev/null +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/package.order @@ -0,0 +1,4 @@ +ElectricCoilVariableSpeedFan +Data +Examples +BaseClasses diff --git a/Buildings/Fluid/Dehumidifiers/package.mo b/Buildings/Fluid/Dehumidifiers/package.mo new file mode 100644 index 00000000000..06cfdbf06d8 --- /dev/null +++ b/Buildings/Fluid/Dehumidifiers/package.mo @@ -0,0 +1,10 @@ +within Buildings.Fluid; +package Dehumidifiers "Package with dehumidifiers" +extends Modelica.Icons.VariantsPackage; + +annotation (Documentation(info=" +

+Package with dehumidifiers. +

+")); +end Dehumidifiers; diff --git a/Buildings/Fluid/Dehumidifiers/package.order b/Buildings/Fluid/Dehumidifiers/package.order new file mode 100644 index 00000000000..7d9dccefffd --- /dev/null +++ b/Buildings/Fluid/Dehumidifiers/package.order @@ -0,0 +1 @@ +Desiccant \ No newline at end of file From d122dd5c6be80974c0b74a9604e7e08021f8dcc7 Mon Sep 17 00:00:00 2001 From: Huang <7q0@ornl.gov> Date: Thu, 28 Mar 2024 13:57:06 -0400 Subject: [PATCH 02/16] update the fluid package directory --- Buildings/Fluid/package.order | 1 + Buildings/package.mo | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/Buildings/Fluid/package.order b/Buildings/Fluid/package.order index 6520d3b02e8..216b0897cc4 100644 --- a/Buildings/Fluid/package.order +++ b/Buildings/Fluid/package.order @@ -4,6 +4,7 @@ Boilers CHPs Chillers DXSystems +Dehumidifiers Delays FMI FixedResistances diff --git a/Buildings/package.mo b/Buildings/package.mo index 756bdd59fb2..63214b5fc08 100644 --- a/Buildings/package.mo +++ b/Buildings/package.mo @@ -229,6 +229,12 @@ The following new libraries have been added: issue 3063. +Buildings.Fluid.Dehumidifiers.Desiccant + + Package of models for desiccant dehumidifier devices.
+ This is for issue 3711. + +

From ab2a7a691c3c82e900f57977abd361cdd1d6d7ca Mon Sep 17 00:00:00 2001 From: Huang <7q0@ornl.gov> Date: Thu, 28 Mar 2024 13:57:50 -0400 Subject: [PATCH 03/16] add figures, ref results, and scripts --- .../BaseClasses/dehumidifer_schematic.png | Bin 0 -> 21591 bytes .../BaseClasses/system_schematic.png | Bin 0 -> 20348 bytes ...ant_BaseClasses_Validation_Performance.txt | 13 + ..._Examples_ElectricCoilVariableSpeedFan.txt | 21 + .../Resources/Scripts/BuildingsPy/conf.yml | 496 ------------------ .../BaseClasses/Validation/Performance.mos | 4 + .../Examples/ElectricCoilVariableSpeedFan.mos | 6 + ...ant.BaseClasses.Validation.Performance.mos | 8 + ....Examples.ElectricCoilVariableSpeedFan.mos | 9 + 9 files changed, 61 insertions(+), 496 deletions(-) create mode 100644 Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/dehumidifer_schematic.png create mode 100644 Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/system_schematic.png create mode 100644 Buildings/Resources/ReferenceResults/Dymola/Buildings_Fluid_Dehumidifiers_Desiccant_BaseClasses_Validation_Performance.txt create mode 100644 Buildings/Resources/ReferenceResults/Dymola/Buildings_Fluid_Dehumidifiers_Desiccant_Examples_ElectricCoilVariableSpeedFan.txt delete mode 100644 Buildings/Resources/Scripts/BuildingsPy/conf.yml create mode 100644 Buildings/Resources/Scripts/Dymola/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mos create mode 100644 Buildings/Resources/Scripts/Dymola/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilVariableSpeedFan.mos create mode 100644 Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.Validation.Performance.mos create mode 100644 Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Fluid.Dehumidifiers.Desiccant.Examples.ElectricCoilVariableSpeedFan.mos diff --git a/Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/dehumidifer_schematic.png b/Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/dehumidifer_schematic.png new file mode 100644 index 0000000000000000000000000000000000000000..2190d105d5c9bfc32b9a3c00743a4ff213cbc7a6 GIT binary patch literal 21591 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 literal 0 HcmV?d00001 diff --git a/Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/system_schematic.png b/Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/system_schematic.png new file mode 100644 index 0000000000000000000000000000000000000000..96fafd47c57f6fca7ef7d82d0162e13817cab615 GIT binary patch literal 20348 zcmcG$1yq!M*EfoZNhu-SNDD}(G$NftDlj9BGz_H(QW8T93c!@DGO z<2vw(iwor{@Yf|*Z6#T}l5Xln;D@U(pQt^-!z+)zee&WO@bk@A${<%fJQKx>-P(e*N0O~v=RKQwv13ExMb&!Y{JchqlP8bgm54{`28i(`niJ&@Q~HHHjj zB^i4y7^AWl@k#EP0LSR?cR@Ure*XO+(2oVA= zyDYWYzDb^M$HgnVmoHX&%^?qV$*oRnt?6(PELPBUk^l6n;6=IB;h-H8 z1;Ug*(;<-sL~4Y#v|5CZJ%L=hc&FeJR5qVn@64(+FW!JX$|xgVvVy%K+o+N<+?qwN zj;oI|5nP`xWMOg6`s7yu3hV;v%ksll<@32VX_!_l=y|Fn(7+ z@jr;d4DWKE%9gp?MNq5~{(e^X2}fL=OlBT=C9P@^?4Sdxcua_zQXct31ikou~>^sN22E;q$EYK1`M~cg11{c!}#P zb=G}wR_*UC@S5&w8x7Ss;U3|yzPj<}qnTUo>L3S4qBod7Jo)@CU4}K}L0OYaG*?d% z9_-J3|2+FY|D66Z@H~IJqa*+GQfN@b+Ohr_4@C+d6`l+ z%Z(;KLpte*UbN%boD^)YUuxs}y<{kb#3||R!lQ>qDssfM(B6(}H->uk)Z6gtk-eXp zFUfvCBu^?DZ5QsuE@B(eru3sCsbeGNs{4Cxt15`IzC4g$!*lwyncmtpQtZ_c~^YnQGV~qaopZ6T&rx`~g@GK8n!k^%z z&0b4{=rin}*E*@t6-E=|5rIA>z2nDxQC6a=n>$ZVYV;{o^K=c5j^H0P|4~F zT65{Q3SPcd_Upoo9JUi|3Mhv(;_21o@D1TxTgh%=x>Zi-JqqkEJ;u_ojpgYK(k-$1 z2Xa=TBg+hotx2jdJ*MnoWfxqMyEnmSbPJ==++LS_xV)90f3e`1WE)#%g^YD1Y+gA+ z%bV-7w)|T9cUSeL7dXDlc#P4L8+bPZHiqji-H}Af5HcZfc5-`|g22|1#BoJ6Dq>PJ zlq+G&NE2ukd?+mjhN|CrYJ+P!DqG+kLN( zR=hC{%E;kz9L%`o+g^q@vap{aK@1g<_nNprMbgXEdx#9TAeLf1Ja6s9d%Z+>UJehK zL+QA-r+jxL*HR$2guJ1Je#=qwA>K`%UVhS1cwdX`=`J*G_XFdoLyejqq-I}hj5Q*M zBVSvh=GkP~0UfdT$>`o^la4}r4bH#{waO3Kaj+Telc4ByA3d;N4R02$A=-t#b*W*_ z+1AGdw`XGDe=s+~v0pl29vP^C*LovscYLfhwsZNwJZnTEX_*S7n$L7m&gfPgoq zwKT-uKmq>Un9^AxT34gRG($`1zLl}7L|j^?)K zo7dSb7tTKoH}IR%7Uc>zVzAnQa*5ieKv(&ut6JL}ycYtAB~0FgP;H!a84(jIKyZ9E zJ@_L-w29+qB!H2oSS?lj%Jw=dSR-czJJ4|_AQ?86KkWiAQJY6J_W4*GuHbn`*-rk| zft*RG=$T%FN7nB9Nobe{q9=FK*%fip#HKZp?=CtzlCMC(7c;|Yj-O};b0}!z7lc{{ zUc%eF-8gmV$9ev0o32?V8VSxwK$n})ZDV91*_e(I@8HnM1FbOFiHmN=VB9msQWN;1 z!f=F}&wH(uJAm2z+IK^9IOf9JJ+hTMM!FkUz<#7?enn%RZ0(6e3B}!$M=r)@=Gf)IZvkIEM@cwl zxwbDm z#ooEou#{MKf6M#lqz%Yiq4a$pymPisoE&178?NP3A#4(1=2OAdD|!i#Z1soyo#w)Y za)O3CD9JJHz2wk5OZlPltj(Y_4F8gsE}9RywX3{2q&}4`41v=yvufzG?xlCa^*ovy!B=Z@WO?JOL#JBavgeL ze$Mrk#71#2N_bRddU{f5)nIVctlLY5wp1U2I950i+_r+Y2lSi0(|48^IhiS$!-b~;dYLGTbmPtrt40d~-? zj0`~ApineyX>SzF^nPhEfoe$armoT+#HEx=_2Z->WG$(s+v4EAc_sZpzRja3gsQwCsW71MKq%@Pj%d zd5wOsr2ndm57Qgn<)z98;TZme%GRr~AjQ28TYKZ*G3br@$Q2d6R&v74L_Wp-_W3xU zBAh7r62aphE-QU}sY}${OB8CNXWE%G%j~$sYnlqi(J)J~3r!kuWb5N3%uz$HGP|Un z)S9mD>h^J3qHw;{^+o<7z2egEJ&eP&L@k+HNF))%b{eI3@bGLYwfT25*}P7K--$~f zta)HNbJ&ohlT|YPhBUCuyl!dE#sY&7LOdc8UoGdI7)d{)C$Yk$HdzT~XeiWDji86tWIa^51SUQ)7GOj~c7ymNZ z9_-Q_ptF-BG`rAVq;F)Gj47B6uB_3LFJ&Wt{S-zHqvd+;g66Qj)A$Bwu*qdLx|u{$ znPx9nl~3}_2Rg>5h)bxnL8ZzAw5#F@+w#r(mKVjRpIg>%mr|YR;BxR1yIq)B&26dM z-9~uxBzZTcwS+*h_n(`8?I=1ik~9rEZ+SHzG!Ez)VYI-n5U;lFCdmp3Pi}d#CKg|q z3lOt>bMoNPXD_0buRSdA^#YZyZ8B&w*Y&hL#BFv+he`A=? zZ-ML~fmf zJ70+d*QopD$vtday|@PvjiDHbxl({)V_?MaRVB#-WqI#VnMYS`vl^Th$#<53*Sw;P z8@{}!?WIpw%#liiCyE-Oa4w*`c|pudW{#X8o=+y!AKYGYSBxQ=t#jljXZBVlV-}G- zIndP9-WrpCdA7rfh`LtUEE?XrQO@EW4yjx+JQ6?Gxjbg z<3%m*xG(fY8;y<2HM3+3b8AF0Zo;L`$2i9P_FBZ(SoRm3oe}5nDU=NE1SC=ZfSyhU z{J;zPcFH(@rEuRfF$)d5&40Uq)YsYhaz?QwD$=Y*%k;TSs=Dd=DjyCcrXue{#N0$p zf^|6%F~w%_3aV7^lPBJ{(r;U7uFhHaTTBJ(vUY1o#7f#-66{)c{|xi#JwGI*di|V_ z(t;j_q|7rv4Pnew4C+_RbGQO1@&DXMk^$KqEvK{( z9z0TXe{+coIl(Hag5N|}v);p~Y<&na5l-2o4Z?6JBm9JJAX1SQq>(9-iHd3|i=A=; zkiI6-?S&9YpHo4`o~FAg*1h$@d9+q!K_S!@&v#Iz?-;q_mNegL$`6KWj^3zrz>}5j z<~GLOeQu)ht&^G*{sQfS<|o2ycCDOj!3EQ3%Z-KfMe;T2ZHqHftqy5 zAN{l`ln4xd=H=mR*Lfb{@kb=xw5nnR!i?Mu&w-fSbn@K}PXCP|1FZz?hr@`)u`3}q z99BRI@$BBxtUc}oRY4ow4(sGF2v^Q%wsd&=?*bhws~VD?W{|0=+AcQax)XNEIEvZM z|A)dAc+nosz+iUg??j;hKL*tFj2=mPQvovYZlaJAneMwC=_DF^$F%$%eEr8_3eTO3 z{P^Q29zp?gmEV|{31NCLDaHXkAnvGf3gV4AR?>dUBecZl-0zJrJw7DY6&8$eq;|u{ zNj>T}=n-(avrB#ckVeF}$$*V|k5>9g>Py~C*R#{#rb(BI9vO;|fpA(dBeQbRvH|PT z@lS*5$uu5ntZiuR?0ggM>0GIz^Z$6#H|yKqxm+i`CF0Ib^Q72y+h%^!uR(13(cyQE z#b%AF4*{W9F32KNdFd|+-|>r|l6KJSZg@N2g;!6WzfOjTS&uZFp2hb5T>Q-ct3kmh zie^9Y&pDX>o`Xaaq7-!(1er2yge608@3@iczS}etNZZqEt(PxSVNHj>%npTNq7Zx$ z{Ofco(yLRvE?*Mqf975#*@u`d_Z${`?vWX zy8c%Huf}2tCXV|PSo}^F)wow_DUarm^FDUMjuVRPX^w6nEsd!oX^(ZeMAH2nc~31v zOGx#turA}WPqI#r{^xZS`H!2U))$8K*87TZh1OMVA4u2x(<6Me&f7Io6T5betF)2! zY>~-gZy}|IxWeP5j-kf^yGCLjOYx=Z5AOsxF>#-`93N6OGXKvLQnVM*+ITMY2-JBW z6HHY+@Dk%`*j%1N2%N>5hr%&cuJh&-!=@rA|Jv2PqeYM&XFjO9y1R=mc@EQapEtY3 zycHlC_#X{<$ZxlEwMz>>#_rUL;tOa-1lJUlDD zMcfK4R<_d+E*KEaD)LWU0d*lK&^qJ6iHGKt7ryb@zq+zgEVq{Vq6h6}1`!U}H*KhAEgX}i~>IeaB+VJmi0 zSDJg-Bz3T8w+os2mdDfGZY=wqZ&ZNSdjVm0g;x9LGDr=77 z_e_I@!xY-M%HCal=?`^zLTGE(!?{6ziHPLFN)!RYT4mO#v2njxt!>wrldRCbXJvY} z)#iMfi7_OBIz!-PbNk)6ReVC7?vv^sLet(W{8Y3)gfyAXvbMaui*oL@R;#vgv)m-S zbx)r@Kd!G=9TVAV)aYJUzqvM3s6cE*)|7VD;6);YV14n^x3u`556g}tF5S3!p)7zC zibuGe;BPR=md6^>0}j#ZIf_EUf?aOv z=gSV&L;LB09AC2)6joELY8sa{f4q&I2p${;xkWyFhY9=Mm`M@q-gCij5AIXd9{)j`jnu)%o!1b0BJO)!?rG>yg48<_Y}{5t z{20Tkz){a-h27d8RUU1eM=2uLoOy!+xE3a-V|n)0``79tAPthyu_o6B``3amHeTRT zE`I5nzDGczoUTr*5x}ve5?R53q?fobMorp~PKDtb=C8)jsD?|k`+Cqa0m_|#v&Bqo z2}+{YzQ0CS+_4gJvBz%GOo$c5FXdnfw|k|XDQEO=fvlE2%LC3!{jV&}qs<3inmc?V z6Cwnt3-_owwArng$aOv1%VpwK&v8nF28rEw3&8}Iy#bsU2`7S^96JsUn9_OfVC-N=Qcb_UiOHC$r-s| ztkLO1Lfzv&<7b`l+b~K0(1kYtwxV|$p6gkTPF(kni+poqux+k;Bi(wviWC?L48P||kvXCng{o0DN%{TS=k4_g;0tjOel2N-?v*eLYV zfF8z_Cb`>I(OeP0Eid~-r*BC9HK1Q)AX%+7uJaEAFkS^I5b<%I#se2;Bd$6rKgN`` zAI_%dPf(Wg5N9`knB;NR!2@8wreH?nNv2N5I&)5BmBh2IYu_$k&<|xbER2#VRRT1< zQ-IDXCs!eGg2qaymRbTDUqa{0Cb*Kk-JEcGG_;wXmh^4FX-K07JG~6sz00jBug`?! zuGr!sO_6~-nN#r~8#n4%lR~W08NJ%dX6ue9(uYu4dGnv9{Ivp^3`nkuy8@}5HA)`Y zX>A4kDan=k_S#usc<$_s8CJ42>R6QnpP$OF;m0OTCGV1gT7`>wfu7M3=Q(@$%|vKW zn@2m=jHjYPX_&V>9J6)zd89z<;KT1ynvK;DQkVzl#c^3E$cSrLvYIp2}2eOwxPHjWlH9YQ)?9ni=v zvN(epOV^s5jIoX&OD$WY8aErSYSLIIrUVE?*z4oLa2tar=F);NC?U1-1pb6N`rRFc zOxRbs{MMfgN6Rx0{Xz&>_Fq4V*ZuK!RAgNEh&T7?Zw*#KBv@Mc$=%j3>0O5ctXkB}J02Kl6H=w=@4fK;ARe%rU^8e*)SnIVjOtS!Zcu(;HxI$&Eylm41q>^Egfn z1Pr%$c&p^oU2SAQ14s27$+=B9B~I=(wRneuzJOwttViEs+|`w1;gkvKLvThmJnf~NF*kY>Owc>rgX|A1c8HgsCwfTL% z_6Byy!?yyz+ZL%=_%@hr z-u~v)Spx{0;}3ZOA*b6%Exb3agsPq;ZBq_ubc#(#l~PSvlREn{jXAbU}lldBiOkf3@Gf^u;Z+xc{k0{dnsRV=zFO`^pZAaqDP zHABT-{VbwFX%F{B?lzG;FW{)dlVBiPrm;tz<&2_@bwt<%`Bnn``%gLV&GU=9ZVM%s zz0hgzr{a)qW}*f14xzzwYoUG>o49MCqmji-r(z2`qqPemZ;g>2^0`C z9_^$!Ef%JV+pK5E-7mJB3YfcbTHHf#8;?t(2%7{=6YU`X z`kcsiwk@j#L13G@oGsMtYn!|Z_&)N}VkNpIsWUC;DZ0{4B&f#c?TdrK2fDdBzcj*1 zq{xpoK!yjoQ~d!I270%ws%&*8nU+Q24Duer@?>E$fU_XIsRscA7JQ|yP`|mf&1J?A z5>jF)*XbE*c_%KJ6?uE4BsT?rs#)Mxulw6~TIcLNy{=AZIaTSCBq96LSgDgOPNSMd zo#Yw|(u9V`sr~CT>cytPZVFl&$s#Y)Vn!{`;F!(DktuCEPvT0KIb8SvY5##sn1HDz(@(mwnAV6)+4xD(7|!L=*+nE4CT?~v+0RUG@Fr!O!)^e zWlwn13AVdvQyDN+lCEzmA_!`y_g*~q9I_q9gM8_T7S^h$3oW5}6i-$JBCiVdKkD*u ziKdMqty}kB)4x-9%vYAZs;r+VaJW*f=!%`f64XrYcT}Phz-Rx z6_B*q4>5n$`;qPKPY6AFqn(N9S$KLgFzDXjLo&adc2{#ngG>6Sbz2B|e&W+^yd~UW z<~Jk3=NE^xaM@byYj%h7J+{Ny9vu`qSr3d%_16#Cyl1uj$vie%E#(&)1 zLg=@(PAv-em-^B;ff4wXV2~dsGDTSbXehqdpLOoD!=dKeJI)=ll(sQIOe>76(b%Jw zhO2)dTBjT3{G@482+cGk1rUVfcsTs5ppq%T*3RiBT4Lr>rj5oSYyC*vy{k7_E;Kuc zA4A`4x?mlTlNhnvF%+wt&vnTdifi)Uq{X{%f!OtbHJ(=POkx8+ik}l*wG*y>0S$+^F2{4;fTzpF=3!D}#6C%RJUj zP__A0ao4hxZe@^;*yxcN0i?{y|1MCeV8(}*Ad!ubXZ?K~=oLflk`XOoNu?XB-#2+t zWF0GCvy|AsPG^tN`ebU`aQHb>3buFbN(u=Y78GJ=#l2(C`jEWYliM=AmX>nhCX_+m zlXq{0>~Eg7+r^&gq~(ZJLrMre!+Fl&)lo#F-wJq87ghmDz3xUfnonfJd>Qa^`pmir z@aR#{uzyMJsN8WJBW#o8Hh6D!mny&b;P?yreL}fwk6CT~XJNIpeP}N_ct{VTq?V$> zt{}M>vEHzsD4&L$@75aWCwB8Y|LVs2KDU%F&fHwyUEFhGqGP#uR@$8*ZUv(;PisUr z8mFgc&4ARS+idhA4k8QF{cR1DAPDAaqR|r3d1w@+>dU>AaE**gO$eReu3)X>Pfc?T z%SW#?<{a*^4Ot^jou{O1Uw95IJop8H-gvj0?v$b5eHohI^yRjtIj8jDpm3>!tIwHv zv(4=#$tOp(C#ler{{NwV6J2M=wf=YAJp`kc<+$ zTNBZpDn8G9GtEJI<&(#?iTwO7FnKPwJpvpnInnPYD;^#UzgB+hCQyt%lF?nxgb>`| zw&3~eSX!jt?b+{ZSuS84H(R;Wf`(-grWMmyY-iasqZ^J!%`Grd=>a(e6VN`LQr?1c z{?5|lcbDYyst-)b3jKPF4tWIIU-gcNgF0j__ustT$xS=WQ-Nodia6w0!SgF*ZzGD$ zLeI6xMiIb;8Bod;7wm2-!tgiHUQpXtmP$j8fGZxG)vBQx?!}wi|91C#=Qf5yF}j%1O9Q zxE4GgyrEz%xRsa4znO;Qa0_ke_9EstP9-`ol(k0VWW_l|GH|;mSNX^g${}Ns`eVv- zasp{Nk#V%|FpPX^%vNx~D*sq^D^KTskiXY^Jt+hZ_H6ti-UIScKIw~6>`wc1lUFTU z+ASQ7;TK3O{+L6+D|xVWN6c0KgFOvx%D$MOCs}X&2w4!b?vNT}>Ud7Tmb3eN$der_ zrSO57^SNIy_O%zcc|%xw5rpqQLGwXzOf1M}6?J8H6OWJCr%N2A6&AmSO`+Ja}_uD9-o--8Yr6$bCU$FAb)$-cqn1fFI zxR%2lsNFJqrhW{FS#erg2^Ir-7YuLht>{fFd1k%8lDRH@{$9$Y5iaE5CCza-ht#m% zV2WFa<-tw?4F?z|SF$!ndoR0jXW2z};{H-P2sRX2oGVYf25h9z^B0pjHZ+4&Th;gAB81QG%7LVs- z;sYuiB(n(~Jbkba*B(A43>~K%lX&!@MqhyE{^;~OS)Y|`_KU1CK0bw4 z3Nf!k<*C)wZxoar`dxZ?=*bM{*7^H%rnI@8@t=(!I4-~=6=pEpW}dxbXw`z3PL66J zr;O>?X5&C8Qx z2?wcD&u%!5nr83(I=buiq4@czc;`Zo4 z=sdam(@n3XW8UmPseugw>??^nW59nWiIRn^d)f03t$nDeOqdwR*NZwhZ9Z2NnYm(- z>rs*!5b^!ik-LKS-_SQvqq}kbC&TE;D#2*IAO2~5`c(O}4#3Q{g8hZ9nX!es37->| z@~@&xFF44wDZ7_V{~B6R7r-hOo+GjTU9z2$s8Z`7 z{RFHcHjVn6^$!jgXWh>AU5?-&r_3cIK@vrYQ0p|}Eznm*q}Ji=pw<&1S}^1iE7FI6 z_LIISE!26lzpRO$x?%i~sj`zd920zsf&>}ytUMmO81VG}1oirf{cJEuJ}$#-B(Z0fz0S3b5NmXVvrN)XAy2m#DW#6y@$BS9T%lW}wR}k0Avr(uWVQp)3 zI`LQ!$zuxB>xgTt7sxgMn}JDEaRVOZy>J>)neXZT@93;GSFJqOH}A#s?Q@HH|9aoZ zyafjoq8N>Cp|?{N%b`<^gR81 z+@B3R=@;-rj*_g%FP+k(U21~0HEu=PosUW7hC{0E7~)cNWUd|^S1yq20C1P2R7O{O z%1Fsad`WF6;c4Y(a-cMJ7l4rC3_G}HmowCQM8&;fA#Edygo@>Df$xsnSXLJq|SQTbLv=C_T>%+tDEck ztGc*;a_Ue+>De>`z8Z2o_k75SzH(L+ml^|leu)dkoqD)E>ZSTHm~FSa{Q_qEO)oou zUZ&TuU9J)@53ZmOnCjK<>ro+ai=RImc=VLtJBwW)BIF-?G$FM#dM4KyrR23#zAAmX zat~FKO?dQUXd5uFK_Jq7qSjw zZC~utaDxiBj0sG1wb_?8bK1<7^yWfuC3wYP@Ao+D@-}2Ie{J9HYR@1}X`E0$Ul~d- zS(r>rGut6c6(Kbv+^C2a>f@FTPq_t4J?iEkXsum}>&Zh*s1>JrkAw|8uaRN(33rKg zi8y2R55intwzlKUPfarT@YDP%J@W+~YRHa!7GAee(PZp+Xnt;CLR5lrobY_TMaC5t z{=+5=9|2x+@AhSy{~D4h#Jl>2Ny+->tcKRxXZRDZS|yv#*`!zUPhiy{Q8Zb?Q&TeD zmaLk$UtV&j^x*Z|!5I)Q@-?nE+qi8On^p_=be{#B4FDDWFLy2!yaghOfLZ|vh z*yQ-er7p9|WY+Ff4M|$WvymM-*+_*6s_T8E%+v@;-=)U@nE$X~z&Rh-+G7JsWj@Y6yAfny9-$JwV;~;ziOtMhehpt~ zK(D!4OSR7UhGPkDmpl(()&aBIADS;+DhA za$mbHo8a~~fza6bfw>ewHROK|-i2sPYLN8$(Rkl)Mg?-mSZNj zPdat0b$+GYkIrp42VVhNJ+5A`>7qys0Ip_OoVdqPqJ><2yZr^M_6|`qPgXodq>~>_ zI<2@mWy{-MS->DEL%rfaIsQg19aQheO+6$qhtFpb zlhJA!wKj-4vHPS$+l?13GO!C|`%f`^<)YHx^2>p*Zc~*cnt!ZYXDhKbAM}zg^%#o5 zNhKGJ@30HH&S@=EJB4{6C^&(FHSC|Azjmwub$oWqHDlELkDCE1E1^mVa57kw*3RHZ z)=DRxh4>1i(T3%#QaTrMLFFDZyA;9Yk+Vdg3y(hbA3_@N`!BkhN)5S>C?@v-itHz{Zozq+F?KWjRgg!YuvWb zsPEwVuH!zW)+x6Ca}c2i{rq*@b1JLFgRs)YYoh_EY+C=rsOMH5g)u+suc=<{aC{v0 z5&<^CPJE}tN`iqjq9|6jZn3a5-xMg)!KXh2V}bqXfhM9qB29syIh#~8I>33TzN2`w z$%A}`eAen(Jgxxdlsapw*uGCN=6U)oU|lkl(xdC}=hD}==RX5P0itJKyQnv|*(-3w zfzqNlE!R@q`oHmI=skg`s;UMIh)iq>O%d&_<)-W1%$TTo$?Hz-g>Ty5ytk^y;%9th z4vZoE=lC7}h&!t)u85AAM@U0RLz;y&gbCo9KWcadG?7cGvp?t*SXilX zJu|S7af<3m43e%o0B!# z%?I@BlxcCmsbRN~((b_K{8H^|U;E&rF@>%Q>K;?RJlj-Nz|IK$WlEDWq?%6RnP@4R zhTJ^PKo5X0e8QdbQs8Ko{Ey<1DZ3mrqW(655n*ioQ7KDz`&2!0bEU+jD{UhnO@*GCs}GJH(M zj&{2$*yg4=duP6gV9hM-Ob%#{e@^;Wsr%xvIxl;U98bjDwsgJUH0!z}5)C z0POgx(_fK2F_7yxzry0KjU=dcChu!>YK)MOb)-uYi%avf4*`(%qO*xlsRL5 zHOzv`ZWDv=Cn}xPru1`NN5FUck*rl^HT6K7NBdb0ut$@?Km6$6>fx;OZBx4oj{=#@+7r9ePxa8>}kUGTd?5142zut(4Ds8dbM zn-%4p(wD>90gNTQwgsU3-->Mr;cXD~TSsMcE-Xe1ACo9C-SNeEdkPM%#^3zi;j;Tz z`)+jFM-+_^b<3VR~!lq(-n-c*G@#S-b)gFu^TGi@jT1A=m;#hz!3r0(sFVd zY%qMX+gx+L!+SBhK~MR2z3ra)`A@*NqIARGXtscFWZeE7Q1Dl2Pmk@&IWh1VUf&;G z{XJU&|6@M^gNTQx`sdk;v5(i;e^$I${fqWR#Pg>;@;UpTBV0UQ_Pa#*r^V9n55<1Z zba4G?Hu=9_entV(oUxFzp6WR;M(0~pr^f8sr$BzVw?Bd4pV-|@a-UlH=+h!qRL7(L zXH?~j_KYb6Oq(tw=UJzm&Cy{mK`n66;e&?_Cuq;9VJu$nKZGL z04zH-JBm!Xj?!C~|KWa~2S#W98t{yk@Bk=Z(n z5~-g1jmrUDPLBlwAAs&CaDZ|SMdo6zX8Aom9EOLu`u5%VOI7WJkO#_$fr$GOYnSwz zVc%D+vxnbvUDt_b8CGt1i_JyMMnEpw^Z=oVFQ7+qrHxKs`JibP6`V9S&2XhY5=Ifi z6!CS?b$?;8aC^M|5a^~F-43K(k?Nv0fBfgpud|!#Fcq&mXw_B+O-A{OT_lRca`bLZ zbyjG1Q7RGNMIOZJ~&veD!7>T1s%XW!@aEOGN8n<7 zBr4s#gzze((kQ4@K2@E{Y-9BGHTHgXSjM26mZ&Q-+KNg?MtM=5(GNH~c*a@D{*_7v z2&~|rMgPBQ!G9}RUo5B(<;am@TUbG%W(o$&in5|>p0Z5<)_ElRJmf!2*m+zH;5nyB;-*{0^88Lb6bm9kcI zJu|j{bjA*WQ_jG#S=fx^YxK_qc!Nw!pVCT$BLWC^^Ua{R3VT4H=J$J|KjPeh-o*#f zHL8xej)fD^dzE?7=%KM{uDDKHFVnK)zBGZT@x9_my43aERq>UQTMofMk?TS%xSDSv zPJO4IOo_oYD?flW9CINPBV#=yFl|-^{YZW5$TT&EMz4L=u7=4Y#46SP}qI;r4#O3c2I{Nbnkfu2NX@vn|_9sU=?LlTa(mYmD4=BjLKBm#gC>W|%P zio>{Q6muD5?frbpK32c~<=WU%Seh9KnAzI{LyY0An$@L6&wR3y?xYK#9i+z(2M#Ng zul^Z}R1M30aovRqt;{!YPb|v?>CR+I_H;tCb4MFn1-tQ=+CVP7C4sD0_qmcZ&KmRT zfeNT>i#&2t3(b$Uq+Cq{q508Qjd=(EvA5-L5E)4H!|PVhg5|j+ko$X%XmOnQ4w#0C z{WddHA_txbV#P_lUs5dK8n%Ss{O3NKNxe*PpaQBN7k%K*+56z2Eaew^vvt#|xoaI= z#@!=)vHVPZI%Cs$vo4%*k^5M2x7nawK=HurppWC*IGn-cZ$?7FrrsyLPmfG8JChm&w46l@j$ z8ixNZZ}H!H^8bS~`rlZdo+Rc;PN)g*mUk-|d}jEtmg?Nidmk7#TVZ1TyHNC(fw~jTaO& zX<61a3b$T%)~$J5@EyldAAp7$Y25`D6K#?S&ss^vxo}sgk%Dp*(*z`~Xn=os`e$KP zP5u)zFuu``LTP2I!SgS(DCj*+t5x4)wDlpX#A%!8Im6vQ)pv;59^XlHo^yV+&drNF z$iHf=5fT3!%W3aM{eC~tGJV)2^ z{cEvhm~SYAULF!O$~AD*HBcDti@2qlN$tb=eJej<==pN~iJW|K>D^KTU_=ZGesd%H zZq`=PpLqKsu_Os%lz+3-kv6Eji@C0&6ujST!4V>Ez0ZELiZ(03+yN!*(hf}NRmcSO zzti&mZ=sMS&XjTQdXGq$H8@=MQF-J}!86;&Ks zs`4}cpV!a@nUWb{vpS~JYn~CpwY`~0Z##jvF)lQ#6nZyR%Zz%IW!@IIwlQ2c@`ksi znY!m);&lb)%`Ou^rBcN4UHJ_{{ND$D|4K4orv8=u|JS(EwsJfEgr#{A-O)&)^Y_&o zczp`1+jX9`1)t`s&q#pKI*qyR){08n%tRtIeDpZN;`;AUo(u1dP0F$+)tGAW+NPwO%TZYn~ z#>Yaw_fcrCemxG&!gmh{{eWZ#gm-yBs8wJYXpIJk&3O9Sg?RD@k>P1_t9W=hscexA zNV7^Q&_D?@hdt(_JW9TKoDFIHmA2Pk9;lL;=U5V1$X>(!Q~i z;vmK9M*dP0Yvhcgbx&xFdfNTN(i@Wlc&|IOz2%PMg*x0Ti^^IZ}repkJ;JzRp{Uaj;`fR8= zxR-}q)_78`Q+DjDY5YPdt=2zGeb0e(T9;5^l&gS0)wZ z{3eN_Ai0Eh<9!+iew%y0_b7OH?Sz%DROD-;O4DB}d$En5T~Efgthn_rll0!Ia-5`X zMlWSMR~BG1&$+gel@V<>h`m?tD%6I3xHk=*P@oK3_&OybMgPs6JoHn9bwI$Y)K-Ph z1ge5PJ6ZeUEj*0TA!D^qnx0AG$>e>SgP!HHAxVRT#&#V(1(W>|eSn+FUA`brBvf{+ z<5$&FYq>>4g8R@NvgzGQgmC#ONiAo)xk{9_ z_Sd2fsg*t_%Avxgv1T0f#pze*1&GRQji|)>r^cj6mw}_^(^^bdJ%x)2RH`QiJ{9^I z4)9>#9=@CqQ;yU)H6DM(n=pk^o~kK8`7ho-}2u1yuckB4dZAHygzW2 zKa0B2nOR$+9HcP7l6mIX3s-dpJD*kF`0oB$lD(8${&F@W^kUXAe2sH|yJ50B}U z1#mfF;7|OA{rSM~G<#j<2;Pxu<5xGm^sz#Rvwnj!iG@IyPmmlx|C?CaWEoWg>Oy*C zK`+6Fud>T8GEyllGZOgo?(Toy@||DuF&cJQGOi`Ua&m%UFZzb=DPp50d#{I?@$xE- z4Kovq-pPn)qf^-NC%k4%7^J%VtTj~im>?&hv7$^ufV}A?fG>4JbNaqB!!LREVWC*bR{el7 z>HPcJEt0}t{IWsilb?K%2|c*natT%tpMs zuT{1y^ZCH4YKrJ+-A=VbV4ddEbw!QmmF(oBqJ!!;9PH}0J3Y*t?9RdW$u6vxEDWnE z_HwPkZ`cmCcIOb9PxL7#D0i+u&QMU>8vj{zP49Ikc&v;&(}Vz3hcjP&DX0A0EBsX{ zmaoHCG8n;oM>P?hSxkI47{ALN^D>~u<&1ey6W@V$Cg7489V=fDu71Mkg;PGIm}FYA zQBR=vCD+7yb#jxBXjHkq2*HPRIVqS-0+oDUT^xEb$LCHoUG*7Xe_aHZ1VTd_NiRVF zcp>9geJ|O5j*zVN7&%$hmbv=x()CsT2zpr8HCelt8N2ev*1JtTp)&3u0vyV~MCqN6 z6q9Jmn|Q4-AfM9?WKl#uuwH)i3Rr8pi4Dbz*}Lg5WK*kTYsRQN#}r)ExRTKo zR?w^X6qpJh)%=A>aBZvD&=>0A8mTdoU-!fW$g@VYLDh-T+s(U!d+(Rt0E3>4(>e7a zd*m6bKiQ`>kWYYqK>$FDpzjN#mK$>#wYP1NM2UJ6wr=D+!jr`Z)IF>!MCd-yc60&1 zD#R?{d_IGb-z z?}K{-KLgvyGXhOJ^Dhr+n__;pjrCs`#KxvOe*hU^aV65xs~W<#Da$k|KXQA{kEYD< znt*9EW=6y|*~HGU&rVNkdhXoGTKvKWPocsmPI8hze(7qMnper_?u=w2pRGhCiEPTk z5}bR|=u$xA6(YcgDl@x$U+&DG-8pR1h*N##<-t;O`)uvMHx8kDdpz0BU+Xk&@sxc@ z#ldCU+}2q8Tip2-BI%23zJQ(X?~LU8m0lVY>fF_-$O=t=rTy2L-yoS#hH;y22vxd} zX{x4dE4)WsbG~`ukJ&3|46Tr+(!h2lJLX2eJDh*hx|5f&4*0)BU=9hZQ1%u^&iMqK zC@7Nlkg`LfGU4lX$CgCp()YX2P}Ds>flq->p}#^{f6B=`zL16%whDm`A1mWAmjD6< zDb)4p!LJ#XgzSyVhGCwxINLp7&R`Lir19XO(O zSP^JEmil}j!D2?25ADUsTdq~KjtYuvy z<hn54>SPWMAG88PVEWBJChL!D7uhlo92z=+==y zB;8xNn(v#$rYs&D79N;9p+X;~p(hi7B(k-4$%zVxa2{NRP7?%G#XWa&=W~^v*86_3 zu^fi<|7_|I>MFa}0>@SmQ$#)s4t++k+k6d?@D7f#``e@??Nc8fESeQ#yzQ?&#mNsN zG%zPx()*g7TKR5~d6D+1cj=*3Gg7OEZh(v+NjZ-W#Ua9>w?9I1O%4gucFC#JmjpB! zVJ3UPumDG+7w6ruZY8cA%D%4B(kp;skibRB&TnfK5e5l6kqg#gbo$MTH~fN#yrJz zT)|O%<(ABBYSu)g#hm6Wl<)oMY_Q)&UX(9`q+Z?oobcDPnOq+#6|2W`u`ljqE=g^+ zN3k=$!Ck41?{;4g%B^>`no}4`!xHF+^w@4^?uf)yAbWz+{j&S>OBVuMLhmiygblVI zVROxc{H@pD&x9-GgM#eBonaSKN;m{7CdT==cl7tW3LkSE(`rRmYDR^<9PgAC%|uCF zx$s4(6Gb&u+j zS6mB4BA-Oe+a*-5$FT$@d{Y$1@yn3C^f1#_!ePsglmXS0RZmty`tWY}eRf2_+r{aY z1efDv^us_IA=F~a&XTKGWA{vcXK+HPnB~dt6TC7G-s0rl(#CpV;pV6_W--i=+Rj7M z(qDUA(7F7b2BbQP{pBog3^SBTvR4p8-2r3bdVbaZU7_UQ&U@29EMv?+{_UU zPy=265{9!xE}MPr5BU$9a5{5LXd&+~=tA3GLDsIHe<3=d&@H}(VPYtx;4Co|kW7}$ zGQSSN7?CDo2Fp!^__8I}gwj!?4P5R&H0Dy~g0{EQ@EVDD{LO;&fa37ao_7|vFI0rXl^AgyiK3<`KEc$ zl#)fT%%?Q Date: Thu, 28 Mar 2024 14:04:46 -0400 Subject: [PATCH 04/16] restore files --- .../Resources/Scripts/BuildingsPy/conf.yml | 496 ++++++++++++++++++ 1 file changed, 496 insertions(+) create mode 100644 Buildings/Resources/Scripts/BuildingsPy/conf.yml diff --git a/Buildings/Resources/Scripts/BuildingsPy/conf.yml b/Buildings/Resources/Scripts/BuildingsPy/conf.yml new file mode 100644 index 00000000000..f69b70c0919 --- /dev/null +++ b/Buildings/Resources/Scripts/BuildingsPy/conf.yml @@ -0,0 +1,496 @@ +- model_name: Buildings.Air.Systems.SingleZone.VAV.Examples.OptimalStart.ConventionalSpring + openmodelica: + comment: 'division by zero at time 6393600, (a=3.874900467232077e-06) / (b=0), where divisor b expression is: max(-zonAHUCon.hvac.out.ports[3].m_flow, 1e-07) - zonAHUCon.sinZonFlo.ports[2].m_flow' + simulate: false +- model_name: Buildings.Air.Systems.SingleZone.VAV.Examples.OptimalStart.ConventionalSummer + openmodelica: + comment: 'division by zero at time 15984000, (a=2.95791846399214e-05) / (b=0), where divisor b expression is: max(-zonAHUCon.hvac.out.ports[3].m_flow, 1e-07) - zonAHUCon.sinZonFlo.ports[2].m_flow' + simulate: false +- model_name: Buildings.Air.Systems.SingleZone.VAV.Examples.OptimalStart.ConventionalWinter + openmodelica: + comment: 'division by zero at time 0, (a=2.918588003374964e-06) / (b=0), where divisor b expression is: max(-zonAHUCon.hvac.out.ports[3].m_flow, 1e-07) - zonAHUCon.sinZonFlo.ports[2].m_flow' + simulate: false +- model_name: Buildings.Air.Systems.SingleZone.VAV.Examples.OptimalStart.Guideline36Spring + openmodelica: + comment: '''omc'' caused ''simulation terminated by an assertion at initialization''.' + simulate: false +- model_name: Buildings.Air.Systems.SingleZone.VAV.Examples.OptimalStart.Guideline36Summer + openmodelica: + comment: simulation terminated by an assertion at initialization + simulate: false +- model_name: Buildings.Air.Systems.SingleZone.VAV.Examples.OptimalStart.Guideline36Winter + openmodelica: + comment: simulation terminated by an assertion at initialization + simulate: false +- model_name: Buildings.Airflow.Multizone.Examples.PressurizationData + optimica: + comment: High solver tolerance required to avoid time out. + rtol: 1.0e-08 +- model_name: Buildings.Controls.DemandResponse.Examples.ClientLBNL90 + openmodelica: + comment: 'TimeoutExpired: omc timed out after 300 seconds' + translate: false +- model_name: Buildings.Electrical.AC.ThreePhasesBalanced.Loads.Examples.ParallelLoads + openmodelica: + comment: 'division leads to inf or nan at time 0.901, (a=nan) / (b=230400), where divisor b is: varRL_P.v[1] ^ 2.0 + varRL_P.v[2] ^ 2.0' + simulate: false +- model_name: Buildings.Electrical.AC.ThreePhasesUnbalanced.Validation.IEEETests.Test4NodesFeeder.BalancedStepDown.DD + openmodelica: + comment: simulation terminated by an assertion at initialization. + simulate: false +- model_name: Buildings.Electrical.AC.ThreePhasesUnbalanced.Validation.IEEETests.Test4NodesFeeder.BalancedStepDown.YD + openmodelica: + comment: simulation terminated by an assertion at initialization. + simulate: false +- model_name: Buildings.Electrical.AC.ThreePhasesUnbalanced.Validation.IEEETests.Test4NodesFeeder.BalancedStepUp.DD + openmodelica: + comment: simulation terminated by an assertion at initialization. + simulate: false +- model_name: Buildings.Electrical.AC.ThreePhasesUnbalanced.Validation.IEEETests.Test4NodesFeeder.BalancedStepUp.YD + openmodelica: + comment: simulation terminated by an assertion at initialization. + simulate: false +- model_name: Buildings.Electrical.AC.ThreePhasesUnbalanced.Validation.IEEETests.Test4NodesFeeder.UnbalancedStepDown.DD + openmodelica: + comment: simulation terminated by an assertion at initialization. + simulate: false +- model_name: Buildings.Electrical.AC.ThreePhasesUnbalanced.Validation.IEEETests.Test4NodesFeeder.UnbalancedStepDown.YD + openmodelica: + comment: simulation terminated by an assertion at initialization. + simulate: false +- model_name: Buildings.Electrical.AC.ThreePhasesUnbalanced.Validation.IEEETests.Test4NodesFeeder.UnbalancedStepUp.DD + openmodelica: + comment: simulation terminated by an assertion at initialization. + simulate: false +- model_name: Buildings.Electrical.AC.ThreePhasesUnbalanced.Validation.IEEETests.Test4NodesFeeder.UnbalancedStepUp.YD + openmodelica: + comment: simulation terminated by an assertion at initialization. + simulate: false +- model_name: Buildings.Electrical.DC.Loads.Examples.LinearizedLoad + openmodelica: + comment: '''omc'' caused ''simulation terminated by an assertion at initialization''.' + simulate: false +- model_name: Buildings.Examples.DualFanDualDuct.ClosedLoop + optimica: + comment: CVode and Radau5ODE hang since https://github.com/lbl-srg/modelica-buildings/pull/3109, likely because Xi rather than mXi is a state + simulate: false + openmodelica: + comment: Timeout after 300 seconds. + simulate: false +- model_name: Buildings.Examples.VAVCO2.VAVSystemCTControl + openmodelica: + comment: Times out after 900 seconds. + time_out: 900 + optimica: + comment: Fails with 'The rootfinding function failed in an unrecoverable manner.' Since oct-r26446 + simulate: false +- model_name: Buildings.Examples.VAVReheat.Guideline36 + openmodelica: + comment: Timeout during translation + time_out: 600 + optimica: + comment: Timeout on travis + time_out: 600 +- model_name: Buildings.Examples.VAVReheat.Validation.Guideline36SteadyState + openmodelica: + comment: simulation terminated by an assertion at initialization + simulate: false + time_out: 600 + optimica: + comment: timeout on travis after 300s, https://app.travis-ci.com/github/lbl-srg/modelica-buildings/jobs/618700275 + time_out: 600 +- model_name: Buildings.Experimental.DHC.EnergyTransferStations.Combined.Validation.ChillerBorefield + openmodelica: + comment: Timeout on travis after 900 seconds, https://app.travis-ci.com/github/lbl-srg/modelica-buildings/jobs/615261271 + simulate: false +- model_name: Buildings.Experimental.DHC.EnergyTransferStations.Cooling.Examples.Indirect + openmodelica: + comment: simulation terminated by an assertion at initialization. + simulate: false +- model_name: Buildings.Experimental.DHC.Examples.Combined.SeriesConstantFlow + openmodelica: + comment: simulation terminated by an assertion at initialization + simulate: false +- model_name: Buildings.Experimental.DHC.Examples.Combined.SeriesVariableFlow + openmodelica: + comment: simulation terminated by an assertion at initialization + simulate: false +- model_name: Buildings.Experimental.DHC.Examples.Combined.SeriesVariableFlowAgentControl + openmodelica: + comment: simulation terminated by an assertion at initialization + simulate: false + optimica: + comment: FMUException Failed to update the events at time 0.000000E+00. + simulate: false +- model_name: Buildings.Experimental.DHC.Examples.Cooling.ElectricChillersDirectETS + openmodelica: + comment: simulation terminated by an assertion at initialization + simulate: false + optimica: + comment: 'The system is structurally singular. Modelon #2023012739000252' + translate: false +- model_name: Buildings.Experimental.DHC.Loads.BaseClasses.Examples.CouplingTimeSeries + openmodelica: + comment: 'simulation terminated by an assertion at initialization, Invalid root: (0)^(-1.5), corrected in OMC 1.23.0~dev-206-g00d3636' + simulate: false +- model_name: Buildings.Experimental.DHC.Loads.BaseClasses.Examples.CouplingTimeSeriesSingleLoop + openmodelica: + comment: simulation terminated by an assertion at initialization + simulate: false +- model_name: Buildings.Experimental.DHC.Loads.Combined.Examples.BuildingTimeSeriesWithETS + openmodelica: + comment: simulation terminated by an assertion at initialization + simulate: false +- model_name: Buildings.Experimental.DHC.Loads.Combined.Examples.BuildingTimeSeriesWithETSDHWTank + openmodelica: + comment: simulation terminated by an assertion at initialization [works ok in Ubuntu 20 with OM 1.22.0] + simulate: false +- model_name: Buildings.Experimental.DHC.Loads.Cooling.Examples.BuildingTimeSeriesWithETS + openmodelica: + comment: simulation terminated by an assertion at initialization + simulate: false +- model_name: Buildings.Experimental.DHC.Plants.Combined.Controls.BaseClasses.Validation.StagingPlant + openmodelica: + comment: Internal error BackendDAETransform.analyseStrongComponentBlock failed (Purely discrete algebraic loops cannot be solved by iterative processes. Try to break them open using the delay() operator.) + translate: false +- model_name: Buildings.Experimental.DHC.Plants.Combined.Examples.AllElectricCWStorage + dymola: + time_out: 600 + openmodelica: + comment: Internal error NFCeval.evalBinaryMul failed to evaluate {0.0, 0.03359309597916374, 0.06718619195832748, 0.09151222697772191}[pressure.n] * 0.0 + translate: false + optimica: + time_out: 600 +- model_name: Buildings.Experimental.DHC.Plants.Combined.Validation.AllElectricCWStorage + openmodelica: + comment: Internal error NFCeval.evalBinaryMul failed to evaluate {0.0, 0.03359309597916374, 0.06718619195832748, 0.09151222697772191}[pressure.n] * 0.0 + translate: false + optimica: + time_out: 600 +- model_name: Buildings.Experimental.DHC.Plants.Cooling.Examples.StoragePlantDualSource + openmodelica: + comment: 'Could not evaluate structural parameter (or constant): mChi_flow_nominal' + translate: false +- model_name: Buildings.Experimental.DHC.Plants.Steam.BaseClasses.Examples.ControlVolumeEvaporation + openmodelica: + comment: simulation terminated by an assertion at initialization + simulate: false +- model_name: Buildings.Fluid.Examples.FlowSystem.Basic + openmodelica: + comment: '''omc'' caused ''simulation terminated by an assertion at initialization''.' + simulate: false + optimica: + simulate: false +- model_name: Buildings.Fluid.Examples.FlowSystem.Simplified1 + openmodelica: + comment: Unable to find component bui.THotWatSupSet + translate: false + optimica: + simulate: false +- model_name: Buildings.Fluid.Examples.FlowSystem.Simplified2 + openmodelica: + comment: timed out after 300 seconds + simulate: false + optimica: + simulate: false +- model_name: Buildings.Fluid.Examples.FlowSystem.Simplified3 + openmodelica: + comment: '''omc'' caused ''simulation terminated by an assertion at initialization''.' + simulate: false +- model_name: Buildings.Fluid.FixedResistances.BuriedPipes.Examples.DiscretizedBuriedPipe + openmodelica: + comment: timed out after 300 seconds + simulate: false +- model_name: Buildings.Fluid.FixedResistances.BuriedPipes.Examples.SingleBuriedPipe + openmodelica: + comment: Simulation terminated at time 4.59003e+07. + simulate: false +- model_name: Buildings.Fluid.FixedResistances.BuriedPipes.Examples.TwoBuriedPipes + openmodelica: + comment: returned non-zero exit status 255. + simulate: false +- model_name: Buildings.Fluid.FixedResistances.BuriedPipes.Examples.TwoPipesConduit + openmodelica: + comment: Assertion due to what looks like wrong results, see https://github.com/lbl-srg/modelica-buildings/issues/3687 + simulate: false +- model_name: Buildings.Fluid.FixedResistances.BuriedPipes.Validation.GroundCouplingAIT + openmodelica: + comment: Timed out after 300 seconds, https://app.travis-ci.com/github/lbl-srg/modelica-buildings/jobs/559381269#L479 + simulate: false +- model_name: Buildings.Fluid.FixedResistances.Validation.PlugFlowPipes.MSLAIT + dymola: + time_out: 600 + openmodelica: + time_out: 600 +- model_name: Buildings.Fluid.FixedResistances.Validation.PlugFlowPipes.PlugFlowAIT + openmodelica: + comment: timed out after 600 seconds + time_out: 900 +- model_name: Buildings.Fluid.Geothermal.Aquifer.Validation.SimulationTest + openmodelica: + comment: Timeout after 300 s + time_out: 600 + optimica: + comment: Timeout after 300 s + time_out: 600 +- model_name: Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Examples.DecouplingMixing + openmodelica: + comment: Timeout after 600 s on travis, https://app.travis-ci.com/github/lbl-srg/modelica-buildings/jobs/600714398#L489 + simulate: false + optimica: + comment: The rootfinding function failed in an unrecoverable manner. At time 32431.252047. + simulate: false +- model_name: Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Examples.DiversionOpenLoop + optimica: + comment: 'The following equation(s) could not be matched to any variable: isEna.u = loa.ctl.cha.pre_u_start, isEna.u = loa1.ctl.cha.pre_u_start' + translate: false +- model_name: Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Examples.InjectionTwoWayVariableReturn + optimica: + comment: 'The following equation(s) could not be matched to any variable: loaOpe.mode = loaOpe.loa.ctl.cha.pre_u_start...' + translate: false +- model_name: Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Examples.ThrottleOpenLoop + optimica: + comment: 'The following equation(s) could not be matched to any variable: con.mode = loa.ctl.cha.pre_u_start, con.mode = loa1.ctl.cha.pre_u_start' + translate: false +- model_name: Buildings.Fluid.HydronicConfigurations.PassiveNetworks.Examples.SingleMixingOpenLoop + optimica: + comment: 'The following equation(s) could not be matched to any variable: con.mode = loa.ctl.cha.pre_u_start, con.mode = loa1.ctl.cha.pre_u_start' + translate: false +- model_name: Buildings.Obsolete.Air.Systems.SingleZone.VAV.Examples.OptimalStart.Guideline36Spring + openmodelica: + comment: '''omc'' caused ''simulation terminated by an assertion at initialization''.' + simulate: false +- model_name: Buildings.Obsolete.Air.Systems.SingleZone.VAV.Examples.OptimalStart.Guideline36Summer + openmodelica: + comment: simulation terminated by an assertion at initialization + simulate: false +- model_name: Buildings.Obsolete.Air.Systems.SingleZone.VAV.Examples.OptimalStart.Guideline36Winter + openmodelica: + comment: simulation terminated by an assertion at initialization + simulate: false +- model_name: Buildings.Obsolete.Examples.VAVReheat.Validation.Guideline36SteadyState + openmodelica: + comment: simulation terminated by an assertion at initialization + simulate: false + time_out: 600 +- model_name: Buildings.Obsolete.Utilities.IO.Python36.Examples.KalmanFilter + dymola: + comment: Python 3.6 is not supported on Ubuntu 20.04, will be upgraded to more recent version + translate: false + openmodelica: + comment: Python 3.6 is not supported on Ubuntu 20.04, will be upgraded to more recent version + translate: false + optimica: + comment: See https://github.com/lbl-srg/modelica-buildings/issues/2235 + translate: false +- model_name: Buildings.Obsolete.Utilities.IO.Python36.Examples.SimpleRoom + dymola: + comment: Python 3.6 is not supported on Ubuntu 20.04, will be upgraded to more recent version + translate: false + openmodelica: + comment: Python 3.6 is not supported on Ubuntu 20.04, will be upgraded to more recent version + translate: false + optimica: + comment: See https://github.com/lbl-srg/modelica-buildings/issues/2235 + translate: false +- model_name: Buildings.Obsolete.Utilities.IO.Python36.Functions.Examples.Exchange + dymola: + comment: Python 3.6 is not supported on Ubuntu 20.04, will be upgraded to more recent version + translate: false + openmodelica: + comment: Python 3.6 is not supported on Ubuntu 20.04, will be upgraded to more recent version + translate: false + optimica: + comment: See https://github.com/lbl-srg/modelica-buildings/issues/2235 + translate: false +- model_name: Buildings.Obsolete.Utilities.IO.Python36.Functions.Examples.ExchangeWithPassPythonObject + dymola: + comment: Python 3.6 is not supported on Ubuntu 20.04, will be upgraded to more recent version + translate: false + openmodelica: + comment: Python 3.6 is not supported on Ubuntu 20.04, will be upgraded to more recent version + translate: false + optimica: + comment: See https://github.com/lbl-srg/modelica-buildings/issues/2235 + translate: false +- model_name: Buildings.Templates.AirHandlersFans.Validation.VAVMultiZone + optimica: + comment: Array size mismatch in modification of the attribute quantity for the variable TZon. This is a bug in OCT tracked under Modelon#2023022839000276. + translate: false + openmodelica: + comment: Translation failed. + translate: false +- model_name: Buildings.Templates.Components.Validation.Fans + openmodelica: + comment: Translation failed. + translate: false +- model_name: Buildings.Templates.ZoneEquipment.Validation.VAVBoxCoolingOnly + openmodelica: + comment: Translation failed. + translate: false +- model_name: Buildings.Templates.ZoneEquipment.Validation.VAVBoxReheat + openmodelica: + comment: Time out after 300 s. + translate: false +- model_name: Buildings.ThermalZones.Detailed.Examples.FFD.ForcedConvection + optimica: + comment: See https://github.com/lbl-srg/modelica-buildings/issues/2231 + simulate: false +- model_name: Buildings.ThermalZones.Detailed.Examples.FFD.NaturalConvectionWithControl + openmodelica: + comment: 'TimeoutExpired: omc timed out after 300 seconds' + simulate: false +- model_name: Buildings.ThermalZones.Detailed.Examples.FFD.RoomOnlyConstructionBoundary + openmodelica: + comment: Failed to copy array. Dimension sizes are not equal and destination array is not flexible. + simulate: false +- model_name: Buildings.ThermalZones.Detailed.Examples.FFD.RoomOnlyExteriorWallNoWindow + openmodelica: + comment: Timeout after 300 s + simulate: false +- model_name: Buildings.ThermalZones.Detailed.Examples.FFD.RoomOnlySurfaceBoundary + openmodelica: + comment: Failed to copy array. Dimension sizes are not equal and destination array is not flexible. + simulate: false +- model_name: Buildings.ThermalZones.Detailed.Examples.FFD.Tutorial.MixedConvection + dymola: + time_out: 600 + openmodelica: + comment: 'TimeoutExpired: omc timed out after 300 seconds' + simulate: false + optimica: + comment: See https://github.com/lbl-srg/modelica-buildings/issues/2231 + simulate: false +- model_name: Buildings.ThermalZones.Detailed.Examples.FFD.Tutorial.NaturalConvection + openmodelica: + comment: 'TimeoutExpired: omc timed out after 300 seconds' + simulate: false +- model_name: Buildings.ThermalZones.Detailed.Examples.FFD.WindowWithShade + openmodelica: + comment: 'TimeoutExpired: omc timed out after 300 seconds' + simulate: false +- model_name: Buildings.ThermalZones.Detailed.Examples.FFD.WindowWithoutShade + openmodelica: + comment: 'TimeoutExpired: omc timed out after 300 seconds' + simulate: false +- model_name: Buildings.ThermalZones.Detailed.FLEXLAB.Rooms.Examples.X3WithRadiantFloor + openmodelica: + comment: 'TimeoutExpired: translation timed out after 300 seconds' + time_out: 600 +- model_name: Buildings.ThermalZones.Detailed.Validation.BESTEST.Cases6xx.Case620 + openmodelica: + comment: Timeout on travis + time_out: 600 +- model_name: Buildings.ThermalZones.Detailed.Validation.BESTEST.Cases6xx.Case630 + openmodelica: + comment: Timeout on travis + time_out: 600 +- model_name: Buildings.ThermalZones.Detailed.Validation.BESTEST.Cases9xx.Case920 + openmodelica: + comment: Timeout on travis + time_out: 600 +- model_name: Buildings.ThermalZones.Detailed.Validation.BESTEST.Cases9xx.Case930 + openmodelica: + comment: Timeout on travis + time_out: 600 +- model_name: Buildings.ThermalZones.Detailed.Validation.BESTEST.Cases9xx.Case980 + openmodelica: + comment: Timeout on travis, https://app.travis-ci.com/github/lbl-srg/modelica-buildings/jobs/615261256 + time_out: 600 +- model_name: Buildings.ThermalZones.Detailed.Validation.BESTEST.Cases9xx.Case995 + openmodelica: + comment: Timeout on travis, https://app.travis-ci.com/github/lbl-srg/modelica-buildings/jobs/615261256 + time_out: 600 +- model_name: Buildings.ThermalZones.EnergyPlus_9_6_0.BaseClasses.Validation.FMUZoneAdapterZones1 + dymola: + comment: Requires docker update to Ubuntu 22.04 due to libgc. + simulate: false + openmodelica: + comment: 'Simulation requires /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34. To be updated in docker image.' + simulate: false +- model_name: Buildings.ThermalZones.EnergyPlus_9_6_0.BaseClasses.Validation.FMUZoneAdapterZones2 + dymola: + comment: Requires docker update to Ubuntu 22.04 due to libgc. + simulate: false + openmodelica: + comment: 'Simulation requires /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34. To be updated in docker image.' + simulate: false +- model_name: Buildings.ThermalZones.EnergyPlus_9_6_0.BaseClasses.Validation.FMUZoneAdapterZones3 + dymola: + comment: Requires docker update to Ubuntu 22.04 due to libgc. + simulate: false + openmodelica: + comment: 'Simulation requires /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34. To be updated in docker image.' + simulate: false +- model_name: Buildings.ThermalZones.EnergyPlus_9_6_0.Examples.SmallOffice.ASHRAE2006Spring + openmodelica: + comment: timed out after 300 seconds + time_out: 600 +- model_name: Buildings.ThermalZones.EnergyPlus_9_6_0.Examples.SmallOffice.ASHRAE2006Summer + openmodelica: + comment: timed out after 300 seconds + time_out: 600 +- model_name: Buildings.ThermalZones.EnergyPlus_9_6_0.Examples.SmallOffice.Guideline36Spring + openmodelica: + comment: timed out after 300 seconds + time_out: 600 +- model_name: Buildings.ThermalZones.EnergyPlus_9_6_0.Examples.SmallOffice.Guideline36Summer + openmodelica: + comment: timed out after 300 seconds + time_out: 600 +- model_name: Buildings.ThermalZones.EnergyPlus_9_6_0.Examples.SmallOffice.Guideline36Winter + openmodelica: + comment: Timeout on travis + time_out: 600 +- model_name: Buildings.ThermalZones.EnergyPlus_9_6_0.Examples.SmallOffice.IdealHeatingCoolingSpring + openmodelica: + comment: returned non-zero exit status 255. + simulate: false + optimica: + rtol: 1.0e-08 +- model_name: Buildings.ThermalZones.EnergyPlus_9_6_0.Examples.SmallOffice.IdealHeatingCoolingSummer + openmodelica: + comment: returned non-zero exit status 255. + simulate: false +- model_name: Buildings.ThermalZones.EnergyPlus_9_6_0.Examples.SmallOffice.IdealHeatingCoolingWinter + openmodelica: + comment: returned non-zero exit status 255. + simulate: false + optimica: + rtol: 1.0e-08 +- model_name: Buildings.ThermalZones.EnergyPlus_9_6_0.Validation.MultipleBuildings.TwoIdenticalTwoZoneBuildings + openmodelica: + comment: returned non-zero exit status 139. + simulate: false +- model_name: Buildings.ThermalZones.ReducedOrder.Validation.VDI6007.TestCase11 + openmodelica: + comment: Inputs differ by more than threShold. Check output 'satisfied' for when violation(s) happened. Segmentation fault (core dumped) + simulate: false +- model_name: Buildings.Utilities.IO.Python_3_8.Examples.KalmanFilter + openmodelica: + translate: false + comment: python incompatible with docker image + optimica: + comment: Optimica uses Python 3.9, while the examples use Python 3.8 + translate: false +- model_name: Buildings.Utilities.IO.Python_3_8.Examples.SimpleRoom + openmodelica: + translate: false + comment: python incompatible with docker image + optimica: + comment: Optimica uses Python 3.9, while the examples use Python 3.8 + translate: false +- model_name: Buildings.Utilities.IO.Python_3_8.Functions.Examples.Exchange + openmodelica: + translate: false + comment: python incompatible with docker image + optimica: + comment: Optimica uses Python 3.9, while the examples use Python 3.8 + translate: false +- model_name: Buildings.Utilities.IO.Python_3_8.Functions.Examples.ExchangeWithPassPythonObject + openmodelica: + translate: false + comment: python incompatible with docker image + optimica: + comment: Optimica uses Python 3.9, while the examples use Python 3.8 + translate: false From 779a7ae8fc6c530415bf7405c0e536f0b8a35c61 Mon Sep 17 00:00:00 2001 From: Huang <7q0@ornl.gov> Date: Sat, 30 Mar 2024 10:17:14 -0400 Subject: [PATCH 05/16] fix typo and broken link --- .../Desiccant/BaseClasses/PartialDesiccant.mo | 16 +++++----- .../Desiccant/BaseClasses/Performance.mo | 16 +++++----- .../BaseClasses/Validation/Performance.mo | 5 ++-- .../Desiccant/BaseClasses/performanceCurve.mo | 2 +- .../Dehumidifiers/Desiccant/Data/Default.mo | 10 +++---- .../Dehumidifiers/Desiccant/Data/Generic.mo | 8 ++--- .../Desiccant/ElectricCoilVariableSpeedFan.mo | 28 +++++++++--------- .../Examples/ElectricCoilVariableSpeedFan.mo | 29 ++++++++++++------- .../Desiccant/Examples/package.mo | 8 +++++ 9 files changed, 70 insertions(+), 52 deletions(-) diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo index 5f47e307a92..dcab04d258d 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo @@ -97,7 +97,7 @@ protected Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter PEleMot( final k= PMot_nominal) "Calculate the motor power consumption" - annotation (Placement(transformation(extent={{-18,-40},{0,-22}}))); + annotation (Placement(transformation(extent={{-20,-42},{0,-22}}))); Modelica.Blocks.Math.BooleanToReal booleanToReal "Convert boolean input to real output" annotation (Placement(transformation(extent={{-200,0},{-180,20}}))); @@ -110,7 +110,7 @@ protected Modelica.Blocks.Sources.Constant uni( final k=1) "Unity signal" - annotation (Placement(transformation(extent={{-220,-30},{-200,-10}}))); + annotation (Placement(transformation(extent={{-214,-30},{-194,-10}}))); Buildings.Controls.OBC.CDL.Reals.Subtract sub "Difference of the two inputs" annotation (Placement(transformation(extent={{-166,-36},{-146,-16}}))); @@ -201,11 +201,11 @@ initial algorithm end for; equation - connect(booleanToReal.u, uRot) annotation (Line(points={{-202,10},{-226,10},{ - -226,-86},{-220,-86},{-220,-120},{-258,-120}}, + connect(booleanToReal.u, uRot) annotation (Line(points={{-202,10},{-220,10},{-220, + -120},{-258,-120}}, color={255,0,255})); - connect(PEleMot.u, booleanToReal.y) annotation (Line(points={{-19.8,-31},{-22, - -31},{-22,-32},{-54,-32},{-54,10},{-179,10}}, color={0,0,127})); + connect(PEleMot.u, booleanToReal.y) annotation (Line(points={{-22,-32},{-54,-32}, + {-54,10},{-179,10}}, color={0,0,127})); connect(bypDamPro.port_a, port_a1) annotation (Line(points={{-170,-120},{-184, -120},{-184,-102},{-240,-102}}, color={0,127,255})); @@ -216,7 +216,7 @@ equation {-12,-94},{-7,-94}}, color={0,0,127})); connect(dehPer.X_w_ProLea, outCon.X_wSet) annotation (Line(points={{-37,-80},{ -14,-80},{-14,-98},{-7,-98}}, color={0,0,127})); - connect(uni.y, sub.u1) annotation (Line(points={{-199,-20},{-168,-20}}, + connect(uni.y, sub.u1) annotation (Line(points={{-193,-20},{-168,-20}}, color={0,0,127})); connect(sub.u2, uBypDamPos) annotation (Line(points={{-168,-32},{-192,-32},{-192, -52},{-230,-52},{-230,0},{-260,0}}, @@ -300,7 +300,7 @@ Specifically, this model considers the following configuration. alt=\"Dehumidifer_Schematic.png\" border=\"1\"/>

-This model should be extended with a heating coil and/or a fan in the regeneration air stream. +This model should be extended with a heating coil and/or a regeneration air fan.

This model takes two inputs: a boolean signal for dehumidification and a real signal for the bypass damper position.
", revisions=" diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/performanceCurve.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/performanceCurve.mo index b020ab267b3..d18197e19cd 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/performanceCurve.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/performanceCurve.mo @@ -50,7 +50,7 @@ where TProEnt is the temperature of the process air entering t
vPro is the velocity of the process air (m/s);
-a1,...a16 are coefficients. +a1,...,a16 are coefficients.

References

", revisions=" diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mo index 5eb63b4f189..0b2669b653b 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mo @@ -84,6 +84,10 @@ The dehumidification signal onDeh is changes from false to true at 50 seconds.
  • +The Wheel speed ratio uSpe is changes from +0.5 to 1 from 50 seconds to 100 seconds. +
  • +
  • The temperature of the process air entering the dehumidifier, TProEnt, and the Temperature of the regeneration air entering the dehumidifier, TRegEnt, change from 273 + 20 K to 273 + 30 K and 273 + 80 K to 273 + 70 K, respectively, during the period from @@ -108,7 +112,8 @@ Likewise, the humidity ratio of the process air entering the dehumidifier, X_w_ProLea, is equal to X_w_ProEnt.
  • -TProLea and X_w_ProEnt change dramatically when the dehumidification begins at 50 seconds. +TProLea and X_w_ProEnt change dramatically when the dehumidification begins at 50 seconds, +and keep relatively constant afterward.
  • ", revisions=" diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilBypassDampers.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilBypassDampers.mo new file mode 100644 index 00000000000..9d85d579d17 --- /dev/null +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilBypassDampers.mo @@ -0,0 +1,184 @@ +within Buildings.Fluid.Dehumidifiers.Desiccant; +model ElectricCoilBypassDampers + "Desiccant dehumidifier with an electric heating coil and bypass dampers" + extends BaseClasses.PartialDesiccant( + vol(nPorts=2)); + parameter Real etaHea( + final min=0, + final max=1) + "Heater efficiency" + annotation (Dialog(group="Efficiency")); + Modelica.Blocks.Interfaces.BooleanInput uRot + "True when the wheel is operating" annotation (Placement(transformation( + extent={{-280,-140},{-240,-100}}), + iconTransformation(extent={{-140,-80}, + {-100,-40}}))); + Modelica.Blocks.Interfaces.RealInput uBypDamPos( + final unit="1", + final min=0, + final max=1) + "Bypass damper position" + annotation (Placement(transformation(extent={{-280,-20},{-240,20}}), + iconTransformation(extent={{-140,-20},{-100,20}}))); + Modelica.Blocks.Math.BooleanToReal booleanToReal + "Convert boolean input to real output" + annotation (Placement(transformation(extent={{-200,0},{-180,20}}))); + Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter PEleMot( + final k= PMot_nominal) + "Calculate the motor power consumption" + annotation (Placement(transformation(extent={{-20,-42},{0,-22}}))); + Buildings.Fluid.Actuators.Dampers.Exponential bypDamPro( + redeclare package Medium = Medium1, + final m_flow_nominal=m1_flow_nominal, + final dpDamper_nominal=dp1_nominal) "Process air bypass damper" + annotation (Placement(transformation(extent={{-170,-130},{-150,-110}}))); + Buildings.Fluid.Actuators.Dampers.Exponential damPro( + redeclare package Medium = Medium1, + final m_flow_nominal=m1_flow_nominal, + final dpDamper_nominal=dp1_nominal) "Process air damper" + annotation (Placement(transformation( + extent={{-10,-10},{10,10}},rotation=0,origin={-130,-100}))); + Modelica.Blocks.Sources.RealExpression X_w_ProEnt(final y(final unit="1")= + damPro.port_b.Xi_outflow[i1_w]) + "Humidity ratio of the process air entering the dehumidifier" + annotation (Placement(transformation(extent={{-110,-72},{-90,-52}}))); + Modelica.Blocks.Sources.Constant uni( + final k=1) + "Unity signal" + annotation (Placement(transformation(extent={{-214,-30},{-194,-10}}))); + Buildings.Controls.OBC.CDL.Reals.Subtract sub + "Difference of the two inputs" + annotation (Placement(transformation(extent={{-166,-36},{-146,-16}}))); + Buildings.Fluid.HeatExchangers.HeaterCooler_u hea( + redeclare package Medium = Medium2, + final m_flow_nominal=m2_flow_nominal, + final dp_nominal=dp2_nominal, + final energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + final Q_flow_nominal=QReg_flow_nominal) + "Heating coil for the regeneration air" + annotation (Placement(transformation(extent={{16,56},{-4,76}}))); + Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter PEleHea( + final k=1/etaHea) + "Calculate the heater power consumption" + annotation (Placement(transformation(extent={{-20,-70},{0,-50}}))); + Buildings.Fluid.Movers.Preconfigured.FlowControlled_m_flow fan( + redeclare package Medium = Medium2, + final m_flow_nominal=m2_flow_nominal, + final dp_nominal=dp2_nominal) + "Regeneration fan" + annotation (Placement(transformation(extent={{80,56},{60,76}}))); +protected + Modelica.Blocks.Sources.RealExpression mReg_flow( + final y(final unit="kg/s")= + dehPer.VReg_flow*Medium2.density(state=Medium2.setState_phX( + p=port_a2.p, + h=port_a2.h_outflow, + X=port_a2.Xi_outflow))) + "Regeneration air mass flow rate" + annotation (Placement(transformation(extent={{20,76},{40,96}}))); + Modelica.Blocks.Math.Add3 add3 + "Sum of the three inputs" + annotation (Placement(transformation(extent={{60,-10},{80,10}}))); +equation + connect(add3.y, P) + annotation (Line(points={{81,0},{110,0}}, color={0,0,127})); + connect(dehPer.yQReg, hea.u) + annotation (Line(points={{-37,-92},{30,-92},{30,72}, + {18,72}}, color={0,0,127})); + connect(hea.port_b, vol.ports[2]) + annotation (Line(points={{-4,66},{-95,66}}, color={0,127,255})); + connect(fan.port_a, port_a2) + annotation (Line(points={{80,66},{84,66},{84,80},{100,80}}, + color={0,127,255})); + connect(fan.port_b, hea.port_a) + annotation (Line(points={{60,66},{16,66}}, color={0,127,255})); + connect(mReg_flow.y,fan. m_flow_in) + annotation (Line(points={{41,86},{70,86},{70,78}}, color={0,0,127})); + connect(add3.u1,fan. P) + annotation (Line(points={{58,8},{34,8},{34,75},{59,75}}, color={0,0,127})); + connect(add3.u2, PEleMot.y) + annotation (Line(points={{58,0},{34,0},{34,-32},{2,-32}}, + color={0,0,127})); + connect(PEleHea.y, add3.u3) + annotation (Line(points={{2,-60},{46,-60},{46,-8},{58,-8}}, + color={0,0,127})); + connect(hea.Q_flow, PEleHea.u) + annotation (Line(points={{-5,72},{-40,72},{-40,-60},{-22,-60}}, + color={0,0,127})); + connect(bypDamPro.port_a, port_a1) annotation (Line(points={{-170,-120},{-180, + -120},{-180,-100},{-240,-100}}, color={0,127,255})); + connect(bypDamPro.port_b, port_b1) annotation (Line(points={{-150,-120},{-126, + -120},{-126,-138},{34,-138},{34,-100},{100,-100}}, color={0,127,255})); + connect(booleanToReal.y, PEleMot.u) annotation (Line(points={{-179,10},{-50, + 10},{-50,-32},{-22,-32}}, color={0,0,127})); + connect(uni.y, sub.u1) + annotation (Line(points={{-193,-20},{-168,-20}}, color={0,0,127})); + connect(uBypDamPos, bypDamPro.y) annotation (Line(points={{-260,0},{-220,0},{ + -220,-80},{-160,-80},{-160,-108}}, color={0,0,127})); + connect(sub.u2, uBypDamPos) annotation (Line(points={{-168,-32},{-180,-32},{ + -180,-60},{-220,-60},{-220,0},{-260,0}}, color={0,0,127})); + connect(booleanToReal.u, uRot) annotation (Line(points={{-202,10},{-230,10},{ + -230,-120},{-260,-120}}, color={255,0,255})); + connect(dehPer.uSpe, uni.y) annotation (Line(points={{-56.2,-73},{-56.2,-6},{ + -180,-6},{-180,-20},{-193,-20}}, color={0,0,127})); + connect(outCon.port_b, port_b1) annotation (Line(points={{14,-100},{56,-100},{ + 56,-100},{100,-100}}, color={0,127,255})); + connect(damPro.y, sub.y) annotation (Line(points={{-130,-88},{-130,-26},{-144, + -26}}, color={0,0,127})); + connect(dehPer.onDeh, uRot) annotation (Line(points={{-59,-75.8},{-144,-75.8}, + {-144,-76},{-230,-76},{-230,-120},{-260,-120}}, color={255,0,255})); + connect(X_w_ProEnt.y, dehPer.X_w_ProEnt) annotation (Line(points={{-89,-62},{ + -76,-62},{-76,-88},{-59,-88}}, color={0,0,127})); + connect(damPro.port_a, port_a1) + annotation (Line(points={{-140,-100},{-240,-100}}, color={0,127,255})); + connect(damPro.port_b, outCon.port_a) annotation (Line(points={{-120,-100},{ + -114,-100},{-114,-120},{-20,-120},{-20,-100},{-6,-100}}, color={0,127, + 255})); + annotation ( + defaultComponentName="deh", + Icon(coordinateSystem(preserveAspectRatio=false), graphics={ + Polygon( + points={{76,94},{50,74},{76,58},{76,94}}, + lineColor={28,108,200}, + fillColor={0,140,72}, + fillPattern=FillPattern.Solid), + Ellipse(extent={{48,98},{86,54}}, lineColor={28,108,200}), + Rectangle( + extent={{16,94},{36,52}}, + lineColor={28,108,200}, + fillColor={238,46,47}, + fillPattern=FillPattern.Solid), + Line(points={{36,94},{16,52}}, color={28,108,200}), + Text( + extent={{28,22},{84,-32}}, + textColor={28,108,200}, + textString="C")}), + Diagram( + coordinateSystem(preserveAspectRatio=false)), + Documentation(info=" +

    +This model considers a desiccant dehumidifier system with an electric coil, a variable-speed regeneration fan, and bypass dampers +as shown below. +

    + +

    +

    +The system configuration of the dehumidifier device is described in + +Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.PartialDesiccant. +

    +

    +Note that the operation of the coil and the fan is assumed to be ideal, i.e., they can +provide the required regeneration heating power and the regeneration flow rate, which +are calculated by + +Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.Performance, +when their capacities permit. +

    +", revisions=" + +")); +end ElectricCoilBypassDampers; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilVariableSpeedFan.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilSpeedControlled.mo similarity index 57% rename from Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilVariableSpeedFan.mo rename to Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilSpeedControlled.mo index 3035c61e727..87fdaed7f56 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilVariableSpeedFan.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilSpeedControlled.mo @@ -1,6 +1,6 @@ within Buildings.Fluid.Dehumidifiers.Desiccant; -model ElectricCoilVariableSpeedFan - "Desiccant dehumidifier with an electric heating coil and a variable speed fan" +model ElectricCoilSpeedControlled + "Desiccant dehumidifier with an electric heating coil and a variable speed drive" extends BaseClasses.PartialDesiccant( vol(nPorts=2)); parameter Real etaHea( @@ -8,6 +8,18 @@ model ElectricCoilVariableSpeedFan final max=1) "Heater efficiency" annotation (Dialog(group="Efficiency")); + parameter Real c[:] = {1} + "Coefficients for power consumption curve for rotor, + P/P_nominal = sum a_i uSpe^(i-1). The sum(a) of the elements must be equal to 1" + annotation (Dialog(group="Efficiency")); + + + Modelica.Blocks.Interfaces.RealInput uSpe( + final unit="1", + final min=0, + final max=1) "Wheel speed ratio" annotation (Placement(transformation( + extent={{-280,-20},{-240,20}}), iconTransformation(extent={{-140,-20}, + {-100,20}}))); Buildings.Fluid.HeatExchangers.HeaterCooler_u hea( redeclare package Medium = Medium2, final m_flow_nominal=m2_flow_nominal, @@ -26,7 +38,25 @@ model ElectricCoilVariableSpeedFan final dp_nominal=dp2_nominal) "Regeneration fan" annotation (Placement(transformation(extent={{80,56},{60,76}}))); + Modelica.Blocks.Math.RealToBoolean realToBoolean( + final threshold=uSpe_min) "Convert real input to boolean output " + annotation (Placement(transformation(extent={{-180,-50},{-160,-30}}))); + Modelica.Blocks.Sources.RealExpression X_w_ProEnt(final y(final unit="1") = + res.port_b.Xi_outflow[i1_w]) + "Humidity ratio of the process air entering the dehumidifier" + annotation (Placement(transformation(extent={{-110,-72},{-90,-52}}))); + + FixedResistances.PressureDrop res( + redeclare package Medium = Medium1, + m_flow_nominal=m1_flow_nominal, + dp_nominal=dp1_nominal) "Flow resistance" + annotation (Placement(transformation(extent={{-200,-110},{-180,-90}}))); protected + Modelica.Blocks.Sources.RealExpression PEle(final y=PMot_nominal* + Buildings.Utilities.Math.Functions.polynomial(a=c, x=uSpe)) + "Electric power consumption" + annotation (Placement(transformation(extent={{-20,-40},{0,-20}}))); + Modelica.Blocks.Sources.RealExpression mReg_flow( final y(final unit="kg/s")= dehPer.VReg_flow*Medium2.density(state=Medium2.setState_phX( @@ -38,6 +68,13 @@ protected Modelica.Blocks.Math.Add3 add3 "Sum of the three inputs" annotation (Placement(transformation(extent={{60,-10},{80,10}}))); + +initial equation + assert(abs(sum(c)-1) < Modelica.Constants.eps, + "In " + getInstanceName() + ": Power efficiency curve is wrong. + The sum of the coefficients for power efficiency curve should equal to 1.", + level=AssertionLevel.error); + equation connect(add3.y, P) annotation (Line(points={{81,0},{110,0}}, color={0,0,127})); @@ -55,15 +92,26 @@ equation annotation (Line(points={{41,86},{70,86},{70,78}}, color={0,0,127})); connect(add3.u1,fan. P) annotation (Line(points={{58,8},{34,8},{34,75},{59,75}}, color={0,0,127})); - connect(add3.u2, PEleMot.y) - annotation (Line(points={{58,0},{34,0},{34,-32},{2,-32}}, - color={0,0,127})); connect(PEleHea.y, add3.u3) annotation (Line(points={{2,-60},{46,-60},{46,-8},{58,-8}}, color={0,0,127})); connect(hea.Q_flow, PEleHea.u) - annotation (Line(points={{-5,72},{-40,72},{-40,-60},{-22,-60}}, + annotation (Line(points={{-5,72},{-48,72},{-48,-60},{-22,-60}}, color={0,0,127})); + connect(dehPer.uSpe, uSpe) annotation (Line(points={{-56.2,-73},{-56.2,0},{-260, + 0}}, color={0,0,127})); + connect(realToBoolean.u, uSpe) annotation (Line(points={{-182,-40},{-200,-40}, + {-200,0},{-260,0}}, color={0,0,127})); + connect(realToBoolean.y, dehPer.onDeh) annotation (Line(points={{-159,-40},{-126, + -40},{-126,-75.8},{-59,-75.8}}, color={255,0,255})); + connect(PEle.y, add3.u2) annotation (Line(points={{1,-30},{26,-30},{26,0},{58, + 0}}, color={0,0,127})); + connect(res.port_a, port_a1) + annotation (Line(points={{-200,-100},{-240,-100}}, color={0,127,255})); + connect(res.port_b, outCon.port_a) annotation (Line(points={{-180,-100},{-120, + -100},{-120,-126},{-20,-126},{-20,-100},{-6,-100}}, color={0,127,255})); + connect(X_w_ProEnt.y, dehPer.X_w_ProEnt) annotation (Line(points={{-89,-62},{ + -78,-62},{-78,-88},{-59,-88}}, color={0,0,127})); annotation ( defaultComponentName="deh", Icon(coordinateSystem(preserveAspectRatio=false), graphics={ @@ -78,15 +126,19 @@ equation lineColor={28,108,200}, fillColor={238,46,47}, fillPattern=FillPattern.Solid), - Line(points={{36,94},{16,52}}, color={28,108,200})}), + Line(points={{36,94},{16,52}}, color={28,108,200}), + Text( + extent={{26,20},{82,-34}}, + textColor={28,108,200}, + textString="V")}), Diagram( coordinateSystem(preserveAspectRatio=false)), Documentation(info="

    -This model considers a desiccant dehumidifier system with an electric coil and a variable speed fan, -as shown below. +This model considers a desiccant dehumidifier system with an electric coil, a variable-speed regeneration fan, and a +variable-speed motor, as shown below.

    -\"System_Schematic.png\"

    @@ -107,4 +159,4 @@ when their capacities permit.

  • March 1, 2024, by Sen Huang:
    First implementation.
  • ")); -end ElectricCoilVariableSpeedFan; +end ElectricCoilSpeedControlled; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilVariableSpeedFan.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mo similarity index 94% rename from Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilVariableSpeedFan.mo rename to Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mo index 69b5d18275d..035c5685782 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilVariableSpeedFan.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mo @@ -1,5 +1,5 @@ within Buildings.Fluid.Dehumidifiers.Desiccant.Examples; -model ElectricCoilVariableSpeedFan +model ElectricCoilBypassDampers "Model that demonstrates the usage of a desiccant dehumidifier model with an electric heater and a variable speed fan" extends Modelica.Icons.Example; package Medium1 = Buildings.Media.Air @@ -39,7 +39,7 @@ model ElectricCoilVariableSpeedFan nPorts=1) "Process air source" annotation (Placement(transformation(extent={{-60,-40},{-40,-20}}))); - Buildings.Fluid.Dehumidifiers.Desiccant.ElectricCoilVariableSpeedFan deh( + Buildings.Fluid.Dehumidifiers.Desiccant.ElectricCoilBypassDampers deh( redeclare package Medium1 = Medium1, redeclare package Medium2 = Medium2, m1_flow_nominal=0.4333*1.2, @@ -51,8 +51,7 @@ model ElectricCoilVariableSpeedFan vReg_nominal=2.5, perDat=perDat, QReg_flow_nominal=50000, - etaHea=0.8) - "Dehumidifier" + etaHea=0.8) "Dehumidifier" annotation (Placement(transformation(extent={{-10,-10},{10,10}}))); Buildings.Fluid.Dehumidifiers.Desiccant.Data.Default perDat "Performance data" @@ -96,7 +95,7 @@ equation connect(senX_w_ProEnt.port_b, deh.port_a1) annotation (Line(points={{-14,-30}, {-6,-30},{-6,-16},{-16,-16},{-16,-8},{-10,-8}}, color={0,127,255})); annotation (experiment(Tolerance=1e-6, StopTime=1200), - __Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilVariableSpeedFan.mos" + __Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mos" "Simulate and Plot"), Documentation(revisions="

    @@ -143,4 +142,4 @@ After 600 seconds, X_w_ProEnt increases as uBypDamPos increases. ")); -end ElectricCoilVariableSpeedFan; +end ElectricCoilBypassDampers; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mo new file mode 100644 index 00000000000..60835cc055c --- /dev/null +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mo @@ -0,0 +1,137 @@ +within Buildings.Fluid.Dehumidifiers.Desiccant.Examples; +model ElectricCoilSpeedControlled + "Model that demonstrates the usage of a desiccant dehumidifier model with an electric heater and a variable speed fan" + extends Modelica.Icons.Example; + package Medium1 = Buildings.Media.Air + "Process air"; + package Medium2 = Buildings.Media.Air + "Regeneration air"; + Buildings.Fluid.Sources.Boundary_pT sin_2( + redeclare package Medium = Medium2, + nPorts=1) + "Regeneration air sink" + annotation (Placement(transformation(extent={{-60,40},{-40,60}}))); + Buildings.Fluid.Sources.Boundary_pT sou_2( + redeclare package Medium = Medium2, + T(displayUnit="K") = 303.15, + nPorts=1) + "Regeneration air source" + annotation (Placement(transformation(extent={{60,40},{40,60}}))); + Modelica.Blocks.Sources.Ramp TProEnt( + height=10, + duration=600, + offset=273.15 + 30, + startTime=600) "Temperature of the process air" + annotation (Placement(transformation(extent={{-98,-70},{-78,-50}}))); + Buildings.Fluid.Sources.Boundary_pT sin_1( + redeclare package Medium = Medium1, + p(displayUnit="Pa") = 101325 - 600, + nPorts=1) + "Process air sink" + annotation (Placement(transformation(extent={{90,-50},{70,-30}}))); + Buildings.Fluid.Sources.Boundary_pT sou_1( + redeclare package Medium = Medium1, + use_p_in=false, + T=273.15 + 50, + X={0.025,1 - 0.025}, + use_T_in=true, + p(displayUnit="Pa") = 101325, + nPorts=1) + "Process air source" + annotation (Placement(transformation(extent={{-60,-40},{-40,-20}}))); + Buildings.Fluid.Dehumidifiers.Desiccant.ElectricCoilSpeedControlled + deh( + redeclare package Medium1 = Medium1, + redeclare package Medium2 = Medium2, + m1_flow_nominal=0.4333*1.2, + m2_flow_nominal=3*1.2, + dp1_nominal=600, + dp2_nominal=600, + PMot_nominal=10, + vPro_nominal=1.5, + vReg_nominal=2.5, + perDat=perDat, + QReg_flow_nominal=50000, + etaHea=0.8) "Dehumidifier" + annotation (Placement(transformation(extent={{-10,-10},{10,10}}))); + Buildings.Fluid.Dehumidifiers.Desiccant.Data.Default perDat + "Performance data" + annotation (Placement(transformation(extent={{20,72},{40,92}}))); + Modelica.Blocks.Sources.Ramp uSpe( + height=-1, + duration=1200, + offset=1, + startTime=0) "Wheel speed ratio" + annotation (Placement(transformation(extent={{-92,22},{-72,42}}))); + Buildings.Fluid.Sensors.MassFractionTwoPort senX_w_ProEnt( + redeclare package Medium = Medium1, + m_flow_nominal=0.4333*1.2) + "Humidity sensor of the process air entering the dehumidifier" + annotation (Placement(transformation(extent={{-34,-40},{-14,-20}}))); + Buildings.Fluid.Sensors.MassFractionTwoPort senX_w_ProLea( + redeclare package Medium = Medium1, + m_flow_nominal=0.4333*1.2) + "Humidity sensor of the process air leaving the dehumidifier" + annotation (Placement(transformation(extent={{26,-18},{46,2}}))); +equation + connect(sou_2.ports[1], deh.port_a2) annotation (Line(points={{40,50},{18,50}, + {18,8},{10,8}}, color={0,127,255})); + connect(sin_2.ports[1], deh.port_b2) annotation (Line(points={{-40,50},{-20,50}, + {-20,8},{-10,8}}, color={0,127,255})); + connect(TProEnt.y, sou_1.T_in) annotation (Line(points={{-77,-60},{-68,-60},{-68, + -26},{-62,-26}}, color={0,0,127})); + connect(deh.port_b1, senX_w_ProLea.port_a) + annotation (Line(points={{10,-8},{26,-8}}, color={0,127,255})); + connect(senX_w_ProLea.port_b, sin_1.ports[1]) annotation (Line(points={{46,-8}, + {60,-8},{60,-40},{70,-40}}, color={0,127,255})); + connect(sou_1.ports[1], senX_w_ProEnt.port_a) + annotation (Line(points={{-40,-30},{-34,-30}}, color={0,127,255})); + connect(senX_w_ProEnt.port_b, deh.port_a1) annotation (Line(points={{-14,-30}, + {-6,-30},{-6,-16},{-16,-16},{-16,-8},{-10,-8}}, color={0,127,255})); + connect(uSpe.y, deh.uSpe) + annotation (Line(points={{-71,32},{-22,32},{-22,0},{-12,0}}, + color={0,0,127})); + annotation (experiment(Tolerance=1e-6, StopTime=1200), + __Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mos" + "Simulate and Plot"), Documentation(revisions=" +

    +", info=" +

    +Validation test for the block + +Buildings.Fluid.Dehumidifiers.Desiccant.ElectricCoilSpeedControlled. +

    +

    +The input signals are configured as follows: +

    + +

    +The expected outputs are: +

    + +")); +end ElectricCoilSpeedControlled; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/package.order b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/package.order index 1bd344e44bb..969bfb036cb 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/package.order +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/package.order @@ -1 +1,2 @@ -ElectricCoilVariableSpeedFan +ElectricCoilBypassDampers +ElectricCoilSpeedControlled diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/package.order b/Buildings/Fluid/Dehumidifiers/Desiccant/package.order index 29295bf56a3..fd983631742 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/package.order +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/package.order @@ -1,4 +1,5 @@ -ElectricCoilVariableSpeedFan +ElectricCoilBypassDampers +ElectricCoilSpeedControlled Data Examples BaseClasses diff --git a/Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/dehumidifer_schematic.png b/Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/dehumidifer_schematic.png index 2190d105d5c9bfc32b9a3c00743a4ff213cbc7a6..fec11371d9df2c3484d5f37bc189be95694345d8 100644 GIT binary patch literal 12406 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 diff --git a/Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/system_schematic.png b/Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/system_schematic.png deleted file mode 100644 index 96fafd47c57f6fca7ef7d82d0162e13817cab615..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20348 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 Yh($ literal 0 HcmV?d00001 diff --git a/Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/system_schematic_bypass.png b/Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/system_schematic_bypass.png new file mode 100644 index 0000000000000000000000000000000000000000..93191f0eb042788102e3278e73e07b35c137efd9 GIT binary patch literal 28542 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 Date: Thu, 11 Apr 2024 13:15:56 -0400 Subject: [PATCH 10/16] clean-up --- .../Desiccant/BaseClasses/PartialDesiccant.mo | 10 ++---- .../Desiccant/BaseClasses/Performance.mo | 32 +++++++++---------- .../BaseClasses/Validation/Performance.mo | 6 ++-- .../Desiccant/ElectricCoilBypassDampers.mo | 10 +++--- .../Desiccant/ElectricCoilSpeedControlled.mo | 15 +++++---- .../Examples/ElectricCoilBypassDampers.mo | 4 +-- .../Examples/ElectricCoilSpeedControlled.mo | 6 ++-- 7 files changed, 40 insertions(+), 43 deletions(-) diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo index af6b779596a..a0b4a7fee8b 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo @@ -36,13 +36,10 @@ partial model PartialDesiccant parameter Modelica.Units.SI.Velocity vReg_nominal "Nominal velocity of the regeneration air" annotation (Dialog(group="Nominal condition")); - final parameter Real uSpe_min = 0.3 - "Minimum allowable wheel speed ratio"; - final parameter Modelica.Units.SI.VolumeFlowRate VReg_flow_nominal = m2_flow_nominal/rho_Reg_default "Nominal volumetric flow rate of the regeneration air" annotation (Dialog(group="Nominal condition")); - parameter Modelica.Units.SI.HeatFlowRate QReg_flow_nominal + parameter Modelica.Units.SI.HeatFlowRate QReg_flow_nominal "Nominal regeneration heating capacity" annotation (Dialog(group="Nominal condition")); parameter Buildings.Fluid.Dehumidifiers.Desiccant.Data.Generic perDat @@ -87,8 +84,7 @@ protected final vReg_nominal=vReg_nominal, final VReg_flow_nominal=VReg_flow_nominal, final QReg_flow_nominal=QReg_flow_nominal, - final per=perDat, - uSpe_min=uSpe_min) + final per=perDat) "Calculate the performance of the dehumidifier" annotation (Placement(transformation(extent={{-58,-94},{-38,-74}}))); Modelica.Blocks.Sources.RealExpression VPro_flow( @@ -139,7 +135,6 @@ protected final y(final unit="kg/s")= outCon.port_a.m_flow) "Process air mass flow rate" annotation (Placement(transformation(extent={{-110,-124},{-90,-104}}))); - parameter Integer i1_w(min=1, fixed=false) "Index for water substance"; parameter Medium2.ThermodynamicState sta_Reg_default=Medium2.setState_pTX( @@ -156,7 +151,6 @@ protected "Default state of the process air"; parameter Modelica.Units.SI.Density rho_Pro_default=Medium2.density(sta_Pro_default) "Default density of the process air"; - initial algorithm i1_w:= -1; for i in 1:Medium1.nXi loop diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Performance.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Performance.mo index 642c716c345..ea04f6ce51b 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Performance.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Performance.mo @@ -16,14 +16,12 @@ model Performance parameter Buildings.Fluid.Dehumidifiers.Desiccant.Data.Generic per "Performance data" annotation (Placement(transformation(extent={{60,64},{80,84}}))); - final parameter Real a[:] = {0.48,1.7658,-2.1537,0.9091} - "Coefficients for sensible heat exchange effectiveness"; + "Coefficients for calculating the sensible heat exchange effectiveness"; final parameter Real b[:] = {-0.8045,5.6984,-6.6667,2.7778} - "Coefficients for latent heat exchange effectiveness"; - parameter Real uSpe_min = 0.3 + "Coefficients for calculating the latent heat exchange effectiveness"; + final parameter Real uSpe_min = 0.3 "Minimum allowable wheel speed ratio"; - Modelica.Blocks.Interfaces.BooleanInput onDeh "Set to true to enable the dehumidification process" annotation (Placement( transformation(extent={{-124,68},{-100,92}}), iconTransformation(extent= @@ -128,7 +126,7 @@ equation TProEnt = TProEnt, X_w_ProEnt = X_w_ProEnt, vPro = VPro_flow/VPro_flow_nominal*vPro_nominal, - a = per.coeTProLea) - TProEnt + 273.15)*etaSen; + a = per.coeTProLea)+ 273.15 - TProEnt)*etaSen; X_w_ProLea = X_w_ProEnt-(X_w_ProEnt-(Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.performanceCurve( TProEnt = TProEnt, X_w_ProEnt = X_w_ProEnt, @@ -148,7 +146,7 @@ equation deltaX = 0.01); yQReg = CpReg*(X_w_ProEnt - X_w_ProLea)*mPro_flow*(per.TRegEnt_nominal - TRegEnt)/(per.TRegEnt_nominal - TProEnt)/QReg_flow_nominal; - assert(yQReg < 1, + assert(yQReg <= 1, "In " + getInstanceName() + ": heating power is not sufficient for regeneration.", level=AssertionLevel.error); else @@ -195,7 +193,8 @@ Specifically, this calculation is configured as follows. etaLat = (b1 + b2 uSpe + b3 uSpe2 + ...),

    where the a[:] and b[:] are the coefficients obtained based on - ASHRAE Handbook—HVAC Systems & Equipment (Figure 7, Chapter 26). + ASHRAE Handbook—HVAC Systems & Equipment (Figure 7, Chapter 26), + uSpe is the wheel speed ratio.
  • The velocity of the process air is calculated by @@ -205,15 +204,15 @@ Specifically, this calculation is configured as follows. where VPro_flow is the volumetric flow rate of the process air, VPro_flow_nominal is the nominal volumetric flow rate of the process air, vPro_nominal is the nominal velocity of the process air. +
    Then, the volumetric flow rate of the regeneration air is calculated by

    VReg_flow = f(TProEnt,X_w_ProEnt,vPro,coevReg)/vReg_nominal*VReg_flow_nominal*uSpe

    - where f() is defined in
    + where f(.) is defined in Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.performanceCurve, coevReg are coefficients, as defined in Buildings.Fluid.Dehumidifiers.Desiccant.Data.Generic, - uSpe is the wheel speed ratio, TProEnt and X_w_ProEnt are the temperature and the humidity ratio of the process air entering the dehumidifier, respectively.
      @@ -225,13 +224,13 @@ Specifically, this calculation is configured as follows.
    • The temperature of the process air leaving the dehumidifier, TProLea is calculated by

      - TProLea = TProEnt + (f(TProEnt,X_w_ProEnt,vPro,coeTProLea) - TProEnt)*etaSen, + TProLea = TProEnt + (f(TProEnt,X_w_ProEnt,vPro,coeTProLea) + 273.15 - TProEnt)*etaSen,

      where coeTProLea are coefficients.
      The humidity ratio of the process air leaving the dehumidifier, X_w_ProLea, is calculated by

      - TProLea = X_w_ProEnt - (X_w_ProEnt - f(TProEnt,X_w_ProEnt,vPro,coeX_w_ProLea))*etaLat, + X_w_ProLea = X_w_ProEnt - (X_w_ProEnt - f(TProEnt,X_w_ProEnt,vPro,coeX_w_ProLea))*etaLat,

      where coeX_w_ProLea are coefficients.
        @@ -253,14 +252,12 @@ Specifically, this calculation is configured as follows. yQReg = CpReg*(X_w_ProEnt-X_w_ProLea)*mPro_flow*(TRegEnt_nominal - TRegEnt) / (TRegEnt_nominal - TProEnt)/ QReg_flow_nominal,

        - where X_w_ProEnt, mPro_flow, and TProEnt are the humidity ratio, - the flow rate, and the temperature of the process air entering the dehumidifier; - TRegEnt_nominal and TRegEnt are the nominal temperature and the actual temperature + where TRegEnt_nominal and TRegEnt are the nominal temperature and the actual temperature of the regeneration air entering the dehumidifier.QReg_flow_nominal is the nominal regeneration heating capacity.
        • - If yQReg is larger than 0, + If yQReg is larger than 1, the calculation is terminated and an error is generated.
        @@ -295,6 +292,9 @@ ASHRAE Handbook—HVAC Systems & Equipment Chapter 26 ", revisions="
          +
        • April 10, 2024, by Sen Huang:
          Added wheel speed ratio as an input.
        • +
        +
        • March 1, 2024, by Sen Huang:
          First implementation.
        ")); diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mo index 0b2669b653b..a0d33469a66 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mo @@ -80,11 +80,11 @@ The input signals are configured as follows:

        • -The dehumidification signal onDeh is changes from +The dehumidification signal onDeh changes from false to true at 50 seconds.
        • -The Wheel speed ratio uSpe is changes from +The Wheel speed ratio uSpe changes from 0.5 to 1 from 50 seconds to 100 seconds.
        • @@ -98,7 +98,7 @@ During the same period, the humidity ratio of the process air entering the dehum
          Default operation curve -Buildings.Fluid.Dehumidifiers.Desiccant.Data.Default is also employed. +Buildings.Fluid.Dehumidifiers.Desiccant.Data.Default is employed.

        diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilBypassDampers.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilBypassDampers.mo index 9d85d579d17..0aeac581866 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilBypassDampers.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilBypassDampers.mo @@ -5,7 +5,7 @@ model ElectricCoilBypassDampers vol(nPorts=2)); parameter Real etaHea( final min=0, - final max=1) + final max=1) = 0.8 "Heater efficiency" annotation (Dialog(group="Efficiency")); Modelica.Blocks.Interfaces.BooleanInput uRot @@ -30,12 +30,14 @@ model ElectricCoilBypassDampers Buildings.Fluid.Actuators.Dampers.Exponential bypDamPro( redeclare package Medium = Medium1, final m_flow_nominal=m1_flow_nominal, - final dpDamper_nominal=dp1_nominal) "Process air bypass damper" + final dpDamper_nominal=dp1_nominal) + "Process air bypass damper" annotation (Placement(transformation(extent={{-170,-130},{-150,-110}}))); - Buildings.Fluid.Actuators.Dampers.Exponential damPro( + Buildings.Fluid.Actuators.Dampers.Exponential damPro( redeclare package Medium = Medium1, final m_flow_nominal=m1_flow_nominal, - final dpDamper_nominal=dp1_nominal) "Process air damper" + final dpDamper_nominal=dp1_nominal) + "Process air damper" annotation (Placement(transformation( extent={{-10,-10},{10,10}},rotation=0,origin={-130,-100}))); Modelica.Blocks.Sources.RealExpression X_w_ProEnt(final y(final unit="1")= diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilSpeedControlled.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilSpeedControlled.mo index 87fdaed7f56..b60c5a1e3dc 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilSpeedControlled.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilSpeedControlled.mo @@ -38,18 +38,19 @@ model ElectricCoilSpeedControlled final dp_nominal=dp2_nominal) "Regeneration fan" annotation (Placement(transformation(extent={{80,56},{60,76}}))); - Modelica.Blocks.Math.RealToBoolean realToBoolean( - final threshold=uSpe_min) "Convert real input to boolean output " + Modelica.Blocks.Math.RealToBoolean realToBoolean(final threshold=dehPer.uSpe_min) + "Convert real input to boolean output " annotation (Placement(transformation(extent={{-180,-50},{-160,-30}}))); - Modelica.Blocks.Sources.RealExpression X_w_ProEnt(final y(final unit="1") = + Modelica.Blocks.Sources.RealExpression X_w_ProEnt(final y(final unit="1")= res.port_b.Xi_outflow[i1_w]) "Humidity ratio of the process air entering the dehumidifier" annotation (Placement(transformation(extent={{-110,-72},{-90,-52}}))); - FixedResistances.PressureDrop res( + Buildings.Fluid.FixedResistances.PressureDrop res( redeclare package Medium = Medium1, - m_flow_nominal=m1_flow_nominal, - dp_nominal=dp1_nominal) "Flow resistance" + final m_flow_nominal=m1_flow_nominal, + final dp_nominal=dp1_nominal) + "Flow resistance" annotation (Placement(transformation(extent={{-200,-110},{-180,-90}}))); protected Modelica.Blocks.Sources.RealExpression PEle(final y=PMot_nominal* @@ -156,7 +157,7 @@ when their capacities permit.

        ", revisions="
          -
        • March 1, 2024, by Sen Huang:
          First implementation.
        • +
        • April 10, 2024, by Sen Huang:
          First implementation.
        ")); end ElectricCoilSpeedControlled; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mo index 035c5685782..44448882f33 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mo @@ -1,6 +1,6 @@ within Buildings.Fluid.Dehumidifiers.Desiccant.Examples; model ElectricCoilBypassDampers - "Model that demonstrates the usage of a desiccant dehumidifier model with an electric heater and a variable speed fan" + "Model that demonstrates the usage of a desiccant dehumidifier model with an electric heater and bypass dampers" extends Modelica.Icons.Example; package Medium1 = Buildings.Media.Air "Process air"; @@ -138,7 +138,7 @@ Before 300 seconds and after 900 seconds, the humidity ratio of the process air
      • During the rest time, X_w_ProEnt > X_w_ProLea. -After 600 seconds, X_w_ProEnt increases as uBypDamPos increases. +After 600 seconds, X_w_ProLea increases as uBypDamPos increases.
      ")); diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mo index 60835cc055c..140250605fd 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mo @@ -1,6 +1,6 @@ within Buildings.Fluid.Dehumidifiers.Desiccant.Examples; model ElectricCoilSpeedControlled - "Model that demonstrates the usage of a desiccant dehumidifier model with an electric heater and a variable speed fan" + "Model that demonstrates the usage of a desiccant dehumidifier model with an electric heater and a variable speed wheel" extends Modelica.Icons.Example; package Medium1 = Buildings.Media.Air "Process air"; @@ -90,12 +90,12 @@ equation {-6,-30},{-6,-16},{-16,-16},{-16,-8},{-10,-8}}, color={0,127,255})); connect(uSpe.y, deh.uSpe) annotation (Line(points={{-71,32},{-22,32},{-22,0},{-12,0}}, - color={0,0,127})); + color={0,0,127})); annotation (experiment(Tolerance=1e-6, StopTime=1200), __Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mos" "Simulate and Plot"), Documentation(revisions="
        -
      • March 1, 2024, by Sen Huang:
        First implementation.
      • +
      • April 10, 2024, by Sen Huang:
        First implementation.
      ", info="

      From 150bc8665c697bcba5227fa2178005a2c86fe822 Mon Sep 17 00:00:00 2001 From: SenHuang19 Date: Thu, 11 Apr 2024 13:16:58 -0400 Subject: [PATCH 11/16] script and reference data update --- ...ant_BaseClasses_Validation_Performance.txt | 7 ++++--- ...ant_Examples_ElectricCoilBypassDampers.txt | 20 +++++++++++++++++++ ...t_Examples_ElectricCoilSpeedControlled.txt | 19 ++++++++++++++++++ ...ant.BaseClasses.Validation.Performance.mos | 1 + ...ant.Examples.ElectricCoilBypassDampers.mos | 9 +++++++++ ...t.Examples.ElectricCoilSpeedControlled.mos | 8 ++++++++ 6 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 Buildings/Resources/ReferenceResults/Dymola/Buildings_Fluid_Dehumidifiers_Desiccant_Examples_ElectricCoilBypassDampers.txt create mode 100644 Buildings/Resources/ReferenceResults/Dymola/Buildings_Fluid_Dehumidifiers_Desiccant_Examples_ElectricCoilSpeedControlled.txt create mode 100644 Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Fluid.Dehumidifiers.Desiccant.Examples.ElectricCoilBypassDampers.mos create mode 100644 Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Fluid.Dehumidifiers.Desiccant.Examples.ElectricCoilSpeedControlled.mos diff --git a/Buildings/Resources/ReferenceResults/Dymola/Buildings_Fluid_Dehumidifiers_Desiccant_BaseClasses_Validation_Performance.txt b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Fluid_Dehumidifiers_Desiccant_BaseClasses_Validation_Performance.txt index de8a7b6c798..342e2c5ebee 100644 --- a/Buildings/Resources/ReferenceResults/Dymola/Buildings_Fluid_Dehumidifiers_Desiccant_BaseClasses_Validation_Performance.txt +++ b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Fluid_Dehumidifiers_Desiccant_BaseClasses_Validation_Performance.txt @@ -1,4 +1,4 @@ -last-generated=2024-03-28 +last-generated=2024-04-11 statistics-simulation= { "linear": " ", @@ -7,7 +7,8 @@ statistics-simulation= } time=[0e+00, 1e+02] onDeh.y=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00] +uSpe.y=[5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5.099999904632568e-01, 5.199999809265137e-01, 5.299999713897705e-01, 5.400000214576721e-01, 5.500000119209291e-01, 5.600000023841859e-01, 5.699999928474425e-01, 5.799999833106994e-01, 5.899999737739563e-01, 6.000000238418579e-01, 6.100000143051147e-01, 6.200000047683716e-01, 6.299999952316284e-01, 6.399999856948853e-01, 6.499999761581421e-01, 6.600000262260437e-01, 6.700000166893005e-01, 6.800000071525574e-01, 6.899999976158142e-01, 6.99999988079071e-01, 7.099999785423279e-01, 7.200000286102295e-01, 7.300000190734863e-01, 7.400000095367432e-01, 7.5e-01, 7.599999904632568e-01, 7.699999809265137e-01, 7.799999713897705e-01, 7.900000214576721e-01, 8.00000011920929e-01, 8.100000023841858e-01, 8.199999928474426e-01, 8.299999833106995e-01, 8.399999737739563e-01, 8.500000238418579e-01, 8.600000143051147e-01, 8.700000047683716e-01, 8.799999952316284e-01, 8.899999856948853e-01, 8.999999761581421e-01, 9.100000262260437e-01, 9.200000166893005e-01, 9.300000071525574e-01, 9.399999976158142e-01, 9.49999988079071e-01, 9.599999785423279e-01, 9.700000286102295e-01, 9.800000190734863e-01, 9.900000095367432e-01, 1e+00] TProEnt.y=[2.931499938964844e+02, 2.9325e+02, 2.933500061035156e+02, 2.934500122070312e+02, 2.935499877929688e+02, 2.936499938964844e+02, 2.9375e+02, 2.938500061035156e+02, 2.939500122070312e+02, 2.940499877929688e+02, 2.941499938964844e+02, 2.9425e+02, 2.943500061035156e+02, 2.944500122070312e+02, 2.945499877929688e+02, 2.946499938964844e+02, 2.9475e+02, 2.948500061035156e+02, 2.949500122070312e+02, 2.950499877929688e+02, 2.951499938964844e+02, 2.9525e+02, 2.953500061035156e+02, 2.954500122070312e+02, 2.955499877929688e+02, 2.956499938964844e+02, 2.9575e+02, 2.958500061035156e+02, 2.959500122070312e+02, 2.960499877929688e+02, 2.961499938964844e+02, 2.9625e+02, 2.963500061035156e+02, 2.964500122070312e+02, 2.965499877929688e+02, 2.966499938964844e+02, 2.9675e+02, 2.968500061035156e+02, 2.969500122070312e+02, 2.970499877929688e+02, 2.971499938964844e+02, 2.9725e+02, 2.973500061035156e+02, 2.974500122070312e+02, 2.975499877929688e+02, 2.976499938964844e+02, 2.9775e+02, 2.978500061035156e+02, 2.979500122070312e+02, 2.980499877929688e+02, 2.981499938964844e+02, 2.9825e+02, 2.983500061035156e+02, 2.984500122070312e+02, 2.985499877929688e+02, 2.986499938964844e+02, 2.9875e+02, 2.988500061035156e+02, 2.989500122070312e+02, 2.990499877929688e+02, 2.991499938964844e+02, 2.9925e+02, 2.993500061035156e+02, 2.994500122070312e+02, 2.995499877929688e+02, 2.996499938964844e+02, 2.9975e+02, 2.998500061035156e+02, 2.999500122070312e+02, 3.000499877929688e+02, 3.001499938964844e+02, 3.0025e+02, 3.003500061035156e+02, 3.004500122070312e+02, 3.005499877929688e+02, 3.006499938964844e+02, 3.0075e+02, 3.008500061035156e+02, 3.009500122070312e+02, 3.010499877929688e+02, 3.011499938964844e+02, 3.0125e+02, 3.013500061035156e+02, 3.014500122070312e+02, 3.015499877929688e+02, 3.016499938964844e+02, 3.0175e+02, 3.018500061035156e+02, 3.019500122070312e+02, 3.020499877929688e+02, 3.021499938964844e+02, 3.0225e+02, 3.023500061035156e+02, 3.024500122070312e+02, 3.025499877929688e+02, 3.026499938964844e+02, 3.0275e+02, 3.028500061035156e+02, 3.029500122070312e+02, 3.030499877929688e+02, 3.031499938964844e+02] -dehumPer.TProLea=[2.931499938964844e+02, 2.9325e+02, 2.933500061035156e+02, 2.934500122070312e+02, 2.935499877929688e+02, 2.936499938964844e+02, 2.9375e+02, 2.938500061035156e+02, 2.939500122070312e+02, 2.940499877929688e+02, 2.941499938964844e+02, 2.9425e+02, 2.943500061035156e+02, 2.944500122070312e+02, 2.945499877929688e+02, 2.946499938964844e+02, 2.9475e+02, 2.948500061035156e+02, 2.949500122070312e+02, 2.950499877929688e+02, 2.951499938964844e+02, 2.9525e+02, 2.953500061035156e+02, 2.954500122070312e+02, 2.955499877929688e+02, 2.956499938964844e+02, 2.9575e+02, 2.958500061035156e+02, 2.959500122070312e+02, 2.960499877929688e+02, 2.961499938964844e+02, 2.9625e+02, 2.963500061035156e+02, 2.964500122070312e+02, 2.965499877929688e+02, 2.966499938964844e+02, 2.9675e+02, 2.968500061035156e+02, 2.969500122070312e+02, 2.970499877929688e+02, 2.971499938964844e+02, 2.9725e+02, 2.973500061035156e+02, 2.974500122070312e+02, 2.975499877929688e+02, 2.976499938964844e+02, 2.9775e+02, 2.978500061035156e+02, 2.979500122070312e+02, 2.980499877929688e+02, 2.981499938964844e+02, 3.361206665039062e+02, 3.361126098632812e+02, 3.361046142578125e+02, 3.360966186523438e+02, 3.360887145996094e+02, 3.360808410644531e+02, 3.36072998046875e+02, 3.360652160644531e+02, 3.360574645996094e+02, 3.360497741699219e+02, 3.360421447753906e+02, 3.360345458984375e+02, 3.360270385742188e+02, 3.360195922851562e+02, 3.360121765136719e+02, 3.360048522949219e+02, 3.359976196289062e+02, 3.359904174804688e+02, 3.359833374023438e+02, 3.35976318359375e+02, 3.359693908691406e+02, 3.359625549316406e+02, 3.35955810546875e+02, 3.359491577148438e+02, 3.359425964355469e+02, 3.359361572265625e+02, 3.359298400878906e+02, 3.359236450195312e+02, 3.359175720214844e+02, 3.359115905761719e+02, 3.359057922363281e+02, 3.359000854492188e+02, 3.358945617675781e+02, 3.3588916015625e+02, 3.358839416503906e+02, 3.358788757324219e+02, 3.358739624023438e+02, 3.358692321777344e+02, 3.358646545410156e+02, 3.358602905273438e+02, 3.358561096191406e+02, 3.358521423339844e+02, 3.358483581542969e+02, 3.358447875976562e+02, 3.358414611816406e+02, 3.358383178710938e+02, 3.3583544921875e+02, 3.358327941894531e+02, 3.358303833007812e+02, 3.358282470703125e+02] +dehumPer.TProLea=[2.931499938964844e+02, 2.9325e+02, 2.933500061035156e+02, 2.934500122070312e+02, 2.935499877929688e+02, 2.936499938964844e+02, 2.9375e+02, 2.938500061035156e+02, 2.939500122070312e+02, 2.940499877929688e+02, 2.941499938964844e+02, 2.9425e+02, 2.943500061035156e+02, 2.944500122070312e+02, 2.945499877929688e+02, 2.946499938964844e+02, 2.9475e+02, 2.948500061035156e+02, 2.949500122070312e+02, 2.950499877929688e+02, 2.951499938964844e+02, 2.9525e+02, 2.953500061035156e+02, 2.954500122070312e+02, 2.955499877929688e+02, 2.956499938964844e+02, 2.9575e+02, 2.958500061035156e+02, 2.959500122070312e+02, 2.960499877929688e+02, 2.961499938964844e+02, 2.9625e+02, 2.963500061035156e+02, 2.964500122070312e+02, 2.965499877929688e+02, 2.966499938964844e+02, 2.9675e+02, 2.968500061035156e+02, 2.969500122070312e+02, 2.970499877929688e+02, 2.971499938964844e+02, 2.9725e+02, 2.973500061035156e+02, 2.974500122070312e+02, 2.975499877929688e+02, 2.976499938964844e+02, 2.9775e+02, 2.978500061035156e+02, 2.979500122070312e+02, 2.980499877929688e+02, 2.981499938964844e+02, 3.338852844238281e+02, 3.339859008789062e+02, 3.340804443359375e+02, 3.341691284179688e+02, 3.342522277832031e+02, 3.343300170898438e+02, 3.344027099609375e+02, 3.344705810546875e+02, 3.345338439941406e+02, 3.345927429199219e+02, 3.346475219726562e+02, 3.346984252929688e+02, 3.347456665039062e+02, 3.347895202636719e+02, 3.348301696777344e+02, 3.348678588867188e+02, 3.3490283203125e+02, 3.349352722167969e+02, 3.349654541015625e+02, 3.349935302734375e+02, 3.35019775390625e+02, 3.350443725585938e+02, 3.350675354003906e+02, 3.350894775390625e+02, 3.351104125976562e+02, 3.351305541992188e+02, 3.351500854492188e+02, 3.35169189453125e+02, 3.351881103515625e+02, 3.3520703125e+02, 3.352261352539062e+02, 3.3524560546875e+02, 3.352656555175781e+02, 3.352864685058594e+02, 3.353082275390625e+02, 3.353310852050781e+02, 3.353552856445312e+02, 3.353809509277344e+02, 3.354082946777344e+02, 3.354374694824219e+02, 3.354686584472656e+02, 3.355020141601562e+02, 3.355377502441406e+02, 3.355759887695312e+02, 3.356169128417969e+02, 3.356607055664062e+02, 3.357074890136719e+02, 3.357574157714844e+02, 3.358106994628906e+02, 3.358674621582031e+02] dehumPer.X_w_ProEnt=[1.999999955296516e-02, 2.005000039935112e-02, 2.009999938309193e-02, 2.015000022947788e-02, 2.019999921321869e-02, 2.025000005960464e-02, 2.03000009059906e-02, 2.034999988973141e-02, 2.040000073611736e-02, 2.044999971985817e-02, 2.050000056624413e-02, 2.054999954998493e-02, 2.060000039637089e-02, 2.064999938011169e-02, 2.070000022649765e-02, 2.074999921023846e-02, 2.080000005662441e-02, 2.085000090301037e-02, 2.089999988675117e-02, 2.095000073313713e-02, 2.099999971687794e-02, 2.105000056326389e-02, 2.10999995470047e-02, 2.115000039339066e-02, 2.119999937713146e-02, 2.125000022351742e-02, 2.129999920725822e-02, 2.135000005364418e-02, 2.140000090003014e-02, 2.144999988377094e-02, 2.15000007301569e-02, 2.154999971389771e-02, 2.160000056028366e-02, 2.164999954402447e-02, 2.170000039041042e-02, 2.174999937415123e-02, 2.180000022053719e-02, 2.184999920427799e-02, 2.190000005066395e-02, 2.19500008970499e-02, 2.199999988079071e-02, 2.205000072717667e-02, 2.209999971091747e-02, 2.215000055730343e-02, 2.219999954104424e-02, 2.225000038743019e-02, 2.2299999371171e-02, 2.235000021755695e-02, 2.239999920129776e-02, 2.245000004768372e-02, 2.250000089406967e-02, 2.254999987781048e-02, 2.260000072419643e-02, 2.264999970793724e-02, 2.27000005543232e-02, 2.2749999538064e-02, 2.280000038444996e-02, 2.284999936819077e-02, 2.290000021457672e-02, 2.294999919831753e-02, 2.300000004470348e-02, 2.305000089108944e-02, 2.309999987483025e-02, 2.31500007212162e-02, 2.319999970495701e-02, 2.325000055134296e-02, 2.329999953508377e-02, 2.335000038146973e-02, 2.339999936521053e-02, 2.345000021159649e-02, 2.34999991953373e-02, 2.355000004172325e-02, 2.360000088810921e-02, 2.364999987185001e-02, 2.370000071823597e-02, 2.374999970197678e-02, 2.380000054836273e-02, 2.384999953210354e-02, 2.390000037848949e-02, 2.39499993622303e-02, 2.400000020861626e-02, 2.404999919235706e-02, 2.410000003874302e-02, 2.415000088512897e-02, 2.419999986886978e-02, 2.425000071525574e-02, 2.429999969899654e-02, 2.43500005453825e-02, 2.439999952912331e-02, 2.445000037550926e-02, 2.449999935925007e-02, 2.455000020563602e-02, 2.459999918937683e-02, 2.465000003576279e-02, 2.470000088214874e-02, 2.474999986588955e-02, 2.480000071227551e-02, 2.484999969601631e-02, 2.490000054240227e-02, 2.494999952614307e-02, 2.500000037252903e-02] -dehumPer.X_w_ProLea=[1.999999955296516e-02, 2.005000039935112e-02, 2.009999938309193e-02, 2.015000022947788e-02, 2.019999921321869e-02, 2.025000005960464e-02, 2.03000009059906e-02, 2.034999988973141e-02, 2.040000073611736e-02, 2.044999971985817e-02, 2.050000056624413e-02, 2.054999954998493e-02, 2.060000039637089e-02, 2.064999938011169e-02, 2.070000022649765e-02, 2.074999921023846e-02, 2.080000005662441e-02, 2.085000090301037e-02, 2.089999988675117e-02, 2.095000073313713e-02, 2.099999971687794e-02, 2.105000056326389e-02, 2.10999995470047e-02, 2.115000039339066e-02, 2.119999937713146e-02, 2.125000022351742e-02, 2.129999920725822e-02, 2.135000005364418e-02, 2.140000090003014e-02, 2.144999988377094e-02, 2.15000007301569e-02, 2.154999971389771e-02, 2.160000056028366e-02, 2.164999954402447e-02, 2.170000039041042e-02, 2.174999937415123e-02, 2.180000022053719e-02, 2.184999920427799e-02, 2.190000005066395e-02, 2.19500008970499e-02, 2.199999988079071e-02, 2.205000072717667e-02, 2.209999971091747e-02, 2.215000055730343e-02, 2.219999954104424e-02, 2.225000038743019e-02, 2.2299999371171e-02, 2.235000021755695e-02, 2.239999920129776e-02, 2.245000004768372e-02, 2.250000089406967e-02, 1.015076879411936e-02, 1.023139338940382e-02, 1.031203288584948e-02, 1.03926844894886e-02, 1.047334726899862e-02, 1.055401843041182e-02, 1.063469611108303e-02, 1.071537751704454e-02, 1.079606264829636e-02, 1.087674777954817e-02, 1.095743104815483e-02, 1.10381105914712e-02, 1.111878361552954e-02, 1.119944918900728e-02, 1.128010451793671e-02, 1.136074773967266e-02, 1.144137606024742e-02, 1.152198668569326e-02, 1.160257868468761e-02, 1.168315019458532e-02, 1.176369655877352e-02, 1.18442177772522e-02, 1.192471012473106e-02, 1.200517173856497e-02, 1.208560075610876e-02, 1.216599438339472e-02, 1.224634982645512e-02, 1.232666522264481e-02, 1.240693777799606e-02, 1.248716562986374e-02, 1.256734598428011e-02, 1.264747604727745e-02, 1.272755395621061e-02, 1.280757691711187e-02, 1.288754213601351e-02, 1.296744681894779e-02, 1.304729003459215e-02, 1.312706712633371e-02, 1.32067771628499e-02, 1.328641641885042e-02, 1.336598303169012e-02, 1.344547420740128e-02, 1.352488715201616e-02, 1.360421907156706e-02, 1.368346810340881e-02, 1.376263052225113e-02, 1.384170446544886e-02, 1.39206862077117e-02, 1.39995738863945e-02, 1.407836563885212e-02] +dehumPer.X_w_ProLea=[1.999999955296516e-02, 2.005000039935112e-02, 2.009999938309193e-02, 2.015000022947788e-02, 2.019999921321869e-02, 2.025000005960464e-02, 2.03000009059906e-02, 2.034999988973141e-02, 2.040000073611736e-02, 2.044999971985817e-02, 2.050000056624413e-02, 2.054999954998493e-02, 2.060000039637089e-02, 2.064999938011169e-02, 2.070000022649765e-02, 2.074999921023846e-02, 2.080000005662441e-02, 2.085000090301037e-02, 2.089999988675117e-02, 2.095000073313713e-02, 2.099999971687794e-02, 2.105000056326389e-02, 2.10999995470047e-02, 2.115000039339066e-02, 2.119999937713146e-02, 2.125000022351742e-02, 2.129999920725822e-02, 2.135000005364418e-02, 2.140000090003014e-02, 2.144999988377094e-02, 2.15000007301569e-02, 2.154999971389771e-02, 2.160000056028366e-02, 2.164999954402447e-02, 2.170000039041042e-02, 2.174999937415123e-02, 2.180000022053719e-02, 2.184999920427799e-02, 2.190000005066395e-02, 2.19500008970499e-02, 2.199999988079071e-02, 2.205000072717667e-02, 2.209999971091747e-02, 2.215000055730343e-02, 2.219999954104424e-02, 2.225000038743019e-02, 2.2299999371171e-02, 2.235000021755695e-02, 2.239999920129776e-02, 2.245000004768372e-02, 2.250000089406967e-02, 1.342226564884186e-02, 1.336592994630337e-02, 1.331600081175566e-02, 1.32722295820713e-02, 1.323436945676804e-02, 1.320217456668615e-02, 1.317540183663368e-02, 1.31538100540638e-02, 1.313715986907482e-02, 1.312521286308765e-02, 1.311773527413607e-02, 1.311449147760868e-02, 1.311525236815214e-02, 1.311978604644537e-02, 1.312786713242531e-02, 1.313926838338375e-02, 1.315376628190279e-02, 1.317114103585482e-02, 1.319117099046707e-02, 1.321364007890224e-02, 1.323833130300045e-02, 1.326503325253725e-02, 1.329353265464306e-02, 1.332361996173859e-02, 1.335508842021227e-02, 1.338773220777512e-02, 1.342134736478329e-02, 1.345573365688324e-02, 1.349068991839886e-02, 1.35260196402669e-02, 1.356152631342411e-02, 1.359701715409756e-02, 1.363229937851429e-02, 1.366718485951424e-02, 1.370148360729218e-02, 1.373501215130091e-02, 1.376758422702551e-02, 1.379901915788651e-02, 1.382913626730442e-02, 1.38577576726675e-02, 1.388470642268658e-02, 1.390980742871761e-02, 1.393288839608431e-02, 1.395377889275551e-02, 1.397230941802263e-02, 1.398831233382225e-02, 1.400162093341351e-02, 1.401207316666842e-02, 1.401950512081385e-02, 1.402375753968954e-02] diff --git a/Buildings/Resources/ReferenceResults/Dymola/Buildings_Fluid_Dehumidifiers_Desiccant_Examples_ElectricCoilBypassDampers.txt b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Fluid_Dehumidifiers_Desiccant_Examples_ElectricCoilBypassDampers.txt new file mode 100644 index 00000000000..e5b8e2cb773 --- /dev/null +++ b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Fluid_Dehumidifiers_Desiccant_Examples_ElectricCoilBypassDampers.txt @@ -0,0 +1,20 @@ +last-generated=2024-04-11 +statistics-initialization= +{ + "nonlinear": "0, 0, 1", + "numerical Jacobians": "0" +} +statistics-simulation= +{ + "linear": "0, 0", + "nonlinear": "0, 0, 1", + "number of continuous time states": "16", + "numerical Jacobians": "0" +} +time=[0e+00, 1.2e+03] +uRot.y=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00] +uBypDamPos.y=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01] +senX_w_ProLea.X=[9.999999776482582e-03, 2.037464827299118e-02, 2.338699623942375e-02, 2.486194111406803e-02, 2.429632097482681e-02, 2.546914480626583e-02, 2.528834342956543e-02, 2.47687716037035e-02, 2.459252811968327e-02, 2.504667267203331e-02, 2.474034391343594e-02, 2.504260279238224e-02, 2.498309314250946e-02, 2.499841526150703e-02, 2.50029843300581e-02, 2.501381747424603e-02, 2.500412985682487e-02, 2.500608935952187e-02, 2.500344812870026e-02, 2.501381747424603e-02, 2.501934021711349e-02, 2.50030905008316e-02, 2.501140162348747e-02, 2.501600235700607e-02, 2.50079371035099e-02, 2.500220388174057e-02, 1.714855991303921e-02, 1.438876055181026e-02, 1.35575421154499e-02, 1.330784428864717e-02, 1.323314569890499e-02, 1.321029104292393e-02, 1.320288144052029e-02, 1.320048607885838e-02, 1.319956872612238e-02, 1.319912169128656e-02, 1.319892518222332e-02, 1.319896709173918e-02, 1.319912169128656e-02, 1.319924928247929e-02, 1.319929677993059e-02, 1.319928839802742e-02, 1.319927256554365e-02, 1.319925859570503e-02, 1.319926232099533e-02, 1.319926232099533e-02, 1.319927256554365e-02, 1.319928094744682e-02, 1.319928653538227e-02, 1.319928839802742e-02, 1.319928839802742e-02, 1.304911635816097e-02, 1.263197138905525e-02, 1.249928772449493e-02, 1.293747778981924e-02, 1.354704983532429e-02, 1.53106218203902e-02, 1.764107868075366e-02, 1.732282154262066e-02, 1.647289842367172e-02, 1.625575870275497e-02, 1.755387336015701e-02, 1.732920855283737e-02, 1.742768846452236e-02, 1.749715954065323e-02, 1.743514090776443e-02, 1.74347460269928e-02, 1.747819036245346e-02, 1.75178162753582e-02, 1.754720509052277e-02, 1.757651381194592e-02, 1.758702285587788e-02, 1.760483905673027e-02, 1.761685498058796e-02, 1.763240061700344e-02, 1.765047945082188e-02, 2.096284553408623e-02, 2.353678829967976e-02, 2.452594414353371e-02, 2.485340274870396e-02, 2.495671063661575e-02, 2.498730830848217e-02, 2.499653212726116e-02, 2.499880269169807e-02, 2.499965764582157e-02, 2.499988675117493e-02, 2.499996684491634e-02, 2.500017546117306e-02, 2.500033192336559e-02, 2.500027604401112e-02, 2.500010654330254e-02, 2.499999478459358e-02, 2.499993704259396e-02, 2.499995194375515e-02, 2.499997615814209e-02, 2.499999850988388e-02, 2.500000596046448e-02, 2.500000223517418e-02, 2.499998919665813e-02, 2.499996684491634e-02, 2.499995939433575e-02] +senX_w_ProEnt.X=[9.999999776482582e-03, 2.499432489275932e-02, 2.503397688269615e-02, 2.499097213149071e-02, 2.50689759850502e-02, 2.495064027607441e-02, 2.497097663581371e-02, 2.502403594553471e-02, 2.50391848385334e-02, 2.499342523515224e-02, 2.50314474105835e-02, 2.499800734221935e-02, 2.500085718929768e-02, 2.50003207474947e-02, 2.499977685511112e-02, 2.499888464808464e-02, 2.499967254698277e-02, 2.499952726066113e-02, 2.499972842633724e-02, 2.499890327453613e-02, 2.499846182763577e-02, 2.499975264072418e-02, 2.499908395111561e-02, 2.499871328473091e-02, 2.499936148524284e-02, 2.499982342123985e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02] +deh.P=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 2.8483216796875e+04, 2.96994609375e+04, 2.9819662109375e+04, 2.9827337890625e+04, 2.98278828125e+04, 2.98279609375e+04, 2.9827978515625e+04, 2.9827978515625e+04, 2.9827978515625e+04, 2.982798046875e+04, 2.982798046875e+04, 2.982798046875e+04, 2.9827978515625e+04, 2.9827978515625e+04, 2.9827978515625e+04, 2.9827978515625e+04, 2.9827978515625e+04, 2.9827978515625e+04, 2.9827978515625e+04, 2.9827978515625e+04, 2.9827978515625e+04, 2.9827978515625e+04, 2.9827978515625e+04, 2.9827978515625e+04, 2.9827978515625e+04, 2.0132193359375e+04, 8.42980859375e+03, 3.375926513671875e+03, 1.1372275390625e+03, 7.755386352539062e+02, 7.936304931640627e+02, 8.117386474609374e+02, 8.24976318359375e+02, 8.322655029296875e+02, 8.349699096679688e+02, 8.348944091796875e+02, 8.333707885742188e+02, 8.311880493164062e+02, 8.287651977539062e+02, 8.263064575195312e+02, 8.239078369140625e+02, 8.216156616210938e+02, 8.194428100585938e+02, 8.173915405273438e+02, 8.15457763671875e+02, 8.136466674804688e+02, 8.119423828125e+02, 8.103480834960938e+02, 8.088497924804688e+02, 8.074457397460938e+02, 1.112390441894531e+02, 1.567670106887817e-01, 2.976423129439354e-04, 5.227512247074628e-06, 5.071168743597809e-06, 4.454283164537098e-09, 1.324638390087859e-07, 5.877446440649692e-08, 2.696636514087913e-08, 1.05322595089774e-08, 1.197082521997572e-08, 1.027002696218915e-07, 1.246592944426084e-07, 2.391515252497811e-08, 7.845342431256341e-11, 5.9269933405659e-10, 1.409545480335339e-09, 1.58620760970507e-09, 1.238741109688135e-09, 4.790737251347821e-12, 4.689440849525717e-11, 1.198215276998482e-10, 2.363181698938899e-11, 1.327034229031687e-11, 6.477977442659322e-12] +TProEnt.y=[3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.033500061035156e+02, 3.035499877929688e+02, 3.0375e+02, 3.039500122070312e+02, 3.041499938964844e+02, 3.043500061035156e+02, 3.045499877929688e+02, 3.0475e+02, 3.049500122070312e+02, 3.051499938964844e+02, 3.053500061035156e+02, 3.055499877929688e+02, 3.0575e+02, 3.059500122070312e+02, 3.061499938964844e+02, 3.063500061035156e+02, 3.065499877929688e+02, 3.0675e+02, 3.069500122070312e+02, 3.071499938964844e+02, 3.073500061035156e+02, 3.075499877929688e+02, 3.0775e+02, 3.079500122070312e+02, 3.081499938964844e+02, 3.083500061035156e+02, 3.085499877929688e+02, 3.0875e+02, 3.089500122070312e+02, 3.091499938964844e+02, 3.093500061035156e+02, 3.095499877929688e+02, 3.0975e+02, 3.099500122070312e+02, 3.101499938964844e+02, 3.103500061035156e+02, 3.105499877929688e+02, 3.1075e+02, 3.109500122070312e+02, 3.111499938964844e+02, 3.113500061035156e+02, 3.115499877929688e+02, 3.1175e+02, 3.119500122070312e+02, 3.121499938964844e+02, 3.123500061035156e+02, 3.125499877929688e+02, 3.1275e+02, 3.129500122070312e+02, 3.131499938964844e+02] diff --git a/Buildings/Resources/ReferenceResults/Dymola/Buildings_Fluid_Dehumidifiers_Desiccant_Examples_ElectricCoilSpeedControlled.txt b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Fluid_Dehumidifiers_Desiccant_Examples_ElectricCoilSpeedControlled.txt new file mode 100644 index 00000000000..d2cf2de48cc --- /dev/null +++ b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Fluid_Dehumidifiers_Desiccant_Examples_ElectricCoilSpeedControlled.txt @@ -0,0 +1,19 @@ +last-generated=2024-04-11 +statistics-initialization= +{ + "nonlinear": "0, 1", + "numerical Jacobians": "0" +} +statistics-simulation= +{ + "linear": " ", + "nonlinear": "1", + "number of continuous time states": "12", + "numerical Jacobians": "0" +} +time=[0e+00, 1.2e+03] +uSpe.y=[1e+00, 9.900000095367432e-01, 9.800000190734863e-01, 9.700000286102295e-01, 9.599999785423279e-01, 9.49999988079071e-01, 9.399999976158142e-01, 9.300000071525574e-01, 9.200000166893005e-01, 9.100000262260437e-01, 8.999999761581421e-01, 8.899999856948853e-01, 8.799999952316284e-01, 8.700000047683716e-01, 8.600000143051147e-01, 8.500000238418579e-01, 8.399999737739563e-01, 8.299999833106995e-01, 8.199999928474426e-01, 8.100000023841858e-01, 8.00000011920929e-01, 7.900000214576721e-01, 7.799999713897705e-01, 7.699999809265137e-01, 7.599999904632568e-01, 7.5e-01, 7.400000095367432e-01, 7.300000190734863e-01, 7.200000286102295e-01, 7.099999785423279e-01, 6.99999988079071e-01, 6.899999976158142e-01, 6.800000071525574e-01, 6.700000166893005e-01, 6.600000262260437e-01, 6.499999761581421e-01, 6.399999856948853e-01, 6.299999952316284e-01, 6.200000047683716e-01, 6.100000143051147e-01, 6.000000238418579e-01, 5.899999737739563e-01, 5.799999833106995e-01, 5.699999928474426e-01, 5.600000023841858e-01, 5.50000011920929e-01, 5.400000214576721e-01, 5.299999713897705e-01, 5.199999809265137e-01, 5.099999904632568e-01, 5e-01, 4.900000095367432e-01, 4.799999892711639e-01, 4.699999988079071e-01, 4.600000083446503e-01, 4.49999988079071e-01, 4.399999976158141e-01, 4.300000071525575e-01, 4.199999868869781e-01, 4.099999964237213e-01, 4.000000059604645e-01, 3.899999856948853e-01, 3.799999952316284e-01, 3.700000047683716e-01, 3.600000143051147e-01, 3.499999940395355e-01, 3.400000035762787e-01, 3.300000131130219e-01, 3.199999928474425e-01, 3.100000023841859e-01, 3.00000011920929e-01, 2.899999916553497e-01, 2.800000011920929e-01, 2.700000107288361e-01, 2.599999904632568e-01, 2.5e-01, 2.39999994635582e-01, 2.300000041723251e-01, 2.199999988079071e-01, 2.099999934434891e-01, 2.000000029802322e-01, 1.899999976158141e-01, 1.800000071525575e-01, 1.700000017881393e-01, 1.599999964237213e-01, 1.500000059604645e-01, 1.400000005960464e-01, 1.299999952316284e-01, 1.19999997317791e-01, 1.099999994039536e-01, 1.000000014901161e-01, 9.000000357627869e-02, 7.999999821186066e-02, 7.000000029802322e-02, 5.999999865889549e-02, 5.000000074505806e-02, 3.999999910593033e-02, 2.999999932944775e-02, 1.999999955296516e-02, 9.999999776482582e-03, 0e+00] +senX_w_ProLea.X=[9.999999776482582e-03, 1.215784717351198e-02, 1.296919956803322e-02, 1.326518971472979e-02, 1.340347435325384e-02, 1.349232625216246e-02, 1.356502994894981e-02, 1.363120600581169e-02, 1.369264163076878e-02, 1.375065930187702e-02, 1.380633097141981e-02, 1.385993976145983e-02, 1.391159556806087e-02, 1.396146137267351e-02, 1.40097551047802e-02, 1.405670493841171e-02, 1.41025185585022e-02, 1.4147381298244e-02, 1.41914701089263e-02, 1.423498895019293e-02, 1.427812036126852e-02, 1.432107295840979e-02, 1.43640423193574e-02, 1.440722867846489e-02, 1.445082388818264e-02, 1.449502352625132e-02, 1.454002130776644e-02, 1.458601467311382e-02, 1.463319733738899e-02, 1.468176487833261e-02, 1.473191566765308e-02, 1.478384248912334e-02, 1.483774278312922e-02, 1.489381305873394e-02, 1.495224703103304e-02, 1.501324214041233e-02, 1.507699303328991e-02, 1.514369621872902e-02, 1.521354727447033e-02, 1.528674084693193e-02, 1.536347344517708e-02, 1.544394064694643e-02, 1.552833802998066e-02, 1.561686210334301e-02, 1.570970751345158e-02, 1.580706983804703e-02, 1.590914465487003e-02, 1.601612940430641e-02, 1.612821966409683e-02, 1.624560728669167e-02, 1.636849343776703e-02, 1.650937274098396e-02, 1.667108573019505e-02, 1.684248261153698e-02, 1.702031493186951e-02, 1.720360480248928e-02, 1.739193685352803e-02, 1.758561842143535e-02, 1.778466813266277e-02, 1.798910461366177e-02, 1.819891668856144e-02, 1.84145625680685e-02, 1.863585039973259e-02, 1.886297389864922e-02, 1.909621991217136e-02, 1.933541148900986e-02, 1.958099752664566e-02, 1.983287744224072e-02, 2.009112946689129e-02, 2.035609073936939e-02, 2.06275824457407e-02, 2.354485541582108e-02, 2.456112578511238e-02, 2.486845292150974e-02, 2.496080473065376e-02, 2.498908340930939e-02, 2.499695681035519e-02, 2.499880269169807e-02, 2.499939501285553e-02, 2.499949373304844e-02, 2.499959245324135e-02, 2.499972470104694e-02, 2.49998364597559e-02, 2.49999426305294e-02, 2.500000037252903e-02, 2.500003576278687e-02, 2.500002458691597e-02, 2.500000968575478e-02, 2.499999850988388e-02, 2.499999664723873e-02, 2.499999664723873e-02, 2.499999850988388e-02, 2.500000223517418e-02, 2.500000409781933e-02, 2.500000409781933e-02, 2.500000409781933e-02, 2.500000409781933e-02, 2.500000223517418e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02] +senX_w_ProEnt.X=[9.999999776482582e-03, 2.499974891543388e-02, 2.499999850988388e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02] +deh.P=[2.6812794921875e+04, 2.8956330078125e+04, 2.88049375e+04, 2.8309484375e+04, 2.7810677734375e+04, 2.7322728515625e+04, 2.6845669921875e+04, 2.6378998046875e+04, 2.592326171875e+04, 2.5478880859375e+04, 2.50442890625e+04, 2.461810546875e+04, 2.4199138671875e+04, 2.378636328125e+04, 2.3378884765625e+04, 2.2975935546875e+04, 2.257767578125e+04, 2.2184375e+04, 2.179614453125e+04, 2.141296484375e+04, 2.103471875e+04, 2.0661205078125e+04, 2.0292107421875e+04, 1.992608203125e+04, 1.9562638671875e+04, 1.9201703125e+04, 1.8843146484375e+04, 1.8486798828125e+04, 1.813245703125e+04, 1.777990625e+04, 1.742891796875e+04, 1.7079265625e+04, 1.6730765625e+04, 1.63838662109375e+04, 1.60382861328125e+04, 1.5693513671875e+04, 1.534911328125e+04, 1.500471875e+04, 1.466001953125e+04, 1.43147119140625e+04, 1.39687021484375e+04, 1.3622044921875e+04, 1.3274798828125e+04, 1.29270283203125e+04, 1.2578810546875e+04, 1.22302373046875e+04, 1.1881416015625e+04, 1.1532498046875e+04, 1.1183505859375e+04, 1.08344130859375e+04, 1.04852333984375e+04, 1.0059416015625e+04, 9.6408173828125e+03, 9.2300244140625e+03, 8.826921875e+03, 8.431326171875e+03, 8.043073730468746e+03, 7.662536132812504e+03, 7.2902578125e+03, 6.9260751953125e+03, 6.569865234375e+03, 6.22153955078125e+03, 5.88104736328125e+03, 5.54836669921875e+03, 5.22350244140625e+03, 4.90648681640625e+03, 4.5973740234375e+03, 4.29624365234375e+03, 4.003195068359372e+03, 3.718352050781253e+03, 3.441858154296875e+03, 3.243688201904297e+01, 1.005138397216797e+01, 1.000003528594971e+01, 1e+01, 1.000000190734863e+01, 1e+01, 1e+01, 1e+01, 1e+01, 1e+01, 1e+01, 1e+01, 1e+01, 1e+01, 1e+01, 1e+01, 1e+01, 1e+01, 1e+01, 1e+01, 1e+01, 1e+01, 1e+01, 1e+01, 1e+01, 1e+01, 1e+01, 1e+01, 1e+01, 1e+01] +TProEnt.y=[3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.033500061035156e+02, 3.035499877929688e+02, 3.0375e+02, 3.039500122070312e+02, 3.041499938964844e+02, 3.043500061035156e+02, 3.045499877929688e+02, 3.0475e+02, 3.049500122070312e+02, 3.051499938964844e+02, 3.053500061035156e+02, 3.055499877929688e+02, 3.0575e+02, 3.059500122070312e+02, 3.061499938964844e+02, 3.063500061035156e+02, 3.065499877929688e+02, 3.0675e+02, 3.069500122070312e+02, 3.071499938964844e+02, 3.073500061035156e+02, 3.075499877929688e+02, 3.0775e+02, 3.079500122070312e+02, 3.081499938964844e+02, 3.083500061035156e+02, 3.085499877929688e+02, 3.0875e+02, 3.089500122070312e+02, 3.091499938964844e+02, 3.093500061035156e+02, 3.095499877929688e+02, 3.0975e+02, 3.099500122070312e+02, 3.101499938964844e+02, 3.103500061035156e+02, 3.105499877929688e+02, 3.1075e+02, 3.109500122070312e+02, 3.111499938964844e+02, 3.113500061035156e+02, 3.115499877929688e+02, 3.1175e+02, 3.119500122070312e+02, 3.121499938964844e+02, 3.123500061035156e+02, 3.125499877929688e+02, 3.1275e+02, 3.129500122070312e+02, 3.131499938964844e+02] diff --git a/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.Validation.Performance.mos b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.Validation.Performance.mos index f994d18c8e5..052623a184e 100644 --- a/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.Validation.Performance.mos +++ b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.Validation.Performance.mos @@ -1,6 +1,7 @@ compareVars := { "onDeh.y", + "uSpe.y", "TProEnt.y", "dehumPer.TProLea", "dehumPer.X_w_ProEnt", diff --git a/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Fluid.Dehumidifiers.Desiccant.Examples.ElectricCoilBypassDampers.mos b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Fluid.Dehumidifiers.Desiccant.Examples.ElectricCoilBypassDampers.mos new file mode 100644 index 00000000000..cf7994e6a5f --- /dev/null +++ b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Fluid.Dehumidifiers.Desiccant.Examples.ElectricCoilBypassDampers.mos @@ -0,0 +1,9 @@ +compareVars := + { + "uRot.y", + "uBypDamPos.y", + "senX_w_ProLea.X", + "senX_w_ProEnt.X", + "deh.P", + "TProEnt.y" + }; diff --git a/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Fluid.Dehumidifiers.Desiccant.Examples.ElectricCoilSpeedControlled.mos b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Fluid.Dehumidifiers.Desiccant.Examples.ElectricCoilSpeedControlled.mos new file mode 100644 index 00000000000..b1c058fdd42 --- /dev/null +++ b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Fluid.Dehumidifiers.Desiccant.Examples.ElectricCoilSpeedControlled.mos @@ -0,0 +1,8 @@ +compareVars := + { + "uSpe.y", + "senX_w_ProLea.X", + "senX_w_ProEnt.X", + "deh.P", + "TProEnt.y" + }; From 76546d8f47dce92cc2282bb6697c091a8fcc0114 Mon Sep 17 00:00:00 2001 From: SenHuang19 Date: Fri, 12 Apr 2024 10:10:00 -0400 Subject: [PATCH 12/16] minor format update --- .../Desiccant/BaseClasses/PartialDesiccant.mo | 38 ++++++++++------- .../Desiccant/BaseClasses/Performance.mo | 2 +- .../Desiccant/BaseClasses/performanceCurve.mo | 4 +- .../Desiccant/ElectricCoilBypassDampers.mo | 42 ++++++++++++------- .../Desiccant/ElectricCoilSpeedControlled.mo | 31 ++++++++------ .../Examples/ElectricCoilBypassDampers.mo | 21 ++++++---- .../Examples/ElectricCoilSpeedControlled.mo | 2 +- 7 files changed, 89 insertions(+), 51 deletions(-) diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo index a0b4a7fee8b..2ae807acdf1 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo @@ -115,7 +115,7 @@ protected vol(redeclare final package Medium = Medium2, massDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, final m_flow_nominal=m2_flow_nominal, - energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + final energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, V=m2_flow_nominal*tau/rho_Reg_default, nPorts=1) "Volume for the regeneration air stream" @@ -162,32 +162,43 @@ initial algorithm end for; equation - connect(dehPer.TProLea, outCon.TSet) annotation (Line(points={{-37,-76},{-12,-76}, + connect(dehPer.TProLea, outCon.TSet) + annotation (Line(points={{-37,-76},{-12,-76}, {-12,-92},{-7,-92}}, color={0,0,127})); - connect(dehPer.X_w_ProLea, outCon.X_wSet) annotation (Line(points={{-37,-80},{ + connect(dehPer.X_w_ProLea, outCon.X_wSet) + annotation (Line(points={{-37,-80},{ -14,-80},{-14,-96},{-7,-96}}, color={0,0,127})); - connect(VPro_flow.y, dehPer.VPro_flow) annotation (Line(points={{-89,-96},{-78, + connect(VPro_flow.y, dehPer.VPro_flow) + annotation (Line(points={{-89,-96},{-78, -96},{-78,-92.2},{-59,-92.2}}, color={0,0,127})); - connect(TProEnt.y, dehPer.TProEnt) annotation (Line(points={{-89,-28},{-70,-28}, + connect(TProEnt.y, dehPer.TProEnt) + annotation (Line(points={{-89,-28},{-70,-28}, {-70,-79.8},{-59,-79.8}}, color={0,0,127})); - connect(TRegEnt.y, dehPer.TRegEnt) annotation (Line(points={{-89,-44},{-84,-44}, + connect(TRegEnt.y, dehPer.TRegEnt) + annotation (Line(points={{-89,-44},{-84,-44}, {-84,-84},{-59,-84}}, color={0,0,127})); - connect(outCon.mWat_flow, gai1.u) annotation (Line(points={{15,-96},{18,-96},{ + connect(outCon.mWat_flow, gai1.u) + annotation (Line(points={{15,-96},{18,-96},{ 18,-92},{20,-92},{20,10},{2,10}}, color={0,0,127})); - connect(gai1.y, vol.mWat_flow) annotation (Line(points={{-21,10},{-40,10},{ + connect(gai1.y, vol.mWat_flow) + annotation (Line(points={{-21,10},{-40,10},{ -40,20},{-130,20},{-130,48},{-107,48}}, color={0,0,127})); connect(preHeaFlo.Q_flow, gai2.y) annotation (Line(points={{-62,40},{-21,40}}, color={0,0,127})); - connect(preHeaFlo.port, vol.heatPort) annotation (Line(points={{-82,40},{-120, + connect(preHeaFlo.port, vol.heatPort) + annotation (Line(points={{-82,40},{-120, 40},{-120,56},{-105,56}}, color={191,0,0})); - connect(gai2.u,outCon. Q_flow) annotation (Line(points={{2,40},{40,40},{40,-92}, + connect(gai2.u,outCon. Q_flow) + annotation (Line(points={{2,40},{40,40},{40,-92}, {15,-92}}, color={0,0,127})); - connect(vol.ports[1], port_b2) annotation (Line(points={{-95,66},{-144,66},{ + connect(vol.ports[1], port_b2) + annotation (Line(points={{-95,66},{-144,66},{ -144,80},{-240,80}}, color={0,127,255})); - connect(mPro_flow.y, dehPer.mPro_flow) annotation (Line(points={{-89,-114},{-48, + connect(mPro_flow.y, dehPer.mPro_flow) + annotation (Line(points={{-89,-114},{-48, -114},{-48,-95}}, color={0,0,127})); connect(outCon.port_b, port_b1) annotation (Line(points={{14,-100},{100,-100}}, color={0,127,255})); @@ -220,7 +231,7 @@ equation Text( extent={{-149,-104},{151,-144}}, textColor={0,0,255}, - textString="%name")}), Diagram( + textString="%name")}), Diagram( coordinateSystem(preserveAspectRatio=false, extent={{-240,-140},{100,100}})), Documentation(info="

      @@ -237,7 +248,6 @@ It takes two inputs: a boolean signal for dehumidification and a real signal for

      • The boolean signal determines if the dehumidifier occurs or not. -.
      • The real signal specifies the amount of sensible and latent heat exchange that occurs in the dehumidifier and can be diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Performance.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Performance.mo index ea04f6ce51b..1396f82940a 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Performance.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Performance.mo @@ -185,7 +185,7 @@ Specifically, this calculation is configured as follows.
    • - The sensible and latent heat exchange effectiveness are calculated by + The sensible and latent heat exchange effectiveness is calculated by

      etaSen = (a1 + a2 uSpe + a3 uSpe2 + ...),

      diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/performanceCurve.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/performanceCurve.mo index cc012c54013..097f34848bb 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/performanceCurve.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/performanceCurve.mo @@ -17,7 +17,9 @@ protected algorithm TProEnt_degC := Modelica.Units.Conversions.to_degC(TProEnt); - y:= a[1] + a[2]*TProEnt_degC + a[3]* X_w_ProEnt + a[4]*vPro + y:= a[1] + a[2]*TProEnt_degC + + a[3]* X_w_ProEnt + + a[4]*vPro + a[5]*TProEnt_degC*X_w_ProEnt + a[6]*TProEnt_degC*vPro + a[7]*X_w_ProEnt*vPro + a[8]*TProEnt_degC*TProEnt_degC diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilBypassDampers.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilBypassDampers.mo index 0aeac581866..c6fc18147d2 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilBypassDampers.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilBypassDampers.mo @@ -13,7 +13,7 @@ model ElectricCoilBypassDampers extent={{-280,-140},{-240,-100}}), iconTransformation(extent={{-140,-80}, {-100,-40}}))); - Modelica.Blocks.Interfaces.RealInput uBypDamPos( + Modelica.Blocks.Interfaces.RealInput uBypDamPos( final unit="1", final min=0, final max=1) @@ -40,8 +40,8 @@ model ElectricCoilBypassDampers "Process air damper" annotation (Placement(transformation( extent={{-10,-10},{10,10}},rotation=0,origin={-130,-100}))); - Modelica.Blocks.Sources.RealExpression X_w_ProEnt(final y(final unit="1")= - damPro.port_b.Xi_outflow[i1_w]) + Modelica.Blocks.Sources.RealExpression X_w_ProEnt( + final y(final unit="1") = damPro.port_b.Xi_outflow[i1_w]) "Humidity ratio of the process air entering the dehumidifier" annotation (Placement(transformation(extent={{-110,-72},{-90,-52}}))); Modelica.Blocks.Sources.Constant uni( @@ -107,33 +107,45 @@ equation connect(hea.Q_flow, PEleHea.u) annotation (Line(points={{-5,72},{-40,72},{-40,-60},{-22,-60}}, color={0,0,127})); - connect(bypDamPro.port_a, port_a1) annotation (Line(points={{-170,-120},{-180, + connect(bypDamPro.port_a, port_a1) + annotation (Line(points={{-170,-120},{-180, -120},{-180,-100},{-240,-100}}, color={0,127,255})); - connect(bypDamPro.port_b, port_b1) annotation (Line(points={{-150,-120},{-126, + connect(bypDamPro.port_b, port_b1) + annotation (Line(points={{-150,-120},{-126, -120},{-126,-138},{34,-138},{34,-100},{100,-100}}, color={0,127,255})); - connect(booleanToReal.y, PEleMot.u) annotation (Line(points={{-179,10},{-50, + connect(booleanToReal.y, PEleMot.u) + annotation (Line(points={{-179,10},{-50, 10},{-50,-32},{-22,-32}}, color={0,0,127})); connect(uni.y, sub.u1) annotation (Line(points={{-193,-20},{-168,-20}}, color={0,0,127})); - connect(uBypDamPos, bypDamPro.y) annotation (Line(points={{-260,0},{-220,0},{ + connect(uBypDamPos, bypDamPro.y) + annotation (Line(points={{-260,0},{-220,0},{ -220,-80},{-160,-80},{-160,-108}}, color={0,0,127})); - connect(sub.u2, uBypDamPos) annotation (Line(points={{-168,-32},{-180,-32},{ + connect(sub.u2, uBypDamPos) + annotation (Line(points={{-168,-32},{-180,-32},{ -180,-60},{-220,-60},{-220,0},{-260,0}}, color={0,0,127})); - connect(booleanToReal.u, uRot) annotation (Line(points={{-202,10},{-230,10},{ + connect(booleanToReal.u, uRot) + annotation (Line(points={{-202,10},{-230,10},{ -230,-120},{-260,-120}}, color={255,0,255})); - connect(dehPer.uSpe, uni.y) annotation (Line(points={{-56.2,-73},{-56.2,-6},{ + connect(dehPer.uSpe, uni.y) + annotation (Line(points={{-56.2,-73},{-56.2,-6},{ -180,-6},{-180,-20},{-193,-20}}, color={0,0,127})); - connect(outCon.port_b, port_b1) annotation (Line(points={{14,-100},{56,-100},{ + connect(outCon.port_b, port_b1) + annotation (Line(points={{14,-100},{56,-100},{ 56,-100},{100,-100}}, color={0,127,255})); - connect(damPro.y, sub.y) annotation (Line(points={{-130,-88},{-130,-26},{-144, + connect(damPro.y, sub.y) + annotation (Line(points={{-130,-88},{-130,-26},{-144, -26}}, color={0,0,127})); - connect(dehPer.onDeh, uRot) annotation (Line(points={{-59,-75.8},{-144,-75.8}, + connect(dehPer.onDeh, uRot) + annotation (Line(points={{-59,-75.8},{-144,-75.8}, {-144,-76},{-230,-76},{-230,-120},{-260,-120}}, color={255,0,255})); - connect(X_w_ProEnt.y, dehPer.X_w_ProEnt) annotation (Line(points={{-89,-62},{ + connect(X_w_ProEnt.y, dehPer.X_w_ProEnt) + annotation (Line(points={{-89,-62},{ -76,-62},{-76,-88},{-59,-88}}, color={0,0,127})); connect(damPro.port_a, port_a1) annotation (Line(points={{-140,-100},{-240,-100}}, color={0,127,255})); - connect(damPro.port_b, outCon.port_a) annotation (Line(points={{-120,-100},{ + connect(damPro.port_b, outCon.port_a) + annotation (Line(points={{-120,-100},{ -114,-100},{-114,-120},{-20,-120},{-20,-100},{-6,-100}}, color={0,127, 255})); annotation ( diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilSpeedControlled.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilSpeedControlled.mo index b60c5a1e3dc..674d6b5a0ed 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilSpeedControlled.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilSpeedControlled.mo @@ -1,6 +1,6 @@ within Buildings.Fluid.Dehumidifiers.Desiccant; model ElectricCoilSpeedControlled - "Desiccant dehumidifier with an electric heating coil and a variable speed drive" + "Desiccant dehumidifier with an electric heating coil and a variable speed wheel" extends BaseClasses.PartialDesiccant( vol(nPorts=2)); parameter Real etaHea( @@ -9,15 +9,16 @@ model ElectricCoilSpeedControlled "Heater efficiency" annotation (Dialog(group="Efficiency")); parameter Real c[:] = {1} - "Coefficients for power consumption curve for rotor, + "Coefficients for power consumption curve for the rotor, P/P_nominal = sum a_i uSpe^(i-1). The sum(a) of the elements must be equal to 1" annotation (Dialog(group="Efficiency")); - - Modelica.Blocks.Interfaces.RealInput uSpe( + Modelica.Blocks.Interfaces.RealInput uSpe( final unit="1", final min=0, - final max=1) "Wheel speed ratio" annotation (Placement(transformation( + final max=1) + "Wheel speed ratio" + annotation (Placement(transformation( extent={{-280,-20},{-240,20}}), iconTransformation(extent={{-140,-20}, {-100,20}}))); Buildings.Fluid.HeatExchangers.HeaterCooler_u hea( @@ -49,7 +50,7 @@ model ElectricCoilSpeedControlled Buildings.Fluid.FixedResistances.PressureDrop res( redeclare package Medium = Medium1, final m_flow_nominal=m1_flow_nominal, - final dp_nominal=dp1_nominal) + final dp_nominal=dp1_nominal) "Flow resistance" annotation (Placement(transformation(extent={{-200,-110},{-180,-90}}))); protected @@ -99,19 +100,25 @@ equation connect(hea.Q_flow, PEleHea.u) annotation (Line(points={{-5,72},{-48,72},{-48,-60},{-22,-60}}, color={0,0,127})); - connect(dehPer.uSpe, uSpe) annotation (Line(points={{-56.2,-73},{-56.2,0},{-260, + connect(dehPer.uSpe, uSpe) + annotation (Line(points={{-56.2,-73},{-56.2,0},{-260, 0}}, color={0,0,127})); - connect(realToBoolean.u, uSpe) annotation (Line(points={{-182,-40},{-200,-40}, + connect(realToBoolean.u, uSpe) + annotation (Line(points={{-182,-40},{-200,-40}, {-200,0},{-260,0}}, color={0,0,127})); - connect(realToBoolean.y, dehPer.onDeh) annotation (Line(points={{-159,-40},{-126, + connect(realToBoolean.y, dehPer.onDeh) + annotation (Line(points={{-159,-40},{-126, -40},{-126,-75.8},{-59,-75.8}}, color={255,0,255})); - connect(PEle.y, add3.u2) annotation (Line(points={{1,-30},{26,-30},{26,0},{58, + connect(PEle.y, add3.u2) + annotation (Line(points={{1,-30},{26,-30},{26,0},{58, 0}}, color={0,0,127})); connect(res.port_a, port_a1) annotation (Line(points={{-200,-100},{-240,-100}}, color={0,127,255})); - connect(res.port_b, outCon.port_a) annotation (Line(points={{-180,-100},{-120, + connect(res.port_b, outCon.port_a) + annotation (Line(points={{-180,-100},{-120, -100},{-120,-126},{-20,-126},{-20,-100},{-6,-100}}, color={0,127,255})); - connect(X_w_ProEnt.y, dehPer.X_w_ProEnt) annotation (Line(points={{-89,-62},{ + connect(X_w_ProEnt.y, dehPer.X_w_ProEnt) + annotation (Line(points={{-89,-62},{ -78,-62},{-78,-88},{-59,-88}}, color={0,0,127})); annotation ( defaultComponentName="deh", diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mo index 44448882f33..a9014e9600c 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mo @@ -51,7 +51,8 @@ model ElectricCoilBypassDampers vReg_nominal=2.5, perDat=perDat, QReg_flow_nominal=50000, - etaHea=0.8) "Dehumidifier" + etaHea=0.8) + "Dehumidifier" annotation (Placement(transformation(extent={{-10,-10},{10,10}}))); Buildings.Fluid.Dehumidifiers.Desiccant.Data.Default perDat "Performance data" @@ -76,23 +77,29 @@ model ElectricCoilBypassDampers "Humidity sensor of the process air leaving the dehumidifier" annotation (Placement(transformation(extent={{26,-18},{46,2}}))); equation - connect(sou_2.ports[1], deh.port_a2) annotation (Line(points={{40,50},{18,50}, + connect(sou_2.ports[1], deh.port_a2) + annotation (Line(points={{40,50},{18,50}, {18,8},{10,8}}, color={0,127,255})); - connect(sin_2.ports[1], deh.port_b2) annotation (Line(points={{-40,50},{-20,50}, + connect(sin_2.ports[1], deh.port_b2) + annotation (Line(points={{-40,50},{-20,50}, {-20,8},{-10,8}}, color={0,127,255})); - connect(TProEnt.y, sou_1.T_in) annotation (Line(points={{-77,-60},{-68,-60},{-68, + connect(TProEnt.y, sou_1.T_in) + annotation (Line(points={{-77,-60},{-68,-60},{-68, -26},{-62,-26}}, color={0,0,127})); - connect(uBypDamPos.y, deh.uBypDamPos) annotation (Line(points={{-69,30},{-22,30}, + connect(uBypDamPos.y, deh.uBypDamPos) + annotation (Line(points={{-69,30},{-22,30}, {-22,0},{-12,0}}, color={0,0,127})); connect(uRot.y, deh.uRot) annotation (Line(points={{-69,-6},{-12,-6}}, color={255,0,255})); connect(deh.port_b1, senX_w_ProLea.port_a) annotation (Line(points={{10,-8},{26,-8}}, color={0,127,255})); - connect(senX_w_ProLea.port_b, sin_1.ports[1]) annotation (Line(points={{46,-8}, + connect(senX_w_ProLea.port_b, sin_1.ports[1]) + annotation (Line(points={{46,-8}, {60,-8},{60,-40},{70,-40}}, color={0,127,255})); connect(sou_1.ports[1], senX_w_ProEnt.port_a) annotation (Line(points={{-40,-30},{-34,-30}}, color={0,127,255})); - connect(senX_w_ProEnt.port_b, deh.port_a1) annotation (Line(points={{-14,-30}, + connect(senX_w_ProEnt.port_b, deh.port_a1) + annotation (Line(points={{-14,-30}, {-6,-30},{-6,-16},{-16,-16},{-16,-8},{-10,-8}}, color={0,127,255})); annotation (experiment(Tolerance=1e-6, StopTime=1200), __Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mos" diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mo index 140250605fd..92614a5f517 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mo @@ -109,7 +109,7 @@ The input signals are configured as follows:
      • The wheel speed ratio uSpe changes from -1 to 0 from 0 second +1 to 0 from 0 seconds to 1200 seconds.
      • From a4facd11b8d4dbe1b392376eb0fc12c17a46473a Mon Sep 17 00:00:00 2001 From: SenHuang19 Date: Fri, 12 Apr 2024 10:19:12 -0400 Subject: [PATCH 13/16] remove obsolete dataset --- ..._Examples_ElectricCoilVariableSpeedFan.txt | 21 ------------------- 1 file changed, 21 deletions(-) delete mode 100644 Buildings/Resources/ReferenceResults/Dymola/Buildings_Fluid_Dehumidifiers_Desiccant_Examples_ElectricCoilVariableSpeedFan.txt diff --git a/Buildings/Resources/ReferenceResults/Dymola/Buildings_Fluid_Dehumidifiers_Desiccant_Examples_ElectricCoilVariableSpeedFan.txt b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Fluid_Dehumidifiers_Desiccant_Examples_ElectricCoilVariableSpeedFan.txt deleted file mode 100644 index b4392d3cff2..00000000000 --- a/Buildings/Resources/ReferenceResults/Dymola/Buildings_Fluid_Dehumidifiers_Desiccant_Examples_ElectricCoilVariableSpeedFan.txt +++ /dev/null @@ -1,21 +0,0 @@ -last-generated=2024-03-31 -statistics-initialization= -{ - "linear": "0", - "nonlinear": "0, 0, 1", - "numerical Jacobians": "0" -} -statistics-simulation= -{ - "linear": "0, 0", - "nonlinear": "0, 0, 1", - "number of continuous time states": "16", - "numerical Jacobians": "0" -} -time=[0e+00, 1.2e+03] -uRot.y=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00] -uBypDamPos.y=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01] -senX_w_ProLea.X=[9.999999776482582e-03, 1.695675030350685e-02, 2.012161165475845e-02, 2.200570143759251e-02, 2.440203353762627e-02, 2.36340556293726e-02, 2.366256155073643e-02, 2.431556582450867e-02, 2.434663102030754e-02, 2.497603744268417e-02, 2.491542510688305e-02, 2.499424107372761e-02, 2.500543370842934e-02, 2.499476261436939e-02, 2.499369531869888e-02, 2.499472908675671e-02, 2.499765157699585e-02, 2.499828301370144e-02, 2.499998733401299e-02, 2.500013075768948e-02, 2.500027604401112e-02, 2.500043623149395e-02, 2.500061132013798e-02, 2.500054426491261e-02, 2.500046789646149e-02, 2.500039152801037e-02, 1.581353880465031e-02, 1.116717606782913e-02, 9.149964898824687e-03, 8.282696828246117e-03, 7.911372929811478e-03, 7.752117235213518e-03, 7.684178184717894e-03, 7.654198445379734e-03, 7.642275653779507e-03, 7.638148963451385e-03, 7.636470720171928e-03, 7.635442540049553e-03, 7.634955924004316e-03, 7.634975947439671e-03, 7.635203190147877e-03, 7.635429501533508e-03, 7.635604590177536e-03, 7.635648362338543e-03, 7.635623216629028e-03, 7.635544054210186e-03, 7.635484449565411e-03, 7.63543089851737e-03, 7.635423913598061e-03, 7.635431829839945e-03, 7.635447196662426e-03, 7.520725019276142e-03, 7.219395134598017e-03, 7.223067805171013e-03, 8.249096572399139e-03, 1.030216831713915e-02, 1.17559749633074e-02, 1.175752934068436e-02, 1.280221529304981e-02, 1.320736482739449e-02, 1.416365429759026e-02, 1.416550204157829e-02, 1.388467848300934e-02, 1.434815302491188e-02, 1.444668881595135e-02, 1.446073967963457e-02, 1.457330677658319e-02, 1.479326281696558e-02, 1.497810427099466e-02, 1.497143693268299e-02, 1.488062366843224e-02, 1.479077432304621e-02, 1.476515457034111e-02, 1.483353786170483e-02, 1.489743031561375e-02, 1.493552792817354e-02, 1.769312098622322e-02, 2.074839547276497e-02, 2.26336345076561e-02, 2.369706705212593e-02, 2.428475767374039e-02, 2.460769563913346e-02, 2.478480711579323e-02, 2.488197013735771e-02, 2.493525668978691e-02, 2.496448718011379e-02, 2.498051710426807e-02, 2.498931251466274e-02, 2.499415911734104e-02, 2.499682269990444e-02, 2.499826066195965e-02, 2.499900572001934e-02, 2.499926276504993e-02, 2.499946020543575e-02, 2.499946765601635e-02, 2.499958872795105e-02, 2.499964088201523e-02, 2.499974332749844e-02, 2.499974146485329e-02, 2.499975450336933e-02, 2.499978058040142e-02] -senX_w_ProEnt.X=[9.999999776482582e-03, 2.499450743198395e-02, 2.50199344009161e-02, 2.506954409182072e-02, 2.493766136467457e-02, 2.53328699618578e-02, 2.524032443761826e-02, 2.533537335693836e-02, 2.560937032103539e-02, 2.496444433927536e-02, 2.50585526227951e-02, 2.498394250869751e-02, 2.498334459960461e-02, 2.499863877892494e-02, 2.500226907432079e-02, 2.500311285257339e-02, 2.500147372484207e-02, 2.500166185200214e-02, 2.500020898878574e-02, 2.500054985284805e-02, 2.500065043568611e-02, 2.500048838555813e-02, 2.500006556510925e-02, 2.500003948807716e-02, 2.500003203749657e-02, 2.500002458691597e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02, 2.500000037252903e-02] -deh.P=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 2.4327498046875e+04, 2.30988828125e+04, 2.2152943359375e+04, 2.1714037109375e+04, 2.1525697265625e+04, 2.144544921875e+04, 2.1411119140625e+04, 2.1396095703125e+04, 2.1390193359375e+04, 2.138809765625e+04, 2.1387216796875e+04, 2.1386693359375e+04, 2.138648046875e+04, 2.13865078125e+04, 2.1386615234375e+04, 2.1386712890625e+04, 2.1386787109375e+04, 2.1386806640625e+04, 2.1386798828125e+04, 2.138676953125e+04, 2.1386744140625e+04, 2.1386720703125e+04, 2.138671484375e+04, 2.138671875e+04, 2.1386724609375e+04, 1.47009521484375e+04, 6.839826171875e+03, 3.28977734375e+03, 1.607995239257812e+03, 9.574794311523438e+02, 8.109692382812503e+02, 8.40588195800781e+02, 8.629204711914062e+02, 8.743788452148438e+02, 8.7749755859375e+02, 8.75682861328125e+02, 8.71331298828125e+02, 8.658282470703125e+02, 8.599192504882812e+02, 8.539918212890625e+02, 8.482340087890625e+02, 8.427504272460938e+02, 8.37567626953125e+02, 8.3268603515625e+02, 8.280914916992188e+02, 8.237632446289062e+02, 8.19679443359375e+02, 8.158156127929688e+02, 8.12153564453125e+02, 8.086771240234375e+02, 1.12000373840332e+02, 1.574497669935226e-01, 2.936035743914545e-04, 4.390326921566157e-06, 3.48580397258047e-06, 1.001944083256835e-09, 6.406932762104806e-09, 4.769017958317079e-10, 5.465698726947466e-11, 2.463310805334018e-12, 1.541063148402175e-13, 9.930172969443898e-15, 3.099128158962072e-12, 3.948524992213043e-13, 2.116453578148922e-13, 4.763901404435111e-13, 3.052746423704011e-12, 8.267751175523863e-13, 8.06035576825237e-13, 9.932352385217183e-14, 3.059157321314314e-15, 1.308542660214069e-15, 6.907582145165847e-14, 1.50790146970399e-13, 1.702854843894583e-13] -TProEnt.y=[3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.031499938964844e+02, 3.033500061035156e+02, 3.035499877929688e+02, 3.0375e+02, 3.039500122070312e+02, 3.041499938964844e+02, 3.043500061035156e+02, 3.045499877929688e+02, 3.0475e+02, 3.049500122070312e+02, 3.051499938964844e+02, 3.053500061035156e+02, 3.055499877929688e+02, 3.0575e+02, 3.059500122070312e+02, 3.061499938964844e+02, 3.063500061035156e+02, 3.065499877929688e+02, 3.0675e+02, 3.069500122070312e+02, 3.071499938964844e+02, 3.073500061035156e+02, 3.075499877929688e+02, 3.0775e+02, 3.079500122070312e+02, 3.081499938964844e+02, 3.083500061035156e+02, 3.085499877929688e+02, 3.0875e+02, 3.089500122070312e+02, 3.091499938964844e+02, 3.093500061035156e+02, 3.095499877929688e+02, 3.0975e+02, 3.099500122070312e+02, 3.101499938964844e+02, 3.103500061035156e+02, 3.105499877929688e+02, 3.1075e+02, 3.109500122070312e+02, 3.111499938964844e+02, 3.113500061035156e+02, 3.115499877929688e+02, 3.1175e+02, 3.119500122070312e+02, 3.121499938964844e+02, 3.123500061035156e+02, 3.125499877929688e+02, 3.1275e+02, 3.129500122070312e+02, 3.131499938964844e+02] From 4e5ee78ee2f9bf8296247f8e396ead816bc97544 Mon Sep 17 00:00:00 2001 From: SenHuang19 Date: Mon, 15 Apr 2024 13:42:28 -0400 Subject: [PATCH 14/16] format update --- .../Desiccant/BaseClasses/PartialDesiccant.mo | 6 +- .../Desiccant/BaseClasses/Performance.mo | 245 +++++++++--------- .../BaseClasses/Validation/Performance.mo | 6 +- .../Desiccant/BaseClasses/performanceCurve.mo | 2 +- .../Data/{Default.mo => EnergyPlus.mo} | 2 +- .../Desiccant/Data/package.order | 2 +- .../Desiccant/ElectricCoilBypassDampers.mo | 3 +- .../Desiccant/ElectricCoilSpeedControlled.mo | 6 +- .../Examples/ElectricCoilBypassDampers.mo | 4 +- .../Examples/ElectricCoilSpeedControlled.mo | 4 +- 10 files changed, 137 insertions(+), 143 deletions(-) rename Buildings/Fluid/Dehumidifiers/Desiccant/Data/{Default.mo => EnergyPlus.mo} (99%) diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo index 2ae807acdf1..534ed54c673 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo @@ -132,11 +132,11 @@ protected "Prescribed heat flow" annotation (Placement(transformation(extent={{-62,50},{-82,30}}))); Modelica.Blocks.Sources.RealExpression mPro_flow( - final y(final unit="kg/s")= outCon.port_a.m_flow) - "Process air mass flow rate" + final y(final unit="kg/s")= outCon.port_a.m_flow) + "Process air mass flow rate" annotation (Placement(transformation(extent={{-110,-124},{-90,-104}}))); parameter Integer i1_w(min=1, fixed=false) - "Index for water substance"; + "Index for water substance"; parameter Medium2.ThermodynamicState sta_Reg_default=Medium2.setState_pTX( T=Medium2.T_default, p=Medium2.p_default, diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Performance.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Performance.mo index 1396f82940a..e66dcf1abbb 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Performance.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Performance.mo @@ -1,7 +1,7 @@ within Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses; model Performance "Model calculates the outlet condition of the process air through a desiccant dehumidifier" - extends Modelica.Blocks.Icons.Block; + extends Modelica.Blocks.Icons.Block; parameter Modelica.Units.SI.Velocity vPro_nominal "Nominal velocity of the process air"; @@ -22,10 +22,10 @@ model Performance "Coefficients for calculating the latent heat exchange effectiveness"; final parameter Real uSpe_min = 0.3 "Minimum allowable wheel speed ratio"; - Modelica.Blocks.Interfaces.BooleanInput onDeh + Modelica.Blocks.Interfaces.BooleanInput uRot "Set to true to enable the dehumidification process" annotation (Placement( - transformation(extent={{-124,68},{-100,92}}), iconTransformation(extent= - {{-120,72},{-100,92}}))); + transformation(extent={{-124,68},{-100,92}}), iconTransformation(extent + ={{-120,72},{-100,92}}))); Modelica.Blocks.Interfaces.RealInput TProEnt( final unit="K") "Temperature of the process air entering the dehumidifier" @@ -41,17 +41,17 @@ model Performance final unit="m3/s") "Volumetric flow rate of the process air" annotation (Placement(transformation( - extent={{-124,-92},{-100,-68}}), - iconTransformation(extent={{-120,-92},{-100,-72}}))); + extent={{-124,-92},{-100,-68}}), + iconTransformation(extent={{-120,-92},{-100,-72}}))); Modelica.Blocks.Interfaces.RealInput mPro_flow( - final unit="kg/s") "Mass flow rate of the process air" - annotation (Placement(transformation( - extent={{-12,-12},{12,12}}, - rotation=90, - origin={0,-112}), iconTransformation( - extent={{-10,-10},{10,10}}, - rotation=90, - origin={0,-110}))); + final unit="kg/s") "Mass flow rate of the process air" + annotation (Placement(transformation( + extent={{-12,-12},{12,12}}, + rotation=90, + origin={0,-112}), iconTransformation( + extent={{-10,-10},{10,10}}, + rotation=90, + origin={0,-110}))); Modelica.Blocks.Interfaces.RealInput TRegEnt( final unit="K") "Temperature of the regeneration air entering the dehumidifier" annotation ( @@ -97,7 +97,7 @@ protected "Latent heat exchange effectiveness"; equation - if onDeh then + if uRot then assert(uSpe >= uSpe_min, "In " + getInstanceName() + ": the wheel speed ratio should not be lower than 0.3.", @@ -170,119 +170,119 @@ the inlet condition of the process air. Specifically, this calculation is configured as follows.

          -
        • - If the dehumidification signal onDeh=true, -
            -
          • - The inlet condition, in terms of temperature and humidity ratio, is compared - to the corresponding limits in the performance curves of the desiccant dehumidifier. - Those performance curves are defined in - Buildings.Fluid.Dehumidifiers.Desiccant.Data.Generic. -
              -
            • - If the inlet condition is beyond the limits, the calculation is terminated and an error is generated. -
            • -
            -
          • -
          • - The sensible and latent heat exchange effectiveness is calculated by -

            - etaSen = (a1 + a2 uSpe + a3 uSpe2 + ...), -

            -

            - etaLat = (b1 + b2 uSpe + b3 uSpe2 + ...), -

            - where the a[:] and b[:] are the coefficients obtained based on - ASHRAE Handbook—HVAC Systems & Equipment (Figure 7, Chapter 26), - uSpe is the wheel speed ratio. -
          • -
          • - The velocity of the process air is calculated by -

            - vPro = VPro_flow/VPro_flow_nominal*vPro_nominal -

            - where VPro_flow is the volumetric flow rate of the process air, - VPro_flow_nominal is the nominal volumetric flow rate of the process air, - vPro_nominal is the nominal velocity of the process air. -
            - Then, the volumetric flow rate of the regeneration air is calculated by -

            - VReg_flow = f(TProEnt,X_w_ProEnt,vPro,coevReg)/vReg_nominal*VReg_flow_nominal*uSpe -

            - where f(.) is defined in - Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.performanceCurve, - coevReg are coefficients, as defined in - Buildings.Fluid.Dehumidifiers.Desiccant.Data.Generic, - TProEnt and X_w_ProEnt are the temperature and the humidity ratio of the process air entering the dehumidifier, - respectively. -
              -
            • - If VReg_flow>VReg_flow_nominal, the calculation is terminated and an error is generated. -
            • -
            -
          • -
          • - The temperature of the process air leaving the dehumidifier, TProLea is calculated by -

            - TProLea = TProEnt + (f(TProEnt,X_w_ProEnt,vPro,coeTProLea) + 273.15 - TProEnt)*etaSen, -

            - where coeTProLea are coefficients. -
            - The humidity ratio of the process air leaving the dehumidifier, X_w_ProLea, is calculated by -

            - X_w_ProLea = X_w_ProEnt - (X_w_ProEnt - f(TProEnt,X_w_ProEnt,vPro,coeX_w_ProLea))*etaLat, -

            - where coeX_w_ProLea are coefficients. -
              -
            • - If X_w_ProLea is less than 0, - the calculation is terminated and an error is generated. -
            • -
            -
          • -
          • - The specific heat of the regeneration, CpReg is calculated by -

            - CpReg =max(0,f(TProEnt,X_w_ProEnt,vPro,coeCpReg)*uSpe), -

            - where coeCpReg are coefficients. -
            - After that, the regeneration heating output ratio, yQReg, is calculated by -

            - yQReg = CpReg*(X_w_ProEnt-X_w_ProLea)*mPro_flow*(TRegEnt_nominal - TRegEnt) / (TRegEnt_nominal - TProEnt)/ - QReg_flow_nominal, -

            - where TRegEnt_nominal and TRegEnt are the nominal temperature and the actual temperature - of the regeneration air entering the dehumidifier.QReg_flow_nominal is the nominal regeneration - heating capacity. -
              -
            • - If yQReg is larger than 1, - the calculation is terminated and an error is generated. -
            • -
            -
          • -
          -
        • +
        • +If the dehumidification signal uRot=true, +
            +
          • +The inlet condition, in terms of temperature and humidity ratio, is compared +to the corresponding limits in the performance curves of the desiccant dehumidifier. +Those performance curves are defined in +Buildings.Fluid.Dehumidifiers.Desiccant.Data.Generic. +
              +
            • +If the inlet condition is beyond the limits, the calculation is terminated and an error is generated. +
            • +
            +
          • +
          • +The sensible and latent heat exchange effectiveness is calculated by +

            +etaSen = (a1 + a2 uSpe + a3 uSpe2 + ...), +

            +

            +etaLat = (b1 + b2 uSpe + b3 uSpe2 + ...), +

            +where the a[:] and b[:] are the coefficients obtained based on +ASHRAE Handbook—HVAC Systems & Equipment (Figure 7, Chapter 26), +uSpe is the wheel speed ratio. +
          • +
          • +The velocity of the process air is calculated by +

            +vPro = VPro_flow/VPro_flow_nominal*vPro_nominal +

            +where VPro_flow is the volumetric flow rate of the process air, +VPro_flow_nominal is the nominal volumetric flow rate of the process air, +vPro_nominal is the nominal velocity of the process air. +
            +Then, the volumetric flow rate of the regeneration air is calculated by +

            +VReg_flow = f(TProEnt,X_w_ProEnt,vPro,coevReg)/vReg_nominal*VReg_flow_nominal*uSpe +

            +where f(.) is defined in +Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.performanceCurve, +coevReg are coefficients, as defined in +Buildings.Fluid.Dehumidifiers.Desiccant.Data.Generic, +TProEnt and X_w_ProEnt are the temperature and the humidity ratio of the process air entering the dehumidifier, +respectively. +
              +
            • +If VReg_flow>VReg_flow_nominal, the calculation is terminated and an error is generated. +
            • +
            +
          • +
          • +The temperature of the process air leaving the dehumidifier, TProLea is calculated by +

            +TProLea = TProEnt + (f(TProEnt,X_w_ProEnt,vPro,coeTProLea) + 273.15 - TProEnt)*etaSen, +

            +where coeTProLea are coefficients. +
            +The humidity ratio of the process air leaving the dehumidifier, X_w_ProLea, is calculated by +

            +X_w_ProLea = X_w_ProEnt - (X_w_ProEnt - f(TProEnt,X_w_ProEnt,vPro,coeX_w_ProLea))*etaLat, +

            +where coeX_w_ProLea are coefficients. +
              +
            • +If X_w_ProLea is less than 0, +the calculation is terminated and an error is generated. +
            • +
            +
          • +
          • +The specific heat of the regeneration, CpReg is calculated by +

            +CpReg =max(0,f(TProEnt,X_w_ProEnt,vPro,coeCpReg)*uSpe), +

            +where coeCpReg are coefficients. +
            +After that, the regeneration heating output ratio, yQReg, is calculated by +

            +yQReg = CpReg*(X_w_ProEnt-X_w_ProLea)*mPro_flow*(TRegEnt_nominal - TRegEnt) / (TRegEnt_nominal - TProEnt)/ +QReg_flow_nominal, +

            +where TRegEnt_nominal and TRegEnt are the nominal temperature and the actual temperature +of the regeneration air entering the dehumidifier.QReg_flow_nominal is the nominal regeneration +heating capacity. +
              +
            • +If yQReg is larger than 1, +the calculation is terminated and an error is generated. +
            • +
            +
          • +
          +
        • -
        • - Otherwise, -
            -
          • - The outlet condition of the process air is the same as the inlet condition of the process air. -
          • -
          • - VReg_flow and yQReg are set to be 0. -
          • -
          -
        • +
        • +Otherwise, +
            +
          • +The outlet condition of the process air is the same as the inlet condition of the process air. +
          • +
          • +VReg_flow and yQReg are set to be 0. +
          • +
          +

        References

        • -EnergyPlus v22.1.0 Engineering Reference +U.S. Department of Energy, "EnergyPlus Version 22.1.0 Documentation: Engineering Reference".
        • @@ -292,9 +292,6 @@ ASHRAE Handbook—HVAC Systems & Equipment Chapter 26 ", revisions="
            -
          • April 10, 2024, by Sen Huang:
            Added wheel speed ratio as an input.
          • -
          -
          • March 1, 2024, by Sen Huang:
            First implementation.
          ")); diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mo index a0d33469a66..4c1893771a2 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mo @@ -14,7 +14,7 @@ model Performance Modelica.Blocks.Sources.BooleanStep onDeh(startTime=50, startValue=false) "Dehumidification signal" annotation (Placement(transformation(extent={{-80,70},{-60,90}}))); - Buildings.Fluid.Dehumidifiers.Desiccant.Data.Default perDat + Buildings.Fluid.Dehumidifiers.Desiccant.Data.EnergyPlus perDat "Performance data" annotation (Placement(transformation(extent={{60,64},{80,84}}))); Modelica.Blocks.Sources.Ramp TProEnt( @@ -51,8 +51,8 @@ model Performance startTime=50) "Wheel speed ratio" annotation (Placement(transformation(extent={{-40,70},{-20,90}}))); equation - connect(onDeh.y, dehumPer.onDeh) annotation (Line(points={{-59,80},{-44,80},{ - -44,8.2},{-11,8.2}}, color={255,0,255})); + connect(onDeh.y, dehumPer.uRot) annotation (Line(points={{-59,80},{-44,80},{-44, + 8.2},{-11,8.2}}, color={255,0,255})); connect(TProEnt.y, dehumPer.TProEnt) annotation (Line(points={{-59,40},{-20, 40},{-20,4.2},{-11,4.2}}, color={0,0,127})); connect(TRegEnt.y, dehumPer.TRegEnt) diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/performanceCurve.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/performanceCurve.mo index 097f34848bb..f85a31a6bcb 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/performanceCurve.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/performanceCurve.mo @@ -58,7 +58,7 @@ where TProEnt is the temperature of the process air entering t ", revisions=" diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/Data/Default.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/Data/EnergyPlus.mo similarity index 99% rename from Buildings/Fluid/Dehumidifiers/Desiccant/Data/Default.mo rename to Buildings/Fluid/Dehumidifiers/Desiccant/Data/EnergyPlus.mo index 71afde3f43d..9678e638f41 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/Data/Default.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/Data/EnergyPlus.mo @@ -1,5 +1,5 @@ within Buildings.Fluid.Dehumidifiers.Desiccant.Data; -record Default = +record EnergyPlus = Buildings.Fluid.Dehumidifiers.Desiccant.Data.Generic ( TRegEnt_nominal = 273.15 + 121, TProEnt_min = 273.15 + 1.67, diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/Data/package.order b/Buildings/Fluid/Dehumidifiers/Desiccant/Data/package.order index bcb28246de8..c2cd81c38a6 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/Data/package.order +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/Data/package.order @@ -1,2 +1,2 @@ -Default +EnergyPlus Generic diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilBypassDampers.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilBypassDampers.mo index c6fc18147d2..f8cbe41d16c 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilBypassDampers.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilBypassDampers.mo @@ -136,8 +136,7 @@ equation connect(damPro.y, sub.y) annotation (Line(points={{-130,-88},{-130,-26},{-144, -26}}, color={0,0,127})); - connect(dehPer.onDeh, uRot) - annotation (Line(points={{-59,-75.8},{-144,-75.8}, + connect(dehPer.uRot, uRot) annotation (Line(points={{-59,-75.8},{-144,-75.8}, {-144,-76},{-230,-76},{-230,-120},{-260,-120}}, color={255,0,255})); connect(X_w_ProEnt.y, dehPer.X_w_ProEnt) annotation (Line(points={{-89,-62},{ diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilSpeedControlled.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilSpeedControlled.mo index 674d6b5a0ed..e734427274a 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilSpeedControlled.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilSpeedControlled.mo @@ -9,8 +9,7 @@ model ElectricCoilSpeedControlled "Heater efficiency" annotation (Dialog(group="Efficiency")); parameter Real c[:] = {1} - "Coefficients for power consumption curve for the rotor, - P/P_nominal = sum a_i uSpe^(i-1). The sum(a) of the elements must be equal to 1" + "Coefficients for power consumption curve for the rotor" annotation (Dialog(group="Efficiency")); Modelica.Blocks.Interfaces.RealInput uSpe( @@ -106,8 +105,7 @@ equation connect(realToBoolean.u, uSpe) annotation (Line(points={{-182,-40},{-200,-40}, {-200,0},{-260,0}}, color={0,0,127})); - connect(realToBoolean.y, dehPer.onDeh) - annotation (Line(points={{-159,-40},{-126, + connect(realToBoolean.y, dehPer.uRot) annotation (Line(points={{-159,-40},{-126, -40},{-126,-75.8},{-59,-75.8}}, color={255,0,255})); connect(PEle.y, add3.u2) annotation (Line(points={{1,-30},{26,-30},{26,0},{58, diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mo index a9014e9600c..909a255b522 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mo @@ -54,8 +54,8 @@ model ElectricCoilBypassDampers etaHea=0.8) "Dehumidifier" annotation (Placement(transformation(extent={{-10,-10},{10,10}}))); - Buildings.Fluid.Dehumidifiers.Desiccant.Data.Default perDat - "Performance data" + Buildings.Fluid.Dehumidifiers.Desiccant.Data.EnergyPlus perDat + "Performance data" annotation (Placement(transformation(extent={{20,72},{40,92}}))); Modelica.Blocks.Sources.Step uBypDamPos( height=0.5, diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mo index 92614a5f517..081aedbd97e 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mo @@ -54,8 +54,8 @@ model ElectricCoilSpeedControlled QReg_flow_nominal=50000, etaHea=0.8) "Dehumidifier" annotation (Placement(transformation(extent={{-10,-10},{10,10}}))); - Buildings.Fluid.Dehumidifiers.Desiccant.Data.Default perDat - "Performance data" + Buildings.Fluid.Dehumidifiers.Desiccant.Data.EnergyPlus perDat + "Performance data" annotation (Placement(transformation(extent={{20,72},{40,92}}))); Modelica.Blocks.Sources.Ramp uSpe( height=-1, From 6f01631015e41d10342739a174152b3717af1754 Mon Sep 17 00:00:00 2001 From: SenHuang19 Date: Mon, 15 Apr 2024 13:42:55 -0400 Subject: [PATCH 15/16] add svg figures --- .../Desiccant/BaseClasses/dehumidifer_schematic.svg | 1 + .../Dehumidifiers/Desiccant/BaseClasses/system_schematic_VFD.svg | 1 + .../Desiccant/BaseClasses/system_schematic_bypass.svg | 1 + 3 files changed, 3 insertions(+) create mode 100644 Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/dehumidifer_schematic.svg create mode 100644 Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/system_schematic_VFD.svg create mode 100644 Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/system_schematic_bypass.svg diff --git a/Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/dehumidifer_schematic.svg b/Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/dehumidifer_schematic.svg new file mode 100644 index 00000000000..4f98d55c8a9 --- /dev/null +++ b/Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/dehumidifer_schematic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/system_schematic_VFD.svg b/Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/system_schematic_VFD.svg new file mode 100644 index 00000000000..1ddcdb91519 --- /dev/null +++ b/Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/system_schematic_VFD.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/system_schematic_bypass.svg b/Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/system_schematic_bypass.svg new file mode 100644 index 00000000000..d54965568dc --- /dev/null +++ b/Buildings/Resources/Images/Fluid/Dehumidifiers/Desiccant/BaseClasses/system_schematic_bypass.svg @@ -0,0 +1 @@ + \ No newline at end of file From 35d9f663fb94805ac116bc53ad1857f8a39734ec Mon Sep 17 00:00:00 2001 From: SenHuang19 Date: Tue, 16 Apr 2024 09:32:01 -0400 Subject: [PATCH 16/16] format update --- .../Desiccant/BaseClasses/PartialDesiccant.mo | 92 +++++----- .../Desiccant/BaseClasses/Performance.mo | 158 +++++++++--------- .../BaseClasses/Validation/Performance.mo | 34 ++-- .../Desiccant/BaseClasses/performanceCurve.mo | 31 ++-- .../Desiccant/Data/EnergyPlus.mo | 13 +- .../Dehumidifiers/Desiccant/Data/Generic.mo | 4 +- .../Desiccant/ElectricCoilBypassDampers.mo | 71 ++++---- .../Desiccant/ElectricCoilSpeedControlled.mo | 49 +++--- .../Examples/ElectricCoilBypassDampers.mo | 31 ++-- .../Examples/ElectricCoilSpeedControlled.mo | 29 ++-- 10 files changed, 268 insertions(+), 244 deletions(-) diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo index 534ed54c673..90cb163bc95 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/PartialDesiccant.mo @@ -49,7 +49,7 @@ partial model PartialDesiccant final unit="W") "Electric power consumption" annotation (Placement(transformation(extent={{100,-10},{120,10}}), - iconTransformation(extent={{100,-10},{120,10}}))); + iconTransformation(extent={{100,-10},{120,10}}))); Modelica.Fluid.Interfaces.FluidPort_a port_a1( redeclare final package Medium = Medium1) "Fluid connector a1 of the supply air (positive design flow direction is from port_a1 to port_b1)" @@ -69,7 +69,7 @@ partial model PartialDesiccant redeclare final package Medium = Medium2) "Fluid connector a2 of the exhaust air (positive design flow direction is from port_a2 to port_b2)" annotation (Placement(transformation(extent={{90,70},{110,90}}), - iconTransformation(extent={{90,70},{110,90}}))); + iconTransformation(extent={{90,70},{110,90}}))); protected Buildings.Fluid.Interfaces.PrescribedOutlet outCon( @@ -88,11 +88,11 @@ protected "Calculate the performance of the dehumidifier" annotation (Placement(transformation(extent={{-58,-94},{-38,-74}}))); Modelica.Blocks.Sources.RealExpression VPro_flow( - final y(final unit="m3/s")= outCon.port_a.m_flow/Medium1.density( - state=Medium1.setState_phX( - p=port_a1.p, - h=port_a1.h_outflow, - X=port_a1.Xi_outflow))) + final y(final unit="m3/s")= outCon.port_a.m_flow/Medium1.density( + state=Medium1.setState_phX( + p=port_a1.p, + h=port_a1.h_outflow, + X=port_a1.Xi_outflow))) "Process air volume flow rate" annotation (Placement(transformation(extent={{-110,-106},{-90,-86}}))); Modelica.Blocks.Sources.RealExpression TProEnt( @@ -111,7 +111,7 @@ protected X=inStream(port_a2.Xi_outflow)))) "Temperature of the regeneration air entering the dehumidifier" annotation (Placement(transformation(extent={{-110,-54},{-90,-34}}))); - Buildings.Fluid.MixingVolumes.MixingVolumeMoistAir + Buildings.Fluid.MixingVolumes.MixingVolumeMoistAir vol(redeclare final package Medium = Medium2, massDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, final m_flow_nominal=m2_flow_nominal, @@ -119,7 +119,7 @@ protected V=m2_flow_nominal*tau/rho_Reg_default, nPorts=1) "Volume for the regeneration air stream" - annotation (Placement(transformation(extent={{-105,66},{-85,46}}))); + annotation (Placement(transformation(extent={{-105,66},{-85,46}}))); Modelica.Blocks.Math.Gain gai1( final k=-1) "Find the opposite number of the input" @@ -138,16 +138,16 @@ protected parameter Integer i1_w(min=1, fixed=false) "Index for water substance"; parameter Medium2.ThermodynamicState sta_Reg_default=Medium2.setState_pTX( - T=Medium2.T_default, - p=Medium2.p_default, - X=Medium2.X_default) + T=Medium2.T_default, + p=Medium2.p_default, + X=Medium2.X_default) "Default state of the regeneration air"; parameter Modelica.Units.SI.Density rho_Reg_default=Medium2.density(sta_Reg_default) "Default density of the regeneration air"; parameter Medium2.ThermodynamicState sta_Pro_default=Medium2.setState_pTX( - T=Medium2.T_default, - p=Medium2.p_default, - X=Medium2.X_default) + T=Medium2.T_default, + p=Medium2.p_default, + X=Medium2.X_default) "Default state of the process air"; parameter Modelica.Units.SI.Density rho_Pro_default=Medium2.density(sta_Pro_default) "Default density of the process air"; @@ -160,46 +160,42 @@ initial algorithm i1_w := i; end if; end for; - equation connect(dehPer.TProLea, outCon.TSet) annotation (Line(points={{-37,-76},{-12,-76}, - {-12,-92},{-7,-92}}, color={0,0,127})); + {-12,-92},{-7,-92}}, color={0,0,127})); connect(dehPer.X_w_ProLea, outCon.X_wSet) - annotation (Line(points={{-37,-80},{ - -14,-80},{-14,-96},{-7,-96}}, color={0,0,127})); + annotation (Line(points={{-37,-80},{-14,-80}, + {-14,-96},{-7,-96}}, color={0,0,127})); connect(VPro_flow.y, dehPer.VPro_flow) - annotation (Line(points={{-89,-96},{-78, - -96},{-78,-92.2},{-59,-92.2}}, color={0,0,127})); + annotation (Line(points={{-89,-96},{-78,-96}, + {-78,-92.2},{-59,-92.2}}, color={0,0,127})); connect(TProEnt.y, dehPer.TProEnt) annotation (Line(points={{-89,-28},{-70,-28}, - {-70,-79.8},{-59,-79.8}}, color={0,0,127})); + {-70,-79.8},{-59,-79.8}}, color={0,0,127})); connect(TRegEnt.y, dehPer.TRegEnt) annotation (Line(points={{-89,-44},{-84,-44}, - {-84,-84},{-59,-84}}, color={0,0,127})); + {-84,-84},{-59,-84}}, color={0,0,127})); connect(outCon.mWat_flow, gai1.u) - annotation (Line(points={{15,-96},{18,-96},{ - 18,-92},{20,-92},{20,10},{2,10}}, - color={0,0,127})); + annotation (Line(points={{15,-96},{18,-96},{18,-92}, + {20,-92},{20,10},{2,10}}, color={0,0,127})); connect(gai1.y, vol.mWat_flow) - annotation (Line(points={{-21,10},{-40,10},{ - -40,20},{-130,20},{-130,48},{-107,48}}, - color={0,0,127})); + annotation (Line(points={{-21,10},{-40,10},{-40,20}, + {-130,20},{-130,48},{-107,48}},color={0,0,127})); connect(preHeaFlo.Q_flow, gai2.y) annotation (Line(points={{-62,40},{-21,40}}, color={0,0,127})); connect(preHeaFlo.port, vol.heatPort) - annotation (Line(points={{-82,40},{-120, - 40},{-120,56},{-105,56}}, color={191,0,0})); + annotation (Line(points={{-82,40},{-120,40}, + {-120,56},{-105,56}}, color={191,0,0})); connect(gai2.u,outCon. Q_flow) annotation (Line(points={{2,40},{40,40},{40,-92}, - {15,-92}}, color={0,0,127})); + {15,-92}}, color={0,0,127})); connect(vol.ports[1], port_b2) - annotation (Line(points={{-95,66},{-144,66},{ - -144,80},{-240,80}}, - color={0,127,255})); + annotation (Line(points={{-95,66},{-144,66},{-144,80},{-240,80}}, + color={0,127,255})); connect(mPro_flow.y, dehPer.mPro_flow) - annotation (Line(points={{-89,-114},{-48, - -114},{-48,-95}}, color={0,0,127})); + annotation (Line(points={{-89,-114},{-48,-114}, + {-48,-95}}, color={0,0,127})); connect(outCon.port_b, port_b1) annotation (Line(points={{14,-100},{100,-100}}, color={0,127,255})); annotation (Dialog(group="Nominal condition"), @@ -245,20 +241,22 @@ alt=\"Dehumidifer_Schematic.png\" border=\"1\"/>

          This model should be extended with a heating coil and/or a regeneration air fan. It takes two inputs: a boolean signal for dehumidification and a real signal for the motor speed ratio. -

            -
          • - The boolean signal determines if the dehumidifier occurs or not. -
          • -
          • - The real signal specifies the amount of sensible and latent heat exchange that occurs in the dehumidifier and can be - used to adjust the outline condition of the process air. -
          • -
          +
            +
          • +The boolean signal determines if the dehumidifier occurs or not. +
          • +
          • +The real signal specifies the amount of sensible and latent heat exchange that occurs in the dehumidifier and can be +used to adjust the outline condition of the process air. +
          • +
          More details can be found in Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.Performance. ", revisions="
            -
          • March 1, 2024, by Sen Huang:
            First implementation.
          • +
          • March 1, 2024, by Sen Huang:
            +First implementation. +
          ")); end PartialDesiccant; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Performance.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Performance.mo index e66dcf1abbb..906c1174474 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Performance.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Performance.mo @@ -1,4 +1,4 @@ -within Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses; +within Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses; model Performance "Model calculates the outlet condition of the process air through a desiccant dehumidifier" extends Modelica.Blocks.Icons.Block; @@ -24,70 +24,68 @@ model Performance "Minimum allowable wheel speed ratio"; Modelica.Blocks.Interfaces.BooleanInput uRot "Set to true to enable the dehumidification process" annotation (Placement( - transformation(extent={{-124,68},{-100,92}}), iconTransformation(extent - ={{-120,72},{-100,92}}))); + transformation(extent={{-124,68},{-100,92}}), iconTransformation(extent + ={{-120,72},{-100,92}}))); Modelica.Blocks.Interfaces.RealInput TProEnt( final unit="K") "Temperature of the process air entering the dehumidifier" - annotation (Placement(transformation(extent={{-124,28},{-100,52}}), - iconTransformation(extent={{-120,32},{-100,52}}))); + annotation (Placement(transformation(extent={{-124,28},{-100,52}}), + iconTransformation(extent={{-120,32},{-100,52}}))); Modelica.Blocks.Interfaces.RealInput X_w_ProEnt( - final unit="1") + final unit="1") "Humidity ratio of the process air entering the dehumidifier" annotation (Placement(transformation( extent={{-124,-54},{-100,-30}}),iconTransformation(extent={{-120,-50}, {-100,-30}}))); Modelica.Blocks.Interfaces.RealInput VPro_flow( - final unit="m3/s") - "Volumetric flow rate of the process air" - annotation (Placement(transformation( - extent={{-124,-92},{-100,-68}}), - iconTransformation(extent={{-120,-92},{-100,-72}}))); + final unit="m3/s") + "Volumetric flow rate of the process air" + annotation (Placement(transformation( + extent={{-124,-92},{-100,-68}}), + iconTransformation(extent={{-120,-92},{-100,-72}}))); Modelica.Blocks.Interfaces.RealInput mPro_flow( - final unit="kg/s") "Mass flow rate of the process air" - annotation (Placement(transformation( - extent={{-12,-12},{12,12}}, - rotation=90, - origin={0,-112}), iconTransformation( - extent={{-10,-10},{10,10}}, - rotation=90, - origin={0,-110}))); + final unit="kg/s") "Mass flow rate of the process air" + annotation (Placement(transformation( + extent={{-12,-12},{12,12}}, + rotation=90, + origin={0,-112}), iconTransformation( + extent={{-10,-10},{10,10}}, + rotation=90, + origin={0,-110}))); Modelica.Blocks.Interfaces.RealInput TRegEnt( final unit="K") "Temperature of the regeneration air entering the dehumidifier" annotation ( - Placement(transformation(extent={{-124,-14},{-100,10}}), - iconTransformation(extent={{-120,-10},{-100,10}}))); + Placement(transformation(extent={{-124,-14},{-100,10}}), + iconTransformation(extent={{-120,-10},{-100,10}}))); Modelica.Blocks.Interfaces.RealInput uSpe( final unit="1", final min=0.3, final max=1) "Wheel speed ratio" annotation (Placement(transformation( - extent={{12,-12},{-12,12}}, - rotation=90, - origin={-80,112}), iconTransformation( - extent={{10,-10},{-10,10}}, - rotation=90, - origin={-82,110}))); + extent={{12,-12},{-12,12}}, + rotation=90, + origin={-80,112}), iconTransformation( + extent={{10,-10},{-10,10}}, + rotation=90, + origin={-82,110}))); Modelica.Blocks.Interfaces.RealOutput TProLea( final unit="K") "Temperature of the process air leaving the dehumidifier" annotation ( - Placement(transformation(extent={{100,70},{120,90}}), iconTransformation( - extent={{100,70},{120,90}}))); + Placement(transformation(extent={{100,70},{120,90}}), iconTransformation( + extent={{100,70},{120,90}}))); Modelica.Blocks.Interfaces.RealOutput X_w_ProLea( final unit="1") "Humidity ratio of the process air leaving the dehumidifier" - annotation (Placement(transformation(extent={{100,30},{120,50}}), - iconTransformation(extent={{100,30},{120,50}}))); + annotation (Placement(transformation(extent={{100,30},{120,50}}), + iconTransformation(extent={{100,30},{120,50}}))); Modelica.Blocks.Interfaces.RealOutput VReg_flow( final unit="m3/s") "Volumetric flow rate of the regeneration air" annotation (Placement(transformation( - extent={{100,-50},{120,-30}}), iconTransformation(extent={{100,-50},{120, - -30}}))); + extent={{100,-50},{120,-30}}), iconTransformation(extent={{100,-50},{120,-30}}))); Modelica.Blocks.Interfaces.RealOutput yQReg( final unit="1") "Regeneration heating output ratio" annotation (Placement(transformation( - extent={{100,-90},{120,-70}}), iconTransformation(extent={{100,-90},{120, - -70}}))); + extent={{100,-90},{120,-70}}), iconTransformation(extent={{100,-90},{120,-70}}))); protected Real CpReg(final unit="J/kg") "Specific regeneration energy"; @@ -99,56 +97,55 @@ protected equation if uRot then assert(uSpe >= uSpe_min, - "In " + getInstanceName() + ": the wheel speed ratio should not - be lower than 0.3.", - level=AssertionLevel.error); + "In " + getInstanceName() + ": the wheel speed ratio should not + be lower than 0.3.", + level=AssertionLevel.error); etaSen=Buildings.Utilities.Math.Functions.polynomial(a=a, x=uSpe); etaLat=Buildings.Utilities.Math.Functions.polynomial(a=b, x=uSpe); // Check the inlet condition of the process inlet condition. assert(TProEnt <= per.TProEnt_max and TProEnt >= per.TProEnt_min, - "In " + getInstanceName() + ": temperature of the process air entering the dehumidifier is beyond - the range that is defined in the performance curve.", - level=AssertionLevel.error); - assert(X_w_ProEnt <= per.X_w_ProEnt_max and X_w_ProEnt >= per.X_w_ProEnt_min, - "In " + getInstanceName() + ": humidity ratio of the process air entering the dehumidifier is beyond - the range that is defined in the performance curve.", - level=AssertionLevel.error); - VReg_flow = - Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.performanceCurve( - TProEnt=TProEnt, - X_w_ProEnt=X_w_ProEnt, - vPro=VPro_flow/VPro_flow_nominal*vPro_nominal, - a=per.coevReg)/vReg_nominal*VReg_flow_nominal*uSpe; - assert(VReg_flow <= VReg_flow_nominal, - "In " + getInstanceName() + ": regeneration flow rate is not sufficient.", - level=AssertionLevel.error); - TProLea = TProEnt + (Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.performanceCurve( - TProEnt = TProEnt, - X_w_ProEnt = X_w_ProEnt, - vPro = VPro_flow/VPro_flow_nominal*vPro_nominal, - a = per.coeTProLea)+ 273.15 - TProEnt)*etaSen; - X_w_ProLea = X_w_ProEnt-(X_w_ProEnt-(Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.performanceCurve( - TProEnt = TProEnt, - X_w_ProEnt = X_w_ProEnt, - vPro = VPro_flow/VPro_flow_nominal*vPro_nominal, - a = per.coeX_w_ProLea)))*etaLat; - assert(X_w_ProLea > 0, - "In " + getInstanceName() + ": humidity ratio of the process air leaving - the dehumidifier becomes negative.", - level=AssertionLevel.error); - CpReg = Buildings.Utilities.Math.Functions.smoothMax( - x1 = Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.performanceCurve( - TProEnt = TProEnt, - X_w_ProEnt = X_w_ProEnt, - vPro = VPro_flow/VPro_flow_nominal*vPro_nominal, - a = per.coeQReg_flow)*uSpe, - x2 = 0, - deltaX = 0.01); - yQReg = CpReg*(X_w_ProEnt - X_w_ProLea)*mPro_flow*(per.TRegEnt_nominal - + "In " + getInstanceName() + ": temperature of the process air entering the dehumidifier is beyond + the range that is defined in the performance curve.", + level=AssertionLevel.error); + assert(X_w_ProEnt <= per.X_w_ProEnt_max and X_w_ProEnt >= per.X_w_ProEnt_min, + "In " + getInstanceName() + ": humidity ratio of the process air entering the dehumidifier is beyond + the range that is defined in the performance curve.", + level=AssertionLevel.error); + VReg_flow = Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.performanceCurve( + TProEnt=TProEnt, + X_w_ProEnt=X_w_ProEnt, + vPro=VPro_flow/VPro_flow_nominal*vPro_nominal, + a=per.coevReg)/vReg_nominal*VReg_flow_nominal*uSpe; + assert(VReg_flow <= VReg_flow_nominal, + "In " + getInstanceName() + ": regeneration flow rate is not sufficient.", + level=AssertionLevel.error); + TProLea = TProEnt + (Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.performanceCurve( + TProEnt = TProEnt, + X_w_ProEnt = X_w_ProEnt, + vPro = VPro_flow/VPro_flow_nominal*vPro_nominal, + a = per.coeTProLea)+ 273.15 - TProEnt)*etaSen; + X_w_ProLea = X_w_ProEnt-(X_w_ProEnt-(Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.performanceCurve( + TProEnt = TProEnt, + X_w_ProEnt = X_w_ProEnt, + vPro = VPro_flow/VPro_flow_nominal*vPro_nominal, + a = per.coeX_w_ProLea)))*etaLat; + assert(X_w_ProLea > 0, + "In " + getInstanceName() + ": humidity ratio of the process air leaving + the dehumidifier becomes negative.", + level=AssertionLevel.error); + CpReg = Buildings.Utilities.Math.Functions.smoothMax( + x1 = Buildings.Fluid.Dehumidifiers.Desiccant.BaseClasses.performanceCurve( + TProEnt = TProEnt, + X_w_ProEnt = X_w_ProEnt, + vPro = VPro_flow/VPro_flow_nominal*vPro_nominal, + a = per.coeQReg_flow)*uSpe, + x2 = 0, + deltaX = 0.01); + yQReg = CpReg*(X_w_ProEnt - X_w_ProLea)*mPro_flow*(per.TRegEnt_nominal - TRegEnt)/(per.TRegEnt_nominal - TProEnt)/QReg_flow_nominal; assert(yQReg <= 1, - "In " + getInstanceName() + ": heating power is not sufficient for regeneration.", - level=AssertionLevel.error); + "In " + getInstanceName() + ": heating power is not sufficient for regeneration.", + level=AssertionLevel.error); else //No dehumidification occurs. TProLea = TProEnt; @@ -292,7 +289,8 @@ ASHRAE Handbook—HVAC Systems & Equipment Chapter 26 ", revisions="
            -
          • March 1, 2024, by Sen Huang:
            First implementation.
          • +
          • March 1, 2024, by Sen Huang:
            +First implementation.
          ")); end Performance; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mo index 4c1893771a2..7803d51371d 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mo @@ -51,22 +51,28 @@ model Performance startTime=50) "Wheel speed ratio" annotation (Placement(transformation(extent={{-40,70},{-20,90}}))); equation - connect(onDeh.y, dehumPer.uRot) annotation (Line(points={{-59,80},{-44,80},{-44, - 8.2},{-11,8.2}}, color={255,0,255})); - connect(TProEnt.y, dehumPer.TProEnt) annotation (Line(points={{-59,40},{-20, - 40},{-20,4.2},{-11,4.2}}, color={0,0,127})); + connect(onDeh.y, dehumPer.uRot) + annotation (Line(points={{-59,80},{-44,80},{-44,8.2}, + {-11,8.2}}, color={255,0,255})); + connect(TProEnt.y, dehumPer.TProEnt) + annotation (Line(points={{-59,40},{-20,40}, + {-20,4.2},{-11,4.2}}, color={0,0,127})); connect(TRegEnt.y, dehumPer.TRegEnt) annotation (Line(points={{-59,0},{-11,0}}, color={0,0,127})); - connect(dehumPer.X_w_ProEnt, X_w_ProEnt.y) annotation (Line(points={{-11,-4}, - {-40,-4},{-40,-40},{-59,-40}}, color={0,0,127})); - connect(VPro_flow.y, dehumPer.VPro_flow) annotation (Line(points={{-59,-80},{ - -34,-80},{-34,-8.2},{-11,-8.2}}, color={0,0,127})); + connect(dehumPer.X_w_ProEnt, X_w_ProEnt.y) + annotation (Line(points={{-11,-4}, + {-40,-4},{-40,-40},{-59,-40}}, color={0,0,127})); + connect(VPro_flow.y, dehumPer.VPro_flow) + annotation (Line(points={{-59,-80},{-34,-80}, + {-34,-8.2},{-11,-8.2}}, color={0,0,127})); connect(gai.u, VPro_flow.y) annotation (Line(points={{-23.2,-80},{-59,-80}}, color={0,0,127})); - connect(gai.y, dehumPer.mPro_flow) annotation (Line(points={{-9.4,-80},{0,-80}, - {0,-11}}, color={0,0,127})); - connect(uSpe.y, dehumPer.uSpe) annotation (Line(points={{-19,80},{-8,80},{-8, - 11},{-8.2,11}}, color={0,0,127})); + connect(gai.y, dehumPer.mPro_flow) + annotation (Line(points={{-9.4,-80},{0,-80}, + {0,-11}}, color={0,0,127})); + connect(uSpe.y, dehumPer.uSpe) + annotation (Line(points={{-19,80},{-8,80},{-8,11}, + {-8.2,11}}, color={0,0,127})); annotation (experiment(Tolerance=1e-6, StopTime=100), __Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Fluid/Dehumidifiers/Desiccant/BaseClasses/Validation/Performance.mos" "Simulate and Plot"), Documentation(info=" @@ -118,7 +124,9 @@ and keep relatively constant afterward.
        ", revisions="
          -
        • March 1, 2024, by Sen Huang:
          First implementation.
        • +
        • March 1, 2024, by Sen Huang:
          +First implementation. +
        ")); end Performance; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/performanceCurve.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/performanceCurve.mo index f85a31a6bcb..9ed188f4bc7 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/performanceCurve.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/BaseClasses/performanceCurve.mo @@ -17,19 +17,20 @@ protected algorithm TProEnt_degC := Modelica.Units.Conversions.to_degC(TProEnt); - y:= a[1] + a[2]*TProEnt_degC - + a[3]* X_w_ProEnt - + a[4]*vPro - + a[5]*TProEnt_degC*X_w_ProEnt - + a[6]*TProEnt_degC*vPro - + a[7]*X_w_ProEnt*vPro + a[8]*TProEnt_degC*TProEnt_degC - + a[9]*X_w_ProEnt*X_w_ProEnt+ a[10]*vPro*vPro - + a[11]*TProEnt_degC*TProEnt_degC*X_w_ProEnt*X_w_ProEnt - + a[12]*TProEnt_degC*TProEnt_degC*vPro*vPro - + a[13]*X_w_ProEnt*X_w_ProEnt*vPro*vPro - + a[14]*Modelica.Math.log(TProEnt_degC) - + a[15]*Modelica.Math.log(X_w_ProEnt) - + a[16]*Modelica.Math.log(vPro); + y:= a[1] + + a[2]*TProEnt_degC + + a[3]* X_w_ProEnt + + a[4]*vPro + + a[5]*TProEnt_degC*X_w_ProEnt + + a[6]*TProEnt_degC*vPro + + a[7]*X_w_ProEnt*vPro + a[8]*TProEnt_degC*TProEnt_degC + + a[9]*X_w_ProEnt*X_w_ProEnt+ a[10]*vPro*vPro + + a[11]*TProEnt_degC*TProEnt_degC*X_w_ProEnt*X_w_ProEnt + + a[12]*TProEnt_degC*TProEnt_degC*vPro*vPro + + a[13]*X_w_ProEnt*X_w_ProEnt*vPro*vPro + + a[14]*Modelica.Math.log(TProEnt_degC) + + a[15]*Modelica.Math.log(X_w_ProEnt) + + a[16]*Modelica.Math.log(vPro); annotation (Documentation(info=" This function computes a performance curve of desiccant dehumidifiers, with the following form @@ -63,7 +64,9 @@ U.S. Department of Energy, "EnergyPlus Version 22.1.0 Documentation: En
      ", revisions="
        -
      • March 1, 2024, by Sen Huang:
        First implementation.
      • +
      • March 1, 2024, by Sen Huang:
        +First implementation. +
      ")); end performanceCurve; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/Data/EnergyPlus.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/Data/EnergyPlus.mo index 9678e638f41..04d40837003 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/Data/EnergyPlus.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/Data/EnergyPlus.mo @@ -22,7 +22,7 @@ record EnergyPlus = -0.0151657189566474, 3.91641393230322e-08, 0.126032651553348, 0.000391653854431574, 0.002160537360507, 0.00132732844211593}, - coevReg = {-4.67358908091488, 0.0654323095468338, + coevReg = {-4.67358908091488, 0.0654323095468338, 396.950518702316, 1.52610165426736, -11.3955868430328,0.00520693906104437, 57.783645385621, -0.000464800668311693, @@ -30,7 +30,7 @@ record EnergyPlus = 5.26762675442845, -8.88452553055039e-05, -182.382479369311, -0.100289774002047, -0.486980507964251, -0.972715425435447}, - coeQReg_flow = {-27794046.6291107, -235725.171759615, + coeQReg_flow = {-27794046.6291107, -235725.171759615, 975461343.331328, -686069.373946731, -17717307.3766266, 31482.2539662489, 55296552.8260743, 6195.36070023868, @@ -38,14 +38,17 @@ record EnergyPlus = 3933449.40965846, -6.66122876558634, -349102295.417547, 83672.179730172, -6059524.33170538, 1220523.39525162}) - "Default data record for desiccant dehumidifiers" annotation (Documentation( - info=" + "Default data record for desiccant dehumidifiers" + annotation (Documentation( + info=" Performance data for desiccant dehumidifier model. This data corresponds to the default operation curve for the EnergyPlus object, Dehumidifier:Desiccant:NoFans ", revisions="
        -
      • March 1, 2024, by Sen Huang:
        First implementation.
      • +
      • March 1, 2024, by Sen Huang:
        +First implementation. +
      ")); diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/Data/Generic.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/Data/Generic.mo index af97a7c3bfd..4ef24af5b35 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/Data/Generic.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/Data/Generic.mo @@ -30,7 +30,9 @@ Buildings.Fluid.Dehumidifiers.Desiccant.

      ", revisions="
        -
      • March 1, 2024, by Sen Huang:
        First implementation.
      • +
      • March 1, 2024, by Sen Huang:
        +First implementation. +
      ")); end Generic; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilBypassDampers.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilBypassDampers.mo index f8cbe41d16c..15e091dec85 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilBypassDampers.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilBypassDampers.mo @@ -11,15 +11,15 @@ model ElectricCoilBypassDampers Modelica.Blocks.Interfaces.BooleanInput uRot "True when the wheel is operating" annotation (Placement(transformation( extent={{-280,-140},{-240,-100}}), - iconTransformation(extent={{-140,-80}, - {-100,-40}}))); + iconTransformation(extent={{-140,-80}, + {-100,-40}}))); Modelica.Blocks.Interfaces.RealInput uBypDamPos( final unit="1", final min=0, final max=1) "Bypass damper position" annotation (Placement(transformation(extent={{-280,-20},{-240,20}}), - iconTransformation(extent={{-140,-20},{-100,20}}))); + iconTransformation(extent={{-140,-20},{-100,20}}))); Modelica.Blocks.Math.BooleanToReal booleanToReal "Convert boolean input to real output" annotation (Placement(transformation(extent={{-200,0},{-180,20}}))); @@ -39,7 +39,7 @@ model ElectricCoilBypassDampers final dpDamper_nominal=dp1_nominal) "Process air damper" annotation (Placement(transformation( - extent={{-10,-10},{10,10}},rotation=0,origin={-130,-100}))); + extent={{-10,-10},{10,10}},rotation=0,origin={-130,-100}))); Modelica.Blocks.Sources.RealExpression X_w_ProEnt( final y(final unit="1") = damPro.port_b.Xi_outflow[i1_w]) "Humidity ratio of the process air entering the dehumidifier" @@ -72,15 +72,16 @@ model ElectricCoilBypassDampers protected Modelica.Blocks.Sources.RealExpression mReg_flow( final y(final unit="kg/s")= - dehPer.VReg_flow*Medium2.density(state=Medium2.setState_phX( - p=port_a2.p, - h=port_a2.h_outflow, - X=port_a2.Xi_outflow))) + dehPer.VReg_flow*Medium2.density(state=Medium2.setState_phX( + p=port_a2.p, + h=port_a2.h_outflow, + X=port_a2.Xi_outflow))) "Regeneration air mass flow rate" annotation (Placement(transformation(extent={{20,76},{40,96}}))); Modelica.Blocks.Math.Add3 add3 "Sum of the three inputs" annotation (Placement(transformation(extent={{60,-10},{80,10}}))); + equation connect(add3.y, P) annotation (Line(points={{81,0},{110,0}}, color={0,0,127})); @@ -108,45 +109,44 @@ equation annotation (Line(points={{-5,72},{-40,72},{-40,-60},{-22,-60}}, color={0,0,127})); connect(bypDamPro.port_a, port_a1) - annotation (Line(points={{-170,-120},{-180, - -120},{-180,-100},{-240,-100}}, color={0,127,255})); + annotation (Line(points={{-170,-120},{-180,-120}, + {-180,-100},{-240,-100}}, color={0,127,255})); connect(bypDamPro.port_b, port_b1) - annotation (Line(points={{-150,-120},{-126, - -120},{-126,-138},{34,-138},{34,-100},{100,-100}}, color={0,127,255})); + annotation (Line(points={{-150,-120},{-126,-120}, + {-126,-138},{34,-138},{34,-100},{100,-100}}, color={0,127,255})); connect(booleanToReal.y, PEleMot.u) - annotation (Line(points={{-179,10},{-50, - 10},{-50,-32},{-22,-32}}, color={0,0,127})); + annotation (Line(points={{-179,10},{-50,10}, + {-50,-32},{-22,-32}}, color={0,0,127})); connect(uni.y, sub.u1) annotation (Line(points={{-193,-20},{-168,-20}}, color={0,0,127})); connect(uBypDamPos, bypDamPro.y) - annotation (Line(points={{-260,0},{-220,0},{ - -220,-80},{-160,-80},{-160,-108}}, color={0,0,127})); + annotation (Line(points={{-260,0},{-220,0},{-220,-80}, + {-160,-80},{-160,-108}}, color={0,0,127})); connect(sub.u2, uBypDamPos) - annotation (Line(points={{-168,-32},{-180,-32},{ - -180,-60},{-220,-60},{-220,0},{-260,0}}, color={0,0,127})); + annotation (Line(points={{-168,-32},{-180,-32},{-180,-60}, + {-220,-60},{-220,0},{-260,0}}, color={0,0,127})); connect(booleanToReal.u, uRot) - annotation (Line(points={{-202,10},{-230,10},{ - -230,-120},{-260,-120}}, color={255,0,255})); + annotation (Line(points={{-202,10},{-230,10},{-230,-120}, + {-260,-120}}, color={255,0,255})); connect(dehPer.uSpe, uni.y) - annotation (Line(points={{-56.2,-73},{-56.2,-6},{ - -180,-6},{-180,-20},{-193,-20}}, color={0,0,127})); + annotation (Line(points={{-56.2,-73},{-56.2,-6},{-180,-6}, + {-180,-20},{-193,-20}}, color={0,0,127})); connect(outCon.port_b, port_b1) - annotation (Line(points={{14,-100},{56,-100},{ - 56,-100},{100,-100}}, color={0,127,255})); + annotation (Line(points={{14,-100},{56,-100},{56,-100},{100,-100}}, color={0,127,255})); connect(damPro.y, sub.y) - annotation (Line(points={{-130,-88},{-130,-26},{-144, - -26}}, color={0,0,127})); - connect(dehPer.uRot, uRot) annotation (Line(points={{-59,-75.8},{-144,-75.8}, - {-144,-76},{-230,-76},{-230,-120},{-260,-120}}, color={255,0,255})); + annotation (Line(points={{-130,-88},{-130,-26},{-144,-26}}, + color={0,0,127})); + connect(dehPer.uRot, uRot) + annotation (Line(points={{-59,-75.8},{-144,-75.8}, + {-144,-76},{-230,-76},{-230,-120},{-260,-120}}, color={255,0,255})); connect(X_w_ProEnt.y, dehPer.X_w_ProEnt) - annotation (Line(points={{-89,-62},{ - -76,-62},{-76,-88},{-59,-88}}, color={0,0,127})); + annotation (Line(points={{-89,-62},{-76,-62}, + {-76,-88},{-59,-88}}, color={0,0,127})); connect(damPro.port_a, port_a1) annotation (Line(points={{-140,-100},{-240,-100}}, color={0,127,255})); connect(damPro.port_b, outCon.port_a) - annotation (Line(points={{-120,-100},{ - -114,-100},{-114,-120},{-20,-120},{-20,-100},{-6,-100}}, color={0,127, - 255})); + annotation (Line(points={{-120,-100},{-114,-100},{-114,-120},{-20,-120}, + {-20,-100},{-6,-100}}, color={0,127,255})); annotation ( defaultComponentName="deh", Icon(coordinateSystem(preserveAspectRatio=false), graphics={ @@ -191,7 +191,10 @@ when their capacities permit.

      ", revisions="
        -
      • March 1, 2024, by Sen Huang:
        First implementation.
      • +
      • +March 1, 2024, by Sen Huang:
        +First implementation. +
      ")); end ElectricCoilBypassDampers; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilSpeedControlled.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilSpeedControlled.mo index e734427274a..9d9e933570a 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilSpeedControlled.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/ElectricCoilSpeedControlled.mo @@ -18,8 +18,8 @@ model ElectricCoilSpeedControlled final max=1) "Wheel speed ratio" annotation (Placement(transformation( - extent={{-280,-20},{-240,20}}), iconTransformation(extent={{-140,-20}, - {-100,20}}))); + extent={{-280,-20},{-240,20}}), iconTransformation(extent={{-140,-20}, + {-100,20}}))); Buildings.Fluid.HeatExchangers.HeaterCooler_u hea( redeclare package Medium = Medium2, final m_flow_nominal=m2_flow_nominal, @@ -42,7 +42,7 @@ model ElectricCoilSpeedControlled "Convert real input to boolean output " annotation (Placement(transformation(extent={{-180,-50},{-160,-30}}))); Modelica.Blocks.Sources.RealExpression X_w_ProEnt(final y(final unit="1")= - res.port_b.Xi_outflow[i1_w]) + res.port_b.Xi_outflow[i1_w]) "Humidity ratio of the process air entering the dehumidifier" annotation (Placement(transformation(extent={{-110,-72},{-90,-52}}))); @@ -54,16 +54,16 @@ model ElectricCoilSpeedControlled annotation (Placement(transformation(extent={{-200,-110},{-180,-90}}))); protected Modelica.Blocks.Sources.RealExpression PEle(final y=PMot_nominal* - Buildings.Utilities.Math.Functions.polynomial(a=c, x=uSpe)) + Buildings.Utilities.Math.Functions.polynomial(a=c, x=uSpe)) "Electric power consumption" annotation (Placement(transformation(extent={{-20,-40},{0,-20}}))); Modelica.Blocks.Sources.RealExpression mReg_flow( final y(final unit="kg/s")= - dehPer.VReg_flow*Medium2.density(state=Medium2.setState_phX( - p=port_a2.p, - h=port_a2.h_outflow, - X=port_a2.Xi_outflow))) + dehPer.VReg_flow*Medium2.density(state=Medium2.setState_phX( + p=port_a2.p, + h=port_a2.h_outflow, + X=port_a2.Xi_outflow))) "Regeneration air mass flow rate" annotation (Placement(transformation(extent={{20,76},{40,96}}))); Modelica.Blocks.Math.Add3 add3 @@ -72,9 +72,9 @@ protected initial equation assert(abs(sum(c)-1) < Modelica.Constants.eps, - "In " + getInstanceName() + ": Power efficiency curve is wrong. - The sum of the coefficients for power efficiency curve should equal to 1.", - level=AssertionLevel.error); + "In " + getInstanceName() + ": Power efficiency curve is wrong. + The sum of the coefficients for power efficiency curve should equal to 1.", + level=AssertionLevel.error); equation connect(add3.y, P) @@ -100,24 +100,24 @@ equation annotation (Line(points={{-5,72},{-48,72},{-48,-60},{-22,-60}}, color={0,0,127})); connect(dehPer.uSpe, uSpe) - annotation (Line(points={{-56.2,-73},{-56.2,0},{-260, - 0}}, color={0,0,127})); + annotation (Line(points={{-56.2,-73},{-56.2,0}, + {-260,0}}, color={0,0,127})); connect(realToBoolean.u, uSpe) annotation (Line(points={{-182,-40},{-200,-40}, - {-200,0},{-260,0}}, color={0,0,127})); - connect(realToBoolean.y, dehPer.uRot) annotation (Line(points={{-159,-40},{-126, - -40},{-126,-75.8},{-59,-75.8}}, color={255,0,255})); + {-200,0},{-260,0}}, color={0,0,127})); + connect(realToBoolean.y, dehPer.uRot) annotation (Line(points={{-159,-40},{-126,-40}, + {-126,-75.8},{-59,-75.8}}, color={255,0,255})); connect(PEle.y, add3.u2) - annotation (Line(points={{1,-30},{26,-30},{26,0},{58, - 0}}, color={0,0,127})); + annotation (Line(points={{1,-30},{26,-30},{26,0},{58,0}}, + color={0,0,127})); connect(res.port_a, port_a1) annotation (Line(points={{-200,-100},{-240,-100}}, color={0,127,255})); connect(res.port_b, outCon.port_a) - annotation (Line(points={{-180,-100},{-120, - -100},{-120,-126},{-20,-126},{-20,-100},{-6,-100}}, color={0,127,255})); + annotation (Line(points={{-180,-100},{-120,-100}, + {-120,-126},{-20,-126},{-20,-100},{-6,-100}}, color={0,127,255})); connect(X_w_ProEnt.y, dehPer.X_w_ProEnt) - annotation (Line(points={{-89,-62},{ - -78,-62},{-78,-88},{-59,-88}}, color={0,0,127})); + annotation (Line(points={{-89,-62},{-78,-62}, + {-78,-88},{-59,-88}}, color={0,0,127})); annotation ( defaultComponentName="deh", Icon(coordinateSystem(preserveAspectRatio=false), graphics={ @@ -162,7 +162,10 @@ when their capacities permit.

      ", revisions="
        -
      • April 10, 2024, by Sen Huang:
        First implementation.
      • +
      • +April 10, 2024, by Sen Huang:
        +First implementation. +
      ")); end ElectricCoilSpeedControlled; diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mo index 909a255b522..a7082ec53d0 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mo @@ -67,45 +67,48 @@ model ElectricCoilBypassDampers "Wheel operating signal" annotation (Placement(transformation(extent={{-90,-16},{-70,4}}))); Buildings.Fluid.Sensors.MassFractionTwoPort senX_w_ProEnt( - redeclare package Medium = Medium1, - m_flow_nominal=0.4333*1.2) + redeclare package Medium = Medium1, + m_flow_nominal=0.4333*1.2) "Humidity sensor of the process air entering the dehumidifier" annotation (Placement(transformation(extent={{-34,-40},{-14,-20}}))); Buildings.Fluid.Sensors.MassFractionTwoPort senX_w_ProLea( - redeclare package Medium = Medium1, - m_flow_nominal=0.4333*1.2) + redeclare package Medium = Medium1, + m_flow_nominal=0.4333*1.2) "Humidity sensor of the process air leaving the dehumidifier" annotation (Placement(transformation(extent={{26,-18},{46,2}}))); equation connect(sou_2.ports[1], deh.port_a2) annotation (Line(points={{40,50},{18,50}, - {18,8},{10,8}}, color={0,127,255})); + {18,8},{10,8}}, color={0,127,255})); connect(sin_2.ports[1], deh.port_b2) annotation (Line(points={{-40,50},{-20,50}, - {-20,8},{-10,8}}, color={0,127,255})); + {-20,8},{-10,8}}, color={0,127,255})); connect(TProEnt.y, sou_1.T_in) - annotation (Line(points={{-77,-60},{-68,-60},{-68, - -26},{-62,-26}}, color={0,0,127})); + annotation (Line(points={{-77,-60},{-68,-60}, + {-68,-26},{-62,-26}}, color={0,0,127})); connect(uBypDamPos.y, deh.uBypDamPos) annotation (Line(points={{-69,30},{-22,30}, - {-22,0},{-12,0}}, color={0,0,127})); + {-22,0},{-12,0}}, color={0,0,127})); connect(uRot.y, deh.uRot) annotation (Line(points={{-69,-6},{-12,-6}}, color={255,0,255})); connect(deh.port_b1, senX_w_ProLea.port_a) annotation (Line(points={{10,-8},{26,-8}}, color={0,127,255})); connect(senX_w_ProLea.port_b, sin_1.ports[1]) annotation (Line(points={{46,-8}, - {60,-8},{60,-40},{70,-40}}, color={0,127,255})); + {60,-8},{60,-40},{70,-40}}, color={0,127,255})); connect(sou_1.ports[1], senX_w_ProEnt.port_a) annotation (Line(points={{-40,-30},{-34,-30}}, color={0,127,255})); connect(senX_w_ProEnt.port_b, deh.port_a1) annotation (Line(points={{-14,-30}, - {-6,-30},{-6,-16},{-16,-16},{-16,-8},{-10,-8}}, color={0,127,255})); + {-6,-30},{-6,-16},{-16,-16},{-16,-8},{-10,-8}}, color={0,127,255})); annotation (experiment(Tolerance=1e-6, StopTime=1200), - __Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mos" - "Simulate and Plot"), Documentation(revisions=" + __Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilBypassDampers.mos" + "Simulate and Plot"), Documentation(revisions="
        -
      • March 1, 2024, by Sen Huang:
        First implementation.
      • +
      • +March 1, 2024, by Sen Huang:
        +First implementation. +
      ", info="

      diff --git a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mo b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mo index 081aedbd97e..9630e998ac2 100644 --- a/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mo +++ b/Buildings/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mo @@ -64,38 +64,41 @@ model ElectricCoilSpeedControlled startTime=0) "Wheel speed ratio" annotation (Placement(transformation(extent={{-92,22},{-72,42}}))); Buildings.Fluid.Sensors.MassFractionTwoPort senX_w_ProEnt( - redeclare package Medium = Medium1, - m_flow_nominal=0.4333*1.2) + redeclare package Medium = Medium1, + m_flow_nominal=0.4333*1.2) "Humidity sensor of the process air entering the dehumidifier" annotation (Placement(transformation(extent={{-34,-40},{-14,-20}}))); Buildings.Fluid.Sensors.MassFractionTwoPort senX_w_ProLea( - redeclare package Medium = Medium1, - m_flow_nominal=0.4333*1.2) + redeclare package Medium = Medium1, + m_flow_nominal=0.4333*1.2) "Humidity sensor of the process air leaving the dehumidifier" annotation (Placement(transformation(extent={{26,-18},{46,2}}))); equation connect(sou_2.ports[1], deh.port_a2) annotation (Line(points={{40,50},{18,50}, - {18,8},{10,8}}, color={0,127,255})); + {18,8},{10,8}}, color={0,127,255})); connect(sin_2.ports[1], deh.port_b2) annotation (Line(points={{-40,50},{-20,50}, - {-20,8},{-10,8}}, color={0,127,255})); - connect(TProEnt.y, sou_1.T_in) annotation (Line(points={{-77,-60},{-68,-60},{-68, - -26},{-62,-26}}, color={0,0,127})); + {-20,8},{-10,8}}, color={0,127,255})); + connect(TProEnt.y, sou_1.T_in) annotation (Line(points={{-77,-60},{-68,-60},{-68,-26}, + {-62,-26}}, color={0,0,127})); connect(deh.port_b1, senX_w_ProLea.port_a) annotation (Line(points={{10,-8},{26,-8}}, color={0,127,255})); connect(senX_w_ProLea.port_b, sin_1.ports[1]) annotation (Line(points={{46,-8}, - {60,-8},{60,-40},{70,-40}}, color={0,127,255})); + {60,-8},{60,-40},{70,-40}}, color={0,127,255})); connect(sou_1.ports[1], senX_w_ProEnt.port_a) annotation (Line(points={{-40,-30},{-34,-30}}, color={0,127,255})); connect(senX_w_ProEnt.port_b, deh.port_a1) annotation (Line(points={{-14,-30}, - {-6,-30},{-6,-16},{-16,-16},{-16,-8},{-10,-8}}, color={0,127,255})); + {-6,-30},{-6,-16},{-16,-16},{-16,-8},{-10,-8}}, color={0,127,255})); connect(uSpe.y, deh.uSpe) annotation (Line(points={{-71,32},{-22,32},{-22,0},{-12,0}}, color={0,0,127})); annotation (experiment(Tolerance=1e-6, StopTime=1200), - __Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mos" - "Simulate and Plot"), Documentation(revisions=" + __Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Fluid/Dehumidifiers/Desiccant/Examples/ElectricCoilSpeedControlled.mos" + "Simulate and Plot"), Documentation(revisions="

        -
      • April 10, 2024, by Sen Huang:
        First implementation.
      • +
      • +April 10, 2024, by Sen Huang:
        +First implementation. +
      ", info="