Files
envi-code/SourceCode/Code2026/HvacCmd/HDuctHydraulic.cpp
T
2026-09-28 15:28:50 +08:00

318 lines
8.2 KiB
C++

#include "stdafx.h"
#include "HDuctHydraulic.h"
#include "math.h"
#define ZERO_AIR 1.0e-6
HDuctHydraulic::HDuctHydraulic()
{
m_dFlux = 0.0; // 风量
m_dRough = 0.15; // 内壁粗糙度
m_dTem = 20.0; // 温度
m_nPipeShape = 1; // 类型
m_dWidth = 200.0; // 管宽
m_dHeight = 200.0; // 管高
m_dDia = 200.0; // 直径
m_dLength = 0.0;
m_dVel = 0.0;
m_dRe = 0.0;
m_dFricCoef = 0.0;
m_dR = 0.0;
m_dFricLoss = 0.0;
m_dLocCoef = 0.0;
m_dOtherLocLoss = 0.0;
m_dLocLoss = 0.0;
m_dTotalLoss = 0.0;
m_dDensity = 1.205;
m_dMoveVis = 15.7e-6;
m_csPipeName = _T("");
m_dHeightStart = 0.0;
m_dHeightEnd = 0.0;
m_dVelDia = 0.0;
m_dFluxDia = 0.0;
m_dOutAirDensity = 0.0;
}
HDuctHydraulic::~HDuctHydraulic()
{
}
double HDuctHydraulic::GetVel() const
{
return m_dVel;
}
double HDuctHydraulic::GetR() const
{
return m_dR;
}
double HDuctHydraulic::GetFricLoss() const
{
return m_dFricLoss;
}
void HDuctHydraulic::SetFlux(double dFlux)
{
if (dFlux < 0.0)
return;
m_dFlux = dFlux;
}
void HDuctHydraulic::SetShape(BOOL bIsCircle)
{
if (bIsCircle)
{
m_nPipeShape = 0;
}
else
{
m_nPipeShape = 1;
}
}
void HDuctHydraulic::SetDia(double dDia)
{
if (dDia < 0.0)
return;
m_dDia = dDia;
}
void HDuctHydraulic::SetWidth(double dWidth)
{
if (dWidth < 0.0)
return;
m_dWidth = dWidth;
}
void HDuctHydraulic::SetHeight(double dHeight)
{
if (dHeight < 0.0)
return;
m_dHeight = dHeight;
}
void HDuctHydraulic::SetLength(double dLength)
{
if (dLength < 0.0)
return;
m_dLength = dLength;
}
void HDuctHydraulic::SetRough(double dRough)
{
if (dRough < 0.0)
return;
m_dRough = dRough;
}
void HDuctHydraulic::SetTemperature(double dTem)
{
m_dTem = dTem;
m_dDensity = CalDesity(dTem);
m_dMoveVis = CalMoveVis(dTem);
}
void HDuctHydraulic::SetDensity(double dDensity)
{
m_dDensity = dDensity;
}
void HDuctHydraulic::SetMoveVis(double dMoveVis)
{
m_dMoveVis = dMoveVis;
}
// 计算沿程阻力(计算前设置流量,形状,管径,长度,密度,黏度,粗糙度)
void HDuctHydraulic::CalFricLoss()
{
if (m_nPipeShape == 0)
{
m_dVel = CalVelocity(m_dFlux, m_dDia); // 计算流速
m_dRe = CalRe(m_dVel, m_dDia, m_dMoveVis); // 计算Re
m_dFricCoef = CalFricCoef(m_dRough, m_dDia, m_dRe); // 计算摩擦系数
m_dR = CalR1(m_dVel, m_dFricCoef, m_dDensity, m_dDia); // 计算比摩阻
m_dFricLoss = CalFricLoss(m_dFricCoef, m_dDia, m_dLength, m_dDensity, m_dVel);
}
else
{
m_dVel = CalVelocity(m_dFlux, m_dWidth, m_dHeight);
m_dVelDia = CalVelDia(m_dWidth, m_dHeight);
m_dFluxDia = CalFluxDia(m_dWidth, m_dHeight);
m_dRe = CalRe(m_dVel, m_dVelDia, m_dMoveVis); // 计算Re
m_dFricCoef = CalFricCoef(m_dRough, m_dVelDia, m_dRe); // 计算摩擦系数
m_dR = CalR1(m_dVel, m_dFricCoef, m_dDensity, m_dVelDia); // 计算比摩阻
m_dFricLoss = CalFricLoss(m_dFricCoef, m_dVelDia, m_dLength, m_dDensity, m_dVel);
}
}
// 根据流量(m^3/h)和管径(mm)计算圆管流速(m/s)
double HDuctHydraulic::CalVelocity(double dFlux, double dDia) const
{
if(dDia < ZERO_AIR)
return 0.0;
return dFlux / (9.0e-4 * PI * pow(dDia, 2));
}
// 根据流量(m^3/h)、管宽(mm)和管高(mm)计算矩形管流速(m/s)
double HDuctHydraulic::CalVelocity(double dFlux, double dWidth, double dHeight) const
{
if((dWidth < ZERO_AIR) || (dHeight < ZERO_AIR))
return 0.0;
return dFlux / (3.6e-3 * dWidth * dHeight);
}
// 根据流速(m/s)、摩擦系数、密度(kg/m^3)和管径(mm)计算比摩阻
double HDuctHydraulic::CalR1(double dVelocity, double dFricCoef, double dDensity, double dDia) const
{
if ((dVelocity < 0.0) || (dFricCoef < ZERO_AIR) || (dDensity < ZERO_AIR)
|| (dDia < ZERO_AIR))
return 0.0;
return dFricCoef * dDensity * pow(dVelocity, 2) / (0.002 * dDia);
}
// 流速(m/s)、流速当量直径(mm)和黏度(m^2/s)计算雷诺数
double HDuctHydraulic::CalRe(double dVelocity, double dVelDia, double dMoveVis) const
{
if ((dVelocity < 0.0) || (dVelDia < ZERO_AIR) || (dMoveVis < 1.0e-10))
return ZERO_AIR;
return dVelocity * 0.001 * dVelDia / dMoveVis;
}
// 根据粗糙度(mm)、流速当量直径(mm)和雷诺数计算摩擦系数, 用柯列勃洛克-怀特公式计算
double HDuctHydraulic::CalFricCoef(double dRough, double dCalDia, double dRe) const
{
if ((dRough < 0.0) || (dCalDia < ZERO_AIR) || (dRe < ZERO_AIR))
return ZERO_AIR;
if (dRe < 2000)
return 64 / dRe;
double dA, dB; // 系数a, b
dA = dRough / (3.7 * dCalDia);
dB = 2.51 / dRe;
double dNewX, dOldX; // 用于迭代计算的新旧数据 =1/(FricCoef)^0.5
dNewX = 5.0; // 初始值为5
double e = 1.0; // 两次迭代之差
double t = 0.0;
int nFlag = 0; // 控制最大迭代次数
while ((e > 0.0001) && (nFlag < 100))
{
dOldX = dNewX;
t = dA + dB * dOldX;
if (t < ZERO_AIR)
return 0.0; // 认为无解
dNewX = dOldX - (dOldX + 2 * log10(t)) * (t) * log(10.0) / ((t) * log(10.0) + 2 * dB);
e = fabs(dNewX - dOldX);
nFlag++;
}
if (nFlag >= 100)
return 0.0; // 认为无解
return 1 / pow(dNewX, 2);
}
// 根据摩擦系数、管径(mm)、管长(m)、密度(kg/m^3)和流速(m/s)计算沿程阻力(Pa)
double HDuctHydraulic::CalFricLoss(double dFricCoef, double dDia, double dLength,
double dDensity, double dVelocity) const
{
if ((dFricCoef < ZERO_AIR) || (dDia < ZERO_AIR) || (dLength < 0)
|| (dDensity < ZERO_AIR) || (dVelocity < 0))
return 0.0;
return dFricCoef * dLength * dDensity * pow(dVelocity, 2) / (0.002 * dDia);
}
// 根据局部阻力系数、密度(kg/m^3)、流速(m/s)和其它局部阻力(Pa)计算局部阻力(Pa)
double HDuctHydraulic::CalLocLoss(double dLocCoef, double dDensity, double dVelocity) const
{
if ((dLocCoef < 0) || (dDensity < ZERO_AIR) || (dVelocity < 0))
return 0.0;
return dLocCoef * dDensity * pow(dVelocity, 2) / 2;
}
// 根据沿程阻力(Pa)、局部阻力(Pa)、起点标高(m)、终点标高(m)、管内密度(kg/m^3)和管外密度(kg/m^3)计算总阻力(Pa)
double HDuctHydraulic::CalTotalLoss(double dFricLoss, double dLocLoss, double dStHeight,
double dEndHeight, double dDensity, double dOutAirDensity) const
{
if ((dFricLoss < 0.0) || (dFricLoss < 0.0)
|| (dDensity < ZERO_AIR) || (dOutAirDensity < ZERO_AIR))
return 0.0;
return dFricLoss + dLocLoss + (dEndHeight - dStHeight)
* (dDensity - dOutAirDensity) * 9.8;
}
// 根据管宽(mm)和管高(mm)计算流速当量直径(mm)
double HDuctHydraulic::CalVelDia(double dWidth, double dHeight) const
{
if ((dWidth < ZERO_AIR) || (dHeight < ZERO_AIR))
return 0.0;
return 2 * dWidth * dHeight / (dWidth + dHeight);
}
// 根据管宽(mm)和管高(mm)计算流量当量直径(mm)
double HDuctHydraulic::CalFluxDia(double dWidth, double dHeight) const
{
if ((dWidth < ZERO_AIR) || (dHeight < ZERO_AIR))
return 0.0;
return 1.3 * pow(dWidth * dHeight, 0.625) / pow(dWidth + dHeight, 0.25);
}
// 根据管径(mm)计算圆形断面积(m2)
double HDuctHydraulic::CalSecArea(double dDia) const
{
if (dDia < ZERO_AIR)
return 0.0;
return PI * pow(0.001 * dDia, 2) / 4;
}
// 根据管宽(mm)和管高(mm)计算矩形断面积(m2)
double HDuctHydraulic::CalSecArea(double dWidth, double dHeight) const
{
if ((dWidth < ZERO_AIR) || (dHeight < ZERO_AIR))
return 0.0;
return 1.0e-6 * dWidth * dHeight;
}
/*----------------------------------------------------------------------------*
* 功能描述: 用插值法从一维表格中取值
* 备 注: dAbscissa为表头;共m列数据;dX表示列值;表头升序
-----------------------------------------------------------------------------*/
double CalTable(double dAbscissa[], double *pTable, double dX, int m)
{
if (dX < dAbscissa[0])
dX = dAbscissa[0];
else if (dX > dAbscissa[m - 1])
dX = dAbscissa[m - 1];
for(int i = 0; i < m; i++)
{
if (dAbscissa[i] == dAbscissa[i - 1]) // 与前一个表头相等
continue;
if (dX == dAbscissa[i]) // 等于某个表头
return pTable[i];
else if (dX < dAbscissa[i]) // 小于某个表头,用查值
return (pTable[i] - pTable[i - 1])*(dX - dAbscissa[i - 1])
/ (dAbscissa[i] - dAbscissa[i - 1]) + pTable[i - 1];
}
return 0.0;
}
double HDuctHydraulic::CalDesity(double dTemperature) const
{
double dDensity[15] = {1.293, 1.270, 1.248, 1.226, 1.205,
1.185, 1.165, 1.146, 1.128, 1.093,
1.060, 1.029, 1.000, 0.973, 0.947};
double dTem[15] = {0, 5, 10, 15, 20,
25, 30, 35, 40, 50,
60, 70, 80, 90, 100};
return CalTable(dTem, (double*)dDensity, dTemperature, 15);
}
double HDuctHydraulic::CalMoveVis(double dTemperature) const
{
double dMovVis[18] = {13.7, 14.7, 15.7, 16.6, 17.6,
18.6, 19.6, 20.5, 21.7, 22.9,
23.6, 26.2, 28.5, 30.6, 33.2,
35.8, 42.8, 49.9};
double dTem[18] = {0, 10, 20, 30, 40,
50, 60, 70, 80, 90,
100, 120, 140, 160, 180,
200, 250, 300};
return CalTable(dTem, (double*)dMovVis, dTemperature, 18) * 1.0e-6;
}