From 0abf53a0ae4d1436279adc6f91c3ca9764a9ef4e Mon Sep 17 00:00:00 2001 From: chflo Date: Thu, 5 Mar 2015 15:22:30 +0100 Subject: [PATCH] OPM-157: Write RFT data using the EclipseWriteRFTHandler class --- opm/core/io/eclipse/EclipseWriter.cpp | 100 +++++++++++++++++++++----- opm/core/io/eclipse/EclipseWriter.hpp | 1 + 2 files changed, 83 insertions(+), 18 deletions(-) diff --git a/opm/core/io/eclipse/EclipseWriter.cpp b/opm/core/io/eclipse/EclipseWriter.cpp index 6c4090af..95af6a4d 100644 --- a/opm/core/io/eclipse/EclipseWriter.cpp +++ b/opm/core/io/eclipse/EclipseWriter.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -997,6 +998,31 @@ int EclipseWriter::eclipseWellStatusMask(WellCommon::StatusEnum wellStatus) } + +/** + * Convert opm-core UnitType to eclipse format: ert_ecl_unit_enum + */ +ert_ecl_unit_enum EclipseWriter::convertUnitTypeErtEclUnitEnum(UnitSystem::UnitType unit) +{ + ert_ecl_unit_enum ecl_type; + switch (unit) { + case(UnitSystem::UNIT_TYPE_METRIC): + ecl_type = ERT_ECL_METRIC_UNITS; + break; + case(UnitSystem::UNIT_TYPE_FIELD) : + ecl_type = ERT_ECL_FIELD_UNITS; + break; + case(UnitSystem::UNIT_TYPE_LAB): + ecl_type = ERT_ECL_LAB_UNITS; + break; + default: + break; + }; + + return ecl_type; +} + + void EclipseWriter::writeInit(const SimulatorTimerInterface &timer) { // if we don't want to write anything, this method becomes a @@ -1115,29 +1141,67 @@ void EclipseWriter::writeTimeStep(const SimulatorTimerInterface& timer, // Also, we want to use the same units as the deck for pressure output, i.e. we have // to mutliate our nice SI pressures by the inverse of the conversion factor of deck // to SI pressure units... - std::vector tmp = reservoirState.pressure(); - EclipseWriterDetails::convertFromSiTo(tmp, deckToSiPressure_); - EclipseWriterDetails::restrictAndReorderToActiveCells(tmp, gridToEclipseIdx_.size(), gridToEclipseIdx_.data()); + std::vector pressure = reservoirState.pressure(); + EclipseWriterDetails::convertFromSiTo(pressure, deckToSiPressure_); + EclipseWriterDetails::restrictAndReorderToActiveCells(pressure, gridToEclipseIdx_.size(), gridToEclipseIdx_.data()); - sol.add(EclipseWriterDetails::Keyword("PRESSURE", tmp)); + sol.add(EclipseWriterDetails::Keyword("PRESSURE", pressure)); - for (int phase = 0; phase != BlackoilPhases::MaxNumPhases; ++phase) { - // Eclipse never writes the oil saturation, so all post-processors - // must calculate this from the other saturations anyway - if (phase == BlackoilPhases::PhaseIndex::Liquid) { - continue; - } - if (phaseUsage_.phase_used[phase]) { - tmp = reservoirState.saturation(); - EclipseWriterDetails::extractFromStripedData(tmp, - /*offset=*/phaseUsage_.phase_pos[phase], - /*stride=*/phaseUsage_.num_phases); - EclipseWriterDetails::restrictAndReorderToActiveCells(tmp, gridToEclipseIdx_.size(), gridToEclipseIdx_.data()); - sol.add(EclipseWriterDetails::Keyword(EclipseWriterDetails::saturationKeywordNames[phase], tmp)); - } + std::vector saturation_water; + std::vector saturation_gas; + + + if (phaseUsage_.phase_used[BlackoilPhases::Aqua]) { + saturation_water = reservoirState.saturation(); + EclipseWriterDetails::extractFromStripedData(saturation_water, + /*offset=*/phaseUsage_.phase_pos[BlackoilPhases::Aqua], + /*stride=*/phaseUsage_.num_phases); + EclipseWriterDetails::restrictAndReorderToActiveCells(saturation_water, gridToEclipseIdx_.size(), gridToEclipseIdx_.data()); + sol.add(EclipseWriterDetails::Keyword(EclipseWriterDetails::saturationKeywordNames[BlackoilPhases::PhaseIndex::Aqua], saturation_water)); } + if (phaseUsage_.phase_used[BlackoilPhases::Vapour]) { + saturation_gas = reservoirState.saturation(); + EclipseWriterDetails::extractFromStripedData(saturation_gas, + /*offset=*/phaseUsage_.phase_pos[BlackoilPhases::Vapour], + /*stride=*/phaseUsage_.num_phases); + EclipseWriterDetails::restrictAndReorderToActiveCells(saturation_gas, gridToEclipseIdx_.size(), gridToEclipseIdx_.data()); + sol.add(EclipseWriterDetails::Keyword(EclipseWriterDetails::saturationKeywordNames[BlackoilPhases::PhaseIndex::Vapour], saturation_gas)); + } + + + + //Write RFT data for current timestep to RFT file + std::shared_ptr eclipseWriteRFTHandler = std::make_shared( + compressedToCartesianCellIdx_, + numCells_, + eclipseState_->getEclipseGrid()->getCartesianSize()); + + + char * rft_filename = ecl_util_alloc_filename(outputDir_.c_str(), + baseName_.c_str(), + ECL_RFT_FILE, + false, + 0); + + std::shared_ptr unitsystem = eclipseState_->getDeckUnitSystem(); + ert_ecl_unit_enum ecl_unit = convertUnitTypeErtEclUnitEnum(unitsystem->getType()); + + std::vector wells = eclipseState_->getSchedule()->getWells(timer.currentStepNum()); + + + eclipseWriteRFTHandler->writeTimeStep(rft_filename, + ecl_unit, + timer, + wells, + eclipseState_->getEclipseGrid(), + pressure, + saturation_water, + saturation_gas); + + + /* Summary variables (well reporting) */ // TODO: instead of writing the header (smspec) every time, it should // only be written when there is a change in the well configuration diff --git a/opm/core/io/eclipse/EclipseWriter.hpp b/opm/core/io/eclipse/EclipseWriter.hpp index 5ff4e7f3..43c9c5b6 100644 --- a/opm/core/io/eclipse/EclipseWriter.hpp +++ b/opm/core/io/eclipse/EclipseWriter.hpp @@ -103,6 +103,7 @@ public: static int eclipseWellTypeMask(WellType wellType, WellInjector::TypeEnum injectorType); static int eclipseWellStatusMask(WellCommon::StatusEnum wellStatus); + static ert_ecl_unit_enum convertUnitTypeErtEclUnitEnum(UnitSystem::UnitType unit); private: Opm::EclipseStateConstPtr eclipseState_;