Files
envi-code/SourceCode/Code2026/tg_shs/shs_pipewire/AirState.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

567 lines
16 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// AirState.cpp: implementation of the CAirState class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "resource.h"
#include "AirState.h"
#include "math.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//***************************************************************************************************
// 绘焓湿图
//***************************************************************************************************
// 通过温度(T)计算饱合水蒸汽分压力(PQB), 经验式
double JS_PQB_FROM_T(double ttt)
{
double nRet(0);
double tt = ttt + 273.15;
if(ttt > 0 && ttt < 100){
double n1 = -5800.2206 / tt;
double n2 = -0.048640239 * tt;
double n3 = 0.41764768 * tt * tt * pow(0.1, 4);
double n4 = -0.14452093 * pow(tt, 3) * pow(0.1, 7);
double n5 = log(tt) * 6.5459673;
n1 = n1 + 1.3914993 + n2 + n3 + n4 + n5;
nRet = pow(2.718282, n1);
}
else{
double n1 = -5674.5359 / tt;
double n2 = -0.9677843 * tt * 0.01;
double n3 = tt * tt * 0.62215701 * pow(0.1, 6);
//double n4 = pow(tt, 3) * pow(0.1, 8) * 0.20747825;
double n4 = pow(tt, 3) * pow(0.1, 18) * 0.20747825; // modify by cq 2015-09-10 公式错误
double n5 = pow(tt, 4) * pow(0.1, 12) * -0.9484024;
double n6 = log(tt) * 4.1635019;
n1 = n1 + 6.3925247 + n2 + n3 + n4 + n5 + n6;
nRet = pow(2.718282, n1);
}
return nRet;
}
// 通过饱合水蒸汽分压力(PQB),相对湿度,大气压力计算含湿量
double JS_D(double pqba, double fai, double pair)
{
double nRet(0);
double n1 = 0.622 * fai * pqba;
double n2 = pair - fai * pqba;
nRet = n1 / n2;
return nRet;
}
// 通过饱合水蒸汽分压力(PQB),含湿量,大气压力计算相对湿度
double JS_FAI(double Pqb, double d, double B)
{
if(d < 0.00001)
d = 0.00001;
double nRet(0);
d = d / 1000;
nRet = (d * B) / ((0.622 * Pqb) + (d * Pqb));
return nRet;
}
// 通过大气压力,含湿量计算水蒸气分压力
double JS_PQ(double B, double d)
{
if(d < 0.00001)
d = 0.00001;
double nRet(0);
nRet = B / (d + 622) * d;
return nRet;
}
// 通过水蒸气分压力计算露点温度
double JS_TL(double Pq)
{
double nRet(0);
double y = log(Pq);
if(Pq > 611.17){
nRet = (-35.957 - 1.8726 * y) + y*y*1.1689;
}
else{
nRet = (-60.45 + 7.0322 * y) + y*y*0.37;
}
if(Pq <= 0)
nRet = 0;
return nRet;
}
// 通过水蒸气分压力,饱和水蒸气分压力计算相对湿度
double JS_FAIA(double pq, double pqb)
{
return pq/pqb;
}
// 通过含湿量,温度计算焓值
double JS_HAN(double t, double d)
{
if(d < 0.00001)
d = 0.00001;
double nRet(0);
d = d/1000;
nRet = (1.01 * t) + (2500 + 1.84 * t)* d;
return nRet;
}
// 通过饱和水蒸气分压力,相对湿度计算水蒸气分压力
double JS_PQA(double pqb, double fai)
{
return pqb*fai;
}
//功能:计算焓值
//返回值: 焓值kJ/kg
//参数: 大气压力,干球温度,相对湿度
double JS_E(double dbB,double dbD,double dbRH)
{
double Pqb = JS_PQB_FROM_T(dbD);
double Pq = dbRH * Pqb;
double d = 0.622 * (Pq / (dbB - Pq));
d *= 1000;
double i = JS_HAN(dbD,d);
return i;
}
//功能:计算湿球温度
//返回值: 湿球温度
//参数: 大气压力,焓值
double JS_W(double dbB,double dbE)
{
double ts = -1;
double ts_High,ts_Low;
for(int k=-40; k<=70; k+=10)
{
ts_Low = (double)k;
ts_High = ts_Low + 10;
double i_Low,i_High;
i_Low = JS_E(dbB,ts_Low,1.0);
i_High = JS_E(dbB,ts_High,1.0);
if(i_Low <= dbE && i_High >= dbE)
break;
}
double dbI = 0.0;
double dbDiff = 100.0;
for(double t=ts_Low; t<=ts_High; t+=0.05)
{
dbI = JS_E(dbB,t,1.0);
if(fabs(dbI - dbE) < dbDiff)
{
dbDiff = fabs(dbI - dbE);
ts = t;
}
}
return ts;
}
// 根据焓, 相对湿度,大气压 计算干球温度
// 因为 Ts nPqb 2个参数未知, 所以采用逼近法
double JS_T_i_FAI_B(double i, double fai, double B)
{
double tg = -1;
double tg_High,tg_Low;
for(int k=-40; k<=70; k+=10)
{
tg_Low = (double)k;
tg_High = tg_Low + 10;
double i_Low,i_High;
i_Low = JS_E(B,tg_Low,fai);
i_High = JS_E(B,tg_High,fai);
if(i_Low <= i && i_High >= i)
break;
}
double dlttg = tg_High - tg_Low;
int nCount = 0;
while (fabs(dlttg) > 1e-4 && nCount < 1000)
{
nCount++;
tg = tg_High - dlttg * (JS_E(B,tg_High,fai) - i) / (JS_E(B,tg_High,fai) - JS_E(B,tg_Low,fai));
tg_Low = tg_High;
tg_High = tg;
dlttg = tg_High - tg_Low;
}
return tg;
}
// 根据饱和水蒸气分压力, 计算干球温度
// 因为 是多次方程, 所以采用逼近法
double JS_T(double nPqb)
{
double t = -1.0;
double t_High,t_Low;
for(int k=-40; k<=70; k+=10)
{
t_Low = (double)k;
t_High = t_Low + 10;
double Pqb_Low,Pqb_High;
Pqb_Low = JS_PQB_FROM_T(t_Low);
Pqb_High = JS_PQB_FROM_T(t_High);
if(Pqb_Low <= nPqb && Pqb_High >= nPqb)
break;
}
double dltt = t_High - t_Low;
int nCount = 0;
while (fabs(dltt) > 1e-4)
{
t = t_High - dltt * ((JS_PQB_FROM_T(t_High) - nPqb) / (JS_PQB_FROM_T(t_High) - JS_PQB_FROM_T(t_Low)));
t_Low = t_High;
t_High = t;
dltt = t_High - t_Low;
nCount++;
if(nCount >= 1000)
{
if(fabs(JS_PQB_FROM_T(t_High) - nPqb) > fabs(JS_PQB_FROM_T(t_Low) - nPqb))
return t_Low;
else
return t_High;
}
}
return t;
}
// 根据大气压力, 干球温度,含湿量 , 计算密度
double JS_DENSITY(double B,double t,double d)
{
if(d < 0.00001)
d = 0.00001;
double density = 0.0;
double Pq = 0.0;
Pq = JS_PQ(B,d);
double T = t + 273.13;
density = (0.00348 * B - 0.00132 * Pq) / T;
return density;
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CAirState::CAirState(double dbB)
{
m_dbB = 0.0;//大气压力
m_dbD = 0.0;//干球温度
m_dbDew = 0.0;//露点温度
m_dbW = 0.0;//湿球温度
m_dbRH = 0.0; //相对湿度(%): 0-1的一个小数
m_dbHR = 0.0;//含湿量 kg/kg
m_dbE = 0.0; //焓
m_dbWP = 0.0;//水蒸气分压力
m_dbSHR = 0.0;//饱和含湿量
m_dbSWP = 0.0;//饱和水蒸气分压力
m_dbDensity = 0.0;//密度
m_dbB = dbB;
SetD_RH(20,0.5);
}
CAirState::~CAirState()
{
}
void CAirState::SetD_W(double dbD,double dbW)
{
m_dbD = dbD; // 干球
m_dbW = dbW; // 湿球
m_dbSWP = JS_PQB_FROM_T(m_dbD); //计算 饱和水蒸气分压力(Pa)Pqb
double nPqbWet = JS_PQB_FROM_T(m_dbW);
double nDts = (621.98 * nPqbWet) / (m_dbB - nPqbWet);
m_dbHR = (2501 - 2.381 * m_dbW) * 0.001 * nDts - (m_dbD - m_dbW);
m_dbHR = m_dbHR / ((1.805 * m_dbD + 2501) - 4.186 * m_dbW) * 1000; //含湿量
m_dbE = 1.01*m_dbD + (2500 + 1.84 * m_dbD) * m_dbHR / 1000; //焓
m_dbWP = JS_PQ(m_dbB, m_dbHR); //水蒸气分压力(Pa)
m_dbRH = JS_FAI(m_dbSWP,m_dbHR, m_dbB); //计算相对湿度
m_dbDew = JS_TL(m_dbWP); //露点温度
m_dbSHR = JS_D(m_dbSWP, 1, m_dbB) * 1000; //饱和含湿量
m_dbDensity = JS_DENSITY(m_dbB,m_dbD,m_dbHR);
}
void CAirState::SetD_Dew(double dbD,double dbDew)
{
m_dbD = dbD;
m_dbDew = dbDew;
m_dbWP = JS_PQB_FROM_T(m_dbDew);
m_dbSWP = JS_PQB_FROM_T(m_dbD);
m_dbRH = JS_FAIA(m_dbWP, m_dbSWP);
m_dbHR = JS_D(m_dbSWP, m_dbRH, m_dbB) * 1000;
m_dbE = JS_HAN(m_dbD, m_dbHR);
m_dbSHR = JS_D(m_dbSWP, 1, m_dbB) * 1000;
m_dbW = JS_W(m_dbB,m_dbE);
m_dbDensity = JS_DENSITY(m_dbB,m_dbD,m_dbHR);
}
void CAirState::SetD_HR(double dbD,double dbHR)
{
m_dbD = dbD;
m_dbHR = dbHR;
m_dbSWP = JS_PQB_FROM_T(m_dbD);
m_dbE = JS_HAN(m_dbD, m_dbHR);
m_dbRH = JS_FAI(m_dbSWP, m_dbHR, m_dbB);
m_dbWP = JS_PQ(m_dbB, m_dbHR);
m_dbDew = JS_TL(m_dbWP);
m_dbW = JS_W(m_dbB,m_dbE);
m_dbSHR = JS_D(m_dbSWP, 1, m_dbB) * 1000;
m_dbDensity = JS_DENSITY(m_dbB,m_dbD,m_dbHR);
}
void CAirState::SetD_RH(double dbD,double dbRH)
{
m_dbRH = dbRH;
m_dbD = dbD;
m_dbSWP = JS_PQB_FROM_T(m_dbD);
m_dbWP = JS_PQA(m_dbSWP, m_dbRH);
m_dbHR = JS_D(m_dbSWP, m_dbRH, m_dbB) * 1000;
m_dbSHR = JS_D(m_dbSWP, 1, m_dbB) * 1000;
m_dbE = JS_HAN(m_dbD, m_dbHR);
m_dbDew = JS_TL(m_dbWP);
m_dbW = JS_W(m_dbB,m_dbE);
m_dbDensity = JS_DENSITY(m_dbB,m_dbD,m_dbHR);
}
void CAirState::SetD_E(double dbD,double dbE)
{
m_dbE = dbE;
m_dbD = dbD;
m_dbSWP = JS_PQB_FROM_T(m_dbD);
m_dbHR= (m_dbE - 1.01 * m_dbD) / (2500 + 1.84*m_dbD) * 1000;
m_dbRH = JS_FAI(m_dbSWP, m_dbHR, m_dbB);
m_dbSHR = JS_D(m_dbSWP, 1, m_dbB) * 1000;
m_dbWP = JS_PQA(m_dbSWP, m_dbRH);
m_dbDew = JS_TL(m_dbWP);
m_dbW = JS_W(m_dbB,m_dbE);
m_dbDensity = JS_DENSITY(m_dbB,m_dbD,m_dbHR);
}
void CAirState::SetD_WP(double dbD,double dbWP)
{
m_dbWP = dbWP;
m_dbD = dbD;
m_dbSWP = JS_PQB_FROM_T(m_dbD);
m_dbDew = JS_TL(m_dbWP);
m_dbRH = JS_FAIA(m_dbWP, m_dbSWP);
m_dbHR= JS_D(m_dbSWP, m_dbRH, m_dbB) * 1000;
m_dbE = JS_HAN(m_dbD, m_dbHR);
m_dbW = JS_W(m_dbB,m_dbE);
m_dbSHR = JS_D(m_dbSWP, 1, m_dbB) * 1000;
m_dbDensity = JS_DENSITY(m_dbB,m_dbD,m_dbHR);
}
void CAirState::SetW_Dew(double dbW,double dbDew)
{
m_dbDew = dbDew;
m_dbW = dbW;
m_dbWP = JS_PQB_FROM_T(dbDew);
double nPqbWet = JS_PQB_FROM_T(dbW);
m_dbHR = (621.98 * m_dbWP) / (m_dbB - m_dbWP);
m_dbD = m_dbW + (nPqbWet - m_dbWP)/(0.000667*m_dbB);
m_dbSWP = JS_PQB_FROM_T(m_dbD);
m_dbRH = JS_FAIA(m_dbWP, m_dbSWP);
m_dbE = JS_HAN(m_dbD, m_dbHR);
m_dbSHR = JS_D(m_dbSWP, 1, m_dbB) * 1000;
m_dbDensity = JS_DENSITY(m_dbB,m_dbD,m_dbHR);
}
void CAirState::SetW_RH(double dbW,double dbRH)
{
m_dbW = dbW;
m_dbRH =dbRH;
double nPqbWet = JS_PQB_FROM_T(m_dbW);
m_dbSHR = (nPqbWet * 0.622) / (m_dbB - nPqbWet);
m_dbE = 1.01*m_dbW + (2500 + 1.84 * m_dbW)*m_dbSHR;
m_dbD = JS_T_i_FAI_B(m_dbE, m_dbRH, m_dbB);
m_dbSWP = JS_PQB_FROM_T(m_dbD);
m_dbHR = JS_D(m_dbSWP, m_dbRH, m_dbB) * 1000;
m_dbSHR = JS_D(m_dbSWP, 1, m_dbB) * 1000;
m_dbWP = JS_PQA(m_dbSWP, m_dbRH);
m_dbDew = JS_TL(m_dbWP);
m_dbDensity = JS_DENSITY(m_dbB,m_dbD,m_dbHR);
}
void CAirState::SetW_HR(double dbW,double dbHR)
{
m_dbW = dbW;
m_dbHR = dbHR;
double nPqbWet = JS_PQB_FROM_T(m_dbW);
m_dbSHR = (nPqbWet * 0.622) / (m_dbB - nPqbWet);
m_dbE = 1.01*m_dbW + (2500 + 1.84 * m_dbW)*m_dbSHR;
m_dbWP = (m_dbHR/1000 * m_dbB)/(0.622+m_dbHR/1000);
m_dbD = (m_dbE - 2500 * m_dbHR / 1000) / (1.01 + 1.84 * m_dbHR / 1000);
m_dbSWP = JS_PQB_FROM_T(m_dbD);
m_dbSHR = JS_D(m_dbSWP, 1, m_dbB) * 1000;
m_dbRH = JS_FAI(m_dbSWP, m_dbHR, m_dbB);
m_dbWP = JS_PQA(m_dbSWP, m_dbRH);
m_dbDew = JS_TL(m_dbWP);
m_dbDensity = JS_DENSITY(m_dbB,m_dbD,m_dbHR);
}
void CAirState::SetW_WP(double dbW,double dbWP)
{
m_dbW = dbW;
m_dbWP = dbWP;
m_dbDew = JS_TL(m_dbWP);
double nPqbWet = JS_PQB_FROM_T(m_dbW);
m_dbSHR = (nPqbWet * 0.622) / (m_dbB - nPqbWet);
m_dbE = 1.01*m_dbW + (2500 + 1.84 * m_dbW)*m_dbSHR;
m_dbHR = (621.98 * m_dbWP) / (m_dbB - m_dbWP);
m_dbD = (m_dbE - 2500 * m_dbHR / 1000) / (1.01 + 1.84 * m_dbHR / 1000);
m_dbSWP = JS_PQB_FROM_T(m_dbD);
m_dbSHR = JS_D(m_dbSWP, 1, m_dbB) * 1000;
m_dbRH = JS_FAI(m_dbSWP, m_dbHR, m_dbB);
m_dbDensity = JS_DENSITY(m_dbB,m_dbD,m_dbHR);
}
void CAirState::SetE_Dew(double dbE,double dbDew)
{
m_dbDew = dbDew;
m_dbE = dbE;
m_dbWP = JS_PQB_FROM_T(m_dbDew);
m_dbHR = (621.98 * m_dbWP) / (m_dbB - m_dbWP);
m_dbD = (m_dbE - 2500 * m_dbHR / 1000) / (1.01 + 1.84 * m_dbHR / 1000);
m_dbSWP = JS_PQB_FROM_T(m_dbD);
m_dbSHR = JS_D(m_dbSWP, 1, m_dbB) * 1000;
m_dbRH = JS_FAI(m_dbSWP, m_dbHR, m_dbB);
m_dbW = JS_W(m_dbB,m_dbE);
m_dbDensity = JS_DENSITY(m_dbB,m_dbD,m_dbHR);
}
void CAirState::SetRH_Dew(double dbRH,double dbDew)
{
m_dbDew = dbDew;
m_dbRH = dbRH;
m_dbWP = JS_PQB_FROM_T(m_dbDew);
m_dbHR = (621.98 * m_dbWP) / (m_dbB - m_dbWP);
m_dbSWP = m_dbWP / m_dbRH;
m_dbSHR = JS_D(m_dbSWP, 1, m_dbB) * 1000;
m_dbD = JS_T(m_dbSWP);
m_dbE = JS_HAN(m_dbD, m_dbHR);
m_dbW = JS_W(m_dbB,m_dbE);
m_dbDensity = JS_DENSITY(m_dbB,m_dbD,m_dbHR);
}
void CAirState::SetE_HR(double dbE,double dbHR)
{
m_dbE = dbE;
m_dbHR = dbHR;
m_dbWP = (m_dbHR/1000 * m_dbB)/(0.622+m_dbHR/1000);
m_dbDew = JS_TL(m_dbWP);
m_dbD = (m_dbE - 2500 * m_dbHR / 1000) / (1.01 + 1.84 * m_dbHR / 1000);
m_dbSWP = JS_PQB_FROM_T(m_dbD);
m_dbRH = m_dbWP / m_dbSWP;
m_dbSHR = JS_D(m_dbSWP, 1, m_dbB) * 1000;
m_dbW = JS_W(m_dbB,m_dbE);
m_dbDensity = JS_DENSITY(m_dbB,m_dbD,m_dbHR);
}
void CAirState::SetE_WP(double dbE,double dbWP)
{
m_dbE = dbE;
m_dbWP = dbWP;
m_dbDew = JS_TL(m_dbWP);
m_dbHR = (621.98 * m_dbWP) / (m_dbB - m_dbWP);
m_dbD = (m_dbE - 2500 * m_dbHR / 1000) / (1.01 + 1.84 * m_dbHR / 1000);
m_dbSWP = JS_PQB_FROM_T(m_dbD);
m_dbRH = m_dbWP / m_dbSWP;
m_dbW = JS_W(m_dbB,m_dbE);
m_dbSHR = JS_D(m_dbSWP, 1, m_dbB) * 1000;
m_dbDensity = JS_DENSITY(m_dbB,m_dbD,m_dbHR);
}
void CAirState::SetHR_RH(double dbHR,double dbRH)
{
if(dbHR < 0.00001)
dbHR = 0.00001;
if(dbRH < 0.1) // mcl add. 防止太小,算 JS_T等值时,会发生除0
dbRH = 0.1;
m_dbHR = dbHR;
m_dbRH = dbRH;
m_dbWP = (m_dbHR/1000 * m_dbB)/(0.622+m_dbHR/1000);
m_dbSWP = m_dbWP / m_dbRH;
m_dbSHR = JS_D(m_dbSWP, 1, m_dbB) * 1000;
m_dbDew = JS_TL(m_dbWP);
m_dbD = JS_T(m_dbSWP);
m_dbE = JS_HAN(m_dbD, m_dbHR);
m_dbW = JS_W(m_dbB,m_dbE);
m_dbDensity = JS_DENSITY(m_dbB,m_dbD,m_dbHR);
}
void CAirState::SetRH_WP(double dbRH,double dbWP)
{
m_dbRH = dbRH;
m_dbWP = dbWP;
m_dbDew = JS_TL(m_dbWP);
m_dbHR = (621.98 * m_dbWP) / (m_dbB - m_dbWP);
m_dbSWP = m_dbWP / m_dbRH;
m_dbD = JS_T(m_dbSWP);
m_dbE = JS_HAN(m_dbD, m_dbHR);
m_dbW = JS_W(m_dbB,m_dbE);
m_dbSHR = JS_D(m_dbSWP, 1, m_dbB) * 1000;
m_dbDensity = JS_DENSITY(m_dbB,m_dbD,m_dbHR);
}
void CAirState::SetRH_E(double dbRH,double dbE)
{
m_dbRH = dbRH;
m_dbE = dbE;
m_dbD = JS_T_i_FAI_B(dbE, dbRH, m_dbB);
m_dbSWP = JS_PQB_FROM_T(m_dbD);
m_dbWP = JS_PQA(m_dbSWP, dbRH);
m_dbDew = JS_TL(m_dbWP);
m_dbHR = (621.98 * m_dbWP) / (m_dbB - m_dbWP);
m_dbSHR = JS_D(m_dbSWP, 1, m_dbB) * 1000;
m_dbW = JS_W(m_dbB,m_dbE);
m_dbDensity = JS_DENSITY(m_dbB,m_dbD,m_dbHR);
}
CAirState& CAirState::operator = (const CAirState& other)
{
m_dbB = other.m_dbB;//大气压力
m_dbD = other.m_dbD;//干球温度
m_dbDew = other.m_dbDew;//露点温度
m_dbW = other.m_dbW;//湿球温度
m_dbRH = other. m_dbRH;//相对湿度(%): 0-1的一个小数
m_dbHR = other.m_dbHR;//含湿量
m_dbE = other.m_dbE ;//焓
m_dbWP = other.m_dbWP;//水蒸气分压力
m_dbSHR = other.m_dbSHR;//饱和含湿量
m_dbSWP = other.m_dbSWP;//饱和水蒸气分压力
m_dbDensity = other.m_dbDensity;//密度
return *this;
}
CString CAirState::GetNoticeText()
{
CString str;
CString sz;
sz.Format( _T("大气压力:|%0.0fPa"),m_dbB);
str += sz;
sz.Format(_T("\n干球温度:|%0.1f℃"),m_dbD);
str += sz;
sz.Format(_T("\n湿球温度:|%0.1f℃"),m_dbW);
str += sz;
sz.Format(_T("\n相对湿度:|%0.1f%%"),m_dbRH * 100.0);
str += sz;
sz.Format(_T("\n含 湿 量:|%0.1fg/kg"),m_dbHR);
str += sz;
sz.Format(_T("\n 焓 :|%0.1fkJ/kg"),m_dbE);
str += sz;
sz.Format(_T("\n露点温度:|%0.1f℃"),m_dbDew);
str += sz;
sz.Format(_T("\n密 度:|%0.1fkg/m^3"),m_dbDensity);
str += sz;
return str;
}