This package implements performance curves for fans and pumps.
The following performance curves are implemented:
 dp =f(V_flow, r_N, {V_flow_nominal, dp_nominal})
 P  =f(V_flow, r_N, {V_flow_nominal, dp_nominal})
 eta=f(r_V,         {r_V_nominal, eta_nominal})
where
dp is the pressure raise, 
P is the power consumption,
eta is the efficiency,
V_flow is the volume flow rate,
r_N=N/N_nominal is the normalized revolution
and the quantities in curly brackets are points used to parameterize the curves.
Each curve can be a constant, a linear function, a quadratic function or a polynomial
of arbitrary order.
The package is similar to Modelica.Fluid.Machines.BaseClasses.PumpCharacteristics, with the following exceptions:
V_flow/r_N,
where r_N=N/N_nominal,
and the mover model computes, for example 
for a quadratic performance curve,
  dp = r_N^2 * f(V_flow/r_N) 
     = r_N^2 * ( c1 + c2 * V_flow/r_N + c3 * (V_flow/r_N)^2) 
     = r_N^2 * c1 + r_N * c2 * V_flow + c3 * V_flow^2.
Since f(V_flow/r_N) = c1 + c2 * V_flow/r_N + c3 * (V_flow/r_N)^2 is
singular for r_N=0, we redefined this function as
  dp = f(V_flow, r_N) 
     = r_N^2 * c1 + r_N * c2 * V_flow + c3 * V_flow^2
which allows computing dp for r_N=0.
Note, however, that the model of the Buildings library, as well as the 
model of Modelica.Fluid, is still singular for r_N=0
for performance curves that have a higher order than 2.
| Name | Description | 
|---|---|
| Base class for fan or pump flow characteristics | |
| Base class for fan or pump power consumption characteristics | |
| Base class for efficiency characteristics | |
| Linear flow characteristic | |
| Quadratic flow characteristic | |
| Polynomial flow characteristic | |
| Linear power consumption characteristic | |
| Quadratic power consumption characteristic | |
| Polynomial power consumption characteristic | |
| Constant efficiency characteristic | |
| Linear efficiency characteristic | |
| Quadratic efficiency characteristic | |
| Polynomial efficiency characteristic | |
| Wrapper for Modelica.Math.Matrices.solve | |
| Derivative for function solve | |
| Examples to test implementation of derivative function | 
Buildings.Fluid.Movers.BaseClasses.Characteristics.baseFlow
| Type | Name | Default | Description | 
|---|---|---|---|
| VolumeFlowRate | V_flow | Volumetric flow rate [m3/s] | |
| Real | r_N | Relative revolution, r_N=N/N_nominal [1] | 
| Type | Name | Description | 
|---|---|---|
| Pressure | dp | Fan or pump total pressure [Pa] | 
partial function baseFlow 
  "Base class for fan or pump flow characteristics"
  extends Modelica.Icons.Function;
  input Modelica.SIunits.VolumeFlowRate V_flow "Volumetric flow rate";
  input Real r_N(unit="1") "Relative revolution, r_N=N/N_nominal";
  output Modelica.SIunits.Pressure dp(min=0, displayUnit="Pa") 
    "Fan or pump total pressure";
end baseFlow;
Buildings.Fluid.Movers.BaseClasses.Characteristics.basePower
| Type | Name | Default | Description | 
|---|---|---|---|
| VolumeFlowRate | V_flow | Volumetric flow rate [m3/s] | |
| Real | r_N | Relative revolution, r_N=N/N_nominal [1] | 
| Type | Name | Description | 
|---|---|---|
| Power | consumption | Power consumption [W] | 
partial function basePower "Base class for fan or pump power consumption characteristics" extends Modelica.Icons.Function; input Modelica.SIunits.VolumeFlowRate V_flow "Volumetric flow rate"; input Real r_N(unit="1") "Relative revolution, r_N=N/N_nominal"; output Modelica.SIunits.Power consumption "Power consumption"; end basePower;
Buildings.Fluid.Movers.BaseClasses.Characteristics.baseEfficiency
| Type | Name | Default | Description | 
|---|---|---|---|
| Real | r_V | Volumetric flow rate divided by nominal flow rate [1] | 
| Type | Name | Description | 
|---|---|---|
| Real | eta | Efficiency [1] | 
partial function baseEfficiency "Base class for efficiency characteristics" extends Modelica.Icons.Function; input Real r_V(unit="1") "Volumetric flow rate divided by nominal flow rate"; output Real eta(min=0, unit="1") "Efficiency"; end baseEfficiency;
Buildings.Fluid.Movers.BaseClasses.Characteristics.linearFlow
| Type | Name | Default | Description | 
|---|---|---|---|
| VolumeFlowRate | V_flow | Volumetric flow rate [m3/s] | |
| Real | r_N | Relative revolution, r_N=N/N_nominal [1] | |
| VolumeFlowRate | V_flow_nominal[2] | Volume flow rate for two operating points (single fan or pump) [m3/s] | |
| Pressure | dp_nominal[2] | Fan or pump total pressure for two operating points [Pa] | 
| Type | Name | Description | 
|---|---|---|
| Pressure | dp | Fan or pump total pressure [Pa] | 
function linearFlow "Linear flow characteristic"
  extends baseFlow;
  input Modelica.SIunits.VolumeFlowRate V_flow_nominal[2] 
    "Volume flow rate for two operating points (single fan or pump)";
  input Modelica.SIunits.Pressure dp_nominal[2](each min=0, each displayUnit="Pa") 
    "Fan or pump total pressure for two operating points";
  /* Linear system to determine the coefficients:
  dp_nominal[1] = c[1] + V_flow_nominal[1]*c[2];
  dp_nominal[2] = c[1] + V_flow_nominal[2]*c[2];
  */
protected 
  Real c[2] = Buildings.Fluid.Movers.BaseClasses.Characteristics.solve( [ones(2),V_flow_nominal],dp_nominal) 
    "Coefficients of linear total pressure curve";
algorithm 
  dp := r_N^2 * c[1] + r_N*V_flow*c[2];
end linearFlow;
 
Buildings.Fluid.Movers.BaseClasses.Characteristics.quadraticFlow
| Type | Name | Default | Description | 
|---|---|---|---|
| VolumeFlowRate | V_flow | Volumetric flow rate [m3/s] | |
| Real | r_N | Relative revolution, r_N=N/N_nominal [1] | |
| VolumeFlowRate | V_flow_nominal[3] | Volume flow rate for three operating points (single fan or pump) [m3/s] | |
| Pressure | dp_nominal[3] | Fan or pump total pressure for three operating points [Pa] | 
| Type | Name | Description | 
|---|---|---|
| Pressure | dp | Fan or pump total pressure [Pa] | 
function quadraticFlow "Quadratic flow characteristic"
  extends baseFlow;
  input Modelica.SIunits.VolumeFlowRate V_flow_nominal[3](each min=0) 
    "Volume flow rate for three operating points (single fan or pump)";
  input Modelica.SIunits.Pressure dp_nominal[3](each min=0, each displayUnit="Pa") 
    "Fan or pump total pressure for three operating points";
protected 
  Real V_flow_nominal2[3] = {V_flow_nominal[1]^2,V_flow_nominal[2]^2, V_flow_nominal[3]^2} 
    "Squared nominal flow rates";
  /* Linear system to determine the coefficients:
  dp_nominal[1] = c[1] + V_flow_nominal[1]*c[2] + V_flow_nominal[1]^2*c[3];
  dp_nominal[2] = c[1] + V_flow_nominal[2]*c[2] + V_flow_nominal[2]^2*c[3];
  dp_nominal[3] = c[1] + V_flow_nominal[3]*c[2] + V_flow_nominal[3]^2*c[3];
  */
  Real c[3] = Buildings.Fluid.Movers.BaseClasses.Characteristics.solve( [ones(3), V_flow_nominal, V_flow_nominal2],dp_nominal) 
    "Coefficients of quadratic total pressure curve";
algorithm 
  // Flow equation: dp  = c[1] + V_flow*c[2] + V_flow^2*c[3];
  dp := r_N^2*c[1] + r_N*V_flow*c[2] + V_flow^2*c[3];
end quadraticFlow;
 
Buildings.Fluid.Movers.BaseClasses.Characteristics.polynomialFlow
| Type | Name | Default | Description | 
|---|---|---|---|
| VolumeFlowRate | V_flow | Volumetric flow rate [m3/s] | |
| Real | r_N | Relative revolution, r_N=N/N_nominal [1] | |
| VolumeFlowRate | V_flow_nominal[:] | Volume flow rate for N operating points (single fan or pump) [m3/s] | |
| Pressure | dp_nominal[:] | Fan or pump total pressure for N operating points [Pa] | 
| Type | Name | Description | 
|---|---|---|
| Pressure | dp | Fan or pump total pressure [Pa] | 
function polynomialFlow "Polynomial flow characteristic"
  extends baseFlow;
  input Modelica.SIunits.VolumeFlowRate V_flow_nominal[:](each min=0) 
    "Volume flow rate for N operating points (single fan or pump)";
  input Modelica.SIunits.Pressure dp_nominal[:](each min=0, each displayUnit="Pa") 
    "Fan or pump total pressure for N operating points";
protected 
  Integer N = size(V_flow_nominal,1) "Number of nominal operating points";
  Real V_flow_nominal_pow[N,N] = {{V_flow_nominal[i]^(j-1) for j in 1:N} for i in 1:N} 
    "Rows: different operating points; columns: increasing powers";
  /* Linear system to determine the coefficients (example N=3):
  dp_nominal[1] = c[1] + V_flow_nominal[1]*c[2] + V_flow_nominal[1]^2*c[3];
  dp_nominal[2] = c[1] + V_flow_nominal[2]*c[2] + V_flow_nominal[2]^2*c[3];
  dp_nominal[3] = c[1] + V_flow_nominal[3]*c[2] + V_flow_nominal[3]^2*c[3];
  */
  Real c[N] = Buildings.Fluid.Movers.BaseClasses.Characteristics.solve( V_flow_nominal_pow,dp_nominal) 
    "Coefficients of polynomial total pressure curve";
algorithm 
  // Flow equation (example N=3): dp  = c[1] + V_flow*c[2] + V_flow^2*c[3];
  // Note: the implementation is numerically efficient only for low values of N
  dp := r_N^(N-1)*c[1] + sum(r_N^(N-i)*V_flow^(i-1)*c[i] for i in 2:N-1) + V_flow^(N-1)*c[N];
end polynomialFlow;
 
Buildings.Fluid.Movers.BaseClasses.Characteristics.linearPower
| Type | Name | Default | Description | 
|---|---|---|---|
| VolumeFlowRate | V_flow | Volumetric flow rate [m3/s] | |
| Real | r_N | Relative revolution, r_N=N/N_nominal [1] | |
| VolumeFlowRate | V_flow_nominal[2] | Volume flow rate for two operating points (single fan or pump) [m3/s] | |
| Power | P_nominal[2] | Power consumption for two operating points [W] | 
| Type | Name | Description | 
|---|---|---|
| Power | consumption | Power consumption [W] | 
function linearPower "Linear power consumption characteristic"
  extends basePower;
  input Modelica.SIunits.VolumeFlowRate V_flow_nominal[2] 
    "Volume flow rate for two operating points (single fan or pump)";
  input Modelica.SIunits.Power P_nominal[2] 
    "Power consumption for two operating points";
  /* Linear system to determine the coefficients:
  P_nominal[1] = c[1] + V_flow_nominal[1]*c[2];
  P_nominal[2] = c[1] + V_flow_nominal[2]*c[2];
  */
protected 
  Real c[2] = Buildings.Fluid.Movers.BaseClasses.Characteristics.solve( [ones(3),V_flow_nominal],P_nominal) 
    "Coefficients of linear power consumption curve";
algorithm 
  consumption := r_N^3*c[1] + r_N^2*V_flow*c[2];
end linearPower;
Buildings.Fluid.Movers.BaseClasses.Characteristics.quadraticPower
| Type | Name | Default | Description | 
|---|---|---|---|
| VolumeFlowRate | V_flow | Volumetric flow rate [m3/s] | |
| Real | r_N | Relative revolution, r_N=N/N_nominal [1] | |
| VolumeFlowRate | V_flow_nominal[3] | Volume flow rate for three operating points (single fan or pump) [m3/s] | |
| Power | P_nominal[3] | Power consumption for three operating points [W] | 
| Type | Name | Description | 
|---|---|---|
| Power | consumption | Power consumption [W] | 
function quadraticPower "Quadratic power consumption characteristic"
  extends basePower;
  input Modelica.SIunits.VolumeFlowRate V_flow_nominal[3] 
    "Volume flow rate for three operating points (single fan or pump)";
  input Modelica.SIunits.Power P_nominal[3] 
    "Power consumption for three operating points";
protected 
  Real V_flow_nominal2[3] = {V_flow_nominal[1]^2,V_flow_nominal[2]^2, V_flow_nominal[3]^2} 
    "Squared nominal flow rates";
  /* Linear system to determine the coefficients:
  P_nominal[1] = c[1] + V_flow_nominal[1]*c[2] + V_flow_nominal[1]^2*c[3];
  P_nominal[2] = c[1] + V_flow_nominal[2]*c[2] + V_flow_nominal[2]^2*c[3];
  P_nominal[3] = c[1] + V_flow_nominal[3]*c[2] + V_flow_nominal[3]^2*c[3];
  */
  Real c[3] = Buildings.Fluid.Movers.BaseClasses.Characteristics.solve( [ones(3),V_flow_nominal,V_flow_nominal2],P_nominal) 
    "Coefficients of quadratic power consumption curve";
algorithm 
  consumption := r_N^3*c[1] + r_N^2*V_flow*c[2] + r_N*V_flow^2*c[3];
end quadraticPower;
Buildings.Fluid.Movers.BaseClasses.Characteristics.polynomialPower
| Type | Name | Default | Description | 
|---|---|---|---|
| VolumeFlowRate | V_flow | Volumetric flow rate [m3/s] | |
| Real | r_N | Relative revolution, r_N=N/N_nominal [1] | |
| VolumeFlowRate | V_flow_nominal[:] | Volume flow rate for N operating points (single fan or pump) [m3/s] | |
| Power | P_nominal[:] | Power consumption for N operating points [W] | 
| Type | Name | Description | 
|---|---|---|
| Power | consumption | Power consumption [W] | 
function polynomialPower 
  "Polynomial power consumption characteristic"
  extends basePower;
  input Modelica.SIunits.VolumeFlowRate V_flow_nominal[:] 
    "Volume flow rate for N operating points (single fan or pump)";
  input Modelica.SIunits.Power P_nominal[:] 
    "Power consumption for N operating points";
protected 
  Integer N = size(V_flow_nominal,1) "Number of nominal operating points";
  Real V_flow_nominal_pow[N,N] = {{V_flow_nominal[i]^(j-1) for j in 1:N} for i in 1:N} 
    "Rows: different operating points; columns: increasing powers";
  /* Linear system to determine the coefficients (example N=3):
  P_nominal[1] = c[1] + V_flow_nominal[1]*c[2] + V_flow_nominal[1]^2*c[3];
  P_nominal[2] = c[1] + V_flow_nominal[2]*c[2] + V_flow_nominal[2]^2*c[3];
  P_nominal[3] = c[1] + V_flow_nominal[3]*c[2] + V_flow_nominal[3]^2*c[3];
  */
  Real c[N] = Buildings.Fluid.Movers.BaseClasses.Characteristics.solve( V_flow_nominal_pow,P_nominal) 
    "Coefficients of polynomial power consumption curve";
algorithm 
  // Efficiency equation (example N=3): W  = c[1] + V_flow*c[2] + V_flow^2*c[3];
  // Note: the implementation is numerically efficient only for low values of N
  consumption := r_N^N*c[1] + sum(r_N^(N-i+1)*V_flow^(i-1)*c[i] for i in 2:N);
end polynomialPower;
Buildings.Fluid.Movers.BaseClasses.Characteristics.constantEfficiency
| Type | Name | Default | Description | 
|---|---|---|---|
| Real | r_V | Volumetric flow rate divided by nominal flow rate [1] | |
| Real | eta_nominal | Nominal efficiency [1] | 
| Type | Name | Description | 
|---|---|---|
| Real | eta | Efficiency [1] | 
function constantEfficiency "Constant efficiency characteristic" extends baseEfficiency; input Real eta_nominal(min=0, unit="1") "Nominal efficiency"; algorithm eta := eta_nominal; end constantEfficiency;
Buildings.Fluid.Movers.BaseClasses.Characteristics.linearEfficiency
| Type | Name | Default | Description | 
|---|---|---|---|
| Real | r_V | Volumetric flow rate divided by nominal flow rate [1] | |
| Real | r_V_nominal[2] | Volumetric flow rate divided by nominal flow rate for two operating points (single fan or pump) [1] | |
| Real | eta_nominal[2] | Nominal efficiency [1] | 
| Type | Name | Description | 
|---|---|---|
| Real | eta | Efficiency [1] | 
function linearEfficiency "Linear efficiency characteristic"
  extends baseEfficiency;
  input Real r_V_nominal[2](each unit="1") 
    "Volumetric flow rate divided by nominal flow rate for two operating points (single fan or pump)";
  input Real eta_nominal[2](each min=0, each unit="1") "Nominal efficiency";
  /* Linear system to determine the coefficients:
  eta_nominal[1] = c[1] + V_flow_nominal[1]*c[2];
  eta_nominal[2] = c[1] + V_flow_nominal[2]*c[2];
  */
protected 
  Real c[2] = Buildings.Fluid.Movers.BaseClasses.Characteristics.solve( [ones(2),r_V_nominal],eta_nominal) 
    "Coefficients of linear total efficiency curve";
algorithm 
  // Efficiency equation: eta = q*c[1] + c[2];
  eta := c[1] + r_V*c[2];
end linearEfficiency;
Buildings.Fluid.Movers.BaseClasses.Characteristics.quadraticEfficiency
| Type | Name | Default | Description | 
|---|---|---|---|
| Real | r_V | Volumetric flow rate divided by nominal flow rate [1] | |
| Real | r_V_nominal[3] | Volumetric flow rate divided by nominal flow rate for three operating points (single fan or pump) [1] | |
| Real | eta_nominal[3] | Nominal efficiency for three operating points [1] | 
| Type | Name | Description | 
|---|---|---|
| Real | eta | Efficiency [1] | 
function quadraticEfficiency "Quadratic efficiency characteristic"
  extends baseEfficiency;
  input Real r_V_nominal[3](each unit="1") 
    "Volumetric flow rate divided by nominal flow rate for three operating points (single fan or pump)";
  input Real eta_nominal[3](each min=0, each unit="1") 
    "Nominal efficiency for three operating points";
protected 
  Real r_V_nominal2[3] = {r_V_nominal[1]^2,r_V_nominal[2]^2, r_V_nominal[3]^2} 
    "Squared nominal flow rates";
  /* Linear system to determine the coefficients:
  eta_nominal[1] = c[1] + r_V_nominal[1]*c[2] + r_V_nominal[1]^2*c[3];
  eta_nominal[2] = c[1] + r_V_nominal[2]*c[2] + r_V_nominal[2]^2*c[3];
  eta_nominal[3] = c[1] + r_V_nominal[3]*c[2] + r_V_nominal[3]^2*c[3];
  */
  Real c[3] = Buildings.Fluid.Movers.BaseClasses.Characteristics.solve( [ones(3), r_V_nominal, r_V_nominal2],eta_nominal) 
    "Coefficients of quadratic efficiency curve";
algorithm 
  // Efficiency equation: eta  = c[1] + V_flow*c[2] + V_flow^2*c[3];
  eta := c[1] + r_V*c[2] + r_V^2*c[3];
end quadraticEfficiency;
Buildings.Fluid.Movers.BaseClasses.Characteristics.polynomialEfficiency
| Type | Name | Default | Description | 
|---|---|---|---|
| Real | r_V | Volumetric flow rate divided by nominal flow rate [1] | |
| Real | r_V_nominal[:] | Volumetric flow rate divided by nominal flow rate for N operating points (single fan or pump) [1] | |
| Real | eta_nominal[:] | Nominal efficiency for N operating points [1] | 
| Type | Name | Description | 
|---|---|---|
| Real | eta | Efficiency [1] | 
function polynomialEfficiency "Polynomial efficiency characteristic"
  extends baseEfficiency;
  input Real r_V_nominal[:](each unit="1") 
    "Volumetric flow rate divided by nominal flow rate for N operating points (single fan or pump)";
  input Real eta_nominal[:](each min=0, each unit="1") 
    "Nominal efficiency for N operating points";
protected 
  Integer N = size(r_V_nominal,1) "Number of nominal operating points";
  Real r_V_nominal_pow[N,N] = {{r_V_nominal[i]^(j-1) for j in 1:N} for i in 1:N} 
    "Rows: different operating points; columns: increasing powers";
  /* Linear system to determine the coefficients (example N=3):
  eta_nominal[1] = c[1] + r_V_nominal[1]*c[2] + r_V_nominal[1]^2*c[3];
  eta_nominal[2] = c[1] + r_V_nominal[2]*c[2] + r_V_nominal[2]^2*c[3];
  eta_nominal[3] = c[1] + r_V_nominal[3]*c[2] + r_V_nominal[3]^2*c[3];
  */
  Real c[N] = Buildings.Fluid.Movers.BaseClasses.Characteristics.solve( r_V_nominal_pow,eta_nominal) 
    "Coefficients of polynomial total pressure curve";
algorithm 
  // Efficiency equation (example N=3): eta  = c[1] + r_V*c[2] + r_V^2*c[3];
  // Note: the implementation is numerically efficient only for low values of N
  eta := c[1] + sum(r_V^(i-1)*c[i] for i in 2:N);
end polynomialEfficiency;
| Type | Name | Default | Description | 
|---|---|---|---|
| Real | A[:, size(A, 1)] | ||
| Real | x[size(A, 1)] | 
| Type | Name | Description | 
|---|---|---|
| Real | b[size(A, 1)] | 
function solve "Wrapper for Modelica.Math.Matrices.solve" annotation(derivative=Buildings.Fluid.Movers.BaseClasses.Characteristics.der_solve); input Real A[:,size(A,1)]; input Real x[size(A,1)]; output Real b[size(A,1)]; algorithm b:=Modelica.Math.Matrices.solve(A,x);end solve; 
| Type | Name | Default | Description | 
|---|---|---|---|
| Real | A[:, size(A, 1)] | ||
| Real | x[size(A, 1)] | ||
| Real | Ader[:, size(A, 1)] | ||
| Real | xder[size(A, 1)] | 
| Type | Name | Description | 
|---|---|---|
| Real | b[size(A, 1)] | 
function der_solve "Derivative for function solve" input Real A[:,size(A,1)]; input Real x[size(A,1)]; input Real Ader[:,size(A,1)]; input Real xder[size(A,1)]; output Real b[size(A,1)]; algorithm b:=Modelica.Math.Matrices.solve(A,xder-Ader*Modelica.Math.Matrices.solve(A,x)); end der_solve;