2019-03-28 06:47:22 -05:00
|
|
|
/*
|
|
|
|
Copyright 2019 Statoil 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/>.
|
|
|
|
*/
|
2019-05-02 08:01:20 -05:00
|
|
|
#ifndef OPM_IO_ECLOUTPUT_HPP
|
|
|
|
#define OPM_IO_ECLOUTPUT_HPP
|
2019-03-28 06:47:22 -05:00
|
|
|
|
|
|
|
#include <fstream>
|
2019-05-02 14:14:11 -05:00
|
|
|
#include <ios>
|
|
|
|
#include <string>
|
2019-03-28 06:47:22 -05:00
|
|
|
#include <typeinfo>
|
2019-05-02 14:14:11 -05:00
|
|
|
#include <vector>
|
2019-03-28 06:47:22 -05:00
|
|
|
|
2019-05-02 08:01:20 -05:00
|
|
|
#include <opm/io/eclipse/EclIOdata.hpp>
|
2019-05-02 14:14:11 -05:00
|
|
|
#include <opm/io/eclipse/PaddedOutputString.hpp>
|
2020-03-15 04:27:50 -05:00
|
|
|
#include <iostream>
|
2019-03-28 06:47:22 -05:00
|
|
|
|
2019-05-24 08:26:01 -05:00
|
|
|
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;
|
2019-09-30 12:00:54 -05:00
|
|
|
class SummarySpecification;
|
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
|
|
|
}}}
|
|
|
|
|
2019-05-24 08:26:01 -05:00
|
|
|
namespace Opm { namespace EclIO {
|
2019-03-28 06:47:22 -05:00
|
|
|
|
|
|
|
class EclOutput
|
|
|
|
{
|
|
|
|
public:
|
2019-05-02 15:03:08 -05:00
|
|
|
EclOutput(const std::string& filename,
|
|
|
|
const bool formatted,
|
|
|
|
const std::ios_base::openmode mode = std::ios::out);
|
2019-03-28 06:47:22 -05:00
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
void write(const std::string& name,
|
|
|
|
const std::vector<T>& data)
|
|
|
|
{
|
2019-05-02 08:01:20 -05:00
|
|
|
eclArrType arrType = MESS;
|
2019-03-28 06:47:22 -05:00
|
|
|
if (typeid(T) == typeid(int))
|
2019-05-02 08:01:20 -05:00
|
|
|
arrType = INTE;
|
2019-03-28 06:47:22 -05:00
|
|
|
else if (typeid(T) == typeid(float))
|
2019-05-02 08:01:20 -05:00
|
|
|
arrType = REAL;
|
2019-03-28 06:47:22 -05:00
|
|
|
else if (typeid(T) == typeid(double))
|
2019-05-02 08:01:20 -05:00
|
|
|
arrType = DOUB;
|
2019-03-28 06:47:22 -05:00
|
|
|
else if (typeid(T) == typeid(bool))
|
2019-05-02 08:01:20 -05:00
|
|
|
arrType = LOGI;
|
2019-03-28 06:47:22 -05:00
|
|
|
else if (typeid(T) == typeid(char))
|
2019-05-02 08:01:20 -05:00
|
|
|
arrType = MESS;
|
2019-03-28 06:47:22 -05:00
|
|
|
|
|
|
|
if (isFormatted)
|
|
|
|
{
|
|
|
|
writeFormattedHeader(name, data.size(), arrType);
|
2019-05-02 08:01:20 -05:00
|
|
|
if (arrType != MESS)
|
2019-03-28 06:47:22 -05:00
|
|
|
writeFormattedArray(data);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
writeBinaryHeader(name, data.size(), arrType);
|
2019-05-02 08:01:20 -05:00
|
|
|
if (arrType != MESS)
|
2019-03-28 06:47:22 -05:00
|
|
|
writeBinaryArray(data);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-05-27 06:03:13 -05:00
|
|
|
void message(const std::string& msg);
|
2019-10-05 07:19:55 -05:00
|
|
|
void flushStream();
|
2019-05-27 06:03:13 -05:00
|
|
|
|
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;
|
2019-09-30 12:00:54 -05:00
|
|
|
friend class OutputStream::SummarySpecification;
|
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
|
|
|
|
2019-03-28 06:47:22 -05:00
|
|
|
private:
|
2020-03-23 08:27:39 -05:00
|
|
|
void writeBinaryHeader(const std::string& arrName, int64_t size, eclArrType arrType);
|
2019-03-28 06:47:22 -05:00
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
void writeBinaryArray(const std::vector<T>& data);
|
|
|
|
|
|
|
|
void writeBinaryCharArray(const std::vector<std::string>& data);
|
2019-05-02 14:14:11 -05:00
|
|
|
void writeBinaryCharArray(const std::vector<PaddedOutputString<8>>& data);
|
2019-03-28 06:47:22 -05:00
|
|
|
|
2019-05-02 08:01:20 -05:00
|
|
|
void writeFormattedHeader(const std::string& arrName, int size, eclArrType arrType);
|
2019-03-28 06:47:22 -05:00
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
void writeFormattedArray(const std::vector<T>& data);
|
|
|
|
|
|
|
|
void writeFormattedCharArray(const std::vector<std::string>& data);
|
2019-05-02 14:14:11 -05:00
|
|
|
void writeFormattedCharArray(const std::vector<PaddedOutputString<8>>& data);
|
2019-03-28 06:47:22 -05:00
|
|
|
|
2020-03-15 04:27:50 -05:00
|
|
|
void writeArrayType(const eclArrType arrType);
|
2019-03-28 06:47:22 -05:00
|
|
|
std::string make_real_string(float value) const;
|
|
|
|
std::string make_doub_string(double value) const;
|
|
|
|
|
|
|
|
bool isFormatted;
|
2019-05-02 15:03:08 -05:00
|
|
|
std::ofstream ofileH;
|
2019-03-28 06:47:22 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
template<>
|
|
|
|
void EclOutput::write<std::string>(const std::string& name,
|
|
|
|
const std::vector<std::string>& data);
|
2019-05-02 14:14:11 -05:00
|
|
|
|
|
|
|
template <>
|
|
|
|
void EclOutput::write<PaddedOutputString<8>>
|
|
|
|
(const std::string& name,
|
|
|
|
const std::vector<PaddedOutputString<8>>& data);
|
|
|
|
|
2019-05-24 08:26:01 -05:00
|
|
|
}} // namespace Opm::EclIO
|
2019-05-02 08:01:20 -05:00
|
|
|
|
|
|
|
#endif // OPM_IO_ECLOUTPUT_HPP
|