mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#2555. Add summary restart file import dialog
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
|
||||
Reference in New Issue
Block a user