OPM-188: Fixup after review

This commit is contained in:
Edvin Brudevoll
2015-06-16 11:55:59 +02:00
parent 4f2a364dca
commit 9ec438f0d1
5 changed files with 44 additions and 52 deletions

View File

@@ -18,45 +18,34 @@
*/
#include "EclipseReader.hpp"
#include <iostream>
#include <opm/core/simulator/WellState.hpp>
#include <algorithm>
#include <ert/ecl/ecl_file.h>
namespace Opm
{
void restoreOPM_XWELKeyword(const std::string restart_filename, int reportstep, WellState& wellstate)
void restoreOPM_XWELKeyword(const std::string& restart_filename, int reportstep, WellState& wellstate)
{
const char * keyword = "OPM_XWEL";
const char* filename = restart_filename.c_str();
ecl_file_type* file_type = ecl_file_open(filename, 0);
bool block_selected = ecl_file_select_rstblock_report_step(file_type , reportstep);
if (block_selected) {
ecl_kw_type* xwel = ecl_file_iget_named_kw(file_type , keyword, 0);
const double* xwel_data = ecl_kw_get_double_ptr(xwel);
size_t offset = 0;
if (file_type != NULL) {
bool block_selected = ecl_file_select_rstblock_report_step(file_type , reportstep);
for (size_t i = 0; i < wellstate.bhp().size(); ++i) {
wellstate.bhp()[i] = xwel_data[offset++];
if (block_selected) {
ecl_kw_type* xwel = ecl_file_iget_named_kw(file_type , keyword, 0);
const double* xwel_data = ecl_kw_get_double_ptr(xwel);
std::copy_n(xwel_data + wellstate.getRestartTemperatureOffset(), wellstate.temperature().size(), wellstate.temperature().begin());
std::copy_n(xwel_data + wellstate.getRestartBhpOffset(), wellstate.bhp().size(), wellstate.bhp().begin());
std::copy_n(xwel_data + wellstate.getRestartPerfPressOffset(), wellstate.perfPress().size(), wellstate.perfPress().begin());
std::copy_n(xwel_data + wellstate.getRestartPerfRatesOffset(), wellstate.perfRates().size(), wellstate.perfRates().begin());
std::copy_n(xwel_data + wellstate.getRestartWellRatesOffset(), wellstate.wellRates().size(), wellstate.wellRates().begin());
}
for (size_t i = 0; i < wellstate.perfPress().size(); ++i) {
wellstate.perfPress()[i] = xwel_data[offset++];
}
for (size_t i = 0; i < wellstate.perfRates().size(); ++i) {
wellstate.perfRates()[i] = xwel_data[offset++];
}
for (size_t i = 0; i < wellstate.temperature().size(); ++i) {
wellstate.temperature()[i] = xwel_data[offset++];
}
for (size_t i = 0; i < wellstate.wellRates().size(); ++i) {
wellstate.wellRates()[i] = xwel_data[offset++];
}
ecl_file_close(file_type);
}
}
} // namespace Opm

View File

@@ -17,7 +17,7 @@ namespace Opm
/// \param wellstate
/// An instance of a WellState object, with correct size for each of the 5 contained std::vector<double> objects.
///
void restoreOPM_XWELKeyword(const std::string restart_filename, int report_step, WellState& wellState);
void restoreOPM_XWELKeyword(const std::string& restart_filename, int report_step, WellState& wellState);
}
#endif // ECLIPSEREADER_HPP

View File

@@ -328,28 +328,12 @@ public:
iwel_data[ offset + IWEL_STATUS_ITEM ] = EclipseWriter::eclipseWellStatusMask(well->getStatus(currentStep));
}
void addRestartFileXwelData(std::vector<double>& xwel_data, const WellState& wellState) const {
size_t offset = 0;
for (size_t i = 0; i < wellState.bhp().size(); ++i) {
xwel_data[offset++] = wellState.bhp()[i];
}
for (size_t i = 0; i < wellState.perfPress().size(); ++i) {
xwel_data[offset++] = wellState.perfPress()[i];
}
for (size_t i = 0; i < wellState.perfRates().size(); ++i) {
xwel_data[offset++] = wellState.perfRates()[i];
}
for (size_t i = 0; i < wellState.temperature().size(); ++i) {
xwel_data[offset++] = wellState.temperature()[i];
}
for (size_t i = 0; i < wellState.wellRates().size(); ++i) {
xwel_data[offset++] = wellState.wellRates()[i];
}
void addRestartFileXwelData(const WellState& wellState, std::vector<double>& xwel_data) const {
std::copy_n(wellState.bhp().begin(), wellState.bhp().size(), xwel_data.begin() + wellState.getRestartBhpOffset());
std::copy_n(wellState.perfPress().begin(), wellState.perfPress().size(), xwel_data.begin() + wellState.getRestartPerfPressOffset());
std::copy_n(wellState.perfRates().begin(), wellState.perfRates().size(), xwel_data.begin() + wellState.getRestartPerfRatesOffset());
std::copy_n(wellState.temperature().begin(), wellState.temperature().size(), xwel_data.begin() + wellState.getRestartTemperatureOffset());
std::copy_n(wellState.wellRates().begin(), wellState.wellRates().size(), xwel_data.begin() + wellState.getRestartWellRatesOffset());
}
void addRestartFileIconData(std::vector<int>& icon_data, CompletionSetConstPtr completions , size_t wellICONOffset) const {
@@ -1286,11 +1270,10 @@ void EclipseWriter::writeTimeStep(const SimulatorTimerInterface& timer,
EclipseWriterDetails::Restart restartHandle(outputDir_, baseName_, timer.reportStepNum(), ioConfig);
int sz = wellState.bhp().size() + wellState.perfPress().size() + wellState.perfRates().size() + wellState.temperature().size() + wellState.wellRates().size();
const size_t sz = wellState.bhp().size() + wellState.perfPress().size() + wellState.perfRates().size() + wellState.temperature().size() + wellState.wellRates().size();
std::vector<double> xwell_data( sz , 0 );
EclipseWriterDetails::Restart restartHandle(outputDir_, baseName_, timer.reportStepNum());
restartHandle.addRestartFileXwelData(xwell_data, wellState);
restartHandle.addRestartFileXwelData(wellState, xwell_data);
for (size_t iwell = 0; iwell < wells_ptr.size(); ++iwell) {
WellConstPtr well = wells_ptr[iwell];

View File

@@ -127,6 +127,26 @@ namespace Opm
std::vector<double>& perfPress() { return perfpress_; }
const std::vector<double>& perfPress() const { return perfpress_; }
size_t getRestartBhpOffset() const {
return 0;
}
size_t getRestartPerfPressOffset() const {
return bhp_.size();
}
size_t getRestartPerfRatesOffset() const {
return getRestartPerfPressOffset() + perfpress_.size();
}
size_t getRestartTemperatureOffset() const {
return getRestartPerfRatesOffset() + perfrates_.size();
}
size_t getRestartWellRatesOffset() const {
return getRestartTemperatureOffset() + temperature_.size();
}
private:
std::vector<double> bhp_;
std::vector<double> temperature_;

View File

@@ -258,7 +258,7 @@ BOOST_AUTO_TEST_CASE(EclipseReadWriteWellStateData)
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;
const std::string restart_filename = test_area_path + slash + eclipse_restart_filename;
std::shared_ptr<Opm::WellState> wellStateRestored(new Opm::WellState());
wellStateRestored->init(wells, *blackoilState);
Opm::restoreOPM_XWELKeyword(restart_filename, 1, *wellStateRestored);