|
|
|
|
@ -43,13 +43,10 @@ bool nmAutoFitUiNearlyEqual(double left, double right)
|
|
|
|
|
return std::fabs(left - right) <= DBL_EPSILON * 8.0 * scale;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 从系统参数表读取物理边界,读取失败时保留调用方提供的兜底边界。
|
|
|
|
|
// 从系统参数表读取物理边界,所有自动拟合参数统一以参数表配置为准。
|
|
|
|
|
bool nmAutoFitReadPhysicalRange(const char* parameterName,
|
|
|
|
|
double fallbackMin, double fallbackMax, double& minValue, double& maxValue)
|
|
|
|
|
double& minValue, double& maxValue)
|
|
|
|
|
{
|
|
|
|
|
minValue = fallbackMin;
|
|
|
|
|
maxValue = fallbackMax;
|
|
|
|
|
|
|
|
|
|
iSysParaHelper* paraHelper = _paraHelper;
|
|
|
|
|
if(!paraHelper) {
|
|
|
|
|
return false;
|
|
|
|
|
@ -245,6 +242,7 @@ void nmWxAutomaticFitting::updateParameterVisibility(QTableWidget* table, NM_SOL
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
setParameterRowVisible(table, 8, showFractureConductivity); // Dfc
|
|
|
|
|
setParameterRowVisible(table, 9, showFractureConductivity); // 裂缝半长
|
|
|
|
|
|
|
|
|
|
renumberVisibleParameterRows(table);
|
|
|
|
|
}
|
|
|
|
|
@ -255,29 +253,15 @@ 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_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/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, 0.0
|
|
|
|
|
};
|
|
|
|
|
static const double physicalMax[] = {
|
|
|
|
|
1.01325027383089e42, 5000.0, 1.0e36, 0.9999, 1.0e9, 10.0, 10.0, 1.0, 1.0e30
|
|
|
|
|
"Result_h", "Result_Cti", "Result_Cf", "Result_Swi", "Result_W_Dfc",
|
|
|
|
|
"W_FractureHalfLength"
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if(parameterIndex < 0 || parameterIndex >= 9) {
|
|
|
|
|
if(parameterIndex < 0 || parameterIndex >= 10) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
minValue = physicalMin[parameterIndex];
|
|
|
|
|
maxValue = physicalMax[parameterIndex];
|
|
|
|
|
bool rangeRead = true;
|
|
|
|
|
if(parameterIndex >= 5) {
|
|
|
|
|
rangeRead = nmAutoFitReadPhysicalRange(parameterNames[parameterIndex],
|
|
|
|
|
physicalMin[parameterIndex], physicalMax[parameterIndex], minValue, maxValue);
|
|
|
|
|
if(!nmAutoFitReadPhysicalRange(parameterNames[parameterIndex], minValue, maxValue)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(parameterIndex == 7) {
|
|
|
|
|
@ -294,7 +278,7 @@ bool nmWxAutomaticFitting::getPhysicalParameterRange(int parameterIndex,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return rangeRead;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 将一组上下界同步到表格和自动拟合数据,保证 PSO 读取到同一份配置。
|
|
|
|
|
@ -357,6 +341,10 @@ void nmWxAutomaticFitting::setParameterRange(int parameterIndex,
|
|
|
|
|
automaticFittingData.getFractureConductivityMin().setValue(minValue);
|
|
|
|
|
automaticFittingData.getFractureConductivityMax().setValue(maxValue);
|
|
|
|
|
break;
|
|
|
|
|
case 9:
|
|
|
|
|
automaticFittingData.getFractureHalfLengthMin().setValue(minValue);
|
|
|
|
|
automaticFittingData.getFractureHalfLengthMax().setValue(maxValue);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
@ -369,14 +357,16 @@ void nmWxAutomaticFitting::setParameterRange(int parameterIndex,
|
|
|
|
|
void nmWxAutomaticFitting::updateRangeForParameter(int parameterIndex,
|
|
|
|
|
double centerValue)
|
|
|
|
|
{
|
|
|
|
|
if(!m_parameterTable || parameterIndex < 0 || parameterIndex >= 9
|
|
|
|
|
if(!m_parameterTable || parameterIndex < 0 || parameterIndex >= 10
|
|
|
|
|
|| !nmAutoFitUiIsFinite(centerValue)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double physicalMin = 0.0;
|
|
|
|
|
double physicalMax = 0.0;
|
|
|
|
|
getPhysicalParameterRange(parameterIndex, physicalMin, physicalMax);
|
|
|
|
|
if(!getPhysicalParameterRange(parameterIndex, physicalMin, physicalMax)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double reference = centerValue;
|
|
|
|
|
const bool positiveParameter = parameterIndex != 1;
|
|
|
|
|
@ -437,7 +427,7 @@ void nmWxAutomaticFitting::initializeSuggestedParameterRanges()
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for(int parameterIndex = 0; parameterIndex < 9; ++parameterIndex) {
|
|
|
|
|
for(int parameterIndex = 0; parameterIndex < 10; ++parameterIndex) {
|
|
|
|
|
QTableWidgetItem* initialItem = m_parameterTable->item(parameterIndex, 3);
|
|
|
|
|
if(initialItem) {
|
|
|
|
|
bool initialOk = false;
|
|
|
|
|
@ -448,8 +438,8 @@ void nmWxAutomaticFitting::initializeSuggestedParameterRanges()
|
|
|
|
|
// 数据对象没有提供该初值时使用完整物理区间,不回退到旧的默认范围。
|
|
|
|
|
double physicalMin = 0.0;
|
|
|
|
|
double physicalMax = 0.0;
|
|
|
|
|
getPhysicalParameterRange(parameterIndex, physicalMin, physicalMax);
|
|
|
|
|
if(physicalMax >= physicalMin) {
|
|
|
|
|
if(getPhysicalParameterRange(parameterIndex, physicalMin, physicalMax)
|
|
|
|
|
&& physicalMax >= physicalMin) {
|
|
|
|
|
setParameterRange(parameterIndex, physicalMin, physicalMax);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -464,7 +454,7 @@ void nmWxAutomaticFitting::normalizeSavedParameterRanges()
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for(int parameterIndex = 0; parameterIndex < 9; ++parameterIndex) {
|
|
|
|
|
for(int parameterIndex = 0; parameterIndex < 10; ++parameterIndex) {
|
|
|
|
|
QTableWidgetItem* minItem = m_parameterTable->item(parameterIndex, 2);
|
|
|
|
|
QTableWidgetItem* maxItem = m_parameterTable->item(parameterIndex, 4);
|
|
|
|
|
QTableWidgetItem* initialItem = m_parameterTable->item(parameterIndex, 3);
|
|
|
|
|
@ -474,7 +464,9 @@ void nmWxAutomaticFitting::normalizeSavedParameterRanges()
|
|
|
|
|
|
|
|
|
|
double physicalMin = 0.0;
|
|
|
|
|
double physicalMax = 0.0;
|
|
|
|
|
getPhysicalParameterRange(parameterIndex, physicalMin, physicalMax);
|
|
|
|
|
if(!getPhysicalParameterRange(parameterIndex, physicalMin, physicalMax)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
bool savedMinOk = false;
|
|
|
|
|
bool savedMaxOk = false;
|
|
|
|
|
const double savedMin = minItem->text().toDouble(&savedMinOk);
|
|
|
|
|
@ -513,18 +505,19 @@ bool nmWxAutomaticFitting::validateParameterTable(QString& errorMessage, int par
|
|
|
|
|
errorMessage = tr("The parameter table is unavailable.");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if(parameterIndex < -1 || parameterIndex >= 9) {
|
|
|
|
|
if(parameterIndex < -1 || parameterIndex >= 10) {
|
|
|
|
|
errorMessage = tr("The parameter row is invalid.");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static const char* parameterNames[] = {
|
|
|
|
|
"Permeability", "Skin", "Wellbore storage", "Porosity",
|
|
|
|
|
"Thickness", "Ct", "Cf", "Swi", "Fracture conductivity"
|
|
|
|
|
"Thickness", "Ct", "Cf", "Swi", "Fracture conductivity",
|
|
|
|
|
"Fracture half length"
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const int firstParameterIndex = parameterIndex < 0 ? 0 : parameterIndex;
|
|
|
|
|
const int lastParameterIndex = parameterIndex < 0 ? 9 : parameterIndex + 1;
|
|
|
|
|
const int lastParameterIndex = parameterIndex < 0 ? 10 : parameterIndex + 1;
|
|
|
|
|
for(int currentParameterIndex = firstParameterIndex;
|
|
|
|
|
currentParameterIndex < lastParameterIndex; ++currentParameterIndex) {
|
|
|
|
|
// 隐藏参数不参与当前模型拟合,不用它们的历史值阻塞当前设置。
|
|
|
|
|
@ -558,8 +551,8 @@ bool nmWxAutomaticFitting::validateParameterTable(QString& errorMessage, int par
|
|
|
|
|
|
|
|
|
|
double physicalMin = 0.0;
|
|
|
|
|
double physicalMax = 0.0;
|
|
|
|
|
getPhysicalParameterRange(currentParameterIndex, physicalMin, physicalMax);
|
|
|
|
|
if(!nmAutoFitUiIsFinite(physicalMin) || !nmAutoFitUiIsFinite(physicalMax)
|
|
|
|
|
if(!getPhysicalParameterRange(currentParameterIndex, physicalMin, physicalMax)
|
|
|
|
|
|| !nmAutoFitUiIsFinite(physicalMin) || !nmAutoFitUiIsFinite(physicalMax)
|
|
|
|
|
|| physicalMax < physicalMin) {
|
|
|
|
|
errorMessage = tr("The physical range of %1 is invalid.")
|
|
|
|
|
.arg(tr(parameterNames[currentParameterIndex]));
|
|
|
|
|
@ -717,7 +710,7 @@ void nmWxAutomaticFitting::setupUI()
|
|
|
|
|
void nmWxAutomaticFitting::setupParameterTable()
|
|
|
|
|
{
|
|
|
|
|
// 创建表格
|
|
|
|
|
m_parameterTable = new QTableWidget(9, 6, this);
|
|
|
|
|
m_parameterTable = new QTableWidget(10, 6, this);
|
|
|
|
|
|
|
|
|
|
// 设置表头
|
|
|
|
|
QStringList headers;
|
|
|
|
|
@ -837,6 +830,16 @@ void nmWxAutomaticFitting::setupParameterTable()
|
|
|
|
|
m_parameterTable->setItem(8, 4, new QTableWidgetItem(QString::number(automaticFittingData.getFractureConductivityMax().getValue().toDouble())));
|
|
|
|
|
m_parameterTable->setItem(8, 5, new QTableWidgetItem(tr("md.m")));
|
|
|
|
|
|
|
|
|
|
// 裂缝半长。该行与 Dfc 一样只对压裂井显示,初值从当前目标井读取。
|
|
|
|
|
m_parameterTable->setItem(9, 0, new QTableWidgetItem("10"));
|
|
|
|
|
m_fractureHalfLengthCheckBox = new QCheckBox(tr("Fracture half length"));
|
|
|
|
|
m_fractureHalfLengthCheckBox->setChecked(automaticFittingData.getFractureHalfLengthSelected());
|
|
|
|
|
m_parameterTable->setCellWidget(9, 1, m_fractureHalfLengthCheckBox);
|
|
|
|
|
m_parameterTable->setItem(9, 2, new QTableWidgetItem(QString::number(automaticFittingData.getFractureHalfLengthMin().getValue().toDouble())));
|
|
|
|
|
m_parameterTable->setItem(9, 3, new QTableWidgetItem());
|
|
|
|
|
m_parameterTable->setItem(9, 4, new QTableWidgetItem(QString::number(automaticFittingData.getFractureHalfLengthMax().getValue().toDouble())));
|
|
|
|
|
m_parameterTable->setItem(9, 5, new QTableWidgetItem(tr("m")));
|
|
|
|
|
|
|
|
|
|
// 设置表格行为
|
|
|
|
|
for(int i = 0; i < m_parameterTable->rowCount(); ++i) {
|
|
|
|
|
for(int j = 0; j < 6; ++j) {
|
|
|
|
|
@ -1037,6 +1040,7 @@ void nmWxAutomaticFitting::onReverseSelection()
|
|
|
|
|
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());
|
|
|
|
|
if(!m_parameterTable->isRowHidden(9)) m_fractureHalfLengthCheckBox->setChecked(!m_fractureHalfLengthCheckBox->isChecked());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmWxAutomaticFitting::onParameterTableItemChanged(QTableWidgetItem* item)
|
|
|
|
|
@ -1155,7 +1159,8 @@ void nmWxAutomaticFitting::onAccept()
|
|
|
|
|
m_cCheckBox->isChecked() || m_phiCheckBox->isChecked() ||
|
|
|
|
|
m_hCheckBox->isChecked() ||
|
|
|
|
|
m_ctCheckBox->isChecked() || m_cfCheckBox->isChecked() ||
|
|
|
|
|
m_swiCheckBox->isChecked() || m_dfcCheckBox->isChecked();
|
|
|
|
|
m_swiCheckBox->isChecked() || m_dfcCheckBox->isChecked() ||
|
|
|
|
|
m_fractureHalfLengthCheckBox->isChecked();
|
|
|
|
|
|
|
|
|
|
if(!hasSelectedParams) {
|
|
|
|
|
QMessageBox::warning(this, tr("Warning"), tr("Please select at least one parameter for optimization!"));
|
|
|
|
|
@ -1174,6 +1179,7 @@ void nmWxAutomaticFitting::onAccept()
|
|
|
|
|
if(m_cfCheckBox->isChecked()) selectedParameterNames << tr("Cf");
|
|
|
|
|
if(m_swiCheckBox->isChecked()) selectedParameterNames << tr("Swi");
|
|
|
|
|
if(m_dfcCheckBox->isChecked()) selectedParameterNames << tr("Fracture conductivity");
|
|
|
|
|
if(m_fractureHalfLengthCheckBox->isChecked()) selectedParameterNames << tr("Fracture half length");
|
|
|
|
|
|
|
|
|
|
// 启动自动拟合 - 传递双对数历史数据
|
|
|
|
|
startAutoFitting(targetLogLogData, selectedParameterNames, selectedWellName);
|
|
|
|
|
@ -1194,6 +1200,7 @@ void nmWxAutomaticFitting::onWellSelected(int index)
|
|
|
|
|
double skinValue = 0.0;
|
|
|
|
|
double wellboreStorageValue = 0.0;
|
|
|
|
|
double fractureConductivityValue = 0.0;
|
|
|
|
|
double fractureHalfLengthValue = 0.0;
|
|
|
|
|
|
|
|
|
|
// 查找垂直井
|
|
|
|
|
for(int i = 0; i < m_verticalWells.size(); ++i) {
|
|
|
|
|
@ -1224,6 +1231,7 @@ void nmWxAutomaticFitting::onWellSelected(int index)
|
|
|
|
|
skinValue = m_verticalFracturedWells[i].getPerforation(0)->getSkin().getValue().toDouble();
|
|
|
|
|
wellboreStorageValue = m_verticalFracturedWells[i].getWellboreStorage().getValue().toDouble();
|
|
|
|
|
fractureConductivityValue = m_verticalFracturedWells[i].getDfc().getValue().toDouble();
|
|
|
|
|
fractureHalfLengthValue = m_verticalFracturedWells[i].getFractureHalfLength().getValue().toDouble();
|
|
|
|
|
fracturedWell = true;
|
|
|
|
|
found = true;
|
|
|
|
|
break;
|
|
|
|
|
@ -1238,6 +1246,7 @@ void nmWxAutomaticFitting::onWellSelected(int index)
|
|
|
|
|
skinValue = m_horizontalFracturedWells[i].getPerforation(0)->getSkin().getValue().toDouble();
|
|
|
|
|
wellboreStorageValue = m_horizontalFracturedWells[i].getWellboreStorage().getValue().toDouble();
|
|
|
|
|
fractureConductivityValue = m_horizontalFracturedWells[i].getDfc().getValue().toDouble();
|
|
|
|
|
fractureHalfLengthValue = m_horizontalFracturedWells[i].getFractureHalfLength().getValue().toDouble();
|
|
|
|
|
fracturedWell = true;
|
|
|
|
|
found = true;
|
|
|
|
|
break;
|
|
|
|
|
@ -1268,12 +1277,16 @@ void nmWxAutomaticFitting::onWellSelected(int index)
|
|
|
|
|
if(fracturedWell && m_parameterTable->item(8, 3)) {
|
|
|
|
|
m_parameterTable->item(8, 3)->setText(QString::number(fractureConductivityValue));
|
|
|
|
|
}
|
|
|
|
|
if(fracturedWell && m_parameterTable->item(9, 3)) {
|
|
|
|
|
m_parameterTable->item(9, 3)->setText(QString::number(fractureHalfLengthValue));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(m_autoParameterRanges) {
|
|
|
|
|
updateRangeForParameter(1, skinValue);
|
|
|
|
|
updateRangeForParameter(2, wellboreStorageValue);
|
|
|
|
|
if(fracturedWell) {
|
|
|
|
|
updateRangeForParameter(8, fractureConductivityValue);
|
|
|
|
|
updateRangeForParameter(9, fractureHalfLengthValue);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -1291,6 +1304,7 @@ void nmWxAutomaticFitting::setAutomaticFittingValue()
|
|
|
|
|
automaticFittingData.setCfSelected(m_cfCheckBox->isChecked());
|
|
|
|
|
automaticFittingData.setSwiSelected(m_swiCheckBox->isChecked());
|
|
|
|
|
automaticFittingData.setFractureConductivitySelected(m_dfcCheckBox->isChecked());
|
|
|
|
|
automaticFittingData.setFractureHalfLengthSelected(m_fractureHalfLengthCheckBox->isChecked());
|
|
|
|
|
automaticFittingData.setSurrogateScreeningEnabled(m_surrogateCombo && m_surrogateCombo->currentIndex() == 1);
|
|
|
|
|
|
|
|
|
|
// 保存渗透率的最小值和最大值
|
|
|
|
|
@ -1329,6 +1343,10 @@ void nmWxAutomaticFitting::setAutomaticFittingValue()
|
|
|
|
|
automaticFittingData.getFractureConductivityMin().setValue(m_parameterTable->item(8, 2)->text().toDouble());
|
|
|
|
|
automaticFittingData.getFractureConductivityMax().setValue(m_parameterTable->item(8, 4)->text().toDouble());
|
|
|
|
|
|
|
|
|
|
// 保存裂缝半长的最小值和最大值
|
|
|
|
|
automaticFittingData.getFractureHalfLengthMin().setValue(m_parameterTable->item(9, 2)->text().toDouble());
|
|
|
|
|
automaticFittingData.getFractureHalfLengthMax().setValue(m_parameterTable->item(9, 4)->text().toDouble());
|
|
|
|
|
|
|
|
|
|
// 保存迭代参数
|
|
|
|
|
automaticFittingData.getIterationCount().setValue(m_iterationEdit->text().toInt());
|
|
|
|
|
automaticFittingData.getErrorTolerance().setValue(m_errorLimitEdit->text().toDouble());
|
|
|
|
|
@ -1353,6 +1371,7 @@ void nmWxAutomaticFitting::setAutomaticFittingValue()
|
|
|
|
|
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();
|
|
|
|
|
double newFractureHalfLengthValue = m_parameterTable->item(9, 3)->text().toDouble();
|
|
|
|
|
|
|
|
|
|
// 直接从数据管理器获取目标井
|
|
|
|
|
nmDataAnalyzeManager* manager = nmDataAnalyzeManager::getCurrentInstance();
|
|
|
|
|
@ -1382,6 +1401,7 @@ void nmWxAutomaticFitting::setAutomaticFittingValue()
|
|
|
|
|
nmDataAttribute dfc = fracturedWell->getDfc();
|
|
|
|
|
dfc.setValue(newFractureConductivityValue);
|
|
|
|
|
fracturedWell->setDfc(dfc);
|
|
|
|
|
fracturedWell->getFractureHalfLength().setValue(newFractureHalfLengthValue);
|
|
|
|
|
}
|
|
|
|
|
} else if(wellType == NM_WELL_MODEL::Horizontal_Fractured_Well) {
|
|
|
|
|
nmDataHorizontalFracturedWell* fracturedWell = dynamic_cast<nmDataHorizontalFracturedWell*>(pTargetWell);
|
|
|
|
|
@ -1389,6 +1409,7 @@ void nmWxAutomaticFitting::setAutomaticFittingValue()
|
|
|
|
|
nmDataAttribute dfc = fracturedWell->getDfc();
|
|
|
|
|
dfc.setValue(newFractureConductivityValue);
|
|
|
|
|
fracturedWell->setDfc(dfc);
|
|
|
|
|
fracturedWell->getFractureHalfLength().setValue(newFractureHalfLengthValue);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -1622,6 +1643,7 @@ void nmWxAutomaticFitting::updateBestParametersToTable()
|
|
|
|
|
if(m_cfCheckBox->isChecked()) enabledParams.append(6); // 岩石压缩系数
|
|
|
|
|
if(m_swiCheckBox->isChecked()) enabledParams.append(7); // 初始含水饱和度
|
|
|
|
|
if(m_dfcCheckBox->isChecked()) enabledParams.append(8); // 裂缝导流能力
|
|
|
|
|
if(m_fractureHalfLengthCheckBox->isChecked()) enabledParams.append(9); // 裂缝半长
|
|
|
|
|
|
|
|
|
|
// 更新参数值和范围
|
|
|
|
|
for (int i = 0; i < bestSolution.size() && i < enabledParams.size(); ++i) {
|
|
|
|
|
|