|
|
|
|
@ -113,39 +113,7 @@ void setPebiPressureIfEmpty(nmDataPvtParaForPebi* pPvtPara, const QVector<double
|
|
|
|
|
pPvtPara->setPressure(vecX);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 根据当前PVT相态决定需要访问哪些相态页。
|
|
|
|
|
// 这里只控制PVT页面读取范围,后续参数默认值和PEBI赋值逻辑保持不变。
|
|
|
|
|
void resolvePvtPhaseReadFlags(PvtFluidType eType, bool& bReadOil, bool& bReadGas, bool& bReadWater)
|
|
|
|
|
{
|
|
|
|
|
bReadOil = false;
|
|
|
|
|
bReadGas = false;
|
|
|
|
|
bReadWater = false;
|
|
|
|
|
|
|
|
|
|
switch(eType) {
|
|
|
|
|
case WFT_Oil:
|
|
|
|
|
// 单相油:只访问油相页,避免访问不存在的气/水相页
|
|
|
|
|
bReadOil = true;
|
|
|
|
|
break;
|
|
|
|
|
case WFT_Gas:
|
|
|
|
|
// 单相气:只访问气相页
|
|
|
|
|
bReadGas = true;
|
|
|
|
|
break;
|
|
|
|
|
case WFT_Water:
|
|
|
|
|
// 单相水:只访问水相页
|
|
|
|
|
bReadWater = true;
|
|
|
|
|
break;
|
|
|
|
|
case WFT_Oil_Water:
|
|
|
|
|
// 油水:访问油相和水相页,不访问气相页
|
|
|
|
|
bReadOil = true;
|
|
|
|
|
bReadWater = true;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
// 未识别相态不主动读取相态页,避免PVT工具输出缺失子窗口日志
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 从Diffusion右侧结果表中提取指定列数据
|
|
|
|
|
bool extractDiffusionColumn(const VVecDouble& vvec, int nColumn, QVector<double>& vecValues)
|
|
|
|
|
{
|
|
|
|
|
@ -268,6 +236,7 @@ ZX_DEFINE_DYNAMIC(DataAnalyzeManager, nmDataAnalyzeManager)
|
|
|
|
|
// 初始化储层数据
|
|
|
|
|
m_pLayerData = new nmDataLayer;
|
|
|
|
|
m_eGridType = NM_Grid_Type::NM_Grid_PEBI; //默认网格类型为PEBI
|
|
|
|
|
m_eSolverModelType = NM_SOLVER_MODEL_TYPE::SMT_Oil_ConstPvt;
|
|
|
|
|
this->initDefaultDisplaySettings();
|
|
|
|
|
// 初始化中英文翻译映射
|
|
|
|
|
nmTranslationManager::initTranslations();
|
|
|
|
|
@ -1144,20 +1113,22 @@ void nmDataAnalyzeManager::createReservoir()
|
|
|
|
|
//QString sPftDesc = pSubWndFitting->getBasicPftDesc();
|
|
|
|
|
// 只读取当前相态存在的PVT页,避免PVT工具输出PhaseGas/PhaseWater缺失日志
|
|
|
|
|
QStringList listParas;
|
|
|
|
|
bool bReadOilPvt = false;
|
|
|
|
|
bool bReadGasPvt = false;
|
|
|
|
|
bool bReadWaterPvt = false;
|
|
|
|
|
resolvePvtPhaseReadFlags(eType, bReadOilPvt, bReadGasPvt, bReadWaterPvt);
|
|
|
|
|
|
|
|
|
|
// 储层基础数据这里只需要体积系数和粘度;不属于当前相态的参数继续走默认值
|
|
|
|
|
if(bReadOilPvt) {
|
|
|
|
|
switch(eType) {
|
|
|
|
|
case WFT_Oil:
|
|
|
|
|
listParas << "Bo" << "Miuo";
|
|
|
|
|
}
|
|
|
|
|
if(bReadGasPvt) {
|
|
|
|
|
break;
|
|
|
|
|
case WFT_Gas:
|
|
|
|
|
listParas << "Bg" << "Miug";
|
|
|
|
|
}
|
|
|
|
|
if(bReadWaterPvt) {
|
|
|
|
|
break;
|
|
|
|
|
case WFT_Water:
|
|
|
|
|
listParas << "Bw" << "Miuw";
|
|
|
|
|
break;
|
|
|
|
|
case WFT_Oil_Water:
|
|
|
|
|
listParas << "Bo" << "Miuo" << "Bw" << "Miuw";
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
listParas << "Ct";
|
|
|
|
|
pContextProvider->getPvtParaValues(pSubWndFitting, listParas, mapParaValues);
|
|
|
|
|
@ -1639,29 +1610,16 @@ void nmDataAnalyzeManager::initPvtParaFromSubFit()
|
|
|
|
|
PvtFluidType eType = WFT_Null;
|
|
|
|
|
pContextProvider->getBasicPft(pSubWndFitting, eType);
|
|
|
|
|
|
|
|
|
|
bool bReadOilPvt = false;
|
|
|
|
|
bool bReadGasPvt = false;
|
|
|
|
|
bool bReadWaterPvt = false;
|
|
|
|
|
resolvePvtPhaseReadFlags(eType, bReadOilPvt, bReadGasPvt, bReadWaterPvt);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//QVector<double> vecPressure; // 压力, MPa
|
|
|
|
|
QVector<double> vecRso; // 溶解气油比, m^3/m^3
|
|
|
|
|
QVector<double> vecBo; // 油体积系数, m^3/m^3
|
|
|
|
|
QVector<double> vecCo; // 油压缩系数, 1/MPa
|
|
|
|
|
QVector<double> vecMiuo; // 油粘度, mPa·s
|
|
|
|
|
QVector<double> vecRouo; // 油密度, kg/m^3
|
|
|
|
|
QVector<double> vecRv; // 凝析油气比, m^3/m^3
|
|
|
|
|
QVector<double> vecBg; // 气体积系数, m^3/m^3
|
|
|
|
|
QVector<double> vecCg; // 气压缩系数, 1/MPa
|
|
|
|
|
QVector<double> vecMiug; // 气粘度, mPa·s
|
|
|
|
|
QVector<double> vecRoug; // 气密度, kg/m^3
|
|
|
|
|
QVector<double> vecZ; // 气偏差因子, 1
|
|
|
|
|
QVector<double> vecRsw; // 溶解气水比, m^3/m^3
|
|
|
|
|
QVector<double> vecBw; // 水体积系数, m^3/m^3
|
|
|
|
|
QVector<double> vecCw; // 水压缩系数, 1/MPa
|
|
|
|
|
QVector<double> vecMiuw; // 水粘度, mPa·s
|
|
|
|
|
QVector<double> vecRouw; // 水密度, kg/m^3
|
|
|
|
|
|
|
|
|
|
VecDouble vecX;
|
|
|
|
|
|
|
|
|
|
@ -1672,36 +1630,41 @@ void nmDataAnalyzeManager::initPvtParaFromSubFit()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_pebiPvtPara = new nmDataPvtParaForPebi;
|
|
|
|
|
|
|
|
|
|
// 气油比不按相态区分,所有情况都尝试读取
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Oil, "Rs", vecX, vecRso);
|
|
|
|
|
m_pebiPvtPara->setRso(vecRso);
|
|
|
|
|
setPebiPressureIfEmpty(m_pebiPvtPara, vecX);
|
|
|
|
|
|
|
|
|
|
// 其他PVT结果曲线只读取当前相态已有的页,缺失相态保留PEBI默认数据
|
|
|
|
|
if(bReadOilPvt) {
|
|
|
|
|
setSolverModelType(SMT_Oil_ConstPvt);
|
|
|
|
|
|
|
|
|
|
bool bFetchedBo = false;
|
|
|
|
|
bool bFetchedCo = false;
|
|
|
|
|
bool bFetchedMiuo = false;
|
|
|
|
|
bool bFetchedBw = false;
|
|
|
|
|
bool bFetchedCw = false;
|
|
|
|
|
bool bFetchedMiuw = false;
|
|
|
|
|
|
|
|
|
|
// PVT结果曲线直接按当前相态分支读取,缺失相态保留PEBI默认数据
|
|
|
|
|
switch(eType) {
|
|
|
|
|
case WFT_Oil:
|
|
|
|
|
// 油体积系数
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Oil, "Bo", vecX, vecBo);
|
|
|
|
|
bFetchedBo = pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Oil, "Bo", vecX, vecBo);
|
|
|
|
|
m_pebiPvtPara->setBo(vecBo);
|
|
|
|
|
setPebiPressureIfEmpty(m_pebiPvtPara, vecX);
|
|
|
|
|
|
|
|
|
|
// 油压缩系数
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Oil, "Co", vecX, vecCo);
|
|
|
|
|
bFetchedCo = pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Oil, "Co", vecX, vecCo);
|
|
|
|
|
m_pebiPvtPara->setCo(vecCo);
|
|
|
|
|
setPebiPressureIfEmpty(m_pebiPvtPara, vecX);
|
|
|
|
|
|
|
|
|
|
// 油密度
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Oil, "Rhoo", vecX, vecRouo);
|
|
|
|
|
m_pebiPvtPara->setRouo(vecRouo);
|
|
|
|
|
setPebiPressureIfEmpty(m_pebiPvtPara, vecX);
|
|
|
|
|
|
|
|
|
|
// 油粘度
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Oil, "Miuo", vecX, vecMiuo);
|
|
|
|
|
bFetchedMiuo = pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Oil, "Miuo", vecX, vecMiuo);
|
|
|
|
|
m_pebiPvtPara->setMiuo(vecMiuo);
|
|
|
|
|
setPebiPressureIfEmpty(m_pebiPvtPara, vecX);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(bReadGasPvt) {
|
|
|
|
|
setSolverModelType(
|
|
|
|
|
bFetchedBo
|
|
|
|
|
&& bFetchedCo
|
|
|
|
|
&& bFetchedMiuo
|
|
|
|
|
? SMT_Oil_VariablePvt
|
|
|
|
|
: SMT_Oil_ConstPvt);
|
|
|
|
|
break;
|
|
|
|
|
case WFT_Gas:
|
|
|
|
|
setSolverModelType(SMT_Gas_VariablePvt);
|
|
|
|
|
|
|
|
|
|
// 气体积系数
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Gas, "Bg", vecX, vecBg);
|
|
|
|
|
@ -1717,52 +1680,62 @@ void nmDataAnalyzeManager::initPvtParaFromSubFit()
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Gas, "Miug", vecX, vecMiug);
|
|
|
|
|
m_pebiPvtPara->setMiug(vecMiug);
|
|
|
|
|
setPebiPressureIfEmpty(m_pebiPvtPara, vecX);
|
|
|
|
|
break;
|
|
|
|
|
case WFT_Water:
|
|
|
|
|
// 水体积系数
|
|
|
|
|
bFetchedBw = pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Water, "Bw", vecX, vecBw);
|
|
|
|
|
m_pebiPvtPara->setBw(vecBw);
|
|
|
|
|
setPebiPressureIfEmpty(m_pebiPvtPara, vecX);
|
|
|
|
|
|
|
|
|
|
// 气密度
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Gas, "Rhog", vecX, vecRoug);
|
|
|
|
|
m_pebiPvtPara->setRoug(vecRoug);
|
|
|
|
|
// 水压缩系数
|
|
|
|
|
bFetchedCw = pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Water, "Cw", vecX, vecCw);
|
|
|
|
|
m_pebiPvtPara->setCw(vecCw);
|
|
|
|
|
setPebiPressureIfEmpty(m_pebiPvtPara, vecX);
|
|
|
|
|
|
|
|
|
|
// 气偏差因子
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Gas, "Zg", vecX, vecZ);
|
|
|
|
|
m_pebiPvtPara->setZ(vecZ);
|
|
|
|
|
// 水粘度
|
|
|
|
|
bFetchedMiuw = pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Water, "Miuw", vecX, vecMiuw);
|
|
|
|
|
m_pebiPvtPara->setMiuw(vecMiuw);
|
|
|
|
|
setPebiPressureIfEmpty(m_pebiPvtPara, vecX);
|
|
|
|
|
}
|
|
|
|
|
setSolverModelType(
|
|
|
|
|
bFetchedBw
|
|
|
|
|
&& bFetchedCw
|
|
|
|
|
&& bFetchedMiuw
|
|
|
|
|
? SMT_Water_VariablePvt
|
|
|
|
|
: SMT_Water_ConstPvt);
|
|
|
|
|
break;
|
|
|
|
|
case WFT_Oil_Water: {
|
|
|
|
|
setSolverModelType(SMT_Oil_Water_TwoPhase);
|
|
|
|
|
|
|
|
|
|
if(bReadWaterPvt) {
|
|
|
|
|
// 溶解气水比
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Water, "Rsw", vecX, vecRsw);
|
|
|
|
|
m_pebiPvtPara->setRsw(vecRsw);
|
|
|
|
|
// 油体积系数
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Oil_Water, "Bo", vecX, vecBo);
|
|
|
|
|
m_pebiPvtPara->setBo(vecBo);
|
|
|
|
|
setPebiPressureIfEmpty(m_pebiPvtPara, vecX);
|
|
|
|
|
|
|
|
|
|
// 水体积系数
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Water, "Bw", vecX, vecBw);
|
|
|
|
|
m_pebiPvtPara->setBw(vecBw);
|
|
|
|
|
// 油粘度
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Oil_Water, "Miuo", vecX, vecMiuo);
|
|
|
|
|
m_pebiPvtPara->setMiuo(vecMiuo);
|
|
|
|
|
setPebiPressureIfEmpty(m_pebiPvtPara, vecX);
|
|
|
|
|
|
|
|
|
|
// 水压缩系数
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Water, "Cw", vecX, vecCw);
|
|
|
|
|
m_pebiPvtPara->setCw(vecCw);
|
|
|
|
|
// 水体积系数
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Oil_Water, "Bw", vecX, vecBw);
|
|
|
|
|
m_pebiPvtPara->setBw(vecBw);
|
|
|
|
|
setPebiPressureIfEmpty(m_pebiPvtPara, vecX);
|
|
|
|
|
|
|
|
|
|
// 水粘度
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Water, "Miuw", vecX, vecMiuw);
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Oil_Water, "Miuw", vecX, vecMiuw);
|
|
|
|
|
m_pebiPvtPara->setMiuw(vecMiuw);
|
|
|
|
|
setPebiPressureIfEmpty(m_pebiPvtPara, vecX);
|
|
|
|
|
|
|
|
|
|
// 水密度
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Water, "Rhow", vecX, vecRouw);
|
|
|
|
|
m_pebiPvtPara->setRouw(vecRouw);
|
|
|
|
|
setPebiPressureIfEmpty(m_pebiPvtPara, vecX);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(eType == WFT_Oil_Water) {
|
|
|
|
|
// Diffusion相关数据来自Diffusion页面,只在油水两相时读取
|
|
|
|
|
// DSO_KK:相渗结果,主要用于So/Kro/Sw/Krw
|
|
|
|
|
VVecDouble vvecDiffusionKK;
|
|
|
|
|
if(pContextProvider->getDiffusionRstOf(pSubWndFitting, DSO_KK, vvecDiffusionKK)) {
|
|
|
|
|
applyDiffusionKkToPebiPvt(m_pebiPvtPara, vvecDiffusionKK);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//// 吸附气量,王老师界面没有,油相暂时不需要
|
|
|
|
|
@ -2386,6 +2359,16 @@ void nmDataAnalyzeManager::setGridType(NM_Grid_Type newGridType)
|
|
|
|
|
m_eGridType = newGridType;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NM_SOLVER_MODEL_TYPE nmDataAnalyzeManager::getSolverModelType() const
|
|
|
|
|
{
|
|
|
|
|
return m_eSolverModelType;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::setSolverModelType(NM_SOLVER_MODEL_TYPE newSolverModelType)
|
|
|
|
|
{
|
|
|
|
|
m_eSolverModelType = newSolverModelType;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取Pebi网格求解数据接口
|
|
|
|
|
// 获取压力历史数据
|
|
|
|
|
QVector<QVector<double>> nmDataAnalyzeManager::getPebiSolverHistoryDataByName(const QString & wellName)
|
|
|
|
|
|