AixLib.Fluid.Movers.BaseClasses.FlowMachineInterface

# .AixLib.Fluid.Movers.BaseClasses.FlowMachineInterface

Partial model with performance curves for fans or pumps

## Information

This is an interface that implements the functions to compute the head, power draw and efficiency of fans and pumps.

The nominal hydraulic characteristic (total pressure rise versus volume flow rate) is given by a set of data points using the data record `per`, which is an instance of AixLib.Fluid.Movers.Data.Generic. A cubic hermite spline with linear extrapolation is used to compute the performance at other operating points.

The model computes the power and efficiency items in the list below.

- Flow work:
  Ẇflo = V̇ ⋅ Δp
- Total efficiency and consumed electric power:
  η = Ẇflo ⁄ Pele
- Hydraulic effiency and hydraulic work (shaft work, brake horsepower):
  ηhyd = Ẇflo ⁄ Ẇhyd
- Motor efficiency:
  ηmot = Ẇhyd ⁄ Pele

See AixLib.Fluid.Movers.UsersGuide for how the user can provide power and efficiency information to the model.

#### Implementation

For numerical reasons, the user-provided data points for volume flow rate versus pressure rise are modified to add a fan internal flow resistance. Because this flow resistance is subtracted during the simulation when computing the fan pressure rise, the model reproduces the exact points that were provided by the user.

Also for numerical reasons, the pressure rise at zero flow rate and the flow rate at zero pressure rise is added to the user-provided data, unless the user already provides these data points. Since Modelica 3.2 does not allow dynamic memory allocation, this implementation required the use of three different arrays for the situation where no additional point is added, where one additional point is added and where two additional points are added. The parameter `curve` causes the correct data record to be used during the simulation.

In order to prevent the model from producing negative mover power when either the flow rate or pressure rise is forced to be negative, the flow work Ẇflo is constrained to be non-negative. The regularisation starts around 0.01% of the characteristic maximum power Ẇmax = V̇max Δpmax. See discussions and an example of this situation in IBPSA, #1621.

## Revisions

- May 15, 2024, by Hongxiang Fu:
  Corrected efficiency equations if `powerOrEfficiencyIsHydraulic=false` and specified the `start` attribute for `etaHyd` and `etaMot` to suppress a warning. This is for IBPSA, #1880.
- August 8, 2022, by Hongxiang Fu:
  - Modified the power and efficiency computation to allow computing the hydraulic efficiency `etaHyd` and the motor efficiency `etaMot` separately;
  - Implemented the option to compute the total efficiency `eta` or the hydraulic efficiency `etaHyd` using the Euler number.
  - Implemented the option for the user to provide the motor efficiency `etaMot` as a function of part load ratio y. Also allowed generic curves to be used.
  - Moved `haveVMax` here from AixLib.Fluid.Movers.BaseClasses.PartialFlowMachine.
  - Now it passes `WHyd` instead of `etaHyd` to AixLib.Fluid.Movers.BaseClasses.PowerInterface.
  - Now the flow work `WFlo` is bounded to be non-negative.
  These are for #2668. June 6, 2022, by Hongxiang Fu:
  Added a constraint that Wflo = V̇ Δp ≥ 0.
  This is for IBPSA, #1621.
- April 14, 2020, by Michael Wetter:
  Changed `homotopyInitialization` to a constant.
  This is for IBPSA, #1341.
- December 2, 2016, by Michael Wetter:
  Removed `min` attribute as otherwise numerical noise can cause the assertion on the limit to fail.
  This is for #606.
- February 19, 2016, by Michael Wetter and Filip Jorissen:
  Refactored model to make implementation clearer. This is for #417.
- January 22, 2016, by Michael Wetter:
  Corrected type declaration of pressure difference and reformatted code. This is for #404.
- September 2, 2015, by Michael Wetter:
  Corrected computation of `etaMot = cha.efficiency(per=per.motorEfficiency, V_flow=V_flow, d=motDer, r_N=r_N, delta=1E-4)` which previously used `V_flow_max` instead of `V_flow`.
- January 6, 2015, by Michael Wetter:
  Revised model for OpenModelica.
- November 22, 2014, by Michael Wetter:
  Removed in `N_actual` and `N_filtered` the `max` attribute to avoid a translation warning.
- April 21, 2014, by Filip Jorissen and Michael Wetter:
  Changed model to use AixLib.Fluid.Movers.Data.Generic. April 19, 2014, by Filip Jorissen:
  Passed extra parameters to power() and efficiency() to be able to properly evaluate the scaling law. See #202 for a discussion and validation.
- September 27, 2013, by Michael Wetter:
  Reformulated `per=if (curve == 1) then pCur1 elseif (curve == 2) then pCur2 else pCur3` by moving the computation into the idividual logical branches because OpenModelica generates an error when assign the statement to `data` as `pCur1`, `pCur2` and `pCur3` have different dimensions.
- September 17, 2013, by Michael Wetter:
  Added missing `each` keyword in declaration of parameters that are an array.
- March 20, 2013, by Michael Wetter:
  Removed assignment in declaration of `pCur?.V_flow` as these parameters have the attribute `fixed=false` set.
- October 11, 2012, by Michael Wetter:
  Added implementation of `WFlo = eta * P` with guard against division by zero. Changed implementation of `etaMot=sqrt(eta)` to `etaHyd = 1` to avoid infinite derivative as `eta` converges to zero.
- February 20, 2012, by Michael Wetter:
  Assigned value to nominal attribute of `V_flow`.
- February 14, 2012, by Michael Wetter:
  Added filter for start-up and shut-down transient.
- October 4 2011, by Michael Wetter:
  Revised the implementation of the pressure drop computation as a function of speed and volume flow rate. The new implementation avoids a singularity near zero volume flow rate and zero speed.
- March 28 2011, by Michael Wetter:
  Added `homotopy` operator.
- March 23 2010, by Michael Wetter:
  First implementation.

Generated at 2026-05-09T18:18:56Z by OpenModelicaOpenModelica 1.26.7 using GenerateDoc.mos