From 955b2e19fefe0f1fa73eb121fac7755a4270a549 Mon Sep 17 00:00:00 2001 From: lvjunjie Date: Wed, 1 Jul 2026 14:43:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E8=87=AA=E5=8A=A8=E6=8B=9F?= =?UTF-8?q?=E5=90=88=E4=B8=8D=E9=9C=80=E8=A6=81=E7=9A=84=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nmCalculation/nmCalculationAutoFitPSO.h | 10 +-- Include/nmNum/nmData/nmDataAutomaticFitting.h | 28 +----- Include/nmNum/nmSubWxs/nmWxAutomaticFitting.h | 4 +- .../configs/data_gen_family_random_v2_q.yaml | 10 +-- .../nmCalculation/nmCalculationAutoFitGA.cpp | 40 ++------- .../nmCalculation/nmCalculationAutoFitPSO.cpp | 62 ++++---------- Src/nmNum/nmData/nmDataAnalyzeManager.cpp | 6 ++ Src/nmNum/nmData/nmDataAutomaticFitting.cpp | 62 +------------- Src/nmNum/nmSubWxs/nmWxAutomaticFitting.cpp | 85 ++++--------------- 9 files changed, 66 insertions(+), 241 deletions(-) diff --git a/Include/nmNum/nmCalculation/nmCalculationAutoFitPSO.h b/Include/nmNum/nmCalculation/nmCalculationAutoFitPSO.h index e0b1ace..749aa99 100644 --- a/Include/nmNum/nmCalculation/nmCalculationAutoFitPSO.h +++ b/Include/nmNum/nmCalculation/nmCalculationAutoFitPSO.h @@ -287,12 +287,12 @@ private: // 0 k 渗透率;1 skin 表皮系数;2 wellboreC 井筒储集; // 3 phi 孔隙度;4 initialPressure 初始压力;5 h 储层厚度; // 6 Ct 综合压缩系数;7 Cf 岩石压缩系数; - // 8 Soi 初始含油饱和度;9 Swi 初始含水饱和度;10 Sgi 初始含气饱和度。 + // 8 Swi 初始含水饱和度。 // m_enabledParamIndices 保存被用户勾选的参数索引,粒子的 position 维度与它一致。 - QVector m_parameterSelected; // 完整 11 个参数是否被用户勾选参与拟合。 - QVector m_parameterLower; // 完整 11 个参数的搜索下界。 - QVector m_parameterUpper; // 完整 11 个参数的搜索上界。 - QVector m_enabledParamIndices; // 被勾选参数在完整 11 维体系中的索引。 + QVector m_parameterSelected; // 完整 9 个参数是否被用户勾选参与拟合。 + QVector m_parameterLower; // 完整 9 个参数的搜索下界。 + QVector m_parameterUpper; // 完整 9 个参数的搜索上界。 + QVector m_enabledParamIndices; // 被勾选参数在完整 9 维体系中的索引。 QVector > m_targetLogLogData; // 目标井 history log-log 曲线:time/pressure/derivative。 QString m_targetWellName; // 目标井名称;读写井参数和读取模拟曲线都依赖它。 diff --git a/Include/nmNum/nmData/nmDataAutomaticFitting.h b/Include/nmNum/nmData/nmDataAutomaticFitting.h index 379bb03..53120b9 100644 --- a/Include/nmNum/nmData/nmDataAutomaticFitting.h +++ b/Include/nmNum/nmData/nmDataAutomaticFitting.h @@ -1,4 +1,4 @@ -#ifndef NMDATAAUTOMATICFITTING_H +#ifndef NMDATAAUTOMATICFITTING_H #define NMDATAAUTOMATICFITTING_H #include "nmData_global.h" @@ -75,20 +75,6 @@ public: nmDataAttribute& getCfMin(); void setCfMin(const nmDataAttribute& cfMin); - // Getter and Setter for soiMax - nmDataAttribute& getSoiMax(); - void setSoiMax(const nmDataAttribute& soiMax); - // Getter and Setter for soiMin - nmDataAttribute& getSoiMin(); - void setSoiMin(const nmDataAttribute& soiMin); - - // Getter and Setter for sgiMax - nmDataAttribute& getSgiMax(); - void setSgiMax(const nmDataAttribute& sgiMax); - // Getter and Setter for sgiMin - nmDataAttribute& getSgiMin(); - void setSgiMin(const nmDataAttribute& sgiMin); - // Getter and Setter for swiMax nmDataAttribute& getSwiMax(); void setSwiMax(const nmDataAttribute& swiMax); @@ -135,12 +121,6 @@ public: bool getCfSelected() const; void setCfSelected(bool selected); - bool getSoiSelected() const; - void setSoiSelected(bool selected); - - bool getSgiSelected() const; - void setSgiSelected(bool selected); - bool getSwiSelected() const; void setSwiSelected(bool selected); @@ -154,8 +134,6 @@ private: nmDataAttribute m_thicknessMax; nmDataAttribute m_ctMax; nmDataAttribute m_cfMax; - nmDataAttribute m_soiMax; - nmDataAttribute m_sgiMax; nmDataAttribute m_swiMax; // 参数最小值 @@ -167,8 +145,6 @@ private: nmDataAttribute m_thicknessMin; nmDataAttribute m_ctMin; nmDataAttribute m_cfMin; - nmDataAttribute m_soiMin; - nmDataAttribute m_sgiMin; nmDataAttribute m_swiMin; // 迭代参数 @@ -186,8 +162,6 @@ private: bool m_thicknessSelected; // 是否选择储层厚度进行拟合 bool m_ctSelected; // 是否选择综合压缩系数进行拟合 bool m_cfSelected; // 是否选择岩石压缩系数进行拟合 - bool m_soiSelected; // 是否选择初始含油饱和度进行拟合 - bool m_sgiSelected; // 是否选择初始含气饱和度进行拟合 bool m_swiSelected; // 是否选择初始含水饱和度进行拟合 }; diff --git a/Include/nmNum/nmSubWxs/nmWxAutomaticFitting.h b/Include/nmNum/nmSubWxs/nmWxAutomaticFitting.h index a38f295..27f9100 100644 --- a/Include/nmNum/nmSubWxs/nmWxAutomaticFitting.h +++ b/Include/nmNum/nmSubWxs/nmWxAutomaticFitting.h @@ -1,4 +1,4 @@ -#ifndef NMWXAUTOMATICFITTING_H +#ifndef NMWXAUTOMATICFITTING_H #define NMWXAUTOMATICFITTING_H #include "iDlgBase.h" @@ -92,9 +92,7 @@ private: QCheckBox* m_hCheckBox; // 储层厚度 QCheckBox* m_ctCheckBox; // 综合压缩系数 QCheckBox* m_cfCheckBox; // 岩石压缩系数 - QCheckBox* m_soiCheckBox; // 初始含油饱和度 QCheckBox* m_swiCheckBox; // 初始含水饱和度 - QCheckBox* m_sgiCheckBox; // 初始含气饱和度 // 按钮 QPushButton* m_reverseBtn; diff --git a/ML/nmWTAI-ML/configs/data_gen_family_random_v2_q.yaml b/ML/nmWTAI-ML/configs/data_gen_family_random_v2_q.yaml index 86682cb..fce4748 100644 --- a/ML/nmWTAI-ML/configs/data_gen_family_random_v2_q.yaml +++ b/ML/nmWTAI-ML/configs/data_gen_family_random_v2_q.yaml @@ -3,11 +3,11 @@ project: # 项目基础信息 paths: project_root: ".." - data_dir: "data" - temp_dir: "data/temp" - samples_dir: "data/samples" - processed_dir: "data/processed" - models_dir: "models" + data_dir: "C:/Users/Asus/Desktop/test/data" + temp_dir: "C:/Users/Asus/Desktop/test/data/temp" + samples_dir: "C:/Users/Asus/Desktop/test/data/samples" + processed_dir: "C:/Users/Asus/Desktop/test/data/processed" + models_dir: "C:/Users/Asus/Desktop/test/models" cpp: training_exe: "../Training/Release/training.exe" diff --git a/Src/nmNum/nmCalculation/nmCalculationAutoFitGA.cpp b/Src/nmNum/nmCalculation/nmCalculationAutoFitGA.cpp index 09732d5..1bddef9 100644 --- a/Src/nmNum/nmCalculation/nmCalculationAutoFitGA.cpp +++ b/Src/nmNum/nmCalculation/nmCalculationAutoFitGA.cpp @@ -773,7 +773,7 @@ void nmCalculationAutoFitGA::loadParameterBounds() nmDataAutomaticFitting fittingData = dataManager->getAutomaticFittingDataCopy(); // 获取参数选择状态 - m_parameterSelected.resize(11); + m_parameterSelected.resize(9); m_parameterSelected[0] = fittingData.getPermeabilitySelected(); m_parameterSelected[1] = fittingData.getSkinSelected(); m_parameterSelected[2] = fittingData.getWellboreStorageSelected(); @@ -782,13 +782,11 @@ void nmCalculationAutoFitGA::loadParameterBounds() m_parameterSelected[5] = fittingData.getThicknessSelected(); m_parameterSelected[6] = fittingData.getCtSelected(); m_parameterSelected[7] = fittingData.getCfSelected(); - m_parameterSelected[8] = fittingData.getSoiSelected(); - m_parameterSelected[9] = fittingData.getSwiSelected(); - m_parameterSelected[10] = fittingData.getSgiSelected(); + m_parameterSelected[8] = fittingData.getSwiSelected(); // 获取参数边界 - m_parameterLower.resize(11); - m_parameterUpper.resize(11); + m_parameterLower.resize(9); + m_parameterUpper.resize(9); m_parameterLower[0] = fittingData.getPermeabilityMin().getValue().toDouble(); m_parameterUpper[0] = fittingData.getPermeabilityMax().getValue().toDouble(); @@ -814,14 +812,8 @@ void nmCalculationAutoFitGA::loadParameterBounds() m_parameterLower[7] = fittingData.getCfMin().getValue().toDouble(); m_parameterUpper[7] = fittingData.getCfMax().getValue().toDouble(); - m_parameterLower[8] = fittingData.getSoiMin().getValue().toDouble(); - m_parameterUpper[8] = fittingData.getSoiMax().getValue().toDouble(); - - m_parameterLower[9] = fittingData.getSwiMin().getValue().toDouble(); - m_parameterUpper[9] = fittingData.getSwiMax().getValue().toDouble(); - - m_parameterLower[10] = fittingData.getSgiMin().getValue().toDouble(); - m_parameterUpper[10] = fittingData.getSgiMax().getValue().toDouble(); + m_parameterLower[8] = fittingData.getSwiMin().getValue().toDouble(); + m_parameterUpper[8] = fittingData.getSwiMax().getValue().toDouble(); // 更新启用参数索引 m_enabledParamIndices.clear(); @@ -887,17 +879,9 @@ void nmCalculationAutoFitGA::extractUserInitialValues() initialValue = reservoirData.getCf().getValue().toDouble(); break; - case 8: // 初始含油饱和度 - initialValue = reservoirData.getSoi().getValue().toDouble(); - break; - - case 9: // 初始含水饱和度 + case 8: // 初始含水饱和度 initialValue = reservoirData.getSwi().getValue().toDouble(); break; - - case 10: // 初始含气饱和度 - initialValue = reservoirData.getSgi().getValue().toDouble(); - break; } m_initialValues.append(initialValue); @@ -2004,7 +1988,7 @@ void nmCalculationAutoFitGA::updateReservoirParameters(const QVector& pa nmDataReservoir reservoirData = dataManager->getReservoirDataCopy(); int paramIndex = 0; - for(int i = 0; i < m_parameterSelected.size() && i < 11; ++i) { + for(int i = 0; i < m_parameterSelected.size() && i < 9; ++i) { if(m_parameterSelected[i] && paramIndex < parameters.size()) { double value = parameters[paramIndex]; @@ -2027,15 +2011,9 @@ void nmCalculationAutoFitGA::updateReservoirParameters(const QVector& pa case 7: // 岩石压缩系数 reservoirData.getCf().setValue(value); break; - case 8: // 初始含油饱和度 - reservoirData.getSoi().setValue(value); - break; - case 9: // 初始含水饱和度 + case 8: // 初始含水饱和度 reservoirData.getSwi().setValue(value); break; - case 10: // 初始含气饱和度 - reservoirData.getSgi().setValue(value); - break; } paramIndex++; } diff --git a/Src/nmNum/nmCalculation/nmCalculationAutoFitPSO.cpp b/Src/nmNum/nmCalculation/nmCalculationAutoFitPSO.cpp index be39e94..14299d9 100644 --- a/Src/nmNum/nmCalculation/nmCalculationAutoFitPSO.cpp +++ b/Src/nmNum/nmCalculation/nmCalculationAutoFitPSO.cpp @@ -322,7 +322,7 @@ static QString findExecutableInPath(const QString& executableName) static QStringList traceParameterNames() { // trace 和 trace meta 使用的完整参数名顺序。 - // 这个顺序必须与 buildTraceParameterVector() 和 m_parameterSelected 的 0-10 索引一致。 + // 这个顺序必须与 buildTraceParameterVector() 和 m_parameterSelected 的 0-8 索引一致。 QStringList names; names << "k" << "skin" @@ -332,9 +332,7 @@ static QStringList traceParameterNames() << "h" << "Ct" << "Cf" - << "Soi" - << "Swi" - << "Sgi"; + << "Swi"; return names; } @@ -1028,10 +1026,10 @@ void nmCalculationAutoFitPSO::writeTraceMetaFile() QVector nmCalculationAutoFitPSO::buildTraceParameterVector(const QVector& selectedParameters) const { - // 将粒子内部使用的“启用参数向量”还原成完整 11 维参数向量。 + // 将粒子内部使用的“启用参数向量”还原成完整 9 维参数向量。 // 未启用的参数从当前 DataManager 读取,启用的参数用 selectedParameters 覆盖。 // trace CSV、候选 CSV、代理训练域检查都需要这个完整向量。 - QVector fullParams(11, 0.0); + QVector fullParams(9, 0.0); nmDataAnalyzeManager* dataManager = nmDataAnalyzeManager::getCurrentInstance(); @@ -1043,9 +1041,7 @@ QVector nmCalculationAutoFitPSO::buildTraceParameterVector(const QVector fullParams[5] = reservoirData.getThickness().getValue().toDouble(); fullParams[6] = reservoirData.getCt().getValue().toDouble(); fullParams[7] = reservoirData.getCf().getValue().toDouble(); - fullParams[8] = reservoirData.getSoi().getValue().toDouble(); - fullParams[9] = reservoirData.getSwi().getValue().toDouble(); - fullParams[10] = reservoirData.getSgi().getValue().toDouble(); + fullParams[8] = reservoirData.getSwi().getValue().toDouble(); nmDataWellBase* pTargetWell = dataManager->findWellByName(m_targetWellName); @@ -2500,14 +2496,14 @@ void nmCalculationAutoFitPSO::loadParameterBounds() // 读取用户勾选的拟合参数及上下界。 // // 这里构建三个核心数组: - // - m_parameterSelected[11]:完整参数体系中每个参数是否参与拟合; - // - m_parameterLower/Upper[11]:完整参数体系的搜索上下界; + // - m_parameterSelected[9]:完整参数体系中每个参数是否参与拟合; + // - m_parameterLower/Upper[9]:完整参数体系的搜索上下界; // - m_enabledParamIndices:把粒子内部紧凑向量映射回完整参数索引。 nmDataAnalyzeManager* dataManager = nmDataAnalyzeManager::getCurrentInstance(); nmDataAutomaticFitting fittingData = dataManager->getAutomaticFittingDataCopy(); // 获取参数选择状态 - m_parameterSelected.resize(11); + m_parameterSelected.resize(9); m_parameterSelected[0] = fittingData.getPermeabilitySelected(); m_parameterSelected[1] = fittingData.getSkinSelected(); m_parameterSelected[2] = fittingData.getWellboreStorageSelected(); @@ -2516,13 +2512,11 @@ void nmCalculationAutoFitPSO::loadParameterBounds() m_parameterSelected[5] = fittingData.getThicknessSelected(); m_parameterSelected[6] = fittingData.getCtSelected(); m_parameterSelected[7] = fittingData.getCfSelected(); - m_parameterSelected[8] = fittingData.getSoiSelected(); - m_parameterSelected[9] = fittingData.getSwiSelected(); - m_parameterSelected[10] = fittingData.getSgiSelected(); + m_parameterSelected[8] = fittingData.getSwiSelected(); // 获取参数边界 - m_parameterLower.resize(11); - m_parameterUpper.resize(11); + m_parameterLower.resize(9); + m_parameterUpper.resize(9); m_parameterLower[0] = fittingData.getPermeabilityMin().getValue().toDouble(); m_parameterUpper[0] = fittingData.getPermeabilityMax().getValue().toDouble(); @@ -2548,14 +2542,8 @@ void nmCalculationAutoFitPSO::loadParameterBounds() m_parameterLower[7] = fittingData.getCfMin().getValue().toDouble(); m_parameterUpper[7] = fittingData.getCfMax().getValue().toDouble(); - m_parameterLower[8] = fittingData.getSoiMin().getValue().toDouble(); - m_parameterUpper[8] = fittingData.getSoiMax().getValue().toDouble(); - - m_parameterLower[9] = fittingData.getSwiMin().getValue().toDouble(); - m_parameterUpper[9] = fittingData.getSwiMax().getValue().toDouble(); - - m_parameterLower[10] = fittingData.getSgiMin().getValue().toDouble(); - m_parameterUpper[10] = fittingData.getSgiMax().getValue().toDouble(); + m_parameterLower[8] = fittingData.getSwiMin().getValue().toDouble(); + m_parameterUpper[8] = fittingData.getSwiMax().getValue().toDouble(); // 更新启用参数索引 m_enabledParamIndices.clear(); @@ -3149,17 +3137,9 @@ void nmCalculationAutoFitPSO::extractUserInitialValues() initialValue = reservoirData.getCf().getValue().toDouble(); break; - case 8: // 初始含油饱和度 - initialValue = reservoirData.getSoi().getValue().toDouble(); - break; - - case 9: // 初始含水饱和度 + case 8: // 初始含水饱和度 initialValue = reservoirData.getSwi().getValue().toDouble(); break; - - case 10: // 初始含气饱和度 - initialValue = reservoirData.getSgi().getValue().toDouble(); - break; } m_initialValues.append(initialValue); @@ -3886,11 +3866,11 @@ void nmCalculationAutoFitPSO::updateReservoirParameters(const QVector& p nmDataAnalyzeManager* dataManager = nmDataAnalyzeManager::getCurrentInstance(); nmDataReservoir reservoirData = dataManager->getReservoirDataCopy(); - // paramIndex 是粒子 position 中的索引;i 是完整 11 个参数体系中的索引。 + // paramIndex 是粒子 position 中的索引;i 是完整 9 个参数体系中的索引。 // 只有 m_parameterSelected[i] 为 true 时,才从 parameters 中消费一个值。 int paramIndex = 0; - for(int i = 0; i < m_parameterSelected.size() && i < 11; ++i) { + for(int i = 0; i < m_parameterSelected.size() && i < 9; ++i) { if(m_parameterSelected[i] && paramIndex < parameters.size()) { double value = parameters[paramIndex]; @@ -3919,17 +3899,9 @@ void nmCalculationAutoFitPSO::updateReservoirParameters(const QVector& p reservoirData.getCf().setValue(value); break; - case 8: // 初始含油饱和度 - reservoirData.getSoi().setValue(value); - break; - - case 9: // 初始含水饱和度 + case 8: // 初始含水饱和度 reservoirData.getSwi().setValue(value); break; - - case 10: // 初始含气饱和度 - reservoirData.getSgi().setValue(value); - break; } paramIndex++; diff --git a/Src/nmNum/nmData/nmDataAnalyzeManager.cpp b/Src/nmNum/nmData/nmDataAnalyzeManager.cpp index e0d94de..5dded9b 100644 --- a/Src/nmNum/nmData/nmDataAnalyzeManager.cpp +++ b/Src/nmNum/nmData/nmDataAnalyzeManager.cpp @@ -1044,6 +1044,12 @@ void nmDataAnalyzeManager::calculationLogData( // 准备流量段数据 QVector vecTimeQ = pWellData->getFlowPoints(); int nTimeNumQ = vecTimeQ.size() - 1; + + // 空数据保护:新建井可能没有流量数据,-1 转为 size_t 会变为极大值 + if(nTimeNumQ <= 0) { + return; + } + std::vector timeQ(nTimeNumQ); std::vector q(nTimeNumQ); diff --git a/Src/nmNum/nmData/nmDataAutomaticFitting.cpp b/Src/nmNum/nmData/nmDataAutomaticFitting.cpp index 5a82eeb..e04c76b 100644 --- a/Src/nmNum/nmData/nmDataAutomaticFitting.cpp +++ b/Src/nmNum/nmData/nmDataAutomaticFitting.cpp @@ -1,4 +1,4 @@ -#include "nmDataAutomaticFitting.h" +#include "nmDataAutomaticFitting.h" nmDataAutomaticFitting::nmDataAutomaticFitting() { @@ -11,9 +11,7 @@ nmDataAutomaticFitting::nmDataAutomaticFitting() m_thicknessSelected = true; // 默认选中 m_ctSelected = false; // 默认不选中 m_cfSelected = false; // 默认不选中 - m_soiSelected = false; // 默认不选中 m_swiSelected = false; // 默认不选中 - m_sgiSelected = false; // 默认不选中 // 初始化参数最大值 m_permeabilityMax = nmDataAttribute("Permeability Max", 10.0, "Darcy"); // 1000 mD @@ -24,8 +22,6 @@ nmDataAutomaticFitting::nmDataAutomaticFitting() m_thicknessMax = nmDataAttribute("Thickness Max", 50.0, "m"); m_ctMax = nmDataAttribute("Ct Max", 1, ""); // 1/MPa m_cfMax = nmDataAttribute("Cf Max", 0.01, ""); // 1/MPa - m_soiMax = nmDataAttribute("Soi Max", 1.0, ""); - m_sgiMax = nmDataAttribute("Sgi Max", 1.0, ""); m_swiMax = nmDataAttribute("Swi Max", 1.0, ""); // 初始化参数最小值 @@ -37,8 +33,6 @@ nmDataAutomaticFitting::nmDataAutomaticFitting() m_thicknessMin = nmDataAttribute("Thickness Min", 2.0, "m"); m_ctMin = nmDataAttribute("Ct Min", 1e-4, ""); // 小正值 m_cfMin = nmDataAttribute("Cf Min", 1e-5, ""); // 小正值 - m_soiMin = nmDataAttribute("Soi Min", 0.0, ""); - m_sgiMin = nmDataAttribute("Sgi Min", 0.0, ""); m_swiMin = nmDataAttribute("Swi Min", 0.0, ""); // 初始化迭代参数 @@ -69,8 +63,6 @@ nmDataAutomaticFitting& nmDataAutomaticFitting::operator=(const nmDataAutomaticF m_thicknessSelected = other.m_thicknessSelected; m_ctSelected = other.m_ctSelected; m_cfSelected = other.m_cfSelected; - m_soiSelected = other.m_soiSelected; - m_sgiSelected = other.m_sgiSelected; m_swiSelected = other.m_swiSelected; // 复制参数最大值 @@ -82,8 +74,6 @@ nmDataAutomaticFitting& nmDataAutomaticFitting::operator=(const nmDataAutomaticF m_thicknessMax = other.m_thicknessMax; m_ctMax = other.m_ctMax; m_cfMax = other.m_cfMax; - m_soiMax = other.m_soiMax; - m_sgiMax = other.m_sgiMax; m_swiMax = other.m_swiMax; // 复制参数最小值 @@ -95,8 +85,6 @@ nmDataAutomaticFitting& nmDataAutomaticFitting::operator=(const nmDataAutomaticF m_thicknessMin = other.m_thicknessMin; m_ctMin = other.m_ctMin; m_cfMin = other.m_cfMin; - m_soiMin = other.m_soiMin; - m_sgiMin = other.m_sgiMin; m_swiMin = other.m_swiMin; // 复制迭代参数 @@ -121,8 +109,6 @@ rapidjson::Value nmDataAutomaticFitting::ToJsonValue(rapidjson::Document::Alloca fittingObject.AddMember("ThicknessSelected", m_thicknessSelected, allocator); fittingObject.AddMember("CtSelected", m_ctSelected, allocator); fittingObject.AddMember("CfSelected", m_cfSelected, allocator); - fittingObject.AddMember("SoiSelected", m_soiSelected, allocator); - fittingObject.AddMember("SgiSelected", m_sgiSelected, allocator); fittingObject.AddMember("SwiSelected", m_swiSelected, allocator); // 序列化参数最大值 @@ -134,8 +120,6 @@ rapidjson::Value nmDataAutomaticFitting::ToJsonValue(rapidjson::Document::Alloca fittingObject.AddMember("ThicknessMax", m_thicknessMax.ToJsonValue(allocator), allocator); fittingObject.AddMember("CtMax", m_ctMax.ToJsonValue(allocator), allocator); fittingObject.AddMember("CfMax", m_cfMax.ToJsonValue(allocator), allocator); - fittingObject.AddMember("SoiMax", m_soiMax.ToJsonValue(allocator), allocator); - fittingObject.AddMember("SgiMax", m_sgiMax.ToJsonValue(allocator), allocator); fittingObject.AddMember("SwiMax", m_swiMax.ToJsonValue(allocator), allocator); // 序列化参数最小值 @@ -147,8 +131,6 @@ rapidjson::Value nmDataAutomaticFitting::ToJsonValue(rapidjson::Document::Alloca fittingObject.AddMember("ThicknessMin", m_thicknessMin.ToJsonValue(allocator), allocator); fittingObject.AddMember("CtMin", m_ctMin.ToJsonValue(allocator), allocator); fittingObject.AddMember("CfMin", m_cfMin.ToJsonValue(allocator), allocator); - fittingObject.AddMember("SoiMin", m_soiMin.ToJsonValue(allocator), allocator); - fittingObject.AddMember("SgiMin", m_sgiMin.ToJsonValue(allocator), allocator); fittingObject.AddMember("SwiMin", m_swiMin.ToJsonValue(allocator), allocator); // 序列化迭代参数 @@ -187,14 +169,8 @@ void nmDataAutomaticFitting::FromJsonValue(const rapidjson::Value& jsonValue) if (jsonValue.HasMember("CfSelected") && jsonValue["CfSelected"].IsBool()) { m_cfSelected = jsonValue["CfSelected"].GetBool(); } - if (jsonValue.HasMember("SoiSelected") && jsonValue["SoiSelected"].IsBool()) { - m_soiSelected = jsonValue["SoiSelected"].GetBool(); - } - if (jsonValue.HasMember("SgoiSelected") && jsonValue["SgiSelected"].IsBool()) { - m_soiSelected = jsonValue["SgiSelected"].GetBool(); - } if (jsonValue.HasMember("SwiSelected") && jsonValue["SwiSelected"].IsBool()) { - m_soiSelected = jsonValue["SwiSelected"].GetBool(); + m_swiSelected = jsonValue["SwiSelected"].GetBool(); } // 反序列化参数最大值 @@ -222,14 +198,8 @@ void nmDataAutomaticFitting::FromJsonValue(const rapidjson::Value& jsonValue) if (jsonValue.HasMember("CfMax") && jsonValue["CfMax"].IsObject()) { m_cfMax.FromJsonValue(jsonValue["CfMax"]); } - if (jsonValue.HasMember("SoiMax") && jsonValue["SoiMax"].IsObject()) { - m_soiMax.FromJsonValue(jsonValue["SoiMax"]); - } - if (jsonValue.HasMember("SgiMax") && jsonValue["SgiMax"].IsObject()) { - m_soiMax.FromJsonValue(jsonValue["SgiMax"]); - } if (jsonValue.HasMember("SwiMax") && jsonValue["SwiMax"].IsObject()) { - m_soiMax.FromJsonValue(jsonValue["SwiMax"]); + m_swiMax.FromJsonValue(jsonValue["SwiMax"]); } // 反序列化参数最小值 @@ -257,14 +227,8 @@ void nmDataAutomaticFitting::FromJsonValue(const rapidjson::Value& jsonValue) if (jsonValue.HasMember("CfMin") && jsonValue["CfMin"].IsObject()) { m_cfMin.FromJsonValue(jsonValue["CfMin"]); } - if (jsonValue.HasMember("SoiMin") && jsonValue["SoiMin"].IsObject()) { - m_soiMin.FromJsonValue(jsonValue["SoiMin"]); - } - if (jsonValue.HasMember("SgiMin") && jsonValue["SgiMin"].IsObject()) { - m_soiMin.FromJsonValue(jsonValue["SgiMin"]); - } if (jsonValue.HasMember("SwiMin") && jsonValue["SwiMin"].IsObject()) { - m_soiMin.FromJsonValue(jsonValue["SwiMin"]); + m_swiMin.FromJsonValue(jsonValue["SwiMin"]); } // 反序列化迭代参数 @@ -308,12 +272,6 @@ void nmDataAutomaticFitting::setCtSelected(bool selected) { m_ctSelected = selec bool nmDataAutomaticFitting::getCfSelected() const { return m_cfSelected; } void nmDataAutomaticFitting::setCfSelected(bool selected) { m_cfSelected = selected; } -bool nmDataAutomaticFitting::getSoiSelected() const { return m_soiSelected; } -void nmDataAutomaticFitting::setSoiSelected(bool selected) { m_soiSelected = selected; } - -bool nmDataAutomaticFitting::getSgiSelected() const { return m_sgiSelected; } -void nmDataAutomaticFitting::setSgiSelected(bool selected) { m_sgiSelected = selected; } - bool nmDataAutomaticFitting::getSwiSelected() const { return m_swiSelected; } void nmDataAutomaticFitting::setSwiSelected(bool selected) { m_swiSelected = selected; } @@ -343,12 +301,6 @@ void nmDataAutomaticFitting::setCtMax(const nmDataAttribute& ctMax) { m_ctMax = nmDataAttribute& nmDataAutomaticFitting::getCfMax() { return m_cfMax; } void nmDataAutomaticFitting::setCfMax(const nmDataAttribute& cfMax) { m_cfMax = cfMax; } -nmDataAttribute& nmDataAutomaticFitting::getSoiMax() { return m_soiMax; } -void nmDataAutomaticFitting::setSoiMax(const nmDataAttribute& soiMax) { m_soiMax = soiMax; } - -nmDataAttribute& nmDataAutomaticFitting::getSgiMax() { return m_sgiMax; } -void nmDataAutomaticFitting::setSgiMax(const nmDataAttribute& sgiMax) { m_sgiMax = sgiMax; } - nmDataAttribute& nmDataAutomaticFitting::getSwiMax() { return m_swiMax; } void nmDataAutomaticFitting::setSwiMax(const nmDataAttribute& swiMax) { m_swiMax = swiMax; } @@ -377,12 +329,6 @@ void nmDataAutomaticFitting::setCtMin(const nmDataAttribute& ctMin) { m_ctMin = nmDataAttribute& nmDataAutomaticFitting::getCfMin() { return m_cfMin; } void nmDataAutomaticFitting::setCfMin(const nmDataAttribute& cfMin) { m_cfMin = cfMin; } -nmDataAttribute& nmDataAutomaticFitting::getSoiMin() { return m_soiMin; } -void nmDataAutomaticFitting::setSoiMin(const nmDataAttribute& soiMin) { m_soiMin = soiMin; } - -nmDataAttribute& nmDataAutomaticFitting::getSgiMin() { return m_sgiMin; } -void nmDataAutomaticFitting::setSgiMin(const nmDataAttribute& sgiMin) { m_sgiMin = sgiMin; } - nmDataAttribute& nmDataAutomaticFitting::getSwiMin() { return m_swiMin; } void nmDataAutomaticFitting::setSwiMin(const nmDataAttribute& swiMin) { m_swiMin = swiMin; } diff --git a/Src/nmNum/nmSubWxs/nmWxAutomaticFitting.cpp b/Src/nmNum/nmSubWxs/nmWxAutomaticFitting.cpp index 64bff7b..ebd2b49 100644 --- a/Src/nmNum/nmSubWxs/nmWxAutomaticFitting.cpp +++ b/Src/nmNum/nmSubWxs/nmWxAutomaticFitting.cpp @@ -1,4 +1,4 @@ -#include "nmWxAutomaticFitting.h" +#include "nmWxAutomaticFitting.h" #include "nmCalculationAutoFitPSO.h" #include "nmWxAutomaticfittingStart.h" #include "nmWxParameterProperty.h" @@ -92,9 +92,7 @@ void nmWxAutomaticFitting::updateParameterVisibility(QTableWidget* table, NM_SOL setParameterRowVisible(table, 6, showCt); // Ct setParameterRowVisible(table, 7, showCf); // Cf - setParameterRowVisible(table, 8, false); // Soi - setParameterRowVisible(table, 9, showSwi); // Swi - setParameterRowVisible(table, 10, false); // Sgi + setParameterRowVisible(table, 8, showSwi); // Swi renumberVisibleParameterRows(table); } @@ -197,7 +195,7 @@ void nmWxAutomaticFitting::setupUI() void nmWxAutomaticFitting::setupParameterTable() { // 创建表格 - m_parameterTable = new QTableWidget(11, 6, this); + m_parameterTable = new QTableWidget(9, 6, this); // 设置表头 QStringList headers; @@ -306,38 +304,18 @@ void nmWxAutomaticFitting::setupParameterTable() m_parameterTable->setItem(7, 4, new QTableWidgetItem(QString::number(automaticFittingData.getCfMax().getValue().toDouble()))); m_parameterTable->setItem(7, 5, new QTableWidgetItem("")); - // 初始含油饱和度 (Soi) - m_parameterTable->setItem(8, 0, new QTableWidgetItem("9")); - m_soiCheckBox = new QCheckBox(tr("Soi")); - m_soiCheckBox->setChecked(automaticFittingData.getSoiSelected()); - m_parameterTable->setCellWidget(8, 1, m_soiCheckBox); - m_parameterTable->setItem(8, 2, new QTableWidgetItem(QString::number(automaticFittingData.getSoiMin().getValue().toDouble()))); - m_parameterTable->setItem(8, 3, new QTableWidgetItem(QString::number(reservoirData.getSoi().getValue().toDouble()))); - m_parameterTable->setItem(8, 4, new QTableWidgetItem(QString::number(automaticFittingData.getSoiMax().getValue().toDouble()))); - m_parameterTable->setItem(8, 5, new QTableWidgetItem("")); - // 初始含水饱和度 (Swi) - m_parameterTable->setItem(9, 0, new QTableWidgetItem("10")); + m_parameterTable->setItem(8, 0, new QTableWidgetItem("9")); m_swiCheckBox = new QCheckBox(tr("Swi")); m_swiCheckBox->setChecked(automaticFittingData.getSwiSelected()); - m_parameterTable->setCellWidget(9, 1, m_swiCheckBox); - m_parameterTable->setItem(9, 2, new QTableWidgetItem(QString::number(automaticFittingData.getSwiMin().getValue().toDouble()))); - m_parameterTable->setItem(9, 3, new QTableWidgetItem(QString::number(reservoirData.getSwi().getValue().toDouble()))); - m_parameterTable->setItem(9, 4, new QTableWidgetItem(QString::number(automaticFittingData.getSwiMax().getValue().toDouble()))); - m_parameterTable->setItem(9, 5, new QTableWidgetItem("")); - - // 初始含气饱和度 (Sgi) - m_parameterTable->setItem(10, 0, new QTableWidgetItem("11")); - m_sgiCheckBox = new QCheckBox(tr("Sgi")); - m_sgiCheckBox->setChecked(automaticFittingData.getSgiSelected()); - m_parameterTable->setCellWidget(10, 1, m_sgiCheckBox); - m_parameterTable->setItem(10, 2, new QTableWidgetItem(QString::number(automaticFittingData.getSgiMin().getValue().toDouble()))); - m_parameterTable->setItem(10, 3, new QTableWidgetItem(QString::number(reservoirData.getSgi().getValue().toDouble()))); - m_parameterTable->setItem(10, 4, new QTableWidgetItem(QString::number(automaticFittingData.getSgiMax().getValue().toDouble()))); - m_parameterTable->setItem(10, 5, new QTableWidgetItem("")); + m_parameterTable->setCellWidget(8, 1, m_swiCheckBox); + m_parameterTable->setItem(8, 2, new QTableWidgetItem(QString::number(automaticFittingData.getSwiMin().getValue().toDouble()))); + m_parameterTable->setItem(8, 3, new QTableWidgetItem(QString::number(reservoirData.getSwi().getValue().toDouble()))); + m_parameterTable->setItem(8, 4, new QTableWidgetItem(QString::number(automaticFittingData.getSwiMax().getValue().toDouble()))); + m_parameterTable->setItem(8, 5, new QTableWidgetItem("")); // 设置表格行为 - for(int i = 0; i < 11; ++i) { + for(int i = 0; i < m_parameterTable->rowCount(); ++i) { for(int j = 0; j < 6; ++j) { QTableWidgetItem* item = m_parameterTable->item(i, j); @@ -354,7 +332,7 @@ void nmWxAutomaticFitting::setupParameterTable() } // 序号列居中对齐 - for(int i = 0; i < 11; ++i) { + for(int i = 0; i < m_parameterTable->rowCount(); ++i) { QTableWidgetItem* item = m_parameterTable->item(i, 0); if(item) { @@ -535,9 +513,7 @@ void nmWxAutomaticFitting::onReverseSelection() if(!m_parameterTable->isRowHidden(5)) m_hCheckBox->setChecked(!m_hCheckBox->isChecked()); if(!m_parameterTable->isRowHidden(6)) m_ctCheckBox->setChecked(!m_ctCheckBox->isChecked()); if(!m_parameterTable->isRowHidden(7)) m_cfCheckBox->setChecked(!m_cfCheckBox->isChecked()); - if(!m_parameterTable->isRowHidden(8)) m_soiCheckBox->setChecked(!m_soiCheckBox->isChecked()); - if(!m_parameterTable->isRowHidden(9)) m_swiCheckBox->setChecked(!m_swiCheckBox->isChecked()); - if(!m_parameterTable->isRowHidden(10)) m_sgiCheckBox->setChecked(!m_sgiCheckBox->isChecked()); + if(!m_parameterTable->isRowHidden(8)) m_swiCheckBox->setChecked(!m_swiCheckBox->isChecked()); } void nmWxAutomaticFitting::onAlgorithmChanged(int index) @@ -616,8 +592,7 @@ void nmWxAutomaticFitting::onAccept() m_cCheckBox->isChecked() || m_phiCheckBox->isChecked() || m_piCheckBox->isChecked() || m_hCheckBox->isChecked() || m_ctCheckBox->isChecked() || m_cfCheckBox->isChecked() || - m_soiCheckBox->isChecked() || m_swiCheckBox->isChecked() || - m_sgiCheckBox->isChecked(); + m_swiCheckBox->isChecked(); if(!hasSelectedParams) { QMessageBox::warning(this, tr("Warning"), tr("Please select at least one parameter for optimization!")); @@ -635,9 +610,7 @@ void nmWxAutomaticFitting::onAccept() if(m_hCheckBox->isChecked()) selectedParameterNames << tr("Thickness"); if(m_ctCheckBox->isChecked()) selectedParameterNames << tr("Ct"); if(m_cfCheckBox->isChecked()) selectedParameterNames << tr("Cf"); - if(m_soiCheckBox->isChecked()) selectedParameterNames << tr("Soi"); if(m_swiCheckBox->isChecked()) selectedParameterNames << tr("Swi"); - if(m_sgiCheckBox->isChecked()) selectedParameterNames << tr("Sgi"); // 启动自动拟合 - 传递双对数历史数据 startAutoFitting(targetLogLogData, selectedParameterNames, selectedWellName); @@ -732,9 +705,7 @@ void nmWxAutomaticFitting::setAutomaticFittingValue() automaticFittingData.setThicknessSelected(m_hCheckBox->isChecked()); automaticFittingData.setCtSelected(m_ctCheckBox->isChecked()); automaticFittingData.setCfSelected(m_cfCheckBox->isChecked()); - automaticFittingData.setSoiSelected(m_soiCheckBox->isChecked()); automaticFittingData.setSwiSelected(m_swiCheckBox->isChecked()); - automaticFittingData.setSgiSelected(m_sgiCheckBox->isChecked()); automaticFittingData.setSurrogateScreeningEnabled(m_surrogateCombo && m_surrogateCombo->currentIndex() == 1); // 保存渗透率的最小值和最大值 @@ -769,17 +740,9 @@ void nmWxAutomaticFitting::setAutomaticFittingValue() automaticFittingData.getCfMin().setValue(m_parameterTable->item(7, 2)->text().toDouble()); automaticFittingData.getCfMax().setValue(m_parameterTable->item(7, 4)->text().toDouble()); - // 保存初始含油饱和度的最小值和最大值 - automaticFittingData.getSoiMin().setValue(m_parameterTable->item(8, 2)->text().toDouble()); - automaticFittingData.getSoiMax().setValue(m_parameterTable->item(8, 4)->text().toDouble()); - // 保存初始含水饱和度的最小值和最大值 - automaticFittingData.getSwiMin().setValue(m_parameterTable->item(9, 2)->text().toDouble()); - automaticFittingData.getSwiMax().setValue(m_parameterTable->item(9, 4)->text().toDouble()); - - // 保存初始含气饱和度的最小值和最大值 - automaticFittingData.getSgiMin().setValue(m_parameterTable->item(10, 2)->text().toDouble()); - automaticFittingData.getSgiMax().setValue(m_parameterTable->item(10, 4)->text().toDouble()); + automaticFittingData.getSwiMin().setValue(m_parameterTable->item(8, 2)->text().toDouble()); + automaticFittingData.getSwiMax().setValue(m_parameterTable->item(8, 4)->text().toDouble()); // 保存迭代参数 automaticFittingData.getIterationCount().setValue(m_iterationEdit->text().toInt()); @@ -792,9 +755,7 @@ void nmWxAutomaticFitting::setAutomaticFittingValue() reservoirData.getThickness().setValue(m_parameterTable->item(5, 3)->text().toDouble()); // 储层厚度 reservoirData.getCt().setValue(m_parameterTable->item(6, 3)->text().toDouble()); // 综合压缩系数 reservoirData.getCf().setValue(m_parameterTable->item(7, 3)->text().toDouble()); // 岩石压缩系数 - reservoirData.getSoi().setValue(m_parameterTable->item(8, 3)->text().toDouble()); // 初始含油饱和度 - reservoirData.getSwi().setValue(m_parameterTable->item(9, 3)->text().toDouble()); // 初始含水饱和度 - reservoirData.getSgi().setValue(m_parameterTable->item(10, 3)->text().toDouble()); // 初始含气饱和度 + reservoirData.getSwi().setValue(m_parameterTable->item(8, 3)->text().toDouble()); // 初始含水饱和度 // 更新储层数据(全局) nmDataAnalyzeManager::getCurrentInstance()->updateReservoirData(reservoirData); @@ -1133,9 +1094,7 @@ void nmWxAutomaticFitting::updateBestParametersToTable() if(m_hCheckBox->isChecked()) enabledParams.append(5); // 储层厚度 if(m_ctCheckBox->isChecked()) enabledParams.append(6); // 综合压缩系数 if(m_cfCheckBox->isChecked()) enabledParams.append(7); // 岩石压缩系数 - if(m_soiCheckBox->isChecked()) enabledParams.append(8); // 初始含油饱和度 - if(m_swiCheckBox->isChecked()) enabledParams.append(9); // 初始含水饱和度 - if(m_sgiCheckBox->isChecked()) enabledParams.append(10); // 初始含气饱和度 + if(m_swiCheckBox->isChecked()) enabledParams.append(8); // 初始含水饱和度 // 范围收缩比例 double shrinkFactor = 0.3; @@ -1209,18 +1168,10 @@ void nmWxAutomaticFitting::updateBestParametersToTable() automaticFittingData.getCfMin().setValue(newMin); automaticFittingData.getCfMax().setValue(newMax); break; - case 8: // 初始含油饱和度 - automaticFittingData.getSoiMin().setValue(newMin); - automaticFittingData.getSoiMax().setValue(newMax); - break; - case 9: // 初始含水饱和度 + case 8: // 初始含水饱和度 automaticFittingData.getSwiMin().setValue(newMin); automaticFittingData.getSwiMax().setValue(newMax); break; - case 10: // 初始含气饱和度 - automaticFittingData.getSgiMin().setValue(newMin); - automaticFittingData.getSgiMax().setValue(newMax); - break; } }