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