#2555. Add summary restart file import dialog

This commit is contained in:
Bjørn Erik Jensen
2018-03-15 14:23:48 +01:00
parent a833b5a2d7
commit 208d738846
12 changed files with 483 additions and 62 deletions

View File

@@ -18,8 +18,8 @@
#include "RifReaderEclipseSummary.h"
#include "RiaStringEncodingTools.h"
#include "ert/ecl/ecl_sum.h"
#include "RifReaderEclipseOutput.h"
#include "RifEclipseSummaryTools.h"
#include <string>
#include <assert.h>
@@ -27,8 +27,62 @@
#include <QDateTime>
#include <QString>
#include <QStringList>
#include "ert/ecl/smspec_node.h"
#include <QDir>
#include "ert/ecl/ecl_sum.h"
#include "ert/ecl/smspec_node.h"
#include "ert/ecl/ecl_file.h"
#include "ert/ecl/ecl_kw_magic.h"
#include "ert/ecl/ecl_kw.h"
std::vector<time_t> getTimeSteps(ecl_sum_type* ecl_sum)
{
std::vector<time_t> timeSteps;
for (int time_index = 0; time_index < ecl_sum_get_data_length(ecl_sum); time_index++)
{
time_t sim_time = ecl_sum_iget_sim_time(ecl_sum, time_index);
timeSteps.push_back(sim_time);
}
return timeSteps;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
ecl_sum_type* openEclSum(const QString& inHeaderFileName, bool includeRestartFiles)
{
QString headerFileName;
QStringList dataFileNames;
QString nativeHeaderFileName = QDir::toNativeSeparators(inHeaderFileName);
RifEclipseSummaryTools::findSummaryFiles(nativeHeaderFileName, &headerFileName, &dataFileNames);
if (headerFileName.isEmpty() || dataFileNames.size() == 0) return nullptr;
assert(!headerFileName.isEmpty());
assert(dataFileNames.size() > 0);
stringlist_type* dataFiles = stringlist_alloc_new();
for (int i = 0; i < dataFileNames.size(); i++)
{
stringlist_append_copy(dataFiles, RiaStringEncodingTools::toNativeEncoded(dataFileNames[i]).data());
}
std::string itemSeparatorInVariableNames = ":";
ecl_sum_type* ecl_sum = ecl_sum_fread_alloc(RiaStringEncodingTools::toNativeEncoded(headerFileName).data(), dataFiles, itemSeparatorInVariableNames.data(), includeRestartFiles);
stringlist_free(dataFiles);
return ecl_sum;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void closeEclSum(ecl_sum_type* ecl_sum)
{
if(ecl_sum) ecl_sum_free(ecl_sum);
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -54,36 +108,17 @@ RifReaderEclipseSummary::~RifReaderEclipseSummary()
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RifReaderEclipseSummary::open(const QString& headerFileName, const QStringList& dataFileNames)
bool RifReaderEclipseSummary::open(const QString& headerFileName, bool includeRestartFiles)
{
assert(m_ecl_sum == NULL);
if (headerFileName.isEmpty() || dataFileNames.size() == 0) return false;
assert(!headerFileName.isEmpty());
assert(dataFileNames.size() > 0);
stringlist_type* dataFiles = stringlist_alloc_new();
for (int i = 0; i < dataFileNames.size(); i++)
{
stringlist_append_copy(dataFiles, RiaStringEncodingTools::toNativeEncoded(dataFileNames[i]).data());
}
std::string itemSeparatorInVariableNames = ":";
m_ecl_sum = ecl_sum_fread_alloc(RiaStringEncodingTools::toNativeEncoded(headerFileName).data(), dataFiles, itemSeparatorInVariableNames.data(), false);
stringlist_free(dataFiles);
m_ecl_sum = openEclSum(headerFileName, includeRestartFiles);
if (m_ecl_sum)
{
m_timeSteps.clear();
m_ecl_SmSpec = ecl_sum_get_smspec(m_ecl_sum);
for ( int time_index = 0; time_index < timeStepCount(); time_index++ )
{
time_t sim_time = ecl_sum_iget_sim_time(m_ecl_sum, time_index);
m_timeSteps.push_back(sim_time);
}
m_timeSteps = getTimeSteps(m_ecl_sum);
buildMetaData();
@@ -93,6 +128,24 @@ bool RifReaderEclipseSummary::open(const QString& headerFileName, const QStringL
return false;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RifRestartFileInfo> RifReaderEclipseSummary::getRestartFiles(const QString& headerFileName)
{
std::vector<RifRestartFileInfo> restartFiles;
RifRestartFileInfo currFile;
currFile.fileName = headerFileName;
while(!currFile.fileName.isEmpty())
{
currFile = getRestartFile(currFile.fileName);
if (!currFile.fileName.isEmpty())
restartFiles.push_back(currFile);
}
return restartFiles;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -326,6 +379,57 @@ void RifReaderEclipseSummary::buildMetaData()
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
time_t getStartDate(ecl_file_type * header)
{
time_t startDate = 0;
ecl_kw_type *startdat = ecl_file_iget_named_kw(header, STARTDAT_KW, 0);
if (startdat)
{
int * date = ecl_kw_get_int_ptr(startdat);
startDate = ecl_util_make_date(date[STARTDAT_DAY_INDEX],
date[STARTDAT_MONTH_INDEX],
date[STARTDAT_YEAR_INDEX]);
}
return startDate;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RifRestartFileInfo RifReaderEclipseSummary::getRestartFile(const QString& headerFileName)
{
RifRestartFileInfo restartFile;
ecl_sum_type* ecl_sum = openEclSum(headerFileName, true);
const ecl_smspec_type* smspec = ecl_sum ? ecl_sum_get_smspec(ecl_sum) : nullptr;
const char* rstCase = smspec ? ecl_smspec_get_restart_case(smspec) : nullptr;
QString restartCase = rstCase? RiaStringEncodingTools::fromNativeEncoded(rstCase) : "";
closeEclSum(ecl_sum);
if (!restartCase.isEmpty())
{
QString path = QFileInfo(headerFileName).dir().path();
QString restartBase = QDir(restartCase).dirName();
char* smspec_header = ecl_util_alloc_exfilename(path.toStdString().data(), restartBase.toStdString().data(), ECL_SUMMARY_HEADER_FILE, false /*unformatted*/, 0);
restartFile.fileName = QDir::toNativeSeparators(RiaStringEncodingTools::fromNativeEncoded(smspec_header));
util_safe_free(smspec_header);
ecl_sum = openEclSum(headerFileName, false);
std::vector<time_t> timeSteps = getTimeSteps(ecl_sum);
if (timeSteps.size() > 0)
{
restartFile.startDate = timeSteps.front();
restartFile.endDate = timeSteps.back();
}
closeEclSum(ecl_sum);
}
return restartFile;
}
//--------------------------------------------------------------------------------------------------
///