Fixed #1229 Handle reading of invalid summary file

This commit is contained in:
Magne Sjaastad 2017-02-16 11:09:21 +01:00
parent f323aa05e4
commit 3b4fec6196
2 changed files with 32 additions and 29 deletions

View File

@ -30,7 +30,7 @@
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
RifReaderEclipseSummary::RifReaderEclipseSummary() RifReaderEclipseSummary::RifReaderEclipseSummary()
: ecl_sum(NULL) : m_ecl_sum(NULL)
{ {
} }
@ -48,7 +48,7 @@ RifReaderEclipseSummary::~RifReaderEclipseSummary()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool RifReaderEclipseSummary::open(const std::string& headerFileName, const std::vector<std::string>& dataFileNames) bool RifReaderEclipseSummary::open(const std::string& headerFileName, const std::vector<std::string>& dataFileNames)
{ {
assert(ecl_sum == NULL); assert(m_ecl_sum == NULL);
if (headerFileName.empty() || dataFileNames.size() == 0) return false; if (headerFileName.empty() || dataFileNames.size() == 0) return false;
@ -62,20 +62,17 @@ bool RifReaderEclipseSummary::open(const std::string& headerFileName, const std:
} }
std::string itemSeparatorInVariableNames = ":"; std::string itemSeparatorInVariableNames = ":";
ecl_sum = ecl_sum_fread_alloc(headerFileName.data(), dataFiles, itemSeparatorInVariableNames.data()); m_ecl_sum = ecl_sum_fread_alloc(headerFileName.data(), dataFiles, itemSeparatorInVariableNames.data());
stringlist_free(dataFiles); stringlist_free(dataFiles);
if (ecl_sum) if (m_ecl_sum)
{ {
eclSmSpec = ecl_sum_get_smspec(ecl_sum); m_ecl_SmSpec = ecl_sum_get_smspec(m_ecl_sum);
assert(eclSmSpec != NULL);
assert(ecl_sum != NULL);
for ( int time_index = 0; time_index < timeStepCount(); time_index++ ) for ( int time_index = 0; time_index < timeStepCount(); time_index++ )
{ {
time_t sim_time = ecl_sum_iget_sim_time(ecl_sum, time_index); time_t sim_time = ecl_sum_iget_sim_time(m_ecl_sum, time_index);
m_timeSteps.push_back(sim_time); m_timeSteps.push_back(sim_time);
} }
@ -90,10 +87,10 @@ bool RifReaderEclipseSummary::open(const std::string& headerFileName, const std:
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RifReaderEclipseSummary::close() void RifReaderEclipseSummary::close()
{ {
if (ecl_sum) if (m_ecl_sum)
{ {
ecl_sum_free(ecl_sum); ecl_sum_free(m_ecl_sum);
ecl_sum = NULL; m_ecl_sum = NULL;
} }
} }
@ -248,7 +245,7 @@ const std::vector<RifEclipseSummaryAddress>& RifReaderEclipseSummary::allResultA
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool RifReaderEclipseSummary::values(const RifEclipseSummaryAddress& resultAddress, std::vector<double>* values) bool RifReaderEclipseSummary::values(const RifEclipseSummaryAddress& resultAddress, std::vector<double>* values)
{ {
assert(ecl_sum != NULL); assert(m_ecl_sum != NULL);
int variableIndex = indexFromAddress(resultAddress); int variableIndex = indexFromAddress(resultAddress);
@ -258,14 +255,16 @@ bool RifReaderEclipseSummary::values(const RifEclipseSummaryAddress& resultAddre
int tsCount = timeStepCount(); int tsCount = timeStepCount();
values->reserve(timeStepCount()); values->reserve(timeStepCount());
if (m_ecl_SmSpec)
const smspec_node_type * ertSumVarNode = ecl_smspec_iget_node(eclSmSpec, variableIndex);
int paramsIndex = smspec_node_get_params_index(ertSumVarNode);
for(int time_index = 0; time_index < tsCount; time_index++)
{ {
double value = ecl_sum_iget(ecl_sum, time_index, paramsIndex); const smspec_node_type* ertSumVarNode = ecl_smspec_iget_node(m_ecl_SmSpec, variableIndex);
values->push_back(value); int paramsIndex = smspec_node_get_params_index(ertSumVarNode);
for(int time_index = 0; time_index < tsCount; time_index++)
{
double value = ecl_sum_iget(m_ecl_sum, time_index, paramsIndex);
values->push_back(value);
}
} }
return true; return true;
@ -276,9 +275,11 @@ bool RifReaderEclipseSummary::values(const RifEclipseSummaryAddress& resultAddre
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
int RifReaderEclipseSummary::timeStepCount() const int RifReaderEclipseSummary::timeStepCount() const
{ {
assert(ecl_sum != NULL); assert(m_ecl_sum != nullptr);
return ecl_sum_get_data_length(ecl_sum); if (m_ecl_SmSpec == nullptr) return 0;
return ecl_sum_get_data_length(m_ecl_sum);
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -286,7 +287,7 @@ int RifReaderEclipseSummary::timeStepCount() const
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
const std::vector<time_t>& RifReaderEclipseSummary::timeSteps() const const std::vector<time_t>& RifReaderEclipseSummary::timeSteps() const
{ {
assert(ecl_sum != NULL); assert(m_ecl_sum != NULL);
return m_timeSteps; return m_timeSteps;
} }
@ -328,12 +329,12 @@ int RifReaderEclipseSummary::indexFromAddress(const RifEclipseSummaryAddress& re
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RifReaderEclipseSummary::buildMetaData() void RifReaderEclipseSummary::buildMetaData()
{ {
if(m_allResultAddresses.size() == 0) if(m_allResultAddresses.size() == 0 && m_ecl_SmSpec)
{ {
int varCount = ecl_smspec_num_nodes(eclSmSpec); int varCount = ecl_smspec_num_nodes(m_ecl_SmSpec);
for(int i = 0; i < varCount; i++) for(int i = 0; i < varCount; i++)
{ {
const smspec_node_type * ertSumVarNode = ecl_smspec_iget_node(eclSmSpec, i); const smspec_node_type * ertSumVarNode = ecl_smspec_iget_node(m_ecl_SmSpec, i);
RifEclipseSummaryAddress addr = addressFromErtSmSpecNode(ertSumVarNode); RifEclipseSummaryAddress addr = addressFromErtSmSpecNode(ertSumVarNode);
m_allResultAddresses.push_back(addr); m_allResultAddresses.push_back(addr);
m_resultAddressToErtNodeIdx[addr] = i; m_resultAddressToErtNodeIdx[addr] = i;
@ -358,11 +359,13 @@ bool RifReaderEclipseSummary::hasAddress(const RifEclipseSummaryAddress& resultA
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
std::string RifReaderEclipseSummary::unitName(const RifEclipseSummaryAddress& resultAddress) std::string RifReaderEclipseSummary::unitName(const RifEclipseSummaryAddress& resultAddress)
{ {
if (!m_ecl_SmSpec) return "";
int variableIndex = indexFromAddress(resultAddress); int variableIndex = indexFromAddress(resultAddress);
if(variableIndex < 0) return ""; if(variableIndex < 0) return "";
const smspec_node_type * ertSumVarNode = ecl_smspec_iget_node(eclSmSpec, variableIndex); const smspec_node_type * ertSumVarNode = ecl_smspec_iget_node(m_ecl_SmSpec, variableIndex);
return smspec_node_get_unit(ertSumVarNode); return smspec_node_get_unit(ertSumVarNode);
} }

View File

@ -64,8 +64,8 @@ private:
typedef struct ecl_sum_struct ecl_sum_type; typedef struct ecl_sum_struct ecl_sum_type;
typedef struct ecl_smspec_struct ecl_smspec_type; typedef struct ecl_smspec_struct ecl_smspec_type;
ecl_sum_type* ecl_sum; ecl_sum_type* m_ecl_sum;
const ecl_smspec_type * eclSmSpec; const ecl_smspec_type * m_ecl_SmSpec;
std::vector<time_t> m_timeSteps; std::vector<time_t> m_timeSteps;
std::vector<RifEclipseSummaryAddress> m_allResultAddresses; std::vector<RifEclipseSummaryAddress> m_allResultAddresses;