/*************************************************************************
* 文件:    detail.h    
* 描述:    'Detail' 类的头文件
*          实现部分请参见 'detail.c'
* 版本:    ver 1.7    2002.11.17
* 作者:    W.B. Peterson
* 修订记录:
* 版权所有 (c) 2002 美国天然气协会
**************************************************************************/

#ifndef _DETAIL_H 
#define _DETAIL_H

#include "NGCal.h"
#include <stdbool.h>  // 添加bool类型支持

// 使用结构体替代C++类
typedef struct Detail
{
    // 私有成员数据
    int iNCC;                // 组分数目
    
    int aiCID[21];           // 组分ID
    // 五个历史变量用于提高重复计算时的效率
    double dOldMixID;        // 上一次计算的混合物ID
    double dOldPb;           // 上一次计算的Pb
    double dOldTb;           // 上一次计算的Tb
    double dOldPf;           // 上一次计算的Pf
    double dOldTf;           // 上一次计算的Tf

    // 表4第1列中的EOS参数
    double adAn[58]; 
    double adUn[58];

    // 表5中的特征参数
    double dMri[21];         // 第i组分的分子量
    double dEi[21];          // 第i组分的特征能量参数
    double dKi[21];          // 第i组分的尺寸参数 - m^3/kg-mol ^1/3
    double dGi[21];          // 第i组分的取向参数
    double dQi[21];          // 第i组分的四极参数
    double dFi[21];          // 第i组分的高温参数
    double dSi[21];          // 第i组分的偶极参数
    double dWi[21];          // 第i组分的缔合参数

    double dEij[21][21];     // 维里系数能量二元相互作用参数
    double dUij[21][21];     // 共形能量的二元相互作用参数
    double dKij[21][21];     // 尺寸的二元相互作用参数
    double dGij[21][21];     // 取向的二元相互作用参数

    double adTable6Eij[21][21];  // 表6常数
    double adTable6Uij[21][21];  // 表6常数
    double adTable6Kij[21][21];  // 表6常数
    double adTable6Gij[21][21];  // 表6常数

    double adTable5Qi[21];   // 表5常数
    double adTable5Fi[21];   // 表5常数
    double adTable5Si[21];   // 表5常数
    double adTable5Wi[21];   // 表5常数
		
		double adTableHhvMol[4][21]; //GB/T11062  摩尔高位发热量
		double adTableLhvMol[4][21]; //GB/T11062  摩尔低位发热量

    double dXi[21];          // 第i组分的摩尔分数
    double dPCalc;           // 由pdetail()计算的压力
    double dT;               // 当前温度
    double dP;               // 当前压力
    double dRhoTP;           // 在T和P下的摩尔密度
    double dB;               // 第二维里系数B
    double adBcoef[18];      // 计算B的18个系数
    double adFn[58];         // 密度系数的函数
    double fx[58];           // 用于3个导数的修改系数
    double dU;               // 混合物能量参数
    double dKp3;             // 混合物尺寸参数的立方
    double dW;               // 混合物取向参数
    double dQp2;             // 混合物四极参数的平方
    double dF;               // 高温参数
    double dRho;             // 摩尔密度
    double dRhoL;            // 用于braket函数的低密度
    double dRhoH;            // 用于braket函数的高密度
    double dPRhoL;           // 用于braket函数的低压
    double dPRhoH;           // 用于braket函数的高压

    // 公共变量，也用于高级流体性质计算
    double dZ;               // 当前压缩因子
    double ddZdT;            // Z对T的一阶偏导数
    double dd2ZdT2;          // Z对T的二阶偏导数
    double ddZdD;            // Z对摩尔密度的一阶偏导数
    double ddBdT;            // B对T的一阶偏导数
    double dd2BdT2;          // B对T的二阶偏导数
} Detail;

// 构造函数和析构函数
Detail* Detail_Construct(void);
void Detail_Destroy(Detail* pDetail);

// 私有方法
int Detail_compositionchange(Detail* pDetail, AGA10STRUCT* pAGA10);
void Detail_table(Detail* pDetail);
void Detail_paramdl(Detail* pDetail);
void Detail_chardl(Detail* pDetail, AGA10STRUCT* pAGA10);
void Detail_bvir(Detail* pDetail);
void Detail_temp(Detail* pDetail);
void Detail_braket(Detail* pDetail, AGA10STRUCT* pAGA10);
void Detail_pdetail(Detail* pDetail, double dRho);
void Detail_ddetail(Detail* pDetail, AGA10STRUCT* pAGA10);
void Detail_relativedensity(Detail* pDetail, AGA10STRUCT* pAGA10);

// 公共方法
double Detail_zdetail(Detail* pDetail, double dRho);
double Detail_dZdT(Detail* pDetail, double dRho);
double Detail_d2ZdT2(Detail* pDetail, double dRho);
double Detail_dZdD(Detail* pDetail, double dRho);
void Detail_Run(Detail* pDetail, AGA10STRUCT* pAGA10);

#endif
