diff --git a/opm/autodiff/SimulatorFullyImplicitBlackoilOutput.hpp b/opm/autodiff/SimulatorFullyImplicitBlackoilOutput.hpp index d217cc008..301fa8a4d 100644 --- a/opm/autodiff/SimulatorFullyImplicitBlackoilOutput.hpp +++ b/opm/autodiff/SimulatorFullyImplicitBlackoilOutput.hpp @@ -438,32 +438,22 @@ namespace Opm return adbVToDoubleVector(adb.value()); } + /** - * Checks if the summaryConfig has a keyword with the standardized field, region, or block prefixes. + * Returns the data requested in the restartConfig */ - inline bool hasFRBKeyword(const SummaryConfig& summaryConfig, const std::string keyword) { - std::string field_kw = "F" + keyword; - std::string region_kw = "R" + keyword; - std::string block_kw = "B" + keyword; - return summaryConfig.hasKeyword(field_kw) - || summaryConfig.hasKeyword(region_kw) - || summaryConfig.hasKeyword(block_kw); - } - - template - std::vector getCellData( + void getRestartData( + std::vector& output, const Opm::PhaseUsage& phaseUsage, - const Model& model, + const Model& physicalModel, const RestartConfig& restartConfig, - const SummaryConfig& summaryConfig, const int reportStepNum, const bool log) { typedef Opm::AutoDiffBlock ADB; - //Our return vector of properties - std::vector simProps; + const typename Model::SimulatorData& sd = physicalModel.getSimulatorData(); //Get the value of each of the keys for the restart keywords std::map rstKeywords = restartConfig.getRestartKeywords(reportStepNum); @@ -471,8 +461,6 @@ namespace Opm keyValue.second = restartConfig.getKeyword(keyValue.first, reportStepNum); } - const typename Model::SimulatorData& sd = model.getSimulatorData(); - //Get shorthands for water, oil, gas const int aqua_active = phaseUsage.phase_used[Opm::PhaseUsage::Aqua]; const int liquid_active = phaseUsage.phase_used[Opm::PhaseUsage::Liquid]; @@ -488,7 +476,7 @@ namespace Opm */ if (aqua_active && rstKeywords["BW"] > 0) { rstKeywords["BW"] = 0; - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "1OVERBW", Opm::UnitSystem::measure::water_inverse_formation_volume_factor, std::move(adbToDoubleVector(sd.rq[aqua_idx].b)), @@ -496,7 +484,7 @@ namespace Opm } if (liquid_active && rstKeywords["BO"] > 0) { rstKeywords["BO"] = 0; - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "1OVERBO", Opm::UnitSystem::measure::oil_inverse_formation_volume_factor, std::move(adbToDoubleVector(sd.rq[liquid_idx].b)), @@ -504,7 +492,7 @@ namespace Opm } if (vapour_active && rstKeywords["BG"] > 0) { rstKeywords["BG"] = 0; - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "1OVERBG", Opm::UnitSystem::measure::gas_inverse_formation_volume_factor, std::move(adbToDoubleVector(sd.rq[vapour_idx].b)), @@ -517,21 +505,21 @@ namespace Opm if (rstKeywords["DEN"] > 0) { rstKeywords["DEN"] = 0; if (aqua_active) { - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "WAT_DEN", Opm::UnitSystem::measure::density, std::move(adbToDoubleVector(sd.rq[aqua_idx].rho)), true}); } if (liquid_active) { - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "OIL_DEN", Opm::UnitSystem::measure::density, std::move(adbToDoubleVector(sd.rq[liquid_idx].rho)), true}); } if (vapour_active) { - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "GAS_DEN", Opm::UnitSystem::measure::density, std::move(adbToDoubleVector(sd.rq[vapour_idx].rho)), @@ -545,21 +533,21 @@ namespace Opm if (rstKeywords["VISC"] > 0) { rstKeywords["VISC"] = 0; if (aqua_active) { - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "WAT_VISC", Opm::UnitSystem::measure::viscosity, std::move(adbToDoubleVector(sd.rq[aqua_idx].mu)), true}); } if (liquid_active) { - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "OIL_VISC", Opm::UnitSystem::measure::viscosity, std::move(adbToDoubleVector(sd.rq[liquid_idx].mu)), true}); } if (vapour_active) { - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "GAS_VISC", Opm::UnitSystem::measure::viscosity, std::move(adbToDoubleVector(sd.rq[vapour_idx].mu)), @@ -573,7 +561,7 @@ namespace Opm if (aqua_active && rstKeywords["KRW"] > 0) { if (sd.rq[aqua_idx].kr.size() > 0) { rstKeywords["KRW"] = 0; - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "WATKR", Opm::UnitSystem::measure::permeability, std::move(adbToDoubleVector(sd.rq[aqua_idx].kr)), @@ -590,7 +578,7 @@ namespace Opm if (liquid_active && rstKeywords["KRO"] > 0) { if (sd.rq[liquid_idx].kr.size() > 0) { rstKeywords["KRO"] = 0; - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "OILKR", Opm::UnitSystem::measure::permeability, std::move(adbToDoubleVector(sd.rq[liquid_idx].kr)), @@ -607,7 +595,7 @@ namespace Opm if (vapour_active && rstKeywords["KRG"] > 0) { if (sd.rq[vapour_idx].kr.size() > 0) { rstKeywords["KRG"] = 0; - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "GASKR", Opm::UnitSystem::measure::permeability, std::move(adbToDoubleVector(sd.rq[vapour_idx].kr)), @@ -627,7 +615,7 @@ namespace Opm */ if (vapour_active && liquid_active && rstKeywords["RSSAT"] > 0) { rstKeywords["RSSAT"] = 0; - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "RSSAT", Opm::UnitSystem::measure::gas_oil_ratio, std::move(adbToDoubleVector(sd.rsSat)), @@ -635,7 +623,7 @@ namespace Opm } if (vapour_active && liquid_active && rstKeywords["RVSAT"] > 0) { rstKeywords["RVSAT"] = 0; - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "RVSAT", Opm::UnitSystem::measure::oil_gas_ratio, std::move(adbToDoubleVector(sd.rvSat)), @@ -665,14 +653,49 @@ namespace Opm } } } + } + + + /** + * Checks if the summaryConfig has a keyword with the standardized field, region, or block prefixes. + */ + inline bool hasFRBKeyword(const SummaryConfig& summaryConfig, const std::string keyword) { + std::string field_kw = "F" + keyword; + std::string region_kw = "R" + keyword; + std::string block_kw = "B" + keyword; + return summaryConfig.hasKeyword(field_kw) + || summaryConfig.hasKeyword(region_kw) + || summaryConfig.hasKeyword(block_kw); + } + + + /** + * Returns the data as asked for in the summaryConfig + */ + template + void getSummaryData( + std::vector& output, + const Opm::PhaseUsage& phaseUsage, + const Model& physicalModel, + const SummaryConfig& summaryConfig) { + + typedef Opm::AutoDiffBlock ADB; + + const typename Model::SimulatorData& sd = physicalModel.getSimulatorData(); + + //Get shorthands for water, oil, gas + const int aqua_active = phaseUsage.phase_used[Opm::PhaseUsage::Aqua]; + const int liquid_active = phaseUsage.phase_used[Opm::PhaseUsage::Liquid]; + const int vapour_active = phaseUsage.phase_used[Opm::PhaseUsage::Vapour]; + /** * Now process all of the summary config files */ // Water in place if (aqua_active && hasFRBKeyword(summaryConfig, "WIP")) { - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "WIP", Opm::UnitSystem::measure::volume, std::move(adbVToDoubleVector(sd.fip[Model::SimulatorData::FIP_AQUA])), @@ -681,7 +704,7 @@ namespace Opm if (liquid_active) { //Oil in place (liquid phase only) if (hasFRBKeyword(summaryConfig, "OIPL")) { - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "OIPL", Opm::UnitSystem::measure::volume, std::move(adbVToDoubleVector(sd.fip[Model::SimulatorData::FIP_LIQUID])), @@ -689,7 +712,7 @@ namespace Opm } //Oil in place (gas phase only) if (hasFRBKeyword(summaryConfig, "OIPG")) { - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "OIPG", Opm::UnitSystem::measure::volume, std::move(adbVToDoubleVector(sd.fip[Model::SimulatorData::FIP_VAPORIZED_OIL])), @@ -699,7 +722,7 @@ namespace Opm if (hasFRBKeyword(summaryConfig, "OIP")) { ADB::V oip = sd.fip[Model::SimulatorData::FIP_LIQUID] + sd.fip[Model::SimulatorData::FIP_VAPORIZED_OIL]; - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "OIP", Opm::UnitSystem::measure::volume, std::move(adbVToDoubleVector(oip)), @@ -709,7 +732,7 @@ namespace Opm if (vapour_active) { // Gas in place (gas phase only) if (hasFRBKeyword(summaryConfig, "GIPG")) { - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "GIPG", Opm::UnitSystem::measure::volume, std::move(adbVToDoubleVector(sd.fip[Model::SimulatorData::FIP_VAPOUR])), @@ -717,7 +740,7 @@ namespace Opm } // Gas in place (liquid phase only) if (hasFRBKeyword(summaryConfig, "GIPL")) { - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "GIPL", Opm::UnitSystem::measure::volume, std::move(adbVToDoubleVector(sd.fip[Model::SimulatorData::FIP_DISSOLVED_GAS])), @@ -727,7 +750,7 @@ namespace Opm if (hasFRBKeyword(summaryConfig, "GIP")) { ADB::V gip = sd.fip[Model::SimulatorData::FIP_VAPOUR] + sd.fip[Model::SimulatorData::FIP_DISSOLVED_GAS]; - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "GIP", Opm::UnitSystem::measure::volume, std::move(adbVToDoubleVector(gip)), @@ -736,7 +759,7 @@ namespace Opm } // Cell pore volume in reservoir conditions if (hasFRBKeyword(summaryConfig, "RPV")) { - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "RPV", Opm::UnitSystem::measure::volume, std::move(adbVToDoubleVector(sd.fip[Model::SimulatorData::FIP_PV])), @@ -744,15 +767,12 @@ namespace Opm } // Pressure averaged value (hydrocarbon pore volume weighted) if (summaryConfig.hasKeyword("FPRH") || summaryConfig.hasKeyword("RPRH")) { - simProps.emplace_back(data::CellData{ + output.emplace_back(data::CellData{ "PRH", Opm::UnitSystem::measure::pressure, std::move(adbVToDoubleVector(sd.fip[Model::SimulatorData::FIP_WEIGHTED_PRESSURE])), false}); } - - - return simProps; } } @@ -773,9 +793,11 @@ namespace Opm const SummaryConfig& summaryConfig = eclipseState_->getSummaryConfig(); const int reportStepNum = timer.reportStepNum(); bool logMessages = output_ && parallelOutput_->isIORank(); - std::vector cellData = - detail::getCellData( phaseUsage_, physicalModel, restartConfig, - summaryConfig, reportStepNum, logMessages ); + + std::vector cellData; + detail::getRestartData( cellData, phaseUsage_, physicalModel, + restartConfig, reportStepNum, logMessages ); + detail::getSummaryData( cellData, phaseUsage_, physicalModel, summaryConfig ); writeTimeStepWithCellProperties(timer, localState, localWellState, cellData, substep); }