Change method names

This commit is contained in:
Joakim Hove
2018-05-14 15:53:39 +02:00
parent 3c18add696
commit 7163807296
4 changed files with 70 additions and 66 deletions

View File

@@ -60,20 +60,17 @@ namespace Opm {
class RestartValue {
public:
using extra_vector = std::vector<std::pair<RestartKey, std::vector<double>>>;
using ExtraVector = std::vector<std::pair<RestartKey, std::vector<double>>>;
data::Solution solution;
data::Wells wells;
extra_vector extra;
ExtraVector extra;
RestartValue(data::Solution sol, data::Wells wells_arg);
bool has_extra(const std::string& key) const;
void add_extra(const std::string& key, UnitSystem::measure dimension, std::vector<double> data);
void add_extra(const std::string& key, const std::vector<double>& data);
const std::vector<double>& get_extra(const std::string& key) const;
void convertFromSI(const UnitSystem& units);
void convertToSI(const UnitSystem& units);
bool hasExtra(const std::string& key) const;
void addExtra(const std::string& key, UnitSystem::measure dimension, std::vector<double> data);
void addExtra(const std::string& key, std::vector<double> data);
const std::vector<double>& getExtra(const std::string& key) const;
};
}

View File

@@ -257,13 +257,21 @@ RestartValue load( const std::string& filename,
const ecl_kw_type * ecl_kw = ecl_file_view_iget_named_kw( file_view , key.c_str() , 0 );
const double * data_ptr = ecl_kw_get_double_ptr( ecl_kw );
const double * end_ptr = data_ptr + ecl_kw_get_size( ecl_kw );
rst_value.add_extra(key, extra.dim, {data_ptr, end_ptr});
rst_value.addExtra(key, extra.dim, {data_ptr, end_ptr});
} else if (required)
throw std::runtime_error("No such key in file: " + key);
}
rst_value.convertToSI(units);
// Convert solution fields and extra data from user units to SI
rst_value.solution.convertToSI(units);
for (auto & extra_value : rst_value.extra) {
const auto& restart_key = extra_value.first;
auto & data = extra_value.second;
units.to_si(restart_key.dim, data);
}
return rst_value;
}
@@ -473,15 +481,15 @@ void writeHeader(ecl_rst_file_type * rst_file,
ERT::ert_unique_ptr< ecl_kw_type, ecl_kw_free > kw_ptr;
if (write_double) {
ecl_kw_type * ecl_kw = ecl_kw_alloc( kw.c_str() , data.size() , ECL_DOUBLE );
ecl_kw_set_memcpy_data( ecl_kw , data.data() );
kw_ptr.reset( ecl_kw );
ecl_kw_type * ecl_kw = ecl_kw_alloc( kw.c_str() , data.size() , ECL_DOUBLE );
ecl_kw_set_memcpy_data( ecl_kw , data.data() );
kw_ptr.reset( ecl_kw );
} else {
ecl_kw_type * ecl_kw = ecl_kw_alloc( kw.c_str() , data.size() , ECL_FLOAT );
float * float_data = ecl_kw_get_float_ptr( ecl_kw );
for (size_t i=0; i < data.size(); i++)
float_data[i] = data[i];
kw_ptr.reset( ecl_kw );
ecl_kw_type * ecl_kw = ecl_kw_alloc( kw.c_str() , data.size() , ECL_FLOAT );
float * float_data = ecl_kw_get_float_ptr( ecl_kw );
for (size_t i=0; i < data.size(); i++)
float_data[i] = data[i];
kw_ptr.reset( ecl_kw );
}
return kw_ptr;
@@ -504,7 +512,7 @@ void writeHeader(ecl_rst_file_type * rst_file,
}
void writeExtraData(ecl_rst_file_type* rst_file, const RestartValue::extra_vector& extra_data) {
void writeExtraData(ecl_rst_file_type* rst_file, const RestartValue::ExtraVector& extra_data) {
for (const auto& extra_value : extra_data) {
const std::string& key = extra_value.first.key;
const std::vector<double>& data = extra_value.second;
@@ -555,7 +563,7 @@ void checkSaveArguments(const EclipseState& es,
}
size_t num_regions = es.getTableManager().getEqldims().getNumEquilRegions();
const auto& thpres = restart_value.get_extra("THPRES");
const auto& thpres = restart_value.getExtra("THPRES");
if (thpres.size() != num_regions * num_regions)
throw std::runtime_error("THPRES vector has invalid size - should have num_region * num_regions.");
}
@@ -586,8 +594,15 @@ void save(const std::string& filename,
else
rst_file.reset( ecl_rst_file_open_write( filename.c_str() ) );
// Convert solution fields and extra values from SI to user units.
value.solution.convertFromSI(units);
for (auto & extra_value : value.extra) {
const auto& restart_key = extra_value.first;
auto & data = extra_value.second;
units.from_si(restart_key.dim, data);
}
value.convertFromSI( units );
writeHeader( rst_file.get(), sim_step, report_step, posix_time , sim_time, ert_phase_mask, units, schedule , grid );
writeWell( rst_file.get(), sim_step, es , grid, schedule, value.wells);
writeSolution( rst_file.get(), value.solution, write_double );

View File

@@ -38,24 +38,34 @@ namespace Opm {
{
}
const std::vector<double>& RestartValue::get_extra(const std::string& key) const {
const auto iter = std::find_if(this->extra.begin(), this->extra.end(), [&](std::pair<RestartKey, std::vector<double>> pair) {return (pair.first.key == key);});
const std::vector<double>& RestartValue::getExtra(const std::string& key) const {
const auto iter = std::find_if(this->extra.begin(),
this->extra.end(),
[&](const std::pair<RestartKey, std::vector<double>>& pair)
{
return (pair.first.key == key);
});
if (iter == this->extra.end())
throw std::invalid_argument("No such extra key " + key);
return iter->second;
}
bool RestartValue::has_extra(const std::string& key) const {
const auto iter = std::find_if(this->extra.begin(), this->extra.end(), [&](std::pair<RestartKey, std::vector<double>> pair) {return (pair.first.key == key);});
bool RestartValue::hasExtra(const std::string& key) const {
const auto iter = std::find_if(this->extra.begin(),
this->extra.end(),
[&](const std::pair<RestartKey, std::vector<double>>& pair)
{
return (pair.first.key == key);
});
return (iter != this->extra.end());
}
void RestartValue::add_extra(const std::string& key, UnitSystem::measure dimension, std::vector<double> data) {
void RestartValue::addExtra(const std::string& key, UnitSystem::measure dimension, std::vector<double> data) {
if (key.size() > 8)
throw std::runtime_error("The keys used for Eclipse output must be maximum 8 characters long.");
if (this->has_extra(key))
if (this->hasExtra(key))
throw std::runtime_error("The keys in the extra vector must be unique.");
if (this->solution.has(key))
@@ -64,32 +74,11 @@ namespace Opm {
if (reserved_keys.find(key) != reserved_keys.end())
throw std::runtime_error("Can not use reserved key:" + key);
this->extra.push_back( std::make_pair(RestartKey(key, dimension), data));
this->extra.push_back( std::make_pair(RestartKey(key, dimension), std::move(data)));
}
void RestartValue::add_extra(const std::string& key, const std::vector<double>& data) {
this->add_extra(key, UnitSystem::measure::identity, data);
}
void RestartValue::convertFromSI(const UnitSystem& units) {
this->solution.convertFromSI(units);
for (auto & extra_value : this->extra) {
const auto& restart_key = extra_value.first;
auto & data = extra_value.second;
units.from_si(restart_key.dim, data);
}
}
void RestartValue::convertToSI(const UnitSystem& units) {
this->solution.convertToSI(units);
for (auto & extra_value : this->extra) {
const auto& restart_key = extra_value.first;
auto & data = extra_value.second;
units.to_si(restart_key.dim, data);
}
void RestartValue::addExtra(const std::string& key, std::vector<double> data) {
this->addExtra(key, UnitSystem::measure::identity, std::move(data));
}

View File

@@ -504,17 +504,17 @@ BOOST_AUTO_TEST_CASE(ExtraData_KEYS) {
auto wells = mkWells();
RestartValue restart_value(cells, wells);
BOOST_CHECK_THROW( restart_value.add_extra("TOO-LONG-KEY", {0,1,2}), std::runtime_error);
BOOST_CHECK_THROW( restart_value.addExtra("TOO-LONG-KEY", {0,1,2}), std::runtime_error);
// Keys must be unique
restart_value.add_extra("KEY", {0,1,1});
BOOST_CHECK_THROW( restart_value.add_extra("KEY", {0,1,1}), std::runtime_error);
restart_value.addExtra("KEY", {0,1,1});
BOOST_CHECK_THROW( restart_value.addExtra("KEY", {0,1,1}), std::runtime_error);
/* The keys must be unique across solution and extra_data */
BOOST_CHECK_THROW( restart_value.add_extra("PRESSURE", {0,1}), std::runtime_error);
BOOST_CHECK_THROW( restart_value.addExtra("PRESSURE", {0,1}), std::runtime_error);
/* Must avoid using reserved keys like 'LOGIHEAD' */
BOOST_CHECK_THROW( restart_value.add_extra("LOGIHEAD", {0,1}), std::runtime_error);
BOOST_CHECK_THROW( restart_value.addExtra("LOGIHEAD", {0,1}), std::runtime_error);
}
BOOST_AUTO_TEST_CASE(ExtraData_content) {
@@ -528,7 +528,7 @@ BOOST_AUTO_TEST_CASE(ExtraData_content) {
{
RestartValue restart_value(cells, wells);
restart_value.add_extra("EXTRA", UnitSystem::measure::pressure, {10,1,2,3});
restart_value.addExtra("EXTRA", UnitSystem::measure::pressure, {10,1,2,3});
RestartIO::save("FILE.UNRST", 1 ,
100,
restart_value,
@@ -559,10 +559,10 @@ BOOST_AUTO_TEST_CASE(ExtraData_content) {
{{"EXTRA", UnitSystem::measure::pressure, true},
{"EXTRA2", UnitSystem::measure::identity, false}});
BOOST_CHECK(!rst_value.has_extra("EXTRA2"));
BOOST_CHECK( rst_value.has_extra("EXTRA"));
BOOST_CHECK_THROW(rst_value.get_extra("EXTRA2"), std::invalid_argument);
const auto& extraval = rst_value.get_extra("EXTRA");
BOOST_CHECK(!rst_value.hasExtra("EXTRA2"));
BOOST_CHECK( rst_value.hasExtra("EXTRA"));
BOOST_CHECK_THROW(rst_value.getExtra("EXTRA2"), std::invalid_argument);
const auto& extraval = rst_value.getExtra("EXTRA");
const std::vector<double> expected = {10,1,2,3};
BOOST_CHECK_EQUAL( rst_value.solution.has("NO") , false );
@@ -581,21 +581,24 @@ BOOST_AUTO_TEST_CASE(STORE_THPRES) {
auto num_cells = setup.grid.getNumActive( );
auto cells = mkSolution( num_cells );
auto wells = mkWells();
const auto& units = setup.es.getUnits();
{
RestartValue restart_value(cells, wells);
RestartValue restart_value2(cells, wells);
/* Missing THPRES data in extra container. */
/* Because it proved to difficult to update the legacy simulators
to pass THPRES values when writing restart files this BOOST_CHECK_THROW
had to be disabled. The RestartIO::save() function will just log a warning.
BOOST_CHECK_THROW( RestartIO::save("FILE.UNRST", 1 ,
100,
restart_value,
setup.es,
setup.grid,
setup.schedule), std::runtime_error);
*/
restart_value.add_extra("THPRES", UnitSystem::measure::pressure, {0,1});
restart_value.addExtra("THPRES", UnitSystem::measure::pressure, {0,1});
/* THPRES data has wrong size in extra container. */
BOOST_CHECK_THROW( RestartIO::save("FILE.UNRST", 1 ,
100,
@@ -606,7 +609,7 @@ BOOST_AUTO_TEST_CASE(STORE_THPRES) {
int num_regions = setup.es.getTableManager().getEqldims().getNumEquilRegions();
std::vector<double> thpres(num_regions * num_regions, 78);
restart_value2.add_extra("THPRES", UnitSystem::measure::pressure, thpres);
restart_value2.addExtra("THPRES", UnitSystem::measure::pressure, thpres);
}
}
}