This is a model of a flow machine (pump or fan).
The normalized pressure difference is computed using a function of the normalized mass flow rate. The function is a polynomial for which a user needs to supply the coefficients and two values that determine for what flow rate the polynomial is linearly extended.
Type | Name | Default | Description |
replaceable package Medium | PartialMedium | Medium in the component |
Length | D | | Diameter [m] |
Real | a[:] | | Polynomial coefficients for pressure=p(mNor_flow) |
Real | b[:] | | Polynomial coefficients for etaSha=p(mNor_flow) |
Real | mNorMin_flow | | Lowest valid normalized mass flow rate |
Real | mNorMax_flow | | Highest valid normalized mass flow rate |
Real | scaM_flow | 1 | Factor used to scale the mass flow rate of the fan (used for quickly adjusting fan size) |
Real | scaDp | 1 | Factor used to scale the pressure increase of the fan (used for quickly adjusting fan size) |
Nominal condition |
MassFlowRate | m_flow_nominal | | Nominal mass flow rate [kg/s] |
Initialization |
MassFlowRate | m_flow.start | 0 | Mass flow rate from port_a to port_b (m_flow > 0 is design flow direction) [kg/s] |
Pressure | dp.start | 0 | Pressure difference between port_a and port_b [Pa] |
Assumptions |
Boolean | allowFlowReversal | system.allowFlowReversal | = true to allow flow reversal, false restricts to design direction (port_a -> port_b) |
Advanced |
MassFlowRate | m_flow_small | 1E-4*abs(m_flow_nominal) | Small mass flow rate for regularization of zero flow [kg/s] |
Diagnostics |
Boolean | show_T | false | = true, if actual temperature at port is computed |
model FlowMachinePolynomial
"Fan or pump with head and efficiency declared by a non-dimensional polynomial"
extends Buildings.Fluid.Interfaces.PartialTwoPortInterface;
extends Modelica.Icons.ObsoleteModel;
Modelica.Blocks.Interfaces.RealInput N_in
"Prescribed rotational speed";
parameter Modelica.SIunits.Length D
"Diameter";
parameter Real[:] a
"Polynomial coefficients for pressure=p(mNor_flow)";
parameter Real[:] b
"Polynomial coefficients for etaSha=p(mNor_flow)";
parameter Real mNorMin_flow
"Lowest valid normalized mass flow rate";
parameter Real mNorMax_flow
"Highest valid normalized mass flow rate";
parameter Real scaM_flow = 1
"Factor used to scale the mass flow rate of the fan (used for quickly adjusting fan size)";
parameter Real scaDp = 1
"Factor used to scale the pressure increase of the fan (used for quickly adjusting fan size)";
Real pNor(min=0)
"Normalized pressure";
Real mNor_flow(start=mNorMax_flow)
"Normalized mass flow rate";
Real etaSha(min=0, max=1)
"Efficiency, flow work divided by shaft power";
Modelica.SIunits.Power PSha
"Power input at shaft";
Medium.Density rho
"Medium density";
protected
parameter Real pNorMin1(fixed=false)
"Normalized pressure, used to test slope of polynomial outside [xMin, xMax]";
parameter Real pNorMin2(fixed=false)
"Normalized pressure, used to test slope of polynomial outside [xMin, xMax]";
parameter Real pNorMax1(fixed=false)
"Normalized pressure, used to test slope of polynomial outside [xMin, xMax]";
parameter Real pNorMax2(fixed=false)
"Normalized pressure, used to test slope of polynomial outside [xMin, xMax]";
initial equation
Modelica.Utilities.Streams.print("The model Buildings.Fluid.Movers.FlowMachinePolynomial is deprecated.
It will be removed in future releases.
You should use Buildings.Fluid.Movers.FlowMachine_y
instead of Buildings.Fluid.Movers.FlowMachinePolynomial.");
// check slope of polynomial outside the domain [mNorMin_flow, mNorMax_flow]
pNorMin1 =
Buildings.Fluid.Utilities.extendedPolynomial(
c=a, x=mNorMin_flow/2, xMin=mNorMin_flow, xMax=mNorMax_flow);
pNorMin2 =
Buildings.Fluid.Utilities.extendedPolynomial(
c=a, x=mNorMin_flow, xMin=mNorMin_flow, xMax=mNorMax_flow);
pNorMax1 =
Buildings.Fluid.Utilities.extendedPolynomial(
c=a, x=mNorMax_flow, xMin=mNorMin_flow, xMax=mNorMax_flow);
pNorMax2 =
Buildings.Fluid.Utilities.extendedPolynomial(
c=a, x=mNorMax_flow*2, xMin=mNorMin_flow, xMax=mNorMax_flow);
assert(pNorMin1>pNorMin2,
"Slope of pump pressure polynomial is non-negative for mNor_flow < mNorMin_flow. Check parameter a.");
assert(pNorMax1>pNorMax2,
"Slope of pump pressure polynomial is non-negative for mNorMax_flow < mNor_flow. Check parameter a.");
equation
// For computing the density, we assume that the fan operates in the design flow direction.
rho =
Medium.density(
Medium.setState_phX(port_a.p,
inStream(port_a.h_outflow),
inStream(port_a.Xi_outflow)));
-dp = scaDp * pNor * rho * D*D * N_in * N_in;
m_flow = scaM_flow * mNor_flow * rho * D*D*D * N_in;
pNor =
Buildings.Fluid.Utilities.extendedPolynomial(
c=a, x=mNor_flow, xMin=mNorMin_flow, xMax=mNorMax_flow);
etaSha =
max(0.1,
Buildings.Fluid.Utilities.polynomial(
c=b, x=mNor_flow));
etaSha * PSha = -dp * m_flow / rho;
// dp<0 and m_flow>0 for normal operation
// Energy balance (no storage, no heat loss/gain)
PSha = -m_flow*(port_a.h_outflow-
inStream(port_b.h_outflow));
PSha = m_flow*(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 FlowMachinePolynomial;