📄 oilmethod.cpp
字号:
// OilMethod.cpp: implementation of the COilMethod class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "OilTrans.h"
#include "OilMethod.h"
#include <math.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
COilMethod::COilMethod()
{
K0 = 0;
K1 = 0;
}
COilMethod::~COilMethod()
{
}
/********************************************
*Method Name :
* SelKn()
*
* Select the fuitable K0 and K1
*参数:
* D 密度
* x 油品编码
*********************************************/
void COilMethod::SelKn(double D,int x)
{
if(x==2){
K0=k01;
K1=k11;
}
if(x==1){
K0=k03;
K1=k13;
}
if(x==0){
if(D>=653&&D<770){
K0=k02[0];
K1=k12[0];
}
else if(D>=788&&D<839){
K0=k02[1];
K1=k12[1];
}
else if(D>=839&&D<=1075){
K0=k02[2];
K1=k12[2];
}
else{
K0=-0.00336312;
K1=2680.3206;
}
}
}
/********************************************
*Method Name :
* Decimal_R()
*
* handle roundly the Decimal dNum
*参数:
* dNum 要处理的数值
* n 保留几位小数
*返回
* double类型的处理后的数值
*********************************************/
double COilMethod::Decimal_R5(double dNum, int n)
{
n--;
double dTemp = (dNum*pow(10.0,n));
double dpr =fmod(dTemp,1.0);
if(fabs(dpr)<0.25)
dpr=0;
else if(fabs(dpr)>0.75)
dpr=1;
else
dpr=0.5;
dNum=(floor(dTemp)+sign(dNum)*dpr)/pow(10.0,n);
return dNum;
}
/********************************************
*Method Name :
* Decimal_R()
*
* handle commonly the Decimal dNum
*参数:
* dNum 要处理的数值
* n 保留几位小数
*返回
* double类型的处理后的数值
*********************************************/
double COilMethod::Decimal_R(double dNum, int n)
{
double dTemp = (dNum)*pow(10.0,n);
double dpr =fmod(dTemp,1.0);
if (dpr<0.5&&dpr>-0.5)
dpr =0.0;
else
dpr =sign(dpr);
return (dpr+floor(dTemp))/pow(10.0,n);
}
/********************************************
*Method Name :
* Decimal_Tru()
*
* handle commonly the Decimal dNum
*参数:
* dNum 要处理的数值
* n 保留几位小数
*返回
* double类型的处理后的数值
*********************************************/
double COilMethod::Decimal_Tru(double dNum, int n)
{
double dTemp = dNum*pow(10.0,n) -fmod(dNum*pow(10.0,n),1.0);
return dTemp/pow(10.0,n);
}
/********************************************
*Method Name :
* dntoi()
*
* 乘方预算
*参数:
* dX double类型的数值
*返回
* int类型的处理后的数值
*********************************************/
int COilMethod::dntoi(double dX)
{
return (int)dX;
}
/********************************************
*Method Name :
* Diff_20()
*
* 计算温度dX与标准温度20的差异
*参数:
* dX double类型的温度数值
*返回
* double类型的处理后的差异数值
*********************************************/
double COilMethod::Diff_20(double dX)
{
return dX-20;
}
/********************************************
*Method Name :
* Diff_15()
*
* 计算温度dX与标准温度15的差异
*参数:
* dX double类型的温度数值
*返回
* double类型的处理后的差异数值
*********************************************/
double COilMethod::Diff_15(double dX)
{
return dX-15;
}
/********************************************
*Method Name :
* Coefficient_T()
*
* 计算温度校正系数
*参数:
* dT double类型的温度数值
*返回
* double类型的温度校正系数
*********************************************/
double COilMethod::Coefficient_T(double dT)
{
//dCT=1.0-0.000023*x-0.00000002*x*x;
double dCT =1.000000000;
dCT = dCT-Decimal_R(0.0000230*dT,9);
dCT = dCT-Decimal_R(0.000000020*dT*dT,9);
return dCT;
}
/********************************************
*Method Name :
* Coefficient_TKLZ()
*
* 计算热力热力校正系数 当K0<0时使用
*参数:
* dT double类型的温度数值
*返回
* double类型的热力校正系数
*********************************************/
double COilMethod::Coefficient_TKLZ(double dK0,double dK1,double rho15)
{
//alpha=K0+K1/rho15*rho15
double dCTk = 0.0;
dCTk = Decimal_Tru(dK1/rho15,6);
dCTk = Decimal_R(dCTk/rho15,8);
return Decimal_R(dK0+dCTk,7);
}
/********************************************
*Method Name :
* Coefficient_TKMZ()
*
* 计算热力热力校正系数 当K0>=0时使用
*参数:
* dT double类型的温度数值
*返回
* double类型的热力校正系数
*********************************************/
double COilMethod::Coefficient_TKMZ(double dK0,double dK1,double rho15)
{
//alpha=K0/rho15*rho15+K1/rho15
double dTemp =0.0;
if(dK0!=0)
{
dTemp=Decimal_Tru(dK0/rho15,8);
dTemp=Decimal_Tru(dTemp/rho15,10);
}
dTemp = dTemp + Decimal_Tru(dK1/rho15,10);
return Decimal_R(dTemp,7);
}
/********************************************
*Method Name :
* Coefficient_V()
*
* 计算体积修正系数
*参数:
* dCTK double类型的热力校正系数
* dDiffT15 温度与15的差异数
*返回
* double类型的体积修正系数
*********************************************/
double COilMethod::Coefficient_V(double dCTK,double dDiffT15)
{
//vcf=exp(-dCTK*dDiffT15-0.8*dCTK*dCTK*dDiffT15*dDiffT15)
double dVcf ,dTemp=1.0;
dVcf=Decimal_Tru(dCTK*dDiffT15,9);
dTemp=Decimal_Tru(0.8*dVcf,9);
dTemp=Decimal_R(dVcf*dTemp,9);
dVcf=Decimal_Tru(-(dVcf+dTemp),8);
return Decimal_R(exp(dVcf),6);
}
/********************************************
*Method Name :
* Coeffication_ThermalEx()
*
* 计算热力膨胀修正系数
*参数:
* dCTK double类型的热力校正系数
* dDiffT15 温度与15的差异数
*返回
* double类型的热力膨胀修正系数
*********************************************/
double COilMethod::Coeffication_ThermalEx(double dK0,double dK1,double rho15)
{
//alpha15=k0/(rho15*rho15)+k1/rho15
double dTemp =0.0;
if(dK0!=0)
{
dTemp=Decimal_Tru(dK0/rho15,8);
dTemp=Decimal_Tru(dTemp/rho15,10);
}
return Decimal_R(dTemp+Decimal_Tru(dK1/rho15,10),7);
}
/********************************************
*Method Name :
* Dst_ST()
*
* 计算密度修正系数
*参数:
* dT 温度
* dDst 密度
* n 油品
*返回
* double类型的密度修正系数
*********************************************/
double COilMethod::Dst_ST(double dDst, double dT, int nOilType)
{
double dT_20;
double vcf,hyc,rhot,rho15,delta15;
double K0t,K1t,rho15_Next,alpha15,alpha;
dDst=Decimal_R5(dDst,1);
dT=Decimal_R5(dT,2);
dT_20=Diff_20(dT);
hyc=Coefficient_T(dT_20);
rhot=Decimal_R(dDst*hyc,2);
rho15=rhot;
delta15=Diff_15(dT);
SelKn(dDst,nOilType);
do
{
rho15=rhot;
K0t=K0;
K1t=K1;
rho15_Next=rho15;
do
{
rho15=rho15_Next;
if(K0>=0)
alpha=Coefficient_TKMZ(K0,K1,rho15);
else
alpha=Coefficient_TKLZ(K0,K1,rho15);
vcf=Coefficient_DT15(alpha,delta15);
rho15_Next=Dst_15(rhot,vcf);
} while(fabs((rho15_Next-rho15))>0.05);
SelKn(rho15_Next,nOilType);
}while(K0!=K0t&&K1!=K1t);
rho15=rho15_Next;
if(rho15>=770.5&&rho15<=787.5&&nOilType==3)
{
alpha15=Coefficient_TKLZ(K0,K1,rho15);
}
else
alpha15=Coeffication_ThermalEx(K0,K1,rho15);
vcf=Coefficient_15Vs20(alpha15,dT_20);
return Dst_20(rhot,vcf);
}
/********************************************
*Method Name :
* Coefficient_DT15()
*
* 15校正系数
*参数:
* dDstR 要判断的数值
* dTR
*返回
* double类型的相对校正系数,
*********************************************/
double COilMethod::Coefficient_DT15(double dDstR,double dTR)
{
//vcf=exp(-alpha*delta-0.8*alpha*alpha*delta*delta)
double dTem,dTemp =0.0;
dTemp=Decimal_Tru(dDstR*dTR,9);
dTem=Decimal_Tru(0.8*dTemp,9);
dTem=Decimal_R(dTemp*dTem,9);
dTemp=Decimal_Tru(-(dTemp+dTem),8);
return Decimal_R(exp(dTemp),6);
}
/********************************************
*Method Name :
* Dst_15()
*
* 15与20的相对校正系数
*参数:
* dC20 要判断的数值
* dC15
*返回
* double类型的相对校正系数,
*********************************************/
double COilMethod::Dst_15(double dDst, double dCft)
{
return Decimal_R(dDst/dCft,3);
}
/********************************************
*Method Name :
* Coefficient_15Vs20()
*
* 15与20的相对校正系数
*参数:
* dC20 要判断的数值
* dC15
*返回
* double类型的相对校正系数,
*********************************************/
double COilMethod::Dst_20(double dDst, double dCft)
{
return Decimal_R(Decimal_Tru(dDst/dCft,3),1);
}
/********************************************
*Method Name :
* Coefficient_15Vs20()
*
* 15与20的相对校正系数
*参数:
* dC20 要判断的数值
* dC15
*返回
* double类型的相对校正系数,
*********************************************/
double COilMethod::Coefficient_15Vs20(double dC15, double dC20)
{
/*
*x=exp(-dC15*dC20-8*dC15*dC15*dC20
* -0.8*dC15*dC15*dC20*dC20)
*/
double dT0,dT1,dT2;
dT0=Decimal_Tru(dC15*dC20,9);
dT1=Decimal_Tru(dC15*dT0,9);
dT1=Decimal_R(dT1*8,9);
dT2=Decimal_Tru(0.8*dT0,9);
dT2=Decimal_R(dT0*dT2,9);
dT0=Decimal_Tru(-(dT0+dT1+dT2),8);
return Decimal_R(exp(dT0),6);;
}
/********************************************
*Method Name :
* sign()
*
* 自定义符号函数
*参数:
* dNum 要判断的数值
*
*返回
* int类型的符号,如果dNum小于0,返回-1,否则返回1
*********************************************/
int COilMethod::sign(double dNum)
{
if (dNum>=0)
return 1;
return -1;
}
/********************************************
*Method Name :
* Cfc_V()
*
* 计算体积修正系数
*参数:
* dT 温度
* dDst 密度
* n 油品
*返回
* double类型的体积修正系数
*********************************************/
double COilMethod::Cfc_V(double dT, double dDst, int n)
{
double K0t,K1t,rho15_Next,vcf,alpha,delta;
double dDst_R,delta20,rho15,delta15;
dDst_R=Decimal_R5(dDst,1);
dT=Decimal_R5(dT,2);
delta20=dT-20.0;
rho15=dDst_R;
delta15=5.0;
SelKn(dDst,n);
do
{
rho15=dDst_R;
K0t=K0;
K1t=K1;
rho15_Next=rho15;
do
{
rho15=rho15_Next;
if(K0>=0)
alpha=Coefficient_TKMZ(K0,K1,rho15);
else
alpha=Coefficient_TKLZ(K0,K1,rho15);
vcf=Coefficient_DT15(alpha,delta15);
rho15_Next=Dst_15(dDst_R,vcf);
} while(fabs(rho15_Next-rho15)>0.05);
SelKn(rho15_Next,n);
}while(K0!=K0t&&K1!=K1t);
rho15=rho15_Next;
SelKn(rho15_Next,n);
if(K0>=0)
alpha=Coefficient_TKMZ(K0,K1,rho15);
else
alpha=Coefficient_TKLZ(K0,K1,rho15);
delta=dT-20.00;
vcf=Coefficient_15Vs20(alpha,delta);
if(vcf>=1)
return Decimal_R(vcf,4);
else
return Decimal_R(vcf,5);
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -