opm-common/opm/io/eclipse/ERst.hpp

82 lines
2.5 KiB
C++
Raw Permalink Normal View History

/*
Copyright 2019 Equinor ASA.
This file is part of the Open Porous Media project (OPM).
OPM 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.
OPM 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 for more details.
You should have received a copy of the GNU General Public License
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef OPM_IO_ERST_HPP
#define OPM_IO_ERST_HPP
#include <opm/io/eclipse/EclFile.hpp>
#include <ios>
#include <map>
#include <string>
#include <unordered_map>
#include <vector>
namespace Opm { namespace EclIO { namespace OutputStream {
Restart Output: Add File Management Facility This commit introduces a new class, Opm::ecl::OutputStream::Restart that handles the details of opening restart output streams (all combinations of formatted/unformatted and unified/separate), as well as correctly positioning the stream 'put' indicator if we're opening an existing unified restart file. In most cases, this will be a simple append operation (std::ios_base::app), but there are some subtleties that require more precise control. The new class is befriended by EclOutput and ERst in order to access private member functions and data members of these classes. That is needed in order to handle file resize operations since some of the requisite information is only available in those two classes. We use Boost.Filesystem to implement file resize, as if by POSIX function ::truncate(), and also to simplify filename generation. These calls can be switched to std::filesystem once the project requires C++17. Intended use of the Restart class is Restart rst(resultSet, formatted, unified); rst.prepareStep(17); // Report step/SEQNUM 17. rst.write("INTEHEAD", ihead); // ... The 'prepareStep' operation opens the file stream (if needed) and also outputs a SEQNUM record in the case of a unified output stream. Moreover, the 'resultSet' is a pair of output directory and case's base name (e.g., "./mpi.np4/2019.05.14.01" and "NORNE_ATW2013") and the formatted/unified flags are bools wrapped in structures. The Restart class is intended to take over the role of the 'filename' string parameter of RestartIO::save(). Add a set of unit tests to demontrate usage and abilities of class Restart.
2019-05-27 06:03:57 -05:00
class Restart;
}}}
namespace Opm { namespace EclIO {
class ERst : public EclFile
{
public:
explicit ERst(const std::string& filename);
bool hasReportStepNumber(int number) const;
void loadReportStepNumber(int number);
template <typename T>
const std::vector<T>& getRst(const std::string& name, int reportStepNumber, int occurrence);
template <typename T>
const std::vector<T>& getRst(int index, int reportStepNumber){
auto indRange = this->getIndexRange(reportStepNumber);
return this->get<T>(index + std::get<0>(indRange));
}
int count(const std::string& name, int reportStepNumber) const;
size_t numberOfReportSteps() const { return seqnum.size(); };
const std::vector<int>& listOfReportStepNumbers() const { return seqnum; }
std::vector<EclEntry> listOfRstArrays(int reportStepNumber);
Restart Output: Add File Management Facility This commit introduces a new class, Opm::ecl::OutputStream::Restart that handles the details of opening restart output streams (all combinations of formatted/unformatted and unified/separate), as well as correctly positioning the stream 'put' indicator if we're opening an existing unified restart file. In most cases, this will be a simple append operation (std::ios_base::app), but there are some subtleties that require more precise control. The new class is befriended by EclOutput and ERst in order to access private member functions and data members of these classes. That is needed in order to handle file resize operations since some of the requisite information is only available in those two classes. We use Boost.Filesystem to implement file resize, as if by POSIX function ::truncate(), and also to simplify filename generation. These calls can be switched to std::filesystem once the project requires C++17. Intended use of the Restart class is Restart rst(resultSet, formatted, unified); rst.prepareStep(17); // Report step/SEQNUM 17. rst.write("INTEHEAD", ihead); // ... The 'prepareStep' operation opens the file stream (if needed) and also outputs a SEQNUM record in the case of a unified output stream. Moreover, the 'resultSet' is a pair of output directory and case's base name (e.g., "./mpi.np4/2019.05.14.01" and "NORNE_ATW2013") and the formatted/unified flags are bools wrapped in structures. The Restart class is intended to take over the role of the 'filename' string parameter of RestartIO::save(). Add a set of unit tests to demontrate usage and abilities of class Restart.
2019-05-27 06:03:57 -05:00
friend class OutputStream::Restart;
private:
int nReports;
std::vector<int> seqnum; // report step numbers, from SEQNUM array in restart file
std::unordered_map<int,bool> reportLoaded;
std::map<int, std::pair<int,int>> arrIndexRange; // mapping report step number to array indeces (start and end)
void initUnified();
void initSeparate(const int number);
int getArrayIndex(const std::string& name, int seqnum, int occurrence) const;
std::tuple<int,int> getIndexRange(int reportStepNumber) const;
std::streampos
restartStepWritePosition(const int seqnumValue) const;
};
}} // namespace Opm::EclIO
#endif // OPM_IO_ERST_HPP