|
|
|
|
@ -190,7 +190,7 @@ void nmWxAutomaticFitting::renumberVisibleParameterRows(QTableWidget* table)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 根据当前模型类型控制Ct/Cf/Swi参数显示。
|
|
|
|
|
// 根据当前模型类型控制 Ct/Cf/Swi,并根据目标井类型控制裂缝导流能力显示。
|
|
|
|
|
void nmWxAutomaticFitting::updateParameterVisibility(QTableWidget* table, NM_SOLVER_MODEL_TYPE eType)
|
|
|
|
|
{
|
|
|
|
|
if(!table) {
|
|
|
|
|
@ -231,6 +231,21 @@ void nmWxAutomaticFitting::updateParameterVisibility(QTableWidget* table, NM_SOL
|
|
|
|
|
setParameterRowVisible(table, 6, showCf); // Cf
|
|
|
|
|
setParameterRowVisible(table, 7, showSwi); // Swi
|
|
|
|
|
|
|
|
|
|
// Dfc 只属于垂直压裂井和多段压裂水平井。普通井隐藏并取消勾选,
|
|
|
|
|
// 防止切换目标井后不可见的裂缝参数仍进入拟合参数向量。
|
|
|
|
|
bool showFractureConductivity = false;
|
|
|
|
|
nmDataAnalyzeManager* manager = nmDataAnalyzeManager::getCurrentInstance();
|
|
|
|
|
if(manager && m_targetWellCombo) {
|
|
|
|
|
nmDataWellBase* targetWell = manager->findWellByName(m_targetWellCombo->currentText());
|
|
|
|
|
if(targetWell) {
|
|
|
|
|
NM_WELL_MODEL wellType = targetWell->getWellType();
|
|
|
|
|
showFractureConductivity =
|
|
|
|
|
wellType == NM_WELL_MODEL::Vertical_Fractured_Well ||
|
|
|
|
|
wellType == NM_WELL_MODEL::Horizontal_Fractured_Well;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
setParameterRowVisible(table, 8, showFractureConductivity); // Dfc
|
|
|
|
|
|
|
|
|
|
renumberVisibleParameterRows(table);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -240,20 +255,20 @@ bool nmWxAutomaticFitting::getPhysicalParameterRange(int parameterIndex,
|
|
|
|
|
{
|
|
|
|
|
static const char* parameterNames[] = {
|
|
|
|
|
"Result_K", "Result_W_Skin", "Result_W_C", "Result_phi",
|
|
|
|
|
"Result_h", "Result_Cti", "Result_Cf", "Result_Swi"
|
|
|
|
|
"Result_h", "Result_Cti", "Result_Cf", "Result_Swi", "Result_W_Dfc"
|
|
|
|
|
};
|
|
|
|
|
// KAPPA 的边界使用 md、ft、bbl/psi;自动拟合界面使用 Darcy、m、m^3/MPa,
|
|
|
|
|
// 这里统一换算到界面和 PSO 实际使用的单位:K 除以 1000,h 由 ft 换成 m,
|
|
|
|
|
// 井筒储集系数的 4.33667154546306e34 bbl/psi 对应约 1e36 m^3/MPa。
|
|
|
|
|
// Ct/Cf/Swi 沿用模型参数表边界。
|
|
|
|
|
// Ct/Cf/Swi/Dfc 沿用模型参数表边界。
|
|
|
|
|
static const double physicalMin[] = {
|
|
|
|
|
1.01325027383089e-18, -5.0, 0.0, 1.0e-4, 1.0e-5, 1.0e-30, 1.0e-30, 0.0
|
|
|
|
|
1.01325027383089e-18, -5.0, 0.0, 1.0e-4, 1.0e-5, 1.0e-30, 1.0e-30, 0.0, 0.0
|
|
|
|
|
};
|
|
|
|
|
static const double physicalMax[] = {
|
|
|
|
|
1.01325027383089e42, 5000.0, 1.0e36, 0.9999, 1.0e9, 10.0, 10.0, 1.0
|
|
|
|
|
1.01325027383089e42, 5000.0, 1.0e36, 0.9999, 1.0e9, 10.0, 10.0, 1.0, 1.0e30
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if(parameterIndex < 0 || parameterIndex >= 8) {
|
|
|
|
|
if(parameterIndex < 0 || parameterIndex >= 9) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -338,6 +353,10 @@ void nmWxAutomaticFitting::setParameterRange(int parameterIndex,
|
|
|
|
|
automaticFittingData.getSwiMin().setValue(minValue);
|
|
|
|
|
automaticFittingData.getSwiMax().setValue(maxValue);
|
|
|
|
|
break;
|
|
|
|
|
case 8:
|
|
|
|
|
automaticFittingData.getFractureConductivityMin().setValue(minValue);
|
|
|
|
|
automaticFittingData.getFractureConductivityMax().setValue(maxValue);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
@ -350,7 +369,7 @@ void nmWxAutomaticFitting::setParameterRange(int parameterIndex,
|
|
|
|
|
void nmWxAutomaticFitting::updateRangeForParameter(int parameterIndex,
|
|
|
|
|
double centerValue)
|
|
|
|
|
{
|
|
|
|
|
if(!m_parameterTable || parameterIndex < 0 || parameterIndex >= 8
|
|
|
|
|
if(!m_parameterTable || parameterIndex < 0 || parameterIndex >= 9
|
|
|
|
|
|| !nmAutoFitUiIsFinite(centerValue)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
@ -383,7 +402,9 @@ void nmWxAutomaticFitting::updateRangeForParameter(int parameterIndex,
|
|
|
|
|
const double skinHalfRange = 10.0;
|
|
|
|
|
newMin = qMax(physicalMin, reference - skinHalfRange);
|
|
|
|
|
newMax = qMin(physicalMax, reference + skinHalfRange);
|
|
|
|
|
} else if(reference > 0.0 && !(parameterIndex == 7 && centerValue <= 0.0)) {
|
|
|
|
|
} else if(reference > 0.0
|
|
|
|
|
&& !(parameterIndex == 7 && centerValue <= 0.0)
|
|
|
|
|
&& !(parameterIndex == 8 && centerValue <= 0.0)) {
|
|
|
|
|
const double lowerFactor = 0.1;
|
|
|
|
|
const double upperFactor = 10.0;
|
|
|
|
|
newMin = qMax(physicalMin, reference * lowerFactor);
|
|
|
|
|
@ -392,6 +413,10 @@ void nmWxAutomaticFitting::updateRangeForParameter(int parameterIndex,
|
|
|
|
|
// 没有可靠 Swi 初值时,不把搜索范围压缩到零附近。
|
|
|
|
|
newMin = physicalMin;
|
|
|
|
|
newMax = physicalMax;
|
|
|
|
|
} else if(parameterIndex == 8) {
|
|
|
|
|
// Dfc=0 表示无限导流,不存在以零为中心的连续倍率范围。
|
|
|
|
|
newMin = physicalMin;
|
|
|
|
|
newMax = physicalMax;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 任何自动范围都必须包含本次使用的中心值,并且不能越过物理边界。
|
|
|
|
|
@ -412,7 +437,7 @@ void nmWxAutomaticFitting::initializeSuggestedParameterRanges()
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for(int parameterIndex = 0; parameterIndex < 8; ++parameterIndex) {
|
|
|
|
|
for(int parameterIndex = 0; parameterIndex < 9; ++parameterIndex) {
|
|
|
|
|
QTableWidgetItem* initialItem = m_parameterTable->item(parameterIndex, 3);
|
|
|
|
|
if(initialItem) {
|
|
|
|
|
bool initialOk = false;
|
|
|
|
|
@ -439,7 +464,7 @@ void nmWxAutomaticFitting::normalizeSavedParameterRanges()
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for(int parameterIndex = 0; parameterIndex < 8; ++parameterIndex) {
|
|
|
|
|
for(int parameterIndex = 0; parameterIndex < 9; ++parameterIndex) {
|
|
|
|
|
QTableWidgetItem* minItem = m_parameterTable->item(parameterIndex, 2);
|
|
|
|
|
QTableWidgetItem* maxItem = m_parameterTable->item(parameterIndex, 4);
|
|
|
|
|
QTableWidgetItem* initialItem = m_parameterTable->item(parameterIndex, 3);
|
|
|
|
|
@ -454,9 +479,12 @@ void nmWxAutomaticFitting::normalizeSavedParameterRanges()
|
|
|
|
|
bool savedMaxOk = false;
|
|
|
|
|
const double savedMin = minItem->text().toDouble(&savedMinOk);
|
|
|
|
|
const double savedMax = maxItem->text().toDouble(&savedMaxOk);
|
|
|
|
|
// 旧项目没有 Dfc 字段时,nmDataAttribute 会表现为 0~0。Dfc=0 在求解器中
|
|
|
|
|
// 表示无限导流,不能作为连续拟合区间,因此按当前压裂井初值重新建范围。
|
|
|
|
|
const bool savedRangeValid = savedMinOk && savedMaxOk
|
|
|
|
|
&& nmAutoFitUiIsFinite(savedMin) && nmAutoFitUiIsFinite(savedMax)
|
|
|
|
|
&& savedMax >= savedMin;
|
|
|
|
|
&& savedMax >= savedMin
|
|
|
|
|
&& !(parameterIndex == 8 && savedMax <= 1.0e-10);
|
|
|
|
|
|
|
|
|
|
if(savedRangeValid && physicalMax >= physicalMin) {
|
|
|
|
|
const double clippedMin = qMax(savedMin, physicalMin);
|
|
|
|
|
@ -485,18 +513,18 @@ bool nmWxAutomaticFitting::validateParameterTable(QString& errorMessage, int par
|
|
|
|
|
errorMessage = tr("The parameter table is unavailable.");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if(parameterIndex < -1 || parameterIndex >= 8) {
|
|
|
|
|
if(parameterIndex < -1 || parameterIndex >= 9) {
|
|
|
|
|
errorMessage = tr("The parameter row is invalid.");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static const char* parameterNames[] = {
|
|
|
|
|
"Permeability", "Skin", "Wellbore storage", "Porosity",
|
|
|
|
|
"Thickness", "Ct", "Cf", "Swi"
|
|
|
|
|
"Thickness", "Ct", "Cf", "Swi", "Fracture conductivity"
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const int firstParameterIndex = parameterIndex < 0 ? 0 : parameterIndex;
|
|
|
|
|
const int lastParameterIndex = parameterIndex < 0 ? 8 : parameterIndex + 1;
|
|
|
|
|
const int lastParameterIndex = parameterIndex < 0 ? 9 : parameterIndex + 1;
|
|
|
|
|
for(int currentParameterIndex = firstParameterIndex;
|
|
|
|
|
currentParameterIndex < lastParameterIndex; ++currentParameterIndex) {
|
|
|
|
|
// 隐藏参数不参与当前模型拟合,不用它们的历史值阻塞当前设置。
|
|
|
|
|
@ -556,6 +584,14 @@ bool nmWxAutomaticFitting::validateParameterTable(QString& errorMessage, int par
|
|
|
|
|
.arg(tr(parameterNames[currentParameterIndex]));
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 底层用 Dfc=0 表示无限导流,这是离散模型选项,不属于有限导流拟合域。
|
|
|
|
|
if(currentParameterIndex == 8 && m_dfcCheckBox->isChecked()
|
|
|
|
|
&& (minValue <= 1.0e-10 || initialValue <= 1.0e-10)) {
|
|
|
|
|
errorMessage = tr("The minimum value of %1 must be greater than zero for automatic fitting.")
|
|
|
|
|
.arg(tr(parameterNames[currentParameterIndex]));
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
@ -681,7 +717,7 @@ void nmWxAutomaticFitting::setupUI()
|
|
|
|
|
void nmWxAutomaticFitting::setupParameterTable()
|
|
|
|
|
{
|
|
|
|
|
// 创建表格
|
|
|
|
|
m_parameterTable = new QTableWidget(8, 6, this);
|
|
|
|
|
m_parameterTable = new QTableWidget(9, 6, this);
|
|
|
|
|
|
|
|
|
|
// 设置表头
|
|
|
|
|
QStringList headers;
|
|
|
|
|
@ -790,6 +826,17 @@ void nmWxAutomaticFitting::setupParameterTable()
|
|
|
|
|
m_parameterTable->setItem(7, 4, new QTableWidgetItem(QString::number(automaticFittingData.getSwiMax().getValue().toDouble())));
|
|
|
|
|
m_parameterTable->setItem(7, 5, new QTableWidgetItem(""));
|
|
|
|
|
|
|
|
|
|
// 裂缝导流能力 (Dfc)。该行只对压裂井显示,初值在 onWellSelected() 中
|
|
|
|
|
// 从当前目标井读取,其他裂缝几何参数保持固定,不进入自动拟合。
|
|
|
|
|
m_parameterTable->setItem(8, 0, new QTableWidgetItem("9"));
|
|
|
|
|
m_dfcCheckBox = new QCheckBox(tr("Fracture conductivity"));
|
|
|
|
|
m_dfcCheckBox->setChecked(automaticFittingData.getFractureConductivitySelected());
|
|
|
|
|
m_parameterTable->setCellWidget(8, 1, m_dfcCheckBox);
|
|
|
|
|
m_parameterTable->setItem(8, 2, new QTableWidgetItem(QString::number(automaticFittingData.getFractureConductivityMin().getValue().toDouble())));
|
|
|
|
|
m_parameterTable->setItem(8, 3, new QTableWidgetItem());
|
|
|
|
|
m_parameterTable->setItem(8, 4, new QTableWidgetItem(QString::number(automaticFittingData.getFractureConductivityMax().getValue().toDouble())));
|
|
|
|
|
m_parameterTable->setItem(8, 5, new QTableWidgetItem(tr("md.m")));
|
|
|
|
|
|
|
|
|
|
// 设置表格行为
|
|
|
|
|
for(int i = 0; i < m_parameterTable->rowCount(); ++i) {
|
|
|
|
|
for(int j = 0; j < 6; ++j) {
|
|
|
|
|
@ -989,6 +1036,7 @@ void nmWxAutomaticFitting::onReverseSelection()
|
|
|
|
|
if(!m_parameterTable->isRowHidden(5)) m_ctCheckBox->setChecked(!m_ctCheckBox->isChecked());
|
|
|
|
|
if(!m_parameterTable->isRowHidden(6)) m_cfCheckBox->setChecked(!m_cfCheckBox->isChecked());
|
|
|
|
|
if(!m_parameterTable->isRowHidden(7)) m_swiCheckBox->setChecked(!m_swiCheckBox->isChecked());
|
|
|
|
|
if(!m_parameterTable->isRowHidden(8)) m_dfcCheckBox->setChecked(!m_dfcCheckBox->isChecked());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmWxAutomaticFitting::onParameterTableItemChanged(QTableWidgetItem* item)
|
|
|
|
|
@ -1107,7 +1155,7 @@ void nmWxAutomaticFitting::onAccept()
|
|
|
|
|
m_cCheckBox->isChecked() || m_phiCheckBox->isChecked() ||
|
|
|
|
|
m_hCheckBox->isChecked() ||
|
|
|
|
|
m_ctCheckBox->isChecked() || m_cfCheckBox->isChecked() ||
|
|
|
|
|
m_swiCheckBox->isChecked();
|
|
|
|
|
m_swiCheckBox->isChecked() || m_dfcCheckBox->isChecked();
|
|
|
|
|
|
|
|
|
|
if(!hasSelectedParams) {
|
|
|
|
|
QMessageBox::warning(this, tr("Warning"), tr("Please select at least one parameter for optimization!"));
|
|
|
|
|
@ -1125,6 +1173,7 @@ void nmWxAutomaticFitting::onAccept()
|
|
|
|
|
if(m_ctCheckBox->isChecked()) selectedParameterNames << tr("Ct");
|
|
|
|
|
if(m_cfCheckBox->isChecked()) selectedParameterNames << tr("Cf");
|
|
|
|
|
if(m_swiCheckBox->isChecked()) selectedParameterNames << tr("Swi");
|
|
|
|
|
if(m_dfcCheckBox->isChecked()) selectedParameterNames << tr("Fracture conductivity");
|
|
|
|
|
|
|
|
|
|
// 启动自动拟合 - 传递双对数历史数据
|
|
|
|
|
startAutoFitting(targetLogLogData, selectedParameterNames, selectedWellName);
|
|
|
|
|
@ -1141,8 +1190,10 @@ void nmWxAutomaticFitting::onWellSelected(int index)
|
|
|
|
|
|
|
|
|
|
// 在分类的井数据中查找匹配的井
|
|
|
|
|
bool found = false;
|
|
|
|
|
bool fracturedWell = false;
|
|
|
|
|
double skinValue = 0.0;
|
|
|
|
|
double wellboreStorageValue = 0.0;
|
|
|
|
|
double fractureConductivityValue = 0.0;
|
|
|
|
|
|
|
|
|
|
// 查找垂直井
|
|
|
|
|
for(int i = 0; i < m_verticalWells.size(); ++i) {
|
|
|
|
|
@ -1172,6 +1223,8 @@ void nmWxAutomaticFitting::onWellSelected(int index)
|
|
|
|
|
if(m_verticalFracturedWells[i].getWellName() == selectedWellName) {
|
|
|
|
|
skinValue = m_verticalFracturedWells[i].getPerforation(0)->getSkin().getValue().toDouble();
|
|
|
|
|
wellboreStorageValue = m_verticalFracturedWells[i].getWellboreStorage().getValue().toDouble();
|
|
|
|
|
fractureConductivityValue = m_verticalFracturedWells[i].getDfc().getValue().toDouble();
|
|
|
|
|
fracturedWell = true;
|
|
|
|
|
found = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
@ -1184,6 +1237,8 @@ void nmWxAutomaticFitting::onWellSelected(int index)
|
|
|
|
|
if(m_horizontalFracturedWells[i].getWellName() == selectedWellName) {
|
|
|
|
|
skinValue = m_horizontalFracturedWells[i].getPerforation(0)->getSkin().getValue().toDouble();
|
|
|
|
|
wellboreStorageValue = m_horizontalFracturedWells[i].getWellboreStorage().getValue().toDouble();
|
|
|
|
|
fractureConductivityValue = m_horizontalFracturedWells[i].getDfc().getValue().toDouble();
|
|
|
|
|
fracturedWell = true;
|
|
|
|
|
found = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
@ -1191,6 +1246,11 @@ void nmWxAutomaticFitting::onWellSelected(int index)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (found) {
|
|
|
|
|
// 先按目标井类型刷新可见行,再写入当前井的井级初值。
|
|
|
|
|
nmDataAnalyzeManager* manager = nmDataAnalyzeManager::getCurrentInstance();
|
|
|
|
|
if(manager) {
|
|
|
|
|
updateParameterVisibility(m_parameterTable, manager->getSolverModelType());
|
|
|
|
|
}
|
|
|
|
|
// 更新表格数据
|
|
|
|
|
// 确保表格项存在
|
|
|
|
|
if(!m_parameterTable->item(1, 3)) {
|
|
|
|
|
@ -1205,10 +1265,16 @@ void nmWxAutomaticFitting::onWellSelected(int index)
|
|
|
|
|
|
|
|
|
|
// 设置井筒储集系数(Wellbore storage)
|
|
|
|
|
m_parameterTable->item(2, 3)->setText(QString::number(wellboreStorageValue));
|
|
|
|
|
if(fracturedWell && m_parameterTable->item(8, 3)) {
|
|
|
|
|
m_parameterTable->item(8, 3)->setText(QString::number(fractureConductivityValue));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(m_autoParameterRanges) {
|
|
|
|
|
updateRangeForParameter(1, skinValue);
|
|
|
|
|
updateRangeForParameter(2, wellboreStorageValue);
|
|
|
|
|
if(fracturedWell) {
|
|
|
|
|
updateRangeForParameter(8, fractureConductivityValue);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -1224,6 +1290,7 @@ void nmWxAutomaticFitting::setAutomaticFittingValue()
|
|
|
|
|
automaticFittingData.setCtSelected(m_ctCheckBox->isChecked());
|
|
|
|
|
automaticFittingData.setCfSelected(m_cfCheckBox->isChecked());
|
|
|
|
|
automaticFittingData.setSwiSelected(m_swiCheckBox->isChecked());
|
|
|
|
|
automaticFittingData.setFractureConductivitySelected(m_dfcCheckBox->isChecked());
|
|
|
|
|
automaticFittingData.setSurrogateScreeningEnabled(m_surrogateCombo && m_surrogateCombo->currentIndex() == 1);
|
|
|
|
|
|
|
|
|
|
// 保存渗透率的最小值和最大值
|
|
|
|
|
@ -1258,6 +1325,10 @@ void nmWxAutomaticFitting::setAutomaticFittingValue()
|
|
|
|
|
automaticFittingData.getSwiMin().setValue(m_parameterTable->item(7, 2)->text().toDouble());
|
|
|
|
|
automaticFittingData.getSwiMax().setValue(m_parameterTable->item(7, 4)->text().toDouble());
|
|
|
|
|
|
|
|
|
|
// 保存裂缝导流能力的最小值和最大值
|
|
|
|
|
automaticFittingData.getFractureConductivityMin().setValue(m_parameterTable->item(8, 2)->text().toDouble());
|
|
|
|
|
automaticFittingData.getFractureConductivityMax().setValue(m_parameterTable->item(8, 4)->text().toDouble());
|
|
|
|
|
|
|
|
|
|
// 保存迭代参数
|
|
|
|
|
automaticFittingData.getIterationCount().setValue(m_iterationEdit->text().toInt());
|
|
|
|
|
automaticFittingData.getErrorTolerance().setValue(m_errorLimitEdit->text().toDouble());
|
|
|
|
|
@ -1281,6 +1352,7 @@ void nmWxAutomaticFitting::setAutomaticFittingValue()
|
|
|
|
|
if(!selectedWellName.isEmpty()) {
|
|
|
|
|
double newSkinValue = m_parameterTable->item(1, 3)->text().toDouble();
|
|
|
|
|
double newWellboreStorageValue = m_parameterTable->item(2, 3)->text().toDouble();
|
|
|
|
|
double newFractureConductivityValue = m_parameterTable->item(8, 3)->text().toDouble();
|
|
|
|
|
|
|
|
|
|
// 直接从数据管理器获取目标井
|
|
|
|
|
nmDataAnalyzeManager* manager = nmDataAnalyzeManager::getCurrentInstance();
|
|
|
|
|
@ -1303,6 +1375,23 @@ void nmWxAutomaticFitting::setAutomaticFittingValue()
|
|
|
|
|
// 根据井类型单独更新这一口井
|
|
|
|
|
NM_WELL_MODEL wellType = pTargetWell->getWellType();
|
|
|
|
|
|
|
|
|
|
// Dfc 属于压裂井对象;只修改这一项,裂缝位置、长度和段数保持原值。
|
|
|
|
|
if(wellType == NM_WELL_MODEL::Vertical_Fractured_Well) {
|
|
|
|
|
nmDataVerticalFracturedWell* fracturedWell = dynamic_cast<nmDataVerticalFracturedWell*>(pTargetWell);
|
|
|
|
|
if(fracturedWell) {
|
|
|
|
|
nmDataAttribute dfc = fracturedWell->getDfc();
|
|
|
|
|
dfc.setValue(newFractureConductivityValue);
|
|
|
|
|
fracturedWell->setDfc(dfc);
|
|
|
|
|
}
|
|
|
|
|
} else if(wellType == NM_WELL_MODEL::Horizontal_Fractured_Well) {
|
|
|
|
|
nmDataHorizontalFracturedWell* fracturedWell = dynamic_cast<nmDataHorizontalFracturedWell*>(pTargetWell);
|
|
|
|
|
if(fracturedWell) {
|
|
|
|
|
nmDataAttribute dfc = fracturedWell->getDfc();
|
|
|
|
|
dfc.setValue(newFractureConductivityValue);
|
|
|
|
|
fracturedWell->setDfc(dfc);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(wellType == NM_WELL_MODEL::Vertical_Well) {
|
|
|
|
|
nmDataVerticalWell* pVerticalWell = dynamic_cast<nmDataVerticalWell*>(pTargetWell);
|
|
|
|
|
if(pVerticalWell != nullptr) {
|
|
|
|
|
@ -1532,6 +1621,7 @@ void nmWxAutomaticFitting::updateBestParametersToTable()
|
|
|
|
|
if(m_ctCheckBox->isChecked()) enabledParams.append(5); // 综合压缩系数
|
|
|
|
|
if(m_cfCheckBox->isChecked()) enabledParams.append(6); // 岩石压缩系数
|
|
|
|
|
if(m_swiCheckBox->isChecked()) enabledParams.append(7); // 初始含水饱和度
|
|
|
|
|
if(m_dfcCheckBox->isChecked()) enabledParams.append(8); // 裂缝导流能力
|
|
|
|
|
|
|
|
|
|
// 更新参数值和范围
|
|
|
|
|
for (int i = 0; i < bestSolution.size() && i < enabledParams.size(); ++i) {
|
|
|
|
|
|