You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Include/nmNum/nmData/nmDataDiagnostic.h

146 lines
4.6 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "nmData_global.h"
#include "nmDefines.h"
#include "nmDataAttribute.h"
#include "nmDataBase.h"
// 前向声明
class nmDataWellBase;
class nmDataReservoir;
class NM_DATA_EXPORT nmDataDiagnostic : public nmDataBase
{
Q_OBJECT
public:
nmDataDiagnostic();
~nmDataDiagnostic();
// 序列化方法
virtual rapidjson::Value ToJsonValue(rapidjson::Document::AllocatorType& allocator) const override;
virtual void FromJsonValue(const rapidjson::Value& jsonValue) override;
// 主诊断方法 - 按顺序计算 C、kh、k、S
void resetFromDiagnostic(const QVector<QVector<double>>& rawData,
nmDataWellBase* pWell,
nmDataReservoir* pReservoir);
// 结果获取方法
nmDataAttribute& getDiagnosticPermeability();
nmDataAttribute& getDiagnosticSkin();
nmDataAttribute& getDiagnosticWellboreStorage();
nmDataAttribute& getDiagnosticTransmissibility();
private:
// 计算井筒储存系数
void calculateWellboreStorage(const QVector<QVector<double>>& rawData,
nmDataWellBase* pWell, nmDataReservoir* pReservoir);
//计算导流能力
void calculateTransmissibility(const QVector<QVector<double>>& rawData,
nmDataWellBase* pWell, nmDataReservoir* pReservoir);
//计算渗透率
void calculatePermeability(nmDataWellBase* pWell, nmDataReservoir* pReservoir);
//寻找最接近目标斜率的数据点对
QPair<int, int> findClosestSlopeToValue(const QVector<double>& timeData,
const QVector<double>& pressureDropData,
int pointCount, double targetSlope);
//计算两点间的双对数斜率
double calculateSlopeBetweenPoints(double t1, double deltaP1, double t2, double deltaP2);
//线性插值获取指定时间的压力值
double interpolatePressureAtTime(const QVector<double>& timeData,
const QVector<double>& pressureDropData,
double targetTime);
//寻找压力导数平台段
QPair<int, int> findDerivativePlatform(
const QVector<double>& timeData,
const QVector<double>& derivativeData,
int startPoint, int pointCount);
//计算数据段的斜率变化程度
double calculateSlopeVariation(
const QVector<double>& timeData,
const QVector<double>& derivativeData,
int start, int end);
//流动阶段分析结果结构体
struct FlowRegimeAnalysis {
QPair<int, int> pointPair;
double slope;
double slopeDifference;
double avgTime;
double avgPressure;
double result;
QString description;
bool isValid;
FlowRegimeAnalysis() : pointPair(-1, -1), slope(-1), slopeDifference(999),
avgTime(0), avgPressure(0), result(0), isValid(false) {}
};
//通用流动阶段分析方法
FlowRegimeAnalysis analyzeFlowRegime(const QVector<double>& timeData,
const QVector<double>& pressureDropData,
int pointCount, double targetSlope,
const QString& regimeName,
nmDataWellBase* pWell, nmDataReservoir* pReservoir);
//kh诊断的径向流分析
FlowRegimeAnalysis analyzeRadialFlowForKh(
const QVector<double>& timeData,
const QVector<double>& derivativeData,
int startPoint, int pointCount,
nmDataWellBase* pWell, nmDataReservoir* pReservoir);
//方法1标准径向流平台分析
FlowRegimeAnalysis analyzeStandardRadialFlow(
const QVector<double>& timeData,
const QVector<double>& derivativeData,
int availablePoints,
nmDataWellBase* pWell, nmDataReservoir* pReservoir);
//方法2晚期数据分析
FlowRegimeAnalysis analyzeSaphirStyleLateTime(
const QVector<double>& timeData,
const QVector<double>& derivativeData,
int availablePoints,
nmDataWellBase* pWell, nmDataReservoir* pReservoir);
//方法3早中期稳定段分析
FlowRegimeAnalysis analyzeEarlyStableFlow(
const QVector<double>& timeData,
const QVector<double>& derivativeData,
int availablePoints,
nmDataWellBase* pWell, nmDataReservoir* pReservoir);
//寻找最小导数值段
QPair<int, int> findMinimumDerivativeSegment(
const QVector<double>& timeData,
const QVector<double>& derivativeData,
int startPoint, int endPoint);
//寻找最稳定的导数段
QPair<int, int> findMostStableDerivativeSegment(
const QVector<double>& derivativeData,
int startPoint, int endPoint);
//计算变异系数(稳定性评估)
double calculateVariationCoefficient(
const QVector<double>& data, int start, int end);
//智能选择最佳导流能力分析方法
FlowRegimeAnalysis* selectBestTransmissibilityAnalysis(
FlowRegimeAnalysis& standardRadial,
FlowRegimeAnalysis& saphirStyle,
FlowRegimeAnalysis& earlyStable);
private:
nmDataAttribute m_diagnosticSkin; // 表皮系数
nmDataAttribute m_diagnosticWellboreStorage; // 井筒储存系数
nmDataAttribute m_diagnosticPermeability; // 渗透率
nmDataAttribute m_diagnosticTransmissibility; // 导流能力
};