using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CapMachine.Wpf.PPCalculation
{
public class AirCALCHepler
{
//public AirCALCHepler()
//{
// //gENozzle[0] = 40;
// //gENozzle[1] = 50;
// //gENozzle[2] = 80;
//}
//public static double[] gENozzle = new double[3] { 40,50,80};
public static double[] gENozzle = new double[3] { 40, 50, 80 };
///
/// 喷嘴集合数据
///
public static List ListRozzle = new List()
{
new Rozzle()
{
Enable=false,
Name="Rozzle1",
Value=40
},
new Rozzle()
{
Enable=false,
Name="Rozzle2",
Value=50
},
new Rozzle()
{
Enable=false,
Name="Rozzle3",
Value=80
}
};
public static double Pws(double CT)
{
// 输出:水蒸汽分压力 kg/cm2
return Math.Pow(10, (-7.90298 * (CT - 1) + 5.02808 * Math.Log(CT) / 2.30259 - 0.00000013816 * (Math.Pow(10, (11.344 * (1 - 1 / (double)CT))) - 1) + 0.0081328 * (Math.Pow(10, (-3.49149 * (CT - 1))) - 1) + Math.Log(1.03323) / 2.30259));
}
///
/// 另外增加的附加的整合函数
///
/// Cd-摄氏干球温度
/// 输出:CRH:相对湿度%
/// PKK-零调差压(大气压减去测量点的气压)==静压
/// BPRES-测量的大气压 kPa:常数,需提供 kPa=101.325Kpa
/// CDP-测量到的喷嘴差压(Pa)
/// prmAirFlowFactor_i--喷嘴修正系数:设置为默认1.01
/// 风量数据
public static double CVFCALC(double Cd, double CRh, double PKK, double BPRES, double CDP, double prmAirFlowFactor_i)
{
// C1 : 对应于CD饱和蒸汽压 kg/cm2, C2 : 对应于 CW饱和蒸汽压 kg/cm2
// CI : 湿空气比焓 kj/kg
// CKI:湿空气比显热 kj/kg, CSI:湿空气比潜热 kj/kg
// CRH:相对湿度%, CX : 含湿量 kg/kg
// Xs : 对应于 CW的饱和含湿量 kg/kg
// CPw:水蒸汽分压力 kg/cm2
// PKK:试件风阻 Pa 外 - 内
// CG : 湿空气密度 kg/m3, CGg :干空气密度 kg/m3
double CVFResult = 0;
double CI = 0;
double CX = 0;
double CG = 0;
double CGg = 0;
double CPW = 0;
double CKI = 0;
double CSI = 0;
//计算空气数据
AIRCALCEdit(Cd, CRh, ref CX, ref CG, PKK);
CVFResult = CVF(CDP, Cd, CG, prmAirFlowFactor_i, BPRES);
return CVFResult;
}
///
/// 计算空气参数
///
/// 输入:Cd-摄氏干球温度
/// 输入:Cw-摄氏湿球温度
/// 输出: CI : 湿空气比焓 kj/kg
/// 输出: CX : 含湿量 kg/kg
/// 输出:CG : 湿空气密度 kg/m3
/// 输出:CGg :干空气密度 kg/m3
/// 输出:CRH:相对湿度%
/// 输出: CPw:水蒸汽分压力 kg/cm2
/// 输出: CKI:湿空气比显热 kj/kg
/// 输出: CSI:湿空气比潜热 kj/kg
/// 输入:PKK-零调差压(大气压减去测量点的气压)
public static void AIRCALC(double Cd, double Cw, ref double CI, ref double CX, ref double CG, ref double CGg, ref double CRh, ref double CPW, ref double CKI, ref double CSI, double PKK)
{
//专业名词和数据对应
//干球温度:记录仪12号通道
//相对湿度:记录仪11号通道
//静压:记录仪31号通道
//喷嘴压差:记录仪3号通道或者仪表CP1
// 由测量点干球温度和湿球温度计算对应空气参数
// 输入:Cd-摄氏干球温度, Cw-摄氏湿球温度, PKK-零调差压(大气压减去测量点的气压)
// 输出:(CI, CX, CG, CGg, CRH, CPW, CKI, CSI)
double C1, C2, Xs;
// C1 : 对应于CD饱和蒸汽压 kg/cm2, C2 : 对应于 CW饱和蒸汽压 kg/cm2
// CI : 湿空气比焓 kj/kg
// CKI:湿空气比显热 kj/kg, CSI:湿空气比潜热 kj/kg
// CRH:相对湿度%, CX : 含湿量 kg/kg
// Xs : 对应于 CW的饱和含湿量 kg/kg
// CPw:水蒸汽分压力 kg/cm2
// PKK:试件风阻 Pa 外 - 内
// CG : 湿空气密度 kg/m3, CGg :干空气密度 kg/m3
// 大气压力 BPRES: kPa
double BPRES = 1;
C1 = Pws(373.15 / (Cd + 273.15));
C2 = Pws(373.15 / (Cw + 273.15));
CPW = C2 - BPRES / 98.0665 * (Cd - Cw) / (double)1500;
Xs = 0.622 * C2 / (BPRES / 98.0665 - C2);
CX = ((597.3 - 0.559 * Cw) * Xs - 0.24 * (Cd - Cw)) / (0.441 * Cd + 597.3 - Cw);
CRh = CPW / (double)C1 * 100;
CKI = 0.24 * Cd + 0.441 * Cd * CX;
CKI = CKI * 4.1868; // kj/kg
CSI = 597.3 * CX;
CSI = CSI * 4.1868; // kj/kg
CI = 0.24 * Cd + CX * (597.3 + 0.441 * Cd);
CI = CI * 4.1868; // kj/kg
CG = 10000 * (BPRES / 98.0665 - PKK / 98066.5 - CPW) / 29.27 / (Cd + 273.15) * (1 + CX);
CGg = CG / (double)(1 + CX);
}
///
/// 计算空气参数
///
/// 输入:Cd-摄氏干球温度
/// 输出:CRH:相对湿度%
/// 输出: CI : 湿空气比焓 kj/kg
/// 输出: CX : 含湿量 kg/kg
/// 输出:CG : 湿空气密度 kg/m3
/// 输出:CGg :干空气密度 kg/m3
/// 输出: CPw:水蒸汽分压力 kg/cm2
/// 输出: CKI:湿空气比显热 kj/kg
/// 输出: CSI:湿空气比潜热 kj/kg
/// 输入:PKK-零调差压(大气压减去测量点的气压)
public static void AIRCALCEdit(double Cd, double CRh, ref double CX, ref double CG, double PKK)
{
//专业名词和数据对应
//干球温度:记录仪12号通道
//相对湿度:记录仪11号通道
//静压:记录仪31号通道
//喷嘴压差:记录仪3号通道或者仪表CP1
// 由测量点干球温度和湿球温度计算对应空气参数
// 输入:Cd-摄氏干球温度, Cw-摄氏湿球温度, PKK-零调差压(大气压减去测量点的气压)
// 输出:(CI, CX, CG, CGg, CRH, CPW, CKI, CSI)
double C1, C2, Xs;
// C1 : 对应于CD饱和蒸汽压 kg/cm2, C2 : 对应于 CW饱和蒸汽压 kg/cm2
// CI : 湿空气比焓 kj/kg
// CKI:湿空气比显热 kj/kg, CSI:湿空气比潜热 kj/kg
// CRH:相对湿度%, CX : 含湿量 kg/kg
// Xs : 对应于 CW的饱和含湿量 kg/kg
// CPw:水蒸汽分压力 kg/cm2
// PKK:试件风阻 Pa 外 - 内
// CG : 湿空气密度 kg/m3, CGg :干空气密度 kg/m3
// 大气压力 BPRES: kPa
double BPRES = 101.325;
C1 = Pws(373.15 / (Cd + 273.15));
//CPW = C2 - BPRES / 98.0665 * (Cd - Cw) / (double)1500;
var CPW = CRh / 100 * C1;
//Console.WriteLine($"【CPw:水蒸汽分压力 kg/cm2】:{ CPW}");
//Xs = 0.622 * C2 / (BPRES / 98.0665 - C2);
//CX = ((597.3 - 0.559 * Cw) * Xs - 0.24 * (Cd - Cw)) / (0.441 * Cd + 597.3 - Cw);
//CRh = CPW / (double)C1 * 100;
CX = SurroundingClass.Psych(101325, Cd, CRh / 100, 3, 4, 1);//当前的相对湿度要使用小数点,比如28%要输入0.28
//Console.WriteLine($"【CX : 含湿量 kg/kg】:{ CX}");
//CKI = 0.24 * Cd + 0.441 * Cd * CX;
//CKI = CKI * 4.1868; // kj/kg
//CSI = 597.3 * CX;
//CSI = CSI * 4.1868; // kj/kg
//CI = 0.24 * Cd + CX * (597.3 + 0.441 * Cd);
//CI = CI * 4.1868; // kj/kg
CG = 10000 * (BPRES / 98.0665 - PKK / 98066.5 - CPW) / 29.27 / (Cd + 273.15) * (1 + CX);
//Console.WriteLine($"【CG : 湿空气密度 kg/m3】:{ CG}");
//CGg = CG / (double)(1 + CX);
}
///
/// 计算风量数据
///
/// CDP-测量到的喷嘴差压(Pa)
/// CTD-摄氏干球温度就是上面的AIRCALC函数的CD CTD=CD
/// CG-湿空气密度(kg/m3)
/// prmAirFlowFactor_i--喷嘴修正系数,默认1.01
/// 风量数据
public static double CVF(double CDP, double CTD, double CG, double prmAirFlowFactor_i, double BPRES)
{
double C1, C2, C, Y, Cd;
double CVFF, Vnoz;
double Nue, Re;
double tmpNozzleArea;
int i;
int ZDI = 1;
//double BPRES = 0;
// 计算风量
// 输入:CDP-测量到的喷嘴差压(Pa),CTD-摄氏干球温度就是上面的AIRCALC函数的CD CTD=CD,CG-湿空气密度(kg/m3),prmAirFlowFactor_i--喷嘴修正系数,默认1.01
// 输出:CVF--风量: m3/min
// BPRES: 测量的大气压 kPa
//NozSize 直径 需要给 比如90
//gENozzle(i) 提前录入4个数据
// BPRES 常数 对方给我
// ZDI(20 + i) 可以是0也可以是1 作为常数
double result = 0;
foreach (var item in ListRozzle)
{
if (item.Enable)
{
tmpNozzleArea = 3.14159 / 4 * Math.Pow(item.Value, 2) * ZDI * Math.Pow(10, (-6));
Vnoz = System.Math.Sqrt(2 * CDP / (double)CG); // 喷嘴喉部流速
Nue = 4.267 * Math.Pow(10, (-9)) * Math.Pow((273.15 + CTD), 2.5) / (383.55 + CTD) / (BPRES / 98.0665); // 运动黏度
Re = item.Value / (double)1000 * Vnoz / (double)Nue; // 雷诺数
C = 0.9986 - 7.006 / System.Math.Sqrt(Re) + 134.6 / Re; // 流量系数
Y = 0.452 + 0.548 * (1 - CDP / (double)BPRES / (double)1000); // 膨胀系数
Cd = C * Y * prmAirFlowFactor_i;
CVFF = 60 * Cd * System.Math.Sqrt(2 * CDP / (double)CG) * tmpNozzleArea;
result = result + CVFF;
}
}
//for (i = 0; i < 1; i++)
//{
// tmpNozzleArea = 3.14159 / 4 * Math.Pow(gENozzle[i], 2) * ZDI * Math.Pow(10, (-6));
// Vnoz = System.Math.Sqrt(2 * CDP / (double)CG); // 喷嘴喉部流速
// Nue = 4.267 * Math.Pow(10, (-9)) * Math.Pow((273.15 + CTD), 2.5) / (383.55 + CTD) / (BPRES / 98.0665); // 运动黏度
// Re = gENozzle[i] / (double)1000 * Vnoz / (double)Nue; // 雷诺数
// C = 0.9986 - 7.006 / System.Math.Sqrt(Re) + 134.6 / Re; // 流量系数
// Y = 0.452 + 0.548 * (1 - CDP / (double)BPRES / (double)1000); // 膨胀系数
// Cd = C * Y * prmAirFlowFactor_i;
// CVFF = 60 * Cd * System.Math.Sqrt(2 * CDP / (double)CG) * tmpNozzleArea;
// result = result + CVFF;
//}
return result;
}
//public void Calc()
//{
// var abc1, abc2, abc3, abc4, abc5, abc6, abc7, abc8, abc9;
// int LREF, i;
// double BP, BPL, BPV;
// double BT, BTL, BTV, BH, BHL, BHV;
// double BS, BSL, BSV, BV, BVL, BVV;
// // 风洞零调差压A(441):外 - 内
// A(441) = A(7);
// // 大气压力 kPa
// BPRES = A(9);
// // 试验件入口
// // (Cd, Cw, CI, CX, CG, CGg, CRH, CPW, CKI, CSI, PKK)
// AIRCALC(A(1), A(2), A(406), A(403), A(402), A(401), A(405), A(404), A(409), A(410), 0);
// // 工位1
// switch (gTestType(1).No) // 1-冷房能力试验;2,3,5-暖房,非稳态,鉴定试验(即做制热)
// {
// case 1 // 冷房能力试验
// :
// {
// // ****************************************************************************************
// // ***冷房能力
// // 试验件出口
// AIRCALC(A(5), A(6), A(416), A(413), A(412), A(411), abc5, abc6, A(419), A(420), A(441));
// A(414) = A(406) - A(416); // 空气焓差
// A(418) = CVF(A(8), A(5), A(412), 1.01); // 出口容积风量: m3/min
// A(417) = A(418) * A(412); // 出口湿空气质量风量
// A(428) = A(418) * A(411); // 干空气质量风量: kg/min
// if (A(401) != 0)
// A(408) = A(428) / (double)A(401); // 入口容积风量
// // 制冷能力
// A(422) = A(428) * 60 * A(414) / 3.6;
// A(424) = A(428) * 60 * (A(409) - A(419)) / 3.6; // 显热能力
// A(425) = A(428) * 60 * (A(410) - A(420)) / 3.6; // 潜热能力
// A(426) = A(428) * 60 * (A(403) - A(413)) * 1000; // 除湿量
// if (A(424) + A(425) != 0)
// A(427) = A(424) / (double)(A(424) + A(425)) * 100; // 显热比
// if (A(424) + A(425) != 0)
// A(423) = A(425) / (double)(A(424) + A(425)) * 100; // 潜热比
// A(415) = 1.0072 - 0.000642383 * A(6) + 0.0000113358 * Math.Pow(A(6), 2); // 冷凝水定压比热
// break;
// }
// case 2:
// case 3:
// case 5:
// {
// // ************************************************************************************************
// // *****额定暖房能力,非稳态制热能力, 鉴定试验
// A(413) = A(403); // 出口空气含湿量=入口空气含湿量
// // 出口干空气比重
// A(411) = (BPRES / 98.0665 - A(441) / 9.80665 / (double)10000 - A(404)) * 10000 / 29.27 / (double)(A(5) + 273.15);
// A(412) = A(411) * (1 + A(413)); // 出口湿空气比重
// A(430) = (0.24 + 0.441 * A(413)) * 4.1868; // 空气定压比热
// A(418) = CVF(A(8), A(5), A(412), 1.01); // 出口容积风量
// A(417) = A(418) * A(412); // 出口湿空气质量风量
// A(428) = A(418) * A(411); // 干空气质量风量
// if (A(401) > 0)
// A(408) = A(428) / (double)A(401); // 入口容积风量
// // m3/min
// A(422) = A(428) * 60 * (A(5) - A(1)) * A(430) / 3.6; // 制热能力
// A(416) = A(406) + (A(5) - A(1)) * A(430);
// break;
// }
// }
//}
}
///
/// 主要使用到Psych 获取含湿量
///
public class SurroundingClass
{
// The function and subfunctions defined herein come with no warranty or certification of fitness for any purpose
// Do not use these functions for conditions outside boundaries defined by their original sources.
// Subfunctions use equations from the following sources:
// ASHRAE Fundamentals, 2005, SI Edition Chapter 6
// The function will calculate various properties of moist air. Properties calculated include Wet Bulb, Dew Point, Relative Humidity, Humidity Ratio, Vapor Pressure, Degree of Saturation, enthalpy, specific volume of dry air, and moist air density.
// The function requires input of: barometric pressure, temperature, and one other parameter. This third parameter car be Wet Bulb, Dew Point, RH, or Humidity Ratio.
// Also included are STD_Press(Elevation) and STD_Temp(Elevation)
///
/// 计算得到含湿量
///
/// 大气压
/// 干球温度
/// 相对湿度
/// 固定3
/// 固定4
/// 固定1
///
public static double Psych(double P, double Tdb, double InV, int InNum, int OutNum, int SIq)
{
// P是大气压
// Tdb是干球温度
// InV是相对湿度
//
double Twb = 0;
double Dew = 0;
double RH = 0;
double W = 0;
double h = 0;
// Psych was originally made for the WCEC to have simular syntax to a troublesome plugin we were already using.
// Psych will calculate properties of most air. It can calculate
// Wet Bulb, Dew Point, RH, Humidity Ratio, Vapor Pressure, degree of saturation, enthalpy, or specific volume of dry air, or moist air density
// based up Pressure, Temperature, and one other parameter. This other parameter can be Wet Bulb, Dew Point, RH, Humidity Ratio, or Enthalpy.
// psych(P,Tdb,InV,InNum,OutNum, SIq)
// Where
// P is the barometric pressure in PSI or Pa.
// Tdb is the dry bulb in F or C
// InV is another parameter of choice (Wet bulb, Dew point, RH, Humidity Ratio, or Enthalpy)
// InNum is the number that corrisponds to your choice of InV's parameter (1 through 4 or 7 respectivly)
// OutNum is the value requested. It should be an integer between 1 and 10 excluding 8. See below
// SIq is the optional unit selector. 0 is IP, 1 is SI. 0/IP is default if ommitted.
// The Numbers for InNum and OutNum are
// 1 Web Bulb Temp F or C Valid for Input
// 2 Dew point F or C Valid for input
// 3 RH between 0 and 1 Valid for input
// 4 Humidity Ratio Mass Water/ Mass Dry Air Valid for input
// 5 Water Vapor Pressure PSI or Pa
// 6 Degree of Saturation between 0 and 1
// 7 Enthalpy BTU/lb dry air or kJ/kg dry air Valid for input
// Warning 0 state for IP is ~0F, 0% RH ,and 1 ATM, 0 state for SI is 0C, 0%RH and 1 ATM
// 8 NOT VALID, Should be entropy
// 9 Specific Volume ft^3/lbm or m^3/kg dry air
// 10 Moist Air Density lb/ft^3 or m^3/kg
double Out = 0;
//if (IsMissing(SIq))
//{
// SIq = 0;
//}
if (SIq == 1)
{
P = P / (double)1000; // Turns Pa to kPA
if (InNum == 1)
Twb = InV;
else if (InNum == 2)
Dew = InV;
else if (InNum == 3)
RH = InV;
else if (InNum == 4)
W = InV;
else if (InNum == 7)
h = InV;
}
else
{
Tdb = (Tdb - 32) / 1.8;
P = P * 4.4482216152605 / Math.Pow(0.0254, 2) / (double)1000; // PSI to kPa Conversion factor exact
if (InNum == 1)
Twb = (InV - 32) / 1.8; // F to C
else if (InNum == 2)
Dew = (InV - 32) / 1.8; // F to C
else if (InNum == 3)
RH = InV; // no need to change
else if (InNum == 4)
W = InV; // no need to change
else if (InNum == 7)
h = InV * 1.055056 / 0.45359237 - 17.884444444;
}
if (OutNum == 3 | OutNum == 1)
{
if (InNum == 1)
RH = Rel_hum(Tdb, Twb, P);
else if (InNum == 2)
RH = Sat_press(Dew) / Sat_press(Tdb);
else if (InNum == 3)
{
}
else if (InNum == 4)
RH = Part_press(P, W) / Sat_press(Tdb);
else if (InNum == 7)
{
W = (1.006 * Tdb - h) / (double)(-(2501 + 1.86 * Tdb));
// Algebra from 2005 ASHRAE Handbook - Fundamentals - SI P6.9 eqn 32
RH = Part_press(P, W) / Sat_press(Tdb);
}
}
else if (InNum == 1)
W = Hum_rat(Tdb, Twb, P);
else if (InNum == 2)
W = 0.621945 * Sat_press(Dew) / (P - Sat_press(Dew));
else if (InNum == 3)
W = Hum_rat2(Tdb, RH, P);
else if (InNum == 4)
{
}
else if (InNum == 7)
W = (1.006 * Tdb - h) / (double)(-(2501 + 1.86 * Tdb));
// P, Tdb, and W are now availible
if (OutNum == 1)
Out = Wet_bulb(Tdb, RH, P);
else if (OutNum == 2)
Out = Dew_point(P, W);
else if (OutNum == 3)
Out = RH;
else if (OutNum == 4)
Out = W;
else if (OutNum == 5)
Out = Part_press(P, W) * 1000;
else if (OutNum == 6)
Out = W / Hum_rat2(Tdb, 1, P);
else if (OutNum == 7)
Out = Enthalpy_Air_H2O(Tdb, W);
else if (OutNum == 8)
Out = 5 / (double)0;
else if (OutNum == 9)
Out = 1 / (double)(Dry_Air_Density(P, Tdb, W));
else if (OutNum == 10)
Out = Dry_Air_Density(P, Tdb, W) * (1 + W);
if (SIq == 0)
{
if (OutNum == 1 | OutNum == 2)
Out = 1.8 * Out + 32;
else if (OutNum == 5)
Out = Out * Math.Pow(0.0254, 2) / 4.448230531;
else if (OutNum == 7)
Out = (Out + 17.88444444444) * 0.45359237 / 1.055056;
else if (OutNum == 9)
Out = Out * 0.45359265 / (Math.Pow((12 * 0.0254), 3));
else if (OutNum == 10)
Out = Out * Math.Pow((12 * 0.0254), 3) / 0.45359265;
}
return Out;
}
public static double Part_press(double P, double W)
{
// Function to compute partial vapor pressure in [kPa]
// From page 6.9 equation 38 in ASHRAE Fundamentals handbook (2005)
// P = ambient pressure [kPa]
// W = humidity ratio [kg/kg dry air]
var Part_pressData = P * W / (double)(0.62198 + W);
return Part_pressData;
}
public static double Sat_press(double Tdb)
{
// Function to compute saturation vapor pressure in [kPa]
// ASHRAE Fundamentals handbood (2005) p 6.2, equation 5 and 6
// Tdb = Dry bulb temperature [degC]
// Valid from -100C to 200 C
var C1 = -5674.5359;
var C2 = 6.3925247;
var C3 = -0.009677843;
var C4 = 0.00000062215701;
var C5 = 2.0747825E-09;
var C6 = -9.484024E-13;
var C7 = 4.1635019;
var C8 = -5800.2206;
var C9 = 1.3914993;
var C10 = -0.048640239;
var C11 = 0.000041764768;
var C12 = -0.000000014452093;
var C13 = 6.5459673;
var TK = Tdb + 273.15; // Converts from degC to degK
if (TK <= 273.15)
{
var Sat_press1 = Math.Exp(C1 / (double)TK + C2 + C3 * TK + C4 * Math.Pow(TK, 2) + C5 * Math.Pow(TK, 3) + C6 * Math.Pow(TK, 4) + C7 * Math.Log(TK)) / (double)1000;
return Sat_press1;
}
else
{
var Sat_press2 = Math.Exp(C8 / (double)TK + C9 + C10 * TK + C11 * Math.Pow(TK, 2) + C12 * Math.Pow(TK, 3) + C13 * Math.Log(TK)) / (double)1000;
return Sat_press2;
}
}
public static double Hum_rat(double Tdb, double Twb, double P)
{
// Function to calculate humidity ratio [kg H2O/kg air]
// Given dry bulb and wet bulb temp inputs [degC]
// ASHRAE Fundamentals handbood (2005)
// Tdb = Dry bulb temperature [degC]
// Twb = Wet bulb temperature [degC]
// P = Ambient Pressure [kPa]
var Pws = Sat_press(Twb);
var Ws = 0.62198 * Pws / (double)(P - Pws); // Equation 23, p6.8
if (Tdb >= 0)
{
// Equation 35, p6.9
var Hum_rat1 = ((2501 - 2.326 * Twb) * Ws - 1.006 * (Tdb - Twb)) / (double)(2501 + 1.86 * Tdb - 4.186 * Twb);
return Hum_rat1;
}
else
{
// Equation 37, p6.9
var Hum_rat2 = ((2830 - 0.24 * Twb) * Ws - 1.006 * (Tdb - Twb)) / (double)(2830 + 1.86 * Tdb - 2.1 * Twb);
return Hum_rat2;
}
}
public static double Hum_rat2(double Tdb, double RH, double P)
{
// Function to calculate humidity ratio [kg H2O/kg air]
// Given dry bulb and wet bulb temperature inputs [degC]
// ASHRAE Fundamentals handbood (2005)
// Tdb = Dry bulb temperature [degC]
// RH = Relative Humidity [Fraction or %]
// P = Ambient Pressure [kPa]
var Pws = Sat_press(Tdb);
var Hum_rat2 = 0.62198 * RH * Pws / (double)(P - RH * Pws); // Equation 22, 24, p6.8
return Hum_rat2;
}
public static double Rel_hum(double Tdb, double Twb, double P)
{
// Calculates relative humidity ratio
// ASHRAE Fundamentals handbood (2005)
// Tdb = Dry bulb temperature [degC]
// Twb = Wet bulb temperature [degC]
// P = Ambient Pressure [kPa]
var W = Hum_rat(Tdb, Twb, P);
var Rel_humVlue = Part_press(P, W) / Sat_press(Tdb); // Equation 24, p6.8
return Rel_humVlue;
}
public static double Rel_hum2(double Tdb, double W, double P)
{
// Calculates the relative humidity given:
// Tdb = Dry bulb temperature [degC]
// P = ambient pressure [kPa]
// W = humidity ratio [kg/kg dry air]
var Pw = Part_press(P, W);
var Pws = Sat_press(Tdb);
var Rel_hum2 = Pw / (double)Pws;
return Rel_hum2;
}
public static double Wet_bulb(double Tdb, double RH, double P)
{
// Calculates the Wet Bulb temp given dry blub temp [degC] and Relative Humidity
// Uses Newton-Rhapson iteration to converge quickly
// Tdb = Dry bulb temperature [degC]
// RH = Relative humidity ratio [Fraction or %]
// P = Ambient Pressure [kPa]
var W_normal = Hum_rat2(Tdb, RH, P);
var Wet_bulb = Tdb;
// Solve to within 0.001% accuracy using Newton-Rhapson
var W_new = Hum_rat(Tdb, Wet_bulb, P);
while (Math.Abs((W_new - W_normal) / (double)W_normal) > 0.00001)
{
var W_new2 = Hum_rat(Tdb, Wet_bulb - 0.001, P);
var dw_dtwb = (W_new - W_new2) / 0.001;
Wet_bulb = Wet_bulb - (W_new - W_normal) / (double)dw_dtwb;
W_new = Hum_rat(Tdb, Wet_bulb, P);
}
return Wet_bulb;
}
public static double Enthalpy_Air_H2O(double Tdb, double W)
{
// Calculates enthalpy in kJ/kg (dry air)
// Tdb = Dry bulb temperature [degC]
// W = Humidity Ratio [kg/kg dry air]
// Calculations from 2005 ASHRAE Handbook - Fundamentals - SI P6.9 eqn 32
var Enthalpy_Air_H2OValue = 1.006 * Tdb + W * (2501 + 1.86 * Tdb);
return Enthalpy_Air_H2OValue;
}
public static double Dew_point(double P, double W)
{
// Function to compute the dew point temperature (deg C)
// From page 6.9 equation 39 and 40 in ASHRAE Fundamentals handbook (2005)
// P = ambient pressure [kPa]
// W = humidity ratio [kg/kg dry air]
// Valid for Dew Points less than 93 C
var C14 = 6.54;
var C15 = 14.526;
var C16 = 0.7389;
var C17 = 0.09486;
var C18 = 0.4569;
var Pw = Part_press(P, W);
var alpha = Math.Log(Pw);
var Tdp1 = C14 + C15 * alpha + C16 * Math.Pow(alpha, 2) + C17 * Math.Pow(alpha, 3) + C18 * Math.Pow(Pw, 0.1984);
var Tdp2 = 6.09 + 12.608 * alpha + 0.4959 * Math.Pow(alpha, 2);
if (Tdp1 >= 0)
{
return Tdp1;
}
else
{
return Tdp2;
}
}
public static double Dry_Air_Density(double P, double Tdb, double W)
{
// Function to compute the dry air density (kg_dry_air/m^3), using pressure
// [kPa], temperature [C] and humidity ratio
// From page 6.8 equation 28 ASHRAE Fundamentals handbook (2005)
// [rho_dry_air] = Dry_Air_Density(P, Tdb, w)
// Note that total density of air-h2o mixture is:
// rho_air_h2o = rho_dry_air * (1 + W)
// gas constant for dry air
var R_da = 287.055;
var Dry_Air_DensityValue = 1000 * P / (double)(R_da * (273.15 + Tdb) * (1 + 1.6078 * W));
return Dry_Air_DensityValue;
}
// ATMOSPHERE ATMOSPHERE ATMOSPHERE ATMOSPHERE
public static double STD_Press(double Elevation)
{
// Module to calculate the standard pressure [kPa] at given elevation (meters)
// ASHRAE Fundamentals 2005 - chap 6, eqn 3
// Valid from -5000m to 11000m
return 101.325 * Math.Pow((1 - 0.0000225577 * Elevation), 5.2559);
}
public static double STD_Temp(double Elevation)
{
// Module to calculate the standard temperature [degC] at given elevation (meters)
// ASHRAE Fundamentals 2005 - chap 6, eqn 4
// Valid from -5000m to 11000m
var STD_Temp = 15 - 0.0065 * Elevation;
return STD_Temp;
}
}
///
/// 喷嘴直径数据
///
public class Rozzle
{
///
/// 启用
///
public bool Enable { get; set; }
///
/// 名称
///
public string Name { get; set; }
///
/// 直径数据
///
public double Value { get; set; }
}
}