IEA EBC Annex 60 EBC logo

Annex60.Fluid.FixedResistances

Package with models for fixed flow resistances

Information

This package contains components models for fixed flow resistances. By fixed flow resistance, we mean resistances that do not change the flow coefficient

k = m ⁄ √ΔP.

For models of valves and air dampers, see Annex60.Fluid.Actuators. For models of flow resistances as part of the building constructions, see Annex60.Airflow.Multizone.

The model Annex60.Fluid.FixedResistances.PressureDrop is a fixed flow resistance that takes as parameter a nominal flow rate and a nominal pressure drop. The actual resistance is scaled using the above equation.

The model Annex60.Fluid.FixedResistances.HydraulicDiameter is a fixed flow resistance that takes as parameter a nominal flow rate and a hydraulic diameter. The actual resistance is scaled using the above equation.

The model Annex60.Fluid.FixedResistances.LosslessPipe is an ideal pipe segment with no pressure drop. It is primarily used in models in which the above pressure drop model need to be replaced by a model with no pressure drop.

The model Annex60.Fluid.FixedResistances.Junction can be used to model flow splitters or flow merges.

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

Package Content

Name Description
Annex60.Fluid.FixedResistances.HydraulicDiameter HydraulicDiameter Fixed flow resistance with hydraulic diameter and m_flow as parameter
Annex60.Fluid.FixedResistances.Junction Junction Flow splitter with fixed resistance at each port
Annex60.Fluid.FixedResistances.LosslessPipe LosslessPipe Pipe with no flow friction and no heat transfer
Annex60.Fluid.FixedResistances.PressureDrop PressureDrop Fixed flow resistance with dp and m_flow as parameter
Annex60.Fluid.FixedResistances.Examples Examples Collection of models that illustrate model use and test models
Annex60.Fluid.FixedResistances.Validation Validation Collection of validation models

Annex60.Fluid.FixedResistances.HydraulicDiameter Annex60.Fluid.FixedResistances.HydraulicDiameter

Fixed flow resistance with hydraulic diameter and m_flow as parameter

Annex60.Fluid.FixedResistances.HydraulicDiameter

Information

This is a model of a flow resistance with a fixed flow coefficient. The mass flow rate is computed as

ṁ = k √ΔP,

where k is a constant and ΔP is the pressure drop. The constant k is equal to k=m_flow_nominal/sqrt(dp_nominal), where m_flow_nominal is a parameter.

Assumptions

In the region abs(m_flow) < m_flow_turbulent, the square root is replaced by a differentiable function with finite slope. The value of m_flow_turbulent is computed as m_flow_turbulent = eta_nominal*dh/4*π*ReC, where eta_nominal is the dynamic viscosity, obtained from the medium model. The parameter dh is the hydraulic diameter and ReC=4000 is the critical Reynolds number, which both can be set by the user.

Important parameters

By default, the pressure drop at nominal flow rate is computed as

dp_nominal = fac * dpStraightPipe_nominal,

where dpStraightPipe_nominal is a parameter that is automatically computed based on the nominal mass flow rate, hydraulic diameter, pipe roughness and medium properties. The hydraulic diameter dh is by default computed based on the flow velocity v_nominal and the nominal mass flow rate m_flow_nominal. Hence, users should change the default values of dh or v_nominal if they are not applicable for their model.

The factor fac takes into account additional resistances such as for bends. The default value of 2 can be changed by the user.

The parameter from_dp is used to determine whether the mass flow rate is computed as a function of the pressure drop (if from_dp=true), or vice versa. This setting can affect the size of the nonlinear system of equations.

If the parameter linearized is set to true, then the pressure drop is computed as a linear function of the mass flow rate.

Setting allowFlowReversal=false can lead to simpler equations. However, this should only be set to false if one can guarantee that the flow never reverses its direction. This can be difficult to guarantee, as pressure imbalance after the initialization, or due to medium expansion and contraction, can lead to reverse flow.

If the parameter show_T is set to true, then the model will compute the temperature at its ports. Note that this can lead to state events when the mass flow rate approaches zero, which can increase computing time.

Notes

For more detailed models that compute the actual flow friction, models from the package Modelica.Fluid can be used and combined with models from the Annex60 library.

For a model that uses dp_nominal as a parameter rather than geoemetric data, use Annex60.Fluid.FixedResistances.PressureDrop.

Implementation

The pressure drop is computed by calling a function in the package Buildings.Fluid.BaseClasses.FlowModels, This package contains regularized implementations of the equation

m = sign(Δp) k √ Δp  

and its inverse function.

To decouple the energy equation from the mass equations, the pressure drop is a function of the mass flow rate, and not the volume flow rate. This leads to simpler equations.

Extends from Annex60.Fluid.FixedResistances.PressureDrop (Fixed flow resistance with dp and m_flow as parameter).

Parameters

TypeNameDefaultDescription
replaceable package MediumPartialMediumMedium in the component
Lengthdhsqrt(4*m_flow_nominal/rho_de...Hydraulic diameter (assuming a round cross section area) [m]
Lengthlength Length of the pipe [m]
RealReC4000Reynolds number where transition to turbulent starts
Lengthroughness2.5e-5Absolute roughness of pipe, with a default for a smooth steel pipe (dummy if use_roughness = false) [m]
Realfac2Factor to take into account resistance of bends etc., fac=dp_nominal/dpStraightPipe_nominal
Nominal condition
MassFlowRatem_flow_nominal Nominal mass flow rate [kg/s]
PressureDifferencedp_nominalfac*dpStraightPipe_nominalPressure drop at nominal mass flow rate [Pa]
Velocityv_nominalif rho_default < 500 then 1....Velocity at m_flow_nominal (used to compute default value for hydraulic diameter dh) [m/s]
Transition to laminar
RealdeltaMeta_default*dh/4*Modelica.Co...Fraction of nominal mass flow rate where transition to turbulent occurs
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)
BooleanhomotopyInitializationtrue= true, use homotopy method
Booleanlinearizedfalse= true, use linear relation between m_flow and dp for any flow rate

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)

Modelica definition

model HydraulicDiameter "Fixed flow resistance with hydraulic diameter and m_flow as parameter" extends Annex60.Fluid.FixedResistances.PressureDrop( final deltaM = eta_default*dh/4*Modelica.Constants.pi*ReC/m_flow_nominal_pos, final dp_nominal=fac*dpStraightPipe_nominal); parameter Modelica.SIunits.Length dh=sqrt(4*m_flow_nominal/rho_default/v_nominal/Modelica.Constants.pi) "Hydraulic diameter (assuming a round cross section area)"; parameter Modelica.SIunits.Length length "Length of the pipe"; parameter Real ReC(min=0)=4000 "Reynolds number where transition to turbulent starts"; parameter Modelica.SIunits.Velocity v_nominal = if rho_default < 500 then 1.5 else 0.15 "Velocity at m_flow_nominal (used to compute default value for hydraulic diameter dh)"; parameter Modelica.SIunits.Length roughness(min=0) = 2.5e-5 "Absolute roughness of pipe, with a default for a smooth steel pipe (dummy if use_roughness = false)"; parameter Real fac(min=1) = 2 "Factor to take into account resistance of bends etc., fac=dp_nominal/dpStraightPipe_nominal"; final parameter Modelica.SIunits.PressureDifference dpStraightPipe_nominal(displayUnit="Pa")= Modelica.Fluid.Pipes.BaseClasses.WallFriction.Detailed.pressureLoss_m_flow( m_flow=m_flow_nominal, rho_a=rho_default, rho_b=rho_default, mu_a=mu_default, mu_b=mu_default, length=length, diameter=dh, roughness=roughness, m_flow_small=m_flow_small) "Pressure loss of a straight pipe at m_flow_nominal"; Modelica.SIunits.Velocity v = m_flow/(rho_default*ARound) "Flow velocity (assuming a round cross section area)"; protected parameter Modelica.SIunits.Area ARound = dh^2*Modelica.Constants.pi/4 "Cross sectional area (assuming a round cross section area)"; parameter Medium.ThermodynamicState state_default= Medium.setState_pTX( T=Medium.T_default, p=Medium.p_default, X=Medium.X_default[1:Medium.nXi]) "Default state"; parameter Modelica.SIunits.Density rho_default = Medium.density(state_default) "Density at nominal condition"; parameter Modelica.SIunits.DynamicViscosity mu_default = Medium.dynamicViscosity( state_default) "Dynamic viscosity at nominal condition"; end HydraulicDiameter;

Annex60.Fluid.FixedResistances.Junction Annex60.Fluid.FixedResistances.Junction

Flow splitter with fixed resistance at each port

Annex60.Fluid.FixedResistances.Junction

Information

Model of a flow junction with an optional fixed resistance in each flow leg and an optional mixing volume at the junction.

The pressure drop is implemented using the model Annex60.Fluid.FixedResistances.PressureDrop. If its nominal pressure drop is set to zero, then the pressure drop model will be removed. For example, the pressure drop declaration

  m_flow_nominal={ 0.1, 0.1,  -0.2},
  dp_nominal =   {500,    0, -6000}

would model a flow mixer that has the nominal flow rates and associated pressure drops as shown in the figure below. Note that port_3 is set to negative values. The negative values indicate that at the nominal conditions, fluid is leaving the component.

image

If energyDynamics <> Modelica.Fluid.Types.Dynamics.SteadyState, then at the flow junction, a fluid volume is modeled. The fluid volume is implemented using the model Annex60.Fluid.Delays.DelayFirstOrder. The fluid volume has the size

  V = sum(abs(m_flow_nominal[:])/3)*tau/rho_nominal

where tau is a parameter and rho_nominal is the density of the medium in the volume at nominal condition. Setting energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial can help reducing the size of the nonlinear system of equations.

Extends from Annex60.Fluid.BaseClasses.PartialThreeWayResistance (Flow splitter with partial resistance model at each port).

Parameters

TypeNameDefaultDescription
replaceable package MediumPartialMediumMedium in the component
Nominal condition
MassFlowRatem_flow_nominal[3] Mass flow rate. Set negative at outflowing ports. [kg/s]
Pressuredp_nominal[3] Pressure drop at nominal mass flow rate, set to zero or negative number at outflowing ports. [Pa]
Transition to laminar
RealdeltaM0.3Fraction of nominal mass flow rate where transition to turbulent occurs
Dynamics
Equations
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance: dynamic (3 initialization options) or steady state
DynamicsmassDynamicsenergyDynamicsType of mass balance: dynamic (3 initialization options) or steady state
MassFlowRatemDyn_flow_nominalsum(abs(m_flow_nominal[:])/3)Nominal mass flow rate for dynamic momentum and energy balance [kg/s]
Nominal condition
Timetau10Time constant at nominal flow for dynamic energy and momentum balance [s]
Initialization
AbsolutePressurep_startMedium.p_defaultStart value of pressure [Pa]
TemperatureT_startMedium.T_defaultStart value of temperature [K]
MassFractionX_start[Medium.nX]Medium.X_defaultStart value of mass fractions m_i/m [kg/kg]
ExtraPropertyC_start[Medium.nC]fill(0, Medium.nC)Start value of trace substances
ExtraPropertyC_nominal[Medium.nC]fill(1E-2, Medium.nC)Nominal value of trace substances. (Set to typical order of magnitude.)
Advanced
Booleanfrom_dptrue= true, use m_flow = f(dp) else dp = f(m_flow)
PortFlowDirectionportFlowDirection_1Modelica.Fluid.Types.PortFlo...Flow direction for port_1
PortFlowDirectionportFlowDirection_2Modelica.Fluid.Types.PortFlo...Flow direction for port_2
PortFlowDirectionportFlowDirection_3Modelica.Fluid.Types.PortFlo...Flow direction for port_3
Booleanlinearizedfalse= true, use linear relation between m_flow and dp for any flow rate
BooleanhomotopyInitializationtrue= true, use homotopy method

Connectors

TypeNameDescription
FluidPort_aport_1First port, typically inlet
FluidPort_bport_2Second port, typically outlet
FluidPort_aport_3Third port, can be either inlet or outlet

Modelica definition

model Junction "Flow splitter with fixed resistance at each port" extends Annex60.Fluid.BaseClasses.PartialThreeWayResistance( mDyn_flow_nominal = sum(abs(m_flow_nominal[:])/3), redeclare Annex60.Fluid.FixedResistances.PressureDrop res1( final allowFlowReversal=true, from_dp=from_dp, final m_flow_nominal=m_flow_nominal[1], final dp_nominal=dp_nominal[1], linearized=linearized, homotopyInitialization=homotopyInitialization, deltaM=deltaM), redeclare Annex60.Fluid.FixedResistances.PressureDrop res2( final allowFlowReversal=true, from_dp=from_dp, final m_flow_nominal=m_flow_nominal[2], final dp_nominal=dp_nominal[2], linearized=linearized, homotopyInitialization=homotopyInitialization, deltaM=deltaM), redeclare Annex60.Fluid.FixedResistances.PressureDrop res3( final allowFlowReversal=true, from_dp=from_dp, final m_flow_nominal=m_flow_nominal[3], final dp_nominal=dp_nominal[3], linearized=linearized, homotopyInitialization=homotopyInitialization, deltaM=deltaM)); parameter Modelica.SIunits.MassFlowRate[3] m_flow_nominal "Mass flow rate. Set negative at outflowing ports."; parameter Modelica.SIunits.Pressure[3] dp_nominal(each displayUnit = "Pa") "Pressure drop at nominal mass flow rate, set to zero or negative number at outflowing ports."; parameter Real deltaM(min=0) = 0.3 "Fraction of nominal mass flow rate where transition to turbulent occurs"; parameter Boolean linearized = false "= true, use linear relation between m_flow and dp for any flow rate"; parameter Boolean homotopyInitialization = true "= true, use homotopy method"; end Junction;

Annex60.Fluid.FixedResistances.LosslessPipe Annex60.Fluid.FixedResistances.LosslessPipe

Pipe with no flow friction and no heat transfer

Annex60.Fluid.FixedResistances.LosslessPipe

Information

Model of a pipe with no flow resistance, no heat loss and no transport delay. This model can be used to replace a replaceable pipe model in flow legs in which no friction should be modeled. This is for example done in the outlet port of the base class for three way valves, Annex60.Fluid.Actuators.BaseClasses.PartialThreeWayValve.

Extends from Annex60.Fluid.Interfaces.PartialTwoPortInterface (Partial model transporting fluid between two ports without storing mass or energy).

Parameters

TypeNameDefaultDescription
replaceable package MediumPartialMediumMedium in the component
Nominal condition
MassFlowRatem_flow_nominal Nominal mass flow rate [kg/s]
Assumptions
BooleanallowFlowReversaltrue= false to simplify equations, assuming, but not enforcing, no flow reversal
Advanced
MassFlowRatem_flow_small1E-4*abs(m_flow_nominal)Small mass flow rate for regularization of zero flow [kg/s]
Diagnostics
Booleanshow_Tfalse= true, if actual temperature at port is computed

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)

Modelica definition

model LosslessPipe "Pipe with no flow friction and no heat transfer" extends Annex60.Fluid.Interfaces.PartialTwoPortInterface; final parameter Boolean from_dp=true "Used to satisfy replaceable models"; equation dp=0; // Isenthalpic state transformation (no storage and no loss of energy) port_a.h_outflow = inStream(port_b.h_outflow); port_b.h_outflow = inStream(port_a.h_outflow); // Mass balance (no storage) port_a.m_flow + port_b.m_flow = 0; // Transport of substances port_a.Xi_outflow = inStream(port_b.Xi_outflow); port_b.Xi_outflow = inStream(port_a.Xi_outflow); port_a.C_outflow = inStream(port_b.C_outflow); port_b.C_outflow = inStream(port_a.C_outflow); end LosslessPipe;

Annex60.Fluid.FixedResistances.PressureDrop Annex60.Fluid.FixedResistances.PressureDrop

Fixed flow resistance with dp and m_flow as parameter

Annex60.Fluid.FixedResistances.PressureDrop

Information

Model of a flow resistance with a fixed flow coefficient. The mass flow rate is

ṁ = k √ΔP,

where k is a constant and ΔP is the pressure drop. The constant k is equal to k=m_flow_nominal/sqrt(dp_nominal), where m_flow_nominal and dp_nominal are parameters.

Assumptions

In the region abs(m_flow) < m_flow_turbulent, the square root is replaced by a differentiable function with finite slope. The value of m_flow_turbulent is computed as m_flow_turbulent = deltaM * abs(m_flow_nominal), where deltaM=0.3 and m_flow_nominal are parameters that can be set by the user.

The figure below shows the pressure drop for the parameters m_flow_nominal=5 kg/s, dp_nominal=10 Pa and deltaM=0.3.

image

Important parameters

The parameter from_dp is used to determine whether the mass flow rate is computed as a function of the pressure drop (if from_dp=true), or vice versa. This setting can affect the size of the nonlinear system of equations.

If the parameter linearized is set to true, then the pressure drop is computed as a linear function of the mass flow rate.

Setting allowFlowReversal=false can lead to simpler equations. However, this should only be set to false if one can guarantee that the flow never reverses its direction. This can be difficult to guarantee, as pressure imbalance after the initialization, or due to medium expansion and contraction, can lead to reverse flow.

If the parameter show_T is set to true, then the model will compute the temperature at its ports. Note that this can lead to state events when the mass flow rate approaches zero, which can increase computing time.

Notes

For more detailed models that compute the actual flow friction, models from the package Modelica.Fluid can be used and combined with models from the Annex60 library.

For a model that uses the hydraulic parameter and flow velocity at nominal conditions as a parameter, use Annex60.Fluid.FixedResistances.HydraulicDiameter.

Implementation

The pressure drop is computed by calling a function in the package Annex60.Fluid.BaseClasses.FlowModels, This package contains regularized implementations of the equation

m = sign(Δp) k √ Δp  

and its inverse function.

To decouple the energy equation from the mass equations, the pressure drop is a function of the mass flow rate, and not the volume flow rate. This leads to simpler equations.

Extends from Annex60.Fluid.BaseClasses.PartialResistance (Partial model for a hydraulic resistance).

Parameters

TypeNameDefaultDescription
replaceable package MediumPartialMediumMedium in the component
MassFlowRatem_flow_turbulentif computeFlowResistance the...Turbulent flow if |m_flow| >= m_flow_turbulent [kg/s]
Nominal condition
MassFlowRatem_flow_nominal Nominal mass flow rate [kg/s]
PressureDifferencedp_nominal Pressure drop at nominal mass flow rate [Pa]
Transition to laminar
RealdeltaM0.3Fraction of nominal mass flow rate where transition to turbulent occurs
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)
BooleanhomotopyInitializationtrue= true, use homotopy method
Booleanlinearizedfalse= true, use linear relation between m_flow and dp for any flow rate

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)

Modelica definition

model PressureDrop "Fixed flow resistance with dp and m_flow as parameter" extends Annex60.Fluid.BaseClasses.PartialResistance( final m_flow_turbulent = if computeFlowResistance then deltaM * m_flow_nominal_pos else 0); parameter Real deltaM(min=0.01) = 0.3 "Fraction of nominal mass flow rate where transition to turbulent occurs"; final parameter Real k(unit="") = if computeFlowResistance then m_flow_nominal_pos / sqrt(dp_nominal_pos) else 0 "Flow coefficient, k=m_flow/sqrt(dp), with unit=(kg.m)^(1/2)"; protected final parameter Boolean computeFlowResistance=(dp_nominal_pos > Modelica.Constants.eps) "Flag to enable/disable computation of flow resistance"; initial equation if computeFlowResistance then assert(m_flow_turbulent > 0, "m_flow_turbulent must be bigger than zero."); end if; assert(m_flow_nominal_pos > 0, "m_flow_nominal_pos must be non-zero. Check parameters."); equation // Pressure drop calculation if computeFlowResistance then if linearized then m_flow*m_flow_nominal_pos = k^2*dp; else if homotopyInitialization then if from_dp then m_flow=homotopy( actual=Annex60.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=Annex60.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=Annex60.Fluid.BaseClasses.FlowModels.basicFlowFunction_dp( dp=dp, k=k, m_flow_turbulent=m_flow_turbulent); else dp=Annex60.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 else // do not compute flow resistance dp = 0; end if; // computeFlowResistance end PressureDrop;

http://iea-annex60.org