|
|
|
@ -1529,6 +1529,9 @@ void nmDataAnalyzeManager::endBackgroundUse()
|
|
|
|
|
|
|
|
|
|
|
|
nmDataWellBase *nmDataAnalyzeManager::createWell(NM_WELL_MODEL eWellType)
|
|
|
|
nmDataWellBase *nmDataAnalyzeManager::createWell(NM_WELL_MODEL eWellType)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread("createWell")) {
|
|
|
|
|
|
|
|
return nullptr;
|
|
|
|
|
|
|
|
}
|
|
|
|
// 根据当前Fitting窗口来获取对应的井相关数据
|
|
|
|
// 根据当前Fitting窗口来获取对应的井相关数据
|
|
|
|
iSubWndFitting* pSubWndFitting = nmDataAnalyzeManager::getCurrentFitting();
|
|
|
|
iSubWndFitting* pSubWndFitting = nmDataAnalyzeManager::getCurrentFitting();
|
|
|
|
nmDataAnalyzeContextProvider* pContextProvider = nmDataAnalyzeContext::provider();
|
|
|
|
nmDataAnalyzeContextProvider* pContextProvider = nmDataAnalyzeContext::provider();
|
|
|
|
@ -1571,7 +1574,7 @@ nmDataWellBase *nmDataAnalyzeManager::createWell(NM_WELL_MODEL eWellType)
|
|
|
|
|
|
|
|
|
|
|
|
// Map 中增加真实井会改变井约束点和求解器井槽位,旧网格必须立即失效。
|
|
|
|
// Map 中增加真实井会改变井约束点和求解器井槽位,旧网格必须立即失效。
|
|
|
|
m_vWellData.append(pWellData);
|
|
|
|
m_vWellData.append(pWellData);
|
|
|
|
m_oNumericalAnalysisCase.invalidateGrid();
|
|
|
|
invalidatePebiGrid();
|
|
|
|
emit dataChanged();
|
|
|
|
emit dataChanged();
|
|
|
|
return pWellData;
|
|
|
|
return pWellData;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -1658,6 +1661,9 @@ bool nmDataAnalyzeManager::canRemoveWell(
|
|
|
|
|
|
|
|
|
|
|
|
bool nmDataAnalyzeManager::removeWell(nmDataWellBase* pWellData)
|
|
|
|
bool nmDataAnalyzeManager::removeWell(nmDataWellBase* pWellData)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread("removeWell")) {
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
// 固定主井及非法指针必须在任何版本递增、图元解绑和对象删除前拒绝。
|
|
|
|
// 固定主井及非法指针必须在任何版本递增、图元解绑和对象删除前拒绝。
|
|
|
|
// 该检查是数据层最终兜底,不能只依赖 Map 界面的提前拦截。
|
|
|
|
// 该检查是数据层最终兜底,不能只依赖 Map 界面的提前拦截。
|
|
|
|
if(!canRemoveWell(pWellData)) {
|
|
|
|
if(!canRemoveWell(pWellData)) {
|
|
|
|
@ -1670,7 +1676,7 @@ bool nmDataAnalyzeManager::removeWell(nmDataWellBase* pWellData)
|
|
|
|
|
|
|
|
|
|
|
|
// 第二步:Map 中删除任意真实井都会改变网格井集合。即使它是自动参与的
|
|
|
|
// 第二步:Map 中删除任意真实井都会改变网格井集合。即使它是自动参与的
|
|
|
|
// 无产量观察井,也必须让旧网格、旧求解器顺序和旧结果一起失效。
|
|
|
|
// 无产量观察井,也必须让旧网格、旧求解器顺序和旧结果一起失效。
|
|
|
|
m_oNumericalAnalysisCase.invalidateGrid();
|
|
|
|
invalidatePebiGrid();
|
|
|
|
|
|
|
|
|
|
|
|
// 第三步:删除井对象前,先从“包含其他井”中移除对应 WellCode。
|
|
|
|
// 第三步:删除井对象前,先从“包含其他井”中移除对应 WellCode。
|
|
|
|
QVector<nmCalculationWellRef> vecIncludedWells =
|
|
|
|
QVector<nmCalculationWellRef> vecIncludedWells =
|
|
|
|
@ -2006,6 +2012,9 @@ nmDataWellBase* nmDataAnalyzeManager::findWellByInstanceId(
|
|
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::initCurWellData()
|
|
|
|
void nmDataAnalyzeManager::initCurWellData()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread("initCurWellData")) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
// 获取当前默认井数据
|
|
|
|
// 获取当前默认井数据
|
|
|
|
ZxDataWell* pWellData = zxCurWell;
|
|
|
|
ZxDataWell* pWellData = zxCurWell;
|
|
|
|
if(pWellData == nullptr) {
|
|
|
|
if(pWellData == nullptr) {
|
|
|
|
@ -2178,12 +2187,15 @@ void nmDataAnalyzeManager::initCurWellData()
|
|
|
|
if(m_oNumericalAnalysisCase.getPrimaryWellCode().isEmpty() &&
|
|
|
|
if(m_oNumericalAnalysisCase.getPrimaryWellCode().isEmpty() &&
|
|
|
|
m_pCurDataWell != nullptr &&
|
|
|
|
m_pCurDataWell != nullptr &&
|
|
|
|
!m_pCurDataWell->getWellCode().isEmpty()) {
|
|
|
|
!m_pCurDataWell->getWellCode().isEmpty()) {
|
|
|
|
|
|
|
|
const PebiResultStateSnapshot oPreviousResultState =
|
|
|
|
|
|
|
|
capturePebiResultState();
|
|
|
|
const QString sPrimaryWellCode = m_pCurDataWell->getWellCode();
|
|
|
|
const QString sPrimaryWellCode = m_pCurDataWell->getWellCode();
|
|
|
|
m_oNumericalAnalysisCase.setPrimaryWellCode(sPrimaryWellCode);
|
|
|
|
m_oNumericalAnalysisCase.setPrimaryWellCode(sPrimaryWellCode);
|
|
|
|
m_oNumericalAnalysisCase.setPrimaryWellMode(
|
|
|
|
m_oNumericalAnalysisCase.setPrimaryWellMode(
|
|
|
|
m_pCurDataWell->getFlowSegmentCount() > 0
|
|
|
|
m_pCurDataWell->getFlowSegmentCount() > 0
|
|
|
|
? NM_CaseWell_RateControlled
|
|
|
|
? NM_CaseWell_RateControlled
|
|
|
|
: NM_CaseWell_Observation);
|
|
|
|
: NM_CaseWell_Observation);
|
|
|
|
|
|
|
|
notifyPebiResultStateChangedIfNeeded(oPreviousResultState);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -2428,6 +2440,9 @@ nmDataWellBase* nmDataAnalyzeManager::appendWellData(ZxDataWell* pWellData)
|
|
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::appendNmWellData(nmDataWellBase* pWellData)
|
|
|
|
void nmDataAnalyzeManager::appendNmWellData(nmDataWellBase* pWellData)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread("appendNmWellData")) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
if (pWellData == nullptr)
|
|
|
|
if (pWellData == nullptr)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
bool bWellAdded = false;
|
|
|
|
bool bWellAdded = false;
|
|
|
|
@ -2441,7 +2456,7 @@ void nmDataAnalyzeManager::appendNmWellData(nmDataWellBase* pWellData)
|
|
|
|
// 使旧网格失效。已由 createWell() 登记的井不重复增加输入版本号。
|
|
|
|
// 使旧网格失效。已由 createWell() 登记的井不重复增加输入版本号。
|
|
|
|
if(bWellAdded)
|
|
|
|
if(bWellAdded)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
m_oNumericalAnalysisCase.invalidateGrid();
|
|
|
|
invalidatePebiGrid();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 通知面板新增井分组
|
|
|
|
// 通知面板新增井分组
|
|
|
|
@ -2462,6 +2477,9 @@ void nmDataAnalyzeManager::appendNmWellData(nmDataWellBase* pWellData)
|
|
|
|
bool nmDataAnalyzeManager::replaceWellData(nmDataWellBase* pOldWell,
|
|
|
|
bool nmDataAnalyzeManager::replaceWellData(nmDataWellBase* pOldWell,
|
|
|
|
nmDataWellBase* pNewWell)
|
|
|
|
nmDataWellBase* pNewWell)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread("replaceWellData")) {
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
// 先完成所有无副作用的前置校验,失败时保持双方所有权不变。
|
|
|
|
// 先完成所有无副作用的前置校验,失败时保持双方所有权不变。
|
|
|
|
if (pOldWell == nullptr || pNewWell == nullptr ||
|
|
|
|
if (pOldWell == nullptr || pNewWell == nullptr ||
|
|
|
|
pOldWell == pNewWell || m_vWellData.contains(pNewWell) ||
|
|
|
|
pOldWell == pNewWell || m_vWellData.contains(pNewWell) ||
|
|
|
|
@ -2495,7 +2513,7 @@ bool nmDataAnalyzeManager::replaceWellData(nmDataWellBase* pOldWell,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
m_vWellData.insert(qMin(nOldIndex, m_vWellData.size()), pNewWell);
|
|
|
|
m_vWellData.insert(qMin(nOldIndex, m_vWellData.size()), pNewWell);
|
|
|
|
// 井型改变会改变 PEBI 几何输入,旧求解器顺序和网格必须整体失效。
|
|
|
|
// 井型改变会改变 PEBI 几何输入,旧求解器顺序和网格必须整体失效。
|
|
|
|
m_oNumericalAnalysisCase.invalidateGrid();
|
|
|
|
invalidatePebiGrid();
|
|
|
|
if (bWasCurrentWell)
|
|
|
|
if (bWasCurrentWell)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
m_pCurDataWell = pNewWell;
|
|
|
|
m_pCurDataWell = pNewWell;
|
|
|
|
@ -3894,11 +3912,14 @@ NM_Grid_Type nmDataAnalyzeManager::getGridType()
|
|
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::setGridType(NM_Grid_Type newGridType)
|
|
|
|
void nmDataAnalyzeManager::setGridType(NM_Grid_Type newGridType)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread("setGridType")) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
if(m_eGridType == newGridType) {
|
|
|
|
if(m_eGridType == newGridType) {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
m_eGridType = newGridType;
|
|
|
|
m_eGridType = newGridType;
|
|
|
|
m_oNumericalAnalysisCase.invalidateGrid();
|
|
|
|
invalidatePebiGrid();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
NM_SOLVER_MODEL_TYPE nmDataAnalyzeManager::getSolverModelType() const
|
|
|
|
NM_SOLVER_MODEL_TYPE nmDataAnalyzeManager::getSolverModelType() const
|
|
|
|
@ -3908,11 +3929,14 @@ NM_SOLVER_MODEL_TYPE nmDataAnalyzeManager::getSolverModelType() const
|
|
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::setSolverModelType(NM_SOLVER_MODEL_TYPE newSolverModelType)
|
|
|
|
void nmDataAnalyzeManager::setSolverModelType(NM_SOLVER_MODEL_TYPE newSolverModelType)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread("setSolverModelType")) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
if(m_eSolverModelType == newSolverModelType) {
|
|
|
|
if(m_eSolverModelType == newSolverModelType) {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
m_eSolverModelType = newSolverModelType;
|
|
|
|
m_eSolverModelType = newSolverModelType;
|
|
|
|
m_oNumericalAnalysisCase.invalidateResults();
|
|
|
|
invalidatePebiResults();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int nmDataAnalyzeManager::getPebiSolverType() const
|
|
|
|
int nmDataAnalyzeManager::getPebiSolverType() const
|
|
|
|
@ -3922,11 +3946,14 @@ int nmDataAnalyzeManager::getPebiSolverType() const
|
|
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::setPebiSolverType(int nSolverType)
|
|
|
|
void nmDataAnalyzeManager::setPebiSolverType(int nSolverType)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread("setPebiSolverType")) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
if((nSolverType == PebiSolverCpuAccelerated ||
|
|
|
|
if((nSolverType == PebiSolverCpuAccelerated ||
|
|
|
|
nSolverType == PebiSolverOriginal) &&
|
|
|
|
nSolverType == PebiSolverOriginal) &&
|
|
|
|
m_nPebiSolverType != nSolverType) {
|
|
|
|
m_nPebiSolverType != nSolverType) {
|
|
|
|
m_nPebiSolverType = nSolverType;
|
|
|
|
m_nPebiSolverType = nSolverType;
|
|
|
|
m_oNumericalAnalysisCase.invalidateResults();
|
|
|
|
invalidatePebiResults();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -3937,11 +3964,14 @@ int nmDataAnalyzeManager::getPebiOmpThreads() const
|
|
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::setPebiOmpThreads(int nOmpThreads)
|
|
|
|
void nmDataAnalyzeManager::setPebiOmpThreads(int nOmpThreads)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread("setPebiOmpThreads")) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
if(nOmpThreads == 1 || nOmpThreads == 2 || nOmpThreads == 4
|
|
|
|
if(nOmpThreads == 1 || nOmpThreads == 2 || nOmpThreads == 4
|
|
|
|
|| nOmpThreads == 8 || nOmpThreads == 16) {
|
|
|
|
|| nOmpThreads == 8 || nOmpThreads == 16) {
|
|
|
|
if(m_nPebiOmpThreads != nOmpThreads) {
|
|
|
|
if(m_nPebiOmpThreads != nOmpThreads) {
|
|
|
|
m_nPebiOmpThreads = nOmpThreads;
|
|
|
|
m_nPebiOmpThreads = nOmpThreads;
|
|
|
|
m_oNumericalAnalysisCase.invalidateResults();
|
|
|
|
invalidatePebiResults();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -3953,10 +3983,13 @@ int nmDataAnalyzeManager::getPebiIluReuseSteps() const
|
|
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::setPebiIluReuseSteps(int nIluReuseSteps)
|
|
|
|
void nmDataAnalyzeManager::setPebiIluReuseSteps(int nIluReuseSteps)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread("setPebiIluReuseSteps")) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
if(nIluReuseSteps >= 1 && nIluReuseSteps <= 100 &&
|
|
|
|
if(nIluReuseSteps >= 1 && nIluReuseSteps <= 100 &&
|
|
|
|
m_nPebiIluReuseSteps != nIluReuseSteps) {
|
|
|
|
m_nPebiIluReuseSteps != nIluReuseSteps) {
|
|
|
|
m_nPebiIluReuseSteps = nIluReuseSteps;
|
|
|
|
m_nPebiIluReuseSteps = nIluReuseSteps;
|
|
|
|
m_oNumericalAnalysisCase.invalidateResults();
|
|
|
|
invalidatePebiResults();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -4161,9 +4194,12 @@ nmDataLayer* nmDataAnalyzeManager::getLayerData()
|
|
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::setLayers(QVector<nmDataLayer*> vecLayers)
|
|
|
|
void nmDataAnalyzeManager::setLayers(QVector<nmDataLayer*> vecLayers)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread("setLayers")) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
m_vecLayers = vecLayers;
|
|
|
|
m_vecLayers = vecLayers;
|
|
|
|
// 几何分层会改变储层离散输入,旧网格和旧结果不再有效。
|
|
|
|
// 几何分层会改变储层离散输入,旧网格和旧结果不再有效。
|
|
|
|
m_oNumericalAnalysisCase.invalidateGrid();
|
|
|
|
invalidatePebiGrid();
|
|
|
|
emit dataChanged();
|
|
|
|
emit dataChanged();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -4311,16 +4347,22 @@ nmDataAnalyzeManager::getNumericalAnalysisCase() const
|
|
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::setPrimaryWellCode(const QString& sWellCode)
|
|
|
|
void nmDataAnalyzeManager::setPrimaryWellCode(const QString& sWellCode)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread("setPrimaryWellCode")) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
if(!sWellCode.isEmpty() && findWellByCode(sWellCode) == nullptr) {
|
|
|
|
if(!sWellCode.isEmpty() && findWellByCode(sWellCode) == nullptr) {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const PebiResultStateSnapshot oPreviousResultState =
|
|
|
|
|
|
|
|
capturePebiResultState();
|
|
|
|
const quint64 nOldRevision =
|
|
|
|
const quint64 nOldRevision =
|
|
|
|
m_oNumericalAnalysisCase.getGridInputRevision();
|
|
|
|
m_oNumericalAnalysisCase.getGridInputRevision();
|
|
|
|
m_oNumericalAnalysisCase.setPrimaryWellCode(sWellCode);
|
|
|
|
m_oNumericalAnalysisCase.setPrimaryWellCode(sWellCode);
|
|
|
|
if(m_oNumericalAnalysisCase.getGridInputRevision() != nOldRevision) {
|
|
|
|
if(m_oNumericalAnalysisCase.getGridInputRevision() != nOldRevision) {
|
|
|
|
emit dataChanged();
|
|
|
|
emit dataChanged();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
notifyPebiResultStateChangedIfNeeded(oPreviousResultState);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QString nmDataAnalyzeManager::getPrimaryWellCode() const
|
|
|
|
QString nmDataAnalyzeManager::getPrimaryWellCode() const
|
|
|
|
@ -4330,12 +4372,18 @@ QString nmDataAnalyzeManager::getPrimaryWellCode() const
|
|
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::setIncludeOtherWells(bool bInclude)
|
|
|
|
void nmDataAnalyzeManager::setIncludeOtherWells(bool bInclude)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread("setIncludeOtherWells")) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
const PebiResultStateSnapshot oPreviousResultState =
|
|
|
|
|
|
|
|
capturePebiResultState();
|
|
|
|
const bool bOldInclude = m_oNumericalAnalysisCase.getIncludeOtherWells();
|
|
|
|
const bool bOldInclude = m_oNumericalAnalysisCase.getIncludeOtherWells();
|
|
|
|
m_oNumericalAnalysisCase.setIncludeOtherWells(bInclude);
|
|
|
|
m_oNumericalAnalysisCase.setIncludeOtherWells(bInclude);
|
|
|
|
if(bOldInclude != m_oNumericalAnalysisCase.getIncludeOtherWells()) {
|
|
|
|
if(bOldInclude != m_oNumericalAnalysisCase.getIncludeOtherWells()) {
|
|
|
|
// 开关只改变当前求解输入。最后结果下拉框继续使用快照冻结的 UUID 列表。
|
|
|
|
// 开关只改变当前求解输入。最后结果下拉框继续使用快照冻结的 UUID 列表。
|
|
|
|
emit dataChanged();
|
|
|
|
emit dataChanged();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
notifyPebiResultStateChangedIfNeeded(oPreviousResultState);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool nmDataAnalyzeManager::getIncludeOtherWells() const
|
|
|
|
bool nmDataAnalyzeManager::getIncludeOtherWells() const
|
|
|
|
@ -4345,6 +4393,11 @@ bool nmDataAnalyzeManager::getIncludeOtherWells() const
|
|
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::setPebiGridControl(double dGridControl)
|
|
|
|
void nmDataAnalyzeManager::setPebiGridControl(double dGridControl)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread("setPebiGridControl")) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
const PebiResultStateSnapshot oPreviousResultState =
|
|
|
|
|
|
|
|
capturePebiResultState();
|
|
|
|
const quint64 nOldGridInputRevision =
|
|
|
|
const quint64 nOldGridInputRevision =
|
|
|
|
m_oNumericalAnalysisCase.getGridInputRevision();
|
|
|
|
m_oNumericalAnalysisCase.getGridInputRevision();
|
|
|
|
m_oNumericalAnalysisCase.setPebiGridControl(dGridControl);
|
|
|
|
m_oNumericalAnalysisCase.setPebiGridControl(dGridControl);
|
|
|
|
@ -4353,6 +4406,7 @@ void nmDataAnalyzeManager::setPebiGridControl(double dGridControl)
|
|
|
|
// 分析方案已完成网格和结果失效,这里只通知已打开的网格窗口刷新。
|
|
|
|
// 分析方案已完成网格和结果失效,这里只通知已打开的网格窗口刷新。
|
|
|
|
emit dataChanged();
|
|
|
|
emit dataChanged();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
notifyPebiResultStateChangedIfNeeded(oPreviousResultState);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
double nmDataAnalyzeManager::getPebiGridControl() const
|
|
|
|
double nmDataAnalyzeManager::getPebiGridControl() const
|
|
|
|
@ -4363,6 +4417,11 @@ double nmDataAnalyzeManager::getPebiGridControl() const
|
|
|
|
void nmDataAnalyzeManager::setIncludedCalculationWells(
|
|
|
|
void nmDataAnalyzeManager::setIncludedCalculationWells(
|
|
|
|
const QVector<nmCalculationWellRef>& vecWells)
|
|
|
|
const QVector<nmCalculationWellRef>& vecWells)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread("setIncludedCalculationWells")) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
const PebiResultStateSnapshot oPreviousResultState =
|
|
|
|
|
|
|
|
capturePebiResultState();
|
|
|
|
const QVector<nmCalculationWellRef> vecOldWells =
|
|
|
|
const QVector<nmCalculationWellRef> vecOldWells =
|
|
|
|
m_oNumericalAnalysisCase.getIncludedWells();
|
|
|
|
m_oNumericalAnalysisCase.getIncludedWells();
|
|
|
|
QVector<nmCalculationWellRef> vecValidWells;
|
|
|
|
QVector<nmCalculationWellRef> vecValidWells;
|
|
|
|
@ -4399,6 +4458,7 @@ void nmDataAnalyzeManager::setIncludedCalculationWells(
|
|
|
|
// 第三步:这里只通知当前输入变化,不修改独立快照中的结果井选择。
|
|
|
|
// 第三步:这里只通知当前输入变化,不修改独立快照中的结果井选择。
|
|
|
|
emit dataChanged();
|
|
|
|
emit dataChanged();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
notifyPebiResultStateChangedIfNeeded(oPreviousResultState);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QVector<nmCalculationWellRef>
|
|
|
|
QVector<nmCalculationWellRef>
|
|
|
|
@ -4610,12 +4670,24 @@ bool nmDataAnalyzeManager::markPebiGridBuiltIfCurrent(
|
|
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::invalidatePebiGrid()
|
|
|
|
void nmDataAnalyzeManager::invalidatePebiGrid()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread("invalidatePebiGrid")) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
const PebiResultStateSnapshot oPreviousResultState =
|
|
|
|
|
|
|
|
capturePebiResultState();
|
|
|
|
m_oNumericalAnalysisCase.invalidateGrid();
|
|
|
|
m_oNumericalAnalysisCase.invalidateGrid();
|
|
|
|
|
|
|
|
notifyPebiResultStateChangedIfNeeded(oPreviousResultState);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::invalidatePebiResults()
|
|
|
|
void nmDataAnalyzeManager::invalidatePebiResults()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread("invalidatePebiResults")) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
const PebiResultStateSnapshot oPreviousResultState =
|
|
|
|
|
|
|
|
capturePebiResultState();
|
|
|
|
m_oNumericalAnalysisCase.invalidateResults();
|
|
|
|
m_oNumericalAnalysisCase.invalidateResults();
|
|
|
|
|
|
|
|
notifyPebiResultStateChangedIfNeeded(oPreviousResultState);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool nmDataAnalyzeManager::isPebiGridValid() const
|
|
|
|
bool nmDataAnalyzeManager::isPebiGridValid() const
|
|
|
|
@ -4649,6 +4721,59 @@ bool nmDataAnalyzeManager::isPebiResultSnapshotCurrent() const
|
|
|
|
m_oNumericalAnalysisCase.getResultInputRevision();
|
|
|
|
m_oNumericalAnalysisCase.getResultInputRevision();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
nmDataAnalyzeManager::PebiResultStateSnapshot
|
|
|
|
|
|
|
|
nmDataAnalyzeManager::capturePebiResultState() const
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
PebiResultStateSnapshot oState;
|
|
|
|
|
|
|
|
oState.m_bCurrent = false;
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread("capturePebiResultState")) {
|
|
|
|
|
|
|
|
return oState;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
oState.m_pSnapshot = m_pPebiResultSnapshot;
|
|
|
|
|
|
|
|
oState.m_sSnapshotId = m_pPebiResultSnapshot.isNull()
|
|
|
|
|
|
|
|
? QString() : m_pPebiResultSnapshot->getSnapshotId();
|
|
|
|
|
|
|
|
oState.m_bCurrent = isPebiResultSnapshotCurrent();
|
|
|
|
|
|
|
|
return oState;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::notifyPebiResultStateChangedIfNeeded(
|
|
|
|
|
|
|
|
const PebiResultStateSnapshot& oPreviousState)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread(
|
|
|
|
|
|
|
|
"notifyPebiResultStateChangedIfNeeded")) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
const PebiResultStateSnapshot oCurrentState =
|
|
|
|
|
|
|
|
capturePebiResultState();
|
|
|
|
|
|
|
|
const bool bSnapshotIdentityChanged =
|
|
|
|
|
|
|
|
oPreviousState.m_pSnapshot.data() !=
|
|
|
|
|
|
|
|
oCurrentState.m_pSnapshot.data() ||
|
|
|
|
|
|
|
|
oPreviousState.m_sSnapshotId != oCurrentState.m_sSnapshotId;
|
|
|
|
|
|
|
|
if(bSnapshotIdentityChanged ||
|
|
|
|
|
|
|
|
oPreviousState.m_bCurrent != oCurrentState.m_bCurrent) {
|
|
|
|
|
|
|
|
emitPebiResultStateChangedOnOwnerThread();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool nmDataAnalyzeManager::ensurePebiResultOwnerThread(
|
|
|
|
|
|
|
|
const char* pOperation) const
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
const bool bOwnerThread = QThread::currentThread() == thread();
|
|
|
|
|
|
|
|
Q_ASSERT_X(bOwnerThread, "nmDataAnalyzeManager", pOperation);
|
|
|
|
|
|
|
|
if(!bOwnerThread) {
|
|
|
|
|
|
|
|
// 结果快照引用和输入版本均未加锁;Release 也必须在首次读取前拒绝。
|
|
|
|
|
|
|
|
qWarning() << "Rejected cross-thread PEBI result state mutation:"
|
|
|
|
|
|
|
|
<< pOperation;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return bOwnerThread;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::emitPebiResultStateChangedOnOwnerThread()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
Q_ASSERT(QThread::currentThread() == thread());
|
|
|
|
|
|
|
|
emit sigPebiResultStateChanged();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QString nmDataAnalyzeManager::getCurrentResultWellInstanceId() const
|
|
|
|
QString nmDataAnalyzeManager::getCurrentResultWellInstanceId() const
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return m_sCurrentResultWellInstanceId;
|
|
|
|
return m_sCurrentResultWellInstanceId;
|
|
|
|
@ -4806,12 +4931,15 @@ bool nmDataAnalyzeManager::commitPebiResultSnapshot(
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const PebiResultStateSnapshot oPreviousResultState =
|
|
|
|
|
|
|
|
capturePebiResultState();
|
|
|
|
// 发布点只替换只读引用;先前快照由仍在查看它的窗口延迟释放。
|
|
|
|
// 发布点只替换只读引用;先前快照由仍在查看它的窗口延迟释放。
|
|
|
|
m_pPebiResultSnapshot = pPublishedCandidate;
|
|
|
|
m_pPebiResultSnapshot = pPublishedCandidate;
|
|
|
|
m_sCurrentResultWellInstanceId = sNextWellInstanceId;
|
|
|
|
m_sCurrentResultWellInstanceId = sNextWellInstanceId;
|
|
|
|
pCandidate.clear();
|
|
|
|
pCandidate.clear();
|
|
|
|
rebindPebiResultSnapshotToWells();
|
|
|
|
rebindPebiResultSnapshotToWells();
|
|
|
|
emit sigPebiResultSnapshotChanged();
|
|
|
|
emit sigPebiResultSnapshotChanged();
|
|
|
|
|
|
|
|
notifyPebiResultStateChangedIfNeeded(oPreviousResultState);
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -4843,16 +4971,22 @@ void nmDataAnalyzeManager::rebindPebiResultSnapshotToWells()
|
|
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::clearPebiResultSnapshot()
|
|
|
|
void nmDataAnalyzeManager::clearPebiResultSnapshot()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread("clearPebiResultSnapshot")) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
if(m_pPebiResultSnapshot.isNull() &&
|
|
|
|
if(m_pPebiResultSnapshot.isNull() &&
|
|
|
|
m_sCurrentResultWellInstanceId.isEmpty())
|
|
|
|
m_sCurrentResultWellInstanceId.isEmpty())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const PebiResultStateSnapshot oPreviousResultState =
|
|
|
|
|
|
|
|
capturePebiResultState();
|
|
|
|
m_pPebiResultSnapshot.clear();
|
|
|
|
m_pPebiResultSnapshot.clear();
|
|
|
|
m_sCurrentResultWellInstanceId.clear();
|
|
|
|
m_sCurrentResultWellInstanceId.clear();
|
|
|
|
rebindPebiResultSnapshotToWells();
|
|
|
|
rebindPebiResultSnapshotToWells();
|
|
|
|
emit sigPebiResultSnapshotChanged();
|
|
|
|
emit sigPebiResultSnapshotChanged();
|
|
|
|
|
|
|
|
notifyPebiResultStateChangedIfNeeded(oPreviousResultState);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 设置当前查看井
|
|
|
|
// 设置当前查看井
|
|
|
|
@ -4869,9 +5003,12 @@ nmDataWellBase* nmDataAnalyzeManager::getCurWellData()
|
|
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::notifyDataChanged()
|
|
|
|
void nmDataAnalyzeManager::notifyDataChanged()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread("notifyDataChanged")) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
// 本入口用于几何、井集合等网格输入;仅影响求解的参数应调用
|
|
|
|
// 本入口用于几何、井集合等网格输入;仅影响求解的参数应调用
|
|
|
|
// invalidatePebiResults(),避免无意义地重建当前有效网格。
|
|
|
|
// invalidatePebiResults(),避免无意义地重建当前有效网格。
|
|
|
|
m_oNumericalAnalysisCase.invalidateGrid();
|
|
|
|
invalidatePebiGrid();
|
|
|
|
|
|
|
|
|
|
|
|
emit dataChanged();
|
|
|
|
emit dataChanged();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -4880,6 +5017,9 @@ void nmDataAnalyzeManager::onRegisteredAttributeEdited(
|
|
|
|
QString sName,
|
|
|
|
QString sName,
|
|
|
|
QVariant oValue)
|
|
|
|
QVariant oValue)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread("onRegisteredAttributeEdited")) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
Q_UNUSED(oValue);
|
|
|
|
Q_UNUSED(oValue);
|
|
|
|
|
|
|
|
|
|
|
|
if(isPebiGridInputAttributeName(sName)) {
|
|
|
|
if(isPebiGridInputAttributeName(sName)) {
|
|
|
|
@ -4894,7 +5034,10 @@ void nmDataAnalyzeManager::onRegisteredAttributeEdited(
|
|
|
|
|
|
|
|
|
|
|
|
void nmDataAnalyzeManager::notifyGeometryListChanged()
|
|
|
|
void nmDataAnalyzeManager::notifyGeometryListChanged()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
m_oNumericalAnalysisCase.invalidateGrid();
|
|
|
|
if(!ensurePebiResultOwnerThread("notifyGeometryListChanged")) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
invalidatePebiGrid();
|
|
|
|
emit sigGeometryListChanged();
|
|
|
|
emit sigGeometryListChanged();
|
|
|
|
emit dataChanged();
|
|
|
|
emit dataChanged();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -5206,9 +5349,13 @@ QVector<nmPropertyInterpolationDataSet> nmDataAnalyzeManager::getPropertyInterpo
|
|
|
|
void nmDataAnalyzeManager::setPropertyInterpolationDataSets(
|
|
|
|
void nmDataAnalyzeManager::setPropertyInterpolationDataSets(
|
|
|
|
const QVector<nmPropertyInterpolationDataSet>& dataSets)
|
|
|
|
const QVector<nmPropertyInterpolationDataSet>& dataSets)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread(
|
|
|
|
|
|
|
|
"setPropertyInterpolationDataSets")) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
m_vecPropertyInterpolationDataSets = dataSets;
|
|
|
|
m_vecPropertyInterpolationDataSets = dataSets;
|
|
|
|
// 属性插值只覆盖求解器单元属性,不改变二维 PEBI 拓扑。
|
|
|
|
// 属性插值只覆盖求解器单元属性,不改变二维 PEBI 拓扑。
|
|
|
|
m_oNumericalAnalysisCase.invalidateResults();
|
|
|
|
invalidatePebiResults();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 从 JSON 文件读取数据到 C++ 对象
|
|
|
|
// 从 JSON 文件读取数据到 C++ 对象
|
|
|
|
@ -6642,6 +6789,9 @@ bool nmDataAnalyzeManager::validateNmResultV3Window(
|
|
|
|
|
|
|
|
|
|
|
|
bool nmDataAnalyzeManager::loadNmResult(QString sLoadAnalDir)
|
|
|
|
bool nmDataAnalyzeManager::loadNmResult(QString sLoadAnalDir)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!ensurePebiResultOwnerThread("loadNmResult")) {
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
// v5 先在独立候选对象上完成全部解析和业务校验。
|
|
|
|
// v5 先在独立候选对象上完成全部解析和业务校验。
|
|
|
|
// 任一步失败时只析构候选,当前窗口已经发布的数据保持不变。
|
|
|
|
// 任一步失败时只析构候选,当前窗口已经发布的数据保持不变。
|
|
|
|
@ -6660,10 +6810,13 @@ bool nmDataAnalyzeManager::loadNmResult(QString sLoadAnalDir)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const PebiResultStateSnapshot oPreviousResultState =
|
|
|
|
|
|
|
|
capturePebiResultState();
|
|
|
|
swapLoadedProjectState(oLoadedManager);
|
|
|
|
swapLoadedProjectState(oLoadedManager);
|
|
|
|
rebuildLoadedAttributeRegistry();
|
|
|
|
rebuildLoadedAttributeRegistry();
|
|
|
|
rebindPebiResultSnapshotToWells();
|
|
|
|
rebindPebiResultSnapshotToWells();
|
|
|
|
emit sigPebiResultSnapshotChanged();
|
|
|
|
emit sigPebiResultSnapshotChanged();
|
|
|
|
|
|
|
|
notifyPebiResultStateChangedIfNeeded(oPreviousResultState);
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch(const std::bad_alloc&) {
|
|
|
|
catch(const std::bad_alloc&) {
|
|
|
|
|