流量计算修改完成,计算精确和标准一致,高位发热量待改正
This commit is contained in:
parent
aab91996ec
commit
c88990815a
383
User/NG/Detail.c
383
User/NG/Detail.c
@ -10,31 +10,19 @@ Detail *Detail_Construct(void) {
|
||||
if (!pDetail) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
memset(pDetail, 0, sizeof(Detail));
|
||||
|
||||
|
||||
pDetail->iNCC = 0;
|
||||
|
||||
|
||||
for (int i = 0; i < NUMBEROFCOMPONENTS; i++) {
|
||||
pDetail->aiCID[i] = -1;
|
||||
}
|
||||
|
||||
|
||||
pDetail->dOldMixID = 0.0;
|
||||
pDetail->dOldPb = 0.0;
|
||||
pDetail->dOldTb = 0.0;
|
||||
pDetail->dOldPf = 0.0;
|
||||
pDetail->dOldTf = 0.0;
|
||||
|
||||
|
||||
for (int i = 0; i < NUMBEROFCOMPONENTS; i++) {
|
||||
pDetail->dXi[i] = 0.0;
|
||||
}
|
||||
|
||||
|
||||
if (Detail_table(pDetail) != 0) {
|
||||
free(pDetail);
|
||||
return NULL;
|
||||
@ -48,26 +36,23 @@ void Detail_Destroy(Detail *pDetail) {
|
||||
}
|
||||
}
|
||||
|
||||
int Detail_compositionchange(Detail *pDetail, NGParSTRUCT *ptNGPar) {
|
||||
int Detail_compositionchange(Detail *pDetail, const NGParSTRUCT *ptNGPar) {
|
||||
double dMixID = 0.0;
|
||||
int i;
|
||||
for (i = 0; i < NUMBEROFCOMPONENTS; i++)
|
||||
for (int i = 0; i < NUMBEROFCOMPONENTS; i++)
|
||||
dMixID += ((i + 2) * ptNGPar->adMixture[i]);
|
||||
if (dMixID != pDetail->dOldMixID) {
|
||||
pDetail->dOldMixID = dMixID;
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Detail_Run(Detail *pDetail, NGParSTRUCT *ptNGPar) {
|
||||
int i;
|
||||
bool bCompChange = Detail_compositionchange(pDetail, ptNGPar);
|
||||
const int bCompChange = Detail_compositionchange(pDetail, ptNGPar);
|
||||
ptNGPar->bForceUpdate = ptNGPar->bForceUpdate || bCompChange;
|
||||
if (ptNGPar->bForceUpdate) {
|
||||
pDetail->iNCC = 0;
|
||||
for (i = 0; i < NUMBEROFCOMPONENTS; i++) {
|
||||
for (int i = 0; i < NUMBEROFCOMPONENTS; i++) {
|
||||
if (ptNGPar->adMixture[i] > 0.0) {
|
||||
pDetail->aiCID[pDetail->iNCC] = i;
|
||||
pDetail->dXi[pDetail->iNCC] = ptNGPar->adMixture[i];
|
||||
@ -77,9 +62,9 @@ void Detail_Run(Detail *pDetail, NGParSTRUCT *ptNGPar) {
|
||||
Detail_paramdl(pDetail);
|
||||
Detail_chardl(pDetail, ptNGPar);
|
||||
}
|
||||
if ((fabs(ptNGPar->dPb - pDetail->dOldPb) > P_CHG_TOL) ||
|
||||
(fabs(ptNGPar->dTb - pDetail->dOldTb) > T_CHG_TOL) ||
|
||||
(ptNGPar->bForceUpdate)) {
|
||||
if (fabs(ptNGPar->dPb - pDetail->dOldPb) > P_CHG_TOL ||
|
||||
fabs(ptNGPar->dTb - pDetail->dOldTb) > T_CHG_TOL ||
|
||||
ptNGPar->bForceUpdate) {
|
||||
pDetail->dP = ptNGPar->dPb * 1.0e-6;
|
||||
pDetail->dT = ptNGPar->dTb;
|
||||
Detail_temp(pDetail);
|
||||
@ -91,13 +76,13 @@ void Detail_Run(Detail *pDetail, NGParSTRUCT *ptNGPar) {
|
||||
ptNGPar->dRhob = pDetail->dRhoTP;
|
||||
pDetail->dOldTb = ptNGPar->dTb;
|
||||
pDetail->dOldPb = ptNGPar->dPb;
|
||||
ptNGPar->bForceUpdate = true;
|
||||
ptNGPar->bForceUpdate = 1;
|
||||
}
|
||||
pDetail->dP = ptNGPar->dPf * 1.0e-6;
|
||||
pDetail->dT = ptNGPar->dTf;
|
||||
if ((fabs(ptNGPar->dTf - pDetail->dOldTf) > T_CHG_TOL) || (ptNGPar->bForceUpdate)) {
|
||||
Detail_temp(pDetail);
|
||||
ptNGPar->bForceUpdate = true;
|
||||
ptNGPar->bForceUpdate = 1;
|
||||
}
|
||||
if ((fabs(ptNGPar->dPf - pDetail->dOldPf) > P_CHG_TOL) || (ptNGPar->bForceUpdate)) {
|
||||
Detail_ddetail(pDetail, ptNGPar);
|
||||
@ -112,7 +97,7 @@ void Detail_Run(Detail *pDetail, NGParSTRUCT *ptNGPar) {
|
||||
ptNGPar->dFpv = sqrt(ptNGPar->dZb / ptNGPar->dZf);
|
||||
} else {
|
||||
ptNGPar->lStatus = GENERAL_CALCULATION_FAILURE;
|
||||
ptNGPar->bForceUpdate = false;
|
||||
ptNGPar->bForceUpdate = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -120,7 +105,6 @@ int Detail_table(Detail *pDetail) {
|
||||
if (!pDetail) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
double adAn[58];
|
||||
double adUn[58];
|
||||
adAn[0] = 0.153832600;
|
||||
@ -182,7 +166,6 @@ int Detail_table(Detail *pDetail) {
|
||||
adAn[56] = -0.001226752;
|
||||
adAn[57] = 0.002850908;
|
||||
|
||||
|
||||
adUn[0] = 0.0;
|
||||
adUn[1] = 0.5;
|
||||
adUn[2] = 1.0;
|
||||
@ -241,10 +224,8 @@ int Detail_table(Detail *pDetail) {
|
||||
adUn[55] = 0.0;
|
||||
adUn[56] = 1.0;
|
||||
adUn[57] = 0.0;
|
||||
|
||||
memcpy(pDetail->adAn, adAn, sizeof(adAn));
|
||||
memcpy(pDetail->adUn, adUn, sizeof(adUn));
|
||||
|
||||
for (int j = 0; j < NUMBEROFCOMPONENTS; j++) {
|
||||
for (int k = j; k < NUMBEROFCOMPONENTS; k++) {
|
||||
pDetail->adTable6Eij[j][k] = 1.0;
|
||||
@ -387,7 +368,7 @@ int Detail_table(Detail *pDetail) {
|
||||
pDetail->adTable6Gij[2][3] = 0.370296;
|
||||
pDetail->adTable6Gij[2][5] = 1.673090;
|
||||
|
||||
double adTableHhvMol[4][NUMBEROFCOMPONENTS] = {
|
||||
const double adTableHhvMol[4][NUMBEROFCOMPONENTS] = {
|
||||
{
|
||||
892.97, 0, 0, 1564.34, 2224.01, 45.074, 562.94, 286.63, 282.8, 0, 2874.2, 2883.82, 3535.98, 3542.89,
|
||||
4203.23, 4862.87, 5522.4, 6182.91, 6842.69, 0, 0
|
||||
@ -406,7 +387,7 @@ int Detail_table(Detail *pDetail) {
|
||||
}
|
||||
};
|
||||
memcpy(pDetail->adTableHhvMol, adTableHhvMol, sizeof(adTableHhvMol));
|
||||
double adTableLhvMol[4][NUMBEROFCOMPONENTS] = {
|
||||
const double adTableLhvMol[4][NUMBEROFCOMPONENTS] = {
|
||||
{
|
||||
802.82, 0, 0, 1429.12, 2043.71, 0, 517.87, 241.56, 282.8, 0, 2648.83, 2658.45, 3265.54, 3272.45, 3887.71,
|
||||
4502.28, 5116.73, 5732.17, 6346.88, 0, 0
|
||||
@ -429,24 +410,6 @@ int Detail_table(Detail *pDetail) {
|
||||
}
|
||||
|
||||
void Detail_paramdl(Detail *pDetail) {
|
||||
const double adTable5Mri[21] = {
|
||||
16.0430, 28.0135, 44.0100, 30.0700, 44.0970, 18.0153, 34.0820, 2.0159, 28.0100, 31.9988, 58.1230, 58.1230,
|
||||
72.1500, 72.1500, 86.1770, 100.2040, 114.2310, 128.2580, 142.2850, 4.0026, 39.9480
|
||||
};
|
||||
const double adTable5Ei[21] = {
|
||||
151.318300, 99.737780, 241.960600, 244.166700, 298.118300, 514.015600, 296.355000, 26.957940, 105.534800,
|
||||
122.766700, 324.068900, 337.638900, 365.599900, 370.682300, 402.636293, 427.722630, 450.325022, 470.840891,
|
||||
489.558373, 2.610111, 119.629900
|
||||
};
|
||||
const double adTable5Ki[21] = {
|
||||
0.4619255, 0.4479153, 0.4557489, 0.5279209, 0.5837490, 0.3825868, 0.4618263, 0.3514916, 0.4533894, 0.4186954,
|
||||
0.6406937, 0.6341423, 0.6738577, 0.6798307, 0.7175118, 0.7525189, 0.7849550, 0.8152731, 0.8437826, 0.3589888,
|
||||
0.4216551
|
||||
};
|
||||
const double adTable5Gi[21] = {
|
||||
0.000000, 0.027815, 0.189065, 0.079300, 0.141239, 0.332500, 0.088500, 0.034369, 0.038953, 0.021000, 0.256692,
|
||||
0.281835, 0.332267, 0.366911, 0.289731, 0.337542, 0.383381, 0.427354, 0.469659, 0.000000, 0.000000
|
||||
};
|
||||
for (int j = 0; j < NUMBEROFCOMPONENTS; j++) {
|
||||
pDetail->adTable5Qi[j] = 0.0;
|
||||
pDetail->adTable5Fi[j] = 0.0;
|
||||
@ -461,10 +424,28 @@ void Detail_paramdl(Detail *pDetail) {
|
||||
pDetail->adTable5Si[6] = 0.3900;
|
||||
pDetail->adTable5Wi[5] = 1.0000;
|
||||
for (int j = pDetail->iNCC - 1; j >= 0; j--) {
|
||||
const double adTable5Ki[21] = {
|
||||
0.4619255, 0.4479153, 0.4557489, 0.5279209, 0.5837490, 0.3825868, 0.4618263, 0.3514916, 0.4533894, 0.4186954,
|
||||
0.6406937, 0.6341423, 0.6738577, 0.6798307, 0.7175118, 0.7525189, 0.7849550, 0.8152731, 0.8437826, 0.3589888,
|
||||
0.4216551
|
||||
};
|
||||
const double adTable5Mri[21] = {
|
||||
16.0430, 28.0135, 44.0100, 30.0700, 44.0970, 18.0153, 34.0820, 2.0159, 28.0100, 31.9988, 58.1230, 58.1230,
|
||||
72.1500, 72.1500, 86.1770, 100.2040, 114.2310, 128.2580, 142.2850, 4.0026, 39.9480
|
||||
};
|
||||
pDetail->dMri[j] = adTable5Mri[pDetail->aiCID[j]];
|
||||
pDetail->dKi[j] = adTable5Ki[pDetail->aiCID[j]];
|
||||
}
|
||||
for (int j = 0; j < pDetail->iNCC; j++) {
|
||||
const double adTable5Gi[21] = {
|
||||
0.000000, 0.027815, 0.189065, 0.079300, 0.141239, 0.332500, 0.088500, 0.034369, 0.038953, 0.021000, 0.256692,
|
||||
0.281835, 0.332267, 0.366911, 0.289731, 0.337542, 0.383381, 0.427354, 0.469659, 0.000000, 0.000000
|
||||
};
|
||||
const double adTable5Ei[21] = {
|
||||
151.318300, 99.737780, 241.960600, 244.166700, 298.118300, 514.015600, 296.355000, 26.957940, 105.534800,
|
||||
122.766700, 324.068900, 337.638900, 365.599900, 370.682300, 402.636293, 427.722630, 450.325022, 470.840891,
|
||||
489.558373, 2.610111, 119.629900
|
||||
};
|
||||
pDetail->dGi[j] = adTable5Gi[pDetail->aiCID[j]];
|
||||
pDetail->dEi[j] = adTable5Ei[pDetail->aiCID[j]];
|
||||
}
|
||||
@ -507,7 +488,8 @@ void Detail_chardl(Detail *pDetail, NGParSTRUCT *ptNGPar)
|
||||
ptNGPar->dLhvMol = 0.0;
|
||||
for (int i = 0; i < pDetail->iNCC; i++) {
|
||||
ptNGPar->dMrx += pDetail->dXi[i] * pDetail->dMri[i];
|
||||
switch (ptNGPar->dCbtj) {
|
||||
switch (ptNGPar->dCbtj)
|
||||
{
|
||||
case 2:
|
||||
ptNGPar->dHhvMol += pDetail->adTableHhvMol[0][i] * ptNGPar->adMixture[i];
|
||||
ptNGPar->dLhvMol += pDetail->adTableHhvMol[0][i] * ptNGPar->adMixture[i];
|
||||
@ -520,6 +502,7 @@ void Detail_chardl(Detail *pDetail, NGParSTRUCT *ptNGPar)
|
||||
ptNGPar->dHhvMol += pDetail->adTableHhvMol[2][i] * ptNGPar->adMixture[i];
|
||||
ptNGPar->dLhvMol += pDetail->adTableLhvMol[2][i] * ptNGPar->adMixture[i];
|
||||
break;
|
||||
default: ;
|
||||
}
|
||||
k2p5 += pDetail->dXi[i] * pow(pDetail->dKi[i], 2.5);
|
||||
u2p5 += pDetail->dXi[i] * pow(pDetail->dEi[i], 2.5);
|
||||
@ -528,33 +511,33 @@ void Detail_chardl(Detail *pDetail, NGParSTRUCT *ptNGPar)
|
||||
pDetail->dF += pDetail->dXi[i] * pDetail->dXi[i] * pDetail->dFi[i];
|
||||
|
||||
for (int j = i; j < pDetail->iNCC; j++) {
|
||||
double Xij = (i == j) ? pDetail->dXi[i] * pDetail->dXi[j] : 2.0 * pDetail->dXi[i] * pDetail->dXi[j];
|
||||
const double Xij = (i == j) ? pDetail->dXi[i] * pDetail->dXi[j] : 2.0 * pDetail->dXi[i] * pDetail->dXi[j];
|
||||
if (pDetail->dKij[i][j] != 1.0) {
|
||||
double term = pow(pDetail->dKi[i] * pDetail->dKi[j], 2.5);
|
||||
const double term = pow(pDetail->dKi[i] * pDetail->dKi[j], 2.5);
|
||||
k5p0 += Xij * (pow(pDetail->dKij[i][j], 5.0) - 1.0) * term;
|
||||
}
|
||||
if (pDetail->dUij[i][j] != 1.0) {
|
||||
double term = pow(pDetail->dEi[i] * pDetail->dEi[j], 2.5);
|
||||
const double term = pow(pDetail->dEi[i] * pDetail->dEi[j], 2.5);
|
||||
u5p0 += Xij * (pow(pDetail->dUij[i][j], 5.0) - 1.0) * term;
|
||||
}
|
||||
if (pDetail->dGij[i][j] != 1.0) {
|
||||
double avgG = (pDetail->dGi[i] + pDetail->dGi[j]) / 2.0;
|
||||
const double avgG = (pDetail->dGi[i] + pDetail->dGi[j]) / 2.0;
|
||||
pDetail->dW += Xij * (pDetail->dGij[i][j] - 1.0) * avgG;
|
||||
}
|
||||
double Eij = pDetail->dEij[i][j] * sqrt(pDetail->dEi[i] * pDetail->dEi[j]);
|
||||
double Gij = pDetail->dGij[i][j] * (pDetail->dGi[i] + pDetail->dGi[j]) / 2.0;
|
||||
double e0p5 = sqrt(Eij);
|
||||
double e2p0 = Eij * Eij;
|
||||
double e3p0 = Eij * e2p0;
|
||||
double e3p5 = e3p0 * e0p5;
|
||||
double e4p5 = Eij * e3p5;
|
||||
double e6p0 = e3p0 * e3p0;
|
||||
double e7p5 = e4p5 * Eij * e2p0;
|
||||
double e9p5 = e7p5 * e2p0;
|
||||
double e11p0 = e4p5 * e4p5 * e2p0;
|
||||
double e12p0 = e11p0 * Eij;
|
||||
double e12p5 = e12p0 * e0p5;
|
||||
double s3 = Xij * pow(pow(pDetail->dKi[i], 3.0) * pow(pDetail->dKi[j], 3.0), 0.5);
|
||||
const double Eij = pDetail->dEij[i][j] * sqrt(pDetail->dEi[i] * pDetail->dEi[j]);
|
||||
const double Gij = pDetail->dGij[i][j] * (pDetail->dGi[i] + pDetail->dGi[j]) / 2.0;
|
||||
const double e0p5 = sqrt(Eij);
|
||||
const double e2p0 = Eij * Eij;
|
||||
const double e3p0 = Eij * e2p0;
|
||||
const double e3p5 = e3p0 * e0p5;
|
||||
const double e4p5 = Eij * e3p5;
|
||||
const double e6p0 = e3p0 * e3p0;
|
||||
const double e7p5 = e4p5 * Eij * e2p0;
|
||||
const double e9p5 = e7p5 * e2p0;
|
||||
const double e11p0 = e4p5 * e4p5 * e2p0;
|
||||
const double e12p0 = e11p0 * Eij;
|
||||
const double e12p5 = e12p0 * e0p5;
|
||||
const double s3 = Xij * pow(pow(pDetail->dKi[i], 3.0) * pow(pDetail->dKi[j], 3.0), 0.5);
|
||||
pDetail->adBcoef[0] += s3;
|
||||
pDetail->adBcoef[1] += s3 * e0p5;
|
||||
pDetail->adBcoef[2] += s3 * Eij;
|
||||
@ -576,8 +559,8 @@ void Detail_chardl(Detail *pDetail, NGParSTRUCT *ptNGPar)
|
||||
}
|
||||
}
|
||||
|
||||
ptNGPar->dHhvMol = ptNGPar->dHhvMol / ptNGPar->dMrx;
|
||||
ptNGPar->dLhvMol = ptNGPar->dLhvMol / ptNGPar->dMrx;
|
||||
ptNGPar->dHhvMol = ptNGPar->dHhvMol ;
|
||||
ptNGPar->dLhvMol = ptNGPar->dLhvMol ;
|
||||
|
||||
for (int i = 0; i < 18; i++) {
|
||||
pDetail->adBcoef[i] *= pDetail->adAn[i];
|
||||
@ -589,20 +572,20 @@ void Detail_chardl(Detail *pDetail, NGParSTRUCT *ptNGPar)
|
||||
|
||||
void Detail_bvir(Detail *pDetail) {
|
||||
pDetail->dB = pDetail->ddBdT = pDetail->dd2BdT2 = 0.0;
|
||||
double t = pDetail->dT;
|
||||
double t0p5 = sqrt(t);
|
||||
double t2p0 = t * t;
|
||||
double t3p0 = t * t2p0;
|
||||
double t3p5 = t3p0 * t0p5;
|
||||
double t4p5 = t * t3p5;
|
||||
double t6p0 = t3p0 * t3p0;
|
||||
double t11p0 = t4p5 * t4p5 * t2p0;
|
||||
double t7p5 = t6p0 * t * t0p5;
|
||||
double t9p5 = t7p5 * t2p0;
|
||||
double t12p0 = t9p5 * t0p5 * t2p0;
|
||||
double t12p5 = t12p0 * t0p5;
|
||||
double t1p5 = t * t0p5;
|
||||
double t4p0 = t2p0 * t2p0;
|
||||
const double t = pDetail->dT;
|
||||
const double t0p5 = sqrt(t);
|
||||
const double t2p0 = t * t;
|
||||
const double t3p0 = t * t2p0;
|
||||
const double t3p5 = t3p0 * t0p5;
|
||||
const double t4p5 = t * t3p5;
|
||||
const double t6p0 = t3p0 * t3p0;
|
||||
const double t11p0 = t4p5 * t4p5 * t2p0;
|
||||
const double t7p5 = t6p0 * t * t0p5;
|
||||
const double t9p5 = t7p5 * t2p0;
|
||||
const double t12p0 = t9p5 * t0p5 * t2p0;
|
||||
const double t12p5 = t12p0 * t0p5;
|
||||
// double t1p5 = t * t0p5;
|
||||
// double t4p0 = t2p0 * t2p0;
|
||||
double Bx[18];
|
||||
Bx[0] = pDetail->adBcoef[0];
|
||||
Bx[1] = pDetail->adBcoef[1] / t0p5;
|
||||
@ -650,25 +633,22 @@ void Detail_bvir(Detail *pDetail) {
|
||||
|
||||
void Detail_temp(Detail *pDetail) {
|
||||
Detail_bvir(pDetail);
|
||||
double tr = pDetail->dT / pDetail->dU;
|
||||
double tr0p5, tr1p5, tr2p0, tr3p0, tr4p0, tr5p0, tr6p0;
|
||||
double tr7p0, tr8p0, tr9p0, tr11p0, tr13p0, tr21p0;
|
||||
double tr22p0, tr23p0 ;
|
||||
tr0p5 = sqrt(tr);
|
||||
tr1p5 = tr * tr0p5;
|
||||
tr2p0 = tr * tr;
|
||||
tr3p0 = tr * tr2p0;
|
||||
tr4p0 = tr * tr3p0;
|
||||
tr5p0 = tr * tr4p0;
|
||||
tr6p0 = tr * tr5p0;
|
||||
tr7p0 = tr * tr6p0;
|
||||
tr8p0 = tr * tr7p0;
|
||||
tr9p0 = tr * tr8p0;
|
||||
tr11p0 = tr6p0 * tr5p0;
|
||||
tr13p0 = tr6p0 * tr7p0;
|
||||
tr21p0 = tr9p0 * tr9p0 * tr3p0;
|
||||
tr22p0 = tr * tr21p0;
|
||||
tr23p0 = tr * tr22p0;
|
||||
const double tr = pDetail->dT / pDetail->dU;
|
||||
const double tr0p5 = sqrt(tr);
|
||||
const double tr1p5 = tr * tr0p5;
|
||||
const double tr2p0 = tr * tr;
|
||||
const double tr3p0 = tr * tr2p0;
|
||||
const double tr4p0 = tr * tr3p0;
|
||||
const double tr5p0 = tr * tr4p0;
|
||||
const double tr6p0 = tr * tr5p0;
|
||||
const double tr7p0 = tr * tr6p0;
|
||||
const double tr8p0 = tr * tr7p0;
|
||||
const double tr9p0 = tr * tr8p0;
|
||||
const double tr11p0 = tr6p0 * tr5p0;
|
||||
const double tr13p0 = tr6p0 * tr7p0;
|
||||
const double tr21p0 = tr9p0 * tr9p0 * tr3p0;
|
||||
const double tr22p0 = tr * tr21p0;
|
||||
const double tr23p0 = tr * tr22p0;
|
||||
|
||||
pDetail->adFn[12] = pDetail->adAn[12] * pDetail->dF * tr6p0;
|
||||
pDetail->adFn[13] = pDetail->adAn[13] / tr2p0;
|
||||
@ -720,30 +700,26 @@ void Detail_temp(Detail *pDetail) {
|
||||
}
|
||||
|
||||
void Detail_ddetail(Detail *pDetail, NGParSTRUCT *ptNGPar) {
|
||||
int imax, i;
|
||||
double epsp, epsr, epsmin;
|
||||
double x1, x2, x3, y1, y2, y3;
|
||||
double delx, delprv, delmin, delbis, xnumer, xdenom, sgndel;
|
||||
double y2my3, y3my1, y1my2, boundn;
|
||||
imax = 150;
|
||||
epsp = 1.e-6;
|
||||
epsr = 1.e-6;
|
||||
epsmin = 1.e-7;
|
||||
double xnumer, xdenom;
|
||||
const int imax = 150;
|
||||
pDetail->dRho = 0.0;
|
||||
Detail_braket(pDetail, ptNGPar);
|
||||
if (ptNGPar->lStatus == MAX_NUM_OF_ITERATIONS_EXCEEDED ||
|
||||
ptNGPar->lStatus == NEGATIVE_DENSITY_DERIVATIVE) {
|
||||
return;
|
||||
}
|
||||
x1 = pDetail->dRhoL;
|
||||
x2 = pDetail->dRhoH;
|
||||
y1 = pDetail->dPRhoL - pDetail->dP;
|
||||
y2 = pDetail->dPRhoH - pDetail->dP;
|
||||
delx = x1 - x2;
|
||||
delprv = delx;
|
||||
x3 = x1;
|
||||
y3 = y1;
|
||||
for (i = 0; i < imax; i++) {
|
||||
double x1 = pDetail->dRhoL;
|
||||
double x2 = pDetail->dRhoH;
|
||||
double y1 = pDetail->dPRhoL - pDetail->dP;
|
||||
double y2 = pDetail->dPRhoH - pDetail->dP;
|
||||
double delx = x1 - x2;
|
||||
double delprv = delx;
|
||||
double x3 = x1;
|
||||
double y3 = y1;
|
||||
for (int i = 0; i < imax; i++) {
|
||||
const double epsmin = 1.e-7;
|
||||
const double epsr = 1.e-6;
|
||||
const double epsp = 1.e-6;
|
||||
if (y2 * y3 > 0.0) {
|
||||
x3 = x1;
|
||||
y3 = y1;
|
||||
@ -758,16 +734,16 @@ void Detail_ddetail(Detail *pDetail, NGParSTRUCT *ptNGPar) {
|
||||
y2 = y3;
|
||||
y3 = y1;
|
||||
}
|
||||
delmin = epsmin * fabs(x2);
|
||||
delbis = 0.5 * (x3 - x2);
|
||||
const double delmin = epsmin * fabs(x2);
|
||||
const double delbis = 0.5 * (x3 - x2);
|
||||
if (fabs(delprv) < delmin || fabs(y1) < fabs(y2)) {
|
||||
delx = delbis;
|
||||
delprv = delbis;
|
||||
} else {
|
||||
if (x3 != x1) {
|
||||
y2my3 = y2 - y3;
|
||||
y3my1 = y3 - y1;
|
||||
y1my2 = y1 - y2;
|
||||
const double y2my3 = y2 - y3;
|
||||
const double y3my1 = y3 - y1;
|
||||
const double y1my2 = y1 - y2;
|
||||
xdenom = -(y1my2) * (y2my3) * (y3my1);
|
||||
xnumer = x1 * y2 * y3 * (y2my3)
|
||||
+ x2 * y3 * y1 * (y3my1)
|
||||
@ -789,11 +765,11 @@ void Detail_ddetail(Detail *pDetail, NGParSTRUCT *ptNGPar) {
|
||||
return;
|
||||
}
|
||||
if (fabs(delx) < delmin) {
|
||||
sgndel = delbis / fabs(delbis);
|
||||
const double sgndel = delbis / fabs(delbis);
|
||||
delx = 1.0000009 * sgndel * delmin;
|
||||
delprv = delx;
|
||||
}
|
||||
boundn = delx * (x2 + delx - x3);
|
||||
const double boundn = delx * (x2 + delx - x3);
|
||||
if (boundn > 0.0) {
|
||||
delx = delbis;
|
||||
delprv = delbis;
|
||||
@ -809,23 +785,21 @@ void Detail_ddetail(Detail *pDetail, NGParSTRUCT *ptNGPar) {
|
||||
}
|
||||
|
||||
void Detail_braket(Detail *pDetail, NGParSTRUCT *ptNGPar) {
|
||||
int imax, it;
|
||||
double del, rhomax, videal;
|
||||
double rho1, rho2, p1, p2;
|
||||
imax = 200;
|
||||
rho1 = 0.0;
|
||||
p1 = 0.0;
|
||||
rhomax = 1.0 / pDetail->dKp3;
|
||||
double rho2;
|
||||
const int imax = 200;
|
||||
double rho1 = 0.0;
|
||||
double p1 = 0.0;
|
||||
double rhomax = 1.0 / pDetail->dKp3;
|
||||
if (pDetail->dT > 1.2593 * pDetail->dU)
|
||||
rhomax = 20.0 * rhomax;
|
||||
videal = RGASKJ * pDetail->dT / pDetail->dP;
|
||||
const double videal = RGASKJ * pDetail->dT / pDetail->dP;
|
||||
if (fabs(pDetail->dB) < (0.167 * videal)) {
|
||||
rho2 = 0.95 / (videal + pDetail->dB);
|
||||
} else {
|
||||
rho2 = 1.15 / videal;
|
||||
}
|
||||
del = rho2 / 20.0;
|
||||
for (it = 0; it < imax; it++) {
|
||||
double del = rho2 / 20.0;
|
||||
for (int it = 0; it < imax; it++) {
|
||||
if (rho2 > rhomax && ptNGPar->lStatus != MAX_DENSITY_IN_BRAKET_EXCEEDED) {
|
||||
ptNGPar->lStatus = MAX_DENSITY_IN_BRAKET_EXCEEDED;
|
||||
del = 0.01 * (rhomax - rho1) + (pDetail->dP / (RGASKJ * pDetail->dT)) / 20.0;
|
||||
@ -833,7 +807,7 @@ void Detail_braket(Detail *pDetail, NGParSTRUCT *ptNGPar) {
|
||||
continue;
|
||||
}
|
||||
Detail_pdetail(pDetail, rho2);
|
||||
p2 = pDetail->dPCalc;
|
||||
const double p2 = pDetail->dPCalc;
|
||||
if (p2 > pDetail->dP) {
|
||||
pDetail->dRhoL = rho1;
|
||||
pDetail->dPRhoL = p1;
|
||||
@ -856,7 +830,6 @@ void Detail_braket(Detail *pDetail, NGParSTRUCT *ptNGPar) {
|
||||
}
|
||||
ptNGPar->lStatus = MAX_NUM_OF_ITERATIONS_EXCEEDED;
|
||||
pDetail->dRho = rho2;
|
||||
return;
|
||||
}
|
||||
|
||||
void Detail_pdetail(Detail *pDetail, double dD) {
|
||||
@ -864,20 +837,19 @@ void Detail_pdetail(Detail *pDetail, double dD) {
|
||||
}
|
||||
|
||||
double Detail_zdetail(Detail *pDetail, double d) {
|
||||
double D1, D2, D3, D4, D5, D6, D7, D8, D9, exp1, exp2, exp3, exp4;
|
||||
D1 = pDetail->dKp3 * d;
|
||||
D2 = D1 * D1;
|
||||
D3 = D2 * D1;
|
||||
D4 = D3 * D1;
|
||||
D5 = D4 * D1;
|
||||
D6 = D5 * D1;
|
||||
D7 = D6 * D1;
|
||||
D8 = D7 * D1;
|
||||
D9 = D8 * D1;
|
||||
exp1 = exp(-D1);
|
||||
exp2 = exp(-D2);
|
||||
exp3 = exp(-D3);
|
||||
exp4 = exp(-D4);
|
||||
const double D1 = pDetail->dKp3 * d;
|
||||
const double D2 = D1 * D1;
|
||||
const double D3 = D2 * D1;
|
||||
const double D4 = D3 * D1;
|
||||
const double D5 = D4 * D1;
|
||||
const double D6 = D5 * D1;
|
||||
const double D7 = D6 * D1;
|
||||
const double D8 = D7 * D1;
|
||||
const double D9 = D8 * D1;
|
||||
const double exp1 = exp(-D1);
|
||||
const double exp2 = exp(-D2);
|
||||
const double exp3 = exp(-D3);
|
||||
const double exp4 = exp(-D4);
|
||||
pDetail->dZ = 1.0 + pDetail->dB * d
|
||||
+ pDetail->adFn[12] * D1 * (exp3 - 1.0 - 3.0 * D3 * exp3)
|
||||
+ (pDetail->adFn[13] + pDetail->adFn[14] + pDetail->adFn[15]) * D1 * (exp2 - 1.0 - 2.0 * D2 * exp2)
|
||||
@ -908,22 +880,19 @@ double Detail_zdetail(Detail *pDetail, double d) {
|
||||
}
|
||||
|
||||
double Detail_dZdT(Detail *pDetail, double d) {
|
||||
double tmp;
|
||||
int i;
|
||||
double D1, D2, D3, D4, D5, D6, D7, D8, exp1, exp2, exp3, exp4;
|
||||
D1 = pDetail->dKp3 * d;
|
||||
D2 = D1 * D1;
|
||||
D3 = D2 * D1;
|
||||
D4 = D3 * D1;
|
||||
D5 = D4 * D1;
|
||||
D6 = D5 * D1;
|
||||
D7 = D6 * D1;
|
||||
D8 = D7 * D1;
|
||||
exp1 = exp(-D1);
|
||||
exp2 = exp(-D2);
|
||||
exp3 = exp(-D3);
|
||||
exp4 = exp(-D4);
|
||||
for (i = 12; i < 58; i++) {
|
||||
const double D1 = pDetail->dKp3 * d;
|
||||
const double D2 = D1 * D1;
|
||||
const double D3 = D2 * D1;
|
||||
const double D4 = D3 * D1;
|
||||
const double D5 = D4 * D1;
|
||||
const double D6 = D5 * D1;
|
||||
const double D7 = D6 * D1;
|
||||
const double D8 = D7 * D1;
|
||||
const double exp1 = exp(-D1);
|
||||
const double exp2 = exp(-D2);
|
||||
const double exp3 = exp(-D3);
|
||||
const double exp4 = exp(-D4);
|
||||
for (int i = 12; i < 58; i++) {
|
||||
if (pDetail->adUn[i] && pDetail->adFn[i]) {
|
||||
pDetail->fx[i] = (pDetail->adFn[i] * pDetail->adUn[i] * D1) / pDetail->dT;
|
||||
} else {
|
||||
@ -933,7 +902,7 @@ double Detail_dZdT(Detail *pDetail, double d) {
|
||||
pDetail->ddZdT = d * pDetail->ddBdT;
|
||||
if (pDetail->dF)
|
||||
pDetail->ddZdT += pDetail->fx[12] - (pDetail->fx[12] * (1.0 - 3.0 * D3) * exp3);
|
||||
tmp = (1.0 - 2.0 * D2) * exp2;
|
||||
double tmp = (1.0 - 2.0 * D2) * exp2;
|
||||
pDetail->ddZdT += (pDetail->fx[13] - (pDetail->fx[13] * tmp));
|
||||
pDetail->ddZdT += pDetail->fx[14] - (pDetail->fx[14] * tmp);
|
||||
pDetail->ddZdT += pDetail->fx[15] - (pDetail->fx[15] * tmp);
|
||||
@ -966,22 +935,19 @@ double Detail_dZdT(Detail *pDetail, double d) {
|
||||
}
|
||||
|
||||
double Detail_d2ZdT2(Detail *pDetail, double d) {
|
||||
double tmp;
|
||||
int i;
|
||||
double D1, D2, D3, D4, D5, D6, D7, D8, exp1, exp2, exp3, exp4;
|
||||
D1 = pDetail->dKp3 * d;
|
||||
D2 = D1 * D1;
|
||||
D3 = D2 * D1;
|
||||
D4 = D3 * D1;
|
||||
D5 = D4 * D1;
|
||||
D6 = D5 * D1;
|
||||
D7 = D6 * D1;
|
||||
D8 = D7 * D1;
|
||||
exp1 = exp(-D1);
|
||||
exp2 = exp(-D2);
|
||||
exp3 = exp(-D3);
|
||||
exp4 = exp(-D4);
|
||||
for (i = 12; i < 58; i++) {
|
||||
const double D1 = pDetail->dKp3 * d;
|
||||
const double D2 = D1 * D1;
|
||||
const double D3 = D2 * D1;
|
||||
const double D4 = D3 * D1;
|
||||
const double D5 = D4 * D1;
|
||||
const double D6 = D5 * D1;
|
||||
const double D7 = D6 * D1;
|
||||
const double D8 = D7 * D1;
|
||||
const double exp1 = exp(-D1);
|
||||
const double exp2 = exp(-D2);
|
||||
const double exp3 = exp(-D3);
|
||||
const double exp4 = exp(-D4);
|
||||
for (int i = 12; i < 58; i++) {
|
||||
if (pDetail->adUn[i] && pDetail->adFn[i]) {
|
||||
pDetail->fx[i] = (pDetail->adFn[i] * D1 * pDetail->adUn[i] * (pDetail->adUn[i] + 1.0)) / (
|
||||
pDetail->dT * pDetail->dT);
|
||||
@ -992,13 +958,13 @@ double Detail_d2ZdT2(Detail *pDetail, double d) {
|
||||
pDetail->dd2ZdT2 = d * pDetail->dd2BdT2;
|
||||
if (pDetail->dF)
|
||||
pDetail->dd2ZdT2 += pDetail->fx[12] - (pDetail->fx[12] * (1.0 - 3.0 * D3) * exp3);
|
||||
tmp = (1.0 - 2.0 * D2) * exp2;
|
||||
double tmp = (1.0 - 2.0 * D2) * exp2;
|
||||
pDetail->dd2ZdT2 += -pDetail->fx[13] + (pDetail->fx[13] * tmp);
|
||||
pDetail->dd2ZdT2 += -pDetail->fx[14] + (pDetail->fx[14] * tmp);
|
||||
pDetail->dd2ZdT2 += -pDetail->fx[15] + (pDetail->fx[15] * tmp);
|
||||
tmp = (1.0 - 4.0 * D4) * exp4;
|
||||
pDetail->dd2ZdT2 += -pDetail->fx[16] + (pDetail->fx[16] * tmp);
|
||||
pDetail->dd2ZdT2 += -pDetail->fx[17] + (pDetail->fx[17] * tmp);
|
||||
pDetail->dd2ZdT2 += -pDetail->fx[17] + pDetail->fx[17] * tmp;
|
||||
pDetail->dd2ZdT2 = pDetail->dd2ZdT2 + (pDetail->fx[18] + pDetail->fx[19]) * D1 * 2.0
|
||||
+ (pDetail->fx[21] + pDetail->fx[22]) * D1 * (2.0 - 2.0 * D2) * exp2
|
||||
+ (pDetail->fx[23] + pDetail->fx[24] + pDetail->fx[25]) * D1 * (2.0 - 4.0 * D4) * exp4
|
||||
@ -1026,21 +992,19 @@ double Detail_d2ZdT2(Detail *pDetail, double d) {
|
||||
|
||||
double Detail_dZdD(Detail *pDetail, double d) {
|
||||
double temp, temp1, temp2, temp3;
|
||||
int i;
|
||||
double D1, D2, D3, D4, D5, D6, D7, D8, exp1, exp2, exp3, exp4;
|
||||
D1 = pDetail->dKp3 * d;
|
||||
D2 = D1 * D1;
|
||||
D3 = D2 * D1;
|
||||
D4 = D3 * D1;
|
||||
D5 = D4 * D1;
|
||||
D6 = D5 * D1;
|
||||
D7 = D6 * D1;
|
||||
D8 = D7 * D1;
|
||||
exp1 = exp(-D1);
|
||||
exp2 = exp(-D2);
|
||||
exp3 = exp(-D3);
|
||||
exp4 = exp(-D4);
|
||||
for (i = 12; i < 58; i++) {
|
||||
const double D1 = pDetail->dKp3 * d;
|
||||
const double D2 = D1 * D1;
|
||||
const double D3 = D2 * D1;
|
||||
const double D4 = D3 * D1;
|
||||
const double D5 = D4 * D1;
|
||||
const double D6 = D5 * D1;
|
||||
const double D7 = D6 * D1;
|
||||
const double D8 = D7 * D1;
|
||||
const double exp1 = exp(-D1);
|
||||
const double exp2 = exp(-D2);
|
||||
const double exp3 = exp(-D3);
|
||||
const double exp4 = exp(-D4);
|
||||
for (int i = 12; i < 58; i++) {
|
||||
pDetail->fx[i] = pDetail->adFn[i];
|
||||
}
|
||||
pDetail->ddZdD = pDetail->dB / pDetail->dKp3;
|
||||
@ -1156,11 +1120,10 @@ double Detail_dZdD(Detail *pDetail, double d) {
|
||||
return pDetail->ddZdD;
|
||||
}
|
||||
|
||||
void Detail_relativedensity(Detail *pDetail, NGParSTRUCT *ptNGPar) {
|
||||
double dBX, dZa;
|
||||
void Detail_relativedensity(const Detail *pDetail, NGParSTRUCT *ptNGPar) {
|
||||
const double dMWair = 28.96256;
|
||||
dBX = -0.12527 + 5.91e-4 * ptNGPar->dTb - 6.62e-7 * ptNGPar->dTb * ptNGPar->dTb;
|
||||
dZa = 1.0 + (dBX * pDetail->dP) / (RGASKJ * ptNGPar->dTb);
|
||||
const double dBX = -0.12527 + 5.91e-4 * ptNGPar->dTb - 6.62e-7 * ptNGPar->dTb * ptNGPar->dTb;
|
||||
const double dZa = 1.0 + (dBX * pDetail->dP) / (RGASKJ * ptNGPar->dTb);
|
||||
ptNGPar->dRD_Ideal = ptNGPar->dMrx / dMWair;
|
||||
ptNGPar->dRD_Real = ptNGPar->dRD_Ideal * (dZa / ptNGPar->dZb);
|
||||
}
|
||||
|
@ -6,7 +6,6 @@
|
||||
#define _DETAIL_H
|
||||
|
||||
#include "NGCal.h"
|
||||
#include <stdbool.h>
|
||||
|
||||
|
||||
typedef struct Detail {
|
||||
@ -88,7 +87,7 @@ Detail *Detail_Construct(void);
|
||||
void Detail_Destroy(Detail *pDetail);
|
||||
|
||||
|
||||
int Detail_compositionchange(Detail *pDetail, NGParSTRUCT *pAGA10);
|
||||
int Detail_compositionchange(Detail *pDetail, const NGParSTRUCT *pAGA10);
|
||||
|
||||
int Detail_table(Detail *pDetail);
|
||||
|
||||
@ -106,7 +105,7 @@ void Detail_pdetail(Detail *pDetail, double dRho);
|
||||
|
||||
void Detail_ddetail(Detail *pDetail, NGParSTRUCT *pAGA10);
|
||||
|
||||
void Detail_relativedensity(Detail *pDetail, NGParSTRUCT *pAGA10);
|
||||
void Detail_relativedensity(const Detail *pDetail, NGParSTRUCT *pAGA10);
|
||||
|
||||
|
||||
double Detail_zdetail(Detail *pDetail, double dRho);
|
||||
|
@ -3,6 +3,36 @@
|
||||
//
|
||||
#include "NGCal.h"
|
||||
#include "FlowCal.h"
|
||||
#include "math.h"
|
||||
|
||||
|
||||
|
||||
double format_double(double value, int digits) {
|
||||
// 处理默认位数(4位)
|
||||
if (digits == 0) {
|
||||
digits = 4;
|
||||
}
|
||||
|
||||
// 验证位数有效性
|
||||
if (digits < 1 || digits > 5) {
|
||||
fprintf(stderr, "Error: Invalid digit value (must be 1-5 or 0 for default)\n");
|
||||
return NAN; // 返回 NaN 表示错误
|
||||
}
|
||||
|
||||
char format_str[10];
|
||||
char buffer[50];
|
||||
double result;
|
||||
|
||||
// 生成动态格式字符串(如 "%.4f")
|
||||
snprintf(format_str, sizeof(format_str), "%%.%df", digits);
|
||||
|
||||
// 格式化数值到字符串
|
||||
snprintf(buffer, sizeof(buffer), format_str, value);
|
||||
|
||||
// 转换回 double
|
||||
result = strtod(buffer, NULL);
|
||||
return result;
|
||||
}
|
||||
|
||||
void OFlowCal(FlowParSTRUCT *ptFlowPar, NGParSTRUCT *ptNGPar) {
|
||||
|
||||
@ -50,6 +80,7 @@ void OFlowCal(FlowParSTRUCT *ptFlowPar, NGParSTRUCT *ptNGPar) {
|
||||
ptFlowPar->dPb_M = (101325);
|
||||
ptFlowPar->dTb_M = (293.15);
|
||||
break;
|
||||
default: ;
|
||||
}
|
||||
|
||||
double ngArray[NUMBEROFCOMPONENTS];
|
||||
@ -61,24 +92,24 @@ void OFlowCal(FlowParSTRUCT *ptFlowPar, NGParSTRUCT *ptNGPar) {
|
||||
Crit(ptNGPar, 0);
|
||||
|
||||
|
||||
ptFlowPar->dFpv = ptNGPar->dFpv;
|
||||
ptFlowPar->dFpv =format_double( ptNGPar->dFpv,4);
|
||||
|
||||
|
||||
|
||||
ptFlowPar->dOrificeD = ptFlowPar->dOrificeD * (
|
||||
1 + 0.000001 * CaiLiaoPzxs(ptFlowPar->dOrificeMaterial) * (ptFlowPar->dTf - 293.15));
|
||||
ptFlowPar->dPipeD = ptFlowPar->dPipeD * (1 + 0.000001 * CaiLiaoPzxs(ptFlowPar->dPipeMaterial) * (
|
||||
ptFlowPar->dTf - 293.15));
|
||||
ptFlowPar->dBeta = ptFlowPar->dOrificeD / ptFlowPar->dPipeD;
|
||||
ptFlowPar->dOrificeD =format_double( ptFlowPar->dOrificeD * (
|
||||
1 + 0.000001 * CaiLiaoPzxs(ptFlowPar->dOrificeMaterial) * (ptFlowPar->dTf - 293.15)),2);
|
||||
ptFlowPar->dPipeD =format_double( ptFlowPar->dPipeD * (1 + 0.000001 * CaiLiaoPzxs(ptFlowPar->dPipeMaterial) * (
|
||||
ptFlowPar->dTf - 293.15)),2);
|
||||
ptFlowPar->dBeta =format_double( ptFlowPar->dOrificeD / ptFlowPar->dPipeD,4);
|
||||
|
||||
ptFlowPar->dE = calculateE(ptFlowPar->dBeta);
|
||||
ptFlowPar->dFG = calculateFG(ptNGPar->dRD_Real);
|
||||
ptFlowPar->dFT = calculateFT(ptFlowPar->dTb_M, ptFlowPar->dTf);
|
||||
ptFlowPar->dE =format_double( calculateE(ptFlowPar->dBeta),4);
|
||||
ptFlowPar->dFG =format_double( calculateFG(ptNGPar->dRD_Real),4);
|
||||
ptFlowPar->dFT =format_double( calculateFT(ptFlowPar->dTb_M, ptFlowPar->dTf),4);
|
||||
|
||||
ptFlowPar->dKappa = calculateKappa(ptNGPar->dZf);
|
||||
ptFlowPar->dDViscosity = Dlndjs(ptFlowPar->dPf / 1e6, ptFlowPar->dTf);
|
||||
ptFlowPar->dDExpCoefficient = calculateEpsilon(ptFlowPar->dPf, ptFlowPar->dDp,
|
||||
ptFlowPar->dBeta, ptFlowPar->dKappa);
|
||||
ptFlowPar->dKappa =format_double( calculateKappa(ptNGPar->dZf),4);
|
||||
ptFlowPar->dDViscosity =format_double( Dlndjs(ptFlowPar->dPf / 1e6, ptFlowPar->dTf),5);
|
||||
ptFlowPar->dDExpCoefficient =format_double( calculateEpsilon(ptFlowPar->dPf, ptFlowPar->dDp,
|
||||
ptFlowPar->dBeta, ptFlowPar->dKappa),4);
|
||||
|
||||
double D = ptFlowPar->dPipeD / 1000.0;
|
||||
double d = ptFlowPar->dOrificeD / 1000.0;
|
||||
@ -92,38 +123,25 @@ void OFlowCal(FlowParSTRUCT *ptFlowPar, NGParSTRUCT *ptNGPar) {
|
||||
double Qf_initial = (C_initial * ptFlowPar->dE * ptFlowPar->dDExpCoefficient * M_PI * pow(d, 2) / 4)
|
||||
* sqrt(2 * deltaP / (ptNGPar->dRhof * (1 - pow(beta, 4))));
|
||||
ptFlowPar->dVFlowf = Qf_initial;
|
||||
|
||||
|
||||
double tolerance = 1e-6;
|
||||
int maxIter = 100;
|
||||
double currentC = C_initial;
|
||||
double currentReD = calculateReD(Qf_initial, D, ptNGPar->dRhof, ptFlowPar->dDViscosity);
|
||||
int iter = 0;
|
||||
double prevC = 0;
|
||||
|
||||
|
||||
do {
|
||||
int maxIter = 100;
|
||||
prevC = currentC;
|
||||
|
||||
|
||||
currentC = calculateCd(beta, currentReD, ptFlowPar->dPipeD, ptFlowPar->dPtmode);
|
||||
|
||||
|
||||
double Qf = (currentC * ptFlowPar->dDExpCoefficient * M_PI * pow(d, 2) / 4)
|
||||
* sqrt(2 * deltaP / (ptNGPar->dRhof * (1 - pow(beta, 4))));
|
||||
ptFlowPar->dVFlowf = Qf;
|
||||
|
||||
|
||||
currentReD = calculateReD(Qf, D, ptNGPar->dRhof, ptFlowPar->dDViscosity);
|
||||
|
||||
iter++;
|
||||
if (iter > maxIter) {
|
||||
fprintf(stderr, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n");
|
||||
fprintf(stderr, "\n");
|
||||
}
|
||||
} while (fabs(currentC - prevC) / currentC > tolerance);
|
||||
|
||||
|
||||
|
||||
double K = calculateK(ptFlowPar->dPipeType);
|
||||
double G_me = calculateRoughnessFactor(ptFlowPar->dPipeD, K, currentC);
|
||||
double C_corrected = currentC * G_me;
|
||||
@ -131,17 +149,11 @@ void OFlowCal(FlowParSTRUCT *ptFlowPar, NGParSTRUCT *ptNGPar) {
|
||||
ptFlowPar->dCd = C_corrected;
|
||||
ptFlowPar->dRoughNessPipe = G_me;
|
||||
ptFlowPar->dRnPipe = currentReD;
|
||||
|
||||
|
||||
double Qn = ptFlowPar->dVFlowf * (ptFlowPar->dFpv * ptFlowPar->dFpv * P1 / ptFlowPar->dPb_M)
|
||||
* (ptFlowPar->dTb_M) / Tf;
|
||||
ptFlowPar->dVFlowb = Qn;
|
||||
|
||||
|
||||
ptFlowPar->dMFlowb = ptFlowPar->dVFlowb * ptNGPar->dRhob;
|
||||
|
||||
ptFlowPar->dEFlowb = ptFlowPar->dVFlowb * ptNGPar->dHhvMol;
|
||||
|
||||
ptFlowPar->dEFlowb = ptFlowPar->dVFlowb * ptNGPar->dHhvMol*ptFlowPar->dPb_M*1e-6/RGASKJ/ptFlowPar->dTb_M;
|
||||
ptFlowPar->dVelocityFlow = ptFlowPar->dVFlowf / (M_PI * pow((ptFlowPar->dPipeD / 2000), 2));
|
||||
}
|
||||
|
||||
@ -150,7 +162,7 @@ void OFlowCal(FlowParSTRUCT *ptFlowPar, NGParSTRUCT *ptNGPar) {
|
||||
|
||||
|
||||
|
||||
double CaiLiaoPzxs(int tempCaiLiao) {
|
||||
double CaiLiaoPzxs(const int tempCaiLiao) {
|
||||
double CaiLiaoPzxs = 0;
|
||||
switch (tempCaiLiao) {
|
||||
case 0:
|
||||
@ -212,6 +224,7 @@ double CaiLiaoPzxs(int tempCaiLiao) {
|
||||
case 14:
|
||||
CaiLiaoPzxs = 17.2;
|
||||
break;
|
||||
default: ;
|
||||
}
|
||||
return CaiLiaoPzxs;
|
||||
}
|
||||
@ -318,7 +331,7 @@ double calculateKappa(double dZf) {
|
||||
|
||||
|
||||
double calculateReD(double Qf, double D, double rho, double mu) {
|
||||
return (4 * Qf * rho) / (M_PI * D * mu);
|
||||
return (4 * Qf * rho*1000) / (M_PI * D * mu);
|
||||
}
|
||||
|
||||
|
||||
@ -379,7 +392,7 @@ double Dlndjs(double tempP_jy, double tempT) {
|
||||
|
||||
double Dlndjs_Dlnd_P[11] = {0.1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
|
||||
|
||||
double s1, s2, ky, kx;
|
||||
double ky, kx;
|
||||
int i, m = 0, n = 0;
|
||||
|
||||
if (tempT < Dlndjs_Dlnd_T[0]) {
|
||||
@ -421,7 +434,7 @@ double Dlndjs(double tempP_jy, double tempT) {
|
||||
kx = 0;
|
||||
}
|
||||
|
||||
s1 = Dlndjs_Dlnd_Data[m][n] + (Dlndjs_Dlnd_Data[m][n + 1] - Dlndjs_Dlnd_Data[m][n]) * ky;
|
||||
s2 = Dlndjs_Dlnd_Data[m + 1][n] + (Dlndjs_Dlnd_Data[m + 1][n + 1] - Dlndjs_Dlnd_Data[m + 1][n]) * ky;
|
||||
double s1 = Dlndjs_Dlnd_Data[m][n] + (Dlndjs_Dlnd_Data[m][n + 1] - Dlndjs_Dlnd_Data[m][n]) * ky;
|
||||
double s2 = Dlndjs_Dlnd_Data[m + 1][n] + (Dlndjs_Dlnd_Data[m + 1][n + 1] - Dlndjs_Dlnd_Data[m + 1][n]) * ky;
|
||||
return (s1 + (s2 - s1) * kx) / 100000.0;
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
#include "NGCal.h"
|
||||
#include "Therm.h"
|
||||
#include "Detail.h"
|
||||
#include "String.h"
|
||||
#include "math.h"
|
||||
static Therm *ptTherm;
|
||||
static Detail *ptDetail;
|
||||
|
||||
@ -39,10 +39,6 @@ double SOS(NGParSTRUCT *ptNGPar) {
|
||||
}
|
||||
|
||||
double Crit(NGParSTRUCT *ptNGPar, double dPlenumVelocity) {
|
||||
double DH, DDH, S, H;
|
||||
double tolerance = 1.0;
|
||||
double R, P, T, Z;
|
||||
int i;
|
||||
if (NULL == ptDetail || NULL == ptTherm) {
|
||||
NGCal_UnInit();
|
||||
if (NGCal_NGCal != NGCal_Init(ptNGPar)) {
|
||||
@ -54,18 +50,19 @@ double Crit(NGParSTRUCT *ptNGPar, double dPlenumVelocity) {
|
||||
|
||||
Therm_Run(ptTherm, ptNGPar, ptDetail);
|
||||
|
||||
DH = (ptNGPar->dSOS * ptNGPar->dSOS - dPlenumVelocity * dPlenumVelocity) / 2.0;
|
||||
S = ptNGPar->dS;
|
||||
H = ptNGPar->dH;
|
||||
R = ptNGPar->dRhof;
|
||||
P = ptNGPar->dPf;
|
||||
Z = ptNGPar->dZf;
|
||||
T = ptNGPar->dTf;
|
||||
DDH = 10.0;
|
||||
for (i = 1; i < MAX_NUM_OF_ITERATIONS; i++) {
|
||||
Therm_HS_Mode(ptTherm, ptNGPar, ptDetail, H - DH, S, true);
|
||||
double DH = (ptNGPar->dSOS * ptNGPar->dSOS - dPlenumVelocity * dPlenumVelocity) / 2.0;
|
||||
double S = ptNGPar->dS;
|
||||
double H = ptNGPar->dH;
|
||||
double R = ptNGPar->dRhof;
|
||||
double P = ptNGPar->dPf;
|
||||
double Z = ptNGPar->dZf;
|
||||
double T = ptNGPar->dTf;
|
||||
// DDH = 10.0;
|
||||
for (int i = 1; i < MAX_NUM_OF_ITERATIONS; i++) {
|
||||
double tolerance = 1.0;
|
||||
Therm_HS_Mode(ptTherm, ptNGPar, ptDetail, H - DH, S, 1);
|
||||
Therm_Run(ptTherm, ptNGPar, ptDetail);
|
||||
DDH = DH;
|
||||
double DDH = DH;
|
||||
DH = (ptNGPar->dSOS * ptNGPar->dSOS - dPlenumVelocity * dPlenumVelocity) / 2.0;
|
||||
if (fabs(DDH - DH) < tolerance) break;
|
||||
}
|
||||
@ -76,14 +73,13 @@ double Crit(NGParSTRUCT *ptNGPar, double dPlenumVelocity) {
|
||||
return ptNGPar->dCstar;
|
||||
}
|
||||
|
||||
double Cperf(NGParSTRUCT *ptNGPar) {
|
||||
double k, root, exponent;
|
||||
k = ptNGPar->dKappa;
|
||||
root = 2.0 / (k + 1.0);
|
||||
exponent = (k + 1.0) / (k - 1.0);
|
||||
double Cperf(const NGParSTRUCT *ptNGPar) {
|
||||
double k = ptNGPar->dKappa;
|
||||
double root = 2.0 / (k + 1.0);
|
||||
double exponent = (k + 1.0) / (k - 1.0);
|
||||
return (sqrt(k * pow(root, exponent)));
|
||||
}
|
||||
|
||||
double CRi(NGParSTRUCT *ptNGPar) {
|
||||
double CRi(const NGParSTRUCT *ptNGPar) {
|
||||
return (Cperf(ptNGPar) / sqrt(ptNGPar->dZf));
|
||||
}
|
||||
|
@ -1,20 +1,10 @@
|
||||
/*************************************************************************
|
||||
* <EFBFBD>ļ<EFBFBD>: NGCal.h
|
||||
|
||||
**************************************************************************/
|
||||
|
||||
#ifndef _NGCal_H
|
||||
#ifndef _NGCal_H
|
||||
#define _NGCal_H
|
||||
|
||||
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <math.h>
|
||||
|
||||
|
||||
#define NORMAL 9000
|
||||
#define NGCal_NGCal 9001
|
||||
#define MEMORY_ALLOCATION_ERROR 9002
|
||||
@ -24,71 +14,49 @@
|
||||
#define MAX_DENSITY_IN_BRAKET_EXCEEDED 9006
|
||||
#define FLOW_CALC_ERROR 9007
|
||||
#define FLOW_CALC_DIEDAI_ERROR 9008
|
||||
|
||||
|
||||
|
||||
#define NUMBEROFCOMPONENTS 21
|
||||
|
||||
|
||||
|
||||
#define M_PI 3.1415926535897932
|
||||
#define MAX_NUM_OF_ITERATIONS 100
|
||||
|
||||
|
||||
#define P_CHG_TOL 0.001
|
||||
#define T_CHG_TOL 0.001
|
||||
|
||||
|
||||
#define P_MAX 1.379e8
|
||||
#define P_MIN 0.0
|
||||
#define T_MAX 473.15
|
||||
#define T_MIN 143.0
|
||||
|
||||
|
||||
#define RGASKJ 8.314510e-3
|
||||
#define RGAS 8.314510
|
||||
|
||||
|
||||
typedef struct tagNGParSTRUCT
|
||||
{
|
||||
long lStatus;
|
||||
int bForceUpdate;
|
||||
double adMixture[21];
|
||||
int dCbtj;
|
||||
double dPb;
|
||||
double dTb;
|
||||
double dPf;
|
||||
double dTf;
|
||||
|
||||
|
||||
double dMrx;
|
||||
double dZb;
|
||||
double dZf;
|
||||
double dFpv;
|
||||
double dDb;
|
||||
double dDf;
|
||||
double dRhob;
|
||||
double dRhof;
|
||||
double dRD_Ideal;
|
||||
double dRD_Real;
|
||||
|
||||
|
||||
double dHo;
|
||||
double dH;
|
||||
double dS;
|
||||
double dCpi;
|
||||
double dCp;
|
||||
double dCv;
|
||||
double dk;
|
||||
double dKappa;
|
||||
double dSOS;
|
||||
double dCstar;
|
||||
|
||||
|
||||
|
||||
double dHhvMol;
|
||||
double dLhvMol;
|
||||
|
||||
|
||||
long lStatus;
|
||||
int bForceUpdate;
|
||||
double adMixture[21];
|
||||
int dCbtj;
|
||||
double dPb;
|
||||
double dTb;
|
||||
double dPf;
|
||||
double dTf;
|
||||
double dMrx;
|
||||
double dZb;
|
||||
double dZf;
|
||||
double dFpv;
|
||||
double dDb;
|
||||
double dDf;
|
||||
double dRhob;
|
||||
double dRhof;
|
||||
double dRD_Ideal;
|
||||
double dRD_Real;
|
||||
double dHo;
|
||||
double dH;
|
||||
double dS;
|
||||
double dCpi;
|
||||
double dCp;
|
||||
double dCv;
|
||||
double dk;
|
||||
double dKappa;
|
||||
double dSOS;
|
||||
double dCstar;
|
||||
double dHhvMol;
|
||||
double dLhvMol;
|
||||
} NGParSTRUCT;
|
||||
|
||||
|
||||
|
@ -259,7 +259,7 @@ void Therm_CprCvrHS(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail) {
|
||||
}
|
||||
|
||||
|
||||
void Therm_HS_Mode(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail, double H, double S, bool bGuess) {
|
||||
void Therm_HS_Mode(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail, double H, double S, int bGuess) {
|
||||
double s0 = S;
|
||||
double h0 = H;
|
||||
double t1, t2, tmin, tmax;
|
||||
|
@ -51,7 +51,7 @@ double Therm_So(Therm *therm, NGParSTRUCT *ptNGPar);
|
||||
|
||||
void Therm_CprCvrHS(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail);
|
||||
|
||||
void Therm_HS_Mode(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail, double H, double S, bool bGuess);
|
||||
void Therm_HS_Mode(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail, double H, double S, int bGuess);
|
||||
|
||||
double Therm_H(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail);
|
||||
|
||||
|
@ -9,11 +9,11 @@ int main() {
|
||||
|
||||
// 设置基本参数
|
||||
flowParams.dPatm = 0.0981; // 标准大气压(bar)
|
||||
flowParams.dPf = 4; // 压力(MPa)
|
||||
flowParams.dPfType = 1; // 0=表压,1=绝压
|
||||
flowParams.dPf = 1.48; // 压力(MPa)
|
||||
flowParams.dPfType = 0; // 0=表压,1=绝压
|
||||
flowParams.dDp = 12.50; // 差压(kPa)
|
||||
flowParams.dTf = 10; // 温度(°C)
|
||||
flowParams.dCbtj = 0; // 参比条件类型(0=标准状态)
|
||||
flowParams.dTf = 15; // 温度(°C)
|
||||
flowParams.dCbtj = 1; // 参比条件类型(0=标准状态)
|
||||
|
||||
// 设置管道参数
|
||||
flowParams.dPipeD = 259.38; // 管道内径(mm)
|
||||
@ -23,7 +23,7 @@ int main() {
|
||||
|
||||
// 设置材料参数
|
||||
flowParams.dPipeMaterial = 2; // 20号钢
|
||||
flowParams.dOrificeMaterial = 10; // 镍铬合金
|
||||
flowParams.dOrificeMaterial = 9; // 镍铬合金
|
||||
|
||||
// 设置天然气组分(示例: 95%甲烷,5%其他)
|
||||
// 初始化天然气组分数组(GB/T 21446-2008 典型示例组成)
|
||||
@ -31,22 +31,21 @@ int main() {
|
||||
flowParams.dNG_Compents[i] = 0.0; // 先全部初始化为0
|
||||
}
|
||||
|
||||
// 按照GB/T 21446-2008标准中典型天然气组分赋值(体积百分比)
|
||||
flowParams.dNG_Compents[0] = 90.6724; // 甲烷(CH4)
|
||||
flowParams.dNG_Compents[1] = 3.1284; // 氮气(N2)
|
||||
flowParams.dNG_Compents[2] = 0.4676; // 二氧化碳(CO2)
|
||||
flowParams.dNG_Compents[3] =4.5279; // 乙烷(C2H6)
|
||||
flowParams.dNG_Compents[4] = 0.8280; // 丙烷(C3H8)
|
||||
flowParams.dNG_Compents[0] = 92.47; // 甲烷(CH4)
|
||||
flowParams.dNG_Compents[1] = 0.68; // 氮气(N2)
|
||||
flowParams.dNG_Compents[2] = 1.75; // 二氧化碳(CO2)
|
||||
flowParams.dNG_Compents[3] =3.5; // 乙烷(C2H6)
|
||||
flowParams.dNG_Compents[4] = 0.98; // 丙烷(C3H8)
|
||||
flowParams.dNG_Compents[5] = 0.00; // 水(H2O)
|
||||
flowParams.dNG_Compents[6] = 0.00; // 硫化氢(H2S)
|
||||
flowParams.dNG_Compents[7] = 0.0; // 氢气(H2)
|
||||
flowParams.dNG_Compents[8] = 0.00; // 一氧化碳(CO)
|
||||
flowParams.dNG_Compents[9] = 0.00; // 氧气(O2)
|
||||
flowParams.dNG_Compents[10] = 0.1037; // 异丁烷(i-C4H10)
|
||||
flowParams.dNG_Compents[11] = 0.1563; // 正丁烷(n-C4H10)
|
||||
flowParams.dNG_Compents[12] = 0.0321; // 异戊烷(i-C5H12)
|
||||
flowParams.dNG_Compents[13] = 0.0443; // 正戊烷(n-C5H12)
|
||||
flowParams.dNG_Compents[14] = 0.0393; // 己烷(C6H14)
|
||||
flowParams.dNG_Compents[10] = 0.34; // 异丁烷(i-C4H10)
|
||||
flowParams.dNG_Compents[11] = 0.22; // 正丁烷(n-C4H10)
|
||||
flowParams.dNG_Compents[12] = 0.0; // 异戊烷(i-C5H12)
|
||||
flowParams.dNG_Compents[13] = 0.06; // 正戊烷(n-C5H12)
|
||||
flowParams.dNG_Compents[14] = 0.0; // 己烷(C6H14)
|
||||
flowParams.dNG_Compents[15] = 0.0; // 庚烷(C7H16)
|
||||
flowParams.dNG_Compents[16] = 0.0; // 辛烷(C8H18)
|
||||
flowParams.dNG_Compents[17] = 0.0; // 壬烷(C9H20)
|
||||
@ -54,6 +53,55 @@ int main() {
|
||||
flowParams.dNG_Compents[19] = 0.0; // 氦气(He)
|
||||
flowParams.dNG_Compents[20] = 0.0; // 其他组分
|
||||
|
||||
|
||||
// flowParams.dNG_Compents[0] = 88.36; // 甲烷(CH4)
|
||||
// flowParams.dNG_Compents[1] = 0.68; // 氮气(N2)
|
||||
// flowParams.dNG_Compents[2] = 1.57; // 二氧化碳(CO2)
|
||||
// flowParams.dNG_Compents[3] =6.25; // 乙烷(C2H6)
|
||||
// flowParams.dNG_Compents[4] = 2.4; // 丙烷(C3H8)
|
||||
// flowParams.dNG_Compents[5] = 0.00; // 水(H2O)
|
||||
// flowParams.dNG_Compents[6] = 0.00; // 硫化氢(H2S)
|
||||
// flowParams.dNG_Compents[7] = 0.04; // 氢气(H2)
|
||||
// flowParams.dNG_Compents[8] = 0.00; // 一氧化碳(CO)
|
||||
// flowParams.dNG_Compents[9] = 0.00; // 氧气(O2)
|
||||
// flowParams.dNG_Compents[10] = 0.15; // 异丁烷(i-C4H10)
|
||||
// flowParams.dNG_Compents[11] = 0.35; // 正丁烷(n-C4H10)
|
||||
// flowParams.dNG_Compents[12] = 0.05; // 异戊烷(i-C5H12)
|
||||
// flowParams.dNG_Compents[13] = 0.1; // 正戊烷(n-C5H12)
|
||||
// flowParams.dNG_Compents[14] = 0.01; // 己烷(C6H14)
|
||||
// flowParams.dNG_Compents[15] = 0.0; // 庚烷(C7H16)
|
||||
// flowParams.dNG_Compents[16] = 0.0; // 辛烷(C8H18)
|
||||
// flowParams.dNG_Compents[17] = 0.0; // 壬烷(C9H20)
|
||||
// flowParams.dNG_Compents[18] = 0.0; // 癸烷(C10H22)
|
||||
// flowParams.dNG_Compents[19] = 0.04; // 氦气(He)
|
||||
// flowParams.dNG_Compents[20] = 0.0; // 其他组分
|
||||
|
||||
|
||||
|
||||
// 按照GB/T 21446-2008标准中典型天然气组分赋值(体积百分比)
|
||||
|
||||
// flowParams.dNG_Compents[0] = 90.6724; // 甲烷(CH4)
|
||||
// flowParams.dNG_Compents[1] = 3.1284; // 氮气(N2)
|
||||
// flowParams.dNG_Compents[2] = 0.4676; // 二氧化碳(CO2)
|
||||
// flowParams.dNG_Compents[3] =4.5279; // 乙烷(C2H6)
|
||||
// flowParams.dNG_Compents[4] = 0.8280; // 丙烷(C3H8)
|
||||
// flowParams.dNG_Compents[5] = 0.00; // 水(H2O)
|
||||
// flowParams.dNG_Compents[6] = 0.00; // 硫化氢(H2S)
|
||||
// flowParams.dNG_Compents[7] = 0.0; // 氢气(H2)
|
||||
// flowParams.dNG_Compents[8] = 0.00; // 一氧化碳(CO)
|
||||
// flowParams.dNG_Compents[9] = 0.00; // 氧气(O2)
|
||||
// flowParams.dNG_Compents[10] = 0.1037; // 异丁烷(i-C4H10)
|
||||
// flowParams.dNG_Compents[11] = 0.1563; // 正丁烷(n-C4H10)
|
||||
// flowParams.dNG_Compents[12] = 0.0321; // 异戊烷(i-C5H12)
|
||||
// flowParams.dNG_Compents[13] = 0.0443; // 正戊烷(n-C5H12)
|
||||
// flowParams.dNG_Compents[14] = 0.0393; // 己烷(C6H14)
|
||||
// flowParams.dNG_Compents[15] = 0.0; // 庚烷(C7H16)
|
||||
// flowParams.dNG_Compents[16] = 0.0; // 辛烷(C8H18)
|
||||
// flowParams.dNG_Compents[17] = 0.0; // 壬烷(C9H20)
|
||||
// flowParams.dNG_Compents[18] = 0.0; // 癸烷(C10H22)
|
||||
// flowParams.dNG_Compents[19] = 0.0; // 氦气(He)
|
||||
// flowParams.dNG_Compents[20] = 0.0; // 其他组分
|
||||
|
||||
// flowParams.dNG_Compents[0] =96.5; // 甲烷(CH4)
|
||||
// flowParams.dNG_Compents[1] =0.30; // 氮气(N2)
|
||||
// flowParams.dNG_Compents[2] =0.6; // 二氧化碳(CO2)
|
||||
|
217
User/main.c
217
User/main.c
@ -1,217 +0,0 @@
|
||||
/**
|
||||
*********************************************************************
|
||||
* @file main.c
|
||||
* @author liaodeyun
|
||||
* @version V1.0
|
||||
* @date 2025-7-6
|
||||
* @brief RT-Thread 3.0 + STM32 天然气流量计算
|
||||
*********************************************************************
|
||||
* @attention
|
||||
*
|
||||
* 实验平台:野火 H750 PRO STM32 开发板
|
||||
* 论坛 :http://www.firebbs.cn
|
||||
* 淘宝 :https://fire-stm32.taobao.com
|
||||
*
|
||||
**********************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
*************************************************************************
|
||||
* 包含的头文件
|
||||
*************************************************************************
|
||||
*/
|
||||
#include "board.h"
|
||||
#include "rtthread.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include "NGCal.h"
|
||||
#include "Therm.h"
|
||||
#include "Detail.h"
|
||||
#include "FlowCal.h"
|
||||
|
||||
/*
|
||||
*************************************************************************
|
||||
* 变量
|
||||
*************************************************************************
|
||||
*/
|
||||
/* 定义线程控制块 */
|
||||
static rt_thread_t OFlowCal_thread = RT_NULL;
|
||||
static rt_thread_t key_thread = RT_NULL;
|
||||
/*
|
||||
*************************************************************************
|
||||
* 函数声明
|
||||
*************************************************************************
|
||||
*/
|
||||
static void OFlowCal_thread_entry(void* parameter);
|
||||
static void key_thread_entry(void* parameter);
|
||||
|
||||
/*
|
||||
*************************************************************************
|
||||
* main 函数
|
||||
*************************************************************************
|
||||
*/
|
||||
/**
|
||||
* @brief 主函数
|
||||
* @param 无
|
||||
* @retval 无
|
||||
*/
|
||||
int main(void)
|
||||
{
|
||||
/*
|
||||
* 开发板硬件初始化,RTT系统初始化已经在main函数之前完成,
|
||||
* 即在component.c文件中的rtthread_startup()函数中完成了。
|
||||
* 所以在main函数中,只需要创建线程和启动线程即可。
|
||||
*/
|
||||
rt_kprintf("这是一个[野火]-STM32H750天然气流量计算机实验程序!\n\n");
|
||||
rt_kprintf("按下K1挂起线程,按下K2恢复线程\n");
|
||||
OFlowCal_thread = /* 线程控制块指针 */
|
||||
rt_thread_create( "OFlowCal", /* 线程名字 */
|
||||
OFlowCal_thread_entry, /* 线程入口函数 */
|
||||
RT_NULL, /* 线程入口函数参数 */
|
||||
512, /* 线程栈大小 */
|
||||
3, /* 线程的优先级 */
|
||||
20); /* 线程时间片 */
|
||||
|
||||
/* 启动线程,开启调度 */
|
||||
if (OFlowCal_thread != RT_NULL)
|
||||
rt_thread_startup(OFlowCal_thread);
|
||||
else
|
||||
return -1;
|
||||
|
||||
key_thread = /* 线程控制块指针 */
|
||||
rt_thread_create( "key", /* 线程名字 */
|
||||
key_thread_entry, /* 线程入口函数 */
|
||||
RT_NULL, /* 线程入口函数参数 */
|
||||
512, /* 线程栈大小 */
|
||||
2, /* 线程的优先级 */
|
||||
20); /* 线程时间片 */
|
||||
|
||||
/* 启动线程,开启调度 */
|
||||
if (key_thread != RT_NULL)
|
||||
rt_thread_startup(key_thread);
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
*************************************************************************
|
||||
* 线程定义
|
||||
*************************************************************************
|
||||
*/
|
||||
|
||||
static void OFlowCal_thread_entry(void* parameter)
|
||||
{
|
||||
|
||||
while (1)
|
||||
{
|
||||
|
||||
// 初始化结构体
|
||||
FlowParSTRUCT flowParams = {0};
|
||||
NGParSTRUCT ngParams = {0};
|
||||
|
||||
// 设置基本参数
|
||||
flowParams.dPatm = 0.0981; // 标准大气压(bar)
|
||||
flowParams.dPf = 1.48; // 压力(MPa)
|
||||
flowParams.dPfType = 0; // 0=表压,1=绝压
|
||||
flowParams.dDp = 12.50; // 差压(kPa)
|
||||
flowParams.dTf = 15.0; // 温度(°C)
|
||||
flowParams.dCbtj = 0; // 参比条件类型(0=标准状态)
|
||||
|
||||
// 设置管道参数
|
||||
flowParams.dPipeD = 259.38; // 管道内径(mm)
|
||||
flowParams.dOrificeD = 150.25; // 孔板孔径(mm)
|
||||
flowParams.dPipeType = 0; // 管道类型
|
||||
flowParams.dPtmode = 0; // 取压方式(0=法兰取压,1=角接取压)
|
||||
|
||||
// 设置材料参数
|
||||
flowParams.dPipeMaterial = 2; // 20号钢
|
||||
flowParams.dOrificeMaterial = 10; // 镍铬合金
|
||||
|
||||
// 设置天然气组分(示例: 95%甲烷,5%其他)
|
||||
// 初始化天然气组分数组(GB/T 21446-2008 典型示例组成)
|
||||
for(int i=0; i<NUMBEROFCOMPONENTS; i++) {
|
||||
flowParams.dNG_Compents[i] = 0.0; // 先全部初始化为0
|
||||
}
|
||||
|
||||
// 按照GB/T 21446-2008标准中典型天然气组分赋值(体积百分比)
|
||||
flowParams.dNG_Compents[0] = 88.36; // 甲烷(CH4)
|
||||
flowParams.dNG_Compents[1] = 0.68; // 氮气(N2)
|
||||
flowParams.dNG_Compents[2] = 1.57; // 二氧化碳(CO2)
|
||||
flowParams.dNG_Compents[3] = 6.25; // 乙烷(C2H6)
|
||||
flowParams.dNG_Compents[4] = 2.4; // 丙烷(C3H8)
|
||||
flowParams.dNG_Compents[5] = 0.00; // 水(H2O)
|
||||
flowParams.dNG_Compents[6] = 0.00; // 硫化氢(H2S)
|
||||
flowParams.dNG_Compents[7] = 0.04; // 氢气(H2)
|
||||
flowParams.dNG_Compents[8] = 0.00; // 一氧化碳(CO)
|
||||
flowParams.dNG_Compents[9] = 0.00; // 氧气(O2)
|
||||
flowParams.dNG_Compents[10] = 0.15; // 异丁烷(i-C4H10)
|
||||
flowParams.dNG_Compents[11] = 0.35; // 正丁烷(n-C4H10)
|
||||
flowParams.dNG_Compents[12] = 0.05; // 异戊烷(i-C5H12)
|
||||
flowParams.dNG_Compents[13] = 0.1; // 正戊烷(n-C5H12)
|
||||
flowParams.dNG_Compents[14] = 0.01; // 己烷(C6H14)
|
||||
flowParams.dNG_Compents[15] = 0.0; // 庚烷(C7H16)
|
||||
flowParams.dNG_Compents[16] = 0.0; // 辛烷(C8H18)
|
||||
flowParams.dNG_Compents[17] = 0.0; // 壬烷(C9H20)
|
||||
flowParams.dNG_Compents[18] = 0.0; // 癸烷(C10H22)
|
||||
flowParams.dNG_Compents[19] = 0.04; // 氦气(He)
|
||||
flowParams.dNG_Compents[20] = 0.0; // 其他组分
|
||||
|
||||
|
||||
// 调用流量计算函数
|
||||
OFlowCal(&flowParams, &ngParams);
|
||||
|
||||
// 打印计算结果
|
||||
printf("========== 流量计算结果 ==========\n");
|
||||
printf("工况流量: %.4f m3/s\n", flowParams.dVFlowf);
|
||||
printf("标况流量: %.4f m3/s\n", flowParams.dVFlowb);
|
||||
printf("标况质量流量: %.4f kg/s\n", flowParams.dMFlowb);
|
||||
printf("标况能量流量: %.4f MJ/s\n", flowParams.dEFlowb / 1e6);
|
||||
printf("管道内流速: %.2f m/s\n", flowParams.dVelocityFlow);
|
||||
printf("流出系数: %.4f\n", flowParams.dCd);
|
||||
printf("雷诺数: %.2f\n", flowParams.dRnPipe);
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void key_thread_entry(void* parameter)
|
||||
{
|
||||
rt_err_t uwRet = RT_EOK;
|
||||
while (1)
|
||||
{
|
||||
if( Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON )/* K1 被按下 */
|
||||
{
|
||||
printf("挂起LED1线程!\n");
|
||||
uwRet = rt_thread_suspend(OFlowCal_thread);/* 挂起LED1线程 */
|
||||
if(RT_EOK == uwRet)
|
||||
{
|
||||
rt_kprintf("挂起LED1线程成功!\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_kprintf("挂起LED1线程失败!失败代码:0x%lx\n",uwRet);
|
||||
}
|
||||
}
|
||||
if( Key_Scan(KEY2_GPIO_PORT,KEY2_PIN) == KEY_ON )/* K1 被按下 */
|
||||
{
|
||||
printf("恢复LED1线程!\n");
|
||||
uwRet = rt_thread_resume(OFlowCal_thread);/* 恢复LED1线程! */
|
||||
if(RT_EOK == uwRet)
|
||||
{
|
||||
rt_kprintf("恢复LED1线程成功!\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
rt_kprintf("恢复LED1线程失败!失败代码:0x%lx\n",uwRet);
|
||||
}
|
||||
}
|
||||
rt_thread_delay(20);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/********************************END OF FILE****************************/
|
Loading…
Reference in New Issue
Block a user