diff --git a/ApplicationCode/FileInterface/RifColumnBasedUserData.cpp b/ApplicationCode/FileInterface/RifColumnBasedUserData.cpp index 1d09942922..31d8ae6c15 100644 --- a/ApplicationCode/FileInterface/RifColumnBasedUserData.cpp +++ b/ApplicationCode/FileInterface/RifColumnBasedUserData.cpp @@ -174,94 +174,96 @@ std::vector RifColumnBasedUserData::createTimeSteps(const TableData& tab { std::vector tsVector; - // Find time index size_t dateColumnIndex = tableData.columnInfos().size(); - size_t dayOrYearColumnIndex = tableData.columnInfos().size(); + size_t daysColumnIndex = tableData.columnInfos().size(); + size_t yearsColumnIndex = tableData.columnInfos().size(); size_t yearXColumnIndex = tableData.columnInfos().size(); + // Find first column matching the text criteria + for (size_t columIndex = 0; columIndex < tableData.columnInfos().size(); columIndex++) { const ColumnInfo& ci = tableData.columnInfos()[columIndex]; + if (dateColumnIndex == tableData.columnInfos().size() && RifEclipseUserDataKeywordTools::isDate(ci.summaryAddress.quantityName())) { dateColumnIndex = columIndex; } - if (dayOrYearColumnIndex == tableData.columnInfos().size() && - RifEclipseUserDataParserTools::hasTimeUnit(ci.unitName)) + if (daysColumnIndex == tableData.columnInfos().size() && + RifEclipseUserDataKeywordTools::isTime(ci.summaryAddress.quantityName()) && + RifEclipseUserDataKeywordTools::isDays(ci.unitName)) { - dayOrYearColumnIndex = columIndex; + daysColumnIndex = columIndex; + } + + if (yearsColumnIndex == tableData.columnInfos().size() && + RifEclipseUserDataKeywordTools::isYears(ci.summaryAddress.quantityName()) && + RifEclipseUserDataKeywordTools::isYears(ci.unitName)) + { + yearsColumnIndex = columIndex; } if (yearXColumnIndex == tableData.columnInfos().size() && - ci.summaryAddress.quantityName() == "YEARX") + RifEclipseUserDataKeywordTools::isYearX(ci.summaryAddress.quantityName()) && + RifEclipseUserDataKeywordTools::isYears(ci.unitName)) { yearXColumnIndex = columIndex; } } - if (dateColumnIndex < tableData.columnInfos().size() || - dayOrYearColumnIndex < tableData.columnInfos().size()) + // YEARX is interpreted as absolute decimal year (2014.32) + if (tsVector.empty() && yearXColumnIndex != tableData.columnInfos().size()) { - if (dateColumnIndex != tableData.columnInfos().size()) + const ColumnInfo& ci = tableData.columnInfos()[yearXColumnIndex]; + + for (const auto& timeStepValue : ci.values) { - const ColumnInfo& ci = tableData.columnInfos()[dateColumnIndex]; - - QString dateFormat; - for (auto s : ci.stringValues) - { - QDateTime dt = RiaDateStringParser::parseDateString(s); - - tsVector.push_back(dt.toTime_t()); - } + QDateTime dateTime = RiaQDateTimeTools::fromYears(timeStepValue); + tsVector.push_back(dateTime.toTime_t()); } - else if (yearXColumnIndex != tableData.columnInfos().size()) - { - const ColumnInfo& ci = tableData.columnInfos()[yearXColumnIndex]; + } - for (const auto& timeStepValue : ci.values) - { - QDateTime dateTime = RiaQDateTimeTools::fromYears(timeStepValue); - tsVector.push_back(dateTime.toTime_t()); - } + // DAYS is interpreted as decimal days since simulation start (23.32) + if (tsVector.empty() && daysColumnIndex != tableData.columnInfos().size()) + { + const ColumnInfo& ci = tableData.columnInfos()[daysColumnIndex]; + + QDateTime simulationStartDate = tableData.findFirstDate(); + + for (const auto& timeStepValue : ci.values) + { + QDateTime dateTime = RiaQDateTimeTools::addDays(simulationStartDate, timeStepValue); + tsVector.push_back(dateTime.toTime_t()); } - else + } + + // YEARS is interpreted as decimal years since simulation start (23.32) + if (tsVector.empty() && yearsColumnIndex != tableData.columnInfos().size()) + { + const ColumnInfo& ci = tableData.columnInfos()[yearsColumnIndex]; + + QDateTime simulationStartDate = tableData.findFirstDate(); + + for (const auto& timeStepValue : ci.values) { - QDateTime startDate = RiaQDateTimeTools::epoch(); + QDateTime dateTime = RiaQDateTimeTools::addYears(simulationStartDate, timeStepValue); + tsVector.push_back(dateTime.toTime_t()); + } + } - if (!tableData.startDate().empty()) - { - QDateTime candidate = RiaDateStringParser::parseDateString(tableData.startDate()); - if (candidate.isValid()) - { - startDate = candidate; - } - } + // DATE is interpreted as date string (6-NOV-1997) + if (tsVector.empty() && dateColumnIndex != tableData.columnInfos().size()) + { + const ColumnInfo& ci = tableData.columnInfos()[dateColumnIndex]; - if (dayOrYearColumnIndex != tableData.columnInfos().size()) - { - const ColumnInfo& ci = tableData.columnInfos()[dayOrYearColumnIndex]; + QString dateFormat; + for (auto s : ci.stringValues) + { + QDateTime dt = RiaDateStringParser::parseDateString(s); - QString unit = QString::fromStdString(ci.unitName).trimmed().toUpper(); - - if (unit == "DAY" || unit == "DAYS") - { - for (const auto& timeStepValue : ci.values) - { - QDateTime dateTime = RiaQDateTimeTools::addDays(startDate, timeStepValue); - tsVector.push_back(dateTime.toTime_t()); - } - } - else if (unit == "YEAR" || unit == "YEARS") - { - for (const auto& timeStepValue : ci.values) - { - QDateTime dateTime = RiaQDateTimeTools::addYears(startDate, timeStepValue); - tsVector.push_back(dateTime.toTime_t()); - } - } - } + tsVector.push_back(dt.toTime_t()); } } diff --git a/ApplicationCode/FileInterface/RifEclipseUserDataKeywordTools.cpp b/ApplicationCode/FileInterface/RifEclipseUserDataKeywordTools.cpp index 6a9049d719..3e5cc2225b 100644 --- a/ApplicationCode/FileInterface/RifEclipseUserDataKeywordTools.cpp +++ b/ApplicationCode/FileInterface/RifEclipseUserDataKeywordTools.cpp @@ -106,14 +106,44 @@ std::vector> RifEclipseUserDataKeywordTools::buildColum return tableHeaderText; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifEclipseUserDataKeywordTools::isTime(const std::string& identifier) +{ + return (identifier == "TIME"); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool RifEclipseUserDataKeywordTools::isDate(const std::string& identifier) { - if (identifier.find("DATE") != std::string::npos) return true; + return (identifier == "DATE"); +} - return false; +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifEclipseUserDataKeywordTools::isDays(const std::string& identifier) +{ + return (identifier.find("DAYS") != std::string::npos); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifEclipseUserDataKeywordTools::isYears(const std::string& identifier) +{ + return (identifier.find("YEARS") != std::string::npos); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifEclipseUserDataKeywordTools::isYearX(const std::string& identifier) +{ + return (identifier.find("YEARX") != std::string::npos); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/FileInterface/RifEclipseUserDataKeywordTools.h b/ApplicationCode/FileInterface/RifEclipseUserDataKeywordTools.h index 68a16d4cd0..85bdf755d6 100644 --- a/ApplicationCode/FileInterface/RifEclipseUserDataKeywordTools.h +++ b/ApplicationCode/FileInterface/RifEclipseUserDataKeywordTools.h @@ -35,7 +35,11 @@ public: const std::vector>& restOfHeaderRows, std::vector* errorText = nullptr); + static bool isTime(const std::string& identifier); static bool isDate(const std::string& identifier); + static bool isDays(const std::string& identifier); + static bool isYears(const std::string& identifier); + static bool isYearX(const std::string& identifier); static RifEclipseSummaryAddress makeAndFillAddress(const std::string quantityName, const std::vector& columnHeaderText); diff --git a/ApplicationCode/FileInterface/RifEclipseUserDataParserTools.cpp b/ApplicationCode/FileInterface/RifEclipseUserDataParserTools.cpp index 7ced94aead..561160613d 100644 --- a/ApplicationCode/FileInterface/RifEclipseUserDataParserTools.cpp +++ b/ApplicationCode/FileInterface/RifEclipseUserDataParserTools.cpp @@ -871,3 +871,26 @@ ColumnInfo ColumnInfo::createColumnInfo(const std::string& quantity, const std:: return ci; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QDateTime TableData::findFirstDate() const +{ + QDateTime dt; + + for (auto ci : m_columnInfos) + { + if (RifEclipseUserDataKeywordTools::isDate(ci.summaryAddress.quantityName())) + { + if (ci.stringValues.size() > 0) + { + std::string firstDateString = ci.stringValues[0]; + + dt = RiaDateStringParser::parseDateString(firstDateString); + } + } + } + + return dt; +} diff --git a/ApplicationCode/FileInterface/RifEclipseUserDataParserTools.h b/ApplicationCode/FileInterface/RifEclipseUserDataParserTools.h index 088414ed14..b181af1131 100644 --- a/ApplicationCode/FileInterface/RifEclipseUserDataParserTools.h +++ b/ApplicationCode/FileInterface/RifEclipseUserDataParserTools.h @@ -106,6 +106,8 @@ public: return m_columnInfos; } + QDateTime findFirstDate() const; + private: std::string m_origin; std::string m_dateFormat;