OPM-157: Write RFT data using the EclipseWriteRFTHandler class
This commit is contained in:
parent
4c932207a9
commit
0abf53a0ae
@ -29,6 +29,7 @@
|
||||
#include <opm/core/simulator/SimulatorState.hpp>
|
||||
#include <opm/core/simulator/SimulatorTimerInterface.hpp>
|
||||
#include <opm/core/simulator/WellState.hpp>
|
||||
#include <opm/core/io/eclipse/EclipseWriteRFTHandler.hpp>
|
||||
#include <opm/core/utility/ErrorMacros.hpp>
|
||||
#include <opm/core/utility/parameters/Parameter.hpp>
|
||||
#include <opm/core/utility/parameters/ParameterGroup.hpp>
|
||||
@ -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<double> tmp = reservoirState.pressure();
|
||||
EclipseWriterDetails::convertFromSiTo(tmp, deckToSiPressure_);
|
||||
EclipseWriterDetails::restrictAndReorderToActiveCells(tmp, gridToEclipseIdx_.size(), gridToEclipseIdx_.data());
|
||||
std::vector<double> pressure = reservoirState.pressure();
|
||||
EclipseWriterDetails::convertFromSiTo(pressure, deckToSiPressure_);
|
||||
EclipseWriterDetails::restrictAndReorderToActiveCells(pressure, gridToEclipseIdx_.size(), gridToEclipseIdx_.data());
|
||||
|
||||
sol.add(EclipseWriterDetails::Keyword<float>("PRESSURE", tmp));
|
||||
sol.add(EclipseWriterDetails::Keyword<float>("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<float>(EclipseWriterDetails::saturationKeywordNames[phase], tmp));
|
||||
}
|
||||
std::vector<double> saturation_water;
|
||||
std::vector<double> 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<float>(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<float>(EclipseWriterDetails::saturationKeywordNames[BlackoilPhases::PhaseIndex::Vapour], saturation_gas));
|
||||
}
|
||||
|
||||
|
||||
|
||||
//Write RFT data for current timestep to RFT file
|
||||
std::shared_ptr<EclipseWriterDetails::EclipseWriteRFTHandler> eclipseWriteRFTHandler = std::make_shared<EclipseWriterDetails::EclipseWriteRFTHandler>(
|
||||
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<const UnitSystem> unitsystem = eclipseState_->getDeckUnitSystem();
|
||||
ert_ecl_unit_enum ecl_unit = convertUnitTypeErtEclUnitEnum(unitsystem->getType());
|
||||
|
||||
std::vector<WellConstPtr> 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
|
||||
|
@ -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_;
|
||||
|
Loading…
Reference in New Issue
Block a user