删除自动拟合不需要的参数

feature/Model-20260625
lvjunjie 4 weeks ago
parent 6c82c1a9b9
commit 955b2e19fe

@ -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<bool> m_parameterSelected; // 完整 11 个参数是否被用户勾选参与拟合。
QVector<double> m_parameterLower; // 完整 11 个参数的搜索下界。
QVector<double> m_parameterUpper; // 完整 11 个参数的搜索上界。
QVector<int> m_enabledParamIndices; // 被勾选参数在完整 11 维体系中的索引。
QVector<bool> m_parameterSelected; // 完整 9 个参数是否被用户勾选参与拟合。
QVector<double> m_parameterLower; // 完整 9 个参数的搜索下界。
QVector<double> m_parameterUpper; // 完整 9 个参数的搜索上界。
QVector<int> m_enabledParamIndices; // 被勾选参数在完整 9 维体系中的索引。
QVector<QVector<double> > m_targetLogLogData; // 目标井 history log-log 曲线time/pressure/derivative。
QString m_targetWellName; // 目标井名称;读写井参数和读取模拟曲线都依赖它。

@ -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; // 是否选择初始含水饱和度进行拟合
};

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

@ -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"

@ -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<double>& 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<double>& 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++;
}

@ -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<double> nmCalculationAutoFitPSO::buildTraceParameterVector(const QVector<double>& selectedParameters) const
{
// 将粒子内部使用的“启用参数向量”还原成完整 11 维参数向量。
// 将粒子内部使用的“启用参数向量”还原成完整 9 维参数向量。
// 未启用的参数从当前 DataManager 读取,启用的参数用 selectedParameters 覆盖。
// trace CSV、候选 CSV、代理训练域检查都需要这个完整向量。
QVector<double> fullParams(11, 0.0);
QVector<double> fullParams(9, 0.0);
nmDataAnalyzeManager* dataManager = nmDataAnalyzeManager::getCurrentInstance();
@ -1043,9 +1041,7 @@ QVector<double> 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<double>& 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<double>& 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++;

@ -1044,6 +1044,12 @@ void nmDataAnalyzeManager::calculationLogData(
// 准备流量段数据
QVector<QPointF> vecTimeQ = pWellData->getFlowPoints();
int nTimeNumQ = vecTimeQ.size() - 1;
// 空数据保护:新建井可能没有流量数据,-1 转为 size_t 会变为极大值
if(nTimeNumQ <= 0) {
return;
}
std::vector<double> timeQ(nTimeNumQ);
std::vector<double> q(nTimeNumQ);

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

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

Loading…
Cancel
Save