Fix for dates before 1970

This commit is contained in:
Magne Sjaastad 2014-10-29 09:34:57 +01:00
parent cff0313519
commit 619b7a211a
7 changed files with 111 additions and 7 deletions

View File

@ -26,9 +26,12 @@
#include "ecl_grid.h" #include "ecl_grid.h"
#include "ecl_rsthead.h" #include "ecl_rsthead.h"
#include "cafProgressInfo.h"
#include <QFileInfo> #include <QFileInfo>
#include <QDebug> #include <QDebug>
#include "cafProgressInfo.h"
#include <assert.h>
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -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) /// Get list of time step texts (dates)
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -94,9 +107,12 @@ void RifEclipseOutputFileTools::timeSteps(ecl_file_type* ecl_file, std::vector<Q
ecl_kw_type* kwINTEHEAD = ecl_file_iget_named_kw(ecl_file, INTEHEAD_KW, 0); ecl_kw_type* kwINTEHEAD = ecl_file_iget_named_kw(ecl_file, INTEHEAD_KW, 0);
if (kwINTEHEAD) if (kwINTEHEAD)
{ {
time_t ertTimeStamp = ecl_rsthead_date(kwINTEHEAD); int day = 0;
QDateTime simulationStart = QDateTime::fromTime_t(ertTimeStamp); int month = 0;
int year = 0;
getDayMonthYear(kwINTEHEAD, &day, &month, &year);
QDateTime simulationStart(QDate(year, month, day));
for (int i = 0; i < days.size(); i++) for (int i = 0; i < days.size(); i++)
{ {
QDateTime reportDateTime(simulationStart); QDateTime reportDateTime(simulationStart);
@ -127,8 +143,15 @@ void RifEclipseOutputFileTools::timeSteps(ecl_file_type* ecl_file, std::vector<Q
ecl_kw_type* kwINTEHEAD = ecl_file_iget_named_kw(ecl_file, INTEHEAD_KW, i); ecl_kw_type* kwINTEHEAD = ecl_file_iget_named_kw(ecl_file, INTEHEAD_KW, i);
if (kwINTEHEAD) if (kwINTEHEAD)
{ {
time_t ertTimeStamp = ecl_rsthead_date(kwINTEHEAD); int day = 0;
QDateTime reportDateTime = QDateTime::fromTime_t(ertTimeStamp); int month = 0;
int year = 0;
getDayMonthYear(kwINTEHEAD, &day, &month, &year);
QDateTime reportDateTime(QDate(year, month, day));
QTime time(0, 0);
reportDateTime.setTime(time);
CVF_ASSERT(reportDateTime.isValid()); CVF_ASSERT(reportDateTime.isValid());
if (std::find(timeStepsFound.begin(), timeStepsFound.end(), reportDateTime) == timeStepsFound.end()) if (std::find(timeStepsFound.begin(), timeStepsFound.end(), reportDateTime) == timeStepsFound.end())

View File

@ -51,6 +51,7 @@ public:
virtual void setTimeSteps(const std::vector<QDateTime>& timeSteps) {}; virtual void setTimeSteps(const std::vector<QDateTime>& timeSteps) {};
virtual size_t timeStepCount() = 0; virtual size_t timeStepCount() = 0;
virtual std::vector<QDateTime> timeSteps() = 0; virtual std::vector<QDateTime> timeSteps() = 0;
virtual std::vector<int> reportNumbers() = 0;
virtual void resultNames(QStringList* resultNames, std::vector<size_t>* resultDataItemCounts) = 0; virtual void resultNames(QStringList* resultNames, std::vector<size_t>* resultDataItemCounts) = 0;
virtual bool results(const QString& resultName, size_t timeStep, size_t gridCount, std::vector<double>* values) = 0; virtual bool results(const QString& resultName, size_t timeStep, size_t gridCount, std::vector<double>* values) = 0;

View File

@ -258,3 +258,23 @@ int RifEclipseRestartFilesetAccess::readUnitsType()
return RifEclipseOutputFileTools::readUnitsType(ecl_file); return RifEclipseOutputFileTools::readUnitsType(ecl_file);
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<int> RifEclipseRestartFilesetAccess::reportNumbers()
{
std::vector<int> 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;
}

View File

@ -44,6 +44,7 @@ public:
void setTimeSteps(const std::vector<QDateTime>& timeSteps); void setTimeSteps(const std::vector<QDateTime>& timeSteps);
size_t timeStepCount(); size_t timeStepCount();
std::vector<QDateTime> timeSteps(); std::vector<QDateTime> timeSteps();
std::vector<int> reportNumbers();
void resultNames(QStringList* resultNames, std::vector<size_t>* resultDataItemCounts); void resultNames(QStringList* resultNames, std::vector<size_t>* resultDataItemCounts);
bool results(const QString& resultName, size_t timeStep, size_t gridCount, std::vector<double>* values); bool results(const QString& resultName, size_t timeStep, size_t gridCount, std::vector<double>* values);
@ -54,6 +55,7 @@ public:
private: private:
void openTimeStep(size_t timeStep); void openTimeStep(size_t timeStep);
private: private:
QStringList m_fileNames; QStringList m_fileNames;
std::vector<QDateTime> m_timeSteps; std::vector<QDateTime> m_timeSteps;

View File

@ -21,6 +21,7 @@
#include "RifEclipseUnifiedRestartFileAccess.h" #include "RifEclipseUnifiedRestartFileAccess.h"
#include "RifEclipseOutputFileTools.h" #include "RifEclipseOutputFileTools.h"
#include "ecl_kw_magic.h"
#include <well_state.h> #include <well_state.h>
#include <well_info.h> #include <well_info.h>
#include <well_conn.h> #include <well_conn.h>
@ -175,3 +176,31 @@ int RifEclipseUnifiedRestartFileAccess::readUnitsType()
return RifEclipseOutputFileTools::readUnitsType(m_ecl_file); return RifEclipseOutputFileTools::readUnitsType(m_ecl_file);
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<int> RifEclipseUnifiedRestartFileAccess::reportNumbers()
{
std::vector<int> 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;
}

View File

@ -45,6 +45,7 @@ public:
size_t timeStepCount(); size_t timeStepCount();
std::vector<QDateTime> timeSteps(); std::vector<QDateTime> timeSteps();
std::vector<int> reportNumbers();
void resultNames(QStringList* resultNames, std::vector<size_t>* resultDataItemCounts); void resultNames(QStringList* resultNames, std::vector<size_t>* resultDataItemCounts);
bool results(const QString& resultName, size_t timeStep, size_t gridCount, std::vector<double>* values); bool results(const QString& resultName, size_t timeStep, size_t gridCount, std::vector<double>* values);
@ -55,6 +56,7 @@ public:
private: private:
bool openFile(); bool openFile();
private: private:
QString m_filename; QString m_filename;
ecl_file_type* m_ecl_file; ecl_file_type* m_ecl_file;

View File

@ -1066,6 +1066,14 @@ void RifReaderEclipseOutput::readWellCells(const ecl_grid_type* mainEclGrid, boo
m_dynamicResultsAccess->readWellData(ert_well_info, importCompleteMswData); m_dynamicResultsAccess->readWellData(ert_well_info, importCompleteMswData);
std::vector<QDateTime> timeSteps = m_dynamicResultsAccess->timeSteps();
std::vector<int> reportNumbers = m_dynamicResultsAccess->reportNumbers();
bool sameCount = false;
if (timeSteps.size() == reportNumbers.size())
{
sameCount = true;
}
RigMainGrid* mainGrid = m_eclipseCase->mainGrid(); RigMainGrid* mainGrid = m_eclipseCase->mainGrid();
std::vector<RigGridBase*> grids; std::vector<RigGridBase*> grids;
m_eclipseCase->allGrids(&grids); m_eclipseCase->allGrids(&grids);
@ -1095,8 +1103,27 @@ void RifReaderEclipseOutput::readWellCells(const ecl_grid_type* mainEclGrid, boo
RigWellResultFrame& wellResFrame = wellResults->m_wellCellsTimeSteps[timeIdx]; RigWellResultFrame& wellResFrame = wellResults->m_wellCellsTimeSteps[timeIdx];
// Build timestamp for well // 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); time_t stepTime = well_state_get_sim_time(ert_well_state);
wellResFrame.m_timestamp = QDateTime::fromTime_t(stepTime); wellResFrame.m_timestamp = QDateTime::fromTime_t(stepTime);
} }