Merge pull request #1061 from bska/remove-original-pvttable-linearisation
Table Linearisation: Remove Original PVT Functions
This commit is contained in:
@@ -24,11 +24,6 @@
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include <ert/ecl/FortIO.hpp>
|
||||
#include <ert/ecl/EclKW.hpp>
|
||||
|
||||
#include <opm/parser/eclipse/EclipseState/Tables/PvtoTable.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Tables/PvtgTable.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Tables/FlatTable.hpp>
|
||||
|
||||
namespace Opm {
|
||||
@@ -39,9 +34,6 @@ namespace Opm {
|
||||
public:
|
||||
explicit Tables( const UnitSystem& units);
|
||||
|
||||
void addPVTO(const std::vector<PvtoTable>& pvtoTables);
|
||||
void addPVTG(const std::vector<PvtgTable>& pvtgTables);
|
||||
void addPVTW(const PvtwTable& pvtwTable);
|
||||
void addDensity(const DensityTable& density);
|
||||
|
||||
/// Add normalised PVT function tables to INIT file's TAB vector.
|
||||
@@ -137,20 +129,6 @@ namespace Opm {
|
||||
/// TableManager sub-object.
|
||||
void addWaterPVTTables(const EclipseState& es);
|
||||
};
|
||||
|
||||
/// Emit normalised tabular information (TABDIMS and TAB vectors) to
|
||||
/// ECL-like result set file (typically INIT file).
|
||||
///
|
||||
/// \param[in] tables Collection of normalised tables. Its \code
|
||||
/// tabdims() \endcode and \code tab() \endcode vectors will be
|
||||
/// emitted to \p fortio as ECL keywords "TABDIMS" and "TAB",
|
||||
/// respectively.
|
||||
///
|
||||
/// \param[in,out] fortio ECL-like result set file. Typically
|
||||
/// corresponds to a preopened stream attached to the INIT file.
|
||||
void fwrite(const Tables& tables,
|
||||
ERT::FortIO& fortio);
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
#endif // OUTPUT_TABLES_HPP
|
||||
|
||||
@@ -21,8 +21,6 @@
|
||||
|
||||
#include <opm/output/eclipse/Tables.hpp>
|
||||
|
||||
#include <ert/ecl/FortIO.hpp>
|
||||
#include <ert/ecl/EclKW.hpp>
|
||||
#include <ert/ecl/ecl_kw_magic.h>
|
||||
|
||||
#include <opm/parser/eclipse/EclipseState/EclipseState.hpp>
|
||||
@@ -1980,162 +1978,6 @@ namespace Opm {
|
||||
this->m_tabdims[ TABDIMS_TAB_SIZE_ITEM ] = this->data.size();
|
||||
}
|
||||
|
||||
|
||||
namespace {
|
||||
struct PvtxDims {
|
||||
size_t num_tables;
|
||||
size_t outer_size;
|
||||
size_t inner_size;
|
||||
size_t num_columns = 3;
|
||||
size_t data_size;
|
||||
};
|
||||
|
||||
template <class TableType>
|
||||
PvtxDims tableDims( const std::vector<TableType>& pvtxTables) {
|
||||
PvtxDims dims;
|
||||
|
||||
dims.num_tables = pvtxTables.size();
|
||||
dims.inner_size = 0;
|
||||
dims.outer_size = 0;
|
||||
for (const auto& table : pvtxTables) {
|
||||
dims.outer_size = std::max( dims.outer_size, table.size());
|
||||
for (const auto& underSatTable : table)
|
||||
dims.inner_size = std::max(dims.inner_size, underSatTable.numRows() );
|
||||
}
|
||||
dims.data_size = dims.num_tables * dims.outer_size * dims.inner_size * dims.num_columns;
|
||||
|
||||
return dims;
|
||||
}
|
||||
}
|
||||
|
||||
void Tables::addPVTO( const std::vector<PvtoTable>& pvtoTables)
|
||||
{
|
||||
const double default_value = 2e20;
|
||||
PvtxDims dims = tableDims( pvtoTables );
|
||||
this->m_tabdims[ TABDIMS_NTPVTO_ITEM ] = dims.num_tables;
|
||||
this->m_tabdims[ TABDIMS_NRPVTO_ITEM ] = dims.outer_size;
|
||||
this->m_tabdims[ TABDIMS_NPPVTO_ITEM ] = dims.inner_size;
|
||||
|
||||
{
|
||||
std::vector<double> pvtoData( dims.data_size , default_value );
|
||||
std::vector<double> rs_values( dims.num_tables * dims.outer_size , default_value );
|
||||
size_t composition_stride = dims.inner_size;
|
||||
size_t table_stride = dims.outer_size * composition_stride;
|
||||
size_t column_stride = table_stride * pvtoTables.size();
|
||||
|
||||
size_t table_index = 0;
|
||||
for (const auto& table : pvtoTables) {
|
||||
size_t composition_index = 0;
|
||||
for (const auto& underSatTable : table) {
|
||||
const auto& p = underSatTable.getColumn("P");
|
||||
const auto& bo = underSatTable.getColumn("BO");
|
||||
const auto& mu = underSatTable.getColumn("MU");
|
||||
|
||||
for (size_t row = 0; row < p.size(); row++) {
|
||||
size_t data_index = row + composition_stride * composition_index + table_stride * table_index;
|
||||
|
||||
pvtoData[ data_index ] = this->units.from_si( UnitSystem::measure::pressure, p[row]);
|
||||
pvtoData[ data_index + column_stride ] = 1.0 / bo[row];
|
||||
pvtoData[ data_index + 2*column_stride] = this->units.from_si( UnitSystem::measure::viscosity , mu[row]) / bo[row];
|
||||
}
|
||||
composition_index++;
|
||||
}
|
||||
|
||||
/*
|
||||
The RS values which apply for one inner table each
|
||||
are added as a separate data vector to the TABS
|
||||
array.
|
||||
*/
|
||||
{
|
||||
const auto& sat_table = table.getSaturatedTable();
|
||||
const auto& rs = sat_table.getColumn("RS");
|
||||
for (size_t index = 0; index < rs.size(); index++)
|
||||
rs_values[index + table_index * dims.outer_size ] = rs[index];
|
||||
}
|
||||
table_index++;
|
||||
}
|
||||
|
||||
this->addData( TABDIMS_IBPVTO_OFFSET_ITEM , pvtoData );
|
||||
this->addData( TABDIMS_JBPVTO_OFFSET_ITEM , rs_values );
|
||||
}
|
||||
}
|
||||
|
||||
void Tables::addPVTG( const std::vector<PvtgTable>& pvtgTables) {
|
||||
const double default_value = -2e20;
|
||||
PvtxDims dims = tableDims( pvtgTables );
|
||||
this->m_tabdims[ TABDIMS_NTPVTG_ITEM ] = dims.num_tables;
|
||||
this->m_tabdims[ TABDIMS_NRPVTG_ITEM ] = dims.outer_size;
|
||||
this->m_tabdims[ TABDIMS_NPPVTG_ITEM ] = dims.inner_size;
|
||||
|
||||
{
|
||||
std::vector<double> pvtgData( dims.data_size , default_value );
|
||||
std::vector<double> p_values( dims.num_tables * dims.outer_size , default_value );
|
||||
size_t composition_stride = dims.inner_size;
|
||||
size_t table_stride = dims.outer_size * composition_stride;
|
||||
size_t column_stride = table_stride * dims.num_tables;
|
||||
|
||||
size_t table_index = 0;
|
||||
for (const auto& table : pvtgTables) {
|
||||
size_t composition_index = 0;
|
||||
for (const auto& underSatTable : table) {
|
||||
const auto& col0 = underSatTable.getColumn(0);
|
||||
const auto& col1 = underSatTable.getColumn(1);
|
||||
const auto& col2 = underSatTable.getColumn(2);
|
||||
|
||||
for (size_t row = 0; row < col0.size(); row++) {
|
||||
size_t data_index = row + composition_stride * composition_index + table_stride * table_index;
|
||||
|
||||
pvtgData[ data_index ] = this->units.from_si( UnitSystem::measure::gas_oil_ratio, col0[row]);
|
||||
pvtgData[ data_index + column_stride ] = this->units.from_si( UnitSystem::measure::gas_oil_ratio, col1[row]);
|
||||
pvtgData[ data_index + 2*column_stride] = this->units.from_si( UnitSystem::measure::viscosity , col2[row]);
|
||||
}
|
||||
|
||||
composition_index++;
|
||||
}
|
||||
|
||||
{
|
||||
const auto& sat_table = table.getSaturatedTable();
|
||||
const auto& p = sat_table.getColumn("PG");
|
||||
for (size_t index = 0; index < p.size(); index++)
|
||||
p_values[index + table_index * dims.outer_size ] =
|
||||
this->units.from_si( UnitSystem::measure::pressure , p[index]);
|
||||
}
|
||||
|
||||
table_index++;
|
||||
}
|
||||
|
||||
this->addData( TABDIMS_IBPVTG_OFFSET_ITEM , pvtgData );
|
||||
this->addData( TABDIMS_JBPVTG_OFFSET_ITEM , p_values );
|
||||
}
|
||||
}
|
||||
|
||||
void Tables::addPVTW( const PvtwTable& pvtwTable)
|
||||
{
|
||||
if (pvtwTable.size() > 0) {
|
||||
const double default_value = -2e20;
|
||||
const size_t num_columns = pvtwTable[0].size;
|
||||
std::vector<double> pvtwData( pvtwTable.size() * num_columns , default_value);
|
||||
|
||||
this->m_tabdims[ TABDIMS_NTPVTW_ITEM ] = pvtwTable.size();
|
||||
for (size_t table_num = 0; table_num < pvtwTable.size(); table_num++) {
|
||||
const auto& record = pvtwTable[table_num];
|
||||
pvtwData[ table_num * num_columns ] = this->units.from_si( UnitSystem::measure::pressure , record.reference_pressure);
|
||||
pvtwData[ table_num * num_columns + 1] = 1.0 / record.volume_factor;
|
||||
pvtwData[ table_num * num_columns + 2] = this->units.to_si( UnitSystem::measure::pressure, record.compressibility);
|
||||
pvtwData[ table_num * num_columns + 3] = record.volume_factor / this->units.from_si( UnitSystem::measure::viscosity , record.viscosity);
|
||||
|
||||
|
||||
// The last column should contain information about
|
||||
// the viscosibility, however there is clearly a
|
||||
// not-yet-identified transformation involved, we
|
||||
// therefor leave this item defaulted.
|
||||
|
||||
// pvtwData[ table_num * num_columns + 4] = record.viscosibility;
|
||||
}
|
||||
this->addData( TABDIMS_IBPVTW_OFFSET_ITEM , pvtwData );
|
||||
}
|
||||
}
|
||||
|
||||
void Tables::addDensity( const DensityTable& density)
|
||||
{
|
||||
if (density.size() > 0) {
|
||||
@@ -2464,18 +2306,4 @@ namespace Opm {
|
||||
this->addData(TABDIMS_IBPVTW_OFFSET_ITEM, tableData);
|
||||
this->m_tabdims[TABDIMS_NTPVTW_ITEM] = pvtw.size();
|
||||
}
|
||||
|
||||
void fwrite(const Tables& tables,
|
||||
ERT::FortIO& fortio)
|
||||
{
|
||||
{
|
||||
ERT::EclKW<int> tabdims("TABDIMS", tables.tabdims());
|
||||
tabdims.fwrite(fortio);
|
||||
}
|
||||
|
||||
{
|
||||
ERT::EclKW<double> tab("TAB", tables.tab());
|
||||
tab.fwrite(fortio);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,48 +25,22 @@
|
||||
|
||||
#include <opm/output/eclipse/Tables.hpp>
|
||||
|
||||
#include <boost/date_time/posix_time/posix_time.hpp>
|
||||
|
||||
#include <cstddef>
|
||||
#include <exception>
|
||||
#include <fstream>
|
||||
#include <initializer_list>
|
||||
#include <stdexcept>
|
||||
#include <vector>
|
||||
|
||||
#include <ert/ecl/ecl_kw_magic.h>
|
||||
#include <ert/ecl/ecl_sum.h>
|
||||
#include <ert/ecl/ecl_file.h>
|
||||
#include <ert/util/util.h>
|
||||
#include <ert/util/test_work_area.h>
|
||||
|
||||
#include <opm/parser/eclipse/Deck/Deck.hpp>
|
||||
#include <opm/parser/eclipse/Units/UnitSystem.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Grid/EclipseGrid.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/EclipseState.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Grid/EclipseGrid.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/SummaryConfig/SummaryConfig.hpp>
|
||||
#include <opm/parser/eclipse/Parser/Parser.hpp>
|
||||
|
||||
using namespace Opm;
|
||||
#include <opm/parser/eclipse/Units/UnitSystem.hpp>
|
||||
|
||||
|
||||
struct setup {
|
||||
Deck deck;
|
||||
EclipseState es;
|
||||
test_work_area_type * ta;
|
||||
|
||||
setup( const std::string& path) :
|
||||
deck( Parser().parseFile( path) ),
|
||||
es( deck ),
|
||||
ta( test_work_area_alloc( "test_tables"))
|
||||
{
|
||||
}
|
||||
|
||||
~setup() {
|
||||
test_work_area_free(this->ta);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
namespace {
|
||||
template <class Collection1, class Collection2>
|
||||
@@ -1182,104 +1156,6 @@ END
|
||||
} // SPE9
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE (FileWrite_PVT)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(Test_PVTX) {
|
||||
setup cfg( "table_deck.DATA");
|
||||
Tables tables( cfg.es.getUnits() );
|
||||
|
||||
tables.addPVTO( cfg.es.getTableManager().getPvtoTables() );
|
||||
tables.addPVTG( cfg.es.getTableManager().getPvtgTables() );
|
||||
tables.addPVTW( cfg.es.getTableManager().getPvtwTable() );
|
||||
tables.addDensity( cfg.es.getTableManager().getDensityTable( ) );
|
||||
{
|
||||
ERT::FortIO f("TEST.INIT" , std::fstream::out);
|
||||
fwrite(tables, f);
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
ecl_file_type * f = ecl_file_open("TEST.INIT" , 0 );
|
||||
const ecl_kw_type * tabdims = ecl_file_iget_named_kw( f , "TABDIMS" , 0 );
|
||||
const ecl_kw_type * tab = ecl_file_iget_named_kw( f , "TAB" , 0 );
|
||||
|
||||
BOOST_CHECK_EQUAL( ecl_kw_get_size( tab ) , ecl_kw_iget_int( tabdims , TABDIMS_TAB_SIZE_ITEM ));
|
||||
/* PVTO */
|
||||
{
|
||||
int offset = ecl_kw_iget_int( tabdims , TABDIMS_IBPVTO_OFFSET_ITEM ) - 1;
|
||||
int rs_offset = ecl_kw_iget_int( tabdims , TABDIMS_JBPVTO_OFFSET_ITEM ) - 1;
|
||||
int column_stride = ecl_kw_iget_int( tabdims , TABDIMS_NRPVTO_ITEM ) * ecl_kw_iget_int( tabdims , TABDIMS_NPPVTO_ITEM ) * ecl_kw_iget_int( tabdims , TABDIMS_NTPVTO_ITEM );
|
||||
|
||||
BOOST_CHECK_EQUAL( 2, ecl_kw_iget_int( tabdims , TABDIMS_NRPVTO_ITEM ) );
|
||||
BOOST_CHECK_EQUAL( 5, ecl_kw_iget_int( tabdims , TABDIMS_NPPVTO_ITEM ) );
|
||||
BOOST_CHECK_EQUAL( 1, ecl_kw_iget_int( tabdims , TABDIMS_NTPVTO_ITEM ) );
|
||||
|
||||
BOOST_CHECK_CLOSE(50.0 , ecl_kw_iget_double( tab , offset ), 1e-6 );
|
||||
BOOST_CHECK_CLOSE(1.0 / 1.10615 , ecl_kw_iget_double( tab , offset + column_stride), 1e-6 );
|
||||
BOOST_CHECK_CLOSE(1.18 / 1.10615 , ecl_kw_iget_double( tab , offset + 2*column_stride ), 1e-6 );
|
||||
|
||||
BOOST_CHECK_CLOSE(150.0 , ecl_kw_iget_double( tab , 4 + offset ), 1e-6 );
|
||||
BOOST_CHECK_CLOSE(1.0 / 1.08984 , ecl_kw_iget_double( tab , 4 + offset + column_stride), 1e-6 );
|
||||
BOOST_CHECK_CLOSE(1.453 / 1.08984 , ecl_kw_iget_double( tab , 4 + offset + 2*column_stride ), 1e-6 );
|
||||
|
||||
BOOST_CHECK_CLOSE(20.59 , ecl_kw_iget_double( tab , rs_offset ), 1e-6 );
|
||||
BOOST_CHECK_CLOSE(28.19 , ecl_kw_iget_double( tab , rs_offset + 1), 1e-6 );
|
||||
}
|
||||
|
||||
|
||||
/* PVTG */
|
||||
{
|
||||
int offset = ecl_kw_iget_int( tabdims , TABDIMS_IBPVTG_OFFSET_ITEM ) - 1;
|
||||
int pg_offset = ecl_kw_iget_int( tabdims , TABDIMS_JBPVTG_OFFSET_ITEM ) - 1;
|
||||
int column_stride = ecl_kw_iget_int( tabdims , TABDIMS_NRPVTG_ITEM ) * ecl_kw_iget_int( tabdims , TABDIMS_NPPVTG_ITEM ) * ecl_kw_iget_int( tabdims , TABDIMS_NTPVTG_ITEM );
|
||||
|
||||
BOOST_CHECK_EQUAL( 2, ecl_kw_iget_int( tabdims , TABDIMS_NRPVTG_ITEM ) );
|
||||
BOOST_CHECK_EQUAL( 3, ecl_kw_iget_int( tabdims , TABDIMS_NPPVTG_ITEM ) );
|
||||
BOOST_CHECK_EQUAL( 1, ecl_kw_iget_int( tabdims , TABDIMS_NTPVTG_ITEM ) );
|
||||
|
||||
BOOST_CHECK_CLOSE(0.00002448 , ecl_kw_iget_double( tab , offset ), 1e-6 );
|
||||
BOOST_CHECK_CLOSE(0.061895 , ecl_kw_iget_double( tab , offset + column_stride), 1e-6 );
|
||||
BOOST_CHECK_CLOSE(0.01299 , ecl_kw_iget_double( tab , offset + 2*column_stride ), 1e-6 );
|
||||
|
||||
BOOST_CHECK_CLOSE(20.0 , ecl_kw_iget_double( tab , pg_offset ), 1e-6 );
|
||||
BOOST_CHECK_CLOSE(40.0 , ecl_kw_iget_double( tab , pg_offset + 1), 1e-6 );
|
||||
}
|
||||
|
||||
|
||||
/* PVTW */
|
||||
{
|
||||
int offset = ecl_kw_iget_int( tabdims , TABDIMS_IBPVTW_OFFSET_ITEM ) - 1;
|
||||
int column_stride = ecl_kw_iget_int( tabdims , TABDIMS_NTPVTW_ITEM );
|
||||
BOOST_CHECK( ecl_kw_get_size( tab ) >= (offset + column_stride * 5 ));
|
||||
|
||||
BOOST_CHECK_CLOSE( 247.7 , ecl_kw_iget_double( tab , offset ) , 1e-6 );
|
||||
BOOST_CHECK_CLOSE( 1.0 / 1.03665 , ecl_kw_iget_double( tab , offset + column_stride), 1e-6);
|
||||
BOOST_CHECK_CLOSE( 0.41726E-04 , ecl_kw_iget_double( tab , offset + 2 * column_stride), 1e-6);
|
||||
BOOST_CHECK_CLOSE( 1.03665 / 0.29120 , ecl_kw_iget_double( tab , offset + 3 * column_stride), 1e-6);
|
||||
|
||||
// For the last column - WATER_VISCOSIBILITY - there is
|
||||
// clearly a transform involved; not really clear which
|
||||
// transform this is. This column is therefor not tested.
|
||||
|
||||
// BOOST_CHECK_CLOSE( f(0.99835E-04) , ecl_kw_iget_double( tab , offset + 4 * column_stride), 1e-6);
|
||||
}
|
||||
|
||||
// Density
|
||||
{
|
||||
int offset = ecl_kw_iget_int( tabdims , TABDIMS_IBDENS_OFFSET_ITEM ) - 1;
|
||||
int column_stride = ecl_kw_iget_int( tabdims , TABDIMS_NTDENS_ITEM );
|
||||
BOOST_CHECK( ecl_kw_get_size( tab ) >= (offset + column_stride * 3 ));
|
||||
BOOST_CHECK_CLOSE( 859.5 , ecl_kw_iget_double( tab , offset ) , 1e-6 );
|
||||
BOOST_CHECK_CLOSE( 1033 , ecl_kw_iget_double( tab , offset + 1 ) , 1e-6 );
|
||||
BOOST_CHECK_CLOSE( 0.854 , ecl_kw_iget_double( tab , offset + 2) , 1e-6 );
|
||||
}
|
||||
|
||||
ecl_file_close( f );
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END ()
|
||||
|
||||
// #####################################################################
|
||||
|
||||
BOOST_AUTO_TEST_SUITE (Two_Phase)
|
||||
|
||||
Reference in New Issue
Block a user