diff --git a/ApplicationCode/FileInterface/RifEclipseOutputFileTools.cpp b/ApplicationCode/FileInterface/RifEclipseOutputFileTools.cpp index 0bf35563c4..85926f9b81 100644 --- a/ApplicationCode/FileInterface/RifEclipseOutputFileTools.cpp +++ b/ApplicationCode/FileInterface/RifEclipseOutputFileTools.cpp @@ -26,9 +26,12 @@ #include "ecl_grid.h" #include "ecl_rsthead.h" +#include "cafProgressInfo.h" + #include #include -#include "cafProgressInfo.h" + +#include //-------------------------------------------------------------------------------------------------- @@ -46,6 +49,16 @@ RifEclipseOutputFileTools::~RifEclipseOutputFileTools() { } +void getDayMonthYear(const ecl_kw_type* intehead_kw, int* day, int* month, int* year) +{ + assert(day && month && year); + + *day = ecl_kw_iget_int(intehead_kw, INTEHEAD_DAY_INDEX); + *month = ecl_kw_iget_int(intehead_kw, INTEHEAD_MONTH_INDEX); + *year = ecl_kw_iget_int(intehead_kw, INTEHEAD_YEAR_INDEX); +} + + //-------------------------------------------------------------------------------------------------- /// Get list of time step texts (dates) //-------------------------------------------------------------------------------------------------- @@ -94,9 +107,12 @@ void RifEclipseOutputFileTools::timeSteps(ecl_file_type* ecl_file, std::vector& timeSteps) {}; virtual size_t timeStepCount() = 0; virtual std::vector timeSteps() = 0; + virtual std::vector reportNumbers() = 0; virtual void resultNames(QStringList* resultNames, std::vector* resultDataItemCounts) = 0; virtual bool results(const QString& resultName, size_t timeStep, size_t gridCount, std::vector* values) = 0; diff --git a/ApplicationCode/FileInterface/RifEclipseRestartFilesetAccess.cpp b/ApplicationCode/FileInterface/RifEclipseRestartFilesetAccess.cpp index 35da9d4316..cb6fc661fb 100644 --- a/ApplicationCode/FileInterface/RifEclipseRestartFilesetAccess.cpp +++ b/ApplicationCode/FileInterface/RifEclipseRestartFilesetAccess.cpp @@ -258,3 +258,23 @@ int RifEclipseRestartFilesetAccess::readUnitsType() return RifEclipseOutputFileTools::readUnitsType(ecl_file); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RifEclipseRestartFilesetAccess::reportNumbers() +{ + std::vector reportNr; + + for (size_t i = 0; i < m_ecl_files.size(); i++) + { + const char* fileName = ecl_file_get_src_file(m_ecl_files[i]); + int reportNumber = ecl_util_filename_report_nr(fileName); + if (reportNumber != -1) + { + reportNr.push_back(reportNumber); + } + } + + return reportNr; +} + diff --git a/ApplicationCode/FileInterface/RifEclipseRestartFilesetAccess.h b/ApplicationCode/FileInterface/RifEclipseRestartFilesetAccess.h index 36ccb3356f..97eabaed3e 100644 --- a/ApplicationCode/FileInterface/RifEclipseRestartFilesetAccess.h +++ b/ApplicationCode/FileInterface/RifEclipseRestartFilesetAccess.h @@ -44,6 +44,7 @@ public: void setTimeSteps(const std::vector& timeSteps); size_t timeStepCount(); std::vector timeSteps(); + std::vector reportNumbers(); void resultNames(QStringList* resultNames, std::vector* resultDataItemCounts); bool results(const QString& resultName, size_t timeStep, size_t gridCount, std::vector* values); @@ -54,6 +55,7 @@ public: private: void openTimeStep(size_t timeStep); + private: QStringList m_fileNames; std::vector m_timeSteps; diff --git a/ApplicationCode/FileInterface/RifEclipseUnifiedRestartFileAccess.cpp b/ApplicationCode/FileInterface/RifEclipseUnifiedRestartFileAccess.cpp index 5ef395ed32..0dbf700e05 100644 --- a/ApplicationCode/FileInterface/RifEclipseUnifiedRestartFileAccess.cpp +++ b/ApplicationCode/FileInterface/RifEclipseUnifiedRestartFileAccess.cpp @@ -21,6 +21,7 @@ #include "RifEclipseUnifiedRestartFileAccess.h" #include "RifEclipseOutputFileTools.h" +#include "ecl_kw_magic.h" #include #include #include @@ -175,3 +176,31 @@ int RifEclipseUnifiedRestartFileAccess::readUnitsType() return RifEclipseOutputFileTools::readUnitsType(m_ecl_file); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RifEclipseUnifiedRestartFileAccess::reportNumbers() +{ + std::vector reportNr; + + // Taken from well_info_add_UNRST_wells + + int num_blocks = ecl_file_get_num_named_kw(m_ecl_file, SEQNUM_KW); + int block_nr; + for (block_nr = 0; block_nr < num_blocks; block_nr++) { + ecl_file_push_block(m_ecl_file); // <------------------------------------------------------- + { // + ecl_file_subselect_block(m_ecl_file, SEQNUM_KW, block_nr); // Ensure that the status + { // is not changed as a side + const ecl_kw_type * seqnum_kw = ecl_file_iget_named_kw(m_ecl_file, SEQNUM_KW, 0); // effect. + int report_nr = ecl_kw_iget_int(seqnum_kw, 0); // + + reportNr.push_back(report_nr); + } // + } // + ecl_file_pop_block(m_ecl_file); // <------------------------------------------------------- + } + + return reportNr; +} + diff --git a/ApplicationCode/FileInterface/RifEclipseUnifiedRestartFileAccess.h b/ApplicationCode/FileInterface/RifEclipseUnifiedRestartFileAccess.h index 26e7824959..f119c75701 100644 --- a/ApplicationCode/FileInterface/RifEclipseUnifiedRestartFileAccess.h +++ b/ApplicationCode/FileInterface/RifEclipseUnifiedRestartFileAccess.h @@ -45,6 +45,7 @@ public: size_t timeStepCount(); std::vector timeSteps(); + std::vector reportNumbers(); void resultNames(QStringList* resultNames, std::vector* resultDataItemCounts); bool results(const QString& resultName, size_t timeStep, size_t gridCount, std::vector* values); @@ -55,6 +56,7 @@ public: private: bool openFile(); + private: QString m_filename; ecl_file_type* m_ecl_file; diff --git a/ApplicationCode/FileInterface/RifReaderEclipseOutput.cpp b/ApplicationCode/FileInterface/RifReaderEclipseOutput.cpp index 0ddc72b675..0861b22bd3 100644 --- a/ApplicationCode/FileInterface/RifReaderEclipseOutput.cpp +++ b/ApplicationCode/FileInterface/RifReaderEclipseOutput.cpp @@ -1066,6 +1066,14 @@ void RifReaderEclipseOutput::readWellCells(const ecl_grid_type* mainEclGrid, boo m_dynamicResultsAccess->readWellData(ert_well_info, importCompleteMswData); + std::vector timeSteps = m_dynamicResultsAccess->timeSteps(); + std::vector reportNumbers = m_dynamicResultsAccess->reportNumbers(); + bool sameCount = false; + if (timeSteps.size() == reportNumbers.size()) + { + sameCount = true; + } + RigMainGrid* mainGrid = m_eclipseCase->mainGrid(); std::vector grids; m_eclipseCase->allGrids(&grids); @@ -1095,8 +1103,27 @@ void RifReaderEclipseOutput::readWellCells(const ecl_grid_type* mainEclGrid, boo RigWellResultFrame& wellResFrame = wellResults->m_wellCellsTimeSteps[timeIdx]; // Build timestamp for well - // Also see RifEclipseOutputFileAccess::timeStepsText for accessing time_t structures + bool haveFoundTimeStamp = false; + + if (sameCount) { + int reportNr = well_state_get_report_nr(ert_well_state); + + for (size_t i = 0; i < reportNumbers.size(); i++) + { + if (reportNumbers[i] == reportNr) + { + wellResFrame.m_timestamp = timeSteps[i]; + haveFoundTimeStamp = true; + } + } + } + + if (!haveFoundTimeStamp) + { + // This fallback will not work for timesteps before 1970. + + // Also see RifEclipseOutputFileAccess::timeStepsText for accessing time_t structures time_t stepTime = well_state_get_sim_time(ert_well_state); wellResFrame.m_timestamp = QDateTime::fromTime_t(stepTime); }