From c6d08b13cfbc89dd245e832dfb71e7e91c0c95c1 Mon Sep 17 00:00:00 2001 From: lvjunjie Date: Wed, 10 Jun 2026 16:23:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=B9=E6=8D=AEPVT=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=83=85=E5=86=B5=E8=B0=83=E6=95=B4Base?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E7=9A=84=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Src/nmNum/nmData/nmDataAnalyzeManager.cpp | 43 +++++++++++++++++++---- Src/nmNum/nmSubWnd/nmSubWndUtils.cpp | 7 ++-- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/Src/nmNum/nmData/nmDataAnalyzeManager.cpp b/Src/nmNum/nmData/nmDataAnalyzeManager.cpp index 97ed17a..ea01bfc 100644 --- a/Src/nmNum/nmData/nmDataAnalyzeManager.cpp +++ b/Src/nmNum/nmData/nmDataAnalyzeManager.cpp @@ -1105,6 +1105,26 @@ void nmDataAnalyzeManager::createReservoir() // 相态类型 PvtFluidType eType = WFT_Null; + // initPvtParaFromSubFit先根据PVT数据确定求解器类型,这里按PEBI算例选择需要覆盖的Base字段 + NM_SOLVER_MODEL_TYPE eSolverModelType = getSolverModelType(); + bool bNeedCti = false; + bool bNeedCf = false; + + switch(eSolverModelType) { + case SMT_Oil_ConstPvt: + case SMT_Water_ConstPvt: + bNeedCti = true; + break; + case SMT_Oil_VariablePvt: + case SMT_Water_VariablePvt: + case SMT_Gas_VariablePvt: + case SMT_Oil_Water_TwoPhase: + bNeedCf = true; + break; + default: + break; + } + if(nullptr != pSubWndFitting && nullptr != pContextProvider) { // 读取界面选择的PVT相态类型 @@ -1131,8 +1151,14 @@ void nmDataAnalyzeManager::createReservoir() default: break; } - listParas << "Ct"; - pContextProvider->getPvtParaValues(pSubWndFitting, listParas, mapParaValues); + + //油、水单相常数pvt需要Ct + if(bNeedCti) { + listParas << "Ct"; + } + if(!listParas.isEmpty()) { + pContextProvider->getPvtParaValues(pSubWndFitting, listParas, mapParaValues); + } // 读取分层数据 pContextProvider->getBasicDataLayers(pSubWndFitting, vvecLayerData); @@ -1142,10 +1168,9 @@ void nmDataAnalyzeManager::createReservoir() double dBo = mapParaValues.value("Bo", 1.5); // 如果键不存在,返回默认值 1.5 double dMiuo = mapParaValues.value("Miuo", 1); // 如果键不存在,返回默认值 1 - // 获取气体积系数和气相粘度、参考温度 + // 获取气体积系数和气相粘度 double dBg = mapParaValues.value("Bg", 1); // 如果键不存在,返回默认值 1.5 double dMiug = mapParaValues.value("Miug", 1); // 如果键不存在,返回默认值 1 - double dTempGas = 100;// 气藏温度,TODO,应该从分析界面获取 // 获取水体积系数和水相粘度 double dBw = mapParaValues.value("Bw", 1); @@ -1203,7 +1228,6 @@ void nmDataAnalyzeManager::createReservoir() tempAttr.setValue(dMiug); m_reservoirData->setMiuo(tempAttr); - m_reservoirData->setTempGasRe(dTempGas); // 气藏温度 } else if(eType == WFT_Water) { m_reservoirData->setPhaseType(PHASE_Water); tempAttr = m_reservoirData->getBo();// 水体积系数 @@ -1239,7 +1263,9 @@ void nmDataAnalyzeManager::createReservoir() m_reservoirData->setThickness(tempAttr); tempAttr = m_reservoirData->getCt(); // 综合压缩系数 - tempAttr.setValue(dCt); + if(bNeedCti) { + tempAttr.setValue(dCt); + } m_reservoirData->setCt(tempAttr); tempAttr = m_reservoirData->getPorosity();// 孔隙度 @@ -1247,7 +1273,10 @@ void nmDataAnalyzeManager::createReservoir() m_reservoirData->setPorosity(tempAttr); tempAttr = m_reservoirData->getCf();// 岩石压缩系数 - tempAttr.setValue(dCf); + // 变化PVT、气单相和油水两相需要Cf,值来自基础分层数据 + if(bNeedCf) { + tempAttr.setValue(dCf); + } m_reservoirData->setCf(tempAttr); // 清空现有分层数据 diff --git a/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp b/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp index a801532..d8a487b 100644 --- a/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp +++ b/Src/nmNum/nmSubWnd/nmSubWndUtils.cpp @@ -436,10 +436,11 @@ bool nmSubWndUtils::fillNmDockWxs(iSubWnd* pSubWnd) } // 读取解析解的参数 - // 1.1 初始化油藏参数 - pDataManager->createReservoir(); - // 1.2 初始化PVT参数 + // createReservoir需要使用PVT初始化后确定的求解器类型 + // 1.1 初始化PVT参数 pDataManager->initPvtParaFromSubFit(); + // 1.2 初始化油藏参数 + pDataManager->createReservoir(); // 1.3 初始化当前井数据 pDataManager->initCurWellData(); // 1.4 初始化边界数据