You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Include/mAlg/mAlgPseudo/iPengRobinsonEos.h

84 lines
2.8 KiB
C

#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;
};