|
|
|
|
@ -239,7 +239,7 @@ void nmWxAutomaticFitting::setParameterRange(int parameterIndex,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 根据当前初值生成建议搜索范围,并始终截断在拟合边界内。skin 下界为 0,
|
|
|
|
|
// 上界按初值加固定宽度,其余正值参数使用倍率范围;首次加载和拟合完成后复用。
|
|
|
|
|
// 上界按初值加固定宽度,其余正值参数使用倍率范围;每次打开窗口和拟合完成后复用。
|
|
|
|
|
void nmWxAutomaticFitting::updateRangeForParameter(int parameterIndex,
|
|
|
|
|
double centerValue)
|
|
|
|
|
{
|
|
|
|
|
@ -306,7 +306,7 @@ void nmWxAutomaticFitting::updateRangeForParameter(int parameterIndex,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 按当前表格中的初值为所有参数建立建议范围,首次加载和拟合完成后共用。
|
|
|
|
|
// 按当前表格中的初值为所有参数建立建议范围,每次打开窗口和拟合完成后共用。
|
|
|
|
|
void nmWxAutomaticFitting::initializeSuggestedParameterRanges()
|
|
|
|
|
{
|
|
|
|
|
if(!m_parameterTable) {
|
|
|
|
|
@ -333,57 +333,6 @@ void nmWxAutomaticFitting::initializeSuggestedParameterRanges()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 校正已保存的范围:保留物理边界内的用户区间,无交集时按当前初值生成兜底区间。
|
|
|
|
|
void nmWxAutomaticFitting::normalizeSavedParameterRanges()
|
|
|
|
|
{
|
|
|
|
|
if(!m_parameterTable) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for(int parameterIndex = 0; parameterIndex < 7; ++parameterIndex) {
|
|
|
|
|
QTableWidgetItem* minItem = m_parameterTable->item(parameterIndex, 2);
|
|
|
|
|
QTableWidgetItem* maxItem = m_parameterTable->item(parameterIndex, 4);
|
|
|
|
|
QTableWidgetItem* initialItem = m_parameterTable->item(parameterIndex, 3);
|
|
|
|
|
if(!minItem || !maxItem || !initialItem) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double physicalMin = 0.0;
|
|
|
|
|
double physicalMax = 0.0;
|
|
|
|
|
if(!getPhysicalParameterRange(parameterIndex, physicalMin, physicalMax)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
bool savedMinOk = false;
|
|
|
|
|
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
|
|
|
|
|
&& !(parameterIndex == 5 && savedMax <= 1.0e-10);
|
|
|
|
|
|
|
|
|
|
if(savedRangeValid && physicalMax >= physicalMin) {
|
|
|
|
|
const double clippedMin = qMax(savedMin, physicalMin);
|
|
|
|
|
const double clippedMax = qMin(savedMax, physicalMax);
|
|
|
|
|
if(clippedMax >= clippedMin) {
|
|
|
|
|
setParameterRange(parameterIndex, clippedMin, clippedMax);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 已保存范围无效或与物理边界无交集时,按数据对象初值重新生成。
|
|
|
|
|
bool initialOk = false;
|
|
|
|
|
const double initialValue = initialItem->text().toDouble(&initialOk);
|
|
|
|
|
if(initialOk && nmAutoFitUiIsFinite(initialValue)) {
|
|
|
|
|
updateRangeForParameter(parameterIndex, initialValue);
|
|
|
|
|
} else if(physicalMax >= physicalMin) {
|
|
|
|
|
setParameterRange(parameterIndex, physicalMin, physicalMax);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 校验当前表格中的参数范围;parameterIndex 为 -1 时检查所有可见参数行。
|
|
|
|
|
bool nmWxAutomaticFitting::validateParameterTable(QString& errorMessage, int parameterIndex)
|
|
|
|
|
{
|
|
|
|
|
@ -493,7 +442,6 @@ nmWxAutomaticFitting::nmWxAutomaticFitting(QWidget *parent)
|
|
|
|
|
nmDataAnalyzeManager* pManager = nmDataAnalyzeManager::getCurrentInstance();
|
|
|
|
|
reservoirData = pManager->getReservoirDataCopy();
|
|
|
|
|
automaticFittingData = pManager->getAutomaticFittingDataCopy();
|
|
|
|
|
const bool hasSavedFittingData = pManager && pManager->getAutomaticFittingData() != nullptr;
|
|
|
|
|
// 自动范围始终开启;用户在表格中修改上下限后,itemChanged 会临时切换为手工范围。
|
|
|
|
|
m_autoParameterRanges = true;
|
|
|
|
|
|
|
|
|
|
@ -505,11 +453,8 @@ nmWxAutomaticFitting::nmWxAutomaticFitting(QWidget *parent)
|
|
|
|
|
if(m_targetWellCombo->count() > 0) {
|
|
|
|
|
onWellSelected(0); // 默认选中第一口井
|
|
|
|
|
}
|
|
|
|
|
if(!hasSavedFittingData) {
|
|
|
|
|
// 每次打开都按当前模型参数生成范围,不沿用上次的上下限。
|
|
|
|
|
initializeSuggestedParameterRanges();
|
|
|
|
|
} else {
|
|
|
|
|
normalizeSavedParameterRanges();
|
|
|
|
|
}
|
|
|
|
|
m_updatingParameterRanges = false;
|
|
|
|
|
|
|
|
|
|
DEBUG_UI("AutoFitting Constructor completed");
|
|
|
|
|
|