#2003 Observed Data : Use time with highest available resolution

This commit is contained in:
Magne Sjaastad 2017-11-06 14:26:25 +01:00
parent 97d67f2d49
commit 9d06ef857e
5 changed files with 121 additions and 60 deletions

View File

@ -174,94 +174,96 @@ std::vector<time_t> RifColumnBasedUserData::createTimeSteps(const TableData& tab
{
std::vector<time_t> 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());
}
}

View File

@ -106,14 +106,44 @@ std::vector<std::vector<std::string>> 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);
}
//--------------------------------------------------------------------------------------------------

View File

@ -35,7 +35,11 @@ public:
const std::vector<std::vector<std::string>>& restOfHeaderRows,
std::vector<std::string>* 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<std::string>& columnHeaderText);

View File

@ -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;
}

View File

@ -106,6 +106,8 @@ public:
return m_columnInfos;
}
QDateTime findFirstDate() const;
private:
std::string m_origin;
std::string m_dateFormat;