// 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; }