using System;
using System.Collections.Generic;
using System.Linq;
namespace IStation.Model
{
///
/// 曲线计算辅助类
///
public class CurveCalcuHelper
{
#region 计算效率
///
/// 计算效率
///
/// 瞬时流量 m³/h
/// 扬程 m
/// 功率 kw
/// 密度 kg/m^3
/// 重力加速度 m/s^2
/// 百分数
public static double CalculateE(double q, double h, double p, double ρ, double g)
{
q = q / 3600;
p = p * 1000;
double e = 0;
if (p < 0.1)
return e;
e = ρ * g * q * h / p;
return Math.Round(e * 100, 2);
}
///
/// 计算效率
///
/// 瞬时流量 m³/h
/// 扬程 m
/// 功率 kw
/// 百分数
public static double CalculateE(double q, double h, double p)
{
return CalculateE(q, h, p, ConstantParas.WaterDensity, ConstantParas.g);
}
///
/// 计算效率
///
/// 瞬时流量 m³/h
/// 扬程 m
/// 功率 kw
/// 密度 kg/m^3
/// 百分数
public static double CalculateE(double q, double h, double p, double ρ)
{
return CalculateE(q, h, p, ρ, ConstantParas.g);
}
#endregion
#region 计算功率
///
/// 计算功率
///
/// 瞬时流量 m³/h
/// 扬程 m
/// 效率 百分数
/// 密度kg/m³
/// 重力加速度 m/s²
/// kw
public static double CalculateP(double q, double h, double e, double ρ, double g)
{
q = q / 3600;
e = e / 100;
double p = 0;
if (e < 0.01)
return p;
p = ρ * g * q * h / e;
p = p / 1000;//换算成kw
if (p < 2)
return Math.Round(p, 4);
if (p < 30)
return Math.Round(p, 3);
if (p < 100)
return Math.Round(p, 2);
return Math.Round(p, 1);
}
///
/// 计算功率
///
/// 瞬时流量 m³/h
/// 扬程 m
/// 效率 百分数
/// 密度kg/m³
/// kw
public static double CalculateP(double q, double h, double e, double ρ)
{
return CalculateP(q, h, e, ρ, ConstantParas.g);
}
///
/// 计算功率
///
/// 瞬时流量 m³/h
/// 扬程 m
/// 效率 百分数
/// kw
public static double CalculateP(double q, double h, double e)
{
return CalculateP(q, h, e, ConstantParas.WaterDensity, ConstantParas.g);
}
#endregion
#region Mpa<=>m
///
/// Mpa=>m
///
public static double Mpa2M(double mpa)
{
return mpa * ConstantParas.WaterDensity / ConstantParas.g;
}
///
/// m=>Mpa
///
public static double M2Mpa(double m)
{
return m * ConstantParas.g / ConstantParas.WaterDensity;
}
#endregion
#region 计算用电量
///
/// 计算用电量
///
/// 功率kw
/// 时间h
/// kw*h
public static double CalculateD(double p, double t)
{
return p * t;
}
#endregion
#region 计算累积流量
///
/// 计算累积流量
///
/// 瞬时流量m³/h
/// 时间h
/// m³
public static double CalculateQt(double q, double t)
{
return q * t;
}
#endregion
#region 计算能耗
///
/// 计算千吨能耗
///
/// 功率kW
/// 瞬时流量m³/h
/// kW·h/km³
public static double CalculateWP(double p, double q)
{
if (q < 0.1)
return 0;
return p / q * 1000;
}
///
/// 计算单位能耗
///
/// 功率kW
/// 瞬时流量m³/h
/// 扬程m
/// kW·h/km³
public static double CalculateUWP(double p, double q, double h)
{
if (q < 0.1)
return default;
if (h < 0.1)
return default;
return p / q / h * 1000;
}
#endregion
#region 计算其他压力 nsx 20220504
///
/// 计算其他压力
///
/// 流量 m³/h
/// 进口管径 mm
/// 出口管径 mm
/// 进口标高 m
/// 出口标高 m
///
public static double CalculateOtherPress(double? q, double? inletPipeDia, double? outletPipeDia, double? inletElevation, double? outletElevation)
{
if (q == null || q.Value < 0.05)
{
if (outletElevation == null || inletElevation == null)
return 0;
return outletElevation.Value - inletElevation.Value;
}
double flow = q.Value;
double inPipeV = 0;
if (inletPipeDia != null && inletPipeDia.Value > 0.1)
{
// 流速计算 pipeD =mm,pumpFlow=m3/p
inPipeV = ConstantParas.OtherPressCoeff * flow / inletPipeDia.Value / inletPipeDia.Value;
}
double outPipeV = 0;
if (outletPipeDia != null && outletPipeDia.Value > 0.1)
{
// 流速计算 rPipeD =mm,rPumpFlow=m3/p
outPipeV = ConstantParas.OtherPressCoeff * flow / outletPipeDia.Value / outletPipeDia.Value;
}
double differV = (outPipeV * outPipeV - inPipeV * inPipeV) / ConstantParas.g / 2.0;
if (outletElevation == null || inletElevation == null)
return differV;
return differV + outletElevation.Value - inletElevation.Value;
}
#endregion
#region 计算50Hz时的值
///
/// 根据频率计算 50hz流量
///
/// 瞬时流量 m³/h
/// 频率 kw
///
public static double Calculate50QByHz(double q, double hz)
{
if (hz < 10 || hz > 49.9)
return q;
double f_ratio = 50 / hz;
return q * f_ratio;
}
///
/// 根据频率计算 50hz扬程
///
/// 扬程 m
/// 频率 kw
///
public static double Calculate50HByHz(double h, double hz)
{
if (hz < 10 || hz > 49.9)
return h;
double f_ratio = 50 / hz;
return h * f_ratio * f_ratio;
}
///
/// 根据频率计算 50hz功率
///
/// 功率 kw
/// 频率 kw
///
public static double CalculatePByHz(double p, double hz)
{
if (hz < 10 || hz > 49.9)
return p;
double f_ratio = 50 / hz;
return p * f_ratio * f_ratio * f_ratio;
}
#endregion
#region 相似换算
///
/// 计算相似流量扬程曲线
///
/// 表达式
/// 原始频率
/// 换算频率
/// 拟合点数量
///
public static CurveExpress CalculateSimilarQH(CurveExpress express, double originHz, double changeHz, int pointNumber = 12)
{
if (express == null)
return null;
if (changeHz < 1)
return null;
List fitPoints = null;
if (express.DefinePoints != null && express.DefinePoints.Any())
fitPoints = express.DefinePoints;
else
fitPoints = FitCurveHelper.GetFitPoints(express, pointNumber);
var ratio = changeHz / originHz;
var similarPoints = new List();
foreach (CurvePoint fitPoint in fitPoints)
{
var similarPoint = new CurvePoint();
similarPoint.X = fitPoint.X * ratio;
similarPoint.Y = fitPoint.Y * ratio * ratio;
similarPoints.Add(similarPoint);
}
return new CurveExpress(similarPoints, express.FitType);
}
///
/// 计算相似流量功率曲线
///
/// 表达式
/// 原始频率
/// 换算频率
/// 拟合点数量
///
public static CurveExpress CalculateSimilarQP(CurveExpress express, double originHz, double changeHz, int pointNumber = 12)
{
if (express == null)
return null;
if (changeHz < 1)
return null;
List fitPoints = null;
if (express.DefinePoints != null && express.DefinePoints.Any())
fitPoints = express.DefinePoints;
else
fitPoints = FitCurveHelper.GetFitPoints(express, pointNumber);
var ratio = changeHz / originHz;
var similarPoints = new List();
foreach (CurvePoint fitPoint in fitPoints)
{
var similarPoint = new CurvePoint();
similarPoint.X = fitPoint.X * ratio;
similarPoint.Y = fitPoint.Y * ratio * ratio * ratio;
similarPoints.Add(similarPoint);
}
return new CurveExpress(similarPoints, express.FitType);
}
///
/// 计算相似流量效率曲线
///
/// 表达式
/// 原始频率
/// 换算频率
/// 拟合点数量
///
public static CurveExpress CalculateSimilarQE(CurveExpress express, double originHz, double changeHz, int pointNumber = 12)
{
if (express == null)
return null;
if (changeHz < 1)
return null;
List fitPoints = null;
if (express.DefinePoints != null && express.DefinePoints.Any())
fitPoints = express.DefinePoints;
else
fitPoints = FitCurveHelper.GetFitPoints(express, pointNumber);
var ratio = changeHz / originHz;
var similarPoints = new List();
foreach (CurvePoint fitPoint in fitPoints)
{
var similarPoint = new CurvePoint();
similarPoint.X = fitPoint.X * ratio;
similarPoint.Y = fitPoint.Y;
similarPoints.Add(similarPoint);
}
return new CurveExpress(similarPoints, express.FitType);
}
///
/// 计算相似流量扬程点
///
/// 点
/// 原始频率
/// 换算频率
///
public static CurvePoint CalculateSimilarQH(CurvePoint fitPoint, double originHz, double changeHz)
{
if (fitPoint == null)
return null;
if (changeHz < 1)
return null;
var ratio = changeHz / originHz;
var similarPoint = new CurvePoint();
similarPoint.X = fitPoint.X * ratio;
similarPoint.Y = fitPoint.Y * ratio * ratio;
return similarPoint;
}
///
/// 计算相似流量功率点
///
/// 点
/// 原始频率
/// 换算频率
///
public static CurvePoint CalculateSimilarQP(CurvePoint fitPoint, double originHz, double changeHz)
{
if (fitPoint == null)
return null;
if (changeHz < 1)
return null;
var ratio = changeHz / originHz;
var similarPoint = new CurvePoint();
similarPoint.X = fitPoint.X * ratio;
similarPoint.Y = fitPoint.Y * ratio * ratio * ratio;
return similarPoint;
}
///
/// 计算相似流量效率点
///
/// 点
/// 原始频率
/// 换算频率
///
public static CurvePoint CalculateSimilarQE(CurvePoint fitPoint, double originHz, double changeHz)
{
if (fitPoint == null)
return null;
if (changeHz < 1)
return null;
var ratio = changeHz / originHz;
var similarPoint = new CurvePoint();
similarPoint.X = fitPoint.X * ratio;
similarPoint.Y = fitPoint.Y;
return similarPoint;
}
#endregion
}
}