|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
|
|
#include "Defines.h"
|
|
|
|
|
|
#include "mAlgDefines.h"
|
|
|
|
|
|
#include "mAlgMatrix.h"
|
|
|
|
|
|
#include "mAlgPseudo_global.h"
|
|
|
|
|
|
|
|
|
|
|
|
// 基于状态方程,创建PR方程
|
|
|
|
|
|
// 相平衡状态方程类(用于基于组分的三区拟压力计算)
|
|
|
|
|
|
// 算法提供:xuzexuan
|
|
|
|
|
|
// 源码参照:相平衡模块(new)(2).py
|
|
|
|
|
|
// 时间:2022-08-23
|
|
|
|
|
|
class M_ALGPSEUDO_EXPORT iPengRobinsonEos
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
|
|
|
|
iPengRobinsonEos(VecDouble& vecArgCriticalP, \
|
|
|
|
|
|
VecDouble& vecArgCriticalT, \
|
|
|
|
|
|
VecDouble& vecArgAcentricFactors,\
|
|
|
|
|
|
VecDouble& vecArgOmegaAs, \
|
|
|
|
|
|
VecDouble& vecArgOmegaBs, \
|
|
|
|
|
|
WtaiMatrix& matrixBI);
|
|
|
|
|
|
|
|
|
|
|
|
/// @brief 返回错误信息
|
|
|
|
|
|
QString getLastError() { return m_sError; }
|
|
|
|
|
|
|
|
|
|
|
|
// 把数组转为矩阵,bLineMt为true,转为一行,否则转为一列
|
|
|
|
|
|
static void vecToMatrix(VecDouble& vec, WtaiMatrix& mt, bool bLineMt = true);
|
|
|
|
|
|
// 把单行或单列矩阵变成Vec
|
|
|
|
|
|
static void matrixToVec(WtaiMatrix& mt, VecDouble& vec);
|
|
|
|
|
|
// 实现类似np.linalg.norm的功能
|
|
|
|
|
|
static double calLinAlgNorm(VecDouble& vec, bool bAutoMinus1 = false);
|
|
|
|
|
|
|
|
|
|
|
|
static double max(double d1, double d2);
|
|
|
|
|
|
static double min(double d1, double d2);
|
|
|
|
|
|
static double cbrt(double x); //立方根
|
|
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
|
|
|
|
// 内部实现函数
|
|
|
|
|
|
void set_molar_fractions(VecDouble& vec);
|
|
|
|
|
|
VecDouble alpha_function(double dTemperature);
|
|
|
|
|
|
void calculate_eos_coefficients(double dPressure, \
|
|
|
|
|
|
double dTemperature, \
|
|
|
|
|
|
VecDouble& vecAs, \
|
|
|
|
|
|
VecDouble& vecBs);
|
|
|
|
|
|
void update_eos_coefficients(double dPressure, \
|
|
|
|
|
|
double dTemperature);
|
|
|
|
|
|
double calculate_eos_roots(QString sFluidType);
|
|
|
|
|
|
double find_correct_root_of_cubic_eos(double p0, double p1, \
|
|
|
|
|
|
double p2, double p3, \
|
|
|
|
|
|
QString sFluidType);
|
|
|
|
|
|
VecDouble calculate_fugacities(double dPressure, double dTemperature, \
|
|
|
|
|
|
double z_factor);
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef QT_DEBUG
|
|
|
|
|
|
static void testMatrix();
|
|
|
|
|
|
static void outputMatrix(WtaiMatrix& m);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
|
|
|
|
|
|
// Args拆解,根据组分是否为0
|
|
|
|
|
|
// 组分含量,Pc,Tc,W,M,系数a,系数b
|
|
|
|
|
|
VecDouble m_vecArgMolarFractions;// [单位小数]
|
|
|
|
|
|
VecDouble m_vecArgCriticalP;// [单位Pa]
|
|
|
|
|
|
VecDouble m_vecArgCriticalT;// [单位K]
|
|
|
|
|
|
VecDouble m_vecArgAcentricFactors;// [-]
|
|
|
|
|
|
VecDouble m_vecArgOmegaAs;// [-]
|
|
|
|
|
|
VecDouble m_vecArgOmegaBs;
|
|
|
|
|
|
|
|
|
|
|
|
WtaiMatrix m_matrixBI;
|
|
|
|
|
|
|
|
|
|
|
|
// 中间过程数据
|
|
|
|
|
|
double m_dMixtureA;
|
|
|
|
|
|
double m_dMixtureB;
|
|
|
|
|
|
VecDouble m_vecAs;
|
|
|
|
|
|
VecDouble m_vecBs;
|
|
|
|
|
|
VecDouble m_vecNc;//NumeratorCoefs
|
|
|
|
|
|
|
|
|
|
|
|
// 出错信息
|
|
|
|
|
|
QString m_sError;
|
|
|
|
|
|
};
|