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++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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