Name | Description |
---|---|
m_flow_of_dp_fric | Calculate mass flow rate as function of pressure drop due to friction |
dp_fric_of_m_flow | Calculate pressure drop due to friction as function of mass flow rate |
Type | Name | Default | Description |
---|---|---|---|
Pressure | dp_fric | Pressure loss due to friction (dp = port_a.p - port_b.p) [Pa] | |
Density | rho_a | Density at port_a [kg/m3] | |
Density | rho_b | Density at port_b [kg/m3] | |
DynamicViscosity | mu_a | Dynamic viscosity at port_a (dummy if use_mu = false) [Pa.s] | |
DynamicViscosity | mu_b | Dynamic viscosity at port_b (dummy if use_mu = false) [Pa.s] | |
Length | length | Length of pipe [m] | |
Diameter | diameter | Inner (hydraulic) diameter of pipe [m] | |
ReynoldsNumber | Re1 | Boundary between laminar regime and transition [1] | |
ReynoldsNumber | Re2 | Boundary between transition and turbulent regime [1] | |
Real | Delta | Relative roughness |
Type | Name | Description |
---|---|---|
MassFlowRate | m_flow | Mass flow rate from port_a to port_b [kg/s] |
Real | dm_flow_ddp_fric | Derivative of mass flow rate with dp_fric |
function m_flow_of_dp_fric "Calculate mass flow rate as function of pressure drop due to friction" input SI.Pressure dp_fric "Pressure loss due to friction (dp = port_a.p - port_b.p)"; input SI.Density rho_a "Density at port_a"; input SI.Density rho_b "Density at port_b"; input SI.DynamicViscosity mu_a "Dynamic viscosity at port_a (dummy if use_mu = false)"; input SI.DynamicViscosity mu_b "Dynamic viscosity at port_b (dummy if use_mu = false)"; input SI.Length length "Length of pipe"; input SI.Diameter diameter "Inner (hydraulic) diameter of pipe"; input SI.ReynoldsNumber Re1 "Boundary between laminar regime and transition"; input SI.ReynoldsNumber Re2 "Boundary between transition and turbulent regime"; input Real Delta "Relative roughness"; output SI.MassFlowRate m_flow "Mass flow rate from port_a to port_b"; output Real dm_flow_ddp_fric "Derivative of mass flow rate with dp_fric"; protectedfunction interpolateInRegion2_withDerivative "Interpolation in log-log space using a cubic Hermite polynomial, where x=log10(lambda2), y=log10(Re)" input Real lambda2 "Known independent variable"; input SI.ReynoldsNumber Re1 "Boundary between laminar regime and transition"; input SI.ReynoldsNumber Re2 "Boundary between transition and turbulent regime"; input Real Delta "Relative roughness"; input SI.Pressure dp_fric "Pressure loss due to friction (dp = port_a.p - port_b.p)"; output SI.ReynoldsNumber Re "Unknown return variable"; output Real dRe_ddp "Derivative of return value"; // point lg(lambda2(Re1)) with derivative at lg(Re1) protected Real x1=log10(64*Re1); Real y1=log10(Re1); Real y1d=1; // Point lg(lambda2(Re2)) with derivative at lg(Re2) Real aux2=Delta/3.7 + 5.74/Re2^0.9; Real aux3=log10(aux2); Real L2=0.25*(Re2/aux3)^2; Real aux4=2.51/sqrt(L2) + 0.27*Delta; Real aux5=-2*sqrt(L2)*log10(aux4); Real x2=log10(L2); Real y2=log10(aux5); Real y2d=0.5 + (2.51/ln(10))/(aux5*aux4); // Point of interest in transformed space Real x=log10(lambda2); Real y; Real dy_dx "Derivative in transformed space"; algorithm // Interpolation (y, dy_dx) := Utilities.cubicHermite_withDerivative(x, x1, x2, y1, y2, y1d, y2d); // Return value Re := 10^y; // Derivative of return value dRe_ddp := Re/abs(dp_fric)*dy_dx; end interpolateInRegion2_withDerivative ; SI.DynamicViscosity mu "Upstream viscosity"; SI.Density rho "Upstream density"; Real lambda2 "Modified friction coefficient (= lambda*Re^2)"; SI.ReynoldsNumber Re "Reynolds number"; Real dRe_ddp "dRe/ddp"; Real aux1; Real aux2; algorithm // Determine upstream density and upstream viscosity if dp_fric >= 0 then rho := rho_a; mu := mu_a; else rho := rho_b; mu := mu_b; end if; // Positive mass flow rate lambda2 := abs(dp_fric)*2*diameter^3*rho/(length*mu*mu) "Known as lambda2=f(dp)"; aux1:=(2*diameter^3*rho)/(length*mu^2); // Determine Re and dRe/ddp under the assumption of laminar flow Re := lambda2/64 "Hagen-Poiseuille"; dRe_ddp := aux1/64 "Hagen-Poiseuille"; // Modify Re, if turbulent flow if Re > Re1 then Re :=-2*sqrt(lambda2)*log10(2.51/sqrt(lambda2) + 0.27*Delta) "Colebrook-White"; aux2 := sqrt(aux1*abs(dp_fric)); dRe_ddp := 1/ln(10)*(-2*ln(2.51/aux2+0.27*Delta)*aux1/(2*aux2)+2*2.51/(2*abs(dp_fric)*(2.51/aux2+0.27*Delta))); if Re < Re2 then (Re, dRe_ddp) := interpolateInRegion2_withDerivative(lambda2, Re1, Re2, Delta, dp_fric); end if; end if; // Determine mass flow rate m_flow := (pi*diameter/4)*mu*(if dp_fric >= 0 then Re else -Re); // Determine derivative of mass flow rate with dp_fric dm_flow_ddp_fric := (pi*diameter*mu)/4*dRe_ddp;end m_flow_of_dp_fric;
Type | Name | Default | Description |
---|---|---|---|
MassFlowRate | m_flow | Mass flow rate from port_a to port_b [kg/s] | |
Density | rho_a | Density at port_a [kg/m3] | |
Density | rho_b | Density at port_b [kg/m3] | |
DynamicViscosity | mu_a | Dynamic viscosity at port_a (dummy if use_mu = false) [Pa.s] | |
DynamicViscosity | mu_b | Dynamic viscosity at port_b (dummy if use_mu = false) [Pa.s] | |
Length | length | Length of pipe [m] | |
Diameter | diameter | Inner (hydraulic) diameter of pipe [m] | |
ReynoldsNumber | Re1 | Boundary between laminar regime and transition [1] | |
ReynoldsNumber | Re2 | Boundary between transition and turbulent regime [1] | |
Real | Delta | Relative roughness |
Type | Name | Description |
---|---|---|
Pressure | dp_fric | Pressure loss due to friction (dp_fric = port_a.p - port_b.p - dp_grav) [Pa] |
Real | ddp_fric_dm_flow | Derivative of pressure drop with mass flow rate |
function dp_fric_of_m_flow "Calculate pressure drop due to friction as function of mass flow rate" input SI.MassFlowRate m_flow "Mass flow rate from port_a to port_b"; input SI.Density rho_a "Density at port_a"; input SI.Density rho_b "Density at port_b"; input SI.DynamicViscosity mu_a "Dynamic viscosity at port_a (dummy if use_mu = false)"; input SI.DynamicViscosity mu_b "Dynamic viscosity at port_b (dummy if use_mu = false)"; input SI.Length length "Length of pipe"; input SI.Diameter diameter "Inner (hydraulic) diameter of pipe"; input SI.ReynoldsNumber Re1 "Boundary between laminar regime and transition"; input SI.ReynoldsNumber Re2 "Boundary between transition and turbulent regime"; input Real Delta "Relative roughness"; output SI.Pressure dp_fric "Pressure loss due to friction (dp_fric = port_a.p - port_b.p - dp_grav)"; output Real ddp_fric_dm_flow "Derivative of pressure drop with mass flow rate"; protectedfunction interpolateInRegion2 "Interpolation in log-log space using a cubic Hermite polynomial, where x=log10(Re), y=log10(lambda2)" input SI.ReynoldsNumber Re "Known independent variable"; input SI.ReynoldsNumber Re1 "Boundary between laminar regime and transition"; input SI.ReynoldsNumber Re2 "Boundary between transition and turbulent regime"; input Real Delta "Relative roughness"; input SI.MassFlowRate m_flow "Mass flow rate from port_a to port_b"; output Real lambda2 "Unknown return value"; output Real dlambda2_dm_flow "Derivative of return value"; // point lg(lambda2(Re1)) with derivative at lg(Re1) protected Real x1 = log10(Re1); Real y1 = log10(64*Re1); Real y1d = 1; // Point lg(lambda2(Re2)) with derivative at lg(Re2) Real aux2 = Delta/3.7 + 5.74/Re2^0.9; Real aux3 = log10(aux2); Real L2 = 0.25*(Re2/aux3)^2; Real x2 = log10(Re2); Real y2 = log10(L2); Real y2d = 2+(2*5.74*0.9)/(ln(aux2)*Re2^0.9*aux2); // Point of interest in transformed space Real x=log10(Re); Real y; Real dy_dx "Derivative in transformed space"; algorithm // Interpolation (y, dy_dx) := Utilities.cubicHermite_withDerivative(x, x1, x2, y1, y2, y1d, y2d); // Return value lambda2 := 10^y; // Derivative of return value dlambda2_dm_flow := lambda2/abs(m_flow)*dy_dx; end interpolateInRegion2 ; SI.DynamicViscosity mu "Upstream viscosity"; SI.Density rho "Upstream density"; SI.ReynoldsNumber Re "Reynolds number"; Real lambda2 "Modified friction coefficient (= lambda*Re^2)"; Real dlambda2_dm_flow "dlambda2/dm_flow"; Real aux1; Real aux2; algorithm // Determine upstream density and upstream viscosity if m_flow >= 0 then rho := rho_a; mu := mu_a; else rho := rho_b; mu := mu_b; end if; // Determine Reynolds number Re :=(4/pi)*abs(m_flow)/(diameter*mu); aux1 := 4/(pi*diameter*mu); // Use correlation for lambda2 depending on actual conditions if Re <= Re1 then lambda2 := 64*Re "Hagen-Poiseuille"; dlambda2_dm_flow := 64*aux1 "Hagen-Poiseuille"; elseif Re >= Re2 then lambda2 := 0.25*(Re/log10(Delta/3.7 + 5.74/Re^0.9))^2 "Swamee-Jain"; aux2 := Delta/3.7+5.74/((aux1*abs(m_flow))^0.9); dlambda2_dm_flow := 0.5*aux1*Re*ln(10)^2*(1/(ln(aux2)^2)+(5.74*0.9)/(ln(aux2)^3*Re^0.9*aux2)) "Swamee-Jain"; else (lambda2, dlambda2_dm_flow) := interpolateInRegion2(Re, Re1, Re2, Delta, m_flow); end if; // Compute pressure drop from lambda2 dp_fric :=length*mu*mu/(2*rho*diameter*diameter*diameter)* (if m_flow >= 0 then lambda2 else -lambda2); // Compute derivative from dlambda2/dm_flow ddp_fric_dm_flow := (length*mu^2)/(2*diameter^3*rho)*dlambda2_dm_flow;end dp_fric_of_m_flow;