#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& 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& 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 m_mapInputArgs; // 组分,单位:小数 QMap 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; };