ResInsight/ApplicationLibCode/FileInterface/RifReaderEclipseSummary.h
Magne Sjaastad dd97e7741a #7527 HDF Summary Reader : Add first working prototype
HDF5 must be compiled with special options to support multithreading. Disable file object multithreading for HDF5. Some vector types are not supported, as the support in opm-common reader is not complete (region, region_to_region, ...).
2021-04-08 07:13:34 -07:00

134 lines
4.5 KiB
C++

/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) Statoil ASA
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#pragma once
#include "RiaDefines.h"
#include "RifEclipseSummaryAddress.h"
#include "RifSummaryReaderInterface.h"
#include <QString>
#include <QStringList>
#include <map>
#include <memory>
#include <set>
#include <string>
#include <vector>
class RifOpmCommonEclipseSummary;
class RifOpmHdf5Summary;
class RiaThreadSafeLogger;
//==================================================================================================
//
//
//==================================================================================================
class RifRestartFileInfo
{
public:
RifRestartFileInfo()
: startDate( 0 )
, endDate( 0 )
{
}
RifRestartFileInfo( const QString& _fileName, time_t _startDate, time_t _endDate )
: fileName( _fileName )
, startDate( _startDate )
, endDate( _endDate )
{
}
bool valid() { return !fileName.isEmpty(); }
QString fileName;
time_t startDate;
time_t endDate;
};
//==================================================================================================
//
//
//==================================================================================================
class RifReaderEclipseSummary : public RifSummaryReaderInterface
{
public:
RifReaderEclipseSummary();
~RifReaderEclipseSummary() override;
bool open( const QString& headerFileName, bool includeRestartFiles, RiaThreadSafeLogger* threadSafeLogger );
std::vector<RifRestartFileInfo> getRestartFiles( const QString& headerFileName, bool* hasWarnings );
RifRestartFileInfo getFileInfo( const QString& headerFileName );
const std::vector<time_t>& timeSteps( const RifEclipseSummaryAddress& resultAddress ) const override;
bool values( const RifEclipseSummaryAddress& resultAddress, std::vector<double>* values ) const override;
std::string unitName( const RifEclipseSummaryAddress& resultAddress ) const override;
RiaDefines::EclipseUnitSystem unitSystem() const override;
QStringList warnings() const { return m_warnings; }
static std::string differenceIdentifier() { return "_DIFF"; }
static const std::string historyIdentifier() { return "H"; }
private:
size_t timeStepCount() const;
int indexFromAddress( const RifEclipseSummaryAddress& resultAddress ) const;
void buildMetaData();
RifRestartFileInfo getRestartFile( const QString& headerFileName );
private:
// Taken from ecl_sum.h
typedef struct ecl_sum_struct ecl_sum_type;
typedef struct ecl_smspec_struct ecl_smspec_type;
ecl_sum_type* m_ecl_sum;
const ecl_smspec_type* m_ecl_SmSpec;
std::vector<time_t> m_timeSteps;
RiaDefines::EclipseUnitSystem m_unitSystem;
std::map<RifEclipseSummaryAddress, int> m_resultAddressToErtNodeIdx;
QStringList m_warnings;
std::set<RifEclipseSummaryAddress> m_differenceAddresses;
std::unique_ptr<RifOpmCommonEclipseSummary> m_opmCommonReader;
std::unique_ptr<RifSummaryReaderInterface> m_hdf5OpmReader;
//==================================================================================================
//
//==================================================================================================
class ValuesCache
{
static const std::vector<double> EMPTY_VECTOR;
public:
ValuesCache();
~ValuesCache();
void insertValues( const RifEclipseSummaryAddress& address, const std::vector<double>& values );
const std::vector<double>& getValues( const RifEclipseSummaryAddress& address ) const;
private:
std::map<const RifEclipseSummaryAddress, std::vector<double>> m_cachedValues;
};
std::unique_ptr<ValuesCache> m_valuesCache;
};