|
|
|
|
@ -64,9 +64,47 @@
|
|
|
|
|
|
|
|
|
|
#include <QCoreApplication>
|
|
|
|
|
#include <QDebug>
|
|
|
|
|
#include <QDir>
|
|
|
|
|
#include <QFile>
|
|
|
|
|
#include <QFileInfo>
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
// 清空指定目录下的所有旧文件和子目录,但保留目录本身
|
|
|
|
|
bool clearDirectoryContents(const QString& dirPath)
|
|
|
|
|
{
|
|
|
|
|
if(dirPath.trimmed().isEmpty()) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QDir dir(dirPath);
|
|
|
|
|
if(dir.isRoot()) {
|
|
|
|
|
qDebug() << QString("Refuse to clear root directory: %1").arg(dirPath);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(!dir.exists()) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QFileInfoList entries = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::AllEntries | QDir::Hidden | QDir::System);
|
|
|
|
|
for(int i = 0; i < entries.size(); ++i) {
|
|
|
|
|
const QFileInfo& entry = entries.at(i);
|
|
|
|
|
bool bRemoved = false;
|
|
|
|
|
|
|
|
|
|
if(entry.isDir() && !entry.isSymLink()) {
|
|
|
|
|
bRemoved = clearDirectoryContents(entry.absoluteFilePath()) && dir.rmdir(entry.fileName());
|
|
|
|
|
} else {
|
|
|
|
|
bRemoved = QFile::remove(entry.absoluteFilePath());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(!bRemoved) {
|
|
|
|
|
qDebug() << QString("Failed to remove old result item: %1").arg(entry.absoluteFilePath());
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 多条PVT曲线都可能带压力横坐标,只保存第一次读到的有效横坐标
|
|
|
|
|
void setPebiPressureIfEmpty(nmDataPvtParaForPebi* pPvtPara, const QVector<double>& vecX)
|
|
|
|
|
@ -1497,10 +1535,6 @@ void nmDataAnalyzeManager::initPvtParaFromSubFit()
|
|
|
|
|
Q_ASSERT(nullptr != pSubWndFitting);
|
|
|
|
|
Q_ASSERT(nullptr != pContextProvider);
|
|
|
|
|
|
|
|
|
|
// 获取PEBI网格需要的Pvt数据
|
|
|
|
|
// 定义返回结果的 QMap
|
|
|
|
|
QMap<QString, double> mapPebiPvtPara;
|
|
|
|
|
|
|
|
|
|
if(nullptr != pSubWndFitting && nullptr != pContextProvider) {
|
|
|
|
|
PvtFluidType eType = WFT_Null;
|
|
|
|
|
pContextProvider->getBasicPft(pSubWndFitting, eType);
|
|
|
|
|
@ -1510,34 +1544,6 @@ void nmDataAnalyzeManager::initPvtParaFromSubFit()
|
|
|
|
|
bool bReadWaterPvt = false;
|
|
|
|
|
resolvePvtPhaseReadFlags(eType, bReadOilPvt, bReadGasPvt, bReadWaterPvt);
|
|
|
|
|
|
|
|
|
|
QStringList listPvtParas;
|
|
|
|
|
// 单值参数同样按当前相态筛选,避免读取不存在的Phase子窗口
|
|
|
|
|
if(bReadOilPvt) {
|
|
|
|
|
listPvtParas << "Pb" //压力, MPa
|
|
|
|
|
<< "Rs" //溶解气油比, m^3/m^3
|
|
|
|
|
<< "Bo" //油体积系数, m^3/m^3
|
|
|
|
|
<< "Co" //油压缩系数, 1/MPa
|
|
|
|
|
<< "Miuo" //油粘度, mPa·s
|
|
|
|
|
<< "Rhoo"; //油密度, kg/m^3
|
|
|
|
|
}
|
|
|
|
|
if(bReadGasPvt) {
|
|
|
|
|
listPvtParas << "Rv" //凝析油气比, m^3/m^3
|
|
|
|
|
<< "Bg" //气体积系数, m^3/m^3
|
|
|
|
|
<< "Cg" //气压缩系数, 1/MPa
|
|
|
|
|
<< "Miug" //气粘度, mPa·s
|
|
|
|
|
<< "Rhog" //气密度, kg/m^3
|
|
|
|
|
<< "Zg"; //气偏差因子, 1
|
|
|
|
|
}
|
|
|
|
|
if(bReadWaterPvt) {
|
|
|
|
|
listPvtParas << "Rsw" //溶解气水比, m^3/m^3
|
|
|
|
|
<< "Bw" //水体积系数, m^3/m^3
|
|
|
|
|
<< "Cw" //水压缩系数, 1/MPa
|
|
|
|
|
<< "Miuw" //水粘度, mPa·s
|
|
|
|
|
<< "Rhow"; //水密度, kg/m^3
|
|
|
|
|
}
|
|
|
|
|
// Ct/Cf为基础单值参数,保留原有读取逻辑
|
|
|
|
|
listPvtParas << "Ct"
|
|
|
|
|
<< "Cf";
|
|
|
|
|
|
|
|
|
|
//QVector<double> vecPressure; // 压力, MPa
|
|
|
|
|
QVector<double> vecRso; // 溶解气油比, m^3/m^3
|
|
|
|
|
@ -1556,7 +1562,6 @@ void nmDataAnalyzeManager::initPvtParaFromSubFit()
|
|
|
|
|
QVector<double> vecCw; // 水压缩系数, 1/MPa
|
|
|
|
|
QVector<double> vecMiuw; // 水粘度, mPa·s
|
|
|
|
|
QVector<double> vecRouw; // 水密度, kg/m^3
|
|
|
|
|
pContextProvider->getPvtParaValues(pSubWndFitting, listPvtParas, mapPebiPvtPara);
|
|
|
|
|
|
|
|
|
|
VecDouble vecX;
|
|
|
|
|
|
|
|
|
|
@ -1568,18 +1573,13 @@ void nmDataAnalyzeManager::initPvtParaFromSubFit()
|
|
|
|
|
|
|
|
|
|
m_pebiPvtPara = new nmDataPvtParaForPebi;
|
|
|
|
|
|
|
|
|
|
// 饱和压力为单值参数,读到时覆盖求解器默认值
|
|
|
|
|
if(mapPebiPvtPara.contains("Pb")) {
|
|
|
|
|
m_pebiPvtPara->setPb(nmDataAttribute("Pb", mapPebiPvtPara.value("Pb"), "MPa"));
|
|
|
|
|
}
|
|
|
|
|
// 气油比不按相态区分,所有情况都尝试读取
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Oil, "Rs", vecX, vecRso);
|
|
|
|
|
m_pebiPvtPara->setRso(vecRso);
|
|
|
|
|
setPebiPressureIfEmpty(m_pebiPvtPara, vecX);
|
|
|
|
|
|
|
|
|
|
// PVT结果曲线也只读取当前相态已有的页,缺失相态保留PEBI默认数据
|
|
|
|
|
// 其他PVT结果曲线只读取当前相态已有的页,缺失相态保留PEBI默认数据
|
|
|
|
|
if(bReadOilPvt) {
|
|
|
|
|
// 气油比
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Oil, "Rs", vecX, vecRso);
|
|
|
|
|
m_pebiPvtPara->setRso(vecRso);
|
|
|
|
|
setPebiPressureIfEmpty(m_pebiPvtPara, vecX);
|
|
|
|
|
|
|
|
|
|
// 油体积系数
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Oil, "Bo", vecX, vecBo);
|
|
|
|
|
m_pebiPvtPara->setBo(vecBo);
|
|
|
|
|
@ -1602,10 +1602,6 @@ void nmDataAnalyzeManager::initPvtParaFromSubFit()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(bReadGasPvt) {
|
|
|
|
|
// 凝析油气比
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Gas, "Rv", vecX, vecRv);
|
|
|
|
|
m_pebiPvtPara->setRv(vecRv);
|
|
|
|
|
setPebiPressureIfEmpty(m_pebiPvtPara, vecX);
|
|
|
|
|
|
|
|
|
|
// 气体积系数
|
|
|
|
|
pContextProvider->getPvtRstOf(pSubWndFitting, WellFluidType::WFT_Gas, "Bg", vecX, vecBg);
|
|
|
|
|
@ -3348,6 +3344,14 @@ bool nmDataAnalyzeManager::saveNmResult(QString sRstCode, iSubWndFitting* pSubWn
|
|
|
|
|
if(pContextProvider == nullptr || !pContextProvider->getSaveResultDir(pSubWndF, sRstCode, sDir)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// sDir为当前成果窗口目录
|
|
|
|
|
// 保存前先清空成果ID目录下的旧内容,避免旧RstWnd目录或残留文件继续被加载
|
|
|
|
|
QString sResultRootPath = QFileInfo(sDir).dir().absolutePath();
|
|
|
|
|
if(!clearDirectoryContents(sResultRootPath)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString sResultPath = sDir + "/Results";
|
|
|
|
|
this->ensureDirectoryExists(sResultPath);
|
|
|
|
|
// 将数据写入Json文件
|
|
|
|
|
@ -3603,6 +3607,12 @@ void nmDataAnalyzeManager::setUnstructuredGrid(vtkSmartPointer<vtkUnstructuredGr
|
|
|
|
|
m_pVtkUnstructuredGrid = grid;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::clearUnstructuredGrid()
|
|
|
|
|
{
|
|
|
|
|
// 释放当前分析持有的实时VTK网格对象,关闭网格窗口后不再保留旧网格。
|
|
|
|
|
m_pVtkUnstructuredGrid = nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
vtkSmartPointer<vtkUnstructuredGrid> nmDataAnalyzeManager::getUnstructuredGridCopy() const
|
|
|
|
|
{
|
|
|
|
|
vtkSmartPointer<vtkUnstructuredGrid> pCopyGrid = vtkSmartPointer<vtkUnstructuredGrid>::New();
|
|
|
|
|
|