Buildings.Fluid.Actuators.Dampers

Package with air damper models

Information

This package contains component models for air dampers. For motor models, see Buildings.Fluid.Actuators.Motors.

Extends from Modelica.Icons.VariantsPackage (Icon for package containing variants).

Package Content

Name Description
Buildings.Fluid.Actuators.Dampers.Exponential Exponential Air damper with exponential opening characteristics
Buildings.Fluid.Actuators.Dampers.MixingBox MixingBox Outside air mixing box with interlocked air dampers
Buildings.Fluid.Actuators.Dampers.MixingBoxMinimumFlow MixingBoxMinimumFlow Outside air mixing box with parallel damper for minimum outside air flow rate
Buildings.Fluid.Actuators.Dampers.PressureIndependent PressureIndependent Model for an air damper whose mass flow is proportional to the input signal
Buildings.Fluid.Actuators.Dampers.Examples Examples Collection of models that illustrate model use and test models
Buildings.Fluid.Actuators.Dampers.Validation Validation Collection of validation models

Buildings.Fluid.Actuators.Dampers.Exponential Buildings.Fluid.Actuators.Dampers.Exponential

Air damper with exponential opening characteristics

Buildings.Fluid.Actuators.Dampers.Exponential

Information

Model of two flow resistances in series:

The lumped flow coefficient k(y) (function of the fractional opening y) is used to compute the mass flow rate versus pressure drop relation as:

ṁ = sign(Δp) k(y) √ Δp  

with regularization near the origin.

For a description of the damper opening characteristics and typical parameter values, see the partial model Buildings.Fluid.Actuators.BaseClasses.PartialDamperExponential.

Extends from Buildings.Fluid.Actuators.BaseClasses.PartialDamperExponential (Partial model for air dampers with exponential opening characteristics).

Parameters

TypeNameDefaultDescription
replaceable package MediumPartialMediumMedium in the component
Booleanuse_deltaMtrueSet to true to use deltaM for turbulent transition, else ReC is used
RealdeltaM0.3Fraction of nominal mass flow rate where transition to turbulent occurs
BooleanroundDuctfalseSet to true for round duct, false for square cross section
RealReC4000Reynolds number where transition to turbulence starts
Nominal condition
MassFlowRatem_flow_nominal Nominal mass flow rate [kg/s]
PressureDifferencedpDamper_nominal Pressure drop of fully open damper at nominal mass flow rate [Pa]
PressureDifferencedpFixed_nominal0Pressure drop of duct and resistances other than the damper in series, at nominal mass flow rate [Pa]
Assumptions
BooleanallowFlowReversaltrue= false to simplify equations, assuming, but not enforcing, no flow reversal
Advanced
Diagnostics
Booleanshow_Tfalse= true, if actual temperature at port is computed
Booleanfrom_dpfalse= true, use m_flow = f(dp) else dp = f(m_flow)
Booleanlinearizedfalse= true, use linear relation between m_flow and dp for any flow rate
Booleanuse_constant_densitytrueSet to true to use constant density for flow friction
Dynamics
Filtered opening
Booleanuse_inputFiltertrue= true, if opening is filtered with a 2nd order CriticalDamping filter
TimeriseTime120Rise time of the filter (time to reach 99.6 % of an opening step) [s]
InitinitModelica.Blocks.Types.Init.I...Type of initialization (no init/steady state/initial state/initial output)
Realy_start1Initial position of actuator
Damper coefficients
Reala-1.51Coefficient a for damper characteristics [1]
Realb0.105*90Coefficient b for damper characteristics [1]
RealyL15/90Lower value for damper curve [1]
RealyU55/90Upper value for damper curve [1]
Realk10.45Loss coefficient for y=1 (pressure drop divided by dynamic pressure) [1]
Reall0.0001Damper leakage, ratio of flow coefficients k(y=0)/k(y=1)

Connectors

TypeNameDescription
FluidPort_aport_aFluid connector a (positive design flow direction is from port_a to port_b)
FluidPort_bport_bFluid connector b (positive design flow direction is from port_a to port_b)
input RealInputyActuator position (0: closed, 1: open)
output RealOutputy_actualActual actuator position

Modelica definition

model Exponential "Air damper with exponential opening characteristics" extends Buildings.Fluid.Actuators.BaseClasses.PartialDamperExponential; equation // 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/max(Modelica.Constants.eps, 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 end Exponential;

Buildings.Fluid.Actuators.Dampers.MixingBox Buildings.Fluid.Actuators.Dampers.MixingBox

Outside air mixing box with interlocked air dampers

Buildings.Fluid.Actuators.Dampers.MixingBox

Information

Model of an outside air mixing box with exponential dampers. Set y=0 to close the outside air and exhaust air dampers. See Buildings.Fluid.Actuators.Dampers.Exponential for the description of the exponential damper model.

Extends from Buildings.Fluid.Actuators.BaseClasses.ActuatorSignal (Partial model that implements the filtered opening for valves and dampers).

Parameters

TypeNameDefaultDescription
replaceable package MediumModelica.Media.Interfaces.Pa...Medium in the component
Booleanuse_deltaMtrueSet to true to use deltaM for turbulent transition, else ReC is used
RealdeltaM0.3Fraction of nominal mass flow rate where transition to turbulent occurs
BooleanroundDuctfalseSet to true for round duct, false for square cross section
RealReC4000Reynolds number where transition to turbulence starts
Nominal condition
MassFlowRatemOut_flow_nominal Mass flow rate outside air damper [kg/s]
PressureDifferencedpDamOut_nominal Pressure drop of damper in outside air leg [Pa]
PressureDifferencedpFixOut_nominal0Pressure drop of duct and other resistances in outside air leg [Pa]
MassFlowRatemRec_flow_nominal Mass flow rate recirculation air damper [kg/s]
PressureDifferencedpDamRec_nominal Pressure drop of damper in recirculation air leg [Pa]
PressureDifferencedpFixRec_nominal0Pressure drop of duct and other resistances in recirculation air leg [Pa]
MassFlowRatemExh_flow_nominal Mass flow rate exhaust air damper [kg/s]
PressureDifferencedpDamExh_nominal Pressure drop of damper in exhaust air leg [Pa]
PressureDifferencedpFixExh_nominal0Pressure drop of duct and other resistances in exhaust air leg [Pa]
Dynamics
Filtered opening
Booleanuse_inputFiltertrue= true, if opening is filtered with a 2nd order CriticalDamping filter
TimeriseTime120Rise time of the filter (time to reach 99.6 % of an opening step) [s]
InitinitModelica.Blocks.Types.Init.I...Type of initialization (no init/steady state/initial state/initial output)
Realy_start1Initial position of actuator
Assumptions
BooleanallowFlowReversaltrue= false to simplify equations, assuming, but not enforcing, no flow reversal
Advanced
Booleanfrom_dptrue= true, use m_flow = f(dp) else dp = f(m_flow)
Booleanlinearizedfalse= true, use linear relation between m_flow and dp for any flow rate
Booleanuse_constant_densitytrueSet to true to use constant density for flow friction
Damper coefficients
Reala-1.51Coefficient a for damper characteristics
Realb0.105*90Coefficient b for damper characteristics
RealyL15/90Lower value for damper curve
RealyU55/90Upper value for damper curve
Realk10.45Flow coefficient for y=1, k1 = pressure drop divided by dynamic pressure
Reall0.0001Damper leakage, ratio of flow coefficients k(y=0)/k(y=1)

Connectors

TypeNameDescription
input RealInputyActuator position (0: closed, 1: open)
output RealOutputy_actualActual actuator position
replaceable package MediumMedium in the component
FluidPort_aport_OutFluid connector a (positive design flow direction is from port_a to port_b)
FluidPort_bport_ExhFluid connector b (positive design flow direction is from port_a to port_b)
FluidPort_aport_RetFluid connector a (positive design flow direction is from port_a to port_b)
FluidPort_bport_SupFluid connector b (positive design flow direction is from port_a to port_b)

Modelica definition

model MixingBox "Outside air mixing box with interlocked air dampers" extends Buildings.Fluid.Actuators.BaseClasses.ActuatorSignal; replaceable package Medium = Modelica.Media.Interfaces.PartialMedium "Medium in the component"; import Modelica.Constants; parameter Boolean allowFlowReversal = true "= false to simplify equations, assuming, but not enforcing, no flow reversal"; parameter Boolean use_deltaM = true "Set to true to use deltaM for turbulent transition, else ReC is used"; parameter Real deltaM = 0.3 "Fraction of nominal mass flow rate where transition to turbulent occurs"; parameter Boolean roundDuct = false "Set to true for round duct, false for square cross section"; parameter Real ReC=4000 "Reynolds number where transition to turbulence starts"; parameter Modelica.Units.SI.MassFlowRate mOut_flow_nominal "Mass flow rate outside air damper"; parameter Modelica.Units.SI.PressureDifference dpDamOut_nominal(min=0, displayUnit="Pa") "Pressure drop of damper in outside air leg"; parameter Modelica.Units.SI.PressureDifference dpFixOut_nominal( min=0, displayUnit="Pa") = 0 "Pressure drop of duct and other resistances in outside air leg"; parameter Modelica.Units.SI.MassFlowRate mRec_flow_nominal "Mass flow rate recirculation air damper"; parameter Modelica.Units.SI.PressureDifference dpDamRec_nominal(min=0, displayUnit="Pa") "Pressure drop of damper in recirculation air leg"; parameter Modelica.Units.SI.PressureDifference dpFixRec_nominal( min=0, displayUnit="Pa") = 0 "Pressure drop of duct and other resistances in recirculation air leg"; parameter Modelica.Units.SI.MassFlowRate mExh_flow_nominal "Mass flow rate exhaust air damper"; parameter Modelica.Units.SI.PressureDifference dpDamExh_nominal(min=0, displayUnit="Pa") "Pressure drop of damper in exhaust air leg"; parameter Modelica.Units.SI.PressureDifference dpFixExh_nominal( min=0, displayUnit="Pa") = 0 "Pressure drop of duct and other resistances in exhaust air leg"; parameter Boolean from_dp=true "= true, use m_flow = f(dp) else dp = f(m_flow)"; parameter Boolean linearized=false "= true, use linear relation between m_flow and dp for any flow rate"; parameter Boolean use_constant_density=true "Set to true to use constant density for flow friction"; parameter Real a=-1.51 "Coefficient a for damper characteristics"; parameter Real b=0.105*90 "Coefficient b for damper characteristics"; parameter Real yL=15/90 "Lower value for damper curve"; parameter Real yU=55/90 "Upper value for damper curve"; parameter Real k1=0.45 "Flow coefficient for y=1, k1 = pressure drop divided by dynamic pressure"; parameter Real l(min=1e-10, max=1) = 0.0001 "Damper leakage, ratio of flow coefficients k(y=0)/k(y=1)"; Modelica.Fluid.Interfaces.FluidPort_a port_Out(redeclare package Medium = Medium, m_flow(start=0, min=if allowFlowReversal then -Constants.inf else 0)) "Fluid connector a (positive design flow direction is from port_a to port_b)"; Modelica.Fluid.Interfaces.FluidPort_b port_Exh(redeclare package Medium = Medium, m_flow(start=0, max=if allowFlowReversal then +Constants.inf else 0)) "Fluid connector b (positive design flow direction is from port_a to port_b)"; Modelica.Fluid.Interfaces.FluidPort_a port_Ret(redeclare package Medium = Medium, m_flow(start=0, min=if allowFlowReversal then -Constants.inf else 0)) "Fluid connector a (positive design flow direction is from port_a to port_b)"; Modelica.Fluid.Interfaces.FluidPort_b port_Sup(redeclare package Medium = Medium, m_flow(start=0, max=if allowFlowReversal then +Constants.inf else 0)) "Fluid connector b (positive design flow direction is from port_a to port_b)"; Buildings.Fluid.Actuators.Dampers.Exponential damOA( redeclare final package Medium = Medium, final m_flow_nominal=mOut_flow_nominal, final dpDamper_nominal=dpDamOut_nominal, final dpFixed_nominal=dpFixOut_nominal, final from_dp=from_dp, final linearized=linearized, final use_deltaM=use_deltaM, final deltaM=deltaM, final roundDuct=roundDuct, final ReC=ReC, final a=a, final b=b, final yL=yL, final yU=yU, final l=l, final k1=k1, final use_constant_density=use_constant_density, final allowFlowReversal=allowFlowReversal, final use_inputFilter=false) "Outdoor air damper"; Buildings.Fluid.Actuators.Dampers.Exponential damExh( redeclare final package Medium = Medium, final m_flow_nominal=mExh_flow_nominal, final dpDamper_nominal=dpDamExh_nominal, final dpFixed_nominal=dpFixExh_nominal, final from_dp=from_dp, final linearized=linearized, final use_deltaM=use_deltaM, final deltaM=deltaM, final roundDuct=roundDuct, final ReC=ReC, final a=a, final b=b, final yL=yL, final yU=yU, final l=l, final k1=k1, final use_constant_density=use_constant_density, final allowFlowReversal=allowFlowReversal, final use_inputFilter=false) "Exhaust air damper"; Buildings.Fluid.Actuators.Dampers.Exponential damRec( redeclare final package Medium = Medium, final m_flow_nominal=mRec_flow_nominal, final dpDamper_nominal=dpDamRec_nominal, final dpFixed_nominal=dpFixRec_nominal, final from_dp=from_dp, final linearized=linearized, final use_deltaM=use_deltaM, final deltaM=deltaM, final roundDuct=roundDuct, final ReC=ReC, final a=a, final b=b, final yL=yL, final yU=yU, final l=l, final k1=k1, final use_constant_density=use_constant_density, final allowFlowReversal=allowFlowReversal, final use_inputFilter=false) "Recirculation air damper"; Modelica.Blocks.Sources.Constant uni(k=1) "Unity signal"; Modelica.Blocks.Math.Add add(k2=-1) "Adder"; protected parameter Medium.Density rho_default=Medium.density(sta_default) "Density, used to compute fluid volume"; parameter Medium.ThermodynamicState sta_default= Medium.setState_pTX(T=Medium.T_default, p=Medium.p_default, X=Medium.X_default) "Default medium state"; equation connect(uni.y, add.u1); connect(add.y, damRec.y); connect(damOA.port_a, port_Out); connect(damExh.port_b, port_Exh); connect(port_Sup, damOA.port_b); connect(damRec.port_b, port_Sup); connect(port_Ret, damExh.port_a); connect(port_Ret, damRec.port_a); connect(y_actual, add.u2); connect(y_actual, damOA.y); connect(y_actual, damExh.y); end MixingBox;

Buildings.Fluid.Actuators.Dampers.MixingBoxMinimumFlow Buildings.Fluid.Actuators.Dampers.MixingBoxMinimumFlow

Outside air mixing box with parallel damper for minimum outside air flow rate

Buildings.Fluid.Actuators.Dampers.MixingBoxMinimumFlow

Information

Model of an outside air mixing box with air dampers and a flow path for the minimum outside air flow rate.

If dp_nominalIncludesDamper=true, then the parameter dp_nominal is equal to the pressure drop of the damper plus the fixed flow resistance at the nominal flow rate. If dp_nominalIncludesDamper=false, then dp_nominal does not include the flow resistance of the air damper.

Extends from Buildings.Fluid.Actuators.Dampers.MixingBox (Outside air mixing box with interlocked air dampers).

Parameters

TypeNameDefaultDescription
replaceable package MediumPartialMediumMedium in the component
Booleanuse_deltaMtrueSet to true to use deltaM for turbulent transition, else ReC is used
RealdeltaM0.3Fraction of nominal mass flow rate where transition to turbulent occurs
BooleanroundDuctfalseSet to true for round duct, false for square cross section
RealReC4000Reynolds number where transition to turbulence starts
Nominal condition
MassFlowRatemOut_flow_nominal Mass flow rate outside air damper [kg/s]
PressureDifferencedpDamOut_nominal Pressure drop of damper in outside air leg [Pa]
PressureDifferencedpFixOut_nominal0Pressure drop of duct and other resistances in outside air leg [Pa]
MassFlowRatemRec_flow_nominal Mass flow rate recirculation air damper [kg/s]
PressureDifferencedpDamRec_nominal Pressure drop of damper in recirculation air leg [Pa]
PressureDifferencedpFixRec_nominal0Pressure drop of duct and other resistances in recirculation air leg [Pa]
MassFlowRatemExh_flow_nominal Mass flow rate exhaust air damper [kg/s]
PressureDifferencedpDamExh_nominal Pressure drop of damper in exhaust air leg [Pa]
PressureDifferencedpFixExh_nominal0Pressure drop of duct and other resistances in exhaust air leg [Pa]
MassFlowRatemOutMin_flow_nominal Mass flow rate minimum outside air damper [kg/s]
PressureDifferencedpDamOutMin_nominal Pressure drop of damper in minimum outside air leg [Pa]
PressureDifferencedpFixOutMin_nominal0Pressure drop of duct and other resistances in minimum outside air leg [Pa]
Dynamics
Filtered opening
Booleanuse_inputFiltertrue= true, if opening is filtered with a 2nd order CriticalDamping filter
TimeriseTime120Rise time of the filter (time to reach 99.6 % of an opening step) [s]
InitinitModelica.Blocks.Types.Init.I...Type of initialization (no init/steady state/initial state/initial output)
Realy_start1Initial position of actuator
RealyOutMin_starty_startInitial value of signal for minimum outside air damper
Assumptions
BooleanallowFlowReversaltrue= false to simplify equations, assuming, but not enforcing, no flow reversal
Advanced
Booleanfrom_dptrue= true, use m_flow = f(dp) else dp = f(m_flow)
Booleanlinearizedfalse= true, use linear relation between m_flow and dp for any flow rate
Booleanuse_constant_densitytrueSet to true to use constant density for flow friction
Damper coefficients
Reala-1.51Coefficient a for damper characteristics
Realb0.105*90Coefficient b for damper characteristics
RealyL15/90Lower value for damper curve
RealyU55/90Upper value for damper curve
Realk10.45Flow coefficient for y=1, k1 = pressure drop divided by dynamic pressure
Reall0.0001Damper leakage, ratio of flow coefficients k(y=0)/k(y=1)

Connectors

TypeNameDescription
input RealInputyActuator position (0: closed, 1: open)
output RealOutputy_actualActual actuator position
FluidPort_aport_OutFluid connector a (positive design flow direction is from port_a to port_b)
FluidPort_bport_ExhFluid connector b (positive design flow direction is from port_a to port_b)
FluidPort_aport_RetFluid connector a (positive design flow direction is from port_a to port_b)
FluidPort_bport_SupFluid connector b (positive design flow direction is from port_a to port_b)
FluidPort_aport_OutMinFluid connector a (positive design flow direction is from port_a to port_b)
input RealInputyOutMinDamper position minimum outside air (0: closed, 1: open)
output RealOutputyOutMin_actualActual valve position

Modelica definition

model MixingBoxMinimumFlow "Outside air mixing box with parallel damper for minimum outside air flow rate" extends Buildings.Fluid.Actuators.Dampers.MixingBox; import Modelica.Constants; parameter Modelica.Units.SI.MassFlowRate mOutMin_flow_nominal "Mass flow rate minimum outside air damper"; parameter Modelica.Units.SI.PressureDifference dpDamOutMin_nominal(min=0, displayUnit="Pa") "Pressure drop of damper in minimum outside air leg"; parameter Modelica.Units.SI.PressureDifference dpFixOutMin_nominal( min=0, displayUnit="Pa") = 0 "Pressure drop of duct and other resistances in minimum outside air leg"; parameter Real yOutMin_start=y_start "Initial value of signal for minimum outside air damper"; Modelica.Fluid.Interfaces.FluidPort_a port_OutMin(redeclare package Medium = Medium, m_flow(start=0, min=if allowFlowReversal then -Constants.inf else 0)) "Fluid connector a (positive design flow direction is from port_a to port_b)"; Modelica.Blocks.Interfaces.RealInput yOutMin "Damper position minimum outside air (0: closed, 1: open)"; Modelica.Blocks.Interfaces.RealOutput yOutMin_actual "Actual valve position"; Buildings.Fluid.Actuators.Dampers.Exponential damOAMin( redeclare final package Medium = Medium, final from_dp=from_dp, final linearized=linearized, final use_deltaM=use_deltaM, final deltaM=deltaM, final roundDuct=roundDuct, final ReC=ReC, final a=a, final b=b, final yL=yL, final yU=yU, final k1=k1, final l=l, final use_constant_density=use_constant_density, final allowFlowReversal=allowFlowReversal, final m_flow_nominal=mOutMin_flow_nominal, final dpDamper_nominal=dpDamOutMin_nominal, final dpFixed_nominal=dpFixOutMin_nominal, final use_inputFilter=false) "Damper for minimum outside air intake"; protected Modelica.Blocks.Interfaces.RealOutput yOutMin_filtered if use_inputFilter "Filtered damper position in the range 0..1"; Buildings.Fluid.BaseClasses.ActuatorFilter filterOutMin( final n=order, final f=fCut, final normalized=true, final initType=Modelica.Blocks.Types.Init.InitialOutput, final y_start=y_start) if use_inputFilter "Second order filter to approximate valve opening time, and to improve numerics"; equation connect(filterOutMin.y, yOutMin_filtered); if use_inputFilter then connect(yOutMin, filterOutMin.u); connect(filterOutMin.y, yOutMin_actual); else connect(yOutMin, yOutMin_actual); end if; ////// connect(port_OutMin, damOAMin.port_a); connect(damOAMin.port_b, port_Sup); connect(yOutMin_actual, damOAMin.y); end MixingBoxMinimumFlow;

Buildings.Fluid.Actuators.Dampers.PressureIndependent Buildings.Fluid.Actuators.Dampers.PressureIndependent

Model for an air damper whose mass flow is proportional to the input signal

Buildings.Fluid.Actuators.Dampers.PressureIndependent

Information

Model for an air damper whose airflow is proportional to the input signal, assuming that at y = 1, m_flow = m_flow_nominal. This is unless the pressure difference dp is too low, in which case a kDam = m_flow_nominal/sqrt(dp_nominal) characteristic is used.

The model is similar to Buildings.Fluid.Actuators.Valves.TwoWayPressureIndependent, except for adaptations for damper parameters. Please see that documentation for more information.

Computation of the damper opening

The fractional opening of the damper is computed by

The quadratic interpolation used outside the exponential domain in the function Buildings.Fluid.Actuators.BaseClasses.exponentialDamper yields a local extremum. Therefore, the formal inversion of the function is not possible. A cubic spline is used instead to fit the inverse of the damper characteristics. The central domain of the characteritics having a monotonous exponential profile, its inverse can be properly approximated with three equidistant support points. However, the quadratic functions used outside of the exponential domain can have various profiles depending on the damper coefficients. Therefore, five linearly distributed support points are used on each side domain to ensure a good fit of the inverse.

Note that below a threshold value of the input control signal (fixed at 0.02), the fractional opening is forced to zero and no more related to the actual flow coefficient of the damper. This avoids steep transients of the computed opening while transitioning from reverse flow. This is to be considered as a modeling workaround (avoiding the introduction of an additional state variable) to prevent control chattering during shut off operation where the pressure difference at the damper boundaries can vary between slightly positive and negative values due to outdoor pressure variations.

Extends from Buildings.Fluid.Actuators.BaseClasses.PartialDamperExponential (Partial model for air dampers with exponential opening characteristics).

Parameters

TypeNameDefaultDescription
replaceable package MediumPartialMediumMedium in the component
Booleanuse_deltaMtrueSet to true to use deltaM for turbulent transition, else ReC is used
RealdeltaM0.3Fraction of nominal mass flow rate where transition to turbulent occurs
BooleanroundDuctfalseSet to true for round duct, false for square cross section
RealReC4000Reynolds number where transition to turbulence starts
Nominal condition
MassFlowRatem_flow_nominal Nominal mass flow rate [kg/s]
PressureDifferencedpDamper_nominal Pressure drop of fully open damper at nominal mass flow rate [Pa]
PressureDifferencedpFixed_nominal0Pressure drop of duct and resistances other than the damper in series, at nominal mass flow rate [Pa]
Assumptions
BooleanallowFlowReversaltrue= false to simplify equations, assuming, but not enforcing, no flow reversal
Advanced
Diagnostics
Booleanshow_Tfalse= true, if actual temperature at port is computed
Booleanfrom_dptrue= true, use m_flow = f(dp) else dp = f(m_flow)
Booleanlinearizedfalse= true, use linear relation between m_flow and dp for any flow rate
Booleanuse_constant_densitytrueSet to true to use constant density for flow friction
Reall20.01Gain for mass flow increase if pressure is above nominal pressure [1]
Realdeltax0.02Transition interval for flow rate [1]
Dynamics
Filtered opening
Booleanuse_inputFiltertrue= true, if opening is filtered with a 2nd order CriticalDamping filter
TimeriseTime120Rise time of the filter (time to reach 99.6 % of an opening step) [s]
InitinitModelica.Blocks.Types.Init.I...Type of initialization (no init/steady state/initial state/initial output)
Realy_start1Initial position of actuator
Damper coefficients
Reala-1.51Coefficient a for damper characteristics [1]
Realb0.105*90Coefficient b for damper characteristics [1]
RealyL15/90Lower value for damper curve [1]
RealyU55/90Upper value for damper curve [1]
Realk10.45Loss coefficient for y=1 (pressure drop divided by dynamic pressure) [1]
Reall0.0001Damper leakage, ratio of flow coefficients k(y=0)/k(y=1)

Connectors

TypeNameDescription
FluidPort_aport_aFluid connector a (positive design flow direction is from port_a to port_b)
FluidPort_bport_bFluid connector b (positive design flow direction is from port_a to port_b)
input RealInputyActuator position (0: closed, 1: open)
output RealOutputy_actualActual actuator position

Modelica definition

model PressureIndependent "Model for an air damper whose mass flow is proportional to the input signal" extends Buildings.Fluid.Actuators.BaseClasses.PartialDamperExponential( final linearized=false, final casePreInd=true, from_dp=true); input Real phi = l + y_internal*(1 - l) "Ratio actual to nominal mass flow rate of damper, phi=kDam(y)/kDam(y=1)"; parameter Real l2(unit="1", min=1e-10) = 0.01 "Gain for mass flow increase if pressure is above nominal pressure"; parameter Real deltax(unit="1", min=1E-5) = 0.02 "Transition interval for flow rate"; protected constant Real y_min = 2E-2 "Minimum value of control signal before zeroing of the opening"; constant Integer sizeSupSplBnd = 5 "Number of support points on each quadratic domain for spline interpolation"; constant Integer sizeSupSpl = 2 * sizeSupSplBnd + 3 "Total number of support points for spline interpolation"; constant Real y2dd = 0 "Second derivative at second support point"; parameter Real[sizeSupSpl] ySupSpl_raw = cat( 1, linspace(1, yU, sizeSupSplBnd), {yU-1/3*(yU-yL), (yU+yL)/2, yU-2/3*(yU-yL)}, linspace(yL, 0, sizeSupSplBnd)) "y values of unsorted support points for spline interpolation"; parameter Real[sizeSupSpl] kSupSpl_raw = Buildings.Fluid.Actuators.BaseClasses.exponentialDamper( y=ySupSpl_raw, a=a, b=b, cL=cL, cU=cU, yL=yL, yU=yU) .^ 2 "k values of unsorted support points for spline interpolation"; parameter Real[sizeSupSpl] ySupSpl(each fixed=false) "y values of sorted support points for spline interpolation"; parameter Real[sizeSupSpl] kSupSpl(each fixed=false) "k values of sorted support points for spline interpolation"; parameter Integer[sizeSupSpl] idx_sorted(each fixed=false) "Indices of sorted support points"; parameter Real[sizeSupSpl] invSplDer(each fixed=false) "Derivatives at support points for spline interpolation"; parameter Real coeff1 = l2/dpDamper_nominal*m_flow_nominal "Parameter for avoiding unnecessary computations"; parameter Real coeff2 = 1/coeff1 "Parameter for avoiding unnecessary computations"; Real kSquInv "Square inverse of flow coefficient (damper plus fixed resistance)"; Real kDamSquInv "Square inverse of flow coefficient (damper only)"; Modelica.Units.SI.MassFlowRate m_flow_set "Requested mass flow rate"; Modelica.Units.SI.PressureDifference dp_min(displayUnit="Pa") "Minimum pressure difference required for delivering requested mass flow rate"; Modelica.Units.SI.PressureDifference dp_x; Modelica.Units.SI.PressureDifference dp_x1; Modelica.Units.SI.PressureDifference dp_x2; Modelica.Units.SI.PressureDifference dp_y2; Modelica.Units.SI.PressureDifference dp_y1 "Support points for interpolation flow functions"; Modelica.Units.SI.MassFlowRate m_flow_x; Modelica.Units.SI.MassFlowRate m_flow_x1; Modelica.Units.SI.MassFlowRate m_flow_x2; Modelica.Units.SI.MassFlowRate m_flow_y2; Modelica.Units.SI.MassFlowRate m_flow_y1 "Support points for interpolation flow functions"; Modelica.Units.SI.MassFlowRate m_flow_smooth "Smooth interpolation result between two flow regimes"; Modelica.Units.SI.PressureDifference dp_smooth "Smooth interpolation result between two flow regimes"; Real y_actual_smooth(final unit="1") "Fractional opening computed based on m_flow_smooth and dp"; function basicFlowFunction_dp_m_flow "Inverse of flow function that computes that computes the square inverse of flow coefficient" extends Modelica.Icons.Function; input Modelica.Units.SI.MassFlowRate m_flow "Mass flow rate in design flow direction"; input Modelica.Units.SI.PressureDifference dp "Pressure difference between port_a and port_b (= port_a.p - port_b.p)"; input Modelica.Units.SI.MassFlowRate m_flow_small "Minimum value of mass flow rate guarding against k=(0)/sqrt(dp)"; input Modelica.Units.SI.PressureDifference dp_small "Minimum value of pressure drop guarding against k=m_flow/(0)"; output Real kSquInv "Square inverse of flow coefficient"; protected Modelica.Units.SI.PressureDifference dpPos= Buildings.Utilities.Math.Functions.smoothMax( dp, -dp, dp_small) "Regularized absolute value of pressure drop"; Real mSqu_flow = Buildings.Utilities.Math.Functions.smoothMax( m_flow^2, m_flow_small^2, m_flow_small^2) "Regularized square value of mass flow rate"; algorithm kSquInv := dpPos / mSqu_flow; end basicFlowFunction_dp_m_flow; function exponentialDamper_inv "Inverse function of the exponential damper characteristics" extends Modelica.Icons.Function; input Real kTheta "Loss coefficient"; input Real[:] kSupSpl "k values of support points"; input Real[:] ySupSpl "y values of support points"; input Real[:] invSplDer "Derivatives at support points"; output Real y "Fractional opening"; protected parameter Integer sizeSupSpl = size(kSupSpl, 1) "Number of spline support points"; Integer i "Integer to select data interval"; algorithm i := 1; for j in 2:sizeSupSpl loop if kTheta <= kSupSpl[j] then i := j; break; end if; end for; y := Buildings.Utilities.Math.Functions.smoothLimit( Buildings.Utilities.Math.Functions.cubicHermiteLinearExtrapolation( x=kTheta, x1=kSupSpl[i - 1], x2=kSupSpl[i], y1=ySupSpl[i - 1], y2=ySupSpl[i], y1d=invSplDer[i - 1], y2d=invSplDer[i]), 0, 1, 1E-3); end exponentialDamper_inv; initial equation (kSupSpl, idx_sorted) = Modelica.Math.Vectors.sort(kSupSpl_raw, ascending=true); // The sum below is a trick to avoid in OPTIMICA the warning // Variable array index in equation can result in slow simulation time. // This warning was issued for the formulation ySupSpl = ySupSpl_raw[idx_sorted]; for i in 1:sizeSupSpl loop ySupSpl[i] = sum((if k == idx_sorted[i] then ySupSpl_raw[k] else 0) for k in 1:sizeSupSpl); end for; invSplDer = Buildings.Utilities.Math.Functions.splineDerivatives(x=kSupSpl_raw, y=ySupSpl_raw); equation // From TwoWayPressureIndependent valve model m_flow_set = m_flow_nominal*phi; dp_min = Buildings.Fluid.BaseClasses.FlowModels.basicFlowFunction_m_flow( m_flow=m_flow_set, k=kTotMax, m_flow_turbulent=m_flow_turbulent); if from_dp then m_flow_x=0; m_flow_x1=0; m_flow_x2=0; dp_y1=0; dp_y2=0; dp_smooth=0; dp_x = dp-dp_min; dp_x1 = -dp_x2; dp_x2 = deltax*dp_min; // min function ensures that m_flow_y1 does not increase further for dp_x > dp_x1 m_flow_y1 = Buildings.Fluid.BaseClasses.FlowModels.basicFlowFunction_dp( dp=min(dp, dp_min+dp_x1), k=kTotMax, m_flow_turbulent=m_flow_turbulent); // max function ensures that m_flow_y2 does not decrease further for dp_x < dp_x2 m_flow_y2 = m_flow_set + coeff1*max(dp_x,dp_x2); m_flow_smooth = noEvent(smooth(2, if dp_x <= dp_x1 then m_flow_y1 elseif dp_x >=dp_x2 then m_flow_y2 else Buildings.Utilities.Math.Functions.quinticHermite( x=dp_x, x1=dp_x1, x2=dp_x2, y1=m_flow_y1, y2=m_flow_y2, y1d= Buildings.Fluid.BaseClasses.FlowModels.basicFlowFunction_dp_der( dp=dp_min + dp_x1, k=kTotMax, m_flow_turbulent=m_flow_turbulent, dp_der=1), y2d=coeff1, y1dd=Buildings.Fluid.BaseClasses.FlowModels.basicFlowFunction_dp_der2( dp=dp_min + dp_x1, k=kTotMax, m_flow_turbulent=m_flow_turbulent, dp_der=1, dp_der2=0), y2dd=y2dd))); else dp_x=0; dp_x1=0; dp_x2=0; m_flow_y1=0; m_flow_y2=0; m_flow_smooth=0; m_flow_x = m_flow-m_flow_set; m_flow_x1 = -m_flow_x2; m_flow_x2 = deltax*m_flow_set; // min function ensures that dp_y1 does not increase further for m_flow_x > m_flow_x1 dp_y1 = Buildings.Fluid.BaseClasses.FlowModels.basicFlowFunction_m_flow( m_flow=min(m_flow, m_flow_set + m_flow_x1), k=kTotMax, m_flow_turbulent=m_flow_turbulent); // max function ensures that dp_y2 does not decrease further for m_flow_x < m_flow_x2 dp_y2 = dp_min + coeff2*max(m_flow_x, m_flow_x2); dp_smooth = noEvent(smooth(2, if m_flow_x <= m_flow_x1 then dp_y1 elseif m_flow_x >=m_flow_x2 then dp_y2 else Buildings.Utilities.Math.Functions.quinticHermite( x=m_flow_x, x1=m_flow_x1, x2=m_flow_x2, y1=dp_y1, y2=dp_y2, y1d=Buildings.Fluid.BaseClasses.FlowModels.basicFlowFunction_m_flow_der( m_flow=m_flow_set + m_flow_x1, k=kTotMax, m_flow_turbulent=m_flow_turbulent, m_flow_der=1), y2d=coeff2, y1dd=Buildings.Fluid.BaseClasses.FlowModels.basicFlowFunction_m_flow_der2( m_flow=m_flow_set + m_flow_x1, k=kTotMax, m_flow_turbulent=m_flow_turbulent, m_flow_der=1, m_flow_der2=0), y2dd=y2dd))); end if; // Computation of damper opening kSquInv = basicFlowFunction_dp_m_flow( m_flow=m_flow, dp=dp, m_flow_small=1E-3*abs(m_flow_nominal), dp_small=1E-4*dp_nominal_pos); kDamSquInv = if dpFixed_nominal > Modelica.Constants.eps then kSquInv - 1 / kFixed^2 else kSquInv; // Use of regStep might no longer be needed when the leakage flow modeling is updated. y_actual_smooth = Buildings.Utilities.Math.Functions.regStep( x=y_internal - y_min, y1=exponentialDamper_inv( kTheta=kDamSquInv*2*rho*A^2, kSupSpl=kSupSpl, ySupSpl=ySupSpl, invSplDer=invSplDer), y2=0, x_small=1E-3); // Homotopy transformation if homotopyInitialization then if from_dp then m_flow=homotopy(actual=m_flow_smooth, simplified=m_flow_nominal_pos*dp/dp_nominal_pos); else dp=homotopy(actual=dp_smooth, simplified=dp_nominal_pos*m_flow/m_flow_nominal_pos); end if; y_actual = homotopy( actual=y_actual_smooth, simplified=y); else if from_dp then m_flow=m_flow_smooth; else dp=dp_smooth; end if; y_actual = y_actual_smooth; end if; end PressureIndependent;