Support multiple timesteps per day using opm_common reader (#11908)

* Fix progress window hiding time step filter dlg
* Clean up reader preferences
This commit is contained in:
jonjenssen
2024-11-21 12:42:13 +01:00
committed by GitHub
parent 065528ffba
commit f716b4e964
5 changed files with 95 additions and 55 deletions

View File

@@ -89,7 +89,7 @@ RiaPreferencesGrid::RiaPreferencesGrid()
CAF_PDM_InitField( &m_loadAndShowSoil, "loadAndShowSoil", true, "Load and Show SOIL" );
caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_loadAndShowSoil );
CAF_PDM_InitField( &m_onlyLoadActiveCells, "onlyLoadActiveCells", false, "Only Load Active Cell Geometry (Experimental)" );
CAF_PDM_InitField( &m_onlyLoadActiveCells, "onlyLoadActiveCells", false, "Only Load Active Cell Geometry" );
caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_onlyLoadActiveCells );
CAF_PDM_InitField( &m_invalidateLongThinCells, "invalidateLongThinCells", false, "Skip Long, Thin Cells" );
@@ -128,17 +128,20 @@ void RiaPreferencesGrid::appendItems( caf::PdmUiOrdering& uiOrdering )
wellGrp->add( &m_skipWellData );
wellGrp->add( &m_importAdvancedMswData );
auto egridGrp = uiOrdering.addNewGroup( "EGRID Settings" );
if ( m_gridModelReaderOverride == RiaDefines::GridModelReader::NOT_SET )
{
auto egridGrp = uiOrdering.addNewGroup( "EGRID Settings" );
egridGrp->add( &m_gridModelReader );
}
auto resdataGrp = uiOrdering.addNewGroup( "ResData Reader Settings" );
resdataGrp->add( &m_useResultIndexFile );
auto opmcGrp = uiOrdering.addNewGroup( "OPM Common Reader Settings" );
opmcGrp->add( &m_onlyLoadActiveCells );
if ( gridModelReader() == RiaDefines::GridModelReader::OPM_COMMON )
{
egridGrp->add( &m_onlyLoadActiveCells );
}
if ( gridModelReader() == RiaDefines::GridModelReader::RESDATA )
{
egridGrp->add( &m_useResultIndexFile );
}
const bool setFaultImportSettingsReadOnly = !importFaults();

View File

@@ -45,7 +45,6 @@
#include "cvfMath.h"
#include <QCryptographicHash>
#include <QDebug>
#include <QFileInfo>
#include <algorithm>

View File

@@ -763,21 +763,54 @@ std::vector<RigEclipseTimeStepInfo> RifReaderOpmCommon::createFilteredTimeStepIn
auto timeStepsOnFile = readTimeSteps();
if ( timeStepsOnFile.size() == 0 ) return timeStepInfos;
auto startDayOffset = timeStepsOnFile[0].simulationTimeFromStart;
QDate startDate( timeStepsOnFile[0].year, timeStepsOnFile[0].month, timeStepsOnFile[0].day );
for ( size_t i = 0; i < timeStepsOnFile.size(); i++ )
{
if ( isTimeStepIncludedByFilter( i ) )
{
QDate date( timeStepsOnFile[i].year, timeStepsOnFile[i].month, timeStepsOnFile[i].day );
auto datetime = RiaQDateTimeTools::createDateTime( date, Qt::TimeSpec::UTC );
auto dateTime = dateTimeFromTimeStepOnFile( timeStepsOnFile[i], startDate, startDayOffset );
timeStepInfos.push_back(
RigEclipseTimeStepInfo( datetime, timeStepsOnFile[i].sequenceNumber, timeStepsOnFile[i].simulationTimeFromStart ) );
RigEclipseTimeStepInfo( dateTime, timeStepsOnFile[i].sequenceNumber, timeStepsOnFile[i].simulationTimeFromStart ) );
}
}
return timeStepInfos;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QDateTime RifReaderOpmCommon::dateTimeFromTimeStepOnFile( RifReaderOpmCommon::TimeDataFile timeOnFile, QDate startDate, double startDayOffset )
{
QDateTime dateTime;
if ( timeOnFile.simulationTimeFromStart == 0 )
{
QDate date( timeOnFile.year, timeOnFile.month, timeOnFile.day );
dateTime = RiaQDateTimeTools::createDateTime( date, Qt::TimeSpec::UTC );
}
else
{
dateTime = RiaQDateTimeTools::createDateTime( startDate, Qt::TimeSpec::UTC );
double dayDoubleValue = timeOnFile.simulationTimeFromStart;
int dayValue = cvf::Math::floor( dayDoubleValue );
const int adjustedDayValue = dayValue - startDayOffset;
dateTime = dateTime.addDays( adjustedDayValue );
double dayFraction = dayDoubleValue - dayValue;
double milliseconds = dayFraction * 24.0 * 60.0 * 60.0 * 1000.0;
dateTime = dateTime.addMSecs( milliseconds );
}
return dateTime;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -785,7 +818,6 @@ void RifReaderOpmCommon::buildMetaData( RigEclipseCaseData* eclipseCaseData, caf
{
setupInitAndRestartAccess();
std::vector<QDateTime> timeSteps;
std::vector<RigEclipseTimeStepInfo> filteredTimeStepInfos;
RigEclipseTimeStepInfo firstTimeStepInfo{ QDateTime(), 0, 0.0 };
@@ -984,14 +1016,15 @@ std::vector<QDateTime> RifReaderOpmCommon::timeStepsOnFile( QString gridFileName
if ( m_restartFile == nullptr ) return {};
auto timeStepsFromFile = readTimeSteps();
auto timeStepsOnFile = readTimeSteps();
auto startDayOffset = timeStepsOnFile[0].simulationTimeFromStart;
QDate startDate( timeStepsOnFile[0].year, timeStepsOnFile[0].month, timeStepsOnFile[0].day );
std::vector<QDateTime> dateTimes;
for ( const auto& timeStep : timeStepsFromFile )
for ( const auto& timeStep : timeStepsOnFile )
{
QDate date( timeStep.year, timeStep.month, timeStep.day );
QDateTime dateTime = RiaQDateTimeTools::createDateTime( date, Qt::UTC );
auto dateTime = dateTimeFromTimeStepOnFile( timeStep, startDate, startDayOffset );
dateTimes.push_back( dateTime );
}

View File

@@ -24,6 +24,8 @@
#include <string>
#include <vector>
#include <QDateTime>
namespace Opm::EclIO
{
class EInit;
@@ -101,6 +103,7 @@ private:
};
std::vector<TimeDataFile> readTimeSteps();
QDateTime dateTimeFromTimeStepOnFile( RifReaderOpmCommon::TimeDataFile timeOnFile, QDate startDate, double startDayOffset );
protected:
enum class ActiveType

View File

@@ -142,11 +142,6 @@ bool RimEclipseResultCase::importGridAndResultMetaData( bool showTimeStepFilter
// dialog triggers a redraw with incomplete geometry data and causes a crash
if ( m_gridAndWellDataIsReadFromFile ) return true;
caf::ProgressInfo progInfo( 50, "Reading Eclipse Grid File" );
progInfo.setProgressDescription( "Open Grid File" );
progInfo.setNextProgressIncrement( 48 );
cvf::ref<RifReaderInterface> readerInterface;
if ( gridFileName().contains( "Result Mock Debug Model" ) )
@@ -213,6 +208,11 @@ bool RimEclipseResultCase::importGridAndResultMetaData( bool showTimeStepFilter
readerInterface->setTimeStepFilter( m_timeStepFilter->filteredTimeSteps() );
}
// delay showing progress until we get here, to not have progress show up on top of time step selection
caf::ProgressInfo progInfo( 50, "Reading Eclipse Grid File" );
progInfo.setProgressDescription( "Open Grid File" );
progInfo.setNextProgressIncrement( 48 );
readerInterface->setFilenamesWithFaults( filesContainingFaults() );
readerInterface->setReaderSettings( m_readerSettings );
@@ -230,41 +230,43 @@ bool RimEclipseResultCase::importGridAndResultMetaData( bool showTimeStepFilter
results( RiaDefines::PorosityModelType::MATRIX_MODEL )->setReaderInterface( readerInterface.p() );
results( RiaDefines::PorosityModelType::FRACTURE_MODEL )->setReaderInterface( readerInterface.p() );
progInfo.incrementProgress();
m_flowDagSolverInterface = new RigFlowDiagSolverInterface( this );
CVF_ASSERT( eclipseCaseData() );
CVF_ASSERT( readerInterface.notNull() );
progInfo.setProgressDescription( "Computing Case Cache" );
computeCachedData();
loadAndSynchronizeInputProperties( false );
m_gridAndWellDataIsReadFromFile = true;
m_activeCellInfoIsReadFromFile = true;
ensureRftDataIsImported();
if ( m_flowDiagSolutions.empty() )
{
m_flowDiagSolutions.push_back( new RimFlowDiagSolution() );
caf::ProgressInfo progInfo( 50, "Reading Eclipse Grid File", false /*do not delay*/ );
progInfo.setNextProgressIncrement( 49 );
m_flowDagSolverInterface = new RigFlowDiagSolverInterface( this );
CVF_ASSERT( eclipseCaseData() );
CVF_ASSERT( readerInterface.notNull() );
progInfo.setProgressDescription( "Computing Case Cache" );
computeCachedData();
loadAndSynchronizeInputProperties( false );
m_gridAndWellDataIsReadFromFile = true;
m_activeCellInfoIsReadFromFile = true;
ensureRftDataIsImported();
if ( m_flowDiagSolutions.empty() )
{
m_flowDiagSolutions.push_back( new RimFlowDiagSolution() );
}
if ( !m_sourSimFileName().path().isEmpty() )
{
auto* outReader = dynamic_cast<RifReaderEclipseOutput*>( readerInterface.p() );
outReader->setHdf5FileName( m_sourSimFileName().path() );
}
if ( RiaPreferencesGrid::current()->autoComputeDepthRelatedProperties() )
{
results( RiaDefines::PorosityModelType::MATRIX_MODEL )->computeDepthRelatedResults();
results( RiaDefines::PorosityModelType::FRACTURE_MODEL )->computeDepthRelatedResults();
}
results( RiaDefines::PorosityModelType::MATRIX_MODEL )->computeCellVolumes();
}
if ( !m_sourSimFileName().path().isEmpty() )
{
auto* outReader = dynamic_cast<RifReaderEclipseOutput*>( readerInterface.p() );
outReader->setHdf5FileName( m_sourSimFileName().path() );
}
if ( RiaPreferencesGrid::current()->autoComputeDepthRelatedProperties() )
{
results( RiaDefines::PorosityModelType::MATRIX_MODEL )->computeDepthRelatedResults();
results( RiaDefines::PorosityModelType::FRACTURE_MODEL )->computeDepthRelatedResults();
}
results( RiaDefines::PorosityModelType::MATRIX_MODEL )->computeCellVolumes();
return true;
}