///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2018- Equinor ASA // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY // WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. // // See the GNU General Public License at // for more details. // ///////////////////////////////////////////////////////////////////////////////// #include "RiaCompletionTypeCalculationScheduler.h" #include "RiaApplication.h" #include "RigCaseCellResultsData.h" #include "RigEclipseCaseData.h" #include "RimEclipseCase.h" #include "RimEclipseCaseCollection.h" #include "RimEclipseView.h" #include "RimOilField.h" #include "RimProject.h" #include "RiuMainWindow.h" #include "RiuViewer.h" #include "cafPdmUiTreeView.h" #include "cafProgressState.h" #include #include #include //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RiaCompletionTypeCalculationScheduler* RiaCompletionTypeCalculationScheduler::instance() { static RiaCompletionTypeCalculationScheduler theInstance; return &theInstance; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RiaCompletionTypeCalculationScheduler::scheduleRecalculateCompletionTypeAndRedrawAllViews() { std::vector eclipseCases = RimProject::current()->activeOilField()->analysisModels->cases().children(); scheduleRecalculateCompletionTypeAndRedrawAllViews( eclipseCases ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RiaCompletionTypeCalculationScheduler::scheduleRecalculateCompletionTypeAndRedrawAllViews( RimEclipseCase* eclipseCase ) { std::vector eclipseCases; eclipseCases.push_back( eclipseCase ); scheduleRecalculateCompletionTypeAndRedrawAllViews( eclipseCases ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RiaCompletionTypeCalculationScheduler::scheduleRecalculateCompletionTypeAndRedrawAllViews( const std::vector& eclipseCases ) { clearCompletionTypeResults( eclipseCases ); for ( RimEclipseCase* eclipseCase : eclipseCases ) { if ( eclipseCase ) m_eclipseCasesToRecalculate.emplace_back( eclipseCase ); } startTimer( 0 ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RiaCompletionTypeCalculationScheduler::clearCompletionTypeResultsInAllCases() { std::vector eclipseCases = RimProject::current()->activeOilField()->analysisModels->cases().children(); clearCompletionTypeResults( eclipseCases ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RiaCompletionTypeCalculationScheduler::clearCompletionTypeResults( const std::vector& eclipseCases ) { for ( RimEclipseCase* eclipseCase : eclipseCases ) { if ( !eclipseCase || !eclipseCase->eclipseCaseData() ) continue; eclipseCase->eclipseCaseData() ->results( RiaDefines::PorosityModelType::MATRIX_MODEL ) ->clearScalarResult( RiaDefines::ResultCatType::DYNAMIC_NATIVE, RiaResultNames::completionTypeResultName() ); // Delete virtual perforation transmissibilities, as these are the basis for the computation of completion type eclipseCase->eclipseCaseData()->setVirtualPerforationTransmissibilities( nullptr ); } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RiaCompletionTypeCalculationScheduler::performScheduledUpdates() { std::set uniqueCases( m_eclipseCasesToRecalculate.begin(), m_eclipseCasesToRecalculate.end() ); Rim3dView* activeView = RiaApplication::instance()->activeReservoirView(); for ( RimEclipseCase* eclipseCase : uniqueCases ) { if ( eclipseCase ) { for ( const auto& w : eclipseCase->views() ) { RimEclipseView* eclView = dynamic_cast( w ); if ( eclView ) { eclView->calculateCompletionTypeAndRedrawIfRequired(); } } } } m_eclipseCasesToRecalculate.clear(); // Recalculation of completion type causes active view to be set to potentially a different view // Also current index in project tree is changed. Restore both to initial state. if ( activeView && activeView->viewer() ) { RiaApplication::instance()->setActiveReservoirView( activeView ); if ( RiuMainWindow::instance() ) { RiuMainWindow::instance()->setActiveViewer( activeView->viewer()->layoutWidget() ); } } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RiaCompletionTypeCalculationScheduler::~RiaCompletionTypeCalculationScheduler() { } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RiaCompletionTypeCalculationScheduler::RiaCompletionTypeCalculationScheduler() { }