GasFlowMeter/User/NG 带注释/NGCal.c

203 lines
5.2 KiB
C
Raw Normal View History

/*************************************************************************
* <EFBFBD>ļ<EFBFBD>: aga10.c
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD>C*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>Detail<EFBFBD><EFBFBD>Therm<EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>º<EFBFBD><EFBFBD><EFBFBD>:
* AGA10_Init(), AGA10_UnInit(), SOS(), Crit(), Cperf(), CRi()
* <EFBFBD>: ver 1.7 2002.11.17
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: W.B. Peterson
* <EFBFBD>޶<EFBFBD>:
* <EFBFBD><EFBFBD>Ȩ (c) 2002 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><EFBFBD>Э<EFBFBD><EFBFBD>
**************************************************************************/
#include "NGCal.h"
#include "Therm.h"
#include "Detail.h"
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD>ָ<EFBFBD>һ<EBA3BA><D2BB>Therm<72><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Detail<69><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static Therm *ptTherm;
static Detail *ptDetail;
/**************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : AGA10_Init()
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : void
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ : int
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD>޶<EFBFBD> :
**************************************************************************/
int NGCal_Init(void)
{
ptDetail = (Detail *)malloc(sizeof(Detail));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD>ܶȵĶ<C8B5><C4B6><EFBFBD>
if (NULL == ptDetail )
{
return MEMORY_ALLOCATION_ERROR;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѧ<EFBFBD><D1A7><EFBFBD>ʵĶ<CAB5><C4B6><EFBFBD>
ptTherm = (Therm *)malloc(sizeof(Therm));
if (NULL == ptTherm )
{
return MEMORY_ALLOCATION_ERROR;
}
return AGA10_INITIALIZED;
}
/**************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : AGA10_UnInit()
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : void
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ : int
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD>޶<EFBFBD> :
**************************************************************************/
int NGCal_UnInit(void)
{
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>
if (ptDetail) free( ptDetail);
if (ptTherm) free (ptTherm);
return 0;
}
/**************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : SOS()
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : ָ<EFBFBD><EFBFBD><EFBFBD>ⲿAGA10<EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ : double
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD>޶<EFBFBD> :
**************************************************************************/
double SOS(AGA10STRUCT *ptAGA10)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫʱ<D2AA><CAB1>ʼ<EFBFBD><CABC>
if (NULL == ptDetail || NULL == ptTherm)
{
NGCal_UnInit();
NGCal_Init();
}
// <20><><EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܶȺ<DCB6><C8BA><EFBFBD><EFBFBD><EFBFBD>ѧ<EFBFBD><D1A7><EFBFBD><EFBFBD>
ptTherm->Run(ptTherm,ptAGA10, ptDetail);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ټ<EFBFBD><D9BC><EFBFBD><E3B2BB><EFBFBD><EFBFBD>C*<2A><><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ϊ<EFBFBD><CEAA>
ptAGA10->dCstar = 0.0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return ptAGA10->dSOS;
}
/**************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : Crit()
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : ָ<EFBFBD><EFBFBD><EFBFBD>ⲿAGA10<EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD>ָ<EFBFBD>Detail<EFBFBD><EFBFBD>Therm<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><EFBFBD>ٶȣ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ : double
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD><EFBFBD><EFBFBD><EFBFBD>C*
* <EFBFBD>޶<EFBFBD> :
**************************************************************************/
double Crit(AGA10STRUCT *ptAGA10, double dPlenumVelocity)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD>
double DH, DDH, S, H;
double tolerance = 1.0;
double R, P, T, Z;
int i;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Գ<EFBFBD>ʼ<EFBFBD><CABC>
if (NULL == ptDetail || NULL == ptTherm)
{
NGCal_UnInit();
if (AGA10_INITIALIZED != NGCal_Init())
{
ptAGA10->lStatus = MEMORY_ALLOCATION_ERROR;
return 0.0;
}
}
// <20><><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD>ܶȺ<DCB6><C8BA><EFBFBD><EFBFBD><EFBFBD>ѧ<EFBFBD><D1A7><EFBFBD><EFBFBD>
ptTherm->Run(ptTherm,ptAGA10, ptDetail);
// DH<44>Ǵӹܵ<D3B9><DCB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ䣻<CAB1><E4A3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵij<C7B5>ʼ<EFBFBD>²<EFBFBD>ֵ
DH = (ptAGA10->dSOS * ptAGA10->dSOS - dPlenumVelocity * dPlenumVelocity) / 2.0;
// <20><><EFBFBD><EFBFBD><EFBFBD>Ǹı<C7B8><C4B1><EFBFBD><EFBFBD>ݽṹ<DDBD><E1B9B9><EFBFBD><EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD>
S = ptAGA10->dS;
H = ptAGA10->dH;
R = ptAGA10->dRhof;
P = ptAGA10->dPf;
Z = ptAGA10->dZf;
T = ptAGA10->dTf;
// <20><>DH<44><48><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
DDH = 10.0;
// ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>¶Ⱥ<C2B6><C8BA><EFBFBD><EFBFBD>٣<EFBFBD>
// <20>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD>ܵ<EFBFBD><DCB5>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʡ<EFBFBD>
// <20><><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>ִ<EFBFBD>г<EFBFBD><D0B3><EFBFBD>100<30><30><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>
for (i = 1; i < MAX_NUM_OF_ITERATIONS; i++)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>H<EFBFBD><48>S<EFBFBD><53>P<EFBFBD><50>T
ptTherm->HS_Mode(ptTherm,ptAGA10, ptDetail, H - DH, S, true);
// <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD>ѧ<EFBFBD><D1A7><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD>SOS
ptTherm->Run(ptTherm,ptAGA10, ptDetail);
// <20><><EFBFBD><EFBFBD>DH<44><48><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD>
DDH = DH;
// <20><><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>DH
DH = (ptAGA10->dSOS * ptAGA10->dSOS - dPlenumVelocity * dPlenumVelocity) / 2.0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>
if (fabs(DDH - DH) < tolerance) break;
}
// C*<2A><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>Cperf<72><66>CRi<52><69><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ptAGA10->dCstar = (ptAGA10->dRhof * ptAGA10->dSOS) / sqrt(R * P * Z);
// <20>ָ<EFBFBD>ԭʼ<D4AD>ܵ<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ptAGA10->dPf = P;
ptAGA10->dTf = T;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Իָ<D4BB>Ϊ<EFBFBD>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD>
ptTherm->Run(ptTherm,ptAGA10, ptDetail);
// <20><><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return ptAGA10->dCstar;
}
/**************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : Cperf()
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : ָ<EFBFBD><EFBFBD><EFBFBD>ⲿAGA10<EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ : double
* <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><EFBFBD><EFBFBD>
* <EFBFBD>޶<EFBFBD> :
**************************************************************************/
double Cperf(AGA10STRUCT *ptAGA10)
{
double k, root, exponent;
k = ptAGA10->dKappa;
root = 2.0 / (k + 1.0);
exponent = (k + 1.0) / (k - 1.0);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>C*i
return(sqrt(k * pow(root, exponent)));
}
/**************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : CRi()
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : ָ<EFBFBD><EFBFBD><EFBFBD>ⲿAGA10<EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ : double
* <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>CRi
* <EFBFBD>޶<EFBFBD> :
**************************************************************************/
double CRi(AGA10STRUCT *ptAGA10)
{
return (Cperf(ptAGA10) / sqrt(ptAGA10->dZf));
}