diff --git a/Buildings/Applications/DataCenters/DXCooled/Controls/Validation/AirsideEconomizer.mo b/Buildings/Applications/DataCenters/DXCooled/Controls/Validation/AirsideEconomizer.mo index 20efa34b778..530518278f4 100644 --- a/Buildings/Applications/DataCenters/DXCooled/Controls/Validation/AirsideEconomizer.mo +++ b/Buildings/Applications/DataCenters/DXCooled/Controls/Validation/AirsideEconomizer.mo @@ -34,13 +34,15 @@ model AirsideEconomizer Buildings.Fluid.Actuators.Dampers.MixingBox eco( redeclare package Medium = Medium, mOut_flow_nominal=mA_flow_nominal, - dpOut_nominal=20, mRec_flow_nominal=mA_flow_nominal, - dpRec_nominal=20, mExh_flow_nominal=mA_flow_nominal, - dpExh_nominal=20, - use_inputFilter=false) - "Airside economizer" + use_inputFilter=false, + dpDamExh_nominal=0.27, + dpDamOut_nominal=0.27, + dpDamRec_nominal=0.27, + dpFixExh_nominal=20, + dpFixOut_nominal=20, + dpFixRec_nominal=20) "Airside economizer" annotation (Placement(transformation(extent={{-20,-48},{0,-28}}))); Buildings.Fluid.Sensors.TemperatureTwoPort senTemMixAir( redeclare package Medium = Medium, diff --git a/Buildings/Applications/DataCenters/DXCooled/Examples/DXCooledAirsideEconomizer.mo b/Buildings/Applications/DataCenters/DXCooled/Examples/DXCooledAirsideEconomizer.mo index cf05182ee33..401a3f73ff4 100644 --- a/Buildings/Applications/DataCenters/DXCooled/Examples/DXCooledAirsideEconomizer.mo +++ b/Buildings/Applications/DataCenters/DXCooled/Examples/DXCooledAirsideEconomizer.mo @@ -142,13 +142,15 @@ model DXCooledAirsideEconomizer Buildings.Fluid.Actuators.Dampers.MixingBox eco( redeclare package Medium = Medium, mOut_flow_nominal=mA_flow_nominal, - dpOut_nominal=20, mRec_flow_nominal=mA_flow_nominal, - dpRec_nominal=20, mExh_flow_nominal=mA_flow_nominal, - dpExh_nominal=20, - use_inputFilter=false) - "Airside economizer" + use_inputFilter=false, + dpDamExh_nominal=0.27, + dpDamOut_nominal=0.27, + dpDamRec_nominal=0.27, + dpFixExh_nominal=20, + dpFixOut_nominal=20, + dpFixRec_nominal=20) "Airside economizer" annotation (Placement(transformation(extent={{-160,-4},{-140,16}}))); Buildings.Fluid.Sources.Outside out( redeclare package Medium = Medium, @@ -162,13 +164,15 @@ model DXCooledAirsideEconomizer annotation (Placement(transformation(extent={{-170,60},{-150,80}}))); Buildings.Fluid.Actuators.Dampers.Exponential dam1( redeclare package Medium = Medium, - m_flow_nominal=mA_flow_nominal) + m_flow_nominal=mA_flow_nominal, + dpDamper_nominal=0.27) "Open only when free cooling mode is activated" annotation (Placement(transformation(extent={{-20,2},{0,22}}))); Buildings.Fluid.Actuators.Dampers.Exponential dam2( redeclare package Medium = Medium, m_flow_nominal=mA_flow_nominal, - y_start=0) "Open when mechanical cooling is activated" + y_start=0, + dpDamper_nominal=0.27) "Open when mechanical cooling is activated" annotation (Placement(transformation(extent={{-90,-70},{-70,-50}}))); Buildings.Fluid.Sensors.TemperatureTwoPort senTemMixAir( redeclare package Medium = Medium, diff --git a/Buildings/Examples/DualFanDualDuct/ClosedLoop.mo b/Buildings/Examples/DualFanDualDuct/ClosedLoop.mo index f97ab3510dd..81dfc146e68 100644 --- a/Buildings/Examples/DualFanDualDuct/ClosedLoop.mo +++ b/Buildings/Examples/DualFanDualDuct/ClosedLoop.mo @@ -225,13 +225,16 @@ model ClosedLoop "Closed loop model of a dual-fan dual-duct system" mOut_flow_nominal=m_flow_nominal, mRec_flow_nominal=m_flow_nominal, mExh_flow_nominal=m_flow_nominal, - dpOut_nominal=10, - dpRec_nominal=10, - dpExh_nominal=10, from_dp=from_dp, linearized=true, riseTime=15, - y_start=0) "Economizer" + y_start=0, + dpDamExh_nominal=0.27, + dpDamOut_nominal=0.27, + dpDamRec_nominal=0.27, + dpFixExh_nominal=10, + dpFixOut_nominal=10, + dpFixRec_nominal=10) "Economizer" annotation (Placement(transformation(extent={{-40,66},{14,12}}))); Buildings.Fluid.Sensors.TemperatureTwoPort TCoiCoo( redeclare package Medium = MediumA, diff --git a/Buildings/Examples/DualFanDualDuct/ThermalZones/SupplyBranch.mo b/Buildings/Examples/DualFanDualDuct/ThermalZones/SupplyBranch.mo index 01bb164a32c..bd239b2eb9a 100644 --- a/Buildings/Examples/DualFanDualDuct/ThermalZones/SupplyBranch.mo +++ b/Buildings/Examples/DualFanDualDuct/ThermalZones/SupplyBranch.mo @@ -34,25 +34,25 @@ model SupplyBranch "Supply branch of a dual duct system" VAVReheat.Controls.ControlBus controlBus annotation (Placement(transformation(extent={{ -110,-50},{-90,-30}}), iconTransformation(extent={{-110,-38},{-90,-18}}))); - Buildings.Fluid.Actuators.Dampers.VAVBoxExponential vavHot( + Buildings.Fluid.Actuators.Dampers.Exponential vavHot( redeclare package Medium = MediumA, m_flow_nominal=mAirHot_flow_nominal, - dp_nominal(displayUnit="Pa") = 40, from_dp=from_dp, linearized=linearizeFlowResistance, - y_start=0) "VAV damper for hot deck" annotation ( - Placement(transformation( + y_start=0, + dpDamper_nominal=0.27, + dpFixed_nominal=40 - 0.27) "VAV damper for hot deck" annotation (Placement(transformation( extent={{-10,-10},{10,10}}, rotation=90, origin={0,-30}))); - Buildings.Fluid.Actuators.Dampers.VAVBoxExponential vavCol( + Buildings.Fluid.Actuators.Dampers.Exponential vavCol( redeclare package Medium = MediumA, m_flow_nominal=mAirCol_flow_nominal, - dp_nominal(displayUnit="Pa") = 40, from_dp=from_dp, linearized=linearizeFlowResistance, - y_start=0) "VAV damper for cold deck" annotation ( - Placement(transformation( + y_start=0, + dpDamper_nominal=0.27, + dpFixed_nominal=40 - 0.27) "VAV damper for cold deck" annotation (Placement(transformation( extent={{-10,-10},{10,10}}, rotation=90, origin={100,-30}))); diff --git a/Buildings/Examples/HydronicHeating/TwoRoomsWithStorage.mo b/Buildings/Examples/HydronicHeating/TwoRoomsWithStorage.mo index bede06a44ab..776d2b76bb8 100644 --- a/Buildings/Examples/HydronicHeating/TwoRoomsWithStorage.mo +++ b/Buildings/Examples/HydronicHeating/TwoRoomsWithStorage.mo @@ -456,7 +456,8 @@ model TwoRoomsWithStorage Buildings.Fluid.Actuators.Dampers.Exponential damSupByp( redeclare package Medium = MediumA, m_flow_nominal=2*VRoo*1.2*0.37/3600, - use_inputFilter=false) + use_inputFilter=false, + dpDamper_nominal=0.27) "Supply air damper that bypasses the heat recovery" annotation (Placement(transformation(extent={{160,510},{180,530}}))); Buildings.Fluid.HeatExchangers.SensibleCooler_T coo( @@ -563,13 +564,15 @@ Changed controller to output setpoint for supply air temperature for cooling coi Buildings.Fluid.Actuators.Dampers.Exponential damHex( redeclare package Medium = MediumA, m_flow_nominal=2*VRoo*1.2*0.37/3600, - use_inputFilter=false) + use_inputFilter=false, + dpDamper_nominal=0.27) "Supply air damper that closes the heat recovery" annotation (Placement(transformation(extent={{120,490},{140,510}}))); Buildings.Fluid.Actuators.Dampers.Exponential damRetByp( redeclare package Medium = MediumA, m_flow_nominal=2*VRoo*1.2*0.37/3600, - use_inputFilter=false) + use_inputFilter=false, + dpDamper_nominal=0.27) "Return air damper that bypasses the heat recovery" annotation (Placement(transformation(extent={{180,450},{160,470}}))); Modelica.StateGraph.InitialStep off "Pump and furnace off" @@ -725,7 +728,7 @@ equation smooth=Smooth.None)); connect(booToReaPum.y, pumBoi.y) annotation (Line( - points={{399,-120},{69.8,-120},{69.8,-158}}, + points={{399,-120},{70,-120},{70,-158}}, color={0,0,127}, smooth=Smooth.None)); connect(rad1.heatPortCon, roo1.heaPorAir) annotation (Line( @@ -787,7 +790,7 @@ equation color={0,127,255}, smooth=Smooth.None)); connect(fanSup.m_flow_in, m_flow_out.y) annotation (Line( - points={{79.8,512},{79.8,516},{80,516},{80,520},{60,520},{60,510},{21,510}}, + points={{80,512},{80,516},{80,516},{80,520},{60,520},{60,510},{21,510}}, color={0,0,127}, smooth=Smooth.None)); connect(fanRet.port_a, hex.port_b2) annotation (Line( @@ -803,7 +806,7 @@ equation color={0,127,255}, smooth=Smooth.None)); connect(m_flow_out.y, fanRet.m_flow_in) annotation (Line( - points={{21,510},{60,510},{60,476},{80.2,476},{80.2,472}}, + points={{21,510},{60,510},{60,476},{80,476},{80,472}}, color={0,0,127}, smooth=Smooth.None)); connect(lea1.port_b, roo1.ports[2]) annotation (Line( @@ -944,7 +947,7 @@ equation thickness=0.5, smooth=Smooth.None)); connect(conPum.y, pumRad.y) annotation (Line( - points={{141,70},{200,70},{200,9.8},{208,9.8}}, + points={{141,70},{200,70},{200,10},{208,10}}, color={0,0,127}, smooth=Smooth.None)); connect(TRoo1.T, conRoo1.u_m) annotation (Line( diff --git a/Buildings/Examples/ScalableBenchmarks/BuildingVAV/BaseClasses/VAVBranch.mo b/Buildings/Examples/ScalableBenchmarks/BuildingVAV/BaseClasses/VAVBranch.mo index 26fd7b00072..9852d8b112f 100644 --- a/Buildings/Examples/ScalableBenchmarks/BuildingVAV/BaseClasses/VAVBranch.mo +++ b/Buildings/Examples/ScalableBenchmarks/BuildingVAV/BaseClasses/VAVBranch.mo @@ -50,13 +50,15 @@ model VAVBranch "Supply branch of a VAV system" Modelica.Blocks.Interfaces.RealOutput yDam "Signal for VAV damper" annotation (Placement(transformation(extent={{200,-10},{220,10}}))); - Fluid.Actuators.Dampers.PressureIndependent vav( + Fluid.Actuators.Dampers.PressureIndependent vav( + dpDamper_nominal(displayUnit="Pa") = 20, redeclare package Medium = MediumA, m_flow_nominal=m_flow_nominal, - dpFixed_nominal=dpFixed_nominal, - dp_nominal(displayUnit="Pa") = 20) "VAV box for room" - annotation (Placement(transformation(extent={{-10,-10},{10,10}}, - rotation=90, origin={50,104}))); + dpFixed_nominal=dpFixed_nominal) "VAV box for room" annotation (Placement( + transformation( + extent={{-10,-10},{10,10}}, + rotation=90, + origin={50,104}))); Buildings.Fluid.HeatExchangers.DryCoilEffectivenessNTU terHea( redeclare package Medium1 = MediumA, redeclare package Medium2 = MediumW, diff --git a/Buildings/Examples/ScalableBenchmarks/BuildingVAV/Examples/OneFloor_OneZone.mo b/Buildings/Examples/ScalableBenchmarks/BuildingVAV/Examples/OneFloor_OneZone.mo index 5b40a4c96d0..bb4fe1ebf53 100644 --- a/Buildings/Examples/ScalableBenchmarks/BuildingVAV/Examples/OneFloor_OneZone.mo +++ b/Buildings/Examples/ScalableBenchmarks/BuildingVAV/Examples/OneFloor_OneZone.mo @@ -111,14 +111,17 @@ model OneFloor_OneZone "Closed-loop model with 1 zone in 1 floor" redeclare each package Medium = MediumA, each nPorts=2) "Ambient conditions" annotation (Placement(transformation(extent={{-320,32},{-306,46}}))); - Buildings.Fluid.Actuators.Dampers.MixingBox eco[nFlo]( + Buildings.Fluid.Actuators.Dampers.MixingBox eco[nFlo]( redeclare each package Medium = MediumA, each mOut_flow_nominal=m_flow_nominal, each mRec_flow_nominal=m_flow_nominal, each mExh_flow_nominal=m_flow_nominal, - each dpOut_nominal=10, - each dpRec_nominal=10, - each dpExh_nominal=10) "Economizer" + each dpDamExh_nominal=0.27, + each dpDamOut_nominal=0.27, + each dpDamRec_nominal=0.27, + each dpFixExh_nominal=10, + each dpFixOut_nominal=10, + each dpFixRec_nominal=10) "Economizer" annotation (Placement(transformation(extent={{-262,46},{-232,16}}))); Buildings.Fluid.Sensors.TemperatureTwoPort TMix[nFlo]( redeclare each package Medium = MediumA, diff --git a/Buildings/Examples/VAVCO2/BaseClasses/RoomVAV.mo b/Buildings/Examples/VAVCO2/BaseClasses/RoomVAV.mo index d1a75a5a50d..f69dd538336 100644 --- a/Buildings/Examples/VAVCO2/BaseClasses/RoomVAV.mo +++ b/Buildings/Examples/VAVCO2/BaseClasses/RoomVAV.mo @@ -8,13 +8,18 @@ model RoomVAV "Model for CO2 emitted by people" parameter Modelica.SIunits.Area ADam "Damper face area"; parameter Modelica.SIunits.MassFlowRate m_flow_nominal "Nominal mass flow rate"; - - Buildings.Fluid.Actuators.Dampers.VAVBoxExponential vav( + parameter Real l(min=1e-10, max=1) = 0.0001 + "Damper leakage, ratio of flow coefficients k(y=0)/k(y=1)" + annotation(Dialog(tab="Damper coefficients")); + Buildings.Fluid.Actuators.Dampers.Exponential vav( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, - dp_nominal=1E2, - from_dp=false) annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, + from_dp=false, + dpDamper_nominal=0.27, + dpFixed_nominal=1E2 - 0.27, + final l=l) + annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, rotation=270, origin={0,80}))); Buildings.Fluid.MixingVolumes.MixingVolume vol( diff --git a/Buildings/Examples/VAVCO2/BaseClasses/Suite.mo b/Buildings/Examples/VAVCO2/BaseClasses/Suite.mo index 1e16fe953df..cc77a537f06 100644 --- a/Buildings/Examples/VAVCO2/BaseClasses/Suite.mo +++ b/Buildings/Examples/VAVCO2/BaseClasses/Suite.mo @@ -11,7 +11,9 @@ model Suite "Model of a suite consisting of five rooms of the MIT system model" parameter Real scaM_flow "Scaling factor for mass flow rate"; parameter Modelica.SIunits.MassFlowRate m0Tot_flow= scaM_flow*(5.196+2.8428+1.0044+0.9612+0.3624+0.1584); - + parameter Real l(min=1e-10, max=1) = 0.0001 + "Damper leakage, ratio of flow coefficients k(y=0)/k(y=1)" + annotation(Dialog(tab="Damper coefficients")); Buildings.Fluid.FixedResistances.Junction spl34( redeclare package Medium = Medium, m_flow_nominal=scaM_flow*{1,-1,-1}, @@ -111,42 +113,48 @@ model Suite "Model of a suite consisting of five rooms of the MIT system model" ADam=scaM_flow*0.49, m_flow_nominal=scaM_flow*5.196, VRoo=1820, - VPle=396) "Room model" + VPle=396, + final l=l) "Room model" annotation (Placement(transformation(extent={{-30,10},{-10,30}}))); RoomVAV roo46( redeclare package Medium = Medium, ADam=scaM_flow*0.245, m_flow_nominal=scaM_flow*2.8428, VRoo=1210, - VPle=330) "Room model" + VPle=330, + final l=l) "Room model" annotation (Placement(transformation(extent={{30,10},{50,30}}))); RoomVAV roo47( redeclare package Medium = Medium, ADam=scaM_flow*0.128, m_flow_nominal=scaM_flow*1.0044, VRoo=647, - VPle=125) "Room model" + VPle=125, + final l=l) "Room model" annotation (Placement(transformation(extent={{90,10},{110,30}}))); RoomVAV roo48( redeclare package Medium = Medium, ADam=scaM_flow*0.128, m_flow_nominal=scaM_flow*0.9612, VRoo=385, - VPle=107) "Room model" + VPle=107, + final l=l) "Room model" annotation (Placement(transformation(extent={{150,10},{170,30}}))); RoomVAV roo49( redeclare package Medium = Medium, ADam=scaM_flow*0.0494, m_flow_nominal=scaM_flow*0.3624, VRoo=48, - VPle=13) "Room model" + VPle=13, + final l=l) "Room model" annotation (Placement(transformation(extent={{210,10},{230,30}}))); RoomVAV roo50( redeclare package Medium = Medium, ADam=scaM_flow*0.024, m_flow_nominal=scaM_flow*0.1584, VRoo=155, - VPle=43) "Room model" + VPle=43, + final l=l) "Room model" annotation (Placement(transformation(extent={{270,10},{290,30}}))); Occupancy occ "Occupancy" annotation (Placement(transformation(extent={{-80,-20},{-60,0}}))); diff --git a/Buildings/Examples/VAVCO2/VAVSystemCTControl.mo b/Buildings/Examples/VAVCO2/VAVSystemCTControl.mo index be5d1961515..75b68aed9a3 100644 --- a/Buildings/Examples/VAVCO2/VAVSystemCTControl.mo +++ b/Buildings/Examples/VAVCO2/VAVSystemCTControl.mo @@ -19,6 +19,9 @@ parameter Real scaDpFanSup_nominal = 1 "Scaling factor for supply fan pressure lift with NSui number of suites"; parameter Real scaDpFanRet_nominal = 1 "Scaling factor for supply fan pressure lift with NSui number of suites"; + parameter Real l(min=1e-10, max=1) = 6.708204E-04 + "Damper leakage, ratio of flow coefficients k(y=0)/k(y=1)" + annotation(Dialog(tab="Damper coefficients")); Modelica.Blocks.Sources.Constant PAtm(k=101325) annotation ( Placement(transformation(extent={{-80,-50},{-60,-30}}))); @@ -41,20 +44,28 @@ parameter Real scaDpFanRet_nominal = 1 redeclare package Medium = Medium, from_dp=true) annotation (Placement(transformation(extent={{80,-80},{60,-60}}))); -Buildings.Examples.VAVCO2.BaseClasses.Suite roo(redeclare package Medium = Medium, scaM_flow=scaM_flow) + Buildings.Examples.VAVCO2.BaseClasses.Suite roo( + redeclare package Medium = Medium, + scaM_flow=scaM_flow, + l=l) annotation (Placement(transformation(extent={{206,-92}, {310,20}}))); Fluid.Actuators.Dampers.MixingBox mixBox( - dpOut_nominal=0.467, - dpRec_nominal=0.665, mOut_flow_nominal=scaM_flow*1, mRec_flow_nominal=scaM_flow*1, mExh_flow_nominal=scaM_flow*1, redeclare package Medium = Medium, - dpExh_nominal=0.467, allowFlowReversal=true, from_dp=false, - use_inputFilter=false) "mixing box" + use_inputFilter=false, + dpDamExh_nominal=0.27, + dpDamOut_nominal=0.27, + dpDamRec_nominal=0.27, + dpFixExh_nominal=0.467, + dpFixOut_nominal=0.467, + dpFixRec_nominal=0.665, + l=l) + "mixing box" annotation (Placement(transformation(extent={{6,-76},{30,-52}}))); Buildings.Fluid.Sources.Boundary_pT bouIn( redeclare package Medium = Medium, @@ -71,7 +82,7 @@ Buildings.Examples.VAVCO2.BaseClasses.Suite roo(redeclare package Medium = Mediu initType=Modelica.Blocks.Types.InitPID.InitialState, controllerType=Modelica.Blocks.Types.SimpleController.P) "Controller for supply fan" - annotation (Placement(transformation(extent={{-20,60},{0,80}}))); + annotation (Placement(transformation(extent={{-20,60},{0,80}}))); Buildings.Fluid.Movers.FlowControlled_dp fan32( redeclare package Medium = Medium, per(pressure(final V_flow={0,11.08,14.9}, dp={1508,743,100})), @@ -173,7 +184,7 @@ equation connect(off.y, switch1.u3) annotation (Line(points={{-69,102},{18,102}}, color={0,0,127})); connect(conSupFan.u_s, booToRea.y) - annotation (Line(points={{-22,70},{-29,70}}, color={0,0,127})); + annotation (Line(points={{-22,70},{-28,70}}, color={0,0,127})); connect(onSig.y, booToRea.u) annotation (Line(points={{-69,70},{-52,70}}, color={255,0,255})); connect(onSig.y, switch1.u2) annotation (Line(points={{-69,70},{-60,70},{-60,110}, @@ -181,9 +192,9 @@ equation connect(switch1.y, ramLim.u) annotation (Line(points={{41,110},{48,110}}, color={0,0,127})); connect(dp32.u, ramLim.y) - annotation (Line(points={{88,110},{71,110}}, color={0,0,127})); - connect(dp56.u, ramLim.y) annotation (Line(points={{88,80},{80,80},{80,110},{ - 71,110}}, color={0,0,127})); + annotation (Line(points={{88,110},{72,110}}, color={0,0,127})); + connect(dp56.u, ramLim.y) annotation (Line(points={{88,80},{80,80},{80,110},{72, + 110}}, color={0,0,127})); annotation (Diagram(coordinateSystem(preserveAspectRatio=false,extent={{-100, -100},{350,150}})), Documentation(info=" diff --git a/Buildings/Examples/VAVReheat/BaseClasses/MixingBox.mo b/Buildings/Examples/VAVReheat/BaseClasses/MixingBox.mo index 3f80d1d2397..f465e68ef8b 100644 --- a/Buildings/Examples/VAVReheat/BaseClasses/MixingBox.mo +++ b/Buildings/Examples/VAVReheat/BaseClasses/MixingBox.mo @@ -67,9 +67,6 @@ model MixingBox annotation (Dialog(tab="Damper coefficients")); parameter Real yU=55/90 "Upper value for damper curve" annotation (Dialog(tab="Damper coefficients")); - parameter Real k0=1E6 - "Flow coefficient for y=0, k0 = pressure drop divided by dynamic pressure" - annotation (Dialog(tab="Damper coefficients")); parameter Real k1=0.45 "Flow coefficient for y=1, k1 = pressure drop divided by dynamic pressure" annotation (Dialog(tab="Damper coefficients")); @@ -141,10 +138,8 @@ model MixingBox "Fluid connector b (positive design flow direction is from port_a to port_b)" annotation (Placement(transformation(extent={{110,50},{90,70}}))); - Fluid.Actuators.Dampers.VAVBoxExponential damOut( + Fluid.Actuators.Dampers.Exponential damOut( redeclare package Medium = Medium, - dp_nominal=dpOut_nominal, - dp_nominalIncludesDamper=dp_nominalIncludesDamper, from_dp=from_dp, linearized=linearized, use_deltaM=use_deltaM, @@ -155,22 +150,22 @@ model MixingBox b=b, yL=yL, yU=yU, - k0=k0, - k1=k1, use_constant_density=use_constant_density, allowFlowReversal=allowFlowReversal, m_flow_nominal=mOut_flow_nominal, use_inputFilter=true, final riseTime=riseTime, final init=init, - y_start=y_start) "Outdoor air damper" + y_start=y_start, + dpDamper_nominal=(k1)*1.2*(1)^2/2, + dpFixed_nominal=if (dp_nominalIncludesDamper) then (dpOut_nominal) - (k1)* + 1.2*(1)^2/2 else (dpOut_nominal), + k1=k1) "Outdoor air damper" annotation (Placement(transformation(extent={{-10,50},{10,70}}))); - Fluid.Actuators.Dampers.VAVBoxExponential damExh( + Fluid.Actuators.Dampers.Exponential damExh( redeclare package Medium = Medium, m_flow_nominal=mExh_flow_nominal, - dp_nominal=dpExh_nominal, - dp_nominalIncludesDamper=dp_nominalIncludesDamper, from_dp=from_dp, linearized=linearized, use_deltaM=use_deltaM, @@ -181,21 +176,21 @@ model MixingBox b=b, yL=yL, yU=yU, - k0=k0, - k1=k1, use_constant_density=use_constant_density, allowFlowReversal=allowFlowReversal, use_inputFilter=true, final riseTime=riseTime, final init=init, - y_start=y_start) "Exhaust air damper" + y_start=y_start, + dpDamper_nominal=(k1)*1.2*(1)^2/2, + dpFixed_nominal=if (dp_nominalIncludesDamper) then (dpExh_nominal) - (k1)* + 1.2*(1)^2/2 else (dpExh_nominal), + k1=k1) "Exhaust air damper" annotation (Placement(transformation(extent={{-20,-70},{-40,-50}}))); - Fluid.Actuators.Dampers.VAVBoxExponential damRet( + Fluid.Actuators.Dampers.Exponential damRet( redeclare package Medium = Medium, m_flow_nominal=mRec_flow_nominal, - dp_nominal=dpRec_nominal, - dp_nominalIncludesDamper=dp_nominalIncludesDamper, from_dp=from_dp, linearized=linearized, use_deltaM=use_deltaM, @@ -206,15 +201,16 @@ model MixingBox b=b, yL=yL, yU=yU, - k0=k0, - k1=k1, use_constant_density=use_constant_density, allowFlowReversal=allowFlowReversal, use_inputFilter=true, final riseTime=riseTime, final init=init, - y_start=y_start) "Return air damper" annotation ( - Placement(transformation( + y_start=y_start, + dpDamper_nominal=(k1)*1.2*(1)^2/2, + dpFixed_nominal=if (dp_nominalIncludesDamper) then (dpRec_nominal) - (k1)* + 1.2*(1)^2/2 else (dpRec_nominal), + k1=k1) "Return air damper" annotation (Placement(transformation( origin={80,0}, extent={{-10,-10},{10,10}}, rotation=90))); diff --git a/Buildings/Examples/VAVReheat/ThermalZones/VAVBranch.mo b/Buildings/Examples/VAVReheat/ThermalZones/VAVBranch.mo index 118a1183a8e..d75e2a27928 100644 --- a/Buildings/Examples/VAVReheat/ThermalZones/VAVBranch.mo +++ b/Buildings/Examples/VAVReheat/ThermalZones/VAVBranch.mo @@ -16,7 +16,7 @@ model VAVBranch "Supply branch of a VAV system" Buildings.Fluid.Actuators.Dampers.PressureIndependent vav( redeclare package Medium = MediumA, m_flow_nominal=m_flow_nominal, - dp_nominal = 220 + 20, + dpDamper_nominal=220 + 20, allowFlowReversal=allowFlowReversal) "VAV box for room" annotation ( Placement(transformation( extent={{-10,-10},{10,10}}, diff --git a/Buildings/Fluid/Actuators/BaseClasses/PartialDamperExponential.mo b/Buildings/Fluid/Actuators/BaseClasses/PartialDamperExponential.mo index 0111b0ed55a..a47930bd0da 100644 --- a/Buildings/Fluid/Actuators/BaseClasses/PartialDamperExponential.mo +++ b/Buildings/Fluid/Actuators/BaseClasses/PartialDamperExponential.mo @@ -1,74 +1,116 @@ within Buildings.Fluid.Actuators.BaseClasses; partial model PartialDamperExponential "Partial model for air dampers with exponential opening characteristics" - extends Buildings.Fluid.BaseClasses.PartialResistance( - m_flow_turbulent=if use_deltaM then deltaM * m_flow_nominal else + extends Buildings.Fluid.BaseClasses.PartialResistance( + final dp_nominal=dpDamper_nominal+dpFixed_nominal, + final m_flow_turbulent=if use_deltaM then deltaM * m_flow_nominal else eta_default*ReC*sqrt(A)*facRouDuc); - extends Buildings.Fluid.Actuators.BaseClasses.ActuatorSignal; - - parameter Boolean use_deltaM = true + extends Buildings.Fluid.Actuators.BaseClasses.ActuatorSignal; + parameter Modelica.SIunits.PressureDifference dpDamper_nominal(displayUnit="Pa") + "Pressure drop of fully open damper at nominal mass flow rate" + annotation(Dialog(group = "Nominal condition")); + parameter Modelica.SIunits.PressureDifference dpFixed_nominal(displayUnit="Pa") = 0 + "Pressure drop of duct and resistances other than the damper in series, at nominal mass flow rate" + annotation(Dialog(group = "Nominal condition")); + parameter Boolean use_deltaM = true "Set to true to use deltaM for turbulent transition, else ReC is used"; - parameter Real deltaM = 0.3 + parameter Real deltaM = 0.3 "Fraction of nominal mass flow rate where transition to turbulent occurs" - annotation(Dialog(enable=use_deltaM)); - parameter Modelica.SIunits.Velocity v_nominal = 1 "Nominal face velocity"; - final parameter Modelica.SIunits.Area A=m_flow_nominal/rho_default/v_nominal + annotation(Dialog(enable=use_deltaM)); + final parameter Modelica.SIunits.Velocity v_nominal= + (2 / rho_default / k1 * dpDamper_nominal)^0.5 + "Nominal face velocity"; + final parameter Modelica.SIunits.Area A=m_flow_nominal/rho_default/v_nominal "Face area"; - - parameter Boolean roundDuct = false + parameter Boolean roundDuct = false "Set to true for round duct, false for square cross section" - annotation(Dialog(enable=not use_deltaM)); - parameter Real ReC=4000 "Reynolds number where transition to turbulent starts" - annotation(Dialog(enable=not use_deltaM)); - parameter Real a(unit="")=-1.51 "Coefficient a for damper characteristics" - annotation(Dialog(tab="Damper coefficients")); - parameter Real b(unit="")=0.105*90 "Coefficient b for damper characteristics" - annotation(Dialog(tab="Damper coefficients")); - parameter Real yL = 15/90 "Lower value for damper curve" - annotation(Dialog(tab="Damper coefficients")); - parameter Real yU = 55/90 "Upper value for damper curve" - annotation(Dialog(tab="Damper coefficients")); - parameter Real k0(min=0) = 1E6 - "Flow coefficient for y=0, k0 = pressure drop divided by dynamic pressure" - annotation(Dialog(tab="Damper coefficients")); - parameter Real k1(min=0) = 0.45 - "Flow coefficient for y=1, k1 = pressure drop divided by dynamic pressure" - annotation(Dialog(tab="Damper coefficients")); - parameter Boolean use_constant_density=true + annotation(Dialog(enable=not use_deltaM)); + parameter Real ReC=4000 "Reynolds number where transition to turbulent starts" + annotation(Dialog(enable=not use_deltaM)); + parameter Real a(unit="1")=-1.51 "Coefficient a for damper characteristics" + annotation(Dialog(tab="Damper coefficients")); + parameter Real b(unit="1")=0.105*90 "Coefficient b for damper characteristics" + annotation(Dialog(tab="Damper coefficients")); + parameter Real yL(unit="1") = 15/90 "Lower value for damper curve" + annotation(Dialog(tab="Damper coefficients")); + parameter Real yU(unit="1") = 55/90 "Upper value for damper curve" + annotation(Dialog(tab="Damper coefficients")); + final parameter Real k0(min=0, unit="1") = 2 * rho_default * (A / kDamMin)^2 + "Loss coefficient for y=0 (pressure drop divided by dynamic pressure)" + annotation(Dialog(tab="Damper coefficients")); + parameter Real k1(min=0, unit="1") = 0.45 + "Loss coefficient for y=1 (pressure drop divided by dynamic pressure)" + annotation(Dialog(tab="Damper coefficients")); + parameter Real l(min=1e-10, max=1) = 0.0001 + "Damper leakage, ratio of flow coefficients k(y=0)/k(y=1)" + annotation(Dialog(tab="Damper coefficients")); + parameter Boolean use_constant_density=true "Set to true to use constant density for flow friction" - annotation (Evaluate=true, Dialog(tab="Advanced")); - Medium.Density rho "Medium density"; - parameter Real kFixed(unit="") + annotation (Evaluate=true, Dialog(tab="Advanced")); + Medium.Density rho "Medium density"; + final parameter Real kFixed = if dpFixed_nominal > Modelica.Constants.eps then + m_flow_nominal / sqrt(dpFixed_nominal) else Modelica.Constants.inf "Flow coefficient of fixed resistance that may be in series with damper, k=m_flow/sqrt(dp), with unit=(kg.m)^(1/2)."; - Real kDam(unit="") + Real kDam "Flow coefficient of damper, k=m_flow/sqrt(dp), with unit=(kg.m)^(1/2)"; - Real k(unit="") + Real k "Flow coefficient of damper plus fixed resistance, k=m_flow/sqrt(dp), with unit=(kg.m)^(1/2)"; protected - parameter Medium.Density rho_default=Medium.density(sta_default) + parameter Medium.Density rho_default=Medium.density(sta_default) "Density, used to compute fluid volume"; - parameter Real[3] cL= - {(Modelica.Math.log(k0) - b - a)/yL^2, - (-b*yL - 2*Modelica.Math.log(k0) + 2*b + 2*a)/yL, - Modelica.Math.log(k0)} "Polynomial coefficients for curve fit for y < yl"; - parameter Real[3] cU= - {(Modelica.Math.log(k1) - a)/(yU^2 - 2*yU + 1), + parameter Real facRouDuc= if roundDuct then sqrt(Modelica.Constants.pi)/2 else 1 + "Shape factor used to compute the hydraulic diameter for round ducts"; + parameter Real kL = Buildings.Fluid.Actuators.BaseClasses.exponentialDamper( + y=yL, a=a, b=b, cL=cL, cU=cU, yL=yL, yU=yU)^2 + "Loss coefficient at the lower limit of the exponential characteristics"; + parameter Real kU = Buildings.Fluid.Actuators.BaseClasses.exponentialDamper( + y=yU, a=a, b=b, cL=cL, cU=cU, yL=yL, yU=yU)^2 + "Loss coefficient at the upper limit of the exponential characteristics"; + parameter Real[3] cL={ + (Modelica.Math.log(k0) - b - a)/yL^2, + (-b*yL - 2*Modelica.Math.log(k0) + 2*b + 2*a)/yL, + Modelica.Math.log(k0)} "Polynomial coefficients for curve fit for y < yl"; + parameter Real[3] cU={ + (Modelica.Math.log(k1) - a)/(yU^2 - 2*yU + 1), (-b*yU^2 - 2*Modelica.Math.log(k1)*yU - (-2*b - 2*a)*yU - b)/(yU^2 - 2*yU + 1), (Modelica.Math.log(k1)*yU^2 + b*yU^2 + (-2*b - 2*a)*yU + b + a)/(yU^2 - 2*yU + 1)} "Polynomial coefficients for curve fit for y > yu"; - parameter Real facRouDuc= if roundDuct then sqrt(Modelica.Constants.pi)/2 else 1; + parameter Real kDamMax = (2 * rho_default / k1)^0.5 * A + "Flow coefficient of damper fully open, k=m_flow/sqrt(dp), with unit=(kg.m)^(1/2)"; + parameter Real kTotMax = if dpFixed_nominal > Modelica.Constants.eps then + sqrt(1 / (1 / kFixed^2 + 1 / kDamMax^2)) else kDamMax + "Flow coefficient of damper fully open plus fixed resistance, with unit=(kg.m)^(1/2)"; + parameter Real kDamMin = l * kDamMax + "Flow coefficient of damper fully closed, with unit=(kg.m)^(1/2)"; + parameter Real kTotMin = if dpFixed_nominal > Modelica.Constants.eps then + sqrt(1 / (1 / kFixed^2 + 1 / kDamMin^2)) else kDamMin + "Flow coefficient of damper fully closed + fixed resistance, with unit=(kg.m)^(1/2)"; initial equation - assert(k0 > k1, "k0 must be between k1 and 1e6."); - assert(m_flow_turbulent > 0, "m_flow_turbulent must be bigger than zero."); - assert(k1 >= 0.2, "k1 must be between 0.2 and 0.5."); - assert(k1 <= 0.5, "k1 must be between 0.2 and 0.5."); - assert(k0 <= 1e6, "k0 must be between k1 and 1e6."); + assert(dpDamper_nominal > Modelica.Constants.eps, + "In " + getInstanceName() + ": dpDamper_nominal must be strictly greater than zero."); + assert(dpFixed_nominal >= 0, + "In " + getInstanceName() + ": dpFixed_nominal must be greater than zero."); + assert(yL < yU, + "In " + getInstanceName() + ": yL must be strictly lower than yU."); + assert(m_flow_turbulent > 0, + "In " + getInstanceName() + ": m_flow_turbulent must be strictly greater than zero."); + assert(k1 >= 0.2, + "In " + getInstanceName() + ": k1 must be greater than 0.2. k1=" + String(k1)); + assert(k1 < kU, + "In " + getInstanceName() + ": k1 must be strictly lower than exp(a + b * (1 - yU)). k1=" + + String(k1) + ", exp(...) = " + String(kU)); + assert(k0 <= 1e10, + "In " + getInstanceName() + ": k0 must be lower than 1e10. k0=" + String(k0)); + assert(k0 > kL, + "In " + getInstanceName() + ": k0 must be strictly higher than exp(a + b * (1 - yL)). k0=" + + String(k0) + ", exp(...) = " + String(kL)); equation rho = if use_constant_density then - rho_default - else - Medium.density(Medium.setState_phX(port_a.p, inStream(port_a.h_outflow), inStream(port_a.Xi_outflow))); - // flow coefficient, k=m_flow/sqrt(dp) + rho_default + else + Medium.density(Medium.setState_phX( + port_a.p, inStream(port_a.h_outflow), inStream(port_a.Xi_outflow))); + // flow coefficient, k = m_flow/sqrt(dp) kDam=sqrt(2*rho)*A/Buildings.Fluid.Actuators.BaseClasses.exponentialDamper( y=y_actual, a=a, @@ -77,53 +119,101 @@ equation cU=cU, yL=yL, yU=yU); - k = if (kFixed>Modelica.Constants.eps) then sqrt(1/(1/kFixed^2 + 1/kDam^2)) else kDam; - // Pressure drop calculation - if linearized then - m_flow*m_flow_nominal_pos = k^2*dp; - else - if homotopyInitialization then - if from_dp then - m_flow=homotopy( - actual=Buildings.Fluid.BaseClasses.FlowModels.basicFlowFunction_dp( - dp=dp, k=k, - m_flow_turbulent=m_flow_turbulent), - simplified=m_flow_nominal_pos*dp/dp_nominal_pos); - else - dp=homotopy( - actual=Buildings.Fluid.BaseClasses.FlowModels.basicFlowFunction_m_flow( - m_flow=m_flow, k=k, - m_flow_turbulent=m_flow_turbulent), - simplified=dp_nominal_pos*m_flow/m_flow_nominal_pos); - end if; // from_dp - else // do not use homotopy - if from_dp then - m_flow=Buildings.Fluid.BaseClasses.FlowModels.basicFlowFunction_dp( - dp=dp, k=k, m_flow_turbulent=m_flow_turbulent); - else - dp=Buildings.Fluid.BaseClasses.FlowModels.basicFlowFunction_m_flow( - m_flow=m_flow, k=k, m_flow_turbulent=m_flow_turbulent); - end if; // from_dp - end if; // homotopyInitialization - end if; // linearized + k = if dpFixed_nominal > Modelica.Constants.eps then sqrt(1/(1/kFixed^2 + 1/kDam^2)) else kDam; annotation(Documentation(info="

Partial model for air dampers with exponential opening characteristics. -This is the base model for air dampers and variable air volume flow boxes. -The model implements the functions that relate the opening signal, -the pressure drop and the mass flow rate. +This is the base model for air dampers. +The model implements the functions that relate the opening signal and the +flow coefficient. The model also defines parameters that are used by different air damper models.

-For a description of the opening characteristics and typical parameter values, see the damper model - -Buildings.Fluid.Actuators.Dampers.Exponential. +The model is as in ASHRAE 825-RP except that a control signal of +y=0 means the damper is closed, and y=1 means +the damper is open. +This is opposite of the implementation of ASHRAE 825-RP, but used here +for consistency within this library. +

+

+For yL < y < yU, the damper characteristics is: +

+

+ kd(y) = exp(a+b (1-y)) +

+

+where kd is the loss coefficient (total pressure drop divided +by dynamic pressure) and y is the fractional opening. +

+

+Outside this range, the damper characteristics is defined by a quadratic polynomial that +matches the damper resistance at y=0 and y=yL or +y=yU and y=1, respectively. +In addition, the polynomials are such that kd(y) is differentiable in +y and the derivative is continuous. +

+

+The damper characteristics is then used to compute the flow coefficient k(y) as: +

+

+k(y) = (2 ρ ⁄ kd(y))1/2 A +

+

+where A is the face area, which is computed using the nominal +mass flow rate m_flow_nominal, the nominal velocity +v_nominal and the density of the medium. +

+

+ASHRAE 825-RP lists the following parameter values as typical (note that the +default values in the model correspond to opposed blades). +
+

+ + + + + + + + + + + + + + + + + + + +
opposed bladessingle blades
yL15/9015/90
yU55/9065/90
k10.2 to 0.50.2 to 0.5
a-1.51-1.51
b0.105*900.0842*90
+

+(The loss coefficient in fully closed position k0 is computed based on the leakage coefficient +and the coefficient in fully open position.) +

+

References

+

+P. Haves, L. K. Norford, M. DeSimone and L. Mei, +A Standard Simulation Testbed for the Evaluation of Control Algorithms & Strategies, +ASHRAE Final Report 825-RP, Atlanta, GA.

", revisions="