|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
|
|
#include "Defines.h"
|
|
|
|
|
|
#include "mAlgDefines.h"
|
|
|
|
|
|
#include "mAlgMatrix.h"
|
|
|
|
|
|
#include "mAlgPseudo_global.h"
|
|
|
|
|
|
|
|
|
|
|
|
class iPengRobinsonEos;
|
|
|
|
|
|
|
|
|
|
|
|
// 相平衡计算结果,一共几种
|
|
|
|
|
|
#define PE_RESULT_COUNT 9
|
|
|
|
|
|
|
|
|
|
|
|
// 相平衡计算类(用于基于组分的三区拟压力计算)
|
|
|
|
|
|
// 算法提供:xuzexuan
|
|
|
|
|
|
// 源码参照:相平衡模块(new)(2).py
|
|
|
|
|
|
// 时间:2022-08-23
|
|
|
|
|
|
class M_ALGPSEUDO_EXPORT iPhaseEquiliCal
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
|
|
|
|
iPhaseEquiliCal();
|
|
|
|
|
|
~iPhaseEquiliCal();
|
|
|
|
|
|
|
|
|
|
|
|
/// @brief 计算主入口函数
|
|
|
|
|
|
/// @param (in) mapComps 组分,单位:小数,算法内部亦是小数,比如0.0019表示 0.19%
|
|
|
|
|
|
/// @param (in) dTemp 井口温度,单位:°C,算法内部使用:K,即°C + 273
|
|
|
|
|
|
/// @param (in) dRs 溶解汽油比,单位:m^3/m^3
|
|
|
|
|
|
/// @param (in) dPrsMin-dPrsMax 压力范围,单位:MPa,算法内部使用:Pa
|
|
|
|
|
|
/// @param (in) dPrsInterval 压力划分间隔,默认为0.1,单位:MPa,算法内部使用:Pa
|
|
|
|
|
|
bool cal(QMap<QString, double>& mapComps, \
|
|
|
|
|
|
double dTemp, double dRs, \
|
|
|
|
|
|
double dPrsMin, double dPrsMax, \
|
|
|
|
|
|
double dPrsInterval = 0.1);
|
|
|
|
|
|
|
|
|
|
|
|
/// @brief 计算主入口函数
|
|
|
|
|
|
/// @param (in) mapComps 组分,单位:小数,算法内部亦是小数,比如0.0019表示 0.19%
|
|
|
|
|
|
/// @param (in) dTemp 井口温度,单位:°C,算法内部使用:K,即°C + 273
|
|
|
|
|
|
/// @param (in) dRs 溶解汽油比,单位:m^3/m^3
|
|
|
|
|
|
/// @param (in) vecPrs 压力值数组,单位:MPa,算法内部使用:Pa
|
|
|
|
|
|
bool cal(QMap<QString, double>& mapComps, \
|
|
|
|
|
|
double dTemp, double dRs, \
|
|
|
|
|
|
VecDouble vecPrs);
|
|
|
|
|
|
|
|
|
|
|
|
// 返回所有结果的指针,具体对应数据,参照m_vvecRs说明
|
|
|
|
|
|
bool getAllPeResults(VVecDouble& vvec);
|
|
|
|
|
|
|
|
|
|
|
|
// 返回错误信息
|
|
|
|
|
|
QString getLastError() { return m_sError; }
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
|
|
|
|
// ini加载
|
|
|
|
|
|
void initCompsArgs();
|
|
|
|
|
|
bool adjustCompsArgs();
|
|
|
|
|
|
|
|
|
|
|
|
// 初始化压力数据,拆解压力,组成数组
|
|
|
|
|
|
bool makesurePrsData(VecDouble& vecPrs, \
|
|
|
|
|
|
double dPrsMin, double dPrsMax, double dPrsInterval);
|
|
|
|
|
|
|
|
|
|
|
|
// 初始化组分相关的数据以及内部参数
|
|
|
|
|
|
bool makesureCompsData();
|
|
|
|
|
|
|
|
|
|
|
|
// 这是相平衡算法主入口函数
|
|
|
|
|
|
bool runPE();
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
|
|
|
|
// 载体
|
|
|
|
|
|
bool makesureEos();
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////
|
|
|
|
|
|
// 内部算法移植函数,具体不作参数说明
|
|
|
|
|
|
|
|
|
|
|
|
bool calculate_subsequent_variables();
|
|
|
|
|
|
|
|
|
|
|
|
VecDouble calculate_K_values_wilson(double dPressure);
|
|
|
|
|
|
|
|
|
|
|
|
void calculate_vapor_liquid_equilibrium(double dPressure, \
|
|
|
|
|
|
VecDouble arrK_values_estimates, \
|
|
|
|
|
|
VecDouble& arrK_values, \
|
|
|
|
|
|
double& dF_V);
|
|
|
|
|
|
|
|
|
|
|
|
void calculate_stability_test(double dPressure, \
|
|
|
|
|
|
VecDouble initial_K_values, \
|
|
|
|
|
|
bool& is_stable, \
|
|
|
|
|
|
VecDouble& arrK_values_estimates);
|
|
|
|
|
|
void ss_stability_test(double dPressure, QString test_type, \
|
|
|
|
|
|
VecDouble& initial_K_values, \
|
|
|
|
|
|
double& sum_vapor, VecDouble& K_values_vapor, \
|
|
|
|
|
|
int max_iter = 100, double tolerance = 1.0e-5);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ss_flash(double dPressure, VecDouble& initial_K_values, \
|
|
|
|
|
|
VecDouble& arrK_values, double& dF_V, \
|
|
|
|
|
|
int max_iter = 50, double tolerance = 1.0e-3);
|
|
|
|
|
|
double calculate_rachford_rice(VecDouble& arrK_values);
|
|
|
|
|
|
double func_rachford_rice(double x, VecDouble& arrK_values);
|
|
|
|
|
|
double deriv_rachford_rice(double x, VecDouble& arrK_values);
|
|
|
|
|
|
double brentq(double a, double b, VecDouble& arrK_values);
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
//////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
|
|
|
|
// 源自Ini配置
|
|
|
|
|
|
QStringList m_listCompsNames;//15种
|
|
|
|
|
|
QMap<QString, VecDouble> m_mapInputArgs;
|
|
|
|
|
|
|
|
|
|
|
|
// 组分,单位:小数
|
|
|
|
|
|
QMap<QString, double> m_mapComps;
|
|
|
|
|
|
// 井口温度,单位:K,其中K=°C + 273
|
|
|
|
|
|
double m_dTemp;
|
|
|
|
|
|
// 溶解汽油比,单位:m^3/m^3
|
|
|
|
|
|
double m_dRs;
|
|
|
|
|
|
// 压力数组相关,单位:Pa
|
|
|
|
|
|
VecDouble m_vecPrs;
|
|
|
|
|
|
|
|
|
|
|
|
// Args拆解,根据组分是否为0
|
|
|
|
|
|
// /组分含量,Pc,Tc,W,M,系数a,系数b
|
|
|
|
|
|
VecDouble m_vecArgMolarFractions;// [单位小数]
|
|
|
|
|
|
VecDouble m_vecArgCriticalP;// [单位Pa]
|
|
|
|
|
|
VecDouble m_vecArgCriticalT;// [单位K]
|
|
|
|
|
|
VecDouble m_vecArgAcentricFactors;// [-]
|
|
|
|
|
|
VecDouble m_vecArgMolarMass;// [g/mol]
|
|
|
|
|
|
VecDouble m_vecArgOmegaAs;// [-]
|
|
|
|
|
|
VecDouble m_vecArgOmegaBs;
|
|
|
|
|
|
|
|
|
|
|
|
// matrix
|
|
|
|
|
|
WtaiMatrix m_matrixBI;
|
|
|
|
|
|
|
|
|
|
|
|
// 实际个数,刨除组分为0,不超过COMPS_ITEM_COUNT
|
|
|
|
|
|
int m_nCompsItemCount;
|
|
|
|
|
|
|
|
|
|
|
|
// 状态方程类载体
|
|
|
|
|
|
iPengRobinsonEos* m_pEos;
|
|
|
|
|
|
|
|
|
|
|
|
// 所有的计算结果,目前共8种结果,顺序不能错
|
|
|
|
|
|
// 依次为:F_V,Z_factor_L,Z_factor_V,rou_o,rou_g,miuo,miug,rate_Kro_Krg,Pressure
|
|
|
|
|
|
// 简称为:FV, ZL, ZV, ro, rg, miuo, miug, KroKrg Pressure
|
|
|
|
|
|
// 索引: 0 1 2 3 4 5 6 7 8
|
|
|
|
|
|
VecDouble m_vvecRs[PE_RESULT_COUNT];
|
|
|
|
|
|
|
|
|
|
|
|
// 出错信息
|
|
|
|
|
|
QString m_sError;
|
|
|
|
|
|
};
|