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/mAlg/mAlgDefines/iParaManager.h

196 lines
5.9 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.

#pragma once
#include "Defines.h"
#include "mAlgDefines.h"
#include "mAlgDefines_global.h"
#include "mAlgMatrix.h"
class iModelOption;
class iDynSkinInfo;
// 参数管理类
class M_ALG_DEFINES_EXPORT iParaManager
{
public:
iParaManager();
~iParaManager();
public:
// 增加临时函数,限定某些模型,来测试无井储
// 含义:是否必须提供井储参数
bool isCdNeeded();
// 井型/油藏类型/边界类型/Assist
void setModelOption(iModelOption* pModelOption);
iModelOption* getModelOption();
// 参数传递
void setParaMap(QMap<QString, double>& map);
void setParamUnitMap(QMap<QString, QString>& map);
bool getParamValueUnit(QString sPara, QString& sUnit);
void setParaValue(QString sPara, double d);
bool getParaValue(QString sPara , double& d);
bool getParaValues(QStringList listParas, QVector<double>& vecValue);
// 把原来的"x1"之类,根据索引传递,查阅真实的,比如 ee,se,we,ne
// xIndex 从1开始即遇到"x1"则传入1
QString getBdyRealNameOf(int xIndex);
// 是否包括某个参数的数值
bool isParaContained(QString sPara);
// 参数特殊处理
virtual void adjustParaName(QString& sPara);
virtual void adjustParaName_K(QString& sPara);
virtual void adjustParaValue(QString sPara, double& d); //取完参数之后,允许再次调整
// 是否某个参数的数据即从map中清除
// n: 0 即单参数map 1一维数组map 2二维数组map
bool freeDataOfPara(QString sPara, int n);
bool freeDataOfPara(QStringList listParas, int n);
// 一维数组
bool getParaArrValue(QString sPara, VecDouble& vec);
void setParaArrValue(QString sPara, VecDouble vec);
// 二维数组
bool getParaArrArrValue(QString sPara, VVecDouble& vvec);
void setParaArrArrValue(QString sPara, VVecDouble vvec);
// 矩阵
bool getParaMatrixValue(QString sPara, WtaiMatrix& mat);
void setParaMatrixValue(QString sPara, WtaiMatrix mat);
bool getParaVecMatrixValue(QString sPara, QVector<WtaiMatrix>& vecMat);
void setParaVecMatrixValue(QString sPara, QVector<WtaiMatrix> vecMat);
// EndQ
void setEndQ(double dQ);
double getEndQ();
// 所有流量数值
void setAllQs(VecDouble& vec);
//清空数据(每运行一次都清空数据)主要是清空数组数据
void clearArrMap();
//得到常数参数3.6-3.55292376017765
double getSpecialConstant();
// 获取渗透率数值通常是K但是也有可能是其他
// 比如计算探测半径时用的K值为哪一个
bool getPossibleValueK(double& d);
/// @brief 获取这些参数标识的数值
/// @param d,结果
/// @param listKeys具体哪些参数
/// @param n:计算方式0取存在的第一个 1取存在的最后一个 2/2+:取存在的所有的算术平均
/// @note 如果全都不存在则返回false
bool getPossibleValueOf(double& d, const QStringList listKeys, int n = 0);
public:
// 计算CD入口函数
virtual bool calCD();
virtual bool calCDCommon(double& A);
bool calCDDualPro(double& A);
bool calCDDualPer(double& A);
bool calCDMedComp(double& A);
bool calCDTLayCrosComp(double& A);
bool calCDTHmgenWt(double& A);
// 参数计算入口函数
virtual bool calParam();
virtual bool calTDIM();
virtual bool calTDIM_Wxd();
virtual bool calPDIM();
virtual bool calPDIM_Wxd();
virtual bool calRcIM();
virtual bool calRc();
/// @brief 计算探测半径的具体实现函数
/// @param dRc返回的结果单位m
/// @param dt测试时间单位h
/// @param dRcIM为过程中间变量具体参见 calRcIM ,其实就是 K / (phi * Miuo * Ct)
/// 如果不传入,则认为需要重新进行计算
/// @note 涉及两处, 一是解释结果,含义:这次试井测试,从开始到结束,压力波最远传到了哪里
/// 二是鼠标移动过程tips含义在测试过程中压力波此时此刻传到了哪里
virtual bool calRc(double& dRc, double dt, double dRcIM = SYS_VALUE_INVALID);
// 普通井的量纲转换需要变化
virtual bool calTDIMCommon(double& A);
bool calTDIMDualPro(double& A);
bool calTDIMDualPer(double& A);
bool calTDIMMedComp(double& A);
bool calTDIMTLayCrosComp(double& A);
bool calTDIMTHmgenWt(double& A);
virtual bool calPDIMCommon(double& A);
bool calPDIMDualPer(double& A);
bool calPDIMMedComp(double& A);
bool calPDIMTLayCrosComp(double& A);
bool calPHYDIM(double& A);
// 数值解
bool calyD();
bool findParam(QString sPara, double &d);
public:
// 是否启用混合黏度
void setEnableMux(bool b);
bool getEnableMux();
// 允许在计算之后,对结果进行个别计算或调整
virtual void adjustParaResults();
// 增加对于变表皮的处理
void setDynSkinInfo(iDynSkinInfo* p);
// 当前是否正在获取动态的表皮模式(开关)
// 只有在计算历史压力曲线时才设置为true
void setHistRunning(bool b);
// 当前操作的流动段索引,为了获取前一流量
void setHistSegIndex(int n);
#ifdef QT_DEBUG
void assertPara(QString sPara, bool bSetValue);
#endif
QString getLastError();
void resetError();
public:
// 单个参数map
QMap<QString, double> m_mapParas;
QMap<QString, QString> m_mapParasUnit;
// 参数对应数组
QMap<QString, VecDouble> m_mapArrParas;
// 二维数组
QMap<QString, VVecDouble> m_mapArrArrParas;
QMap<QString, WtaiMatrix >m_mapMatrixParas;
QMap<QString, QVector<WtaiMatrix> >m_mapVecMatrixParas;
//黏度是否启用混合黏度
bool m_bEnableMux;
double m_dEndQ;
protected:
iModelOption* m_pModelOption;
// 变表皮
iDynSkinInfo* m_pDynSkinInfo;
// 错误信息
QString m_sError;
};