From d938b691433e1b7fa238149cc1fdba1c1db8e74b Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Fri, 17 Sep 2021 09:49:57 +0200 Subject: [PATCH 01/11] WorkArea::org_path --- tests/WorkArea.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/WorkArea.cpp b/tests/WorkArea.cpp index 5d5ac56c1..7abb6418d 100644 --- a/tests/WorkArea.cpp +++ b/tests/WorkArea.cpp @@ -64,6 +64,11 @@ namespace { Opm::filesystem::remove_all(this->root_); } + std::string org_path(const std::string& fname) { + return Opm::filesystem::canonical( this->orig_ / fname ); + } + + private: Opm::filesystem::path root_; Opm::filesystem::path area_; From d3cd4c73bab79026aa43dfecdd492a22d22b8f7b Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Thu, 16 Sep 2021 16:43:22 +0200 Subject: [PATCH 02/11] Make sure tests can be run with readonly tests/ --- tests/parser/EclipseGridTests.cpp | 616 +++++++++++++++--------------- 1 file changed, 301 insertions(+), 315 deletions(-) diff --git a/tests/parser/EclipseGridTests.cpp b/tests/parser/EclipseGridTests.cpp index 78c3be3f4..9c9a72401 100644 --- a/tests/parser/EclipseGridTests.cpp +++ b/tests/parser/EclipseGridTests.cpp @@ -51,9 +51,11 @@ #include #include - #include +#include "tests/WorkArea.cpp" + + BOOST_AUTO_TEST_CASE(CreateMissingDIMENS_throws) { Opm::Deck deck; Opm::Parser parser; @@ -1838,123 +1840,115 @@ BOOST_AUTO_TEST_CASE(SAVE_FIELD_UNITS) { Opm::NNC nnc(grid1, deck); bool formatted = false; + { + WorkArea work; - time_t timer; - time(&timer); + time_t timer; + time(&timer); - std::string cwd = Opm::filesystem::current_path().c_str(); - std::string testDir = cwd + "/tmp_dir_" + std::to_string(timer); + std::string fileName = "TMP.EGRID"; + grid1.save(fileName, formatted, nnc.input(), units); - if ( Opm::filesystem::exists( testDir )) { - Opm::filesystem::remove_all(testDir); + Opm::EclIO::EclFile file1(fileName); + + // Values getZCORNed from the grid needs to be converted from SI to Field units + // and then converted from double to single precissions before comparing with values saved to + // the EGRID file + + // check coord + const std::vector coord_egrid = file1.get("COORD"); + std::vector coord_input_si = grid1.getCOORD(); + + BOOST_CHECK(coord_egrid.size() == coord_input_si.size()); + + std::vector coord_input_f; + coord_input_f.reserve(coord_input_si.size()); + + for (size_t n = 0; n < coord_egrid.size(); n++) { + coord_input_f.push_back(static_cast(units.from_si(length, coord_input_si[n]))); + BOOST_CHECK_CLOSE(coord_input_f[n], coord_egrid[n], 1e-6); + } + + // check zcorn + const std::vector zcorn_egrid = file1.get("ZCORN"); + std::vector zcorn_input_si = grid1.getZCORN(); + + BOOST_CHECK(zcorn_egrid.size() == zcorn_input_si.size()); + + std::vector zcorn_input_f; + zcorn_input_f.reserve(zcorn_input_si.size()); + + for (size_t n = 0; n < zcorn_egrid.size(); n++) { + zcorn_input_f.push_back(static_cast(units.from_si(length, zcorn_input_si[n]))); + BOOST_CHECK_CLOSE(zcorn_input_f[n], zcorn_egrid[n], 1e-6); + } + + BOOST_CHECK(file1.hasKey("GRIDUNIT")); + const std::vector gridunits = file1.get("GRIDUNIT"); + + BOOST_CHECK(gridunits[0] == "FEET"); + + // input deck do not hold MAPAXES or MAPUNITS entries. Below keywords should not be written to EGRID file + BOOST_CHECK(!file1.hasKey("MAPAXES")); + BOOST_CHECK(!file1.hasKey("MAPUNITS")); + + // this deck do not have any nnc. Below keywords should not be written to EGRID file + BOOST_CHECK(!file1.hasKey("NNCHEAD")); + BOOST_CHECK(!file1.hasKey("NNC1")); + BOOST_CHECK(!file1.hasKey("NNC2")); + + // testing deck in field units and MAPUNITS in METRES + auto deck2 = parser.parseString(deckData2); + + Opm::EclipseState es2(deck2); + Opm::UnitSystem units2 = es.getDeckUnitSystem(); + const auto& grid2 = es2.getInputGrid(); + Opm::NNC nnc2(grid2, deck2); + + + std::string fileName2 = "TMP2.FEGRID"; + + grid2.save(fileName2, true, nnc2.input(), units); + + Opm::EclIO::EclFile file2(fileName2); + + const std::vector& test_mapunits2 = file2.get("MAPUNITS"); + BOOST_CHECK(test_mapunits2[0] == "METRES"); + + const std::vector& test_mapaxes2 = file2.get("MAPAXES"); + + BOOST_CHECK(test_mapaxes2.size() == ref2_mapaxes.size()); + + for (size_t n = 0; n < ref2_mapaxes.size(); n++) { + BOOST_CHECK_EQUAL(ref2_mapaxes[n], test_mapaxes2[n]); + } + + // testing deck in field units and MAPUNITS in FEET + auto deck3 = parser.parseString(deckData3); + + Opm::EclipseState es3(deck3); + Opm::UnitSystem units3 = es.getDeckUnitSystem(); + const auto& grid3 = es3.getInputGrid(); + Opm::NNC nnc3(grid3, deck3); + + + std::string fileName3 = "TMP3.FEGRID"; + + grid3.save(fileName3, true, nnc3.input(), units3); + + Opm::EclIO::EclFile file3(fileName3); + + const std::vector& test_mapunits3 = file3.get("MAPUNITS"); + BOOST_CHECK(test_mapunits3[0] == "FEET"); + + const std::vector& test_mapaxes3 = file3.get("MAPAXES"); + + BOOST_CHECK(test_mapaxes3.size() == ref3_mapaxes.size()); + + for (size_t n = 0; n < ref3_mapaxes.size(); n++) { + BOOST_CHECK(ref3_mapaxes[n] == test_mapaxes3[n]); + } } - - Opm::filesystem::create_directory(testDir); - - std::string fileName = testDir + "/" + "TMP.EGRID"; - grid1.save(fileName, formatted, nnc.input(), units); - - Opm::EclIO::EclFile file1(fileName); - - // Values getZCORNed from the grid needs to be converted from SI to Field units - // and then converted from double to single precissions before comparing with values saved to - // the EGRID file - - // check coord - const std::vector coord_egrid = file1.get("COORD"); - std::vector coord_input_si = grid1.getCOORD(); - - BOOST_CHECK( coord_egrid.size() == coord_input_si.size()); - - std::vector coord_input_f; - coord_input_f.reserve(coord_input_si.size()); - - for (size_t n =0; n< coord_egrid.size(); n++) { - coord_input_f.push_back( static_cast(units.from_si(length, coord_input_si[n]))); - BOOST_CHECK_CLOSE( coord_input_f[n] , coord_egrid[n], 1e-6 ); - } - - // check zcorn - const std::vector zcorn_egrid = file1.get("ZCORN"); - std::vector zcorn_input_si = grid1.getZCORN(); - - BOOST_CHECK( zcorn_egrid.size() == zcorn_input_si.size()); - - std::vector zcorn_input_f; - zcorn_input_f.reserve(zcorn_input_si.size()); - - for (size_t n =0; n< zcorn_egrid.size(); n++) { - zcorn_input_f.push_back( static_cast(units.from_si(length, zcorn_input_si[n]))); - BOOST_CHECK_CLOSE( zcorn_input_f[n] , zcorn_egrid[n], 1e-6 ); - } - - BOOST_CHECK( file1.hasKey("GRIDUNIT")); - const std::vector gridunits = file1.get("GRIDUNIT"); - - BOOST_CHECK( gridunits[0]=="FEET"); - - // input deck do not hold MAPAXES or MAPUNITS entries. Below keywords should not be written to EGRID file - BOOST_CHECK( !file1.hasKey("MAPAXES")); - BOOST_CHECK( !file1.hasKey("MAPUNITS")); - - // this deck do not have any nnc. Below keywords should not be written to EGRID file - BOOST_CHECK( !file1.hasKey("NNCHEAD")); - BOOST_CHECK( !file1.hasKey("NNC1")); - BOOST_CHECK( !file1.hasKey("NNC2")); - - // testing deck in field units and MAPUNITS in METRES - auto deck2 = parser.parseString( deckData2) ; - - Opm::EclipseState es2(deck2); - Opm::UnitSystem units2 = es.getDeckUnitSystem(); - const auto& grid2 = es2.getInputGrid(); - Opm::NNC nnc2(grid2, deck2 ); - - - std::string fileName2 = testDir + "/" + "TMP2.FEGRID"; - - grid2.save(fileName2, true, nnc2.input(), units); - - Opm::EclIO::EclFile file2(fileName2); - - const std::vector& test_mapunits2 = file2.get("MAPUNITS"); - BOOST_CHECK( test_mapunits2[0] == "METRES"); - - const std::vector& test_mapaxes2 = file2.get("MAPAXES"); - - BOOST_CHECK( test_mapaxes2.size() == ref2_mapaxes.size()); - - for (size_t n =0; n< ref2_mapaxes.size(); n++) { - BOOST_CHECK_EQUAL( ref2_mapaxes[n], test_mapaxes2[n]); - } - - // testing deck in field units and MAPUNITS in FEET - auto deck3 = parser.parseString( deckData3) ; - - Opm::EclipseState es3(deck3); - Opm::UnitSystem units3 = es.getDeckUnitSystem(); - const auto& grid3 = es3.getInputGrid(); - Opm::NNC nnc3(grid3, deck3); - - - std::string fileName3 = testDir + "/" + "TMP3.FEGRID"; - - grid3.save(fileName3, true, nnc3.input(), units3); - - Opm::EclIO::EclFile file3(fileName3); - - const std::vector& test_mapunits3 = file3.get("MAPUNITS"); - BOOST_CHECK( test_mapunits3[0] == "FEET"); - - const std::vector& test_mapaxes3 = file3.get("MAPAXES"); - - BOOST_CHECK( test_mapaxes3.size() == ref3_mapaxes.size()); - - for (size_t n =0; n< ref3_mapaxes.size(); n++) { - BOOST_CHECK( ref3_mapaxes[n] == test_mapaxes3[n]); - } - - Opm::filesystem::remove_all(testDir); } BOOST_AUTO_TEST_CASE(SAVE_METRIC_UNITS) { @@ -2035,119 +2029,110 @@ BOOST_AUTO_TEST_CASE(SAVE_METRIC_UNITS) { time_t timer; time(&timer); - std::string cwd = Opm::filesystem::current_path().c_str(); - std::string testDir = cwd + "/tmp_dir_" + std::to_string(timer); + { + WorkArea work; + std::string fileName = "TMP.FEGRID"; + grid1.save(fileName, formatted, nnc.input(), units1); - if ( Opm::filesystem::exists( testDir )) { - Opm::filesystem::remove_all(testDir); + Opm::EclIO::EclFile file1(fileName); + + // Values getZCORNed from the grid have same units as input deck (metric), however these needs to be + // converted from double to single precissions before comparing with values saved to the EGRID file + + // check coord + const std::vector coord_egrid = file1.get("COORD"); + std::vector coord_input_si = grid1.getCOORD(); + + BOOST_CHECK(coord_egrid.size() == coord_input_si.size()); + + std::vector coord_input_f; + coord_input_f.reserve(coord_input_si.size()); + + for (size_t n = 0; n < coord_egrid.size(); n++) { + coord_input_f.push_back(static_cast(units1.from_si(length, coord_input_si[n]))); + BOOST_CHECK_CLOSE(coord_input_f[n], coord_egrid[n], 1e-6); + } + + // check zcorn + const std::vector zcorn_egrid = file1.get("ZCORN"); + std::vector zcorn_input_si = grid1.getZCORN(); + + BOOST_CHECK(zcorn_egrid.size() == zcorn_input_si.size()); + + std::vector zcorn_input_f; + zcorn_input_f.reserve(zcorn_input_si.size()); + + for (size_t n = 0; n < zcorn_egrid.size(); n++) { + zcorn_input_f.push_back(static_cast(units1.from_si(length, zcorn_input_si[n]))); + BOOST_CHECK_CLOSE(zcorn_input_f[n], zcorn_egrid[n], 1e-6); + } + + BOOST_CHECK(file1.hasKey("GRIDUNIT")); + const std::vector gridunits = file1.get("GRIDUNIT"); + + BOOST_CHECK(gridunits[0] == "METRES"); + + BOOST_CHECK(file1.hasKey("MAPAXES")); + std::vector mapaxes = file1.get("MAPAXES"); + + for (size_t n = 0; n < 6; n++) { + BOOST_CHECK_CLOSE(mapaxes[n], ref_mapaxes1[n], 1e-6); + } + + BOOST_CHECK(file1.hasKey("MAPUNITS")); + const std::vector mapunits = file1.get("MAPUNITS"); + BOOST_CHECK(gridunits[0] == "METRES"); + + BOOST_CHECK(file1.hasKey("NNCHEAD")); + const std::vector nnchead = file1.get("NNCHEAD"); + + BOOST_CHECK(nnchead[0] == static_cast(nnc.input().size())); + + std::vector ref_nnc1 = {6, 7, 8}; + std::vector ref_nnc2 = {26, 27, 28}; + + BOOST_CHECK(file1.hasKey("NNC1")); + BOOST_CHECK(file1.hasKey("NNC2")); + + const std::vector nnc1 = file1.get("NNC1"); + const std::vector nnc2 = file1.get("NNC2"); + + BOOST_CHECK(nnc1.size() == nnc2.size()); + + for (size_t n = 0; n < nnc1.size(); n++) { + BOOST_CHECK(nnc1[n] == ref_nnc1[n]); + } + + for (size_t n = 0; n < nnc2.size(); n++) { + BOOST_CHECK(nnc2[n] == ref_nnc2[n]); + } + + // testing deck in metric units with mapaxes in field units + auto deck2 = parser.parseString(deckData2); + + Opm::EclipseState es2(deck2); + Opm::UnitSystem units2 = es2.getDeckUnitSystem(); + + const auto& grid2 = es2.getInputGrid(); + // Opm::NNC nnc( deck2 ); + + std::string fileName2 = "TMP2.FEGRID"; + + grid2.save(fileName2, true, nnc.input(), units2); + + Opm::EclIO::EclFile file2(fileName2); + + const std::vector& test_mapunits2 = file2.get("MAPUNITS"); + BOOST_CHECK(test_mapunits2[0] == "FEET"); + + const std::vector& test_mapaxes2 = file2.get("MAPAXES"); + + BOOST_CHECK(test_mapaxes2.size() == ref_mapaxes2.size()); + + for (size_t n = 0; n < ref_mapaxes2.size(); n++) { + BOOST_CHECK(ref_mapaxes2[n] == test_mapaxes2[n]); + } } - - Opm::filesystem::create_directory(testDir); - - std::string fileName = testDir + "/" + "TMP.FEGRID"; - grid1.save(fileName, formatted, nnc.input(), units1); - - Opm::EclIO::EclFile file1(fileName); - - // Values getZCORNed from the grid have same units as input deck (metric), however these needs to be - // converted from double to single precissions before comparing with values saved to the EGRID file - - // check coord - const std::vector coord_egrid = file1.get("COORD"); - std::vector coord_input_si = grid1.getCOORD(); - - BOOST_CHECK( coord_egrid.size() == coord_input_si.size()); - - std::vector coord_input_f; - coord_input_f.reserve(coord_input_si.size()); - - for (size_t n =0; n< coord_egrid.size(); n++) { - coord_input_f.push_back( static_cast(units1.from_si(length, coord_input_si[n]))); - BOOST_CHECK_CLOSE( coord_input_f[n] , coord_egrid[n], 1e-6 ); - } - - // check zcorn - const std::vector zcorn_egrid = file1.get("ZCORN"); - std::vector zcorn_input_si = grid1.getZCORN(); - - BOOST_CHECK( zcorn_egrid.size() == zcorn_input_si.size()); - - std::vector zcorn_input_f; - zcorn_input_f.reserve(zcorn_input_si.size()); - - for (size_t n =0; n< zcorn_egrid.size(); n++) { - zcorn_input_f.push_back( static_cast(units1.from_si(length, zcorn_input_si[n]))); - BOOST_CHECK_CLOSE( zcorn_input_f[n] , zcorn_egrid[n], 1e-6 ); - } - - BOOST_CHECK( file1.hasKey("GRIDUNIT")); - const std::vector gridunits = file1.get("GRIDUNIT"); - - BOOST_CHECK( gridunits[0]=="METRES"); - - BOOST_CHECK( file1.hasKey("MAPAXES")); - std::vector mapaxes = file1.get("MAPAXES"); - - for (size_t n = 0; n < 6; n++) { - BOOST_CHECK_CLOSE( mapaxes[n] , ref_mapaxes1[n], 1e-6 ); - } - - BOOST_CHECK( file1.hasKey("MAPUNITS")); - const std::vector mapunits = file1.get("MAPUNITS"); - BOOST_CHECK( gridunits[0]=="METRES"); - - BOOST_CHECK( file1.hasKey("NNCHEAD")); - const std::vector nnchead = file1.get("NNCHEAD"); - - BOOST_CHECK( nnchead[0] == static_cast(nnc.input().size()) ); - - std::vector ref_nnc1 = { 6, 7, 8 }; - std::vector ref_nnc2 = { 26, 27, 28 }; - - BOOST_CHECK( file1.hasKey("NNC1")); - BOOST_CHECK( file1.hasKey("NNC2")); - - const std::vector nnc1 = file1.get("NNC1"); - const std::vector nnc2 = file1.get("NNC2"); - - BOOST_CHECK( nnc1.size() == nnc2.size() ); - - for (size_t n =0; n< nnc1.size(); n++) { - BOOST_CHECK( nnc1[n] == ref_nnc1[n] ); - } - - for (size_t n =0; n< nnc2.size(); n++) { - BOOST_CHECK( nnc2[n] == ref_nnc2[n] ); - } - - // testing deck in metric units with mapaxes in field units - auto deck2 = parser.parseString( deckData2) ; - - Opm::EclipseState es2(deck2); - Opm::UnitSystem units2 = es2.getDeckUnitSystem(); - - const auto& grid2 = es2.getInputGrid(); - //Opm::NNC nnc( deck2 ); - - std::string fileName2 = testDir + "/" + "TMP2.FEGRID"; - - grid2.save(fileName2, true, nnc.input(), units2); - - Opm::EclIO::EclFile file2(fileName2); - - const std::vector& test_mapunits2 = file2.get("MAPUNITS"); - BOOST_CHECK( test_mapunits2[0] == "FEET"); - - const std::vector& test_mapaxes2 = file2.get("MAPAXES"); - - BOOST_CHECK( test_mapaxes2.size() == ref_mapaxes2.size()); - - for (size_t n =0; n< ref_mapaxes2.size(); n++) { - BOOST_CHECK( ref_mapaxes2[n] == test_mapaxes2[n]); - } - - - Opm::filesystem::remove_all(testDir); } BOOST_AUTO_TEST_CASE(CalcCellDims) { @@ -2775,106 +2760,107 @@ BOOST_AUTO_TEST_CASE(TEST_GDFILE_2) { const auto& grid1a = es1a.getInputGrid(); Opm::NNC nnc(grid1a, deck1a); + { + WorkArea work; + grid1a.save("BAD_CP_M.EGRID", false, nnc.input(), units1a); - grid1a.save("BAD_CP_M.EGRID", false, nnc.input(), units1a); + auto deck1b = parser.parseString(deckData1b); + Opm::EclipseState es1b(deck1b); + Opm::UnitSystem units1b = es1b.getDeckUnitSystem(); + const auto& grid1b = es1b.getInputGrid(); - auto deck1b = parser.parseString( deckData1b) ; - Opm::EclipseState es1b( deck1b ); - Opm::UnitSystem units1b = es1b.getDeckUnitSystem(); - const auto& grid1b = es1b.getInputGrid(); + grid1b.save("BAD_CP_F.EGRID", false, nnc.input(), units1b); - grid1b.save("BAD_CP_F.EGRID", false, nnc.input(), units1b); + auto deck1 = parser.parseString(deckData1); + Opm::EclipseGrid grid1(deck1); - auto deck1 = parser.parseString( deckData1) ; - Opm::EclipseGrid grid1( deck1); + Opm::EclIO::EclFile file1("BAD_CP_M.EGRID"); - Opm::EclIO::EclFile file1("BAD_CP_M.EGRID"); + // actnum not defined in deck. keyword GDFILE not present in the DECK + // check that coord and zcorn from deck-grid identical to coord and zcorn + // from egrid - grid - // actnum not defined in deck. keyword GDFILE not present in the DECK - // check that coord and zcorn from deck-grid identical to coord and zcorn - // from egrid - grid + std::vector coordGrid1 = grid1.getCOORD(); + std::vector zcornGrid1 = grid1.getZCORN(); + std::vector coordGrid1_f(coordGrid1.begin(), coordGrid1.end()); + std::vector zcornGrid1_f(zcornGrid1.begin(), zcornGrid1.end()); - std::vector coordGrid1 = grid1.getCOORD(); - std::vector zcornGrid1 = grid1.getZCORN(); - std::vector coordGrid1_f(coordGrid1.begin(), coordGrid1.end() ); - std::vector zcornGrid1_f(zcornGrid1.begin(), zcornGrid1.end() ); + const std::vector coord_egrid_f = file1.get("COORD"); + const std::vector zcorn_egrid_f = file1.get("ZCORN"); - const std::vector coord_egrid_f = file1.get("COORD"); - const std::vector zcorn_egrid_f = file1.get("ZCORN"); + BOOST_CHECK(coordGrid1.size() == coord_egrid_f.size()); + BOOST_CHECK(zcornGrid1.size() == zcorn_egrid_f.size()); - BOOST_CHECK( coordGrid1.size() == coord_egrid_f.size() ); - BOOST_CHECK( zcornGrid1.size() == zcorn_egrid_f.size() ); + for (size_t n = 0; n < coordGrid1.size(); n++) { + BOOST_CHECK(coordGrid1_f[n] == coord_egrid_f[n]); + } - for (size_t n = 0; n < coordGrid1.size(); n++){ - BOOST_CHECK( coordGrid1_f[n] == coord_egrid_f[n] ); + for (size_t n = 0; n < zcornGrid1.size(); n++) { + BOOST_CHECK(zcornGrid1_f[n] == zcorn_egrid_f[n]); + } + + // all cells are active, since ACTNUM not present + std::vector actGrid1 = grid1.getACTNUM(); + for (size_t n = 0; n < actGrid1.size(); n++) { + BOOST_CHECK(actGrid1[n] == 1); + } + + + auto deck2 = parser.parseString(deckData2); + Opm::EclipseGrid grid2(deck2); + + std::vector actGrid2 = grid2.getACTNUM(); + + // check that actnum is reset from gdfile + + for (size_t n = 0; n < actGrid2.size(); n++) { + BOOST_CHECK(actGrid2[n] == ref_act_egrid[n]); + } + + + auto deck3a = parser.parseString(deckData3a); + Opm::EclipseGrid grid3a(deck3a); + + // mapunits and mapaxes define in deck (only) + + std::vector actGrid3 = grid3a.getACTNUM(); + + // check that actnum is reset from gdfile, ACTNUM input in deck + // but before keyword GDFILE + + for (size_t n = 0; n < actGrid3.size(); n++) { + BOOST_CHECK(actGrid3[n] == ref_act_egrid[n]); + } + + // check that depth values are in SI units + for (size_t n = 0; n < refDepthGrid3a.size(); n++) { + BOOST_CHECK_CLOSE(grid3a.getCellDepth(n), refDepthGrid3a[n], 1e-3); + } + + auto deck3b = parser.parseString(deckData3b); + Opm::EclipseGrid grid3b(deck3b); + + // mapunits and mapaxes both in egrid and deck. Uses properties + // from the egrid keyword gdfile input after MAPUNITS and MAPAXES + + actGrid3 = grid3b.getACTNUM(); + + // check that actnum is reset from deck since input after keyword GDFILE + for (size_t n = 0; n < actGrid3.size(); n++) { + BOOST_CHECK(actGrid3[n] == ref_act_deck3[n]); + } + + // check that depth values are converted from Field to SI units + for (size_t n = 0; n < refDepthGrid3b.size(); n++) { + BOOST_CHECK_CLOSE(grid3b.getCellDepth(n), refDepthGrid3b[n], 1e-3); + } + + // mapunits and mapaxes both in egrid and deck. Uses properties + // from the deck sinze these are input after GDfile + + auto deck3c = parser.parseString(deckData3c); + Opm::EclipseGrid grid3c(deck3c); } - - for (size_t n = 0; n < zcornGrid1.size(); n++){ - BOOST_CHECK( zcornGrid1_f[n] == zcorn_egrid_f[n] ); - } - - // all cells are active, since ACTNUM not present - std::vector actGrid1 = grid1.getACTNUM(); - for (size_t n = 0; n < actGrid1.size(); n++){ - BOOST_CHECK( actGrid1[n] == 1 ); - } - - - auto deck2 = parser.parseString( deckData2) ; - Opm::EclipseGrid grid2( deck2); - - std::vector actGrid2 = grid2.getACTNUM(); - - // check that actnum is reset from gdfile - - for (size_t n = 0; n < actGrid2.size(); n++){ - BOOST_CHECK( actGrid2[n] == ref_act_egrid[n] ); - } - - - auto deck3a = parser.parseString( deckData3a) ; - Opm::EclipseGrid grid3a( deck3a); - - // mapunits and mapaxes define in deck (only) - - std::vector actGrid3 = grid3a.getACTNUM(); - - // check that actnum is reset from gdfile, ACTNUM input in deck - // but before keyword GDFILE - - for (size_t n = 0; n < actGrid3.size(); n++){ - BOOST_CHECK( actGrid3[n] == ref_act_egrid[n] ); - } - - // check that depth values are in SI units - for (size_t n = 0; n < refDepthGrid3a.size(); n++){ - BOOST_CHECK_CLOSE( grid3a.getCellDepth(n), refDepthGrid3a[n], 1e-3 ); - } - - auto deck3b = parser.parseString( deckData3b) ; - Opm::EclipseGrid grid3b( deck3b); - - // mapunits and mapaxes both in egrid and deck. Uses properties - // from the egrid keyword gdfile input after MAPUNITS and MAPAXES - - actGrid3 = grid3b.getACTNUM(); - - // check that actnum is reset from deck since input after keyword GDFILE - for (size_t n = 0; n < actGrid3.size(); n++){ - BOOST_CHECK( actGrid3[n] == ref_act_deck3[n] ); - } - - // check that depth values are converted from Field to SI units - for (size_t n = 0; n < refDepthGrid3b.size(); n++){ - BOOST_CHECK_CLOSE( grid3b.getCellDepth(n), refDepthGrid3b[n], 1e-3 ); - } - - // mapunits and mapaxes both in egrid and deck. Uses properties - // from the deck sinze these are input after GDfile - - auto deck3c = parser.parseString( deckData3c) ; - Opm::EclipseGrid grid3c( deck3c); - } BOOST_AUTO_TEST_CASE(TEST_COLLAPSED_CELL) { @@ -2981,7 +2967,7 @@ EDIT BOOST_AUTO_TEST_CASE(GDFILE_NO_ACTNUM) { Opm::Parser parser; auto deck = parser.parseFile("GDFILE_NO_ACTNUM.DATA"); - BOOST_CHECK_NO_THROW( Opm::EclipseState(deck)); + BOOST_CHECK_NO_THROW( Opm::EclipseState{deck} ); } From 5c0aec538b2e90efee67ab871b28c68697bc30db Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Thu, 16 Sep 2021 16:50:57 +0200 Subject: [PATCH 03/11] Make sure test can run in readonly tests/ --- tests/test_AggregateActionxData.cpp | 1860 ++++++++++++++------------- 1 file changed, 935 insertions(+), 925 deletions(-) diff --git a/tests/test_AggregateActionxData.cpp b/tests/test_AggregateActionxData.cpp index 95d8fe3e0..12a7d7cbf 100644 --- a/tests/test_AggregateActionxData.cpp +++ b/tests/test_AggregateActionxData.cpp @@ -50,6 +50,8 @@ #include #include +#include "tests/WorkArea.cpp" + namespace { Opm::Deck first_sim(std::string fname) { @@ -142,8 +144,8 @@ BOOST_AUTO_TEST_CASE(Declared_Actionx_data) Opm::SummaryState st = sum_state_TEST1(); Opm::UDQState udq_state(1); Opm::Action::State action_state; - Opm::Schedule sched = simCase.sched; - Opm::EclipseGrid grid = simCase.grid; + Opm::Schedule sched = simCase.sched; + Opm::EclipseGrid grid = simCase.grid; const auto& start_time = sched.getStartTime(); const auto& ioConfig = es.getIOConfig(); // const auto& restart = es.cfg().restart(); @@ -158,952 +160,960 @@ BOOST_AUTO_TEST_CASE(Declared_Actionx_data) action_state.add_run(actx_14, start_time + 1.E09, result); double secs_elapsed = start_time + 2.E09; - //set dummy value for next_step_size + // set dummy value for next_step_size { - Opm::EclIO::OutputStream::Restart rstFile {Opm::EclIO::OutputStream::ResultSet {outputDir, baseName}, - rptStep, - Opm::EclIO::OutputStream::Formatted {ioConfig.getFMTOUT()}, - Opm::EclIO::OutputStream::Unified {ioConfig.getUNIFOUT()}}; - - std::vector ih - = Opm::RestartIO::Helpers::createInteHead(es, grid, sched, secs_elapsed, rptStep, rptStep + 1, rptStep); - - // set dummy value for next_step_size - const double next_step_size = 0.1; - const auto dh = Opm::RestartIO::Helpers::createDoubHead(es, sched, rptStep, secs_elapsed, next_step_size); - - const auto& lh = Opm::RestartIO::Helpers::createLogiHead(es); - - // Not really interested in the UDQ data - ih[Opm::RestartIO::Helpers::VectorItems::intehead::NO_WELL_UDQS] = 0; - ih[Opm::RestartIO::Helpers::VectorItems::intehead::NO_GROUP_UDQS] = 0; - ih[Opm::RestartIO::Helpers::VectorItems::intehead::NO_FIELD_UDQS] = 0; - - rstFile.write("INTEHEAD", ih); - rstFile.write("DOUBHEAD", dh); - rstFile.write("LOGIHEAD", lh); + WorkArea work; { - auto group_aggregator = Opm::RestartIO::Helpers::AggregateGroupData(ih); - group_aggregator.captureDeclaredGroupData(sched, es.getUnits(), rptStep, st, ih); - rstFile.write("IGRP", group_aggregator.getIGroup()); - rstFile.write("SGRP", group_aggregator.getSGroup()); - rstFile.write("XGRP", group_aggregator.getXGroup()); - rstFile.write("ZGRP", group_aggregator.getZGroup()); - } - { - auto well_aggregator = Opm::RestartIO::Helpers::AggregateWellData(ih); - well_aggregator.captureDeclaredWellData(sched, es.getUnits(), rptStep, Opm::Action::State{}, st, ih); - rstFile.write("IWEL", well_aggregator.getIWell()); - rstFile.write("SWEL", well_aggregator.getSWell()); - rstFile.write("XWEL", well_aggregator.getXWell()); - rstFile.write("ZWEL", well_aggregator.getZWell()); - } - { - auto conn_aggregator = Opm::RestartIO::Helpers::AggregateConnectionData(ih); - auto xw = Opm::data::Wells{}; - conn_aggregator.captureDeclaredConnData(sched, grid, es.getUnits(), xw, st, rptStep); - rstFile.write("ICON", conn_aggregator.getIConn()); - rstFile.write("SCON", conn_aggregator.getSConn()); - rstFile.write("XCON", conn_aggregator.getXConn()); - } + Opm::EclIO::OutputStream::Restart rstFile {Opm::EclIO::OutputStream::ResultSet {outputDir, baseName}, + rptStep, + Opm::EclIO::OutputStream::Formatted {ioConfig.getFMTOUT()}, + Opm::EclIO::OutputStream::Unified {ioConfig.getUNIFOUT()}}; - //const auto udqDims = Opm::RestartIO::Helpers::createUdqDims(sched, rptStep, ih); - //auto udqData = Opm::RestartIO::Helpers::AggregateUDQData(udqDims); - //udqData.captureDeclaredUDQData(sched, rptStep, udq_state, ih); + std::vector ih + = Opm::RestartIO::Helpers::createInteHead(es, grid, sched, secs_elapsed, rptStep, rptStep + 1, rptStep); - const auto actDims = Opm::RestartIO::Helpers::createActionRSTDims(sched, rptStep); - Opm::RestartIO::Helpers::AggregateActionxData actionxData{sched, action_state, st, rptStep}; + // set dummy value for next_step_size + const double next_step_size = 0.1; + const auto dh = Opm::RestartIO::Helpers::createDoubHead(es, sched, rptStep, secs_elapsed, next_step_size); - rstFile.write("IACT", actionxData.getIACT()); - rstFile.write("SACT", actionxData.getSACT()); - rstFile.write("ZACT", actionxData.getZACT()); - rstFile.write("ZLACT", actionxData.getZLACT()); - rstFile.write("ZACN", actionxData.getZACN()); - rstFile.write("IACN", actionxData.getIACN()); - rstFile.write("SACN", actionxData.getSACN()); - { - /* - Check of InteHEAD and DoubHEAD data for UDQ variables + const auto& lh = Opm::RestartIO::Helpers::createLogiHead(es); - INTEHEAD + // Not really interested in the UDQ data + ih[Opm::RestartIO::Helpers::VectorItems::intehead::NO_WELL_UDQS] = 0; + ih[Opm::RestartIO::Helpers::VectorItems::intehead::NO_GROUP_UDQS] = 0; + ih[Opm::RestartIO::Helpers::VectorItems::intehead::NO_FIELD_UDQS] = 0; - Intehead[156] - The number of ACTIONS - Intehead[157] - The max number of lines of schedule data including ENDACTIO keyword for any ACTION + rstFile.write("INTEHEAD", ih); + rstFile.write("DOUBHEAD", dh); + rstFile.write("LOGIHEAD", lh); + { + auto group_aggregator = Opm::RestartIO::Helpers::AggregateGroupData(ih); + group_aggregator.captureDeclaredGroupData(sched, es.getUnits(), rptStep, st, ih); + rstFile.write("IGRP", group_aggregator.getIGroup()); + rstFile.write("SGRP", group_aggregator.getSGroup()); + rstFile.write("XGRP", group_aggregator.getXGroup()); + rstFile.write("ZGRP", group_aggregator.getZGroup()); + } + { + auto well_aggregator = Opm::RestartIO::Helpers::AggregateWellData(ih); + well_aggregator.captureDeclaredWellData(sched, es.getUnits(), rptStep, Opm::Action::State {}, st, ih); + rstFile.write("IWEL", well_aggregator.getIWell()); + rstFile.write("SWEL", well_aggregator.getSWell()); + rstFile.write("XWEL", well_aggregator.getXWell()); + rstFile.write("ZWEL", well_aggregator.getZWell()); + } + { + auto conn_aggregator = Opm::RestartIO::Helpers::AggregateConnectionData(ih); + auto xw = Opm::data::Wells {}; + conn_aggregator.captureDeclaredConnData(sched, grid, es.getUnits(), xw, st, rptStep); + rstFile.write("ICON", conn_aggregator.getIConn()); + rstFile.write("SCON", conn_aggregator.getSConn()); + rstFile.write("XCON", conn_aggregator.getXConn()); + } - ---------------------------------------------------------------------------------------------------------------------] + // const auto udqDims = Opm::RestartIO::Helpers::createUdqDims(sched, rptStep, ih); + // auto udqData = Opm::RestartIO::Helpers::AggregateUDQData(udqDims); + // udqData.captureDeclaredUDQData(sched, rptStep, udq_state, ih); - */ - const auto rptStep_1 = std::size_t {0}; - const auto ih_1 = Opm::RestartIO::Helpers::createInteHead( - es, grid, sched, secs_elapsed, rptStep, rptStep_1 + 1, rptStep_1); + const auto actDims = Opm::RestartIO::Helpers::createActionRSTDims(sched, rptStep); + Opm::RestartIO::Helpers::AggregateActionxData actionxData {sched, action_state, st, rptStep}; - BOOST_CHECK_EQUAL(ih_1[156], 2); - BOOST_CHECK_EQUAL(ih_1[157], 7); + rstFile.write("IACT", actionxData.getIACT()); + rstFile.write("SACT", actionxData.getSACT()); + rstFile.write("ZACT", actionxData.getZACT()); + rstFile.write("ZLACT", actionxData.getZLACT()); + rstFile.write("ZACN", actionxData.getZACN()); + rstFile.write("IACN", actionxData.getIACN()); + rstFile.write("SACN", actionxData.getSACN()); + { + /* + Check of InteHEAD and DoubHEAD data for UDQ variables + + INTEHEAD + + Intehead[156] - The number of ACTIONS + Intehead[157] - The max number of lines of schedule data including ENDACTIO keyword for any + ACTION + + ---------------------------------------------------------------------------------------------------------------------] + + */ + const auto rptStep_1 = std::size_t {0}; + const auto ih_1 = Opm::RestartIO::Helpers::createInteHead( + es, grid, sched, secs_elapsed, rptStep, rptStep_1 + 1, rptStep_1); + + BOOST_CHECK_EQUAL(ih_1[156], 2); + BOOST_CHECK_EQUAL(ih_1[157], 7); - const auto rptStep_2 = std::size_t {1}; - const auto ih_2 = Opm::RestartIO::Helpers::createInteHead( - es, grid, sched, secs_elapsed, rptStep, rptStep_2 + 1, rptStep_2); - BOOST_CHECK_EQUAL(ih_2[156], 14); - BOOST_CHECK_EQUAL(ih_2[157], 10); + const auto rptStep_2 = std::size_t {1}; + const auto ih_2 = Opm::RestartIO::Helpers::createInteHead( + es, grid, sched, secs_elapsed, rptStep, rptStep_2 + 1, rptStep_2); + BOOST_CHECK_EQUAL(ih_2[156], 14); + BOOST_CHECK_EQUAL(ih_2[157], 10); - const auto rptStep_3 = std::size_t {2}; - const auto ih_3 = Opm::RestartIO::Helpers::createInteHead( - es, grid, sched, secs_elapsed, rptStep, rptStep_3 + 1, rptStep_3); + const auto rptStep_3 = std::size_t {2}; + const auto ih_3 = Opm::RestartIO::Helpers::createInteHead( + es, grid, sched, secs_elapsed, rptStep, rptStep_3 + 1, rptStep_3); - BOOST_CHECK_EQUAL(ih_3[156], 14); - BOOST_CHECK_EQUAL(ih_3[157], 10); + BOOST_CHECK_EQUAL(ih_3[156], 14); + BOOST_CHECK_EQUAL(ih_3[157], 10); + } + + { + /* + SACT + --length is equal to 9*the number of ACTIONX keywords + //item [0]: is unknown, (=0) + //item [1]: is unknown, (=0) + //item [2]: is unknown, (=0) + //item [3]: Minimum time interval between action triggers. + //item [4]: last time that the action was triggered + */ + + + const auto& sAct = actionxData.getSACT(); + + auto start = 0 * actDims[2]; + BOOST_CHECK_CLOSE(sAct[start + 3], 0.543, 1.0e-5f); + start = 1 * actDims[2]; + BOOST_CHECK_CLOSE(sAct[start + 3], 0.567, 1.0e-5f); + // actx_14 + start = 13 * actDims[2]; + BOOST_CHECK_CLOSE(sAct[start + 4], 1.E09 / 86400., 1.0e-5f); + } + + { + /* + IACT + --length is equal to 9*the number of ACTIONX keywords + //item [0]: is unknown, (=0) + //item [1]: The number of lines of schedule data including ENDACTIO + //item [2]: is the number of times an action has been triggered + //item [3]: is unknown, (=7) + //item [4]: is unknown, (=0) + //item [5]: The number of times the action is triggered + //item [6]: is unknown, (=0) + //item [7]: is unknown, (=0) + //item [8]: The number of times the action is triggered + */ + + + const auto& iAct = actionxData.getIACT(); + + auto start = 0 * actDims[1]; + BOOST_CHECK_EQUAL(iAct[start + 0], 0); + BOOST_CHECK_EQUAL(iAct[start + 1], 10); + BOOST_CHECK_EQUAL(iAct[start + 2], 1); + BOOST_CHECK_EQUAL(iAct[start + 3], 7); + BOOST_CHECK_EQUAL(iAct[start + 4], 0); + BOOST_CHECK_EQUAL(iAct[start + 5], 10); + BOOST_CHECK_EQUAL(iAct[start + 6], 0); + BOOST_CHECK_EQUAL(iAct[start + 7], 0); + BOOST_CHECK_EQUAL(iAct[start + 8], 3); + + + start = 1 * actDims[1]; + BOOST_CHECK_EQUAL(iAct[start + 0], 0); + BOOST_CHECK_EQUAL(iAct[start + 1], 7); + BOOST_CHECK_EQUAL(iAct[start + 2], 1); + BOOST_CHECK_EQUAL(iAct[start + 3], 7); + BOOST_CHECK_EQUAL(iAct[start + 4], 0); + BOOST_CHECK_EQUAL(iAct[start + 5], 11); + BOOST_CHECK_EQUAL(iAct[start + 6], 0); + BOOST_CHECK_EQUAL(iAct[start + 7], 0); + BOOST_CHECK_EQUAL(iAct[start + 8], 3); + + start = 2 * actDims[1]; + BOOST_CHECK_EQUAL(iAct[start + 0], 0); + BOOST_CHECK_EQUAL(iAct[start + 1], 4); + BOOST_CHECK_EQUAL(iAct[start + 2], 1); + BOOST_CHECK_EQUAL(iAct[start + 3], 7); + BOOST_CHECK_EQUAL(iAct[start + 4], 0); + BOOST_CHECK_EQUAL(iAct[start + 5], 13); + BOOST_CHECK_EQUAL(iAct[start + 6], 0); + BOOST_CHECK_EQUAL(iAct[start + 7], 0); + BOOST_CHECK_EQUAL(iAct[start + 8], 3); + + start = 13 * actDims[1]; + BOOST_CHECK_EQUAL(iAct[start + 2], 2); + } + + { + /* + SACT + --length is equal to 9*the number of ACTIONX keywords + //item [0]: is unknown, (=0) + //item [1]: is unknown, (=0) + //item [2]: is unknown, (=0) + //item [3]: Minimum time interval between action triggers. + //item [4]: is unknown, (=0) + */ + + + const auto& sAct = actionxData.getSACT(); + + auto start = 0 * actDims[2]; + BOOST_CHECK_CLOSE(sAct[start + 3], 0.543, 1.0e-5f); + start = 1 * actDims[2]; + BOOST_CHECK_CLOSE(sAct[start + 3], 0.567, 1.0e-5f); + } + + { + /* + ZACT + --length 4 times 8-chars pr ACTIONX keyword + + Name of action 4 times 8 chars (up to 8 chars for name) + + */ + + const auto& zAct = actionxData.getZACT(); + + auto start = 0 * actDims[3]; + BOOST_CHECK_EQUAL(zAct[start + 0].c_str(), "ACT01 "); + + start = 1 * actDims[3]; + BOOST_CHECK_EQUAL(zAct[start + 0].c_str(), "ACT02 "); + + start = 2 * actDims[3]; + BOOST_CHECK_EQUAL(zAct[start + 0].c_str(), "ACT03 "); + } + + { + /* + ZLACT + -- length = ACTDIMS_item3*(max-over-action of number of lines of data pr ACTION) + + */ + + const auto& zLact = actionxData.getZLACT(); + + // First action + auto start_a = 0 * actDims[4]; + auto start = start_a + 0 * actDims[8]; + BOOST_CHECK_EQUAL(zLact[start + 0].c_str(), "WELOPEN "); + + start = start_a + 1 * actDims[8]; + BOOST_CHECK_EQUAL(zLact[start + 0].c_str(), "'?' 'SHU"); + BOOST_CHECK_EQUAL(zLact[start + 1].c_str(), "T' 0 0 0"); + BOOST_CHECK_EQUAL(zLact[start + 2].c_str(), " / "); + + start = start_a + 2 * actDims[8]; + BOOST_CHECK_EQUAL(zLact[start + 0].c_str(), "/ "); + + start = start_a + 3 * actDims[8]; + BOOST_CHECK_EQUAL(zLact[start + 0].c_str(), "WELOPEN "); + + // Second action + start_a = 1 * actDims[4]; + start = start_a + 0 * actDims[8]; + BOOST_CHECK_EQUAL(zLact[start + 0].c_str(), "WELOPEN "); + + start = start_a + 1 * actDims[8]; + BOOST_CHECK_EQUAL(zLact[start + 0].c_str(), "'?' 'SHU"); + BOOST_CHECK_EQUAL(zLact[start + 1].c_str(), "T' 0 0 0"); + BOOST_CHECK_EQUAL(zLact[start + 2].c_str(), " / "); + + start = start_a + 2 * actDims[8]; + BOOST_CHECK_EQUAL(zLact[start + 0].c_str(), "/ "); + + start = start_a + 3 * actDims[8]; + BOOST_CHECK_EQUAL(zLact[start + 0].c_str(), "WELOPEN "); + + start = start_a + 4 * actDims[8]; + BOOST_CHECK_EQUAL(zLact[start + 0].c_str(), "'OPL01' "); + BOOST_CHECK_EQUAL(zLact[start + 1].c_str(), "'OPEN' /"); + BOOST_CHECK_EQUAL(zLact[start + 2].c_str(), " "); + + start = start_a + 5 * actDims[8]; + BOOST_CHECK_EQUAL(zLact[start + 0].c_str(), "/ "); + + + start = start_a + 6 * actDims[8]; + BOOST_CHECK_EQUAL(zLact[start + 0].c_str(), "ENDACTIO"); + } + + { + /* + ZACN + //(Max number of conditions pr ACTIONX) * ((max no characters pr line = 104) / (8 - characters pr + string)(104/8 = 13) + + */ + + const auto& zAcn = actionxData.getZACN(); + + // First action + auto start_a = 0 * actDims[5]; + auto start = start_a + 0 * 13; + BOOST_CHECK_EQUAL(zAcn[start + 0].c_str(), "FMWPR "); + BOOST_CHECK_EQUAL(zAcn[start + 1].c_str(), " "); + BOOST_CHECK_EQUAL(zAcn[start + 2].c_str(), "> "); + BOOST_CHECK_EQUAL(zAcn[start + 3].c_str(), " "); + + start = start_a + 1 * 13; + BOOST_CHECK_EQUAL(zAcn[start + 0].c_str(), "WUPR3 "); + BOOST_CHECK_EQUAL(zAcn[start + 1].c_str(), " "); + BOOST_CHECK_EQUAL(zAcn[start + 2].c_str(), "> "); + BOOST_CHECK_EQUAL(zAcn[start + 3].c_str(), "OP* "); + BOOST_CHECK_EQUAL(zAcn[start + 4].c_str(), " "); + BOOST_CHECK_EQUAL(zAcn[start + 5].c_str(), " "); + + start = start_a + 2 * 13; + BOOST_CHECK_EQUAL(zAcn[start + 0].c_str(), " "); + BOOST_CHECK_EQUAL(zAcn[start + 1].c_str(), " "); + BOOST_CHECK_EQUAL(zAcn[start + 2].c_str(), "< "); + BOOST_CHECK_EQUAL(zAcn[start + 3].c_str(), " "); + BOOST_CHECK_EQUAL(zAcn[start + 4].c_str(), " "); + + + + // Second action + start_a = 1 * actDims[5]; + start = start_a + 0 * 13; + BOOST_CHECK_EQUAL(zAcn[start + 0].c_str(), "FMWPR "); + BOOST_CHECK_EQUAL(zAcn[start + 1].c_str(), " "); + BOOST_CHECK_EQUAL(zAcn[start + 2].c_str(), "> "); + BOOST_CHECK_EQUAL(zAcn[start + 3].c_str(), " "); + + start = start_a + 1 * 13; + BOOST_CHECK_EQUAL(zAcn[start + 0].c_str(), "WGPR "); + BOOST_CHECK_EQUAL(zAcn[start + 1].c_str(), "GGPR "); + BOOST_CHECK_EQUAL(zAcn[start + 2].c_str(), "> "); + BOOST_CHECK_EQUAL(zAcn[start + 3].c_str(), "OPL02 "); + BOOST_CHECK_EQUAL(zAcn[start + 4].c_str(), " "); + BOOST_CHECK_EQUAL(zAcn[start + 5].c_str(), " "); + BOOST_CHECK_EQUAL(zAcn[start + 6].c_str(), "LOWER "); + + start = start_a + 2 * 13; + BOOST_CHECK_EQUAL(zAcn[start + 0].c_str(), " "); + BOOST_CHECK_EQUAL(zAcn[start + 1].c_str(), " "); + BOOST_CHECK_EQUAL(zAcn[start + 2].c_str(), "> "); + BOOST_CHECK_EQUAL(zAcn[start + 3].c_str(), " "); + BOOST_CHECK_EQUAL(zAcn[start + 4].c_str(), " "); + } + + { + /* + IACN + 26*Max number of conditions pr ACTIONX + + */ + + + const auto& iAcn = actionxData.getIACN(); + + auto start_a = 0 * actDims[6]; + auto start = start_a + 0 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 0], 0); + BOOST_CHECK_EQUAL(iAcn[start + 1], 0); + BOOST_CHECK_EQUAL(iAcn[start + 2], 0); + BOOST_CHECK_EQUAL(iAcn[start + 3], 0); + BOOST_CHECK_EQUAL(iAcn[start + 4], 0); + BOOST_CHECK_EQUAL(iAcn[start + 5], 0); + BOOST_CHECK_EQUAL(iAcn[start + 6], 0); + BOOST_CHECK_EQUAL(iAcn[start + 7], 0); + BOOST_CHECK_EQUAL(iAcn[start + 8], 0); + BOOST_CHECK_EQUAL(iAcn[start + 9], 0); + BOOST_CHECK_EQUAL(iAcn[start + 10], 1); + BOOST_CHECK_EQUAL(iAcn[start + 11], 8); + BOOST_CHECK_EQUAL(iAcn[start + 12], 0); + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 14], 0); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 16], 1); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 1 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 0], 0); + BOOST_CHECK_EQUAL(iAcn[start + 1], 0); + BOOST_CHECK_EQUAL(iAcn[start + 2], 0); + BOOST_CHECK_EQUAL(iAcn[start + 3], 0); + BOOST_CHECK_EQUAL(iAcn[start + 4], 0); + BOOST_CHECK_EQUAL(iAcn[start + 5], 0); + BOOST_CHECK_EQUAL(iAcn[start + 6], 0); + BOOST_CHECK_EQUAL(iAcn[start + 7], 0); + BOOST_CHECK_EQUAL(iAcn[start + 8], 0); + BOOST_CHECK_EQUAL(iAcn[start + 9], 0); + BOOST_CHECK_EQUAL(iAcn[start + 10], 2); + BOOST_CHECK_EQUAL(iAcn[start + 11], 8); + BOOST_CHECK_EQUAL(iAcn[start + 12], 0); + BOOST_CHECK_EQUAL(iAcn[start + 13], 2); + BOOST_CHECK_EQUAL(iAcn[start + 14], 0); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 16], 1); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start_a = 1 * actDims[6]; + start = start_a + 0 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 0], 0); + BOOST_CHECK_EQUAL(iAcn[start + 1], 0); + BOOST_CHECK_EQUAL(iAcn[start + 2], 0); + BOOST_CHECK_EQUAL(iAcn[start + 3], 0); + BOOST_CHECK_EQUAL(iAcn[start + 4], 0); + BOOST_CHECK_EQUAL(iAcn[start + 5], 0); + BOOST_CHECK_EQUAL(iAcn[start + 6], 0); + BOOST_CHECK_EQUAL(iAcn[start + 7], 0); + BOOST_CHECK_EQUAL(iAcn[start + 8], 0); + BOOST_CHECK_EQUAL(iAcn[start + 9], 0); + BOOST_CHECK_EQUAL(iAcn[start + 10], 1); + BOOST_CHECK_EQUAL(iAcn[start + 11], 8); + BOOST_CHECK_EQUAL(iAcn[start + 12], 0); + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 14], 0); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 16], 1); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 1 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 0], 0); + BOOST_CHECK_EQUAL(iAcn[start + 1], 0); + BOOST_CHECK_EQUAL(iAcn[start + 2], 0); + BOOST_CHECK_EQUAL(iAcn[start + 3], 0); + BOOST_CHECK_EQUAL(iAcn[start + 4], 0); + BOOST_CHECK_EQUAL(iAcn[start + 5], 0); + BOOST_CHECK_EQUAL(iAcn[start + 6], 0); + BOOST_CHECK_EQUAL(iAcn[start + 7], 0); + BOOST_CHECK_EQUAL(iAcn[start + 8], 0); + BOOST_CHECK_EQUAL(iAcn[start + 9], 0); + BOOST_CHECK_EQUAL(iAcn[start + 10], 2); + BOOST_CHECK_EQUAL(iAcn[start + 11], 3); + BOOST_CHECK_EQUAL(iAcn[start + 12], 0); + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 14], 0); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 16], 1); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start = start_a + 2 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 0], 0); + BOOST_CHECK_EQUAL(iAcn[start + 1], 0); + BOOST_CHECK_EQUAL(iAcn[start + 2], 0); + BOOST_CHECK_EQUAL(iAcn[start + 3], 0); + BOOST_CHECK_EQUAL(iAcn[start + 4], 0); + BOOST_CHECK_EQUAL(iAcn[start + 5], 0); + BOOST_CHECK_EQUAL(iAcn[start + 6], 0); + BOOST_CHECK_EQUAL(iAcn[start + 7], 0); + BOOST_CHECK_EQUAL(iAcn[start + 8], 0); + BOOST_CHECK_EQUAL(iAcn[start + 9], 0); + BOOST_CHECK_EQUAL(iAcn[start + 10], 11); + BOOST_CHECK_EQUAL(iAcn[start + 11], 8); + BOOST_CHECK_EQUAL(iAcn[start + 12], 0); + BOOST_CHECK_EQUAL(iAcn[start + 13], 0); + BOOST_CHECK_EQUAL(iAcn[start + 14], 0); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 16], 1); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start_a = 3 * actDims[6]; + start = start_a + 0 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 1 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 2); + BOOST_CHECK_EQUAL(iAcn[start + 15], 1); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 2 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 2); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start = start_a + 3 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start = start_a + 4 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 0); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start_a = 4 * actDims[6]; + start = start_a + 0 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 1 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 1); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 2 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 2); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start = start_a + 3 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start = start_a + 4 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 0); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start_a = 5 * actDims[6]; + start = start_a + 0 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 2); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 1 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 1); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 2 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 2); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 3 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 4 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 0); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start_a = 6 * actDims[6]; + start = start_a + 0 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 1 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 1); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 2 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 2); + BOOST_CHECK_EQUAL(iAcn[start + 15], 2); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start = start_a + 3 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 4 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 0); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start_a = 7 * actDims[6]; + start = start_a + 0 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 1); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 1 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 2); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start = start_a + 2 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start = start_a + 3 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 1); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 4 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 2); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start = start_a + 5 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start = start_a + 6 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 0); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start_a = 8 * actDims[6]; + start = start_a + 0 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 2); + BOOST_CHECK_EQUAL(iAcn[start + 15], 1); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 1 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 2); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 2 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 3 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 1); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 4 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 2); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 5 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 6 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 0); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + + start_a = 9 * actDims[6]; + start = start_a + 0 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 1); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 1 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 2); + BOOST_CHECK_EQUAL(iAcn[start + 15], 2); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start = start_a + 2 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 3 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 1); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 4 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 2); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 5 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 6 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 0); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + + start_a = 10 * actDims[6]; + start = start_a + 0 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 1); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 1 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 2); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start = start_a + 2 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 2); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start = start_a + 3 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 1); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 4 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 2); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 5 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 6 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 0); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + + start_a = 11 * actDims[6]; + start = start_a + 0 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 1); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 1 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 2); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start = start_a + 2 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start = start_a + 3 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 2); + BOOST_CHECK_EQUAL(iAcn[start + 15], 1); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 4 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 2); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start = start_a + 5 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start = start_a + 6 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 0); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + + start_a = 12 * actDims[6]; + start = start_a + 0 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 1); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 1 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 2); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start = start_a + 2 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start = start_a + 3 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 1); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 4 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 2); + BOOST_CHECK_EQUAL(iAcn[start + 15], 2); + BOOST_CHECK_EQUAL(iAcn[start + 17], 1); + + start = start_a + 5 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 1); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + + start = start_a + 6 * 26; + BOOST_CHECK_EQUAL(iAcn[start + 13], 0); + BOOST_CHECK_EQUAL(iAcn[start + 15], 0); + BOOST_CHECK_EQUAL(iAcn[start + 17], 0); + } + + + + { + /* + SACN + 26*Max number of conditions pr ACTIONX + + */ + + + const auto& sAcn = actionxData.getSACN(); + + auto start_a = 0 * actDims[6]; + auto start = start_a + 0 * 16; + BOOST_CHECK_EQUAL(sAcn[start + 0], 0); + BOOST_CHECK_EQUAL(sAcn[start + 1], 0); + BOOST_CHECK_EQUAL(sAcn[start + 2], 45); + BOOST_CHECK_EQUAL(sAcn[start + 3], 0); + BOOST_CHECK_EQUAL(sAcn[start + 4], 4); + BOOST_CHECK_EQUAL(sAcn[start + 5], 45); + BOOST_CHECK_EQUAL(sAcn[start + 6], 4); + BOOST_CHECK_EQUAL(sAcn[start + 7], 45); + BOOST_CHECK_EQUAL(sAcn[start + 8], 4); + BOOST_CHECK_EQUAL(sAcn[start + 9], 45); + BOOST_CHECK_EQUAL(sAcn[start + 10], 0); + BOOST_CHECK_EQUAL(sAcn[start + 11], 0); + BOOST_CHECK_EQUAL(sAcn[start + 12], 0); + BOOST_CHECK_EQUAL(sAcn[start + 13], 0); + BOOST_CHECK_EQUAL(sAcn[start + 14], 0); + BOOST_CHECK_EQUAL(sAcn[start + 15], 0); + + start = start_a + 1 * 16; + BOOST_CHECK_EQUAL(sAcn[start + 0], 0); + BOOST_CHECK_EQUAL(sAcn[start + 1], 0); + BOOST_CHECK_EQUAL(sAcn[start + 2], 46); + BOOST_CHECK_EQUAL(sAcn[start + 3], 0); + BOOST_CHECK_EQUAL(sAcn[start + 4], 0); + BOOST_CHECK_EQUAL(sAcn[start + 5], 46); + BOOST_CHECK_EQUAL(sAcn[start + 6], 0); + BOOST_CHECK_EQUAL(sAcn[start + 7], 46); + BOOST_CHECK_EQUAL(sAcn[start + 8], 0); + BOOST_CHECK_EQUAL(sAcn[start + 9], 46); + BOOST_CHECK_EQUAL(sAcn[start + 10], 0); + BOOST_CHECK_EQUAL(sAcn[start + 11], 0); + BOOST_CHECK_EQUAL(sAcn[start + 12], 0); + BOOST_CHECK_EQUAL(sAcn[start + 13], 0); + BOOST_CHECK_EQUAL(sAcn[start + 14], 0); + BOOST_CHECK_EQUAL(sAcn[start + 15], 0); + + start = start_a + 2 * 16; + BOOST_CHECK_EQUAL(sAcn[start + 0], 0); + BOOST_CHECK_EQUAL(sAcn[start + 1], 0); + BOOST_CHECK_EQUAL(sAcn[start + 2], 5); + BOOST_CHECK_EQUAL(sAcn[start + 3], 0); + BOOST_CHECK_EQUAL(sAcn[start + 4], 1.E+20); + BOOST_CHECK_EQUAL(sAcn[start + 5], 1.E+20); + BOOST_CHECK_EQUAL(sAcn[start + 6], 1.E+20); + BOOST_CHECK_EQUAL(sAcn[start + 7], 1.E+20); + BOOST_CHECK_EQUAL(sAcn[start + 8], 1.E+20); + BOOST_CHECK_EQUAL(sAcn[start + 9], 1.E+20); + BOOST_CHECK_EQUAL(sAcn[start + 10], 0); + BOOST_CHECK_EQUAL(sAcn[start + 11], 0); + BOOST_CHECK_EQUAL(sAcn[start + 12], 0); + BOOST_CHECK_EQUAL(sAcn[start + 13], 0); + BOOST_CHECK_EQUAL(sAcn[start + 14], 0); + BOOST_CHECK_EQUAL(sAcn[start + 15], 0); + } } { - /* - SACT - --length is equal to 9*the number of ACTIONX keywords - //item [0]: is unknown, (=0) - //item [1]: is unknown, (=0) - //item [2]: is unknown, (=0) - //item [3]: Minimum time interval between action triggers. - //item [4]: last time that the action was triggered - */ - - - const auto& sAct = actionxData.getSACT(); - - auto start = 0*actDims[2]; - BOOST_CHECK_CLOSE(sAct[start + 3], 0.543, 1.0e-5f); - start = 1*actDims[2]; - BOOST_CHECK_CLOSE(sAct[start + 3], 0.567, 1.0e-5f); - //actx_14 - start = 13*actDims[2]; - BOOST_CHECK_CLOSE(sAct[start + 4], 1.E09/86400., 1.0e-5f); - } - - { - /* - IACT - --length is equal to 9*the number of ACTIONX keywords - //item [0]: is unknown, (=0) - //item [1]: The number of lines of schedule data including ENDACTIO - //item [2]: is the number of times an action has been triggered - //item [3]: is unknown, (=7) - //item [4]: is unknown, (=0) - //item [5]: The number of times the action is triggered - //item [6]: is unknown, (=0) - //item [7]: is unknown, (=0) - //item [8]: The number of times the action is triggered - */ - - - const auto& iAct = actionxData.getIACT(); - - auto start = 0 * actDims[1]; - BOOST_CHECK_EQUAL(iAct[start + 0], 0); - BOOST_CHECK_EQUAL(iAct[start + 1], 10); - BOOST_CHECK_EQUAL(iAct[start + 2], 1); - BOOST_CHECK_EQUAL(iAct[start + 3], 7); - BOOST_CHECK_EQUAL(iAct[start + 4], 0); - BOOST_CHECK_EQUAL(iAct[start + 5], 10); - BOOST_CHECK_EQUAL(iAct[start + 6], 0); - BOOST_CHECK_EQUAL(iAct[start + 7], 0); - BOOST_CHECK_EQUAL(iAct[start + 8], 3); - - - start = 1 * actDims[1]; - BOOST_CHECK_EQUAL(iAct[start + 0], 0); - BOOST_CHECK_EQUAL(iAct[start + 1], 7); - BOOST_CHECK_EQUAL(iAct[start + 2], 1); - BOOST_CHECK_EQUAL(iAct[start + 3], 7); - BOOST_CHECK_EQUAL(iAct[start + 4], 0); - BOOST_CHECK_EQUAL(iAct[start + 5], 11); - BOOST_CHECK_EQUAL(iAct[start + 6], 0); - BOOST_CHECK_EQUAL(iAct[start + 7], 0); - BOOST_CHECK_EQUAL(iAct[start + 8], 3); - - start = 2 * actDims[1]; - BOOST_CHECK_EQUAL(iAct[start + 0], 0); - BOOST_CHECK_EQUAL(iAct[start + 1], 4); - BOOST_CHECK_EQUAL(iAct[start + 2], 1); - BOOST_CHECK_EQUAL(iAct[start + 3], 7); - BOOST_CHECK_EQUAL(iAct[start + 4], 0); - BOOST_CHECK_EQUAL(iAct[start + 5], 13); - BOOST_CHECK_EQUAL(iAct[start + 6], 0); - BOOST_CHECK_EQUAL(iAct[start + 7], 0); - BOOST_CHECK_EQUAL(iAct[start + 8], 3); - - start = 13 * actDims[1]; - BOOST_CHECK_EQUAL(iAct[start + 2], 2); - } - - { - /* - SACT - --length is equal to 9*the number of ACTIONX keywords - //item [0]: is unknown, (=0) - //item [1]: is unknown, (=0) - //item [2]: is unknown, (=0) - //item [3]: Minimum time interval between action triggers. - //item [4]: is unknown, (=0) - */ - - - const auto& sAct = actionxData.getSACT(); - - auto start = 0 * actDims[2]; - BOOST_CHECK_CLOSE(sAct[start + 3], 0.543, 1.0e-5f); - start = 1 * actDims[2]; - BOOST_CHECK_CLOSE(sAct[start + 3], 0.567, 1.0e-5f); - } - - { - /* - ZACT - --length 4 times 8-chars pr ACTIONX keyword - - Name of action 4 times 8 chars (up to 8 chars for name) - - */ - - const auto& zAct = actionxData.getZACT(); - - auto start = 0 * actDims[3]; - BOOST_CHECK_EQUAL(zAct[start + 0].c_str(), "ACT01 "); - - start = 1 * actDims[3]; - BOOST_CHECK_EQUAL(zAct[start + 0].c_str(), "ACT02 "); - - start = 2 * actDims[3]; - BOOST_CHECK_EQUAL(zAct[start + 0].c_str(), "ACT03 "); - } - - { - /* - ZLACT - -- length = ACTDIMS_item3*(max-over-action of number of lines of data pr ACTION) - - */ - - const auto& zLact = actionxData.getZLACT(); - - // First action - auto start_a = 0 * actDims[4]; - auto start = start_a + 0 * actDims[8]; - BOOST_CHECK_EQUAL(zLact[start + 0].c_str(), "WELOPEN "); - - start = start_a + 1 * actDims[8]; - BOOST_CHECK_EQUAL(zLact[start + 0].c_str(), "'?' 'SHU"); - BOOST_CHECK_EQUAL(zLact[start + 1].c_str(), "T' 0 0 0"); - BOOST_CHECK_EQUAL(zLact[start + 2].c_str(), " / "); - - start = start_a + 2 * actDims[8]; - BOOST_CHECK_EQUAL(zLact[start + 0].c_str(), "/ "); - - start = start_a + 3 * actDims[8]; - BOOST_CHECK_EQUAL(zLact[start + 0].c_str(), "WELOPEN "); - - // Second action - start_a = 1 * actDims[4]; - start = start_a + 0 * actDims[8]; - BOOST_CHECK_EQUAL(zLact[start + 0].c_str(), "WELOPEN "); - - start = start_a + 1 * actDims[8]; - BOOST_CHECK_EQUAL(zLact[start + 0].c_str(), "'?' 'SHU"); - BOOST_CHECK_EQUAL(zLact[start + 1].c_str(), "T' 0 0 0"); - BOOST_CHECK_EQUAL(zLact[start + 2].c_str(), " / "); - - start = start_a + 2 * actDims[8]; - BOOST_CHECK_EQUAL(zLact[start + 0].c_str(), "/ "); - - start = start_a + 3 * actDims[8]; - BOOST_CHECK_EQUAL(zLact[start + 0].c_str(), "WELOPEN "); - - start = start_a + 4 * actDims[8]; - BOOST_CHECK_EQUAL(zLact[start + 0].c_str(), "'OPL01' "); - BOOST_CHECK_EQUAL(zLact[start + 1].c_str(), "'OPEN' /"); - BOOST_CHECK_EQUAL(zLact[start + 2].c_str(), " "); - - start = start_a + 5 * actDims[8]; - BOOST_CHECK_EQUAL(zLact[start + 0].c_str(), "/ "); - - - start = start_a + 6 * actDims[8]; - BOOST_CHECK_EQUAL(zLact[start + 0].c_str(), "ENDACTIO"); - } - - { - /* - ZACN - //(Max number of conditions pr ACTIONX) * ((max no characters pr line = 104) / (8 - characters pr - string)(104/8 = 13) - - */ - - const auto& zAcn = actionxData.getZACN(); - - // First action - auto start_a = 0 * actDims[5]; - auto start = start_a + 0 * 13; - BOOST_CHECK_EQUAL(zAcn[start + 0].c_str(), "FMWPR "); - BOOST_CHECK_EQUAL(zAcn[start + 1].c_str(), " "); - BOOST_CHECK_EQUAL(zAcn[start + 2].c_str(), "> "); - BOOST_CHECK_EQUAL(zAcn[start + 3].c_str(), " "); - - start = start_a + 1 * 13; - BOOST_CHECK_EQUAL(zAcn[start + 0].c_str(), "WUPR3 "); - BOOST_CHECK_EQUAL(zAcn[start + 1].c_str(), " "); - BOOST_CHECK_EQUAL(zAcn[start + 2].c_str(), "> "); - BOOST_CHECK_EQUAL(zAcn[start + 3].c_str(), "OP* "); - BOOST_CHECK_EQUAL(zAcn[start + 4].c_str(), " "); - BOOST_CHECK_EQUAL(zAcn[start + 5].c_str(), " "); - - start = start_a + 2 * 13; - BOOST_CHECK_EQUAL(zAcn[start + 0].c_str(), " "); - BOOST_CHECK_EQUAL(zAcn[start + 1].c_str(), " "); - BOOST_CHECK_EQUAL(zAcn[start + 2].c_str(), "< "); - BOOST_CHECK_EQUAL(zAcn[start + 3].c_str(), " "); - BOOST_CHECK_EQUAL(zAcn[start + 4].c_str(), " "); - - - - // Second action - start_a = 1 * actDims[5]; - start = start_a + 0 * 13; - BOOST_CHECK_EQUAL(zAcn[start + 0].c_str(), "FMWPR "); - BOOST_CHECK_EQUAL(zAcn[start + 1].c_str(), " "); - BOOST_CHECK_EQUAL(zAcn[start + 2].c_str(), "> "); - BOOST_CHECK_EQUAL(zAcn[start + 3].c_str(), " "); - - start = start_a + 1 * 13; - BOOST_CHECK_EQUAL(zAcn[start + 0].c_str(), "WGPR "); - BOOST_CHECK_EQUAL(zAcn[start + 1].c_str(), "GGPR "); - BOOST_CHECK_EQUAL(zAcn[start + 2].c_str(), "> "); - BOOST_CHECK_EQUAL(zAcn[start + 3].c_str(), "OPL02 "); - BOOST_CHECK_EQUAL(zAcn[start + 4].c_str(), " "); - BOOST_CHECK_EQUAL(zAcn[start + 5].c_str(), " "); - BOOST_CHECK_EQUAL(zAcn[start + 6].c_str(), "LOWER "); - - start = start_a + 2 * 13; - BOOST_CHECK_EQUAL(zAcn[start + 0].c_str(), " "); - BOOST_CHECK_EQUAL(zAcn[start + 1].c_str(), " "); - BOOST_CHECK_EQUAL(zAcn[start + 2].c_str(), "> "); - BOOST_CHECK_EQUAL(zAcn[start + 3].c_str(), " "); - BOOST_CHECK_EQUAL(zAcn[start + 4].c_str(), " "); - } - - { - /* - IACN - 26*Max number of conditions pr ACTIONX - - */ - - - const auto& iAcn = actionxData.getIACN(); - - auto start_a = 0 * actDims[6]; - auto start = start_a + 0 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 0], 0); - BOOST_CHECK_EQUAL(iAcn[start + 1], 0); - BOOST_CHECK_EQUAL(iAcn[start + 2], 0); - BOOST_CHECK_EQUAL(iAcn[start + 3], 0); - BOOST_CHECK_EQUAL(iAcn[start + 4], 0); - BOOST_CHECK_EQUAL(iAcn[start + 5], 0); - BOOST_CHECK_EQUAL(iAcn[start + 6], 0); - BOOST_CHECK_EQUAL(iAcn[start + 7], 0); - BOOST_CHECK_EQUAL(iAcn[start + 8], 0); - BOOST_CHECK_EQUAL(iAcn[start + 9], 0); - BOOST_CHECK_EQUAL(iAcn[start + 10], 1); - BOOST_CHECK_EQUAL(iAcn[start + 11], 8); - BOOST_CHECK_EQUAL(iAcn[start + 12], 0); - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 14], 0); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 16], 1); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 1 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 0], 0); - BOOST_CHECK_EQUAL(iAcn[start + 1], 0); - BOOST_CHECK_EQUAL(iAcn[start + 2], 0); - BOOST_CHECK_EQUAL(iAcn[start + 3], 0); - BOOST_CHECK_EQUAL(iAcn[start + 4], 0); - BOOST_CHECK_EQUAL(iAcn[start + 5], 0); - BOOST_CHECK_EQUAL(iAcn[start + 6], 0); - BOOST_CHECK_EQUAL(iAcn[start + 7], 0); - BOOST_CHECK_EQUAL(iAcn[start + 8], 0); - BOOST_CHECK_EQUAL(iAcn[start + 9], 0); - BOOST_CHECK_EQUAL(iAcn[start + 10], 2); - BOOST_CHECK_EQUAL(iAcn[start + 11], 8); - BOOST_CHECK_EQUAL(iAcn[start + 12], 0); - BOOST_CHECK_EQUAL(iAcn[start + 13], 2); - BOOST_CHECK_EQUAL(iAcn[start + 14], 0); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 16], 1); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start_a = 1 * actDims[6]; - start = start_a + 0 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 0], 0); - BOOST_CHECK_EQUAL(iAcn[start + 1], 0); - BOOST_CHECK_EQUAL(iAcn[start + 2], 0); - BOOST_CHECK_EQUAL(iAcn[start + 3], 0); - BOOST_CHECK_EQUAL(iAcn[start + 4], 0); - BOOST_CHECK_EQUAL(iAcn[start + 5], 0); - BOOST_CHECK_EQUAL(iAcn[start + 6], 0); - BOOST_CHECK_EQUAL(iAcn[start + 7], 0); - BOOST_CHECK_EQUAL(iAcn[start + 8], 0); - BOOST_CHECK_EQUAL(iAcn[start + 9], 0); - BOOST_CHECK_EQUAL(iAcn[start + 10], 1); - BOOST_CHECK_EQUAL(iAcn[start + 11], 8); - BOOST_CHECK_EQUAL(iAcn[start + 12], 0); - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 14], 0); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 16], 1); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 1 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 0], 0); - BOOST_CHECK_EQUAL(iAcn[start + 1], 0); - BOOST_CHECK_EQUAL(iAcn[start + 2], 0); - BOOST_CHECK_EQUAL(iAcn[start + 3], 0); - BOOST_CHECK_EQUAL(iAcn[start + 4], 0); - BOOST_CHECK_EQUAL(iAcn[start + 5], 0); - BOOST_CHECK_EQUAL(iAcn[start + 6], 0); - BOOST_CHECK_EQUAL(iAcn[start + 7], 0); - BOOST_CHECK_EQUAL(iAcn[start + 8], 0); - BOOST_CHECK_EQUAL(iAcn[start + 9], 0); - BOOST_CHECK_EQUAL(iAcn[start + 10], 2); - BOOST_CHECK_EQUAL(iAcn[start + 11], 3); - BOOST_CHECK_EQUAL(iAcn[start + 12], 0); - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 14], 0); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 16], 1); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start = start_a + 2 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 0], 0); - BOOST_CHECK_EQUAL(iAcn[start + 1], 0); - BOOST_CHECK_EQUAL(iAcn[start + 2], 0); - BOOST_CHECK_EQUAL(iAcn[start + 3], 0); - BOOST_CHECK_EQUAL(iAcn[start + 4], 0); - BOOST_CHECK_EQUAL(iAcn[start + 5], 0); - BOOST_CHECK_EQUAL(iAcn[start + 6], 0); - BOOST_CHECK_EQUAL(iAcn[start + 7], 0); - BOOST_CHECK_EQUAL(iAcn[start + 8], 0); - BOOST_CHECK_EQUAL(iAcn[start + 9], 0); - BOOST_CHECK_EQUAL(iAcn[start + 10], 11); - BOOST_CHECK_EQUAL(iAcn[start + 11], 8); - BOOST_CHECK_EQUAL(iAcn[start + 12], 0); - BOOST_CHECK_EQUAL(iAcn[start + 13], 0); - BOOST_CHECK_EQUAL(iAcn[start + 14], 0); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 16], 1); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start_a = 3 * actDims[6]; - start = start_a + 0 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 1 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 2); - BOOST_CHECK_EQUAL(iAcn[start + 15], 1); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 2 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 2); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start = start_a + 3 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start = start_a + 4 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 0); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start_a = 4 * actDims[6]; - start = start_a + 0 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 1 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 1); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 2 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 2); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start = start_a + 3 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start = start_a + 4 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 0); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start_a = 5 * actDims[6]; - start = start_a + 0 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 2); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 1 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 1); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 2 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 2); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 3 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 4 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 0); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start_a = 6 * actDims[6]; - start = start_a + 0 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 1 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 1); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 2 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 2); - BOOST_CHECK_EQUAL(iAcn[start + 15], 2); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start = start_a + 3 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 4 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 0); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start_a = 7 * actDims[6]; - start = start_a + 0 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 1); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 1 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 2); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start = start_a + 2 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start = start_a + 3 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 1); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 4 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 2); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start = start_a + 5 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start = start_a + 6 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 0); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start_a = 8 * actDims[6]; - start = start_a + 0 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 2); - BOOST_CHECK_EQUAL(iAcn[start + 15], 1); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 1 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 2); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 2 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 3 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 1); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 4 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 2); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 5 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 6 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 0); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - - start_a = 9 * actDims[6]; - start = start_a + 0 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 1); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 1 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 2); - BOOST_CHECK_EQUAL(iAcn[start + 15], 2); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start = start_a + 2 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 3 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 1); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 4 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 2); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 5 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 6 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 0); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - - start_a = 10 * actDims[6]; - start = start_a + 0 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 1); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 1 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 2); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start = start_a + 2 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 2); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start = start_a + 3 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 1); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 4 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 2); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 5 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 6 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 0); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - - start_a = 11 * actDims[6]; - start = start_a + 0 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 1); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 1 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 2); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start = start_a + 2 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start = start_a + 3 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 2); - BOOST_CHECK_EQUAL(iAcn[start + 15], 1); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 4 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 2); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start = start_a + 5 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start = start_a + 6 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 0); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - - start_a = 12 * actDims[6]; - start = start_a + 0 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 1); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 1 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 2); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start = start_a + 2 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start = start_a + 3 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 1); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 4 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 2); - BOOST_CHECK_EQUAL(iAcn[start + 15], 2); - BOOST_CHECK_EQUAL(iAcn[start + 17], 1); - - start = start_a + 5 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 1); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - - start = start_a + 6 * 26; - BOOST_CHECK_EQUAL(iAcn[start + 13], 0); - BOOST_CHECK_EQUAL(iAcn[start + 15], 0); - BOOST_CHECK_EQUAL(iAcn[start + 17], 0); - } - - - - { - /* - SACN - 26*Max number of conditions pr ACTIONX - - */ - - - const auto& sAcn = actionxData.getSACN(); - - auto start_a = 0 * actDims[6]; - auto start = start_a + 0 * 16; - BOOST_CHECK_EQUAL(sAcn[start + 0], 0); - BOOST_CHECK_EQUAL(sAcn[start + 1], 0); - BOOST_CHECK_EQUAL(sAcn[start + 2], 45); - BOOST_CHECK_EQUAL(sAcn[start + 3], 0); - BOOST_CHECK_EQUAL(sAcn[start + 4], 4); - BOOST_CHECK_EQUAL(sAcn[start + 5], 45); - BOOST_CHECK_EQUAL(sAcn[start + 6], 4); - BOOST_CHECK_EQUAL(sAcn[start + 7], 45); - BOOST_CHECK_EQUAL(sAcn[start + 8], 4); - BOOST_CHECK_EQUAL(sAcn[start + 9], 45); - BOOST_CHECK_EQUAL(sAcn[start + 10], 0); - BOOST_CHECK_EQUAL(sAcn[start + 11], 0); - BOOST_CHECK_EQUAL(sAcn[start + 12], 0); - BOOST_CHECK_EQUAL(sAcn[start + 13], 0); - BOOST_CHECK_EQUAL(sAcn[start + 14], 0); - BOOST_CHECK_EQUAL(sAcn[start + 15], 0); - - start = start_a + 1 * 16; - BOOST_CHECK_EQUAL(sAcn[start + 0], 0); - BOOST_CHECK_EQUAL(sAcn[start + 1], 0); - BOOST_CHECK_EQUAL(sAcn[start + 2], 46); - BOOST_CHECK_EQUAL(sAcn[start + 3], 0); - BOOST_CHECK_EQUAL(sAcn[start + 4], 0); - BOOST_CHECK_EQUAL(sAcn[start + 5], 46); - BOOST_CHECK_EQUAL(sAcn[start + 6], 0); - BOOST_CHECK_EQUAL(sAcn[start + 7], 46); - BOOST_CHECK_EQUAL(sAcn[start + 8], 0); - BOOST_CHECK_EQUAL(sAcn[start + 9], 46); - BOOST_CHECK_EQUAL(sAcn[start + 10], 0); - BOOST_CHECK_EQUAL(sAcn[start + 11], 0); - BOOST_CHECK_EQUAL(sAcn[start + 12], 0); - BOOST_CHECK_EQUAL(sAcn[start + 13], 0); - BOOST_CHECK_EQUAL(sAcn[start + 14], 0); - BOOST_CHECK_EQUAL(sAcn[start + 15], 0); - - start = start_a + 2 * 16; - BOOST_CHECK_EQUAL(sAcn[start + 0], 0); - BOOST_CHECK_EQUAL(sAcn[start + 1], 0); - BOOST_CHECK_EQUAL(sAcn[start + 2], 5); - BOOST_CHECK_EQUAL(sAcn[start + 3], 0); - BOOST_CHECK_EQUAL(sAcn[start + 4], 1.E+20); - BOOST_CHECK_EQUAL(sAcn[start + 5], 1.E+20); - BOOST_CHECK_EQUAL(sAcn[start + 6], 1.E+20); - BOOST_CHECK_EQUAL(sAcn[start + 7], 1.E+20); - BOOST_CHECK_EQUAL(sAcn[start + 8], 1.E+20); - BOOST_CHECK_EQUAL(sAcn[start + 9], 1.E+20); - BOOST_CHECK_EQUAL(sAcn[start + 10], 0); - BOOST_CHECK_EQUAL(sAcn[start + 11], 0); - BOOST_CHECK_EQUAL(sAcn[start + 12], 0); - BOOST_CHECK_EQUAL(sAcn[start + 13], 0); - BOOST_CHECK_EQUAL(sAcn[start + 14], 0); - BOOST_CHECK_EQUAL(sAcn[start + 15], 0); - } - } - - { - auto rst_file = std::make_shared("UDQ_ACTIONX_TEST1.UNRST"); - auto rst_view = std::make_shared(std::move(rst_file), 3); - auto rst_state = Opm::RestartIO::RstState::load(std::move(rst_view), es.runspec(), simCase.parser); - const auto& input_actions = sched[rptStep].actions(); - - BOOST_CHECK(rst_state.actions.size() == input_actions.ecl_size()); - - BOOST_CHECK_EQUAL(rst_state.actions[0].conditions.size(), 3); - BOOST_CHECK_EQUAL(rst_state.actions[1].conditions.size(), 3); - BOOST_CHECK_EQUAL(rst_state.actions[2].conditions.size(), 3); - BOOST_CHECK_EQUAL(rst_state.actions[3].conditions.size(), 5); - BOOST_CHECK_EQUAL(rst_state.actions[4].conditions.size(), 5); - BOOST_CHECK_EQUAL(rst_state.actions[5].conditions.size(), 5); - - - - { - const auto& action = rst_state.actions[0]; - BOOST_CHECK( compare_tokens(action.conditions[0].tokens(), {"FMWPR", ">", "45", "AND"})); - BOOST_CHECK( compare_tokens(action.conditions[1].tokens(), {"WUPR3", "OP*", ">", "46", "OR"})); - BOOST_CHECK( compare_tokens(action.conditions[2].tokens(), {"MNTH", "<", "MAY"})); - } - { - const auto& action = rst_state.actions[1]; - BOOST_CHECK( compare_tokens(action.conditions[0].tokens(), {"FMWPR", ">", "25", "AND"})); - BOOST_CHECK( compare_tokens(action.conditions[1].tokens(), {"WGPR", "OPL02", ">", "GGPR", "LOWER", "AND"})); - BOOST_CHECK( compare_tokens(action.conditions[2].tokens(), {"MNTH", ">", "NOV"})); - } - { - const auto& action = rst_state.actions[2]; - BOOST_CHECK( compare_tokens(action.conditions[0].tokens(), {"WWPR", "OPU01", ">", "WWPR", "OPU02", "OR"})); - BOOST_CHECK( compare_tokens(action.conditions[1].tokens(), {"GMWPR", "TEST", ">", "39", "AND"})); - BOOST_CHECK( compare_tokens(action.conditions[2].tokens(), {"YEAR", ">", "2020"})); - } - { - const auto& action = rst_state.actions[3]; - BOOST_CHECK( compare_tokens(action.conditions[0].tokens(), {"FMWPR", ">", "3", "AND"})); - BOOST_CHECK( compare_tokens(action.conditions[1].tokens(), {"(", "WUPR3", "OP*", ">", "46", "OR"})); - BOOST_CHECK( compare_tokens(action.conditions[2].tokens(), {"WOPR", "OP*", ">", "32", ")", "AND"})); - BOOST_CHECK( compare_tokens(action.conditions[3].tokens(), {"WWPR", "OP*", ">", "57", "AND"})); - BOOST_CHECK( compare_tokens(action.conditions[4].tokens(), {"MNTH", ">", "OCT"})); - } - { - const auto& action = rst_state.actions[7]; - BOOST_CHECK( compare_tokens(action.conditions[0].tokens(), {"(", "FMWPR", ">", "3", "AND"})); - BOOST_CHECK( compare_tokens(action.conditions[1].tokens(), {"WUPR3", "OP*", ">", "46", ")", "AND"})); - BOOST_CHECK( compare_tokens(action.conditions[2].tokens(), {"WOPR", "OP*", ">", "32", "AND"})); - BOOST_CHECK( compare_tokens(action.conditions[3].tokens(), {"(", "WLPR", "OP*", ">", "43", "AND"})); - BOOST_CHECK( compare_tokens(action.conditions[4].tokens(), {"WWCT", "OP*", ">", "0.310000", ")", "AND"})); - BOOST_CHECK( compare_tokens(action.conditions[5].tokens(), {"WWPR", "OP*", ">", "23", "AND"})); - BOOST_CHECK( compare_tokens(action.conditions[6].tokens(), {"MNTH", ">", "OCT"})); - } - - - std::vector actions; - for (const auto& rst_action : rst_state.actions) - actions.emplace_back( rst_action ); - - std::unordered_set input_keys; - std::unordered_set rst_keys; - for (std::size_t iact = 0; iact < input_actions.ecl_size(); iact++) { - const auto& input_action = input_actions[iact]; - const auto& rst_action = actions[iact]; - - BOOST_CHECK_EQUAL(input_action.name(), rst_action.name()); - BOOST_CHECK_EQUAL(input_action.max_run(), rst_action.max_run()); - BOOST_CHECK_CLOSE(input_action.min_wait(), rst_action.min_wait(), 1e-5); - - input_action.required_summary(input_keys); - rst_action.required_summary(rst_keys); - } - BOOST_CHECK( input_keys == rst_keys ); - - { - std::mt19937 rng; - std::uniform_real_distribution<> random_uniform(-100,100); - Opm::WListManager wlm; - auto year = 2020; - auto day = 1; - for (std::size_t month = 1; month <= 12; month++) { - auto state = Opm::SummaryState{ Opm::asTimePoint( Opm::TimeStampUTC(year, month, day) ) }; - Opm::Action::Context context(state, wlm); - for (const auto& key : rst_keys) { - const auto& first_char = key[0]; - if (first_char == 'W') { - for (const auto& well : {"OPU01", "OPU02", "OPL01", "OPL02"}) - state.update_well_var(well, key, random_uniform(rng)); - } else if (first_char == 'G') { - for (const auto& group : {"UPPER", "LOWER", "TEST"}) - state.update_group_var(group, key, random_uniform(rng)); - } else - state.update(key, random_uniform(rng)); - } - - for (std::size_t iact = 0; iact < input_actions.ecl_size(); iact++) { - const auto& input_action = input_actions[iact]; - const auto& rst_action = actions[iact]; - - const auto& input_res = input_action.eval(context); - const auto& rst_res = rst_action.eval(context); - - BOOST_CHECK( input_res == rst_res ); + auto rst_file = std::make_shared("UDQ_ACTIONX_TEST1.UNRST"); + auto rst_view = std::make_shared(std::move(rst_file), 3); + auto rst_state = Opm::RestartIO::RstState::load(std::move(rst_view), es.runspec(), simCase.parser); + const auto& input_actions = sched[rptStep].actions(); + + BOOST_CHECK(rst_state.actions.size() == input_actions.ecl_size()); + + BOOST_CHECK_EQUAL(rst_state.actions[0].conditions.size(), 3); + BOOST_CHECK_EQUAL(rst_state.actions[1].conditions.size(), 3); + BOOST_CHECK_EQUAL(rst_state.actions[2].conditions.size(), 3); + BOOST_CHECK_EQUAL(rst_state.actions[3].conditions.size(), 5); + BOOST_CHECK_EQUAL(rst_state.actions[4].conditions.size(), 5); + BOOST_CHECK_EQUAL(rst_state.actions[5].conditions.size(), 5); + + + + { + const auto& action = rst_state.actions[0]; + BOOST_CHECK(compare_tokens(action.conditions[0].tokens(), {"FMWPR", ">", "45", "AND"})); + BOOST_CHECK(compare_tokens(action.conditions[1].tokens(), {"WUPR3", "OP*", ">", "46", "OR"})); + BOOST_CHECK(compare_tokens(action.conditions[2].tokens(), {"MNTH", "<", "MAY"})); + } + { + const auto& action = rst_state.actions[1]; + BOOST_CHECK(compare_tokens(action.conditions[0].tokens(), {"FMWPR", ">", "25", "AND"})); + BOOST_CHECK( + compare_tokens(action.conditions[1].tokens(), {"WGPR", "OPL02", ">", "GGPR", "LOWER", "AND"})); + BOOST_CHECK(compare_tokens(action.conditions[2].tokens(), {"MNTH", ">", "NOV"})); + } + { + const auto& action = rst_state.actions[2]; + BOOST_CHECK( + compare_tokens(action.conditions[0].tokens(), {"WWPR", "OPU01", ">", "WWPR", "OPU02", "OR"})); + BOOST_CHECK(compare_tokens(action.conditions[1].tokens(), {"GMWPR", "TEST", ">", "39", "AND"})); + BOOST_CHECK(compare_tokens(action.conditions[2].tokens(), {"YEAR", ">", "2020"})); + } + { + const auto& action = rst_state.actions[3]; + BOOST_CHECK(compare_tokens(action.conditions[0].tokens(), {"FMWPR", ">", "3", "AND"})); + BOOST_CHECK(compare_tokens(action.conditions[1].tokens(), {"(", "WUPR3", "OP*", ">", "46", "OR"})); + BOOST_CHECK(compare_tokens(action.conditions[2].tokens(), {"WOPR", "OP*", ">", "32", ")", "AND"})); + BOOST_CHECK(compare_tokens(action.conditions[3].tokens(), {"WWPR", "OP*", ">", "57", "AND"})); + BOOST_CHECK(compare_tokens(action.conditions[4].tokens(), {"MNTH", ">", "OCT"})); + } + { + const auto& action = rst_state.actions[7]; + BOOST_CHECK(compare_tokens(action.conditions[0].tokens(), {"(", "FMWPR", ">", "3", "AND"})); + BOOST_CHECK(compare_tokens(action.conditions[1].tokens(), {"WUPR3", "OP*", ">", "46", ")", "AND"})); + BOOST_CHECK(compare_tokens(action.conditions[2].tokens(), {"WOPR", "OP*", ">", "32", "AND"})); + BOOST_CHECK(compare_tokens(action.conditions[3].tokens(), {"(", "WLPR", "OP*", ">", "43", "AND"})); + BOOST_CHECK( + compare_tokens(action.conditions[4].tokens(), {"WWCT", "OP*", ">", "0.310000", ")", "AND"})); + BOOST_CHECK(compare_tokens(action.conditions[5].tokens(), {"WWPR", "OP*", ">", "23", "AND"})); + BOOST_CHECK(compare_tokens(action.conditions[6].tokens(), {"MNTH", ">", "OCT"})); + } + + + std::vector actions; + for (const auto& rst_action : rst_state.actions) + actions.emplace_back(rst_action); + + std::unordered_set input_keys; + std::unordered_set rst_keys; + for (std::size_t iact = 0; iact < input_actions.ecl_size(); iact++) { + const auto& input_action = input_actions[iact]; + const auto& rst_action = actions[iact]; + + BOOST_CHECK_EQUAL(input_action.name(), rst_action.name()); + BOOST_CHECK_EQUAL(input_action.max_run(), rst_action.max_run()); + BOOST_CHECK_CLOSE(input_action.min_wait(), rst_action.min_wait(), 1e-5); + + input_action.required_summary(input_keys); + rst_action.required_summary(rst_keys); + } + BOOST_CHECK(input_keys == rst_keys); + + { + std::mt19937 rng; + std::uniform_real_distribution<> random_uniform(-100, 100); + Opm::WListManager wlm; + auto year = 2020; + auto day = 1; + for (std::size_t month = 1; month <= 12; month++) { + auto state = Opm::SummaryState {Opm::asTimePoint(Opm::TimeStampUTC(year, month, day))}; + Opm::Action::Context context(state, wlm); + for (const auto& key : rst_keys) { + const auto& first_char = key[0]; + if (first_char == 'W') { + for (const auto& well : {"OPU01", "OPU02", "OPL01", "OPL02"}) + state.update_well_var(well, key, random_uniform(rng)); + } else if (first_char == 'G') { + for (const auto& group : {"UPPER", "LOWER", "TEST"}) + state.update_group_var(group, key, random_uniform(rng)); + } else + state.update(key, random_uniform(rng)); + } + + for (std::size_t iact = 0; iact < input_actions.ecl_size(); iact++) { + const auto& input_action = input_actions[iact]; + const auto& rst_action = actions[iact]; + + const auto& input_res = input_action.eval(context); + const auto& rst_res = rst_action.eval(context); + + BOOST_CHECK(input_res == rst_res); + } } } } } } + BOOST_AUTO_TEST_SUITE_END() From 2d879941fed37118d1606dcce91f825f5a6c1c1a Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Thu, 16 Sep 2021 16:54:28 +0200 Subject: [PATCH 04/11] Ensure UDQ tests can run in readonly tests/ --- tests/test_AggregateUDQData.cpp | 1203 ++++++++++++++++--------------- 1 file changed, 641 insertions(+), 562 deletions(-) diff --git a/tests/test_AggregateUDQData.cpp b/tests/test_AggregateUDQData.cpp index 2ea7d147e..20c81e37f 100644 --- a/tests/test_AggregateUDQData.cpp +++ b/tests/test_AggregateUDQData.cpp @@ -46,6 +46,8 @@ #include #include +#include "tests/WorkArea.cpp" + namespace { Opm::Deck first_sim(std::string fname) { @@ -233,588 +235,665 @@ BOOST_AUTO_TEST_CASE (Declared_UDQ_data) udqData.captureDeclaredUDQData(sched, rptStep, udq_state, ih); { - std::string outputDir = "./"; - std::string baseName = "TEST_UDQRST"; - Opm::EclIO::OutputStream::Restart rstFile { - Opm::EclIO::OutputStream::ResultSet { outputDir, baseName }, - rptStep, - Opm::EclIO::OutputStream::Formatted { ioConfig.getFMTOUT() }, - Opm::EclIO::OutputStream::Unified { ioConfig.getUNIFOUT() } - }; - rstFile.write("INTEHEAD", ih); - rstFile.write("DOUBHEAD", dh); - rstFile.write("LOGIHEAD", lh); + WorkArea work; { - auto group_aggregator = Opm::RestartIO::Helpers::AggregateGroupData(ih); - group_aggregator.captureDeclaredGroupData(sched, es.getUnits(), rptStep, st, ih); - rstFile.write("IGRP", group_aggregator.getIGroup()); - rstFile.write("SGRP", group_aggregator.getSGroup()); - rstFile.write("XGRP", group_aggregator.getXGroup()); - rstFile.write("ZGRP", group_aggregator.getZGroup()); + std::string outputDir = "./"; + std::string baseName = "TEST_UDQRST"; + Opm::EclIO::OutputStream::Restart rstFile {Opm::EclIO::OutputStream::ResultSet {outputDir, baseName}, + rptStep, + Opm::EclIO::OutputStream::Formatted {ioConfig.getFMTOUT()}, + Opm::EclIO::OutputStream::Unified {ioConfig.getUNIFOUT()}}; + rstFile.write("INTEHEAD", ih); + rstFile.write("DOUBHEAD", dh); + rstFile.write("LOGIHEAD", lh); + { + auto group_aggregator = Opm::RestartIO::Helpers::AggregateGroupData(ih); + group_aggregator.captureDeclaredGroupData(sched, es.getUnits(), rptStep, st, ih); + rstFile.write("IGRP", group_aggregator.getIGroup()); + rstFile.write("SGRP", group_aggregator.getSGroup()); + rstFile.write("XGRP", group_aggregator.getXGroup()); + rstFile.write("ZGRP", group_aggregator.getZGroup()); + } + { + auto action_state = Opm::Action::State {}; + auto well_aggregator = Opm::RestartIO::Helpers::AggregateWellData(ih); + well_aggregator.captureDeclaredWellData(sched, es.getUnits(), rptStep, action_state, st, ih); + rstFile.write("IWEL", well_aggregator.getIWell()); + rstFile.write("SWEL", well_aggregator.getSWell()); + rstFile.write("XWEL", well_aggregator.getXWell()); + rstFile.write("ZWEL", well_aggregator.getZWell()); + } + { + auto conn_aggregator = Opm::RestartIO::Helpers::AggregateConnectionData(ih); + auto xw = Opm::data::Wells {}; + conn_aggregator.captureDeclaredConnData(sched, grid, es.getUnits(), xw, st, rptStep); + rstFile.write("ICON", conn_aggregator.getIConn()); + rstFile.write("SCON", conn_aggregator.getSConn()); + rstFile.write("XCON", conn_aggregator.getXConn()); + } + rstFile.write("ZUDN", udqData.getZUDN()); + rstFile.write("ZUDL", udqData.getZUDL()); + rstFile.write("IUDQ", udqData.getIUDQ()); + rstFile.write("DUDF", udqData.getDUDF()); + rstFile.write("DUDG", udqData.getDUDG()); + rstFile.write("DUDW", udqData.getDUDW()); + rstFile.write("IUAD", udqData.getIUAD()); + rstFile.write("IUAP", udqData.getIUAP()); + rstFile.write("IGPH", udqData.getIGPH()); } + { - auto action_state = Opm::Action::State{}; - auto well_aggregator = Opm::RestartIO::Helpers::AggregateWellData(ih); - well_aggregator.captureDeclaredWellData(sched, es.getUnits(), rptStep, action_state, st, ih); - rstFile.write("IWEL", well_aggregator.getIWell()); - rstFile.write("SWEL", well_aggregator.getSWell()); - rstFile.write("XWEL", well_aggregator.getXWell()); - rstFile.write("ZWEL", well_aggregator.getZWell()); + /* + Check of InteHEAD and DoubHEAD data for UDQ variables + + INTEHEAD + + UDQPARAM (1) = - InteHead [267 ] + + --------------------------------------------------------------------------------------------------------------------- + + DOUBHEAD + + UDQPARAM (2) = Doubhead [212] + UDQPARAM (3) = Doubhead [213] + UDQPARAM (4) = Doubhead [214] + + */ + + BOOST_CHECK_EQUAL(ih[267], -1); + BOOST_CHECK_EQUAL(dh[212], 1.0E+20); + BOOST_CHECK_EQUAL(dh[213], 0.0); + BOOST_CHECK_EQUAL(dh[214], 1.0E-4); } + + { - auto conn_aggregator = Opm::RestartIO::Helpers::AggregateConnectionData(ih); - auto xw = Opm::data::Wells{}; - conn_aggregator.captureDeclaredConnData(sched, grid, es.getUnits(), xw, st, rptStep); - rstFile.write("ICON", conn_aggregator.getIConn()); - rstFile.write("SCON", conn_aggregator.getSConn()); - rstFile.write("XCON", conn_aggregator.getXConn()); + /* + IUDQ + 3- integers pr UDQ (line/quantity) + + Integer no 1 = type of UDQ ( 0 - ASSIGN, UPDATE-OFF + 1-update+NEXT, + 2 - DEFINE, 2- UPDATE-ON + 3 - units) + + Integer no 2 = -4 : used for ASSIGN - numerical value + -4 : used for DEFINE + -1 : used for DEFINE MIN() function, SUM() function, AVEA() function + -4 : used for DEFINE MAX() - function - also used for SUM() function - must check on (-1 - + value) 1 : used for UPDATE quantity + + Integer no 3 = sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + (1 - based) + + NOTE: UPDATE - does not define a new quantity, only updates an alredy defined quantity! + */ + + + const auto& iUdq = udqData.getIUDQ(); + + auto start = 0 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 1 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -4); // udq NO. 1 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 1); // udq NO. 1 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 1 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 0); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], 0); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 2); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 2 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -4); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 3); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 3 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -4); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 1); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 4 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -4); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 4); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 5 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -4); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 1); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 6 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -1); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 2); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 7 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -4); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 3); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 8 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -5); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 4); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 9 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -8); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 5); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 10 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -1); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 6); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 11 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -5); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 7); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 12 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -3); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 8); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 13 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -1); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 9); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 14 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -2); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 10); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 15 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -3); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 11); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 16 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -1); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 12); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 17 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -1); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 13); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 18 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -3); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 14); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 19 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -5); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 15); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 20 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -5); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 16); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 21 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], 1); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 17); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 22 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], 1); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 18); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 23 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -1); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 19); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 24 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -4); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 20); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 25 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -2); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 21); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 26 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -1); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 22); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 27 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -2); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 23); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 28 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -2); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 24); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 29 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -8); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 25); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 30 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -6); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 26); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 31 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -4); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 27); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 32 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -5); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 28); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 33 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -4); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 29); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 34 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -8); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 30); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 35 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -4); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 31); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 36 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -5); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 32); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 37 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -6); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 33); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 38 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -1); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 34); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 39 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -1); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 35); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 40 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -6); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 36); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 41 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -2); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 37); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 42 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -4); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 38); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) + + start = 43 * udqDims[1]; + BOOST_CHECK_EQUAL(iUdq[start + 0], 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) + BOOST_CHECK_EQUAL(iUdq[start + 1], -1); // udq NO. 2 + BOOST_CHECK_EQUAL( + iUdq[start + 2], + 39); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) } - rstFile.write("ZUDN", udqData.getZUDN()); - rstFile.write("ZUDL", udqData.getZUDL()); - rstFile.write("IUDQ", udqData.getIUDQ()); - rstFile.write("DUDF", udqData.getDUDF()); - rstFile.write("DUDG", udqData.getDUDG()); - rstFile.write("DUDW", udqData.getDUDW()); - rstFile.write("IUAD", udqData.getIUAD()); - rstFile.write("IUAP", udqData.getIUAP()); - rstFile.write("IGPH", udqData.getIGPH()); - } - { - /* - Check of InteHEAD and DoubHEAD data for UDQ variables - - INTEHEAD - - UDQPARAM (1) = - InteHead [267 ] - - --------------------------------------------------------------------------------------------------------------------- - - DOUBHEAD - - UDQPARAM (2) = Doubhead [212] - UDQPARAM (3) = Doubhead [213] - UDQPARAM (4) = Doubhead [214] - - */ - - BOOST_CHECK_EQUAL(ih[267] , -1); - BOOST_CHECK_EQUAL(dh[212] , 1.0E+20); - BOOST_CHECK_EQUAL(dh[213] , 0.0); - BOOST_CHECK_EQUAL(dh[214] , 1.0E-4); - - } - - - { - /* - IUDQ - 3- integers pr UDQ (line/quantity) - - Integer no 1 = type of UDQ ( 0 - ASSIGN, UPDATE-OFF - 1-update+NEXT, - 2 - DEFINE, 2- UPDATE-ON - 3 - units) - - Integer no 2 = -4 : used for ASSIGN - numerical value - -4 : used for DEFINE - -1 : used for DEFINE MIN() function, SUM() function, AVEA() function - -4 : used for DEFINE MAX() - function - also used for SUM() function - must check on (-1 - value) - 1 : used for UPDATE quantity - - Integer no 3 = sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - (1 - based) - - NOTE: UPDATE - does not define a new quantity, only updates an alredy defined quantity! - */ - - - const auto& iUdq = udqData.getIUDQ(); - - auto start = 0*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 1 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -4); // udq NO. 1 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 1); // udq NO. 1 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 1*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 0); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , 0); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 2); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 2*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -4); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 3); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 3*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -4); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 1); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 4*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -4); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 4); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 5*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -4); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 1); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 6*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -1); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 2); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 7*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -4); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 3); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 8*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -5); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 4); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 9*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -8); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 5); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 10*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -1); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 6); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 11*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -5); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 7); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 12*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -3); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 8); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 13*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -1); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 9); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 14*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -2); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 10); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 15*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -3); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 11); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 16*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -1); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 12); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 17*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -1); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 13); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 18*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -3); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 14); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 19*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -5); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 15); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 20*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -5); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 16); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 21*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , 1); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 17); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 22*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , 1); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 18); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 23*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -1); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 19); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 24*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -4); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 20); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 25*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -2); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 21); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 26*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -1); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 22); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 27*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -2); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 23); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 28*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -2); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 24); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 29*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -8); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 25); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 30*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -6); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 26); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 31*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -4); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 27); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 32*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -5); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 28); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 33*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -4); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 29); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 34*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -8); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 30); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 35*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -4); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 31); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 36*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -5); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 32); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 37*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -6); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 33); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 38*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -1); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 34); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 39*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -1); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 35); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 40*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -6); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 36); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 41*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -2); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 37); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 42*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -4); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 38); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - - start = 43*udqDims[1]; - BOOST_CHECK_EQUAL(iUdq[start + 0] , 2); // udq NO. 2 - ( 0 - ASSIGN, 2 - DEFINE) - BOOST_CHECK_EQUAL(iUdq[start + 1] , -1); // udq NO. 2 - BOOST_CHECK_EQUAL(iUdq[start + 2] , 39); // udq NO. 2 - (sequence number of UDQ pr type (CU, FU, GU, RU, , SU, WU, AU or BU etc.) - } - - { - /* - IUAD: - Sequences of 5 items pr UDQ that is used for various well and group controls, - i.e. sorted on the various active controls, see list for item (1).This means that - one udq can occur several times, one for each control it is used for - Only the active controls are output - and the sequence is according to when - they are defined - - dimension 5*no_of_udq-constraint-used in well and group controls - - item (1) : = 200000 + 19 for GCONPROD and ORAT - 300000 + 19 for GCONPROD and WRAT - 400000 + 19 for GCONPROD and GRAT - 500000 + 19 for GCONPROD and LRAT - 300000 + 4 for WCONPROD + oil rate target or upper limit - 400000 + 4 for WCONPROD + water rate target or upper limit - 500000 + 4 for WCONPROD + gas rate target or upper limit - 600000 + 4 for WCONPROD + liquid rate target or upper limit - ? 300000 + 3 for WCONINJE + oil rate target or upper limit - 400000 + 3 for WCONINJE + surface rate target or upper limit - 500000 + 3 for WCONINJE + reservoir volume rate target or upper limit - 1000000 + 27 for CECON + minimum oil rate - - item (2) - sequence number of UDQ used (from input sequence) for the actual constraint/target - - item (3) - do not know yet (value: 1) - item (4) - number of times the UDQ variable is used (e.g. for several different wells) - item (5) - the sequence number for the first use of the actual UDQ (index i+1) = 1+sum over (no_use_udq(i)) - */ - - const auto& iUad = udqData.getIUAD(); - - auto start = 0*udqDims[3]; - BOOST_CHECK_EQUAL(iUad[start + 0] , 300004); // iuad NO. 1 - BOOST_CHECK_EQUAL(iUad[start + 1] , 3); // iuad NO. 1 - BOOST_CHECK_EQUAL(iUad[start + 2] , 1); // iuad NO. 1 - BOOST_CHECK_EQUAL(iUad[start + 3] , 2); // iuad NO. 1 - BOOST_CHECK_EQUAL(iUad[start + 4] , 1); // iuad NO. 1 - - start = 1*udqDims[3]; - BOOST_CHECK_EQUAL(iUad[start + 0] , 600004); // iuad NO. 2 - BOOST_CHECK_EQUAL(iUad[start + 1] , 5); // iuad NO. 2 - BOOST_CHECK_EQUAL(iUad[start + 2] , 1); // iuad NO. 2 - BOOST_CHECK_EQUAL(iUad[start + 3] , 2); // iuad NO. 2 - BOOST_CHECK_EQUAL(iUad[start + 4] , 3); // iuad NO. 2 - - } - - { - /* - ZUDN: - contains UDQ keyword data: - Pairs of: - quantity name (item2): e.g. 'WUOPRL ' and - units: e.g.: 'SM3/DAY ' - - Length is dependent on number of UDQ quantities = 2*no of UDQ's - */ - - const auto& zUdn = udqData.getZUDN(); - - auto start = 0*udqDims[4]; - BOOST_CHECK_EQUAL(zUdn[start + 0].c_str() , "WUOPRL "); // udq NO. 1 - BOOST_CHECK_EQUAL(zUdn[start + 1].c_str() , "SM3/DAY "); // udq NO. 1 - - start = 1*udqDims[4]; - BOOST_CHECK_EQUAL(zUdn[start + 0].c_str() , "WULPRL "); // udq NO. 2 - BOOST_CHECK_EQUAL(zUdn[start + 1].c_str() , "SM3/DAY "); // udq NO. 2 - - start = 2*udqDims[4]; - BOOST_CHECK_EQUAL(zUdn[start + 0].c_str() , "WUOPRU "); // udq NO. 3 - BOOST_CHECK_EQUAL(zUdn[start + 1].c_str() , "SM3/DAY "); // udq NO. 3 - - start = 3*udqDims[4]; - BOOST_CHECK_EQUAL(zUdn[start + 0].c_str() , "GUOPRU "); // udq NO. 4 - BOOST_CHECK_EQUAL(zUdn[start + 1].c_str() , "SM3/DAY "); // udq NO. 4 - - start = 4*udqDims[4]; - BOOST_CHECK_EQUAL(zUdn[start + 0].c_str() , "WULPRU "); // udq NO. 5 - BOOST_CHECK_EQUAL(zUdn[start + 1].c_str() , "SM3/DAY "); // udq NO. 5 - - start = 5*udqDims[4]; - BOOST_CHECK_EQUAL(zUdn[start + 0].c_str() , "FULPR "); // udq NO. 6 - BOOST_CHECK_EQUAL(zUdn[start + 1].c_str() , "SM3/DAY "); // udq NO. 6 - - } - - - { - /* - ZUDL: - contains string that define the "Data for operation" for the defined quantity - - e.g. - '(WOPR OP' 'L01 - 15' '0) * 0.9' '0 ' ' ' ' ' ' ' - - The appropriate data are split into strings of 8 characters each. - - Length: No of UDQ's * 16 - */ - - const auto& zUdl = udqData.getZUDL(); - - auto start = 0*udqDims[5]; - BOOST_CHECK_EQUAL(zUdl[start + 0].c_str() , "(WOPR 'P"); // udq NO. 1 - BOOST_CHECK_EQUAL(zUdl[start + 1].c_str() , "ROD1' - "); // udq NO. 1 - BOOST_CHECK_EQUAL(zUdl[start + 2].c_str() , "170) * 0"); // udq NO. 1 - BOOST_CHECK_EQUAL(zUdl[start + 3].c_str() , ".6 "); // udq NO. 1 - - start = 3*udqDims[5]; - BOOST_CHECK_EQUAL(zUdl[start + 0].c_str() , "(GOPR 'G"); // udq NO. 1 - BOOST_CHECK_EQUAL(zUdl[start + 1].c_str() , "RP1' - 4"); // udq NO. 1 - BOOST_CHECK_EQUAL(zUdl[start + 2].c_str() , "49) * 0."); // udq NO. 1 - BOOST_CHECK_EQUAL(zUdl[start + 3].c_str() , "77 "); // udq NO. 1 - - start = 4*udqDims[5]; - BOOST_CHECK_EQUAL(zUdl[start + 0].c_str() , "(WLPR 'P"); // udq NO. 1 - BOOST_CHECK_EQUAL(zUdl[start + 1].c_str() , "ROD2' - "); // udq NO. 1 - BOOST_CHECK_EQUAL(zUdl[start + 2].c_str() , "300) * 0"); // udq NO. 1 - BOOST_CHECK_EQUAL(zUdl[start + 3].c_str() , ".8 "); // udq NO. 1 - - start = 5*udqDims[5]; - BOOST_CHECK_EQUAL(zUdl[start + 0].c_str() , "(FLPR - "); // udq NO. 1 - BOOST_CHECK_EQUAL(zUdl[start + 1].c_str() , "543) * 0"); // udq NO. 1 - BOOST_CHECK_EQUAL(zUdl[start + 2].c_str() , ".65 "); // udq NO. 1 - BOOST_CHECK_EQUAL(zUdl[start + 3].c_str() , " "); // udq NO. 1 - - } - - - { - /* - 'DUDW ' 24 'DOUB' - - Dimension = max no wells * no of UDQ's - Value = value of UDQ for the different wells - */ - - const auto& dUdw = udqData.getDUDW(); - - auto start = 0*udqDims[8]; - BOOST_CHECK_EQUAL(dUdw[start + 0] , 210); // duDw NO. 1 - BOOST_CHECK_EQUAL(dUdw[start + 1] , 211); // duDw NO. 1 - BOOST_CHECK_EQUAL(dUdw[start + 2] , 212); // duDw NO. 1 - BOOST_CHECK_EQUAL(dUdw[start + 3] , 213); // duDw NO. 1 - BOOST_CHECK_EQUAL(dUdw[start + 4] , -0.3E+21); // duDw NO. 1 - - start = 1*udqDims[8]; - BOOST_CHECK_EQUAL(dUdw[start + 0] , 400); // duDw NO. 1 - BOOST_CHECK_EQUAL(dUdw[start + 1] , 400); // duDw NO. 1 - BOOST_CHECK_EQUAL(dUdw[start + 2] , 400); // duDw NO. 1 - BOOST_CHECK_EQUAL(dUdw[start + 3] , 400); // duDw NO. 1 - BOOST_CHECK_EQUAL(dUdw[start + 4] , -0.3E+21); // duDw NO. 1 - - - } - - { - /* - 'DUDG ' 5 'DOUB' - - Dimension = (max no groups+1) * no of group UDQ's - Value = value of UDQ for the different groups - */ - - const auto& dUdg = udqData.getDUDG(); - - auto start = 0*udqDims[11]; - BOOST_CHECK_EQUAL(dUdg[start + 0] , 362); // duDg NO. 1 - BOOST_CHECK_EQUAL(dUdg[start + 1] , 360); // duDg NO. 1 - BOOST_CHECK_EQUAL(dUdg[start + 2] , 361); // duDg NO. 1 - BOOST_CHECK_EQUAL(dUdg[start + 3] , -0.3E+21); // duDg NO. 1 - BOOST_CHECK_EQUAL(dUdg[start + 4] , -0.3E+21); // duDg NO. 1 - - - } - - - { - /* - 'DUDG ' 1 'DOUB' - - Dimension = 1 * no of Field UDQ's - Value = value of UDQ for the field - */ - - const auto& dUdf = udqData.getDUDF(); - - auto start = 0*udqDims[12]; - BOOST_CHECK_EQUAL(dUdf[start + 0] , 460); // duDf NO. 1 - - } - - { - auto rst_file = std::make_shared("TEST_UDQRST.UNRST"); - auto rst_view = std::make_shared(std::move(rst_file), 1); - auto rst_state = Opm::RestartIO::RstState::load(std::move(rst_view), es.runspec(), simCase.parser); - BOOST_CHECK_EQUAL(rst_state.header.nwell_udq, 4); - BOOST_CHECK_EQUAL(rst_state.header.ngroup_udq, 1); - BOOST_CHECK_EQUAL(rst_state.header.nfield_udq, 39); - BOOST_CHECK_EQUAL(rst_state.header.num_udq(), 44); - BOOST_CHECK_EQUAL(rst_state.udqs.size(), 44); - - std::vector> expected = { - {"WUOPRL", "SM3/DAY"}, - {"WULPRL", "SM3/DAY"}, - {"WUOPRU", "SM3/DAY"}, - {"GUOPRU", "SM3/DAY"}, - {"WULPRU", "SM3/DAY"}, - {"FULPR" , "SM3/DAY"}}; - - std::size_t iudq = 0; - for (const auto& [name, unit] : expected) { - BOOST_CHECK_EQUAL(name, rst_state.udqs[iudq].name); - BOOST_CHECK_EQUAL(unit, rst_state.udqs[iudq].unit); - iudq += 1; + { + /* + IUAD: + Sequences of 5 items pr UDQ that is used for various well and group controls, + i.e. sorted on the various active controls, see list for item (1).This means that + one udq can occur several times, one for each control it is used for + Only the active controls are output - and the sequence is according to when + they are defined + + dimension 5*no_of_udq-constraint-used in well and group controls + + item (1) : = 200000 + 19 for GCONPROD and ORAT + 300000 + 19 for GCONPROD and WRAT + 400000 + 19 for GCONPROD and GRAT + 500000 + 19 for GCONPROD and LRAT + 300000 + 4 for WCONPROD + oil rate target or upper limit + 400000 + 4 for WCONPROD + water rate target or upper limit + 500000 + 4 for WCONPROD + gas rate target or upper limit + 600000 + 4 for WCONPROD + liquid rate target or upper limit + ? 300000 + 3 for WCONINJE + oil rate target or upper limit + 400000 + 3 for WCONINJE + surface rate target or upper limit + 500000 + 3 for WCONINJE + reservoir volume rate target or upper limit + 1000000 + 27 for CECON + minimum oil rate + + item (2) - sequence number of UDQ used (from input sequence) for the actual constraint/target + + item (3) - do not know yet (value: 1) + item (4) - number of times the UDQ variable is used (e.g. for several different wells) + item (5) - the sequence number for the first use of the actual UDQ (index i+1) = 1+sum over (no_use_udq(i)) + */ + + const auto& iUad = udqData.getIUAD(); + + auto start = 0 * udqDims[3]; + BOOST_CHECK_EQUAL(iUad[start + 0], 300004); // iuad NO. 1 + BOOST_CHECK_EQUAL(iUad[start + 1], 3); // iuad NO. 1 + BOOST_CHECK_EQUAL(iUad[start + 2], 1); // iuad NO. 1 + BOOST_CHECK_EQUAL(iUad[start + 3], 2); // iuad NO. 1 + BOOST_CHECK_EQUAL(iUad[start + 4], 1); // iuad NO. 1 + + start = 1 * udqDims[3]; + BOOST_CHECK_EQUAL(iUad[start + 0], 600004); // iuad NO. 2 + BOOST_CHECK_EQUAL(iUad[start + 1], 5); // iuad NO. 2 + BOOST_CHECK_EQUAL(iUad[start + 2], 1); // iuad NO. 2 + BOOST_CHECK_EQUAL(iUad[start + 3], 2); // iuad NO. 2 + BOOST_CHECK_EQUAL(iUad[start + 4], 3); // iuad NO. 2 + } + + { + /* + ZUDN: + contains UDQ keyword data: + Pairs of: + quantity name (item2): e.g. 'WUOPRL ' and + units: e.g.: 'SM3/DAY ' + + Length is dependent on number of UDQ quantities = 2*no of UDQ's + */ + + const auto& zUdn = udqData.getZUDN(); + + auto start = 0 * udqDims[4]; + BOOST_CHECK_EQUAL(zUdn[start + 0].c_str(), "WUOPRL "); // udq NO. 1 + BOOST_CHECK_EQUAL(zUdn[start + 1].c_str(), "SM3/DAY "); // udq NO. 1 + + start = 1 * udqDims[4]; + BOOST_CHECK_EQUAL(zUdn[start + 0].c_str(), "WULPRL "); // udq NO. 2 + BOOST_CHECK_EQUAL(zUdn[start + 1].c_str(), "SM3/DAY "); // udq NO. 2 + + start = 2 * udqDims[4]; + BOOST_CHECK_EQUAL(zUdn[start + 0].c_str(), "WUOPRU "); // udq NO. 3 + BOOST_CHECK_EQUAL(zUdn[start + 1].c_str(), "SM3/DAY "); // udq NO. 3 + + start = 3 * udqDims[4]; + BOOST_CHECK_EQUAL(zUdn[start + 0].c_str(), "GUOPRU "); // udq NO. 4 + BOOST_CHECK_EQUAL(zUdn[start + 1].c_str(), "SM3/DAY "); // udq NO. 4 + + start = 4 * udqDims[4]; + BOOST_CHECK_EQUAL(zUdn[start + 0].c_str(), "WULPRU "); // udq NO. 5 + BOOST_CHECK_EQUAL(zUdn[start + 1].c_str(), "SM3/DAY "); // udq NO. 5 + + start = 5 * udqDims[4]; + BOOST_CHECK_EQUAL(zUdn[start + 0].c_str(), "FULPR "); // udq NO. 6 + BOOST_CHECK_EQUAL(zUdn[start + 1].c_str(), "SM3/DAY "); // udq NO. 6 } - const std::size_t report_step = 1; - const auto& udq_params = es.runspec().udqParams(); - const auto& input_config = sched[report_step].udq(); - Opm::UDQConfig rst_config(udq_params, rst_state); - BOOST_CHECK_EQUAL(input_config.size(), rst_config.size()); - BOOST_CHECK_EQUAL(input_config.definitions().size(), rst_config.definitions().size()); + { + /* + ZUDL: + contains string that define the "Data for operation" for the defined quantity - const std::vector& wells = {"PROD1", "PROD2", "WINJ1", "WINJ2"}; - Opm::UDQState rst_udq_state(udq_params.undefinedValue()); - Opm::UDQFunctionTable udqft(udq_params); - Opm::UDQContext input_context(udqft, Opm::WellMatcher(wells), st, udq_state); - Opm::UDQContext rst_context(udqft, Opm::WellMatcher(wells), st, rst_udq_state); + e.g. + '(WOPR OP' 'L01 - 15' '0) * 0.9' '0 ' ' ' ' ' ' ' - rst_udq_state.load_rst(rst_state); - for (const auto& input_def : input_config.definitions()) { - const auto& rst_def = rst_config.define( input_def.keyword() ); - auto input_eval = input_def.eval(input_context); - auto rst_eval = rst_def.eval(rst_context); + The appropriate data are split into strings of 8 characters each. - BOOST_CHECK(input_eval == rst_eval); - } + Length: No of UDQ's * 16 + */ - for (const auto& input_assign : input_config.assignments()) { - const auto& rst_assign = rst_config.assign( input_assign.keyword() ); + const auto& zUdl = udqData.getZUDL(); - auto input_eval = input_assign.eval(wells); - auto rst_eval = rst_assign.eval(wells); + auto start = 0 * udqDims[5]; + BOOST_CHECK_EQUAL(zUdl[start + 0].c_str(), "(WOPR 'P"); // udq NO. 1 + BOOST_CHECK_EQUAL(zUdl[start + 1].c_str(), "ROD1' - "); // udq NO. 1 + BOOST_CHECK_EQUAL(zUdl[start + 2].c_str(), "170) * 0"); // udq NO. 1 + BOOST_CHECK_EQUAL(zUdl[start + 3].c_str(), ".6 "); // udq NO. 1 - BOOST_CHECK(input_eval == rst_eval); + start = 3 * udqDims[5]; + BOOST_CHECK_EQUAL(zUdl[start + 0].c_str(), "(GOPR 'G"); // udq NO. 1 + BOOST_CHECK_EQUAL(zUdl[start + 1].c_str(), "RP1' - 4"); // udq NO. 1 + BOOST_CHECK_EQUAL(zUdl[start + 2].c_str(), "49) * 0."); // udq NO. 1 + BOOST_CHECK_EQUAL(zUdl[start + 3].c_str(), "77 "); // udq NO. 1 + + start = 4 * udqDims[5]; + BOOST_CHECK_EQUAL(zUdl[start + 0].c_str(), "(WLPR 'P"); // udq NO. 1 + BOOST_CHECK_EQUAL(zUdl[start + 1].c_str(), "ROD2' - "); // udq NO. 1 + BOOST_CHECK_EQUAL(zUdl[start + 2].c_str(), "300) * 0"); // udq NO. 1 + BOOST_CHECK_EQUAL(zUdl[start + 3].c_str(), ".8 "); // udq NO. 1 + + start = 5 * udqDims[5]; + BOOST_CHECK_EQUAL(zUdl[start + 0].c_str(), "(FLPR - "); // udq NO. 1 + BOOST_CHECK_EQUAL(zUdl[start + 1].c_str(), "543) * 0"); // udq NO. 1 + BOOST_CHECK_EQUAL(zUdl[start + 2].c_str(), ".65 "); // udq NO. 1 + BOOST_CHECK_EQUAL(zUdl[start + 3].c_str(), " "); // udq NO. 1 } - const auto& uda_records = Opm::UDQActive::load_rst(es.getUnits(), - input_config, - rst_state, - sched.wellNames(report_step), - sched.groupNames(report_step) ); + { + /* + 'DUDW ' 24 'DOUB' - BOOST_CHECK_EQUAL(uda_records.size(), 4); - BOOST_CHECK(udq_contains(uda_records, Opm::UDAControl::WCONPROD_ORAT, "WUOPRU", "PROD1")); - BOOST_CHECK(udq_contains(uda_records, Opm::UDAControl::WCONPROD_LRAT, "WULPRU", "PROD1")); - BOOST_CHECK(udq_contains(uda_records, Opm::UDAControl::WCONPROD_ORAT, "WUOPRU", "PROD2")); - BOOST_CHECK(udq_contains(uda_records, Opm::UDAControl::WCONPROD_LRAT, "WULPRU", "PROD2")); + Dimension = max no wells * no of UDQ's + Value = value of UDQ for the different wells + */ + + const auto& dUdw = udqData.getDUDW(); + + auto start = 0 * udqDims[8]; + BOOST_CHECK_EQUAL(dUdw[start + 0], 210); // duDw NO. 1 + BOOST_CHECK_EQUAL(dUdw[start + 1], 211); // duDw NO. 1 + BOOST_CHECK_EQUAL(dUdw[start + 2], 212); // duDw NO. 1 + BOOST_CHECK_EQUAL(dUdw[start + 3], 213); // duDw NO. 1 + BOOST_CHECK_EQUAL(dUdw[start + 4], -0.3E+21); // duDw NO. 1 + + start = 1 * udqDims[8]; + BOOST_CHECK_EQUAL(dUdw[start + 0], 400); // duDw NO. 1 + BOOST_CHECK_EQUAL(dUdw[start + 1], 400); // duDw NO. 1 + BOOST_CHECK_EQUAL(dUdw[start + 2], 400); // duDw NO. 1 + BOOST_CHECK_EQUAL(dUdw[start + 3], 400); // duDw NO. 1 + BOOST_CHECK_EQUAL(dUdw[start + 4], -0.3E+21); // duDw NO. 1 + } + + { + /* + 'DUDG ' 5 'DOUB' + + Dimension = (max no groups+1) * no of group UDQ's + Value = value of UDQ for the different groups + */ + + const auto& dUdg = udqData.getDUDG(); + + auto start = 0 * udqDims[11]; + BOOST_CHECK_EQUAL(dUdg[start + 0], 362); // duDg NO. 1 + BOOST_CHECK_EQUAL(dUdg[start + 1], 360); // duDg NO. 1 + BOOST_CHECK_EQUAL(dUdg[start + 2], 361); // duDg NO. 1 + BOOST_CHECK_EQUAL(dUdg[start + 3], -0.3E+21); // duDg NO. 1 + BOOST_CHECK_EQUAL(dUdg[start + 4], -0.3E+21); // duDg NO. 1 + } + + + { + /* + 'DUDG ' 1 'DOUB' + + Dimension = 1 * no of Field UDQ's + Value = value of UDQ for the field + */ + + const auto& dUdf = udqData.getDUDF(); + + auto start = 0 * udqDims[12]; + BOOST_CHECK_EQUAL(dUdf[start + 0], 460); // duDf NO. 1 + } + + { + auto rst_file = std::make_shared("TEST_UDQRST.UNRST"); + auto rst_view = std::make_shared(std::move(rst_file), 1); + auto rst_state = Opm::RestartIO::RstState::load(std::move(rst_view), es.runspec(), simCase.parser); + BOOST_CHECK_EQUAL(rst_state.header.nwell_udq, 4); + BOOST_CHECK_EQUAL(rst_state.header.ngroup_udq, 1); + BOOST_CHECK_EQUAL(rst_state.header.nfield_udq, 39); + BOOST_CHECK_EQUAL(rst_state.header.num_udq(), 44); + BOOST_CHECK_EQUAL(rst_state.udqs.size(), 44); + + std::vector> expected = {{"WUOPRL", "SM3/DAY"}, + {"WULPRL", "SM3/DAY"}, + {"WUOPRU", "SM3/DAY"}, + {"GUOPRU", "SM3/DAY"}, + {"WULPRU", "SM3/DAY"}, + {"FULPR", "SM3/DAY"}}; + + std::size_t iudq = 0; + for (const auto& [name, unit] : expected) { + BOOST_CHECK_EQUAL(name, rst_state.udqs[iudq].name); + BOOST_CHECK_EQUAL(unit, rst_state.udqs[iudq].unit); + iudq += 1; + } + + + const std::size_t report_step = 1; + const auto& udq_params = es.runspec().udqParams(); + const auto& input_config = sched[report_step].udq(); + Opm::UDQConfig rst_config(udq_params, rst_state); + BOOST_CHECK_EQUAL(input_config.size(), rst_config.size()); + BOOST_CHECK_EQUAL(input_config.definitions().size(), rst_config.definitions().size()); + + const std::vector& wells = {"PROD1", "PROD2", "WINJ1", "WINJ2"}; + Opm::UDQState rst_udq_state(udq_params.undefinedValue()); + Opm::UDQFunctionTable udqft(udq_params); + Opm::UDQContext input_context(udqft, Opm::WellMatcher(wells), st, udq_state); + Opm::UDQContext rst_context(udqft, Opm::WellMatcher(wells), st, rst_udq_state); + + rst_udq_state.load_rst(rst_state); + for (const auto& input_def : input_config.definitions()) { + const auto& rst_def = rst_config.define(input_def.keyword()); + auto input_eval = input_def.eval(input_context); + auto rst_eval = rst_def.eval(rst_context); + + BOOST_CHECK(input_eval == rst_eval); + } + + for (const auto& input_assign : input_config.assignments()) { + const auto& rst_assign = rst_config.assign(input_assign.keyword()); + + auto input_eval = input_assign.eval(wells); + auto rst_eval = rst_assign.eval(wells); + + BOOST_CHECK(input_eval == rst_eval); + } + + + const auto& uda_records = Opm::UDQActive::load_rst( + es.getUnits(), input_config, rst_state, sched.wellNames(report_step), sched.groupNames(report_step)); + + BOOST_CHECK_EQUAL(uda_records.size(), 4); + BOOST_CHECK(udq_contains(uda_records, Opm::UDAControl::WCONPROD_ORAT, "WUOPRU", "PROD1")); + BOOST_CHECK(udq_contains(uda_records, Opm::UDAControl::WCONPROD_LRAT, "WULPRU", "PROD1")); + BOOST_CHECK(udq_contains(uda_records, Opm::UDAControl::WCONPROD_ORAT, "WUOPRU", "PROD2")); + BOOST_CHECK(udq_contains(uda_records, Opm::UDAControl::WCONPROD_LRAT, "WULPRU", "PROD2")); + } } } From 1f8e545ea193d896f5b77a606b0fce51b8002c00 Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Thu, 16 Sep 2021 17:00:51 +0200 Subject: [PATCH 05/11] Make sure summary testing can be done with readonly tests/ --- tests/test_ExtESmry.cpp | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/tests/test_ExtESmry.cpp b/tests/test_ExtESmry.cpp index 50656f632..c9991e9c0 100644 --- a/tests/test_ExtESmry.cpp +++ b/tests/test_ExtESmry.cpp @@ -37,6 +37,9 @@ #include #include +#include "tests/WorkArea.cpp" + + using Opm::EclIO::ESmry; using Opm::EclIO::ExtESmry; @@ -150,9 +153,9 @@ std::vector getFrom(const std::vector &ref_vect,int from){ } BOOST_AUTO_TEST_CASE(TestExtESmry_1) { - - if (Opm::filesystem::exists("SPE1CASE1.ESMRY")) - Opm::filesystem::remove("SPE1CASE1.ESMRY"); + WorkArea work; + work.copyIn("SPE1CASE1.SMSPEC"); + work.copyIn("SPE1CASE1.UNSMRY"); ESmry smry1("SPE1CASE1.SMSPEC"); @@ -212,10 +215,6 @@ BOOST_AUTO_TEST_CASE(TestExtESmry_1) { ExtESmry esmry2("SPE1CASE1.ESMRY"); esmry2.loadData(); - - - if (Opm::filesystem::exists("SPE1CASE1.ESMRY")) - Opm::filesystem::remove("SPE1CASE1.ESMRY"); } BOOST_AUTO_TEST_CASE(TestExtESmry_2) { @@ -236,7 +235,7 @@ BOOST_AUTO_TEST_CASE(TestExtESmry_2) { // this is what the summary file from the restart run would be if the restart was 100% perfect. // changing summary keywords to make the file realistic. - + WorkArea work; std::vector time_ref, wgpr_prod_ref, wbhp_prod_ref, wbhp_inj_ref, fgor_ref, bpr_111_ref, bpr_10103_ref; getRefSmryVect(time_ref, wgpr_prod_ref, wbhp_prod_ref, wbhp_inj_ref,fgor_ref, bpr_111_ref, bpr_10103_ref); @@ -244,9 +243,9 @@ BOOST_AUTO_TEST_CASE(TestExtESmry_2) { // defaulting second argument, loadBaseRunData. Only data from the restarted run // will be loaded. No data from base run (SPE1CASE1 in this case) - if (Opm::filesystem::exists("SPE1CASE1.ESMRY")) - Opm::filesystem::remove("SPE1CASE1.ESMRY"); - + work.copyIn("SPE1CASE1.SMSPEC"); + work.copyIn("SPE1CASE1.UNSMRY"); + work.copyIn("SPE1CASE1_RST60.ESMRY"); ESmry smry1("SPE1CASE1.SMSPEC"); smry1.make_esmry_file(); @@ -302,10 +301,6 @@ BOOST_AUTO_TEST_CASE(TestExtESmry_2) { for (unsigned int i=0;i< smryVect.size();i++) BOOST_REQUIRE_CLOSE (smryVect[i], ref_rst60[i], 0.01); - - if (Opm::filesystem::exists("SPE1CASE1.ESMRY")) - Opm::filesystem::remove("SPE1CASE1.ESMRY"); - } BOOST_AUTO_TEST_CASE(TestESmry_3) { @@ -325,7 +320,10 @@ BOOST_AUTO_TEST_CASE(TestESmry_3) { // this is what the summary file from the restart run would be if the restart was 100% perfect. // changing summary keywords to make the file realistic. - + WorkArea work; + work.copyIn("SPE1CASE1.SMSPEC"); + work.copyIn("SPE1CASE1.UNSMRY"); + work.copyIn("SPE1CASE1_RST60.ESMRY"); std::vector time_ref, wgpr_prod_ref, wbhp_prod_ref, wbhp_inj_ref, fgor_ref, bpr_111_ref, bpr_10103_ref; @@ -334,8 +332,6 @@ BOOST_AUTO_TEST_CASE(TestESmry_3) { // second argument, loadBaseRunData = true. Both data from restarted run and base run loaded // vectors should be equal to reference vectors (from SPE1CASE1) - if (Opm::filesystem::exists("SPE1CASE1.ESMRY")) - Opm::filesystem::remove("SPE1CASE1.ESMRY"); ESmry smry1("SPE1CASE1.SMSPEC"); smry1.make_esmry_file(); @@ -377,8 +373,5 @@ BOOST_AUTO_TEST_CASE(TestESmry_3) { for (unsigned int i=0;i< smryVect.size();i++) BOOST_REQUIRE_CLOSE (smryVect[i], bpr_10103_ref[i], 0.01); - if (Opm::filesystem::exists("SPE1CASE1.ESMRY")) - Opm::filesystem::remove("SPE1CASE1.ESMRY"); - } From 5b3cd8b9081c410b047ba7d2781f80a0b5e20754 Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Thu, 16 Sep 2021 17:04:44 +0200 Subject: [PATCH 06/11] Ensure RFT testing can be done in readonly tests/ --- tests/test_ERft.cpp | 78 +++++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 38 deletions(-) diff --git a/tests/test_ERft.cpp b/tests/test_ERft.cpp index d9b491ebc..8fd22fa01 100644 --- a/tests/test_ERft.cpp +++ b/tests/test_ERft.cpp @@ -35,6 +35,8 @@ #include #include +#include "tests/WorkArea.cpp" + using namespace Opm::EclIO; template @@ -172,55 +174,55 @@ BOOST_AUTO_TEST_CASE(TestERft_1) { BOOST_AUTO_TEST_CASE(TestERft_2) { - std::string testFile="SPE1CASE1.RFT"; + std::string testFile = "SPE1CASE1.RFT"; - std::string outFile="TEST.RFT"; + std::string outFile = "TEST.RFT"; { - EclOutput eclTest(outFile, false); + WorkArea work; + work.copyIn(testFile); + { + EclOutput eclTest(outFile, false); - ERft rft1(testFile); + ERft rft1(testFile); - auto rftList = rft1.listOfRftReports(); + auto rftList = rft1.listOfRftReports(); - for (auto& rft : rftList) { - std::string wellName = std::get<0>(rft); - auto date = std::get<1>(rft); + for (auto& rft : rftList) { + std::string wellName = std::get<0>(rft); + auto date = std::get<1>(rft); - auto arrayList = rft1.listOfRftArrays(wellName, date); + auto arrayList = rft1.listOfRftArrays(wellName, date); - for (auto& array : arrayList) { - std::string arrName = std::get<0>(array); - eclArrType arrType = std::get<1>(array); + for (auto& array : arrayList) { + std::string arrName = std::get<0>(array); + eclArrType arrType = std::get<1>(array); - if (arrType == INTE) { - std::vector vect = rft1.getRft(arrName, wellName, date); - eclTest.write(arrName, vect); - } else if (arrType == REAL) { - std::vector vect = rft1.getRft(arrName, wellName, date); - eclTest.write(arrName, vect); - } else if (arrType == DOUB) { - std::vector vect = rft1.getRft(arrName, wellName, date); - eclTest.write(arrName, vect); - } else if (arrType == LOGI) { - std::vector vect = rft1.getRft(arrName, wellName, date); - eclTest.write(arrName, vect); - } else if (arrType == CHAR) { - std::vector vect = rft1.getRft(arrName, wellName, date); - eclTest.write(arrName, vect); - } else if (arrType == MESS) { - eclTest.write(arrName, std::vector()); - } else { - std::cout << "unknown type " << std::endl; - exit(1); + if (arrType == INTE) { + std::vector vect = rft1.getRft(arrName, wellName, date); + eclTest.write(arrName, vect); + } else if (arrType == REAL) { + std::vector vect = rft1.getRft(arrName, wellName, date); + eclTest.write(arrName, vect); + } else if (arrType == DOUB) { + std::vector vect = rft1.getRft(arrName, wellName, date); + eclTest.write(arrName, vect); + } else if (arrType == LOGI) { + std::vector vect = rft1.getRft(arrName, wellName, date); + eclTest.write(arrName, vect); + } else if (arrType == CHAR) { + std::vector vect = rft1.getRft(arrName, wellName, date); + eclTest.write(arrName, vect); + } else if (arrType == MESS) { + eclTest.write(arrName, std::vector()); + } else { + std::cout << "unknown type " << std::endl; + exit(1); + } } } } + + BOOST_CHECK_EQUAL(compare_files(testFile, outFile), true); } - - BOOST_CHECK_EQUAL(compare_files(testFile, outFile), true); - - if (remove(outFile.c_str())==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - }; } From 08f91401919efa882be2fde79f5c7b957393c3eb Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Fri, 17 Sep 2021 09:05:25 +0200 Subject: [PATCH 07/11] Summary testing with readonly tests/ --- tests/test_restartwellinfo.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_restartwellinfo.cpp b/tests/test_restartwellinfo.cpp index 73ea8eee9..06e4d7a0f 100644 --- a/tests/test_restartwellinfo.cpp +++ b/tests/test_restartwellinfo.cpp @@ -46,6 +46,7 @@ #include #include +#include "tests/WorkArea.cpp" void verifyWellState(const std::string& rst_filename, const Opm::Schedule& schedule) { @@ -197,7 +198,9 @@ void verifyWellState(const std::string& rst_filename, const Opm::Schedule& sched BOOST_AUTO_TEST_CASE(EclipseWriteRestartWellInfo) { + WorkArea work; std::string eclipse_data_filename = "testblackoilstate3.DATA"; + work.copyIn(eclipse_data_filename); auto python = std::make_shared(); Opm::Parser parser; From 41c97ad6a2caf68d28c8d801000e7ba3a5eb8cb3 Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Fri, 17 Sep 2021 09:16:12 +0200 Subject: [PATCH 08/11] Make sure regression test testing can go in readonly tests/ --- tests/test_EclRegressionTest.cpp | 115 +++---------------------------- 1 file changed, 11 insertions(+), 104 deletions(-) diff --git a/tests/test_EclRegressionTest.cpp b/tests/test_EclRegressionTest.cpp index 8fa6efb09..c64654a3a 100644 --- a/tests/test_EclRegressionTest.cpp +++ b/tests/test_EclRegressionTest.cpp @@ -31,6 +31,7 @@ #include #include +#include "tests/WorkArea.cpp" using Opm::EclIO::EGrid; using Opm::EclIO::ESmry; @@ -318,6 +319,7 @@ BOOST_AUTO_TEST_CASE(gridCompare) { std::vector nnc1; std::vector nnc2; std::vector actnum; + WorkArea work; //------------------------------------------------------------- // base: identical grids @@ -432,17 +434,10 @@ BOOST_AUTO_TEST_CASE(gridCompare) { test6.loadGrids(); BOOST_CHECK_THROW(test6.gridCompare(),std::runtime_error); - - if (remove("TMP1.EGRID")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - }; - - if (remove("TMP2.EGRID")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - }; } BOOST_AUTO_TEST_CASE(results_init_1) { + WorkArea work; std::vector> intData1; std::vector> floatData1; @@ -520,14 +515,6 @@ BOOST_AUTO_TEST_CASE(results_init_1) { BOOST_CHECK_THROW(test1a.results_init(),std::runtime_error); - - if (remove("TMP1.INIT")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - } - - if (remove("TMP2.INIT")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - }; } BOOST_AUTO_TEST_CASE(results_init_2) { @@ -548,6 +535,7 @@ BOOST_AUTO_TEST_CASE(results_init_2) { std::vector poro2(12,0.25); std::vector fipnum2(12,1); + WorkArea work; // --------------------------------------------------------------------------- // array PORV requires strict tolerances, 1e-6 @@ -625,17 +613,10 @@ BOOST_AUTO_TEST_CASE(results_init_2) { ECLRegressionTest test3("TMP1", "TMP2", 1e-3, 1e-3); BOOST_CHECK_THROW(test3.results_init(),std::runtime_error); - - if (remove("TMP1.INIT")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - } - - if (remove("TMP2.INIT")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - }; } BOOST_AUTO_TEST_CASE(results_unrst_1) { + WorkArea work; using Date = std::tuple; std::vector seqnum1 = {0,1,4,7}; @@ -760,17 +741,10 @@ BOOST_AUTO_TEST_CASE(results_unrst_1) { // should fail BOOST_CHECK_THROW(test2a.results_rst(),std::runtime_error); - - if (remove("TMP1.UNRST")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - } - - if (remove("TMP2.UNRST")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - }; } BOOST_AUTO_TEST_CASE(results_unrst_2) { + WorkArea work; using Date = std::tuple; std::vector seqnum1 = {0,1,4,7}; @@ -857,17 +831,11 @@ BOOST_AUTO_TEST_CASE(results_unrst_2) { test1.results_rst(); - if (remove("TMP1.UNRST")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - } - - if (remove("TMP2.UNRST")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - }; } BOOST_AUTO_TEST_CASE(results_unrst_3) { + WorkArea work; using Date = std::tuple; std::vector seqnum1 = {0,1,4,7}; @@ -971,18 +939,11 @@ BOOST_AUTO_TEST_CASE(results_unrst_3) { // should get deviations for two keywords BOOST_CHECK_EQUAL(test2.countDev(),2); - if (remove("TMP1.UNRST")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - } - - if (remove("TMP2.UNRST")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - }; } BOOST_AUTO_TEST_CASE(results_unsmry_1) { - + WorkArea work; std::vector keywords1 = {"TIME", "YEARS", "FOPR", "FOPT", "WOPR", "WOPR", "WBHP", "WBHP", "ROIP"}; std::vector wgnames1 = {":+:+:+:+", ":+:+:+:+", "FIELD", "FIELD", "A-1H", "A-2H", "A-1H", "A-2H", ":+:+:+:+"}; std::vector nums1 = {-32767, -32767, 0, 0, 1, 2, 1, 2, 1}; @@ -1072,29 +1033,12 @@ BOOST_AUTO_TEST_CASE(results_unsmry_1) { // should fail since not found in any of the cases test2a.compareSpesificKeyword("XXXXX"); BOOST_CHECK_THROW(test2a.results_smry(),std::runtime_error); - - if (remove("TMP1.SMSPEC")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - } - - if (remove("TMP2.SMSPEC")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - } - - if (remove("TMP1.UNSMRY")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - } - - if (remove("TMP2.UNSMRY")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - } - } BOOST_AUTO_TEST_CASE(results_unsmry_2) { - + WorkArea work; std::vector keywords1 = {"TIME", "YEARS", "FOPR", "FOPT", "WOPR", "WOPR", "WBHP", "WBHP", "ROIP"}; std::vector wgnames1 = {":+:+:+:+", ":+:+:+:+", "FIELD", "FIELD", "A-1H", "A-2H", "A-1H", "A-2H", ":+:+:+:+"}; std::vector nums1 = {-32767, -32767, 0, 0, 1, 2, 1, 2, 1}; @@ -1153,23 +1097,6 @@ BOOST_AUTO_TEST_CASE(results_unsmry_2) { // should get deviations for two keywords BOOST_CHECK_EQUAL(test2.countDev(),2); - - if (remove("TMP1.SMSPEC")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - } - - if (remove("TMP2.SMSPEC")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - } - - if (remove("TMP1.UNSMRY")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - } - - if (remove("TMP2.UNSMRY")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - } - } @@ -1189,6 +1116,7 @@ BOOST_AUTO_TEST_CASE(results_unsmry_3) { BOOST_AUTO_TEST_CASE(results_rft_1) { + WorkArea work; using Date = std::tuple; std::vector time1 = {0.0, 40.0, 50.0}; @@ -1321,22 +1249,10 @@ BOOST_AUTO_TEST_CASE(results_rft_1) { ECLRegressionTest test2("TMP1", "TMP3", 1e-3, 1e-3); BOOST_CHECK_THROW(test2.results_rft(),std::runtime_error); - - if (remove("TMP1.RFT")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - } - - if (remove("TMP2.RFT")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - } - - if (remove("TMP3.RFT")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - } - } BOOST_AUTO_TEST_CASE(results_rft_2) { + WorkArea work; using Date = std::tuple; std::vector time1 = {0.0, 40.0, 50.0}; @@ -1436,14 +1352,5 @@ BOOST_AUTO_TEST_CASE(results_rft_2) { // should get deviations for two keywords BOOST_CHECK_EQUAL(test3.countDev(), 2); - - if (remove("TMP1.RFT")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - } - - if (remove("TMP2.RFT")==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - } - } From 9478bf02929e8085afa8f0c65057014d1df3e11c Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Fri, 17 Sep 2021 09:32:19 +0200 Subject: [PATCH 09/11] Run EclIO tests in readonly tests/ --- tests/test_EclIO.cpp | 58 ++++++++++++++++++-------------------------- 1 file changed, 23 insertions(+), 35 deletions(-) diff --git a/tests/test_EclIO.cpp b/tests/test_EclIO.cpp index 4a7fe312c..822b51fe5 100644 --- a/tests/test_EclIO.cpp +++ b/tests/test_EclIO.cpp @@ -89,6 +89,7 @@ void write_header(std::ofstream& ofileH, std::string& arrName, int size, std::st BOOST_AUTO_TEST_CASE(TestEclFile_X231) { + WorkArea work; std::string filename = "TEST.DAT"; std::string arrName = "TESTX231"; @@ -100,17 +101,17 @@ BOOST_AUTO_TEST_CASE(TestEclFile_X231) { std::ofstream ofileH; ofileH.open(filename, std::ios_base::binary); - int size = static_cast((-1) * std::pow(2,31) + 10); + int size = static_cast((-1) * std::pow(2, 31) + 10); write_header(ofileH, arrName, -1, std::string("X231")); write_header(ofileH, arrName, size, std::string("INTE")); - int sizeData = ivect.size()*sizeof(int); + int sizeData = ivect.size() * sizeof(int); sizeData = flipEndianInt(sizeData); ofileH.write(reinterpret_cast(&sizeData), sizeof(sizeData)); - for (auto v : ivect){ + for (auto v : ivect) { int fval = flipEndianInt(v); ofileH.write(reinterpret_cast(&fval), sizeof(fval)); } @@ -122,7 +123,7 @@ BOOST_AUTO_TEST_CASE(TestEclFile_X231) { EclFile test1(filename); auto array = test1.get(arrName); - for (size_t n = 0; n < 10; n++){ + for (size_t n = 0; n < 10; n++) { BOOST_CHECK_EQUAL(array[n], ivect[n]); } } @@ -283,6 +284,7 @@ BOOST_AUTO_TEST_CASE(TestEcl_Write_binary) { // writing vectors to test file (TEST.DAT) using class EclOutput + WorkArea work; { EclOutput eclTest(testFile, false); @@ -292,13 +294,10 @@ BOOST_AUTO_TEST_CASE(TestEcl_Write_binary) { eclTest.write("XCON",xcon); eclTest.write("KEYWORDS",keywords); eclTest.write("ENDSOL",std::vector()); + } - + work.copyIn(inputFile); BOOST_CHECK_EQUAL(compare_files(inputFile, testFile), true); - - if (remove(testFile.c_str())==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - }; } BOOST_AUTO_TEST_CASE(TestEcl_Write_formatted) { @@ -319,20 +318,20 @@ BOOST_AUTO_TEST_CASE(TestEcl_Write_formatted) { // writing vectors to test file (TEST.FDAT) using class EclOutput - EclOutput eclTest(testFile, true); + { + WorkArea work; + EclOutput eclTest(testFile, true); - eclTest.write("ICON",icon); - eclTest.write("LOGIHEAD",logihead); - eclTest.write("PORV",porv); - eclTest.write("XCON",xcon); - eclTest.write("KEYWORDS",keywords); - eclTest.write("ENDSOL",std::vector()); + eclTest.write("ICON",icon); + eclTest.write("LOGIHEAD",logihead); + eclTest.write("PORV",porv); + eclTest.write("XCON",xcon); + eclTest.write("KEYWORDS",keywords); + eclTest.write("ENDSOL",std::vector()); - BOOST_CHECK_EQUAL(compare_files(inputFile, testFile), true); - - if (remove(testFile.c_str())==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - }; + work.copyIn(inputFile); + BOOST_CHECK_EQUAL(compare_files(inputFile, testFile), true); + } } BOOST_AUTO_TEST_CASE(TestEcl_Write_formatted_not_finite) { @@ -372,6 +371,7 @@ BOOST_AUTO_TEST_CASE(TestEcl_getList) { EclFile file1(inputFile); file1.loadData(); + WorkArea work; { EclOutput eclTest(testFile, false); @@ -407,16 +407,13 @@ BOOST_AUTO_TEST_CASE(TestEcl_getList) { } } + work.copyIn(inputFile); BOOST_CHECK_EQUAL(compare_files(inputFile, testFile), true); - - if (remove(testFile.c_str())==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - }; } BOOST_AUTO_TEST_CASE(TestEcl_Write_CHAR) { - + WorkArea work; std::string testFile1="TEST.FDAT"; std::string testFile2="TEST2.DAT"; @@ -532,13 +529,4 @@ BOOST_AUTO_TEST_CASE(TestEcl_Write_CHAR) { auto arrayList =file1.getList(); BOOST_CHECK(std::get<1>(arrayList[0]) == Opm::EclIO::C0NN); } - - if (remove(testFile1.c_str())==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - }; - - if (remove(testFile2.c_str())==-1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - }; - } From ca59665575fbae756f0db461b76b7e7424a60cea Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Fri, 17 Sep 2021 09:50:17 +0200 Subject: [PATCH 10/11] Run ERst tests in readonly tests/ --- tests/test_ERst.cpp | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/tests/test_ERst.cpp b/tests/test_ERst.cpp index e543528f7..db4d25b1d 100644 --- a/tests/test_ERst.cpp +++ b/tests/test_ERst.cpp @@ -41,6 +41,8 @@ #include +#include "tests/WorkArea.cpp" + using namespace Opm::EclIO; template @@ -221,8 +223,10 @@ BOOST_AUTO_TEST_CASE(TestERst_2) { // using API for ERst to read all array from a binary unified restart file1 // Then write the data back to a new file and check that new file is identical with input file - ERst rst1(testFile); + WorkArea work; + work.copyIn(testFile); + ERst rst1(testFile); { EclOutput eclTest(outFile, false); @@ -230,7 +234,6 @@ BOOST_AUTO_TEST_CASE(TestERst_2) { for (size_t i = 0; i < seqnums.size(); i++) { rst1.loadReportStepNumber(seqnums[i]); - auto rstArrays = rst1.listOfRstArrays(seqnums[i]); for (auto& array : rstArrays) { @@ -242,10 +245,6 @@ BOOST_AUTO_TEST_CASE(TestERst_2) { } BOOST_CHECK_EQUAL(compare_files(testFile, outFile), true); - - if (remove(outFile.c_str()) == -1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - }; } @@ -257,28 +256,26 @@ BOOST_AUTO_TEST_CASE(TestERst_3) { // using API for ERst to read all array from a formatted unified restart file1 // Then write the data back to a new file and check that new file is identical with input file + WorkArea work; + work.copyIn(testFile); ERst rst1(testFile); + { + EclOutput eclTest(outFile, true); - EclOutput eclTest(outFile, true); + std::vector seqnums = rst1.listOfReportStepNumbers(); + for (unsigned int i = 0; i < seqnums.size(); i++) { + rst1.loadReportStepNumber(seqnums[i]); - std::vector seqnums = rst1.listOfReportStepNumbers(); - for (unsigned int i=0; i(array); - eclArrType arrType = std::get<1>(array); - readAndWrite(eclTest, rst1, name, seqnums[i], arrType); + for (auto& array : rstArrays) { + std::string name = std::get<0>(array); + eclArrType arrType = std::get<1>(array); + readAndWrite(eclTest, rst1, name, seqnums[i], arrType); + } } } - BOOST_CHECK_EQUAL(compare_files(testFile, outFile), true); - - if (remove(outFile.c_str() )== -1) { - std::cout << " > Warning! temporary file was not deleted" << std::endl; - }; } From 7562781a8b3ecadfd97b63ecbf1ba60974042e94 Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Fri, 17 Sep 2021 10:00:52 +0200 Subject: [PATCH 11/11] Readonly summary testing --- tests/test_ESmry.cpp | 33 ++++++++++----------------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/tests/test_ESmry.cpp b/tests/test_ESmry.cpp index cd94856f4..5d63fa617 100644 --- a/tests/test_ESmry.cpp +++ b/tests/test_ESmry.cpp @@ -35,6 +35,7 @@ #include #include #include +#include "tests/WorkArea.cpp" using Opm::EclIO::ESmry; @@ -401,11 +402,14 @@ BOOST_AUTO_TEST_CASE(TestCreateRSM) { ESmry smry1("SPE1CASE1.SMSPEC"); smry1.LoadData(); - smry1.write_rsm_file(); - BOOST_CHECK(fs::exists("SPE1CASE1.RSM")); + { + WorkArea work; + smry1.write_rsm_file(); + BOOST_CHECK(fs::exists("SPE1CASE1.RSM")); - smry1.write_rsm_file("TEST.RSM"); - BOOST_CHECK(fs::exists("TEST.RSM")); + smry1.write_rsm_file("TEST.RSM"); + BOOST_CHECK(fs::exists("TEST.RSM")); + } } BOOST_AUTO_TEST_CASE(TestUnits) { @@ -430,6 +434,7 @@ BOOST_AUTO_TEST_CASE(Test_all_available) { std::vector nums (8, 0); + WorkArea work; { Opm::EclIO::EclOutput smspec1("TMP1.SMSPEC", false); smspec1.write("INTEHEAD", {1,100}); @@ -489,13 +494,6 @@ BOOST_AUTO_TEST_CASE(Test_all_available) { Opm::EclIO::ESmry smry2("TMP1.SMSPEC"); BOOST_CHECK_EQUAL( smry2.all_steps_available(), false); - - if (Opm::filesystem::exists("TMP1.SMSPEC")) - Opm::filesystem::remove("TMP1.SMSPEC"); - - if (Opm::filesystem::exists("TMP1.UNSMRY")) - Opm::filesystem::remove("TMP1.UNSMRY"); - } BOOST_AUTO_TEST_CASE(Test_all_available_w_restart) { @@ -511,6 +509,7 @@ BOOST_AUTO_TEST_CASE(Test_all_available_w_restart) { std::vector nums (8, 0); + WorkArea work; { Opm::EclIO::EclOutput smspec1("BASE1.SMSPEC", false); smspec1.write("INTEHEAD", {1,100}); @@ -648,18 +647,6 @@ BOOST_AUTO_TEST_CASE(Test_all_available_w_restart) { Opm::EclIO::ESmry smry3("RST2.SMSPEC", true); BOOST_CHECK_EQUAL( smry3.all_steps_available(), false); - - if (Opm::filesystem::exists("BASE1.SMSPEC")) - Opm::filesystem::remove("BASE1.SMSPEC"); - - if (Opm::filesystem::exists("BASE1.UNSMRY")) - Opm::filesystem::remove("BASE1.UNSMRY"); - - if (Opm::filesystem::exists("RST2.SMSPEC")) - Opm::filesystem::remove("RST2.SMSPEC"); - - if (Opm::filesystem::exists("RST2.UNSMRY")) - Opm::filesystem::remove("RST2.UNSMRY"); }