|
|
|
@ -12,7 +12,7 @@
|
|
|
|
#include "nmCalculation_global.h"
|
|
|
|
#include "nmCalculation_global.h"
|
|
|
|
|
|
|
|
|
|
|
|
// 固定对数时间窗口的误差诊断。时间边界为不含重叠区的基础边界;
|
|
|
|
// 固定对数时间窗口的误差诊断。时间边界为不含重叠区的基础边界;
|
|
|
|
// rmsError 是局部加权均方根,energy 是对 total 平方的贡献。
|
|
|
|
// rmsError 是局部加权均方根,energy 是对当前层残差能量的贡献。
|
|
|
|
struct AutoFitTimeWindowLM {
|
|
|
|
struct AutoFitTimeWindowLM {
|
|
|
|
double timeMin;
|
|
|
|
double timeMin;
|
|
|
|
double timeMax;
|
|
|
|
double timeMax;
|
|
|
|
@ -25,14 +25,19 @@ struct AutoFitTimeWindowLM {
|
|
|
|
{}
|
|
|
|
{}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 双对数曲线误差分解。total 是 LM 候选接受和排序的唯一依据,
|
|
|
|
// 双对数曲线误差分解。预调整使用纵向偏差,形状阶段使用双曲线斜率残差,
|
|
|
|
// 时间窗口和残差用于 Fisher 选参,其余诊断量用于解释曲线失配。
|
|
|
|
// 整体阶段只使用 total 接受候选;时间窗口和残差用于 Fisher 选参。
|
|
|
|
struct AutoFitObjectiveBreakdownLM {
|
|
|
|
struct AutoFitObjectiveBreakdownLM {
|
|
|
|
bool valid;
|
|
|
|
bool valid;
|
|
|
|
double total;
|
|
|
|
double total;
|
|
|
|
double pressureLoss;
|
|
|
|
double pressureLoss;
|
|
|
|
double derivativeLoss;
|
|
|
|
double derivativeLoss;
|
|
|
|
QVector<double> residualVector;
|
|
|
|
QVector<double> residualVector;
|
|
|
|
|
|
|
|
// 分层模式的残差属于当前层,total 属于全部目标点;固定模式坐标数组为空。
|
|
|
|
|
|
|
|
QVector<double> sampleCoordinates;
|
|
|
|
|
|
|
|
int samplingStride;
|
|
|
|
|
|
|
|
int fullPointCount;
|
|
|
|
|
|
|
|
double layerError;
|
|
|
|
QVector<AutoFitTimeWindowLM> timeWindows;
|
|
|
|
QVector<AutoFitTimeWindowLM> timeWindows;
|
|
|
|
double verticalCommonBias;
|
|
|
|
double verticalCommonBias;
|
|
|
|
double verticalLoss;
|
|
|
|
double verticalLoss;
|
|
|
|
@ -41,6 +46,10 @@ struct AutoFitObjectiveBreakdownLM {
|
|
|
|
double horizontalLoss;
|
|
|
|
double horizontalLoss;
|
|
|
|
bool horizontalReliable;
|
|
|
|
bool horizontalReliable;
|
|
|
|
bool registrationAmbiguous;
|
|
|
|
bool registrationAmbiguous;
|
|
|
|
|
|
|
|
// 固定 log-time 网格上的双曲线斜率残差,独立于数值残差的采样层级。
|
|
|
|
|
|
|
|
QVector<double> shapeResiduals;
|
|
|
|
|
|
|
|
double pressureVerticalBias;
|
|
|
|
|
|
|
|
double derivativeVerticalBias;
|
|
|
|
double shapeLoss;
|
|
|
|
double shapeLoss;
|
|
|
|
double lateDerivativeSlopeBias;
|
|
|
|
double lateDerivativeSlopeBias;
|
|
|
|
double lateDerivativeTrendLoss;
|
|
|
|
double lateDerivativeTrendLoss;
|
|
|
|
@ -51,6 +60,9 @@ struct AutoFitObjectiveBreakdownLM {
|
|
|
|
, total(1.0e10)
|
|
|
|
, total(1.0e10)
|
|
|
|
, pressureLoss(std::numeric_limits<double>::quiet_NaN())
|
|
|
|
, pressureLoss(std::numeric_limits<double>::quiet_NaN())
|
|
|
|
, derivativeLoss(std::numeric_limits<double>::quiet_NaN())
|
|
|
|
, derivativeLoss(std::numeric_limits<double>::quiet_NaN())
|
|
|
|
|
|
|
|
, samplingStride(1)
|
|
|
|
|
|
|
|
, fullPointCount(80)
|
|
|
|
|
|
|
|
, layerError(1.0e10)
|
|
|
|
, verticalCommonBias(std::numeric_limits<double>::quiet_NaN())
|
|
|
|
, verticalCommonBias(std::numeric_limits<double>::quiet_NaN())
|
|
|
|
, verticalLoss(std::numeric_limits<double>::quiet_NaN())
|
|
|
|
, verticalLoss(std::numeric_limits<double>::quiet_NaN())
|
|
|
|
, verticalReliable(false)
|
|
|
|
, verticalReliable(false)
|
|
|
|
@ -58,6 +70,8 @@ struct AutoFitObjectiveBreakdownLM {
|
|
|
|
, horizontalLoss(std::numeric_limits<double>::quiet_NaN())
|
|
|
|
, horizontalLoss(std::numeric_limits<double>::quiet_NaN())
|
|
|
|
, horizontalReliable(false)
|
|
|
|
, horizontalReliable(false)
|
|
|
|
, registrationAmbiguous(false)
|
|
|
|
, registrationAmbiguous(false)
|
|
|
|
|
|
|
|
, pressureVerticalBias(0.0)
|
|
|
|
|
|
|
|
, derivativeVerticalBias(0.0)
|
|
|
|
, shapeLoss(std::numeric_limits<double>::quiet_NaN())
|
|
|
|
, shapeLoss(std::numeric_limits<double>::quiet_NaN())
|
|
|
|
, lateDerivativeSlopeBias(std::numeric_limits<double>::quiet_NaN())
|
|
|
|
, lateDerivativeSlopeBias(std::numeric_limits<double>::quiet_NaN())
|
|
|
|
, lateDerivativeTrendLoss(std::numeric_limits<double>::quiet_NaN())
|
|
|
|
, lateDerivativeTrendLoss(std::numeric_limits<double>::quiet_NaN())
|
|
|
|
@ -97,6 +111,7 @@ public:
|
|
|
|
int getTotalEvaluations() const;
|
|
|
|
int getTotalEvaluations() const;
|
|
|
|
void resetOptimizer();
|
|
|
|
void resetOptimizer();
|
|
|
|
void setTargetWellName(const QString& wellName);
|
|
|
|
void setTargetWellName(const QString& wellName);
|
|
|
|
|
|
|
|
void setLayeredSamplingEnabled(bool enabled);
|
|
|
|
|
|
|
|
|
|
|
|
signals:
|
|
|
|
signals:
|
|
|
|
void progressUpdated(int iteration, double bestFitness);
|
|
|
|
void progressUpdated(int iteration, double bestFitness);
|
|
|
|
@ -125,7 +140,7 @@ private:
|
|
|
|
AutoFitObjectiveBreakdownLM* breakdown,
|
|
|
|
AutoFitObjectiveBreakdownLM* breakdown,
|
|
|
|
QVector<QVector<double> >* curve,
|
|
|
|
QVector<QVector<double> >* curve,
|
|
|
|
int* elapsedMs);
|
|
|
|
int* elapsedMs);
|
|
|
|
double evaluateFitness(const QVector<double>& parameters);
|
|
|
|
double evaluateFitness(const QVector<double>& parameters, bool retrySolver = true);
|
|
|
|
|
|
|
|
|
|
|
|
void applyParametersToDataManager(const QVector<double>& parameters);
|
|
|
|
void applyParametersToDataManager(const QVector<double>& parameters);
|
|
|
|
void updateReservoirParameters(const QVector<double>& parameters);
|
|
|
|
void updateReservoirParameters(const QVector<double>& parameters);
|
|
|
|
@ -191,6 +206,9 @@ private:
|
|
|
|
double m_comparisonTimeMin;
|
|
|
|
double m_comparisonTimeMin;
|
|
|
|
double m_comparisonTimeMax;
|
|
|
|
double m_comparisonTimeMax;
|
|
|
|
QString m_targetWellName;
|
|
|
|
QString m_targetWellName;
|
|
|
|
|
|
|
|
// 此开关由拟合界面传入;每轮重置层级,固定模式仍使用原来的 80 点目标。
|
|
|
|
|
|
|
|
bool m_layeredSampling;
|
|
|
|
|
|
|
|
int m_samplingStride;
|
|
|
|
|
|
|
|
|
|
|
|
int m_maxIterations;
|
|
|
|
int m_maxIterations;
|
|
|
|
double m_targetError;
|
|
|
|
double m_targetError;
|
|
|
|
|