opm-common/tests/test_ERsm.cpp

213 lines
18 KiB
C++

/*
Copyright 2020 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/>.
*/
#define BOOST_TEST_MODULE EclipseRSMLoader
#include <boost/test/unit_test.hpp>
#include <fstream>
#include <opm/io/eclipse/ERsm.hpp>
#include <tests/WorkArea.hpp>
#include <opm/common/utility/FileSystem.hpp>
Opm::EclIO::ERsm create(const std::string& rsm_data) {
WorkArea work_area("test_ERsm");
{
std::ofstream os("TEST.RSM");
os << rsm_data;
}
return Opm::EclIO::ERsm("TEST.RSM");
}
// Dont touch the string literals - it is all part of the format; down to the number of whitespace ... :-(
std::string block1_days = R"(1
-------------------------------------------------------------------------------------------------------------------------------
SUMMARY OF RUN nor01-temp01-rsm-all OPM FLOW VERSION 1910 ANYTHING CAN GO HERE: USER, MACHINE ETC.
-------------------------------------------------------------------------------------------------------------------------------
TIME YEARS FOPR GOPR GOPR GOPR GOPR GOPR GOPR GOPR
DAYS YEARS SM3/DAY SM3/DAY SM3/DAY SM3/DAY SM3/DAY SM3/DAY SM3/DAY SM3/DAY
MANI-C B1-DUMMY MANI-D1 INJE PROD MANI-B2 MANI-B1
-------------------------------------------------------------------------------------------------------------------------------
0 0 0 0 0 0 0 0 0 0
1.000000 0.002738 4379.802 0 0 4379.802 0 4379.802 0 0
4.000000 0.010951 4380.562 0 0 4380.562 0 4380.562 0 0
8.000000 0.021903 4381.301 0 0 4381.301 0 4381.301 0 0
)";
std::string block1_hours = R"(1
-------------------------------------------------------------------------------------------------------------------------------
SUMMARY OF RUN nor01-temp01-rsm-all OPM FLOW VERSION 1910 ANYTHING CAN GO HERE: USER, MACHINE ETC.
-------------------------------------------------------------------------------------------------------------------------------
TIME YEARS FOPR GOPR GOPR GOPR GOPR GOPR GOPR GOPR
HOURS YEARS SM3/DAY SM3/DAY SM3/DAY SM3/DAY SM3/DAY SM3/DAY SM3/DAY SM3/DAY
MANI-C B1-DUMMY MANI-D1 INJE PROD MANI-B2 MANI-B1
-------------------------------------------------------------------------------------------------------------------------------
0 0 0 0 0 0 0 0 0 0
1.000000 0.002738 4379.802 0 0 4379.802 0 4379.802 0 0
4.000000 0.010951 4380.562 0 0 4380.562 0 4380.562 0 0
8.000000 0.021903 4381.301 0 0 4381.301 0 4381.301 0 0
)";
std::string block1_date = R"(1
-------------------------------------------------------------------------------------------------------------------------------
SUMMARY OF RUN nor01-temp01-rsm-date OPM FLOW VERSION 1910 ANYTHING CAN GO HERE: USER, MACHINE ETC.
-------------------------------------------------------------------------------------------------------------------------------
DATE WWIT WWIT WWIT WWIT WWIT WWIT WWIT WWIT WWCT
SM3 SM3 SM3 SM3 SM3 SM3 SM3 SM3
*10**3 *10**3 *10**3 *10**3
C-2H C-3H C-4H C-4AH F-1H F-2H F-3H F-4H C-4H
-------------------------------------------------------------------------------------------------------------------------------
1-MAR-1999 227.7381 0 46279.20 0 0 0 0 0 0
3-MAR-1999 238.5447 0 63147.95 0 0 0 0 0 0
4-MAR-1999 243.9480 0 71582.33 0 0 0 0 0 0
5-MAR-1999 249.3513 0 80016.70 0 0 0 0 0 0
)";
std::string block2_date = R"(1
-------------------------------------------------------------------------------------------------------------------------------
SUMMARY OF RUN nor01-temp01-rsm-date OPM FLOW VERSION 1910 ANYTHING CAN GO HERE: USER, MACHINE ETC.
-------------------------------------------------------------------------------------------------------------------------------
DATE WWIT WWIT WWIT WWIT WWIT WWIT WWIT WWIT WWCT
SM3 SM3 SM3 SM3 SM3 SM3 SM3 SM3
*10**3 *10**3 *10**3 *10**3
C-2H C-3H C-4H C-4AH F-1H F-2H F-3H F-4H C-4H
-------------------------------------------------------------------------------------------------------------------------------
1-MAR-1999 227.7381 0 46279.20 0 0 0 0 0 0
3-MAR-1999 238.5447 0 63147.95 0 0 0 0 0 0
4-MAR-1999 243.9480 0 71582.33 0 0 0 0 0 0
)";
std::string missing_time = R"(1
-------------------------------------------------------------------------------------------------------------------------------
SUMMARY OF RUN nor01-temp01-rsm-date OPM FLOW VERSION 1910 ANYTHING CAN GO HERE: USER, MACHINE ETC.
-------------------------------------------------------------------------------------------------------------------------------
XDATE WWIT WWIT WWIT WWIT WWIT WWIT WWIT WWIT WWCT
SM3 SM3 SM3 SM3 SM3 SM3 SM3 SM3
*10**3 *10**3 *10**3 *10**3
C-2H C-3H C-4H C-4AH F-1H F-2H F-3H F-4H C-4H
-------------------------------------------------------------------------------------------------------------------------------
1-MAR-1999 227.7381 0 46279.20 0 0 0 0 0 0
)";
std::string no_wgnames = R"(1
-------------------------------------------------------------------------------------------------------------------------------
SUMMARY OF RUN SPE1CASE1 OPM FLOW VERSION 1910 ANYTHING CAN GO HERE: USER, MACHINE ETC.
-------------------------------------------------------------------------------------------------------------------------------
TIME DAY MONTH YEAR BGSAT BGSAT BGSAT BGSAT BGSAT BGSAT
DAYS
1 10 100 101 110 200
-------------------------------------------------------------------------------------------------------------------------------
7 8 1 2015 0 0 0 0 0 0
14 15 1 2015 0 0 0 0 0 0
21 22 1 2015 0 0 0 0 0 0
28 29 1 2015 0 0 0 0 0 0
31 1 2 2015 0 0 0 0 0 0
38 8 2 2015 0 0 0 0 0 0
45 15 2 2015 0 0 0 0 0 0
)";
std::string multiple_blocks = R"(1
-------------------------------------------------------------------------------------------------------------------------------
SUMMARY OF RUN SPE1CASE1 OPM FLOW VERSION 1910 ANYTHING CAN GO HERE: USER, MACHINE ETC.
-------------------------------------------------------------------------------------------------------------------------------
DATE BGSAT BGSAT BGSAT BGSAT BGSAT BGSAT BGSAT BGSAT BGSAT
1 10 100 101 110 200 201 210 300
-------------------------------------------------------------------------------------------------------------------------------
8-JAN-2015 0 0 0 0 0 0 0 0 0
15-JAN-2015 0 0 0 0 0 0 0 0 0
22-JAN-2015 0 0 0 0 0 0 0 0 0
29-JAN-2015 0 0 0 0 0 0 0 0 0
1-FEB-2015 0 0 0 0 0 0 0 0 0
1
-------------------------------------------------------------------------------------------------------------------------------
SUMMARY OF RUN SPE1CASE1 OPM FLOW VERSION 1910 ANYTHING CAN GO HERE: USER, MACHINE ETC.
-------------------------------------------------------------------------------------------------------------------------------
DATE BPR BPR FGOR FOPR WBHP WBHP WGIR WGIR WGIT
PSIA PSIA MSCF/STB STB/DAY PSIA PSIA MSCF/DAY MSCF/DAY MSCF
*10**3
INJ PROD INJ PROD INJ
1 300
-------------------------------------------------------------------------------------------------------------------------------
8-JAN-2015 0 0 -0 604.7999 0 0 0 0 0
15-JAN-2015 0 0 -0 1209.599 0 0 0 0 0
22-JAN-2015 0 0 -0 1814.400 0 0 0 0 0
29-JAN-2015 0 0 -0 2419.199 0 0 0 0 0
1-FEB-2015 0 0 -0 2678.399 0 0 0 0 0
)";
BOOST_AUTO_TEST_CASE(ERsm) {
BOOST_CHECK_THROW(Opm::EclIO::ERsm("file/does/not/exist"), std::invalid_argument);
BOOST_CHECK_THROW( create("SomeThingInvalid"), std::invalid_argument);
BOOST_CHECK_THROW( create( block1_date + block2_date ) , std::invalid_argument );
BOOST_CHECK_THROW( create( block1_hours ) , std::invalid_argument );
auto rsm1 = create(block1_days);
auto rsm2 = create(block1_date);
BOOST_CHECK_THROW( rsm1.dates(), std::invalid_argument);
BOOST_CHECK_THROW( rsm2.days(), std::invalid_argument);
BOOST_CHECK_THROW( rsm1.get("NO_SUCH_KEY"), std::out_of_range);
const auto& wwit_c_2h = rsm2.get("WWIT:C-2H");
BOOST_CHECK_EQUAL( wwit_c_2h.size(), 4U );
std::vector<double> expected = {227.7381, 238.5447, 243.9480, 249.3513};
for (std::size_t index = 0; index < 4; index++)
BOOST_CHECK_CLOSE( expected[index] * 1000 , wwit_c_2h[index], 1e-6);
const auto& wwit_c_4h = rsm2.get("WWIT:C-4H");
BOOST_CHECK_EQUAL( wwit_c_4h.size(), 4U );
std::vector<double> expected2 = {46279.20, 63147.95, 71582.33, 80016.70};
for (std::size_t index = 0; index < 4; index++)
BOOST_CHECK_CLOSE( expected2[index] * 1 , wwit_c_4h[index], 1e-6);
std::vector<double> expected_days = {0, 1, 4 , 8};
BOOST_CHECK( rsm1.days() == expected_days);
std::vector<Opm::TimeStampUTC> expected_dates = {{1999, 3, 1},
{1999, 3, 3},
{1999, 3, 4},
{1999, 3, 5}};
BOOST_CHECK( expected_dates == rsm2.dates() );
BOOST_CHECK( rsm2.has_dates() );
BOOST_CHECK( !rsm1.has_dates() );
BOOST_CHECK( rsm2.has("WWIT:C-2H") );
BOOST_CHECK( !rsm2.has("NO_SUCH_KEY") );
auto nums = create( no_wgnames );
BOOST_CHECK( nums.has("BGSAT:1"));
auto fopr_rsm = create( multiple_blocks );
const auto& fopr = fopr_rsm.get("FOPR");
std::vector<double> expected_fopr = {604799.9, 1209599, 1814400, 2419199, 2678399};
BOOST_CHECK(fopr == expected_fopr);
}