diff --git a/CMakeLists_files.cmake b/CMakeLists_files.cmake
index 755d331a..db726d70 100644
--- a/CMakeLists_files.cmake
+++ b/CMakeLists_files.cmake
@@ -158,6 +158,7 @@ list (APPEND MAIN_SOURCE_FILES
# find tests -name '*.cpp' -a ! -wholename '*/not-unit/*' -printf '\t%p\n' | sort
list (APPEND TEST_SOURCE_FILES
tests/test_writenumwells.cpp
+ tests/test_readWriteWellStateData.cpp
tests/test_EclipseWriter.cpp
tests/test_EclipseWriteRFTHandler.cpp
tests/test_compressedpropertyaccess.cpp
diff --git a/tests/test_readWriteWellStateData.cpp b/tests/test_readWriteWellStateData.cpp
new file mode 100644
index 00000000..fede0ea8
--- /dev/null
+++ b/tests/test_readWriteWellStateData.cpp
@@ -0,0 +1,273 @@
+
+/*
+ Copyright 2014 Statoil IT
+ This file is part of the Open Porous Media project (OPM).
+
+ OPM is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ OPM is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OPM. If not, see .
+*/
+#include "config.h"
+
+#if HAVE_DYNAMIC_BOOST_TEST
+#define BOOST_TEST_DYN_LINK
+#endif
+
+#define BOOST_TEST_MODULE EclipseWriter
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+// ERT stuff
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+
+//
+std::string input =
+ "RUNSPEC\n"
+ "OIL\n"
+ "GAS\n"
+ "WATER\n"
+ "DIMENS\n"
+ " 10 10 10 /\n"
+
+ "GRID\n"
+ "DXV\n"
+ "10*0.25 /\n"
+ "DYV\n"
+ "10*0.25 /\n"
+ "DZV\n"
+ "10*0.25 /\n"
+ "TOPS\n"
+ "100*0.25 /\n"
+ "\n"
+
+ "START -- 0 \n"
+ "1 NOV 1979 / \n"
+
+ "SCHEDULE\n"
+ "DATES -- 1\n"
+ " 10 OKT 2008 / \n"
+ "/\n"
+ "WELSPECS\n"
+ " 'OP_1' 'OP' 9 9 1* 'OIL' 1* 1* 1* 1* 1* 1* 1* / \n"
+ " 'OP_2' 'OP' 9 9 1* 'OIL' 1* 1* 1* 1* 1* 1* 1* / \n"
+ "/\n"
+ "COMPDAT\n"
+ " 'OP_1' 9 9 1 1 'OPEN' 1* 32.948 0.311 3047.839 1* 1* 'X' 22.100 / \n"
+ " 'OP_2' 9 9 2 2 'OPEN' 1* 46.825 0.311 4332.346 1* 1* 'X' 22.123 / \n"
+ " 'OP_1' 9 9 3 9 'OPEN' 1* 32.948 0.311 3047.839 1* 1* 'X' 22.100 / \n"
+ "/\n"
+ "WCONPROD\n"
+ "'OP_1' 'OPEN' 'ORAT' 20000 4* 1000 /\n"
+ "/\n"
+ "WCONINJE\n"
+ "'OP_2' 'GAS' 'OPEN' 'RATE' 100 200 400 /\n"
+ "/\n"
+
+ "DATES -- 2\n"
+ " 20 JAN 2011 / \n"
+ "/\n"
+ "WELSPECS\n"
+ " 'OP_3' 'OP' 9 9 1* 'OIL' 1* 1* 1* 1* 1* 1* 1* / \n"
+ "/\n"
+ "COMPDAT\n"
+ " 'OP_3' 9 9 1 1 'OPEN' 1* 32.948 0.311 3047.839 1* 1* 'X' 22.100 / \n"
+ "/\n"
+ "WCONPROD\n"
+ "'OP_3' 'OPEN' 'ORAT' 20000 4* 1000 /\n"
+ "/\n"
+
+ "DATES -- 3\n"
+ " 15 JUN 2013 / \n"
+ "/\n"
+ "COMPDAT\n"
+ " 'OP_2' 9 9 3 9 'OPEN' 1* 32.948 0.311 3047.839 1* 1* 'X' 22.100 / \n"
+ " 'OP_1' 9 9 7 7 'SHUT' 1* 32.948 0.311 3047.839 1* 1* 'X' 22.100 / \n"
+ "/\n"
+
+ "DATES -- 4\n"
+ " 22 APR 2014 / \n"
+ "/\n"
+ "WELSPECS\n"
+ " 'OP_4' 'OP' 9 9 1* 'OIL' 1* 1* 1* 1* 1* 1* 1* / \n"
+ "/\n"
+ "COMPDAT\n"
+ " 'OP_4' 9 9 3 9 'OPEN' 1* 32.948 0.311 3047.839 1* 1* 'X' 22.100 / \n"
+ " 'OP_3' 9 9 3 9 'OPEN' 1* 32.948 0.311 3047.839 1* 1* 'X' 22.100 / \n"
+ "/\n"
+ "WCONPROD\n"
+ "'OP_4' 'OPEN' 'ORAT' 20000 4* 1000 /\n"
+ "/\n"
+
+ "DATES -- 5\n"
+ " 30 AUG 2014 / \n"
+ "/\n"
+ "WELSPECS\n"
+ " 'OP_5' 'OP' 9 9 1* 'OIL' 1* 1* 1* 1* 1* 1* 1* / \n"
+ "/\n"
+ "COMPDAT\n"
+ " 'OP_5' 9 9 3 9 'OPEN' 1* 32.948 0.311 3047.839 1* 1* 'X' 22.100 / \n"
+ "/\n"
+ "WCONPROD\n"
+ "'OP_5' 'OPEN' 'ORAT' 20000 4* 1000 /\n"
+ "/\n"
+
+ "DATES -- 6\n"
+ " 15 SEP 2014 / \n"
+ "/\n"
+ "WCONPROD\n"
+ "'OP_3' 'SHUT' 'ORAT' 20000 4* 1000 /\n"
+ "/\n"
+
+ "DATES -- 7\n"
+ " 9 OCT 2014 / \n"
+ "/\n"
+ "WELSPECS\n"
+ " 'OP_6' 'OP' 9 9 1* 'OIL' 1* 1* 1* 1* 1* 1* 1* / \n"
+ "/\n"
+ "COMPDAT\n"
+ " 'OP_6' 9 9 3 9 'OPEN' 1* 32.948 0.311 3047.839 1* 1* 'X' 22.100 / \n"
+ "/\n"
+ "WCONPROD\n"
+ "'OP_6' 'OPEN' 'ORAT' 20000 4* 1000 /\n"
+ "/\n"
+ "TSTEP -- 8\n"
+ "10 /"
+ "/\n";
+
+std::shared_ptr createBlackOilState(Opm::EclipseGridConstPtr eclGrid) {
+
+ std::shared_ptr ourFineGridManagerPtr(new Opm::GridManager(eclGrid));
+ std::shared_ptr blackoilState(new Opm::BlackoilState);
+ blackoilState->init(*ourFineGridManagerPtr->c_grid(), 3);
+
+ return blackoilState;
+}
+
+Opm::EclipseWriterPtr createEclipseWriter(Opm::DeckConstPtr deck,
+ Opm::EclipseStatePtr eclipseState,
+ std::string& eclipse_data_filename) {
+
+ Opm::parameter::ParameterGroup params;
+ params.insertParameter("deck_filename", eclipse_data_filename);
+
+ const Opm::PhaseUsage phaseUsage = Opm::phaseUsageFromDeck(deck);
+
+ Opm::EclipseWriterPtr eclWriter(new Opm::EclipseWriter(params,
+ eclipseState,
+ phaseUsage,
+ eclipseState->getEclipseGrid()->getCartesianSize(),
+ 0));
+ return eclWriter;
+}
+
+void setValuesInWellState(std::shared_ptr wellState){
+ wellState->bhp()[0] = 1.23;
+ wellState->bhp()[1] = 2.34;
+
+ wellState->temperature()[0] = 3.45;
+ wellState->temperature()[1] = 4.56;
+
+ wellState->wellRates()[0] = 5.67;
+ wellState->wellRates()[1] = 6.78;
+ wellState->wellRates()[2] = 7.89;
+ wellState->wellRates()[3] = 8.90;
+ wellState->wellRates()[4] = 9.01;
+ wellState->wellRates()[5] = 10.12;
+
+ wellState->perfPress()[0] = 20.41;
+ wellState->perfPress()[1] = 21.19;
+ wellState->perfPress()[2] = 22.41;
+ wellState->perfPress()[3] = 23.19;
+ wellState->perfPress()[4] = 24.41;
+ wellState->perfPress()[5] = 25.19;
+ wellState->perfPress()[6] = 26.41;
+ wellState->perfPress()[7] = 27.19;
+ wellState->perfPress()[8] = 28.41;
+
+ wellState->perfRates()[0] = 30.45;
+ wellState->perfRates()[1] = 31.19;
+ wellState->perfRates()[2] = 32.45;
+ wellState->perfRates()[3] = 33.19;
+ wellState->perfRates()[4] = 34.45;
+ wellState->perfRates()[5] = 35.19;
+ wellState->perfRates()[6] = 36.45;
+ wellState->perfRates()[7] = 37.19;
+ wellState->perfRates()[8] = 38.45;
+}
+
+BOOST_AUTO_TEST_CASE(EclipseReadWriteWellStateData)
+{
+ std::string eclipse_data_filename = "TestWellState.DATA";
+ std::string eclipse_restart_filename = "TESTWELLSTATE.UNRST";
+ test_work_area_type * test_area = test_work_area_alloc("EclipseReadWriteWellStateData");
+
+ Opm::Parser parser;
+ Opm::DeckConstPtr deck = parser.parseString(input);
+ Opm::EclipseStatePtr eclipseState(new Opm::EclipseState(deck));
+ Opm::EclipseWriterPtr eclipseWriter = createEclipseWriter(deck, eclipseState, eclipse_data_filename);
+
+ std::shared_ptr simTimer( new Opm::SimulatorTimer() );
+ simTimer->init(eclipseState->getSchedule()->getTimeMap());
+ eclipseWriter->writeInit(*simTimer);
+ std::shared_ptr wellState(new Opm::WellState());
+
+ Opm::GridManager gridManager(deck);
+ Opm::WellsManager wellsManager(eclipseState, 1, *gridManager.c_grid(), NULL);
+ const Wells* wells = wellsManager.c_wells();
+ std::shared_ptr blackoilState = createBlackOilState(eclipseState->getEclipseGrid());
+ wellState->init(wells, *blackoilState);
+
+ setValuesInWellState(wellState);
+ simTimer->setCurrentStepNum(1);
+ eclipseWriter->writeTimeStep(*simTimer, *blackoilState, *wellState);
+
+ const char * test_area_path = test_work_area_get_cwd(test_area);
+ std::string slash = "/";
+ std::string restart_filename = test_area_path + slash + eclipse_restart_filename;
+ std::shared_ptr wellStateRestored(new Opm::WellState());
+ wellStateRestored->init(wells, *blackoilState);
+ Opm::restoreOPM_XWELKeyword(restart_filename, 1, *wellStateRestored);
+
+ BOOST_CHECK_EQUAL_COLLECTIONS(wellState->bhp().begin(), wellState->bhp().end(), wellStateRestored->bhp().begin(), wellStateRestored->bhp().end());
+ BOOST_CHECK_EQUAL_COLLECTIONS(wellState->temperature().begin(), wellState->temperature().end(), wellStateRestored->temperature().begin(), wellStateRestored->temperature().end());
+ BOOST_CHECK_EQUAL_COLLECTIONS(wellState->wellRates().begin(), wellState->wellRates().end(), wellStateRestored->wellRates().begin(), wellStateRestored->wellRates().end());
+ BOOST_CHECK_EQUAL_COLLECTIONS(wellState->perfRates().begin(), wellState->perfRates().end(), wellStateRestored->perfRates().begin(), wellStateRestored->perfRates().end());
+ BOOST_CHECK_EQUAL_COLLECTIONS(wellState->perfPress().begin(), wellState->perfPress().end(), wellStateRestored->perfPress().begin(), wellStateRestored->perfPress().end());
+
+ test_work_area_free(test_area);
+}