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/iPhaseEquiliCal.h

147 lines
5.1 KiB
C

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