writeInit() - can optionally take properties.

This commit is contained in:
Joakim Hove 2016-06-23 11:39:18 +02:00
parent 9b1d0d3cee
commit b232c568af
3 changed files with 43 additions and 22 deletions

View File

@ -56,7 +56,7 @@ public:
*
* If NNC is given to the constructor, writes TRANNNC keyword.
*/
void writeInit();
void writeInit(const std::vector<data::CellData>& simProps = {});
/*!
* \brief Write a reservoir state and summary information to disk.

View File

@ -480,7 +480,9 @@ EclipseWriter::Impl::Impl( std::shared_ptr< const EclipseState > eclipseState,
, ert_phase_mask( ertPhaseMask( eclipseState->getTableManager() ) )
{}
void EclipseWriter::writeInit() {
void EclipseWriter::writeInit(const std::vector<data::CellData>& simProps) {
if( !this->impl->output_enabled )
return;
@ -536,6 +538,15 @@ void EclipseWriter::writeInit() {
}
for (const auto& prop : simProps) {
auto data = prop.data;
convertFromSiTo( data,
units,
prop.dim );
restrictAndReorderToActiveCells(data, gridToEclipseIdx.size(), gridToEclipseIdx.data());
fortio.writeKeyword( prop.name , data );
}
if( this->impl->nnc.hasNNC() ) {
std::vector<double> tran;
for( NNCdata nd : this->impl->nnc.nncdata() )

View File

@ -26,6 +26,7 @@
#include <boost/test/unit_test.hpp>
#include <opm/output/eclipse/EclipseWriter.hpp>
#include <opm/output/Cells.hpp>
#include <opm/parser/eclipse/Parser/ParseContext.hpp>
#include <opm/parser/eclipse/Parser/Parser.hpp>
@ -36,12 +37,15 @@
#include <opm/parser/eclipse/EclipseState/Schedule/TimeMap.hpp>
#include <opm/parser/eclipse/EclipseState/IOConfig/IOConfig.hpp>
#include <opm/parser/eclipse/Units/ConversionFactors.hpp>
#include <opm/parser/eclipse/Units/UnitSystem.hpp>
#include <iostream>
// ERT stuff
#include <ert/ecl/ecl_kw.h>
#include <ert/ecl/ecl_endian_flip.h>
#include <ert/ecl/fortio.h>
#include <ert/util/test_work_area.h>
#include <ert/ecl/ecl_file.h>
#include <ert/util/ert_unique_ptr.hpp>
#include <ert/util/TestArea.hpp>
#include <memory>
@ -141,11 +145,12 @@ void checkEgridFile( const EclipseGrid& eclGrid ) {
fortio_fclose(egridFile);
}
void checkInitFile( const Deck& deck ) {
void checkInitFile( const Deck& deck, const std::vector<data::CellData>& simProps) {
// use ERT directly to inspect the INIT file produced by EclipseWriter
auto initFile = fortio_open_reader("FOO.INIT", /*isFormated=*/0, ECL_ENDIAN_FLIP);
ERT::ert_unique_ptr<ecl_file_type , ecl_file_close> initFile(ecl_file_open( "FOO.INIT" , 0 ));
while( auto* eclKeyword = ecl_kw_fread_alloc(initFile) ) {
for (int i=0; i < ecl_file_get_size( initFile.get() ); i++) {
ecl_kw_type * eclKeyword = ecl_file_iget_kw( initFile.get( ) , i );
std::string keywordName(ecl_kw_get_header(eclKeyword));
if (keywordName == "PORO") {
@ -165,11 +170,11 @@ void checkInitFile( const Deck& deck ) {
compareErtData(sourceData, resultData, 1e-4);
}
ecl_kw_free(eclKeyword);
}
fortio_fclose(initFile);
for (const auto& prop : simProps) {
BOOST_CHECK( ecl_file_has_kw( initFile.get() , prop.name.c_str()) );
}
}
void checkRestartFile( int timeStepIdx ) {
@ -216,9 +221,6 @@ void checkRestartFile( int timeStepIdx ) {
BOOST_AUTO_TEST_CASE(EclipseWriterIntegration)
{
test_work_area_type * test_area = test_work_area_alloc("TEST_EclipseWriterIntegration");
const char *deckString =
"RUNSPEC\n"
"UNIFOUT\n"
@ -262,27 +264,35 @@ BOOST_AUTO_TEST_CASE(EclipseWriterIntegration)
auto& eclGrid = *es->getInputGrid();
{
ERT::TestArea ta("test_ecl_writer");
EclipseWriter eclWriter( es, 3 * 3 * 3, nullptr, NNC());
auto start_time = util_make_datetime( 0, 0, 0, 10, 10, 2008 );
auto first_step = util_make_datetime( 0, 0, 0, 10, 11, 2008 );
eclWriter.writeInit();
std::vector<double> tranx(3*3*3);
std::vector<double> trany(3*3*3);
std::vector<double> tranz(3*3*3);
std::vector<data::CellData> simProps{{"TRANX" , UnitSystem::measure::transmissibility, tranx},
{"TRANY" , UnitSystem::measure::transmissibility, trany},
{"TRANZ" , UnitSystem::measure::transmissibility, tranz}};
ta.setStore( true );
std::cout << "Working in: " << ta.getCwd() << std::endl;
eclWriter.writeInit( );
eclWriter.writeInit( simProps );
data::Wells wells;
for( int i = 0; i < 5; ++i ) {
eclWriter.writeTimeStep( i,
first_step - start_time,
createBlackoilState( i, 3 * 3 * 3 ),
wells, false);
first_step - start_time,
createBlackoilState( i, 3 * 3 * 3 ),
wells, false);
checkRestartFile( i );
}
checkInitFile( *deck , simProps);
checkEgridFile( eclGrid );
}
checkEgridFile( eclGrid );
checkInitFile( *deck );
test_work_area_free(test_area);
}