/*
Copyright 2019 Equinor
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 .
*/
#define BOOST_TEST_MODULE OutputStream
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
namespace Opm { namespace EclIO {
// Needed by BOOST_CHECK_EQUAL_COLLECTIONS.
std::ostream&
operator<<(std::ostream& os, const EclFile::EclEntry& e)
{
os << "{ " << std::get<0>(e)
<< ", " << static_cast(std::get<1>(e))
<< ", " << std::get<2>(e)
<< " }";
return os;
}
}} // Namespace Opm::ecl
namespace {
template
void check_is_close(const Coll& c1, const Coll& c2)
{
using ElmType = typename std::remove_cv<
typename std::remove_reference<
typename std::iterator_traits<
decltype(std::begin(c1))
>::value_type
>::type
>::type;
for (auto b1 = c1.begin(), e1 = c1.end(), b2 = c2.begin();
b1 != e1; ++b1, ++b2)
{
BOOST_CHECK_CLOSE(*b1, *b2, static_cast(1.0e-7));
}
}
} // Anonymous namespace
BOOST_AUTO_TEST_SUITE(FileName)
BOOST_AUTO_TEST_CASE(ResultSetDescriptor)
{
const auto odir = std::string{"/x/y/z/"};
const auto ext = std::string{"F0123"};
{
const auto rset = ::Opm::EclIO::OutputStream::ResultSet {
odir, "CASE"
};
const auto fname = outputFileName(rset, ext);
BOOST_CHECK_EQUAL(fname, odir + "CASE.F0123");
}
{
const auto rset = ::Opm::EclIO::OutputStream::ResultSet {
odir, "CASE." // CASE DOT
};
const auto fname = outputFileName(rset, ext);
BOOST_CHECK_EQUAL(fname, odir + "CASE.F0123");
}
{
const auto rset = ::Opm::EclIO::OutputStream::ResultSet {
odir, "CASE.01"
};
const auto fname = outputFileName(rset, ext);
BOOST_CHECK_EQUAL(fname, odir + "CASE.01.F0123");
}
{
const auto rset = ::Opm::EclIO::OutputStream::ResultSet {
odir, "CASE.01." // CASE.01 DOT
};
const auto fname = outputFileName(rset, ext);
BOOST_CHECK_EQUAL(fname, odir + "CASE.01.F0123");
}
}
BOOST_AUTO_TEST_SUITE_END() // FileName
// ==========================================================================
class RSet
{
public:
explicit RSet(std::string base)
: odir_(Opm::filesystem::temp_directory_path() /
Opm::unique_path("rset-%%%%"))
, base_(std::move(base))
{
Opm::filesystem::create_directories(this->odir_);
}
~RSet()
{
Opm::filesystem::remove_all(this->odir_);
}
operator ::Opm::EclIO::OutputStream::ResultSet() const
{
return { this->odir_.string(), this->base_ };
}
private:
Opm::filesystem::path odir_;
std::string base_;
};
// ==========================================================================
BOOST_AUTO_TEST_SUITE(Class_Init)
BOOST_AUTO_TEST_CASE(Unformatted)
{
const auto rset = RSet("CASE");
const auto fmt = ::Opm::EclIO::OutputStream::Formatted{ false };
{
auto init = ::Opm::EclIO::OutputStream::Init {
rset, fmt
};
init.write("I", std::vector {1, 7, 2, 9});
init.write("L", std::vector {true, false, false, true});
init.write("S", std::vector {3.1f, 4.1f, 59.265f});
init.write("D", std::vector{2.71, 8.21});
}
{
const auto fname = ::Opm::EclIO::OutputStream::
outputFileName(rset, "INIT");
auto init = ::Opm::EclIO::EclFile{fname};
BOOST_CHECK(init.hasKey("I"));
BOOST_CHECK(init.hasKey("L"));
BOOST_CHECK(init.hasKey("S"));
BOOST_CHECK(init.hasKey("D"));
{
const auto vectors = init.getList();
const auto expect_vectors = std::vector{
Opm::EclIO::EclFile::EclEntry{"I", Opm::EclIO::eclArrType::INTE, 4},
Opm::EclIO::EclFile::EclEntry{"L", Opm::EclIO::eclArrType::LOGI, 4},
Opm::EclIO::EclFile::EclEntry{"S", Opm::EclIO::eclArrType::REAL, 3},
Opm::EclIO::EclFile::EclEntry{"D", Opm::EclIO::eclArrType::DOUB, 2},
};
BOOST_CHECK_EQUAL_COLLECTIONS(vectors.begin(), vectors.end(),
expect_vectors.begin(),
expect_vectors.end());
}
init.loadData();
{
const auto& I = init.get("I");
const auto expect_I = std::vector{ 1, 7, 2, 9 };
BOOST_CHECK_EQUAL_COLLECTIONS(I.begin(), I.end(),
expect_I.begin(),
expect_I.end());
}
{
const auto& L = init.get("L");
const auto expect_L = std::vector {
true, false, false, true,
};
BOOST_CHECK_EQUAL_COLLECTIONS(L.begin(), L.end(),
expect_L.begin(),
expect_L.end());
}
{
const auto& S = init.get("S");
const auto expect_S = std::vector{
3.1f, 4.1f, 59.265f,
};
check_is_close(S, expect_S);
}
{
const auto& D = init.get("D");
const auto expect_D = std::vector{
2.71, 8.21,
};
check_is_close(D, expect_D);
}
}
// Second write request replaces original contents
{
auto init = ::Opm::EclIO::OutputStream::Init {
rset, fmt
};
init.write("I2", std::vector {1, 2, 3, 4, 5, 6});
init.write("L2", std::vector {false, false, true, true});
init.write("S2", std::vector {-1.0f, 2.0f, -3.0e-4f});
init.write("D2", std::vector{2.71, 8.21, 18.28459});
}
{
const auto fname = ::Opm::EclIO::OutputStream::
outputFileName(rset, "INIT");
auto init = ::Opm::EclIO::EclFile{fname};
BOOST_CHECK(!init.hasKey("I"));
BOOST_CHECK(!init.hasKey("L"));
BOOST_CHECK(!init.hasKey("S"));
BOOST_CHECK(!init.hasKey("D"));
BOOST_CHECK(init.hasKey("I2"));
BOOST_CHECK(init.hasKey("L2"));
BOOST_CHECK(init.hasKey("S2"));
BOOST_CHECK(init.hasKey("D2"));
{
const auto vectors = init.getList();
const auto expect_vectors = std::vector{
Opm::EclIO::EclFile::EclEntry{"I2", Opm::EclIO::eclArrType::INTE, 6},
Opm::EclIO::EclFile::EclEntry{"L2", Opm::EclIO::eclArrType::LOGI, 4},
Opm::EclIO::EclFile::EclEntry{"S2", Opm::EclIO::eclArrType::REAL, 3},
Opm::EclIO::EclFile::EclEntry{"D2", Opm::EclIO::eclArrType::DOUB, 3},
};
BOOST_CHECK_EQUAL_COLLECTIONS(vectors.begin(), vectors.end(),
expect_vectors.begin(),
expect_vectors.end());
}
init.loadData();
{
const auto& I = init.get("I2");
const auto expect_I = std::vector{ 1, 2, 3, 4, 5, 6 };
BOOST_CHECK_EQUAL_COLLECTIONS(I.begin(), I.end(),
expect_I.begin(),
expect_I.end());
}
{
const auto& L = init.get("L2");
const auto expect_L = std::vector {
false, false, true, true,
};
BOOST_CHECK_EQUAL_COLLECTIONS(L.begin(), L.end(),
expect_L.begin(),
expect_L.end());
}
{
const auto& S = init.get("S2");
const auto expect_S = std::vector{
-1.0f, 2.0f, -3.0e-4f,
};
check_is_close(S, expect_S);
}
{
const auto& D = init.get("D2");
const auto expect_D = std::vector{
2.71, 8.21, 18.28459,
};
check_is_close(D, expect_D);
}
}
}
BOOST_AUTO_TEST_CASE(Formatted)
{
const auto rset = RSet("CASE");
const auto fmt = ::Opm::EclIO::OutputStream::Formatted{ true };
{
auto init = ::Opm::EclIO::OutputStream::Init {
rset, fmt
};
init.write("I", std::vector {1, 7, 2, 9});
init.write("L", std::vector {true, false, false, true});
init.write("S", std::vector {3.1f, 4.1f, 59.265f});
init.write("D", std::vector{2.71, 8.21});
}
{
const auto fname = ::Opm::EclIO::OutputStream::
outputFileName(rset, "FINIT");
auto init = ::Opm::EclIO::EclFile{fname};
BOOST_CHECK(init.hasKey("I"));
BOOST_CHECK(init.hasKey("L"));
BOOST_CHECK(init.hasKey("S"));
BOOST_CHECK(init.hasKey("D"));
{
const auto vectors = init.getList();
const auto expect_vectors = std::vector{
Opm::EclIO::EclFile::EclEntry{"I", Opm::EclIO::eclArrType::INTE, 4},
Opm::EclIO::EclFile::EclEntry{"L", Opm::EclIO::eclArrType::LOGI, 4},
Opm::EclIO::EclFile::EclEntry{"S", Opm::EclIO::eclArrType::REAL, 3},
Opm::EclIO::EclFile::EclEntry{"D", Opm::EclIO::eclArrType::DOUB, 2},
};
BOOST_CHECK_EQUAL_COLLECTIONS(vectors.begin(), vectors.end(),
expect_vectors.begin(),
expect_vectors.end());
}
init.loadData();
{
const auto& I = init.get("I");
const auto expect_I = std::vector{ 1, 7, 2, 9 };
BOOST_CHECK_EQUAL_COLLECTIONS(I.begin(), I.end(),
expect_I.begin(),
expect_I.end());
}
{
const auto& L = init.get("L");
const auto expect_L = std::vector {
true, false, false, true,
};
BOOST_CHECK_EQUAL_COLLECTIONS(L.begin(), L.end(),
expect_L.begin(),
expect_L.end());
}
{
const auto& S = init.get("S");
const auto expect_S = std::vector{
3.1f, 4.1f, 59.265f,
};
check_is_close(S, expect_S);
}
{
const auto& D = init.get("D");
const auto expect_D = std::vector{
2.71, 8.21,
};
check_is_close(D, expect_D);
}
}
// Second write request replaces original contents
{
auto init = ::Opm::EclIO::OutputStream::Init {
rset, fmt
};
init.write("I2", std::vector {1, 2, 3, 4, 5, 6});
init.write("L2", std::vector {false, false, true, true});
init.write("S2", std::vector {-1.0f, 2.0f, -3.0e-4f});
init.write("D2", std::vector{2.71, 8.21, 18.28459});
}
{
const auto fname = ::Opm::EclIO::OutputStream::
outputFileName(rset, "FINIT");
auto init = ::Opm::EclIO::EclFile{fname};
BOOST_CHECK(!init.hasKey("I"));
BOOST_CHECK(!init.hasKey("L"));
BOOST_CHECK(!init.hasKey("S"));
BOOST_CHECK(!init.hasKey("D"));
BOOST_CHECK(init.hasKey("I2"));
BOOST_CHECK(init.hasKey("L2"));
BOOST_CHECK(init.hasKey("S2"));
BOOST_CHECK(init.hasKey("D2"));
{
const auto vectors = init.getList();
const auto expect_vectors = std::vector{
Opm::EclIO::EclFile::EclEntry{"I2", Opm::EclIO::eclArrType::INTE, 6},
Opm::EclIO::EclFile::EclEntry{"L2", Opm::EclIO::eclArrType::LOGI, 4},
Opm::EclIO::EclFile::EclEntry{"S2", Opm::EclIO::eclArrType::REAL, 3},
Opm::EclIO::EclFile::EclEntry{"D2", Opm::EclIO::eclArrType::DOUB, 3},
};
BOOST_CHECK_EQUAL_COLLECTIONS(vectors.begin(), vectors.end(),
expect_vectors.begin(),
expect_vectors.end());
}
init.loadData();
{
const auto& I = init.get("I2");
const auto expect_I = std::vector{ 1, 2, 3, 4, 5, 6 };
BOOST_CHECK_EQUAL_COLLECTIONS(I.begin(), I.end(),
expect_I.begin(),
expect_I.end());
}
{
const auto& L = init.get("L2");
const auto expect_L = std::vector {
false, false, true, true,
};
BOOST_CHECK_EQUAL_COLLECTIONS(L.begin(), L.end(),
expect_L.begin(),
expect_L.end());
}
{
const auto& S = init.get("S2");
const auto expect_S = std::vector{
-1.0f, 2.0f, -3.0e-4f,
};
check_is_close(S, expect_S);
}
{
const auto& D = init.get("D2");
const auto expect_D = std::vector{
2.71, 8.21, 18.28459,
};
check_is_close(D, expect_D);
}
}
}
BOOST_AUTO_TEST_SUITE_END()
// ==========================================================================
BOOST_AUTO_TEST_SUITE(Class_Restart)
BOOST_AUTO_TEST_CASE(Unformatted_Unified)
{
const auto rset = RSet("CASE");
const auto fmt = ::Opm::EclIO::OutputStream::Formatted{ false };
const auto unif = ::Opm::EclIO::OutputStream::Unified { true };
{
const auto seqnum = 1;
auto rst = ::Opm::EclIO::OutputStream::Restart {
rset, seqnum, fmt, unif
};
rst.write("I", std::vector {1, 7, 2, 9});
rst.write("L", std::vector {true, false, false, true});
rst.write("S", std::vector {3.1f, 4.1f, 59.265f});
rst.write("D", std::vector {2.71, 8.21});
rst.write("Z", std::vector{"W1", "W2"});
}
{
const auto seqnum = 13;
auto rst = ::Opm::EclIO::OutputStream::Restart {
rset, seqnum, fmt, unif
};
rst.write("I", std::vector {35, 51, 13});
rst.write("L", std::vector {true, true, true, false});
rst.write("S", std::vector {17.29e-02f, 1.4142f});
rst.write("D", std::vector {0.6931, 1.6180, 123.45e6});
rst.write("Z", std::vector{"G1", "FIELD"});
}
{
const auto fname = ::Opm::EclIO::OutputStream::
outputFileName(rset, "UNRST");
auto rst = ::Opm::EclIO::ERst{fname};
BOOST_CHECK(rst.hasReportStepNumber( 1));
BOOST_CHECK(rst.hasReportStepNumber(13));
{
const auto seqnum = rst.listOfReportStepNumbers();
const auto expect_seqnum = std::vector{1, 13};
BOOST_CHECK_EQUAL_COLLECTIONS(seqnum.begin(), seqnum.end(),
expect_seqnum.begin(),
expect_seqnum.end());
}
{
const auto vectors = rst.listOfRstArrays(13);
const auto expect_vectors = std::vector{
Opm::EclIO::EclFile::EclEntry{"SEQNUM", Opm::EclIO::eclArrType::INTE, 1},
Opm::EclIO::EclFile::EclEntry{"I", Opm::EclIO::eclArrType::INTE, 3},
Opm::EclIO::EclFile::EclEntry{"L", Opm::EclIO::eclArrType::LOGI, 4},
Opm::EclIO::EclFile::EclEntry{"S", Opm::EclIO::eclArrType::REAL, 2},
Opm::EclIO::EclFile::EclEntry{"D", Opm::EclIO::eclArrType::DOUB, 3},
Opm::EclIO::EclFile::EclEntry{"Z", Opm::EclIO::eclArrType::CHAR, 2},
};
BOOST_CHECK_EQUAL_COLLECTIONS(vectors.begin(), vectors.end(),
expect_vectors.begin(),
expect_vectors.end());
}
rst.loadReportStepNumber(13);
{
const auto& I = rst.getRst("I", 13, 0);
const auto expect_I = std::vector{ 35, 51, 13};
BOOST_CHECK_EQUAL_COLLECTIONS(I.begin(), I.end(),
expect_I.begin(),
expect_I.end());
}
{
const auto& L = rst.getRst("L", 13, 0);
const auto expect_L = std::vector {
true, true, true, false,
};
BOOST_CHECK_EQUAL_COLLECTIONS(L.begin(), L.end(),
expect_L.begin(),
expect_L.end());
}
{
const auto& S = rst.getRst("S", 13, 0);
const auto expect_S = std::vector{
17.29e-02f, 1.4142f,
};
check_is_close(S, expect_S);
}
{
const auto& D = rst.getRst("D", 13, 0);
const auto expect_D = std::vector{
0.6931, 1.6180, 123.45e6,
};
check_is_close(D, expect_D);
}
{
const auto& Z = rst.getRst("Z", 13, 0);
const auto expect_Z = std::vector{
"G1", "FIELD", // ERst trims trailing blanks
};
BOOST_CHECK_EQUAL_COLLECTIONS(Z.begin(), Z.end(),
expect_Z.begin(),
expect_Z.end());
}
}
{
const auto seqnum = 5; // Before 13. Should overwrite 13
auto rst = ::Opm::EclIO::OutputStream::Restart {
rset, seqnum, fmt, unif
};
rst.write("I", std::vector {1, 2, 3, 4});
rst.write("L", std::vector {false, false, false, true});
rst.write("S", std::vector {1.23e-04f, 1.234e5f, -5.4321e-9f});
rst.write("D", std::vector {0.6931, 1.6180});
rst.write("Z", std::vector{"HELLO", ", ", "WORLD"});
}
{
const auto fname = ::Opm::EclIO::OutputStream::
outputFileName(rset, "UNRST");
auto rst = ::Opm::EclIO::ERst{fname};
BOOST_CHECK( rst.hasReportStepNumber( 1));
BOOST_CHECK( rst.hasReportStepNumber( 5));
BOOST_CHECK(!rst.hasReportStepNumber(13));
{
const auto seqnum = rst.listOfReportStepNumbers();
const auto expect_seqnum = std::vector{1, 5};
BOOST_CHECK_EQUAL_COLLECTIONS(seqnum.begin(), seqnum.end(),
expect_seqnum.begin(),
expect_seqnum.end());
}
{
const auto vectors = rst.listOfRstArrays(5);
const auto expect_vectors = std::vector{
Opm::EclIO::EclFile::EclEntry{"SEQNUM", Opm::EclIO::eclArrType::INTE, 1},
Opm::EclIO::EclFile::EclEntry{"I", Opm::EclIO::eclArrType::INTE, 4},
Opm::EclIO::EclFile::EclEntry{"L", Opm::EclIO::eclArrType::LOGI, 4},
Opm::EclIO::EclFile::EclEntry{"S", Opm::EclIO::eclArrType::REAL, 3},
Opm::EclIO::EclFile::EclEntry{"D", Opm::EclIO::eclArrType::DOUB, 2},
Opm::EclIO::EclFile::EclEntry{"Z", Opm::EclIO::eclArrType::CHAR, 3},
};
BOOST_CHECK_EQUAL_COLLECTIONS(vectors.begin(), vectors.end(),
expect_vectors.begin(),
expect_vectors.end());
}
rst.loadReportStepNumber(5);
{
const auto& I = rst.getRst("I", 5, 0);
const auto expect_I = std::vector{ 1, 2, 3, 4 };
BOOST_CHECK_EQUAL_COLLECTIONS(I.begin(), I.end(),
expect_I.begin(),
expect_I.end());
}
{
const auto& L = rst.getRst("L", 5, 0);
const auto expect_L = std::vector {
false, false, false, true,
};
BOOST_CHECK_EQUAL_COLLECTIONS(L.begin(), L.end(),
expect_L.begin(),
expect_L.end());
}
{
const auto& S = rst.getRst("S", 5, 0);
const auto expect_S = std::vector{
1.23e-04f, 1.234e5f, -5.4321e-9f,
};
check_is_close(S, expect_S);
}
{
const auto& D = rst.getRst("D", 5, 0);
const auto expect_D = std::vector{
0.6931, 1.6180,
};
check_is_close(D, expect_D);
}
{
const auto& Z = rst.getRst("Z", 5, 0);
const auto expect_Z = std::vector{
"HELLO", ",", "WORLD", // ERst trims trailing blanks
};
BOOST_CHECK_EQUAL_COLLECTIONS(Z.begin(), Z.end(),
expect_Z.begin(),
expect_Z.end());
}
}
{
const auto seqnum = 13;
auto rst = ::Opm::EclIO::OutputStream::Restart {
rset, seqnum, fmt, unif
};
rst.write("I", std::vector {35, 51, 13});
rst.write("L", std::vector {true, true, true, false});
rst.write("S", std::vector {17.29e-02f, 1.4142f});
rst.write("D", std::vector {0.6931, 1.6180, 123.45e6});
rst.write("Z", std::vector{"G1", "FIELD"});
}
{
const auto fname = ::Opm::EclIO::OutputStream::
outputFileName(rset, "UNRST");
auto rst = ::Opm::EclIO::ERst{fname};
BOOST_CHECK(rst.hasReportStepNumber( 1));
BOOST_CHECK(rst.hasReportStepNumber( 5));
BOOST_CHECK(rst.hasReportStepNumber(13));
{
const auto seqnum = rst.listOfReportStepNumbers();
const auto expect_seqnum = std::vector{1, 5, 13};
BOOST_CHECK_EQUAL_COLLECTIONS(seqnum.begin(), seqnum.end(),
expect_seqnum.begin(),
expect_seqnum.end());
}
{
const auto vectors = rst.listOfRstArrays(13);
const auto expect_vectors = std::vector{
Opm::EclIO::EclFile::EclEntry{"SEQNUM", Opm::EclIO::eclArrType::INTE, 1},
Opm::EclIO::EclFile::EclEntry{"I", Opm::EclIO::eclArrType::INTE, 3},
Opm::EclIO::EclFile::EclEntry{"L", Opm::EclIO::eclArrType::LOGI, 4},
Opm::EclIO::EclFile::EclEntry{"S", Opm::EclIO::eclArrType::REAL, 2},
Opm::EclIO::EclFile::EclEntry{"D", Opm::EclIO::eclArrType::DOUB, 3},
Opm::EclIO::EclFile::EclEntry{"Z", Opm::EclIO::eclArrType::CHAR, 2},
};
BOOST_CHECK_EQUAL_COLLECTIONS(vectors.begin(), vectors.end(),
expect_vectors.begin(),
expect_vectors.end());
}
rst.loadReportStepNumber(13);
{
const auto& I = rst.getRst("I", 13, 0);
const auto expect_I = std::vector{ 35, 51, 13};
BOOST_CHECK_EQUAL_COLLECTIONS(I.begin(), I.end(),
expect_I.begin(),
expect_I.end());
}
{
const auto& L = rst.getRst("L", 13, 0);
const auto expect_L = std::vector {
true, true, true, false,
};
BOOST_CHECK_EQUAL_COLLECTIONS(L.begin(), L.end(),
expect_L.begin(),
expect_L.end());
}
{
const auto& S = rst.getRst("S", 13, 0);
const auto expect_S = std::vector{
17.29e-02f, 1.4142f,
};
check_is_close(S, expect_S);
}
{
const auto& D = rst.getRst("D", 13, 0);
const auto expect_D = std::vector{
0.6931, 1.6180, 123.45e6,
};
check_is_close(D, expect_D);
}
{
const auto& Z = rst.getRst("Z", 13, 0);
const auto expect_Z = std::vector{
"G1", "FIELD", // ERst trims trailing blanks
};
BOOST_CHECK_EQUAL_COLLECTIONS(Z.begin(), Z.end(),
expect_Z.begin(),
expect_Z.end());
}
}
}
BOOST_AUTO_TEST_CASE(Formatted_Separate)
{
const auto rset = RSet("CASE.T01.");
const auto fmt = ::Opm::EclIO::OutputStream::Formatted{ true };
const auto unif = ::Opm::EclIO::OutputStream::Unified { false };
{
const auto seqnum = 1;
auto rst = ::Opm::EclIO::OutputStream::Restart {
rset, seqnum, fmt, unif
};
rst.write("I", std::vector {1, 7, 2, 9});
rst.write("L", std::vector {true, false, false, true});
rst.write("S", std::vector {3.1f, 4.1f, 59.265f});
rst.write("D", std::vector {2.71, 8.21});
rst.write("Z", std::vector{"W1", "W2"});
}
{
const auto seqnum = 13;
auto rst = ::Opm::EclIO::OutputStream::Restart {
rset, seqnum, fmt, unif
};
rst.write("I", std::vector {35, 51, 13});
rst.write("L", std::vector {true, true, true, false});
rst.write("S", std::vector {17.29e-02f, 1.4142f});
rst.write("D", std::vector {0.6931, 1.6180, 123.45e6});
rst.write("Z", std::vector{"G1", "FIELD"});
}
{
using ::Opm::EclIO::OutputStream::Restart;
const auto fname = ::Opm::EclIO::OutputStream::
outputFileName(rset, "F0013");
auto rst = ::Opm::EclIO::EclFile{fname};
{
const auto vectors = rst.getList();
const auto expect_vectors = std::vector{
// No SEQNUM in separate output files
Opm::EclIO::EclFile::EclEntry{"I", Opm::EclIO::eclArrType::INTE, 3},
Opm::EclIO::EclFile::EclEntry{"L", Opm::EclIO::eclArrType::LOGI, 4},
Opm::EclIO::EclFile::EclEntry{"S", Opm::EclIO::eclArrType::REAL, 2},
Opm::EclIO::EclFile::EclEntry{"D", Opm::EclIO::eclArrType::DOUB, 3},
Opm::EclIO::EclFile::EclEntry{"Z", Opm::EclIO::eclArrType::CHAR, 2},
};
BOOST_CHECK_EQUAL_COLLECTIONS(vectors.begin(), vectors.end(),
expect_vectors.begin(),
expect_vectors.end());
}
rst.loadData();
{
const auto& I = rst.get("I");
const auto expect_I = std::vector{ 35, 51, 13 };
BOOST_CHECK_EQUAL_COLLECTIONS(I.begin(), I.end(),
expect_I.begin(),
expect_I.end());
}
{
const auto& L = rst.get("L");
const auto expect_L = std::vector {
true, true, true, false,
};
BOOST_CHECK_EQUAL_COLLECTIONS(L.begin(), L.end(),
expect_L.begin(),
expect_L.end());
}
{
const auto& S = rst.get("S");
const auto expect_S = std::vector{
17.29e-02f, 1.4142f,
};
check_is_close(S, expect_S);
}
{
const auto& D = rst.get("D");
const auto expect_D = std::vector{
0.6931, 1.6180, 123.45e6,
};
check_is_close(D, expect_D);
}
{
const auto& Z = rst.get("Z");
const auto expect_Z = std::vector{
"G1", "FIELD", // ERst trims trailing blanks
};
BOOST_CHECK_EQUAL_COLLECTIONS(Z.begin(), Z.end(),
expect_Z.begin(),
expect_Z.end());
}
}
{
// Separate output. Step 13 should be unaffected.
const auto seqnum = 5;
auto rst = ::Opm::EclIO::OutputStream::Restart {
rset, seqnum, fmt, unif
};
rst.write("I", std::vector {1, 2, 3, 4});
rst.write("L", std::vector {false, false, false, true});
rst.write("S", std::vector {1.23e-04f, 1.234e5f, -5.4321e-9f});
rst.write("D", std::vector {0.6931, 1.6180});
rst.write("Z", std::vector{"HELLO", ", ", "WORLD"});
}
{
using ::Opm::EclIO::OutputStream::Restart;
const auto fname = ::Opm::EclIO::OutputStream::
outputFileName(rset, "F0005");
auto rst = ::Opm::EclIO::EclFile{fname};
{
const auto vectors = rst.getList();
const auto expect_vectors = std::vector{
// No SEQNUM in separate output files
Opm::EclIO::EclFile::EclEntry{"I", Opm::EclIO::eclArrType::INTE, 4},
Opm::EclIO::EclFile::EclEntry{"L", Opm::EclIO::eclArrType::LOGI, 4},
Opm::EclIO::EclFile::EclEntry{"S", Opm::EclIO::eclArrType::REAL, 3},
Opm::EclIO::EclFile::EclEntry{"D", Opm::EclIO::eclArrType::DOUB, 2},
Opm::EclIO::EclFile::EclEntry{"Z", Opm::EclIO::eclArrType::CHAR, 3},
};
BOOST_CHECK_EQUAL_COLLECTIONS(vectors.begin(), vectors.end(),
expect_vectors.begin(),
expect_vectors.end());
}
rst.loadData();
{
const auto& I = rst.get("I");
const auto expect_I = std::vector{ 1, 2, 3, 4 };
BOOST_CHECK_EQUAL_COLLECTIONS(I.begin(), I.end(),
expect_I.begin(),
expect_I.end());
}
{
const auto& L = rst.get("L");
const auto expect_L = std::vector {
false, false, false, true,
};
BOOST_CHECK_EQUAL_COLLECTIONS(L.begin(), L.end(),
expect_L.begin(),
expect_L.end());
}
{
const auto& S = rst.get("S");
const auto expect_S = std::vector{
1.23e-04f, 1.234e5f, -5.4321e-9f,
};
check_is_close(S, expect_S);
}
{
const auto& D = rst.get("D");
const auto expect_D = std::vector{
0.6931, 1.6180,
};
check_is_close(D, expect_D);
}
{
const auto& Z = rst.get("Z");
const auto expect_Z = std::vector{
"HELLO", ",", "WORLD", // ERst trims trailing blanks
};
BOOST_CHECK_EQUAL_COLLECTIONS(Z.begin(), Z.end(),
expect_Z.begin(),
expect_Z.end());
}
}
// -------------------------------------------------------
// Don't rewrite step 13. Output file should still exist.
// -------------------------------------------------------
{
using ::Opm::EclIO::OutputStream::Restart;
const auto fname = ::Opm::EclIO::OutputStream::
outputFileName(rset, "F0013");
auto rst = ::Opm::EclIO::EclFile{fname};
{
const auto vectors = rst.getList();
const auto expect_vectors = std::vector{
// No SEQNUM in separate output files.
Opm::EclIO::EclFile::EclEntry{"I", Opm::EclIO::eclArrType::INTE, 3},
Opm::EclIO::EclFile::EclEntry{"L", Opm::EclIO::eclArrType::LOGI, 4},
Opm::EclIO::EclFile::EclEntry{"S", Opm::EclIO::eclArrType::REAL, 2},
Opm::EclIO::EclFile::EclEntry{"D", Opm::EclIO::eclArrType::DOUB, 3},
Opm::EclIO::EclFile::EclEntry{"Z", Opm::EclIO::eclArrType::CHAR, 2},
};
BOOST_CHECK_EQUAL_COLLECTIONS(vectors.begin(), vectors.end(),
expect_vectors.begin(),
expect_vectors.end());
}
rst.loadData();
{
const auto& I = rst.get("I");
const auto expect_I = std::vector{ 35, 51, 13 };
BOOST_CHECK_EQUAL_COLLECTIONS(I.begin(), I.end(),
expect_I.begin(),
expect_I.end());
}
{
const auto& L = rst.get("L");
const auto expect_L = std::vector {
true, true, true, false,
};
BOOST_CHECK_EQUAL_COLLECTIONS(L.begin(), L.end(),
expect_L.begin(),
expect_L.end());
}
{
const auto& S = rst.get("S");
const auto expect_S = std::vector{
17.29e-02f, 1.4142f,
};
check_is_close(S, expect_S);
}
{
const auto& D = rst.get("D");
const auto expect_D = std::vector{
0.6931, 1.6180, 123.45e6,
};
check_is_close(D, expect_D);
}
{
const auto& Z = rst.get("Z");
const auto expect_Z = std::vector{
"G1", "FIELD", // ERst trims trailing blanks
};
BOOST_CHECK_EQUAL_COLLECTIONS(Z.begin(), Z.end(),
expect_Z.begin(),
expect_Z.end());
}
}
}
BOOST_AUTO_TEST_SUITE_END() // Class_Restart
// ==========================================================================
BOOST_AUTO_TEST_SUITE(Class_RFT)
BOOST_AUTO_TEST_CASE(Unformatted_New)
{
using Char8 = ::Opm::EclIO::PaddedOutputString<8>;
const auto rset = RSet("CASE");
const auto fmt = ::Opm::EclIO::OutputStream::Formatted{ false };
const auto exist = ::Opm::EclIO::OutputStream::RFT::OpenExisting{ false };
{
auto rft = ::Opm::EclIO::OutputStream::RFT {
rset, fmt, exist
};
rft.write("I", std::vector {1, 7, 2, 9});
rft.write("S", std::vector {3.1f, 4.1f, 59.265f});
rft.write("Z", std::vector {
Char8{" Hello "}, Char8{" World "}
});
}
{
const auto fname = ::Opm::EclIO::OutputStream::
outputFileName(rset, "RFT");
auto rft = ::Opm::EclIO::EclFile{fname};
BOOST_CHECK(rft.hasKey("I"));
BOOST_CHECK(rft.hasKey("S"));
BOOST_CHECK(rft.hasKey("Z"));
BOOST_CHECK(!rft.hasKey("C"));
{
const auto vectors = rft.getList();
const auto expect_vectors = std::vector{
Opm::EclIO::EclFile::EclEntry{"I", Opm::EclIO::eclArrType::INTE, 4},
Opm::EclIO::EclFile::EclEntry{"S", Opm::EclIO::eclArrType::REAL, 3},
Opm::EclIO::EclFile::EclEntry{"Z", Opm::EclIO::eclArrType::CHAR, 2},
};
BOOST_CHECK_EQUAL_COLLECTIONS(vectors.begin(), vectors.end(),
expect_vectors.begin(),
expect_vectors.end());
}
rft.loadData();
{
const auto& I = rft.get("I");
const auto expect_I = std::vector{ 1, 7, 2, 9 };
BOOST_CHECK_EQUAL_COLLECTIONS(I.begin(), I.end(),
expect_I.begin(),
expect_I.end());
}
{
const auto& S = rft.get("S");
const auto expect_S = std::vector{
3.1f, 4.1f, 59.265f,
};
check_is_close(S, expect_S);
}
{
const auto& Z = rft.get("Z");
const auto expect_Z = std::vector{
" Hello", " World" // Trailing blanks trimmed
};
BOOST_CHECK_EQUAL_COLLECTIONS(Z.begin(), Z.end(),
expect_Z.begin(), expect_Z.end());
}
}
{
auto rft = ::Opm::EclIO::OutputStream::RFT {
rset, fmt, exist
};
rft.write("I2", std::vector {11, 22, 33});
rft.write("S2", std::vector {2.71f, 828.1f, 8.218f});
rft.write("Z2", std::vector {
Char8{"Good B"}, Char8{" ye"}, Char8{ "W0rlD" },
});
}
{
const auto fname = ::Opm::EclIO::OutputStream::
outputFileName(rset, "RFT");
auto rft = ::Opm::EclIO::EclFile{fname};
BOOST_CHECK(!rft.hasKey("I"));
BOOST_CHECK(!rft.hasKey("S"));
BOOST_CHECK(!rft.hasKey("Z"));
BOOST_CHECK(rft.hasKey("I2"));
BOOST_CHECK(rft.hasKey("S2"));
BOOST_CHECK(rft.hasKey("Z2"));
{
const auto vectors = rft.getList();
const auto expect_vectors = std::vector{
Opm::EclIO::EclFile::EclEntry{"I2", Opm::EclIO::eclArrType::INTE, 3},
Opm::EclIO::EclFile::EclEntry{"S2", Opm::EclIO::eclArrType::REAL, 3},
Opm::EclIO::EclFile::EclEntry{"Z2", Opm::EclIO::eclArrType::CHAR, 3},
};
BOOST_CHECK_EQUAL_COLLECTIONS(vectors.begin(), vectors.end(),
expect_vectors.begin(),
expect_vectors.end());
}
rft.loadData();
{
const auto& I = rft.get("I2");
const auto expect_I = std::vector{ 11, 22, 33 };
BOOST_CHECK_EQUAL_COLLECTIONS(I.begin(), I.end(),
expect_I.begin(),
expect_I.end());
}
{
const auto& S = rft.get("S2");
const auto expect_S = std::vector{
2.71f, 828.1f, 8.218f,
};
check_is_close(S, expect_S);
}
{
const auto& Z = rft.get("Z2");
const auto expect_Z = std::vector{
"Good B", " ye", "W0rlD"
};
BOOST_CHECK_EQUAL_COLLECTIONS(Z.begin(), Z.end(),
expect_Z.begin(), expect_Z.end());
}
}
}
BOOST_AUTO_TEST_CASE(Unformatted_Existing)
{
using Char8 = ::Opm::EclIO::PaddedOutputString<8>;
const auto rset = RSet("CASE");
const auto fmt = ::Opm::EclIO::OutputStream::Formatted{ false };
const auto exist = ::Opm::EclIO::OutputStream::RFT::OpenExisting{ true };
{
auto rft = ::Opm::EclIO::OutputStream::RFT {
rset, fmt, exist
};
rft.write("I", std::vector {1, 7, 2, 9});
rft.write("S", std::vector {3.1f, 4.1f, 59.265f});
rft.write("Z", std::vector {
Char8{" Hello "}, Char8{" World "}
});
}
{
const auto fname = ::Opm::EclIO::OutputStream::
outputFileName(rset, "RFT");
auto rft = ::Opm::EclIO::EclFile{fname};
BOOST_CHECK(rft.hasKey("I"));
BOOST_CHECK(rft.hasKey("S"));
BOOST_CHECK(rft.hasKey("Z"));
BOOST_CHECK(!rft.hasKey("C"));
{
const auto vectors = rft.getList();
const auto expect_vectors = std::vector{
Opm::EclIO::EclFile::EclEntry{"I", Opm::EclIO::eclArrType::INTE, 4},
Opm::EclIO::EclFile::EclEntry{"S", Opm::EclIO::eclArrType::REAL, 3},
Opm::EclIO::EclFile::EclEntry{"Z", Opm::EclIO::eclArrType::CHAR, 2},
};
BOOST_CHECK_EQUAL_COLLECTIONS(vectors.begin(), vectors.end(),
expect_vectors.begin(),
expect_vectors.end());
}
rft.loadData();
{
const auto& I = rft.get("I");
const auto expect_I = std::vector{ 1, 7, 2, 9 };
BOOST_CHECK_EQUAL_COLLECTIONS(I.begin(), I.end(),
expect_I.begin(),
expect_I.end());
}
{
const auto& S = rft.get("S");
const auto expect_S = std::vector{
3.1f, 4.1f, 59.265f,
};
check_is_close(S, expect_S);
}
{
const auto& Z = rft.get("Z");
const auto expect_Z = std::vector{
" Hello", " World" // Trailing blanks trimmed
};
BOOST_CHECK_EQUAL_COLLECTIONS(Z.begin(), Z.end(),
expect_Z.begin(), expect_Z.end());
}
}
{
auto rft = ::Opm::EclIO::OutputStream::RFT {
rset, fmt, exist
};
rft.write("I2", std::vector {11, 22, 33});
rft.write("S2", std::vector {2.71f, 828.1f, 8.218f});
rft.write("Z2", std::vector {
Char8{"Good B"}, Char8{" ye"}, Char8{ "W0rlD" },
});
}
{
const auto fname = ::Opm::EclIO::OutputStream::
outputFileName(rset, "RFT");
auto rft = ::Opm::EclIO::EclFile{fname};
BOOST_CHECK(rft.hasKey("I"));
BOOST_CHECK(rft.hasKey("S"));
BOOST_CHECK(rft.hasKey("Z"));
BOOST_CHECK(rft.hasKey("I2"));
BOOST_CHECK(rft.hasKey("S2"));
BOOST_CHECK(rft.hasKey("Z2"));
BOOST_CHECK(!rft.hasKey("C"));
{
const auto vectors = rft.getList();
const auto expect_vectors = std::vector{
Opm::EclIO::EclFile::EclEntry{"I", Opm::EclIO::eclArrType::INTE, 4},
Opm::EclIO::EclFile::EclEntry{"S", Opm::EclIO::eclArrType::REAL, 3},
Opm::EclIO::EclFile::EclEntry{"Z", Opm::EclIO::eclArrType::CHAR, 2},
Opm::EclIO::EclFile::EclEntry{"I2", Opm::EclIO::eclArrType::INTE, 3},
Opm::EclIO::EclFile::EclEntry{"S2", Opm::EclIO::eclArrType::REAL, 3},
Opm::EclIO::EclFile::EclEntry{"Z2", Opm::EclIO::eclArrType::CHAR, 3},
};
BOOST_CHECK_EQUAL_COLLECTIONS(vectors.begin(), vectors.end(),
expect_vectors.begin(),
expect_vectors.end());
}
rft.loadData();
{
const auto& I = rft.get("I");
const auto expect_I = std::vector{ 1, 7, 2, 9 };
BOOST_CHECK_EQUAL_COLLECTIONS(I.begin(), I.end(),
expect_I.begin(),
expect_I.end());
}
{
const auto& S = rft.get("S");
const auto expect_S = std::vector{
3.1f, 4.1f, 59.265f,
};
check_is_close(S, expect_S);
}
{
const auto& Z = rft.get("Z");
const auto expect_Z = std::vector{
" Hello", " World" // Trailing blanks trimmed
};
BOOST_CHECK_EQUAL_COLLECTIONS(Z.begin(), Z.end(),
expect_Z.begin(), expect_Z.end());
}
{
const auto& I = rft.get("I2");
const auto expect_I = std::vector{ 11, 22, 33 };
BOOST_CHECK_EQUAL_COLLECTIONS(I.begin(), I.end(),
expect_I.begin(),
expect_I.end());
}
{
const auto& S = rft.get("S2");
const auto expect_S = std::vector{
2.71f, 828.1f, 8.218f,
};
check_is_close(S, expect_S);
}
{
const auto& Z = rft.get("Z2");
const auto expect_Z = std::vector{
"Good B", " ye", "W0rlD"
};
BOOST_CHECK_EQUAL_COLLECTIONS(Z.begin(), Z.end(),
expect_Z.begin(), expect_Z.end());
}
}
}
BOOST_AUTO_TEST_CASE(Formatted_New)
{
using Char8 = ::Opm::EclIO::PaddedOutputString<8>;
const auto rset = RSet("CASE");
const auto fmt = ::Opm::EclIO::OutputStream::Formatted{ true };
const auto exist = ::Opm::EclIO::OutputStream::RFT::OpenExisting{ false };
{
auto rft = ::Opm::EclIO::OutputStream::RFT {
rset, fmt, exist
};
rft.write("I", std::vector {1, 7, 2, 9});
rft.write("S", std::vector {3.1f, 4.1f, 59.265f});
rft.write("Z", std::vector {
Char8{" Hello "}, Char8{" World "}
});
}
{
const auto fname = ::Opm::EclIO::OutputStream::
outputFileName(rset, "FRFT");
auto rft = ::Opm::EclIO::EclFile{fname};
BOOST_CHECK(rft.hasKey("I"));
BOOST_CHECK(rft.hasKey("S"));
BOOST_CHECK(rft.hasKey("Z"));
BOOST_CHECK(!rft.hasKey("C"));
{
const auto vectors = rft.getList();
const auto expect_vectors = std::vector{
Opm::EclIO::EclFile::EclEntry{"I", Opm::EclIO::eclArrType::INTE, 4},
Opm::EclIO::EclFile::EclEntry{"S", Opm::EclIO::eclArrType::REAL, 3},
Opm::EclIO::EclFile::EclEntry{"Z", Opm::EclIO::eclArrType::CHAR, 2},
};
BOOST_CHECK_EQUAL_COLLECTIONS(vectors.begin(), vectors.end(),
expect_vectors.begin(),
expect_vectors.end());
}
rft.loadData();
{
const auto& I = rft.get("I");
const auto expect_I = std::vector{ 1, 7, 2, 9 };
BOOST_CHECK_EQUAL_COLLECTIONS(I.begin(), I.end(),
expect_I.begin(),
expect_I.end());
}
{
const auto& S = rft.get("S");
const auto expect_S = std::vector{
3.1f, 4.1f, 59.265f,
};
check_is_close(S, expect_S);
}
{
const auto& Z = rft.get("Z");
const auto expect_Z = std::vector{
" Hello", " World" // Trailing blanks trimmed
};
BOOST_CHECK_EQUAL_COLLECTIONS(Z.begin(), Z.end(),
expect_Z.begin(), expect_Z.end());
}
}
{
auto rft = ::Opm::EclIO::OutputStream::RFT {
rset, fmt, exist
};
rft.write("I2", std::vector {11, 22, 33});
rft.write("S2", std::vector {2.71f, 828.1f, 8.218f});
rft.write("Z2", std::vector {
Char8{"Good B"}, Char8{" ye"}, Char8{ "W0rlD" },
});
}
{
const auto fname = ::Opm::EclIO::OutputStream::
outputFileName(rset, "FRFT");
auto rft = ::Opm::EclIO::EclFile{fname};
BOOST_CHECK(!rft.hasKey("I"));
BOOST_CHECK(!rft.hasKey("S"));
BOOST_CHECK(!rft.hasKey("Z"));
BOOST_CHECK(rft.hasKey("I2"));
BOOST_CHECK(rft.hasKey("S2"));
BOOST_CHECK(rft.hasKey("Z2"));
{
const auto vectors = rft.getList();
const auto expect_vectors = std::vector{
Opm::EclIO::EclFile::EclEntry{"I2", Opm::EclIO::eclArrType::INTE, 3},
Opm::EclIO::EclFile::EclEntry{"S2", Opm::EclIO::eclArrType::REAL, 3},
Opm::EclIO::EclFile::EclEntry{"Z2", Opm::EclIO::eclArrType::CHAR, 3},
};
BOOST_CHECK_EQUAL_COLLECTIONS(vectors.begin(), vectors.end(),
expect_vectors.begin(),
expect_vectors.end());
}
rft.loadData();
{
const auto& I = rft.get("I2");
const auto expect_I = std::vector{ 11, 22, 33 };
BOOST_CHECK_EQUAL_COLLECTIONS(I.begin(), I.end(),
expect_I.begin(),
expect_I.end());
}
{
const auto& S = rft.get("S2");
const auto expect_S = std::vector{
2.71f, 828.1f, 8.218f,
};
check_is_close(S, expect_S);
}
{
const auto& Z = rft.get("Z2");
const auto expect_Z = std::vector{
"Good B", " ye", "W0rlD"
};
BOOST_CHECK_EQUAL_COLLECTIONS(Z.begin(), Z.end(),
expect_Z.begin(), expect_Z.end());
}
}
}
BOOST_AUTO_TEST_CASE(Formatted_Existing)
{
using Char8 = ::Opm::EclIO::PaddedOutputString<8>;
const auto rset = RSet("CASE");
const auto fmt = ::Opm::EclIO::OutputStream::Formatted{ true };
const auto exist = ::Opm::EclIO::OutputStream::RFT::OpenExisting{ true };
{
auto rft = ::Opm::EclIO::OutputStream::RFT {
rset, fmt, exist
};
rft.write("I", std::vector {1, 7, 2, 9});
rft.write("S", std::vector {3.1f, 4.1f, 59.265f});
rft.write("Z", std::vector {
Char8{" Hello "}, Char8{" World "}
});
}
{
const auto fname = ::Opm::EclIO::OutputStream::
outputFileName(rset, "FRFT");
auto rft = ::Opm::EclIO::EclFile{fname};
BOOST_CHECK(rft.hasKey("I"));
BOOST_CHECK(rft.hasKey("S"));
BOOST_CHECK(rft.hasKey("Z"));
BOOST_CHECK(!rft.hasKey("C"));
{
const auto vectors = rft.getList();
const auto expect_vectors = std::vector{
Opm::EclIO::EclFile::EclEntry{"I", Opm::EclIO::eclArrType::INTE, 4},
Opm::EclIO::EclFile::EclEntry{"S", Opm::EclIO::eclArrType::REAL, 3},
Opm::EclIO::EclFile::EclEntry{"Z", Opm::EclIO::eclArrType::CHAR, 2},
};
BOOST_CHECK_EQUAL_COLLECTIONS(vectors.begin(), vectors.end(),
expect_vectors.begin(),
expect_vectors.end());
}
rft.loadData();
{
const auto& I = rft.get("I");
const auto expect_I = std::vector{ 1, 7, 2, 9 };
BOOST_CHECK_EQUAL_COLLECTIONS(I.begin(), I.end(),
expect_I.begin(),
expect_I.end());
}
{
const auto& S = rft.get("S");
const auto expect_S = std::vector{
3.1f, 4.1f, 59.265f,
};
check_is_close(S, expect_S);
}
{
const auto& Z = rft.get("Z");
const auto expect_Z = std::vector{
" Hello", " World" // Trailing blanks trimmed
};
BOOST_CHECK_EQUAL_COLLECTIONS(Z.begin(), Z.end(),
expect_Z.begin(), expect_Z.end());
}
}
{
auto rft = ::Opm::EclIO::OutputStream::RFT {
rset, fmt, exist
};
rft.write("I2", std::vector {11, 22, 33});
rft.write("S2", std::vector