|
|
|
|
@ -63,14 +63,8 @@ void nmDataNumericalAnalysisCase::setPrimaryWellCode(const QString& sWellCode)
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const QString sOldPrimaryWellCode = m_sPrimaryWellCode;
|
|
|
|
|
m_sPrimaryWellCode = sWellCode;
|
|
|
|
|
normalizeIncludedWells();
|
|
|
|
|
if(!m_bResultsAvailable &&
|
|
|
|
|
(m_sCurrentResultWellCode.isEmpty() ||
|
|
|
|
|
m_sCurrentResultWellCode == sOldPrimaryWellCode)) {
|
|
|
|
|
m_sCurrentResultWellCode = m_sPrimaryWellCode;
|
|
|
|
|
}
|
|
|
|
|
invalidateGrid();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -218,20 +212,6 @@ QVector<nmCalculationWellRef> nmDataNumericalAnalysisCase::getEffectiveWells() c
|
|
|
|
|
return vecResult;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ==================== 结果查看状态 ====================
|
|
|
|
|
|
|
|
|
|
QString nmDataNumericalAnalysisCase::getCurrentResultWellCode() const
|
|
|
|
|
{
|
|
|
|
|
return m_sCurrentResultWellCode;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmDataNumericalAnalysisCase::setCurrentResultWellCode(
|
|
|
|
|
const QString& sWellCode)
|
|
|
|
|
{
|
|
|
|
|
// 切换结果井只是界面查看状态,不应触发网格或求解结果失效。
|
|
|
|
|
m_sCurrentResultWellCode = sWellCode;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ==================== DLL 求解器井槽位顺序 ====================
|
|
|
|
|
|
|
|
|
|
QVector<nmSolverWellRef> nmDataNumericalAnalysisCase::getSolverWellOrder() const
|
|
|
|
|
@ -243,7 +223,6 @@ void nmDataNumericalAnalysisCase::clearSolverWellOrder()
|
|
|
|
|
{
|
|
|
|
|
m_vecSolverWellOrder.clear();
|
|
|
|
|
m_nBuiltGridRevision = 0;
|
|
|
|
|
m_bResultsValid = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmDataNumericalAnalysisCase::appendSolverWell(
|
|
|
|
|
@ -252,7 +231,6 @@ void nmDataNumericalAnalysisCase::appendSolverWell(
|
|
|
|
|
nmSolverWellRef oIndexedRef = oWellRef;
|
|
|
|
|
oIndexedRef.m_nSolverIndex = m_vecSolverWellOrder.size();
|
|
|
|
|
m_vecSolverWellOrder.append(oIndexedRef);
|
|
|
|
|
m_bResultsValid = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmDataNumericalAnalysisCase::insertSolverWell(
|
|
|
|
|
@ -269,7 +247,6 @@ void nmDataNumericalAnalysisCase::insertSolverWell(
|
|
|
|
|
++nOrderIndex) {
|
|
|
|
|
m_vecSolverWellOrder[nOrderIndex].m_nSolverIndex = nOrderIndex;
|
|
|
|
|
}
|
|
|
|
|
m_bResultsValid = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool nmDataNumericalAnalysisCase::removeSolverWell(int nIndex)
|
|
|
|
|
@ -284,7 +261,6 @@ bool nmDataNumericalAnalysisCase::removeSolverWell(int nIndex)
|
|
|
|
|
++nOrderIndex) {
|
|
|
|
|
m_vecSolverWellOrder[nOrderIndex].m_nSolverIndex = nOrderIndex;
|
|
|
|
|
}
|
|
|
|
|
m_bResultsValid = false;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -295,65 +271,6 @@ void nmDataNumericalAnalysisCase::setSolverWellOrder(
|
|
|
|
|
for(int nIndex = 0; nIndex < m_vecSolverWellOrder.size(); ++nIndex) {
|
|
|
|
|
m_vecSolverWellOrder[nIndex].m_nSolverIndex = nIndex;
|
|
|
|
|
}
|
|
|
|
|
m_bResultsValid = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QVector<nmSolverWellRef>
|
|
|
|
|
nmDataNumericalAnalysisCase::getResultSolverWellOrder() const
|
|
|
|
|
{
|
|
|
|
|
return m_vecResultSolverWellOrder;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QStringList nmDataNumericalAnalysisCase::getResultSelectableWellCodes() const
|
|
|
|
|
{
|
|
|
|
|
return m_listResultSelectableWellCodes;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmDataNumericalAnalysisCase::restoreResultState(
|
|
|
|
|
const QVector<nmSolverWellRef>& vecOrder,
|
|
|
|
|
bool bAvailable,
|
|
|
|
|
bool bCurrent)
|
|
|
|
|
{
|
|
|
|
|
restoreResultState(vecOrder, QStringList(), bAvailable, bCurrent);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmDataNumericalAnalysisCase::restoreResultState(
|
|
|
|
|
const QVector<nmSolverWellRef>& vecOrder,
|
|
|
|
|
const QStringList& listSelectableWellCodes,
|
|
|
|
|
bool bAvailable,
|
|
|
|
|
bool bCurrent)
|
|
|
|
|
{
|
|
|
|
|
m_vecResultSolverWellOrder = vecOrder;
|
|
|
|
|
QSet<QString> setResultWellCodes;
|
|
|
|
|
for(int nIndex = 0;
|
|
|
|
|
nIndex < m_vecResultSolverWellOrder.size();
|
|
|
|
|
++nIndex) {
|
|
|
|
|
m_vecResultSolverWellOrder[nIndex].m_nSolverIndex = nIndex;
|
|
|
|
|
const nmSolverWellRef& oWellRef = m_vecResultSolverWellOrder[nIndex];
|
|
|
|
|
if(oWellRef.m_eEntryKind == NM_SolverEntry_Well) {
|
|
|
|
|
setResultWellCodes.insert(oWellRef.m_sWellCode);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_listResultSelectableWellCodes.clear();
|
|
|
|
|
for(int nIndex = 0; nIndex < listSelectableWellCodes.size(); ++nIndex) {
|
|
|
|
|
const QString sWellCode = listSelectableWellCodes[nIndex];
|
|
|
|
|
if(setResultWellCodes.contains(sWellCode) &&
|
|
|
|
|
!m_listResultSelectableWellCodes.contains(sWellCode)) {
|
|
|
|
|
m_listResultSelectableWellCodes.append(sWellCode);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_bResultsAvailable = bAvailable &&
|
|
|
|
|
!m_vecResultSolverWellOrder.isEmpty();
|
|
|
|
|
m_bResultsValid = m_bResultsAvailable && bCurrent;
|
|
|
|
|
if(m_bResultsAvailable) {
|
|
|
|
|
// 旧成果没有独立可显示井字段时,按保存的主井和包含井保守恢复。
|
|
|
|
|
if(m_listResultSelectableWellCodes.isEmpty()) {
|
|
|
|
|
freezeResultSelectableWellCodes();
|
|
|
|
|
}
|
|
|
|
|
normalizeCurrentResultWellCode();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ==================== 网格与结果版本管理 ====================
|
|
|
|
|
@ -368,14 +285,14 @@ void nmDataNumericalAnalysisCase::invalidateGrid()
|
|
|
|
|
|
|
|
|
|
void nmDataNumericalAnalysisCase::invalidateResults()
|
|
|
|
|
{
|
|
|
|
|
// 历史结果由 Manager 快照持有。这里仅增加当前求解输入版本,
|
|
|
|
|
// 快照是否仍为当前结果由双方版本比较自然得出。
|
|
|
|
|
++m_nResultInputRevision;
|
|
|
|
|
m_bResultsValid = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmDataNumericalAnalysisCase::markGridBuilt()
|
|
|
|
|
{
|
|
|
|
|
m_nBuiltGridRevision = m_nGridInputRevision;
|
|
|
|
|
m_bResultsValid = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool nmDataNumericalAnalysisCase::markGridBuiltIfCurrent(
|
|
|
|
|
@ -385,7 +302,6 @@ bool nmDataNumericalAnalysisCase::markGridBuiltIfCurrent(
|
|
|
|
|
if(nGridInputRevision != m_nGridInputRevision ||
|
|
|
|
|
m_vecSolverWellOrder.isEmpty()) {
|
|
|
|
|
m_nBuiltGridRevision = 0;
|
|
|
|
|
m_bResultsValid = false;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -394,48 +310,6 @@ bool nmDataNumericalAnalysisCase::markGridBuiltIfCurrent(
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmDataNumericalAnalysisCase::discardResults()
|
|
|
|
|
{
|
|
|
|
|
// 重新求解本身不是输入修改,只清除有效标记,不增加结果输入版本号。
|
|
|
|
|
m_bResultsValid = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmDataNumericalAnalysisCase::markResultsAvailable()
|
|
|
|
|
{
|
|
|
|
|
if(!isGridValid()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_vecResultSolverWellOrder = m_vecSolverWellOrder;
|
|
|
|
|
freezeResultSelectableWellCodes();
|
|
|
|
|
m_bResultsAvailable = true;
|
|
|
|
|
m_bResultsValid = true;
|
|
|
|
|
normalizeCurrentResultWellCode();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool nmDataNumericalAnalysisCase::markResultsAvailableIfCurrent(
|
|
|
|
|
quint64 nGridInputRevision,
|
|
|
|
|
quint64 nResultInputRevision)
|
|
|
|
|
{
|
|
|
|
|
// 第一步:任务使用的网格版本和求解输入版本必须仍是当前版本。
|
|
|
|
|
const bool bInputCurrent =
|
|
|
|
|
nGridInputRevision == m_nGridInputRevision &&
|
|
|
|
|
nResultInputRevision == m_nResultInputRevision;
|
|
|
|
|
|
|
|
|
|
// 第二步:只有输入未变化且网格仍有效时,才允许旧线程提交结果。
|
|
|
|
|
// 校验失败不能破坏此前已经存在的结果。
|
|
|
|
|
if(!bInputCurrent || !isGridValid()) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_vecResultSolverWellOrder = m_vecSolverWellOrder;
|
|
|
|
|
freezeResultSelectableWellCodes();
|
|
|
|
|
m_bResultsAvailable = true;
|
|
|
|
|
m_bResultsValid = true;
|
|
|
|
|
normalizeCurrentResultWellCode();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool nmDataNumericalAnalysisCase::isGridValid() const
|
|
|
|
|
{
|
|
|
|
|
return m_nBuiltGridRevision != 0 &&
|
|
|
|
|
@ -443,22 +317,6 @@ bool nmDataNumericalAnalysisCase::isGridValid() const
|
|
|
|
|
!m_vecSolverWellOrder.isEmpty();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool nmDataNumericalAnalysisCase::areResultsValid() const
|
|
|
|
|
{
|
|
|
|
|
return areResultsCurrent() && isGridValid();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool nmDataNumericalAnalysisCase::hasResults() const
|
|
|
|
|
{
|
|
|
|
|
return m_bResultsAvailable &&
|
|
|
|
|
!m_vecResultSolverWellOrder.isEmpty();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool nmDataNumericalAnalysisCase::areResultsCurrent() const
|
|
|
|
|
{
|
|
|
|
|
return hasResults() && m_bResultsValid;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
quint64 nmDataNumericalAnalysisCase::getGridInputRevision() const
|
|
|
|
|
{
|
|
|
|
|
return m_nGridInputRevision;
|
|
|
|
|
@ -490,7 +348,6 @@ bool nmDataNumericalAnalysisCase::restoreInputRevisions(
|
|
|
|
|
m_nGridInputRevision = nGridInputRevision;
|
|
|
|
|
m_nBuiltGridRevision = nBuiltGridRevision;
|
|
|
|
|
m_nResultInputRevision = nResultInputRevision;
|
|
|
|
|
m_bResultsValid = false;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -502,15 +359,10 @@ void nmDataNumericalAnalysisCase::clear()
|
|
|
|
|
m_bIncludeOtherWells = false;
|
|
|
|
|
m_dPebiGridControl = 150.0;
|
|
|
|
|
m_vecIncludedWells.clear();
|
|
|
|
|
m_sCurrentResultWellCode.clear();
|
|
|
|
|
m_vecSolverWellOrder.clear();
|
|
|
|
|
m_vecResultSolverWellOrder.clear();
|
|
|
|
|
m_listResultSelectableWellCodes.clear();
|
|
|
|
|
m_nGridInputRevision = 1;
|
|
|
|
|
m_nBuiltGridRevision = 0;
|
|
|
|
|
m_nResultInputRevision = 1;
|
|
|
|
|
m_bResultsAvailable = false;
|
|
|
|
|
m_bResultsValid = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmDataNumericalAnalysisCase::normalizeIncludedWells()
|
|
|
|
|
@ -534,41 +386,3 @@ void nmDataNumericalAnalysisCase::normalizeIncludedWells()
|
|
|
|
|
|
|
|
|
|
m_vecIncludedWells = vecNormalized;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmDataNumericalAnalysisCase::normalizeCurrentResultWellCode()
|
|
|
|
|
{
|
|
|
|
|
if(m_listResultSelectableWellCodes.contains(
|
|
|
|
|
m_sCurrentResultWellCode)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_sCurrentResultWellCode = m_listResultSelectableWellCodes.isEmpty()
|
|
|
|
|
? QString() : m_listResultSelectableWellCodes.first();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nmDataNumericalAnalysisCase::freezeResultSelectableWellCodes()
|
|
|
|
|
{
|
|
|
|
|
QSet<QString> setSelectableWellCodes;
|
|
|
|
|
if(!m_sPrimaryWellCode.isEmpty()) {
|
|
|
|
|
setSelectableWellCodes.insert(m_sPrimaryWellCode);
|
|
|
|
|
}
|
|
|
|
|
if(m_bIncludeOtherWells) {
|
|
|
|
|
for(int nIndex = 0; nIndex < m_vecIncludedWells.size(); ++nIndex) {
|
|
|
|
|
setSelectableWellCodes.insert(
|
|
|
|
|
m_vecIncludedWells[nIndex].m_sWellCode);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_listResultSelectableWellCodes.clear();
|
|
|
|
|
for(int nIndex = 0;
|
|
|
|
|
nIndex < m_vecResultSolverWellOrder.size();
|
|
|
|
|
++nIndex) {
|
|
|
|
|
const nmSolverWellRef& oWellRef =
|
|
|
|
|
m_vecResultSolverWellOrder[nIndex];
|
|
|
|
|
if(oWellRef.m_eEntryKind == NM_SolverEntry_Well &&
|
|
|
|
|
setSelectableWellCodes.contains(oWellRef.m_sWellCode) &&
|
|
|
|
|
!m_listResultSelectableWellCodes.contains(oWellRef.m_sWellCode)) {
|
|
|
|
|
m_listResultSelectableWellCodes.append(oWellRef.m_sWellCode);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|