refactor(nmNum): 移除含水饱和度自动拟合选项

- 移除自动拟合窗口中的含水饱和度选项、范围配置和参数写回
- LM 与 PSO 固定使用模型当前含水饱和度,旧拟合配置不再启用该参数
- 保留储层参数面板及正常求解逻辑,通过四个相关源文件的编译语法检查
feature/AutoFit-Optimize-20260914
lvjunjie 3 days ago
parent e3d49941bc
commit ed9cc46ac5

@ -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; // 是否选择裂缝半长进行拟合
};

@ -89,7 +89,6 @@ private:
QCheckBox* m_sCheckBox; // 表皮系数
QCheckBox* m_cCheckBox; // 井筒储集系数
QCheckBox* m_phiCheckBox; // 孔隙度
QCheckBox* m_swiCheckBox; // 初始含水饱和度
QCheckBox* m_dfcCheckBox; // 裂缝导流能力
QCheckBox* m_fractureHalfLengthCheckBox; // 裂缝半长

@ -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<double>& pa
reservoirData.getPorosity().setValue(value);
break;
case 4: // 初始含水饱和度
reservoirData.getSwi().setValue(value);
break;
}
paramIndex++;

@ -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<double>& p
reservoirData.getPorosity().setValue(value);
break;
case 4: // 初始含水饱和度
reservoirData.getSwi().setValue(value);
break;
}
paramIndex++;

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

@ -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));
// 成功或失败都从当前目标井读取已落地的参数,不采用优化器尚未写回的最佳候选。
// 先刷新全部初值,再统一重建范围,避免即时校验读到新旧值混合的表格。

Loading…
Cancel
Save