From ed9cc46ac540509390e50fd646c48f0806d34944 Mon Sep 17 00:00:00 2001 From: lvjunjie Date: Wed, 30 Sep 2026 16:35:29 +0800 Subject: [PATCH] =?UTF-8?q?refactor(nmNum):=20=E7=A7=BB=E9=99=A4=E5=90=AB?= =?UTF-8?q?=E6=B0=B4=E9=A5=B1=E5=92=8C=E5=BA=A6=E8=87=AA=E5=8A=A8=E6=8B=9F?= =?UTF-8?q?=E5=90=88=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除自动拟合窗口中的含水饱和度选项、范围配置和参数写回 - LM 与 PSO 固定使用模型当前含水饱和度,旧拟合配置不再启用该参数 - 保留储层参数面板及正常求解逻辑,通过四个相关源文件的编译语法检查 --- Include/nmNum/nmData/nmDataAutomaticFitting.h | 12 ---- Include/nmNum/nmSubWxs/nmWxAutomaticFitting.h | 1 - .../nmCalculation/nmCalculationAutoFitLM.cpp | 9 +-- .../nmCalculation/nmCalculationAutoFitPSO.cpp | 9 +-- Src/nmNum/nmData/nmDataAutomaticFitting.cpp | 24 -------- Src/nmNum/nmSubWxs/nmWxAutomaticFitting.cpp | 56 +++---------------- 6 files changed, 14 insertions(+), 97 deletions(-) diff --git a/Include/nmNum/nmData/nmDataAutomaticFitting.h b/Include/nmNum/nmData/nmDataAutomaticFitting.h index d8a3e52c..6b7cb2e8 100644 --- a/Include/nmNum/nmData/nmDataAutomaticFitting.h +++ b/Include/nmNum/nmData/nmDataAutomaticFitting.h @@ -47,13 +47,6 @@ public: nmDataAttribute& getPorosityMin(); void setPorosityMin(const nmDataAttribute& porosityMin); - // Getter and Setter for swiMax - nmDataAttribute& getSwiMax(); - void setSwiMax(const nmDataAttribute& swiMax); - // Getter and Setter for swiMin - nmDataAttribute& getSwiMin(); - void setSwiMin(const nmDataAttribute& swiMin); - // Getter and Setter for fractureConductivityMax nmDataAttribute& getFractureConductivityMax(); void setFractureConductivityMax(const nmDataAttribute& fractureConductivityMax); @@ -95,8 +88,6 @@ public: bool getPorositySelected() const; void setPorositySelected(bool selected); - bool getSwiSelected() const; - void setSwiSelected(bool selected); bool getFractureConductivitySelected() const; void setFractureConductivitySelected(bool selected); @@ -110,7 +101,6 @@ private: nmDataAttribute m_skinMax; nmDataAttribute m_wellboreStorageMax; nmDataAttribute m_porosityMax; - nmDataAttribute m_swiMax; nmDataAttribute m_fractureConductivityMax; nmDataAttribute m_fractureHalfLengthMax; @@ -119,7 +109,6 @@ private: nmDataAttribute m_skinMin; nmDataAttribute m_wellboreStorageMin; nmDataAttribute m_porosityMin; - nmDataAttribute m_swiMin; nmDataAttribute m_fractureConductivityMin; nmDataAttribute m_fractureHalfLengthMin; @@ -134,7 +123,6 @@ private: bool m_skinSelected; // 是否选择表皮系数进行拟合 bool m_wellboreStorageSelected; // 是否选择井筒储集系数进行拟合 bool m_porositySelected; // 是否选择孔隙度进行拟合 - bool m_swiSelected; // 是否选择初始含水饱和度进行拟合 bool m_fractureConductivitySelected; // 是否选择裂缝导流能力进行拟合 bool m_fractureHalfLengthSelected; // 是否选择裂缝半长进行拟合 }; diff --git a/Include/nmNum/nmSubWxs/nmWxAutomaticFitting.h b/Include/nmNum/nmSubWxs/nmWxAutomaticFitting.h index 7d146803..9482bdd4 100644 --- a/Include/nmNum/nmSubWxs/nmWxAutomaticFitting.h +++ b/Include/nmNum/nmSubWxs/nmWxAutomaticFitting.h @@ -89,7 +89,6 @@ private: QCheckBox* m_sCheckBox; // 表皮系数 QCheckBox* m_cCheckBox; // 井筒储集系数 QCheckBox* m_phiCheckBox; // 孔隙度 - QCheckBox* m_swiCheckBox; // 初始含水饱和度 QCheckBox* m_dfcCheckBox; // 裂缝导流能力 QCheckBox* m_fractureHalfLengthCheckBox; // 裂缝半长 diff --git a/Src/nmNum/nmCalculation/nmCalculationAutoFitLM.cpp b/Src/nmNum/nmCalculation/nmCalculationAutoFitLM.cpp index c9f287d3..2ca16e59 100644 --- a/Src/nmNum/nmCalculation/nmCalculationAutoFitLM.cpp +++ b/Src/nmNum/nmCalculation/nmCalculationAutoFitLM.cpp @@ -1294,7 +1294,7 @@ void nmCalculationAutoFitLM::loadParameterBounds() m_parameterSelected[1] = fittingData.getSkinSelected(); m_parameterSelected[2] = fittingData.getWellboreStorageSelected(); m_parameterSelected[3] = fittingData.getPorositySelected(); - m_parameterSelected[4] = fittingData.getSwiSelected(); + m_parameterSelected[4] = false; // 含水饱和度固定,保留索引以兼容物理参数和追踪记录。 m_parameterSelected[5] = fittingData.getFractureConductivitySelected(); m_parameterSelected[6] = fittingData.getFractureHalfLengthSelected(); @@ -1314,8 +1314,8 @@ void nmCalculationAutoFitLM::loadParameterBounds() m_parameterLower[3] = fittingData.getPorosityMin().getValue().toDouble(); m_parameterUpper[3] = fittingData.getPorosityMax().getValue().toDouble(); - m_parameterLower[4] = fittingData.getSwiMin().getValue().toDouble(); - m_parameterUpper[4] = fittingData.getSwiMax().getValue().toDouble(); + m_parameterLower[4] = dataManager->getReservoirDataCopy().getSwi().getValue().toDouble(); + m_parameterUpper[4] = m_parameterLower[4]; m_parameterLower[5] = fittingData.getFractureConductivityMin().getValue().toDouble(); m_parameterUpper[5] = fittingData.getFractureConductivityMax().getValue().toDouble(); @@ -2854,9 +2854,6 @@ void nmCalculationAutoFitLM::updateReservoirParameters(const QVector& pa reservoirData.getPorosity().setValue(value); break; - case 4: // 初始含水饱和度 - reservoirData.getSwi().setValue(value); - break; } paramIndex++; diff --git a/Src/nmNum/nmCalculation/nmCalculationAutoFitPSO.cpp b/Src/nmNum/nmCalculation/nmCalculationAutoFitPSO.cpp index dfb1ab16..3d3a0553 100644 --- a/Src/nmNum/nmCalculation/nmCalculationAutoFitPSO.cpp +++ b/Src/nmNum/nmCalculation/nmCalculationAutoFitPSO.cpp @@ -2721,7 +2721,7 @@ void nmCalculationAutoFitPSO::loadParameterBounds() m_parameterSelected[1] = fittingData.getSkinSelected(); m_parameterSelected[2] = fittingData.getWellboreStorageSelected(); m_parameterSelected[3] = fittingData.getPorositySelected(); - m_parameterSelected[4] = fittingData.getSwiSelected(); + m_parameterSelected[4] = false; // 含水饱和度固定,保留索引以兼容物理参数和追踪记录。 // 获取参数边界 m_parameterLower.resize(5); @@ -2739,8 +2739,8 @@ void nmCalculationAutoFitPSO::loadParameterBounds() m_parameterLower[3] = fittingData.getPorosityMin().getValue().toDouble(); m_parameterUpper[3] = fittingData.getPorosityMax().getValue().toDouble(); - m_parameterLower[4] = fittingData.getSwiMin().getValue().toDouble(); - m_parameterUpper[4] = fittingData.getSwiMax().getValue().toDouble(); + m_parameterLower[4] = dataManager->getReservoirDataCopy().getSwi().getValue().toDouble(); + m_parameterUpper[4] = m_parameterLower[4]; // 更新启用参数索引 m_enabledParamIndices.clear(); @@ -4184,9 +4184,6 @@ void nmCalculationAutoFitPSO::updateReservoirParameters(const QVector& p reservoirData.getPorosity().setValue(value); break; - case 4: // 初始含水饱和度 - reservoirData.getSwi().setValue(value); - break; } paramIndex++; diff --git a/Src/nmNum/nmData/nmDataAutomaticFitting.cpp b/Src/nmNum/nmData/nmDataAutomaticFitting.cpp index e6639a06..2ad649a6 100644 --- a/Src/nmNum/nmData/nmDataAutomaticFitting.cpp +++ b/Src/nmNum/nmData/nmDataAutomaticFitting.cpp @@ -7,7 +7,6 @@ nmDataAutomaticFitting::nmDataAutomaticFitting() m_skinSelected = true; // 默认选中 m_wellboreStorageSelected = true; // 默认选中 m_porositySelected = true; // 默认选中 - m_swiSelected = false; // 默认不选中 m_fractureConductivitySelected = false; // 仅压裂井可用,默认不选中 m_fractureHalfLengthSelected = false; // 仅压裂井可用,默认不选中 @@ -16,7 +15,6 @@ nmDataAutomaticFitting::nmDataAutomaticFitting() m_skinMax = nmDataAttribute("Skin Max", QVariant(), ""); m_wellboreStorageMax = nmDataAttribute("Wellbore Storage Max", QVariant(), "m^3/MPa"); m_porosityMax = nmDataAttribute("Porosity Max", QVariant(), ""); - m_swiMax = nmDataAttribute("Swi Max", QVariant(), ""); m_fractureConductivityMax = nmDataAttribute("Fracture Conductivity Max", QVariant(), "md.m"); m_fractureHalfLengthMax = nmDataAttribute("Fracture Half Length Max", QVariant(), "m"); @@ -24,7 +22,6 @@ nmDataAutomaticFitting::nmDataAutomaticFitting() m_skinMin = nmDataAttribute("Skin Min", QVariant(), ""); m_wellboreStorageMin = nmDataAttribute("Wellbore Storage Min", QVariant(), "m^3/MPa"); m_porosityMin = nmDataAttribute("Porosity Min", QVariant(), ""); - m_swiMin = nmDataAttribute("Swi Min", QVariant(), ""); m_fractureConductivityMin = nmDataAttribute("Fracture Conductivity Min", QVariant(), "mD.m"); m_fractureHalfLengthMin = nmDataAttribute("Fracture Half Length Min", QVariant(), "m"); @@ -52,7 +49,6 @@ nmDataAutomaticFitting& nmDataAutomaticFitting::operator=(const nmDataAutomaticF m_skinSelected = other.m_skinSelected; m_wellboreStorageSelected = other.m_wellboreStorageSelected; m_porositySelected = other.m_porositySelected; - m_swiSelected = other.m_swiSelected; m_fractureConductivitySelected = other.m_fractureConductivitySelected; m_fractureHalfLengthSelected = other.m_fractureHalfLengthSelected; @@ -61,7 +57,6 @@ nmDataAutomaticFitting& nmDataAutomaticFitting::operator=(const nmDataAutomaticF m_skinMax = other.m_skinMax; m_wellboreStorageMax = other.m_wellboreStorageMax; m_porosityMax = other.m_porosityMax; - m_swiMax = other.m_swiMax; m_fractureConductivityMax = other.m_fractureConductivityMax; m_fractureHalfLengthMax = other.m_fractureHalfLengthMax; @@ -70,7 +65,6 @@ nmDataAutomaticFitting& nmDataAutomaticFitting::operator=(const nmDataAutomaticF m_skinMin = other.m_skinMin; m_wellboreStorageMin = other.m_wellboreStorageMin; m_porosityMin = other.m_porosityMin; - m_swiMin = other.m_swiMin; m_fractureConductivityMin = other.m_fractureConductivityMin; m_fractureHalfLengthMin = other.m_fractureHalfLengthMin; @@ -92,7 +86,6 @@ rapidjson::Value nmDataAutomaticFitting::ToJsonValue(rapidjson::Document::Alloca fittingObject.AddMember("SkinSelected", m_skinSelected, allocator); fittingObject.AddMember("WellboreStorageSelected", m_wellboreStorageSelected, allocator); fittingObject.AddMember("PorositySelected", m_porositySelected, allocator); - fittingObject.AddMember("SwiSelected", m_swiSelected, allocator); fittingObject.AddMember("FractureConductivitySelected", m_fractureConductivitySelected, allocator); fittingObject.AddMember("FractureHalfLengthSelected", m_fractureHalfLengthSelected, allocator); @@ -101,7 +94,6 @@ rapidjson::Value nmDataAutomaticFitting::ToJsonValue(rapidjson::Document::Alloca fittingObject.AddMember("SkinMax", m_skinMax.ToJsonValue(allocator), allocator); fittingObject.AddMember("WellboreStorageMax", m_wellboreStorageMax.ToJsonValue(allocator), allocator); fittingObject.AddMember("PorosityMax", m_porosityMax.ToJsonValue(allocator), allocator); - fittingObject.AddMember("SwiMax", m_swiMax.ToJsonValue(allocator), allocator); fittingObject.AddMember("FractureConductivityMax", m_fractureConductivityMax.ToJsonValue(allocator), allocator); fittingObject.AddMember("FractureHalfLengthMax", m_fractureHalfLengthMax.ToJsonValue(allocator), allocator); @@ -110,7 +102,6 @@ rapidjson::Value nmDataAutomaticFitting::ToJsonValue(rapidjson::Document::Alloca fittingObject.AddMember("SkinMin", m_skinMin.ToJsonValue(allocator), allocator); fittingObject.AddMember("WellboreStorageMin", m_wellboreStorageMin.ToJsonValue(allocator), allocator); fittingObject.AddMember("PorosityMin", m_porosityMin.ToJsonValue(allocator), allocator); - fittingObject.AddMember("SwiMin", m_swiMin.ToJsonValue(allocator), allocator); fittingObject.AddMember("FractureConductivityMin", m_fractureConductivityMin.ToJsonValue(allocator), allocator); fittingObject.AddMember("FractureHalfLengthMin", m_fractureHalfLengthMin.ToJsonValue(allocator), allocator); @@ -138,9 +129,6 @@ void nmDataAutomaticFitting::FromJsonValue(const rapidjson::Value& jsonValue) if (jsonValue.HasMember("PorositySelected") && jsonValue["PorositySelected"].IsBool()) { m_porositySelected = jsonValue["PorositySelected"].GetBool(); } - if (jsonValue.HasMember("SwiSelected") && jsonValue["SwiSelected"].IsBool()) { - m_swiSelected = jsonValue["SwiSelected"].GetBool(); - } if (jsonValue.HasMember("FractureConductivitySelected") && jsonValue["FractureConductivitySelected"].IsBool()) { m_fractureConductivitySelected = jsonValue["FractureConductivitySelected"].GetBool(); } @@ -163,9 +151,6 @@ void nmDataAutomaticFitting::FromJsonValue(const rapidjson::Value& jsonValue) if (jsonValue.HasMember("PorosityMax") && jsonValue["PorosityMax"].IsObject()) { m_porosityMax.FromJsonValue(jsonValue["PorosityMax"]); } - if (jsonValue.HasMember("SwiMax") && jsonValue["SwiMax"].IsObject()) { - m_swiMax.FromJsonValue(jsonValue["SwiMax"]); - } if (jsonValue.HasMember("FractureConductivityMax") && jsonValue["FractureConductivityMax"].IsObject()) { m_fractureConductivityMax.FromJsonValue(jsonValue["FractureConductivityMax"]); } @@ -187,9 +172,6 @@ void nmDataAutomaticFitting::FromJsonValue(const rapidjson::Value& jsonValue) if (jsonValue.HasMember("PorosityMin") && jsonValue["PorosityMin"].IsObject()) { m_porosityMin.FromJsonValue(jsonValue["PorosityMin"]); } - if (jsonValue.HasMember("SwiMin") && jsonValue["SwiMin"].IsObject()) { - m_swiMin.FromJsonValue(jsonValue["SwiMin"]); - } if (jsonValue.HasMember("FractureConductivityMin") && jsonValue["FractureConductivityMin"].IsObject()) { m_fractureConductivityMin.FromJsonValue(jsonValue["FractureConductivityMin"]); } @@ -226,8 +208,6 @@ void nmDataAutomaticFitting::setWellboreStorageSelected(bool selected) { m_wellb bool nmDataAutomaticFitting::getPorositySelected() const { return m_porositySelected; } void nmDataAutomaticFitting::setPorositySelected(bool selected) { m_porositySelected = selected; } -bool nmDataAutomaticFitting::getSwiSelected() const { return m_swiSelected; } -void nmDataAutomaticFitting::setSwiSelected(bool selected) { m_swiSelected = selected; } bool nmDataAutomaticFitting::getFractureConductivitySelected() const { return m_fractureConductivitySelected; } void nmDataAutomaticFitting::setFractureConductivitySelected(bool selected) { m_fractureConductivitySelected = selected; } @@ -249,8 +229,6 @@ void nmDataAutomaticFitting::setWellboreStorageMax(const nmDataAttribute& wellbo nmDataAttribute& nmDataAutomaticFitting::getPorosityMax() { return m_porosityMax; } void nmDataAutomaticFitting::setPorosityMax(const nmDataAttribute& porosityMax) { m_porosityMax = porosityMax; } -nmDataAttribute& nmDataAutomaticFitting::getSwiMax() { return m_swiMax; } -void nmDataAutomaticFitting::setSwiMax(const nmDataAttribute& swiMax) { m_swiMax = swiMax; } nmDataAttribute& nmDataAutomaticFitting::getFractureConductivityMax() { return m_fractureConductivityMax; } void nmDataAutomaticFitting::setFractureConductivityMax(const nmDataAttribute& fractureConductivityMax) { m_fractureConductivityMax = fractureConductivityMax; } @@ -271,8 +249,6 @@ void nmDataAutomaticFitting::setWellboreStorageMin(const nmDataAttribute& wellbo nmDataAttribute& nmDataAutomaticFitting::getPorosityMin() { return m_porosityMin; } void nmDataAutomaticFitting::setPorosityMin(const nmDataAttribute& porosityMin) { m_porosityMin = porosityMin; } -nmDataAttribute& nmDataAutomaticFitting::getSwiMin() { return m_swiMin; } -void nmDataAutomaticFitting::setSwiMin(const nmDataAttribute& swiMin) { m_swiMin = swiMin; } nmDataAttribute& nmDataAutomaticFitting::getFractureConductivityMin() { return m_fractureConductivityMin; } void nmDataAutomaticFitting::setFractureConductivityMin(const nmDataAttribute& fractureConductivityMin) { m_fractureConductivityMin = fractureConductivityMin; } diff --git a/Src/nmNum/nmSubWxs/nmWxAutomaticFitting.cpp b/Src/nmNum/nmSubWxs/nmWxAutomaticFitting.cpp index 2e7b9936..899254a4 100644 --- a/Src/nmNum/nmSubWxs/nmWxAutomaticFitting.cpp +++ b/Src/nmNum/nmSubWxs/nmWxAutomaticFitting.cpp @@ -119,7 +119,7 @@ void nmWxAutomaticFitting::updateParameterVisibility(QTableWidget* table, NM_SOL setParameterRowVisible(table, row, true); } - setParameterRowVisible(table, 4, eType == SMT_Oil_Water_TwoPhase); // Swi + setParameterRowVisible(table, 4, false); // 原含水饱和度索引保留,不再参与拟合。 // Dfc 只属于垂直压裂井和多段压裂水平井。普通井隐藏并取消勾选, // 防止切换目标井后不可见的裂缝参数仍进入拟合参数向量。 @@ -140,16 +140,16 @@ void nmWxAutomaticFitting::updateParameterVisibility(QTableWidget* table, NM_SOL renumberVisibleParameterRows(table); } -// 获取参数的系统物理边界,并为 Swi 叠加当前储层饱和度约束。 +// 获取可拟合参数的系统物理边界,索引 4 不再作为拟合参数。 bool nmWxAutomaticFitting::getPhysicalParameterRange(int parameterIndex, double& minValue, double& maxValue) { static const char* parameterNames[] = { "Result_K", "Result_W_Skin", "Result_W_C", "Result_phi", - "Result_Swi", "Result_W_Dfc", + "", "Result_W_Dfc", "W_FractureHalfLength" }; - if(parameterIndex < 0 || parameterIndex >= 7) { + if(parameterIndex < 0 || parameterIndex >= 7 || parameterIndex == 4) { return false; } @@ -162,19 +162,6 @@ bool nmWxAutomaticFitting::getPhysicalParameterRange(int parameterIndex, minValue = 0.0; } - if(parameterIndex == 4) { - double soi = reservoirData.getSoi().getValue().toDouble(); - double sgi = reservoirData.getSgi().getValue().toDouble(); - if(nmAutoFitUiIsFinite(soi) && nmAutoFitUiIsFinite(sgi)) { - if(soi < 0.0 || sgi < 0.0 || soi + sgi > 1.0) { - // Soi+Sgi 超过 1 时没有可行的 Swi,固定到物理下限,避免继续搜索非法区间。 - minValue = 0.0; - maxValue = 0.0; - } else { - maxValue = qMin(maxValue, 1.0 - soi - sgi); - } - } - } return true; } @@ -219,10 +206,6 @@ void nmWxAutomaticFitting::setParameterRange(int parameterIndex, automaticFittingData.getPorosityMin().setValue(minValue); automaticFittingData.getPorosityMax().setValue(maxValue); break; - case 4: - automaticFittingData.getSwiMin().setValue(minValue); - automaticFittingData.getSwiMax().setValue(maxValue); - break; case 5: automaticFittingData.getFractureConductivityMin().setValue(minValue); automaticFittingData.getFractureConductivityMax().setValue(maxValue); @@ -279,16 +262,11 @@ void nmWxAutomaticFitting::updateRangeForParameter(int parameterIndex, newMin = physicalMin; newMax = qMin(physicalMax, reference + skinHalfRange); } else if(reference > 0.0 - && !(parameterIndex == 4 && centerValue <= 0.0) && !(parameterIndex == 5 && centerValue <= 0.0)) { const double lowerFactor = 0.1; const double upperFactor = 10.0; newMin = qMax(physicalMin, reference * lowerFactor); newMax = qMin(physicalMax, reference * upperFactor); - } else if(parameterIndex == 4) { - // 没有可靠 Swi 初值时,不把搜索范围压缩到零附近。 - newMin = physicalMin; - newMax = physicalMax; } else if(parameterIndex == 5) { // Dfc=0 表示无限导流,不存在以零为中心的连续倍率范围。 newMin = physicalMin; @@ -347,7 +325,7 @@ bool nmWxAutomaticFitting::validateParameterTable(QString& errorMessage, int par static const char* parameterNames[] = { "Permeability", "Skin", "Wellbore storage", "Porosity", - "Swi", "Fracture conductivity", + "", "Fracture conductivity", "Fracture half length" }; @@ -581,15 +559,7 @@ void nmWxAutomaticFitting::setupParameterTable() m_parameterTable->setItem(3, 4, new QTableWidgetItem(QString::number(automaticFittingData.getPorosityMax().getValue().toDouble()))); m_parameterTable->setItem(3, 5, new QTableWidgetItem("")); - // 初始含水饱和度 (Swi) - m_parameterTable->setItem(4, 0, new QTableWidgetItem("5")); - m_swiCheckBox = new QCheckBox(tr("Swi")); - m_swiCheckBox->setChecked(automaticFittingData.getSwiSelected()); - m_parameterTable->setCellWidget(4, 1, m_swiCheckBox); - m_parameterTable->setItem(4, 2, new QTableWidgetItem(QString::number(automaticFittingData.getSwiMin().getValue().toDouble()))); - m_parameterTable->setItem(4, 3, new QTableWidgetItem(QString::number(reservoirData.getSwi().getValue().toDouble()))); - m_parameterTable->setItem(4, 4, new QTableWidgetItem(QString::number(automaticFittingData.getSwiMax().getValue().toDouble()))); - m_parameterTable->setItem(4, 5, new QTableWidgetItem("")); + // 索引 4 留空,保持裂缝参数与优化器的现有索引一致。 // 裂缝导流能力 (Dfc)。该行只对压裂井显示,初值在 onWellSelected() 中 // 从当前目标井读取,其他裂缝几何参数保持固定,不进入自动拟合。 @@ -822,7 +792,6 @@ void nmWxAutomaticFitting::onReverseSelection() if(!m_parameterTable->isRowHidden(1)) m_sCheckBox->setChecked(!m_sCheckBox->isChecked()); if(!m_parameterTable->isRowHidden(2)) m_cCheckBox->setChecked(!m_cCheckBox->isChecked()); if(!m_parameterTable->isRowHidden(3)) m_phiCheckBox->setChecked(!m_phiCheckBox->isChecked()); - if(!m_parameterTable->isRowHidden(4)) m_swiCheckBox->setChecked(!m_swiCheckBox->isChecked()); if(!m_parameterTable->isRowHidden(5)) m_dfcCheckBox->setChecked(!m_dfcCheckBox->isChecked()); if(!m_parameterTable->isRowHidden(6)) m_fractureHalfLengthCheckBox->setChecked(!m_fractureHalfLengthCheckBox->isChecked()); } @@ -932,7 +901,7 @@ void nmWxAutomaticFitting::onAccept() // 检查是否有参数被选中 bool hasSelectedParams = m_kCheckBox->isChecked() || m_sCheckBox->isChecked() || m_cCheckBox->isChecked() || m_phiCheckBox->isChecked() || - m_swiCheckBox->isChecked() || m_dfcCheckBox->isChecked() || + m_dfcCheckBox->isChecked() || m_fractureHalfLengthCheckBox->isChecked(); if(!hasSelectedParams) { @@ -947,7 +916,6 @@ void nmWxAutomaticFitting::onAccept() if(m_sCheckBox->isChecked()) selectedParameterNames << tr("Skin"); if(m_cCheckBox->isChecked()) selectedParameterNames << tr("Wellbore storage"); if(m_phiCheckBox->isChecked()) selectedParameterNames << tr("Porosity"); - if(m_swiCheckBox->isChecked()) selectedParameterNames << tr("Swi"); if(m_dfcCheckBox->isChecked()) selectedParameterNames << tr("Fracture conductivity"); if(m_fractureHalfLengthCheckBox->isChecked()) selectedParameterNames << tr("Fracture half length"); @@ -1019,7 +987,6 @@ void nmWxAutomaticFitting::setAutomaticFittingValue() automaticFittingData.setSkinSelected(m_sCheckBox->isChecked()); automaticFittingData.setWellboreStorageSelected(m_cCheckBox->isChecked()); automaticFittingData.setPorositySelected(m_phiCheckBox->isChecked()); - automaticFittingData.setSwiSelected(m_swiCheckBox->isChecked()); automaticFittingData.setFractureConductivitySelected(m_dfcCheckBox->isChecked()); automaticFittingData.setFractureHalfLengthSelected(m_fractureHalfLengthCheckBox->isChecked()); automaticFittingData.setSurrogateScreeningEnabled(m_surrogateCombo && m_surrogateCombo->currentIndex() == 1); @@ -1040,10 +1007,6 @@ void nmWxAutomaticFitting::setAutomaticFittingValue() automaticFittingData.getPorosityMin().setValue(m_parameterTable->item(3, 2)->text().toDouble()); automaticFittingData.getPorosityMax().setValue(m_parameterTable->item(3, 4)->text().toDouble()); - // 保存初始含水饱和度的最小值和最大值 - automaticFittingData.getSwiMin().setValue(m_parameterTable->item(4, 2)->text().toDouble()); - automaticFittingData.getSwiMax().setValue(m_parameterTable->item(4, 4)->text().toDouble()); - // 保存裂缝导流能力的最小值和最大值 automaticFittingData.getFractureConductivityMin().setValue(m_parameterTable->item(5, 2)->text().toDouble()); automaticFittingData.getFractureConductivityMax().setValue(m_parameterTable->item(5, 4)->text().toDouble()); @@ -1056,10 +1019,9 @@ void nmWxAutomaticFitting::setAutomaticFittingValue() automaticFittingData.getIterationCount().setValue(m_iterationEdit->text().toInt()); automaticFittingData.getErrorTolerance().setValue(m_errorLimitEdit->text().toDouble()); - // 只写回仍可编辑的储层初值,厚度和压缩系数保留原始精度和值。 + // 只写回可拟合的渗透率、孔隙度,含水饱和度沿用模型当前值。 reservoirData.getPermeability().setValue(m_parameterTable->item(0, 3)->text().toDouble()); // 渗透率 reservoirData.getPorosity().setValue(m_parameterTable->item(3, 3)->text().toDouble()); // 孔隙度 - reservoirData.getSwi().setValue(m_parameterTable->item(4, 3)->text().toDouble()); // 初始含水饱和度 // 更新储层数据(全局) nmDataAnalyzeManager::getCurrentInstance()->updateReservoirData(reservoirData); @@ -1374,8 +1336,6 @@ void nmWxAutomaticFitting::refreshParametersFromModel() reservoirData.getPermeability().getValue().toDouble(), 'g', 10)); m_parameterTable->item(3, 3)->setText(QString::number( reservoirData.getPorosity().getValue().toDouble(), 'g', 10)); - m_parameterTable->item(4, 3)->setText(QString::number( - reservoirData.getSwi().getValue().toDouble(), 'g', 10)); // 成功或失败都从当前目标井读取已落地的参数,不采用优化器尚未写回的最佳候选。 // 先刷新全部初值,再统一重建范围,避免即时校验读到新旧值混合的表格。