2019-04-23 01:56:06 -05:00
// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2015-06-18 06:43:59 -05:00
// vi: set et ts=4 sw=4 sts=4:
2014-11-28 05:58:48 -06:00
/*
This file is part of the Open Porous Media project ( OPM ) .
2019-10-30 11:51:49 -05:00
2014-11-28 05:58:48 -06:00
OPM is free software : you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation , either version 2 of the License , or
( at your option ) any later version .
2019-10-30 11:51:49 -05:00
2014-11-28 05:58:48 -06:00
OPM is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
2019-10-30 11:51:49 -05:00
2014-11-28 05:58:48 -06:00
You should have received a copy of the GNU General Public License
along with OPM . If not , see < http : //www.gnu.org/licenses/>.
2019-10-30 11:51:49 -05:00
2016-03-14 07:21:47 -05:00
Consult the COPYING file in the top - level source directory of this
module for the precise wording of the license and the list of
copyright holders .
2014-11-28 05:58:48 -06:00
*/
/*!
* \ file
2019-09-05 10:04:39 -05:00
* \ copydoc Opm : : EclOutputBlackOilModule
2014-11-28 05:58:48 -06:00
*/
# ifndef EWOMS_ECL_OUTPUT_BLACK_OIL_MODULE_HH
# define EWOMS_ECL_OUTPUT_BLACK_OIL_MODULE_HH
2020-09-07 03:22:42 -05:00
# include <array>
# include <numeric>
# include <optional>
# include <stdexcept>
2019-09-16 04:22:14 -05:00
# include <opm/models/blackoil/blackoilproperties.hh>
2018-03-12 08:31:36 -05:00
2019-09-16 03:58:20 -05:00
# include <opm/models/utils/propertysystem.hh>
# include <opm/models/utils/parametersystem.hh>
2014-11-28 05:58:48 -06:00
2018-02-01 07:40:01 -06:00
# include <opm/material/common/Valgrind.hpp>
2018-03-05 06:00:51 -06:00
2017-12-07 05:38:48 -06:00
# include <opm/parser/eclipse/Units/Units.hpp>
2018-01-12 08:32:43 -06:00
# include <opm/parser/eclipse/EclipseState/SummaryConfig/SummaryConfig.hpp>
2017-12-07 05:38:48 -06:00
# include <opm/output/data/Cells.hpp>
# include <opm/output/eclipse/EclipseIO.hpp>
2018-03-12 08:31:36 -05:00
# include <opm/common/OpmLog/OpmLog.hpp>
2016-11-07 08:14:07 -06:00
2014-11-28 05:58:48 -06:00
# include <dune/common/fvector.hh>
# include <type_traits>
2020-08-21 06:42:08 -05:00
namespace Opm : : Properties {
2018-06-14 09:06:05 -05:00
2017-12-07 05:38:48 -06:00
// create new type tag for the Ecl-output
2020-08-27 03:30:29 -05:00
namespace TTag {
struct EclOutputBlackOil { } ;
}
2014-11-28 05:58:48 -06:00
2020-08-27 04:38:38 -05:00
template < class TypeTag , class MyTypeTag >
struct ForceDisableFluidInPlaceOutput {
using type = UndefinedProperty ;
} ;
2018-07-26 05:31:32 -05:00
2020-08-27 04:38:38 -05:00
template < class TypeTag >
struct ForceDisableFluidInPlaceOutput < TypeTag , TTag : : EclOutputBlackOil > {
static constexpr bool value = false ;
} ;
2018-06-14 09:06:05 -05:00
2020-08-21 06:42:08 -05:00
} // namespace Opm::Properties
2018-06-14 09:06:05 -05:00
2019-09-05 10:04:39 -05:00
namespace Opm {
2014-11-28 05:58:48 -06:00
2020-09-07 03:22:42 -05:00
2014-11-28 05:58:48 -06:00
// forward declaration
template < class TypeTag >
class EcfvDiscretization ;
/*!
2014-12-22 12:19:03 -06:00
* \ ingroup EclBlackOilSimulator
2014-11-28 05:58:48 -06:00
*
* \ brief Output module for the results black oil model writing in
* ECL binary format .
*/
template < class TypeTag >
2017-12-07 05:38:48 -06:00
class EclOutputBlackOilModule
2014-11-28 05:58:48 -06:00
{
2020-08-26 03:49:52 -05:00
using Simulator = GetPropType < TypeTag , Properties : : Simulator > ;
using Discretization = GetPropType < TypeTag , Properties : : Discretization > ;
using Scalar = GetPropType < TypeTag , Properties : : Scalar > ;
using Evaluation = GetPropType < TypeTag , Properties : : Evaluation > ;
using ElementContext = GetPropType < TypeTag , Properties : : ElementContext > ;
using MaterialLaw = GetPropType < TypeTag , Properties : : MaterialLaw > ;
using MaterialLawParams = GetPropType < TypeTag , Properties : : MaterialLawParams > ;
using FluidSystem = GetPropType < TypeTag , Properties : : FluidSystem > ;
using GridView = GetPropType < TypeTag , Properties : : GridView > ;
using Element = typename GridView : : template Codim < 0 > : : Entity ;
using ElementIterator = typename GridView : : template Codim < 0 > : : Iterator ;
2014-11-28 05:58:48 -06:00
enum { numPhases = FluidSystem : : numPhases } ;
enum { oilPhaseIdx = FluidSystem : : oilPhaseIdx } ;
enum { gasPhaseIdx = FluidSystem : : gasPhaseIdx } ;
enum { waterPhaseIdx = FluidSystem : : waterPhaseIdx } ;
enum { gasCompIdx = FluidSystem : : gasCompIdx } ;
2015-02-03 06:58:18 -06:00
enum { oilCompIdx = FluidSystem : : oilCompIdx } ;
2020-08-27 02:13:30 -05:00
enum { enableEnergy = getPropValue < TypeTag , Properties : : EnableEnergy > ( ) } ;
2014-11-28 05:58:48 -06:00
2017-12-07 05:38:48 -06:00
typedef std : : vector < Scalar > ScalarBuffer ;
2020-09-10 02:42:52 -05:00
typedef std : : vector < std : : string > StringBuffer ;
2014-11-28 05:58:48 -06:00
2018-04-30 10:17:22 -05:00
struct FipDataType
{
enum FipId
{
2018-01-16 07:24:21 -06:00
WaterInPlace = 0 , //WIP
OilInPlace = 1 , //OIP
GasInPlace = 2 , //GIP
OilInPlaceInLiquidPhase = 3 , //OIPL
OilInPlaceInGasPhase = 4 , //OIPG
GasInPlaceInLiquidPhase = 5 , //GIPL
2018-01-17 08:24:24 -06:00
GasInPlaceInGasPhase = 6 , //GIPG
2018-04-30 10:17:22 -05:00
PoreVolume = 7 , //PV
2018-01-12 08:32:43 -06:00
} ;
2020-09-07 03:22:42 -05:00
static const int numFipTypes = PoreVolume + 1 ;
static std : : string EclString ( int fip_type ) {
switch ( static_cast < FipId > ( fip_type ) ) {
case FipDataType : : WaterInPlace : return " WIP " ;
case FipDataType : : OilInPlace : return " OIP " ;
case FipDataType : : GasInPlace : return " GIP " ;
case FipDataType : : OilInPlaceInLiquidPhase : return " OIPL " ;
case FipDataType : : OilInPlaceInGasPhase : return " OIPG " ;
case FipDataType : : GasInPlaceInLiquidPhase : return " GIPL " ;
case FipDataType : : GasInPlaceInGasPhase : return " GIPG " ;
case FipDataType : : PoreVolume : return " PV " ;
}
throw std : : logic_error ( " fip_type: " + std : : to_string ( fip_type ) + " not recognized " ) ;
}
2018-01-12 08:32:43 -06:00
} ;
2019-10-26 06:13:44 -05:00
struct WellProdDataType
{
enum WPId
{
WellLocationi = 0 , //WLi
2020-09-10 02:42:52 -05:00
WellLocationj = 1 , //WLj
2019-10-26 06:13:44 -05:00
OilRate = 2 , //OR
WaterRate = 3 , //WR
GasRate = 4 , //GR
2019-11-01 06:56:20 -05:00
FluidResVol = 5 , //FRV
WaterCut = 6 , //WC
GasOilRatio = 7 , //GOR
WatGasRatio = 8 , //WGR
BHP = 9 , //BHP
THP = 10 , //THP
SteadyStatePI = 11 , //SteadyStatePI
WellName = 0 , //WName
CTRLMode = 1 , //CTRL
2019-10-26 06:13:44 -05:00
} ;
static const int numWPValues = 12 ;
2019-11-01 06:56:20 -05:00
static const int numWPNames = 2 ;
2020-09-10 02:42:52 -05:00
} ;
2019-11-01 06:56:20 -05:00
struct WellInjDataType
2019-10-26 06:13:44 -05:00
{
enum WIId
{
WellLocationi = 0 , //WLi
2019-11-01 06:56:20 -05:00
WellLocationj = 1 , //WLj
2019-10-26 06:13:44 -05:00
OilRate = 2 , //OR
WaterRate = 3 , //WR
GasRate = 4 , //GR
2019-11-01 06:56:20 -05:00
FluidResVol = 5 , //FRV
BHP = 6 , //BHP
THP = 7 , //THP
SteadyStateII = 8 , //SteadyStateII
WellName = 0 , //WName
CTRLModeOil = 1 , //CTRLo
CTRLModeWat = 2 , //CTRLw
CTRLModeGas = 3 , //CTRLg
2019-10-26 06:13:44 -05:00
} ;
static const int numWIValues = 9 ;
2019-11-01 06:56:20 -05:00
static const int numWINames = 4 ;
2019-10-26 06:13:44 -05:00
} ;
2019-11-01 06:56:20 -05:00
struct WellCumDataType
2019-10-26 06:13:44 -05:00
{
enum WCId
{
WellLocationi = 0 , //WLi
2019-11-01 06:56:20 -05:00
WellLocationj = 1 , //WLj
2019-10-26 06:13:44 -05:00
OilProd = 2 , //OP
WaterProd = 3 , //WP
GasProd = 4 , //GP
2019-11-01 06:56:20 -05:00
FluidResVolProd = 5 , //FRVP
OilInj = 6 , //OI
2019-10-26 06:13:44 -05:00
WaterInj = 7 , //WI
GasInj = 8 , //GI
2019-11-01 06:56:20 -05:00
FluidResVolInj = 9 , //FRVI
WellName = 0 , //WName
WellType = 1 , //WType
WellCTRL = 2 , //WCTRL
2019-10-26 06:13:44 -05:00
} ;
static const int numWCValues = 10 ;
2019-11-01 06:56:20 -05:00
static const int numWCNames = 3 ;
2019-10-30 08:09:51 -05:00
} ;
2018-01-12 08:32:43 -06:00
2020-09-07 03:22:42 -05:00
struct RegionSum {
std : : size_t ntFip ;
std : : array < ScalarBuffer , FipDataType : : numFipTypes > regFipValues ;
ScalarBuffer regPressurePv ;
ScalarBuffer regPvHydrocarbon ;
ScalarBuffer regPressurePvHydrocarbon ;
std : : array < Scalar , FipDataType : : numFipTypes > fieldFipValues ;
Scalar fieldPressurePv ;
Scalar fieldPvHydrocarbon ;
Scalar fieldPressurePvHydrocarbon ;
} ;
2014-11-28 05:58:48 -06:00
public :
2018-02-01 06:16:37 -06:00
template < class CollectDataToIORankType >
EclOutputBlackOilModule ( const Simulator & simulator , const CollectDataToIORankType & collectToIORank )
2017-12-07 05:38:48 -06:00
: simulator_ ( simulator )
2018-01-12 08:32:43 -06:00
{
2018-02-01 09:26:58 -06:00
const Opm : : SummaryConfig summaryConfig = simulator_ . vanguard ( ) . summaryConfig ( ) ;
2020-09-07 03:22:42 -05:00
const auto & fp = simulator_ . vanguard ( ) . eclState ( ) . fieldProps ( ) ;
this - > regions_ [ " FIPNUM " ] = fp . get_int ( " FIPNUM " ) ;
for ( const auto & region : summaryConfig . fip_regions ( ) )
this - > regions_ [ region ] = fp . get_int ( region ) ;
for ( auto & region_pair : this - > regions_ )
createLocalRegion_ ( region_pair . second ) ;
this - > RPRNodes_ = summaryConfig . keywords ( " RPR* " ) ;
this - > RPRPNodes_ = summaryConfig . keywords ( " RPRP* " ) ;
for ( int fip_type = 0 ; fip_type < FipDataType : : numFipTypes ; fip_type + + ) {
std : : string key_pattern = " R " + FipDataType : : EclString ( fip_type ) + " * " ;
this - > regionNodes_ [ fip_type ] = summaryConfig . keywords ( key_pattern ) ;
}
2018-02-01 06:16:37 -06:00
2018-04-30 10:17:22 -05:00
for ( const auto & node : summaryConfig ) {
2020-03-13 09:56:33 -05:00
if ( node . category ( ) = = SummaryConfigNode : : Category : : Block ) {
2020-09-08 13:28:42 -05:00
if ( collectToIORank . isCartIdxOnThisRank ( node . number ( ) - 1 ) ) {
2019-09-27 08:56:55 -05:00
std : : pair < std : : string , int > key = std : : make_pair ( node . keyword ( ) , node . number ( ) ) ;
2018-02-09 05:57:34 -06:00
blockData_ [ key ] = 0.0 ;
2018-02-01 06:16:37 -06:00
}
}
}
2018-07-26 05:31:32 -05:00
forceDisableFipOutput_ = EWOMS_GET_PARAM ( TypeTag , bool , ForceDisableFluidInPlaceOutput ) ;
}
/*!
* \ brief Register all run - time parameters for the Vtk output module .
*/
static void registerParameters ( )
{
EWOMS_REGISTER_PARAM ( TypeTag , bool , ForceDisableFluidInPlaceOutput ,
" Do not print fluid-in-place values after each report step even if requested by the deck. " ) ;
2018-01-12 08:32:43 -06:00
}
2014-11-28 05:58:48 -06:00
/*!
* \ brief Allocate memory for the scalar fields we would like to
2017-12-07 05:38:48 -06:00
* write to ECL output files
2014-11-28 05:58:48 -06:00
*/
2019-10-18 02:07:06 -05:00
void allocBuffers ( unsigned bufferSize , unsigned reportStepNum , const bool substep , const bool log , const bool isRestart )
2014-11-28 05:58:48 -06:00
{
2019-09-05 10:04:39 -05:00
if ( ! std : : is_same < Discretization , Opm : : EcfvDiscretization < TypeTag > > : : value )
2018-01-09 07:01:30 -06:00
return ;
2018-01-19 08:45:42 -06:00
// Summary output is for all steps
2018-02-01 09:26:58 -06:00
const Opm : : SummaryConfig summaryConfig = simulator_ . vanguard ( ) . summaryConfig ( ) ;
2018-01-23 02:46:56 -06:00
2018-01-22 06:38:50 -06:00
// Only output RESTART_AUXILIARY asked for by the user.
2020-02-17 01:39:21 -06:00
const Opm : : RestartConfig & restartConfig = simulator_ . vanguard ( ) . schedule ( ) . restart ( ) ;
2018-01-22 06:38:50 -06:00
std : : map < std : : string , int > rstKeywords = restartConfig . getRestartKeywords ( reportStepNum ) ;
2020-03-25 05:15:35 -05:00
for ( auto & [ keyword , should_write ] : rstKeywords ) {
if ( this - > isOutputCreationDirective_ ( keyword ) ) {
// 'BASIC', 'FREQ' and similar. Don't attempt to create
// cell-based output for these keywords and don't warn about
// not being able to create such cell-based result vectors.
should_write = 0 ;
}
else {
should_write = restartConfig . getKeyword ( keyword , reportStepNum ) ;
}
2018-01-22 06:38:50 -06:00
}
outputFipRestart_ = false ;
2018-01-23 02:46:56 -06:00
computeFip_ = false ;
2018-01-19 08:45:42 -06:00
// Fluid in place
2020-09-07 03:22:42 -05:00
for ( int i = 0 ; i < FipDataType : : numFipTypes ; i + + ) {
if ( ! substep | | summaryConfig . require3DField ( FipDataType : : EclString ( i ) ) ) {
2018-01-22 06:38:50 -06:00
if ( rstKeywords [ " FIP " ] > 0 ) {
rstKeywords [ " FIP " ] = 0 ;
outputFipRestart_ = true ;
}
2018-01-19 08:45:42 -06:00
fip_ [ i ] . resize ( bufferSize , 0.0 ) ;
2018-01-23 02:46:56 -06:00
computeFip_ = true ;
2018-01-19 08:45:42 -06:00
}
2018-04-30 10:17:22 -05:00
else
fip_ [ i ] . clear ( ) ;
2018-01-19 08:45:42 -06:00
}
2020-09-07 03:22:42 -05:00
if ( ! substep | | summaryConfig . hasKeyword ( " FPR " ) | | summaryConfig . hasKeyword ( " FPRP " ) | | ! this - > RPRNodes_ . empty ( ) ) {
2018-01-29 05:23:23 -06:00
fip_ [ FipDataType : : PoreVolume ] . resize ( bufferSize , 0.0 ) ;
2018-01-29 01:43:42 -06:00
hydrocarbonPoreVolume_ . resize ( bufferSize , 0.0 ) ;
pressureTimesPoreVolume_ . resize ( bufferSize , 0.0 ) ;
pressureTimesHydrocarbonVolume_ . resize ( bufferSize , 0.0 ) ;
2018-04-30 10:17:22 -05:00
}
else {
2018-01-29 01:43:42 -06:00
hydrocarbonPoreVolume_ . clear ( ) ;
pressureTimesPoreVolume_ . clear ( ) ;
pressureTimesHydrocarbonVolume_ . clear ( ) ;
2017-12-07 05:38:48 -06:00
}
2018-02-07 07:30:43 -06:00
// Well RFT data
if ( ! substep ) {
2019-04-04 00:27:39 -05:00
const auto & schedule = simulator_ . vanguard ( ) . schedule ( ) ;
const auto & rft_config = schedule . rftConfig ( ) ;
2019-11-13 16:16:11 -06:00
for ( const auto & well : schedule . getWells ( reportStepNum ) ) {
2018-02-07 07:30:43 -06:00
// don't bother with wells not on this process
2018-04-30 10:17:22 -05:00
const auto & defunctWellNames = simulator_ . vanguard ( ) . defunctWellNames ( ) ;
2019-05-02 05:51:25 -05:00
if ( defunctWellNames . find ( well . name ( ) ) ! = defunctWellNames . end ( ) ) {
2018-02-07 07:30:43 -06:00
continue ;
}
2019-04-04 00:27:39 -05:00
if ( ! rft_config . active ( reportStepNum ) )
2018-02-07 07:30:43 -06:00
continue ;
2019-05-02 05:51:25 -05:00
for ( const auto & connection : well . getConnections ( ) ) {
2018-06-28 08:49:45 -05:00
const size_t i = size_t ( connection . getI ( ) ) ;
const size_t j = size_t ( connection . getJ ( ) ) ;
const size_t k = size_t ( connection . getK ( ) ) ;
2020-02-25 05:33:15 -06:00
const size_t index = simulator_ . vanguard ( ) . eclState ( ) . gridDims ( ) . getGlobalIndex ( i , j , k ) ;
2018-01-19 08:45:42 -06:00
2020-09-09 09:13:22 -05:00
if ( FluidSystem : : phaseIsActive ( oilPhaseIdx ) )
oilConnectionPressures_ . emplace ( std : : make_pair ( index , 0.0 ) ) ;
if ( FluidSystem : : phaseIsActive ( waterPhaseIdx ) )
waterConnectionSaturations_ . emplace ( std : : make_pair ( index , 0.0 ) ) ;
if ( FluidSystem : : phaseIsActive ( gasPhaseIdx ) )
gasConnectionSaturations_ . emplace ( std : : make_pair ( index , 0.0 ) ) ;
2018-02-07 07:30:43 -06:00
}
}
}
2018-12-17 04:37:07 -06:00
// always allocate memory for temperature
temperature_ . resize ( bufferSize , 0.0 ) ;
2019-10-18 02:07:06 -05:00
// field data should be allocated
// 1) when we want to restart
// 2) when it is ask for by the user via restartConfig
// 3) when it is not a substep
if ( ! isRestart & & ( ! restartConfig . getWriteRestartFile ( reportStepNum , log ) | | substep ) )
2018-02-07 07:30:43 -06:00
return ;
2018-01-12 08:32:43 -06:00
2018-01-22 06:38:50 -06:00
// always output saturation of active phases
2018-01-09 07:01:30 -06:00
for ( unsigned phaseIdx = 0 ; phaseIdx < numPhases ; + + phaseIdx ) {
if ( ! FluidSystem : : phaseIsActive ( phaseIdx ) )
continue ;
2014-11-28 05:58:48 -06:00
2018-04-30 10:17:22 -05:00
saturation_ [ phaseIdx ] . resize ( bufferSize , 0.0 ) ;
2017-12-07 05:38:48 -06:00
}
2018-01-22 06:38:50 -06:00
// and oil pressure
2018-04-30 10:17:22 -05:00
oilPressure_ . resize ( bufferSize , 0.0 ) ;
2020-03-25 05:15:35 -05:00
rstKeywords [ " PRES " ] = 0 ;
rstKeywords [ " PRESSURE " ] = 0 ;
2018-01-12 08:32:43 -06:00
2020-03-25 05:15:35 -05:00
if ( FluidSystem : : phaseIsActive ( oilPhaseIdx ) )
rstKeywords [ " SOIL " ] = 0 ;
if ( FluidSystem : : phaseIsActive ( gasPhaseIdx ) )
rstKeywords [ " SGAS " ] = 0 ;
if ( FluidSystem : : phaseIsActive ( waterPhaseIdx ) )
rstKeywords [ " SWAT " ] = 0 ;
if ( FluidSystem : : enableDissolvedGas ( ) ) {
2018-04-30 10:17:22 -05:00
rs_ . resize ( bufferSize , 0.0 ) ;
2020-03-25 05:15:35 -05:00
rstKeywords [ " RS " ] = 0 ;
}
if ( FluidSystem : : enableVaporizedOil ( ) ) {
2018-04-30 10:17:22 -05:00
rv_ . resize ( bufferSize , 0.0 ) ;
2020-03-25 05:15:35 -05:00
rstKeywords [ " RV " ] = 0 ;
}
2018-01-09 07:01:30 -06:00
2020-08-27 02:13:30 -05:00
if ( getPropValue < TypeTag , Properties : : EnableSolvent > ( ) )
2018-04-30 10:17:22 -05:00
sSol_ . resize ( bufferSize , 0.0 ) ;
2020-08-27 02:13:30 -05:00
if ( getPropValue < TypeTag , Properties : : EnablePolymer > ( ) )
2018-04-30 10:17:22 -05:00
cPolymer_ . resize ( bufferSize , 0.0 ) ;
2020-08-27 02:13:30 -05:00
if ( getPropValue < TypeTag , Properties : : EnableFoam > ( ) )
2019-04-26 03:38:37 -05:00
cFoam_ . resize ( bufferSize , 0.0 ) ;
2020-08-27 02:13:30 -05:00
if ( getPropValue < TypeTag , Properties : : EnableBrine > ( ) )
2019-11-07 02:39:42 -06:00
cSalt_ . resize ( bufferSize , 0.0 ) ;
2017-12-07 05:38:48 -06:00
2018-01-22 06:38:50 -06:00
if ( simulator_ . problem ( ) . vapparsActive ( ) )
2018-04-30 10:17:22 -05:00
soMax_ . resize ( bufferSize , 0.0 ) ;
2018-01-22 06:38:50 -06:00
if ( simulator_ . problem ( ) . materialLawManager ( ) - > enableHysteresis ( ) ) {
2018-04-30 10:17:22 -05:00
pcSwMdcOw_ . resize ( bufferSize , 0.0 ) ;
krnSwMdcOw_ . resize ( bufferSize , 0.0 ) ;
pcSwMdcGo_ . resize ( bufferSize , 0.0 ) ;
krnSwMdcGo_ . resize ( bufferSize , 0.0 ) ;
2018-01-12 08:32:43 -06:00
}
2017-12-07 05:38:48 -06:00
2020-03-25 05:15:35 -05:00
if ( simulator_ . vanguard ( ) . eclState ( ) . fieldProps ( ) . has_double ( " SWATINIT " ) ) {
2018-09-07 03:19:00 -05:00
ppcw_ . resize ( bufferSize , 0.0 ) ;
2020-03-25 05:15:35 -05:00
rstKeywords [ " PPCW " ] = 0 ;
}
2018-09-07 03:19:00 -05:00
2018-01-22 06:38:50 -06:00
if ( FluidSystem : : enableDissolvedGas ( ) & & rstKeywords [ " RSSAT " ] > 0 ) {
rstKeywords [ " RSSAT " ] = 0 ;
2018-04-30 10:17:22 -05:00
gasDissolutionFactor_ . resize ( bufferSize , 0.0 ) ;
2018-01-19 08:45:42 -06:00
}
2018-01-22 06:38:50 -06:00
if ( FluidSystem : : enableVaporizedOil ( ) & & rstKeywords [ " RVSAT " ] > 0 ) {
rstKeywords [ " RVSAT " ] = 0 ;
2018-04-30 10:17:22 -05:00
oilVaporizationFactor_ . resize ( bufferSize , 0.0 ) ;
2017-12-07 05:38:48 -06:00
}
2018-04-30 10:17:22 -05:00
if ( FluidSystem : : phaseIsActive ( waterPhaseIdx ) & & rstKeywords [ " BW " ] > 0 ) {
2018-01-09 07:01:30 -06:00
rstKeywords [ " BW " ] = 0 ;
2018-04-30 10:17:22 -05:00
invB_ [ waterPhaseIdx ] . resize ( bufferSize , 0.0 ) ;
2018-01-09 07:01:30 -06:00
}
2018-04-30 10:17:22 -05:00
if ( FluidSystem : : phaseIsActive ( oilPhaseIdx ) & & rstKeywords [ " BO " ] > 0 ) {
2018-01-09 07:01:30 -06:00
rstKeywords [ " BO " ] = 0 ;
2018-04-30 10:17:22 -05:00
invB_ [ oilPhaseIdx ] . resize ( bufferSize , 0.0 ) ;
2018-01-09 07:01:30 -06:00
}
2018-04-30 10:17:22 -05:00
if ( FluidSystem : : phaseIsActive ( gasPhaseIdx ) & & rstKeywords [ " BG " ] > 0 ) {
2018-01-09 07:01:30 -06:00
rstKeywords [ " BG " ] = 0 ;
2018-04-30 10:17:22 -05:00
invB_ [ gasPhaseIdx ] . resize ( bufferSize , 0.0 ) ;
2018-01-09 07:01:30 -06:00
}
if ( rstKeywords [ " DEN " ] > 0 ) {
2017-12-07 05:38:48 -06:00
rstKeywords [ " DEN " ] = 0 ;
for ( unsigned phaseIdx = 0 ; phaseIdx < numPhases ; + + phaseIdx ) {
if ( ! FluidSystem : : phaseIsActive ( phaseIdx ) )
continue ;
2018-04-30 10:17:22 -05:00
density_ [ phaseIdx ] . resize ( bufferSize , 0.0 ) ;
2017-12-07 05:38:48 -06:00
}
}
2018-01-09 07:01:30 -06:00
const bool hasVWAT = ( rstKeywords [ " VISC " ] > 0 ) | | ( rstKeywords [ " VWAT " ] > 0 ) ;
const bool hasVOIL = ( rstKeywords [ " VISC " ] > 0 ) | | ( rstKeywords [ " VOIL " ] > 0 ) ;
const bool hasVGAS = ( rstKeywords [ " VISC " ] > 0 ) | | ( rstKeywords [ " VGAS " ] > 0 ) ;
rstKeywords [ " VISC " ] = 0 ;
2017-12-07 05:38:48 -06:00
2018-04-30 10:17:22 -05:00
if ( FluidSystem : : phaseIsActive ( waterPhaseIdx ) & & hasVWAT ) {
2018-01-09 07:01:30 -06:00
rstKeywords [ " VWAT " ] = 0 ;
2018-04-30 10:17:22 -05:00
viscosity_ [ waterPhaseIdx ] . resize ( bufferSize , 0.0 ) ;
2017-12-07 05:38:48 -06:00
}
2018-04-30 10:17:22 -05:00
if ( FluidSystem : : phaseIsActive ( oilPhaseIdx ) & & hasVOIL > 0 ) {
2018-01-09 07:01:30 -06:00
rstKeywords [ " VOIL " ] = 0 ;
2018-04-30 10:17:22 -05:00
viscosity_ [ oilPhaseIdx ] . resize ( bufferSize , 0.0 ) ;
2017-12-07 05:38:48 -06:00
}
2018-04-30 10:17:22 -05:00
if ( FluidSystem : : phaseIsActive ( gasPhaseIdx ) & & hasVGAS > 0 ) {
2018-01-09 07:01:30 -06:00
rstKeywords [ " VGAS " ] = 0 ;
2018-04-30 10:17:22 -05:00
viscosity_ [ gasPhaseIdx ] . resize ( bufferSize , 0.0 ) ;
2017-12-07 05:38:48 -06:00
}
2018-04-30 10:17:22 -05:00
if ( FluidSystem : : phaseIsActive ( waterPhaseIdx ) & & rstKeywords [ " KRW " ] > 0 ) {
2019-04-23 01:56:06 -05:00
rstKeywords [ " KRW " ] = 0 ;
2018-04-30 10:17:22 -05:00
relativePermeability_ [ waterPhaseIdx ] . resize ( bufferSize , 0.0 ) ;
2018-01-09 07:01:30 -06:00
}
2018-04-30 10:17:22 -05:00
if ( FluidSystem : : phaseIsActive ( oilPhaseIdx ) & & rstKeywords [ " KRO " ] > 0 ) {
2018-01-09 07:01:30 -06:00
rstKeywords [ " KRO " ] = 0 ;
2018-04-30 10:17:22 -05:00
relativePermeability_ [ oilPhaseIdx ] . resize ( bufferSize , 0.0 ) ;
2018-01-09 07:01:30 -06:00
}
2018-04-30 10:17:22 -05:00
if ( FluidSystem : : phaseIsActive ( gasPhaseIdx ) & & rstKeywords [ " KRG " ] > 0 ) {
2018-01-09 07:01:30 -06:00
rstKeywords [ " KRG " ] = 0 ;
2018-04-30 10:17:22 -05:00
relativePermeability_ [ gasPhaseIdx ] . resize ( bufferSize , 0.0 ) ;
2018-01-09 07:01:30 -06:00
}
2017-12-07 05:38:48 -06:00
if ( rstKeywords [ " PBPD " ] > 0 ) {
rstKeywords [ " PBPD " ] = 0 ;
2018-04-30 10:17:22 -05:00
bubblePointPressure_ . resize ( bufferSize , 0.0 ) ;
dewPointPressure_ . resize ( bufferSize , 0.0 ) ;
2017-12-07 05:38:48 -06:00
}
2018-11-14 06:10:01 -06:00
// tracers
const int numTracers = simulator_ . problem ( ) . tracerModel ( ) . numTracers ( ) ;
if ( numTracers > 0 ) {
tracerConcentrations_ . resize ( numTracers ) ;
for ( int tracerIdx = 0 ; tracerIdx < numTracers ; + + tracerIdx )
{
tracerConcentrations_ [ tracerIdx ] . resize ( bufferSize , 0.0 ) ;
}
}
2019-03-12 09:51:41 -05:00
// ROCKC
if ( rstKeywords [ " ROCKC " ] > 0 ) {
rstKeywords [ " ROCKC " ] = 0 ;
rockCompPorvMultiplier_ . resize ( bufferSize , 0.0 ) ;
rockCompTransMultiplier_ . resize ( bufferSize , 0.0 ) ;
swMax_ . resize ( bufferSize , 0.0 ) ;
minimumOilPressure_ . resize ( bufferSize , 0.0 ) ;
overburdenPressure_ . resize ( bufferSize , 0.0 ) ;
}
2017-12-07 05:38:48 -06:00
//Warn for any unhandled keyword
if ( log ) {
2018-04-30 10:17:22 -05:00
for ( auto & keyValue : rstKeywords ) {
2017-12-07 05:38:48 -06:00
if ( keyValue . second > 0 ) {
std : : string logstring = " Keyword ' " ;
logstring . append ( keyValue . first ) ;
logstring . append ( " ' is unhandled for output to file. " ) ;
Opm : : OpmLog : : warning ( " Unhandled output keyword " , logstring ) ;
}
}
}
failedCellsPb_ . clear ( ) ;
failedCellsPd_ . clear ( ) ;
2018-01-09 07:01:30 -06:00
// Not supported in flow legacy
if ( false )
2018-04-30 10:17:22 -05:00
saturatedOilFormationVolumeFactor_ . resize ( bufferSize , 0.0 ) ;
2018-01-09 07:01:30 -06:00
if ( false )
2018-04-30 10:17:22 -05:00
oilSaturationPressure_ . resize ( bufferSize , 0.0 ) ;
2018-11-14 06:10:01 -06:00
2014-11-28 05:58:48 -06:00
}
/*!
* \ brief Modify the internal buffers according to the intensive quanties relevant
* for an element
*/
2016-11-07 08:14:07 -06:00
void processElement ( const ElementContext & elemCtx )
2014-11-28 05:58:48 -06:00
{
2019-09-05 10:04:39 -05:00
if ( ! std : : is_same < Discretization , Opm : : EcfvDiscretization < TypeTag > > : : value )
2014-11-28 05:58:48 -06:00
return ;
2019-03-12 09:51:41 -05:00
const auto & problem = elemCtx . simulator ( ) . problem ( ) ;
2015-11-18 04:54:35 -06:00
for ( unsigned dofIdx = 0 ; dofIdx < elemCtx . numPrimaryDof ( /*timeIdx=*/ 0 ) ; + + dofIdx ) {
2017-12-07 05:38:48 -06:00
const auto & intQuants = elemCtx . intensiveQuantities ( dofIdx , /*timeIdx=*/ 0 ) ;
const auto & fs = intQuants . fluidState ( ) ;
2018-01-12 08:32:43 -06:00
2016-01-04 08:32:55 -06:00
typedef typename std : : remove_const < typename std : : remove_reference < decltype ( fs ) > : : type > : : type FluidState ;
2015-11-18 04:54:35 -06:00
unsigned globalDofIdx = elemCtx . globalSpaceIndex ( dofIdx , /*timeIdx=*/ 0 ) ;
2015-12-31 06:20:41 -06:00
unsigned pvtRegionIdx = elemCtx . primaryVars ( dofIdx , /*timeIdx=*/ 0 ) . pvtRegionIndex ( ) ;
2014-11-28 05:58:48 -06:00
2018-01-09 07:01:30 -06:00
for ( unsigned phaseIdx = 0 ; phaseIdx < numPhases ; + + phaseIdx ) {
if ( saturation_ [ phaseIdx ] . size ( ) = = 0 )
continue ;
2016-11-15 11:00:48 -06:00
2018-01-29 01:43:42 -06:00
saturation_ [ phaseIdx ] [ globalDofIdx ] = Opm : : getValue ( fs . saturation ( phaseIdx ) ) ;
2018-01-09 07:01:30 -06:00
Opm : : Valgrind : : CheckDefined ( saturation_ [ phaseIdx ] [ globalDofIdx ] ) ;
2014-11-28 05:58:48 -06:00
}
2018-01-09 07:01:30 -06:00
2017-12-07 05:38:48 -06:00
if ( oilPressure_ . size ( ) > 0 ) {
2019-10-09 08:24:23 -05:00
if ( FluidSystem : : phaseIsActive ( oilPhaseIdx ) ) {
oilPressure_ [ globalDofIdx ] = Opm : : getValue ( fs . pressure ( oilPhaseIdx ) ) ;
} else {
// put pressure in oil pressure for output
if ( FluidSystem : : phaseIsActive ( waterPhaseIdx ) ) {
oilPressure_ [ globalDofIdx ] = Opm : : getValue ( fs . pressure ( waterPhaseIdx ) ) ;
} else {
oilPressure_ [ globalDofIdx ] = Opm : : getValue ( fs . pressure ( gasPhaseIdx ) ) ;
}
}
2017-12-07 05:38:48 -06:00
Opm : : Valgrind : : CheckDefined ( oilPressure_ [ globalDofIdx ] ) ;
2018-01-31 04:10:37 -06:00
}
2016-11-15 11:00:48 -06:00
2018-12-17 04:37:07 -06:00
if ( enableEnergy ) {
2018-01-31 04:10:37 -06:00
temperature_ [ globalDofIdx ] = Opm : : getValue ( fs . temperature ( oilPhaseIdx ) ) ;
Opm : : Valgrind : : CheckDefined ( temperature_ [ globalDofIdx ] ) ;
2014-11-28 05:58:48 -06:00
}
2017-12-07 05:38:48 -06:00
if ( gasDissolutionFactor_ . size ( ) > 0 ) {
2017-12-19 11:00:14 -06:00
Scalar SoMax = elemCtx . problem ( ) . maxOilSaturation ( globalDofIdx ) ;
2014-11-28 05:58:48 -06:00
gasDissolutionFactor_ [ globalDofIdx ] =
2017-12-07 05:38:48 -06:00
FluidSystem : : template saturatedDissolutionFactor < FluidState , Scalar > ( fs , oilPhaseIdx , pvtRegionIdx , SoMax ) ;
2017-02-09 11:25:44 -06:00
Opm : : Valgrind : : CheckDefined ( gasDissolutionFactor_ [ globalDofIdx ] ) ;
2017-12-07 05:38:48 -06:00
2014-11-28 05:58:48 -06:00
}
2017-12-07 05:38:48 -06:00
if ( oilVaporizationFactor_ . size ( ) > 0 ) {
2017-12-19 11:00:14 -06:00
Scalar SoMax = elemCtx . problem ( ) . maxOilSaturation ( globalDofIdx ) ;
2017-12-07 05:38:48 -06:00
oilVaporizationFactor_ [ globalDofIdx ] =
FluidSystem : : template saturatedDissolutionFactor < FluidState , Scalar > ( fs , gasPhaseIdx , pvtRegionIdx , SoMax ) ;
Opm : : Valgrind : : CheckDefined ( oilVaporizationFactor_ [ globalDofIdx ] ) ;
2016-11-15 11:00:48 -06:00
}
2017-12-07 05:38:48 -06:00
if ( gasFormationVolumeFactor_ . size ( ) > 0 ) {
2015-01-26 04:55:37 -06:00
gasFormationVolumeFactor_ [ globalDofIdx ] =
2016-01-29 04:57:41 -06:00
1.0 / FluidSystem : : template inverseFormationVolumeFactor < FluidState , Scalar > ( fs , gasPhaseIdx , pvtRegionIdx ) ;
2017-02-09 11:25:44 -06:00
Opm : : Valgrind : : CheckDefined ( gasFormationVolumeFactor_ [ globalDofIdx ] ) ;
2017-12-07 05:38:48 -06:00
2014-11-28 05:58:48 -06:00
}
2017-12-07 05:38:48 -06:00
if ( saturatedOilFormationVolumeFactor_ . size ( ) > 0 ) {
saturatedOilFormationVolumeFactor_ [ globalDofIdx ] =
1.0 / FluidSystem : : template saturatedInverseFormationVolumeFactor < FluidState , Scalar > ( fs , oilPhaseIdx , pvtRegionIdx ) ;
Opm : : Valgrind : : CheckDefined ( saturatedOilFormationVolumeFactor_ [ globalDofIdx ] ) ;
}
if ( oilSaturationPressure_ . size ( ) > 0 ) {
2014-11-28 05:58:48 -06:00
oilSaturationPressure_ [ globalDofIdx ] =
2015-12-31 06:20:41 -06:00
FluidSystem : : template saturationPressure < FluidState , Scalar > ( fs , oilPhaseIdx , pvtRegionIdx ) ;
2017-02-09 11:25:44 -06:00
Opm : : Valgrind : : CheckDefined ( oilSaturationPressure_ [ globalDofIdx ] ) ;
2017-12-07 05:38:48 -06:00
}
if ( rs_ . size ( ) ) {
2018-01-29 01:43:42 -06:00
rs_ [ globalDofIdx ] = Opm : : getValue ( fs . Rs ( ) ) ;
2017-12-07 05:38:48 -06:00
Opm : : Valgrind : : CheckDefined ( rs_ [ globalDofIdx ] ) ;
}
if ( rv_ . size ( ) ) {
2018-01-29 01:43:42 -06:00
rv_ [ globalDofIdx ] = Opm : : getValue ( fs . Rv ( ) ) ;
2017-12-07 05:38:48 -06:00
Opm : : Valgrind : : CheckDefined ( rv_ [ globalDofIdx ] ) ;
2014-11-28 05:58:48 -06:00
}
2017-12-07 05:38:48 -06:00
2018-01-09 07:01:30 -06:00
for ( unsigned phaseIdx = 0 ; phaseIdx < numPhases ; + + phaseIdx ) {
if ( invB_ [ phaseIdx ] . size ( ) = = 0 )
continue ;
2017-12-07 05:38:48 -06:00
2018-01-29 01:43:42 -06:00
invB_ [ phaseIdx ] [ globalDofIdx ] = Opm : : getValue ( fs . invB ( phaseIdx ) ) ;
2018-01-09 07:01:30 -06:00
Opm : : Valgrind : : CheckDefined ( invB_ [ phaseIdx ] [ globalDofIdx ] ) ;
2017-12-07 05:38:48 -06:00
}
2018-01-09 07:01:30 -06:00
for ( unsigned phaseIdx = 0 ; phaseIdx < numPhases ; + + phaseIdx ) {
if ( density_ [ phaseIdx ] . size ( ) = = 0 )
continue ;
2017-12-07 05:38:48 -06:00
2018-01-29 01:43:42 -06:00
density_ [ phaseIdx ] [ globalDofIdx ] = Opm : : getValue ( fs . density ( phaseIdx ) ) ;
2018-01-09 07:01:30 -06:00
Opm : : Valgrind : : CheckDefined ( density_ [ phaseIdx ] [ globalDofIdx ] ) ;
2017-12-07 05:38:48 -06:00
}
2018-01-09 07:01:30 -06:00
for ( unsigned phaseIdx = 0 ; phaseIdx < numPhases ; + + phaseIdx ) {
if ( viscosity_ [ phaseIdx ] . size ( ) = = 0 )
continue ;
2017-12-07 05:38:48 -06:00
2018-01-29 01:43:42 -06:00
viscosity_ [ phaseIdx ] [ globalDofIdx ] = Opm : : getValue ( fs . viscosity ( phaseIdx ) ) ;
2018-01-09 07:01:30 -06:00
Opm : : Valgrind : : CheckDefined ( viscosity_ [ phaseIdx ] [ globalDofIdx ] ) ;
2017-12-07 05:38:48 -06:00
}
2018-01-09 07:01:30 -06:00
for ( unsigned phaseIdx = 0 ; phaseIdx < numPhases ; + + phaseIdx ) {
if ( relativePermeability_ [ phaseIdx ] . size ( ) = = 0 )
continue ;
2017-12-07 05:38:48 -06:00
2018-01-29 01:43:42 -06:00
relativePermeability_ [ phaseIdx ] [ globalDofIdx ] = Opm : : getValue ( intQuants . relativePermeability ( phaseIdx ) ) ;
2018-01-09 07:01:30 -06:00
Opm : : Valgrind : : CheckDefined ( relativePermeability_ [ phaseIdx ] [ globalDofIdx ] ) ;
2017-12-07 05:38:48 -06:00
}
if ( sSol_ . size ( ) > 0 ) {
sSol_ [ globalDofIdx ] = intQuants . solventSaturation ( ) . value ( ) ;
}
if ( cPolymer_ . size ( ) > 0 ) {
cPolymer_ [ globalDofIdx ] = intQuants . polymerConcentration ( ) . value ( ) ;
}
2019-04-26 03:38:37 -05:00
if ( cFoam_ . size ( ) > 0 ) {
cFoam_ [ globalDofIdx ] = intQuants . foamConcentration ( ) . value ( ) ;
}
2019-11-07 02:39:42 -06:00
if ( cSalt_ . size ( ) > 0 ) {
2019-12-03 10:48:17 -06:00
cSalt_ [ globalDofIdx ] = fs . saltConcentration ( ) . value ( ) ;
2019-11-07 02:39:42 -06:00
}
2018-04-30 10:17:22 -05:00
if ( bubblePointPressure_ . size ( ) > 0 ) {
2017-12-07 05:38:48 -06:00
try {
2018-01-29 01:43:42 -06:00
bubblePointPressure_ [ globalDofIdx ] = Opm : : getValue ( FluidSystem : : bubblePointPressure ( fs , intQuants . pvtRegionIndex ( ) ) ) ;
2017-12-07 05:38:48 -06:00
}
2018-03-03 06:06:58 -06:00
catch ( const Opm : : NumericalIssue & ) {
2018-04-30 10:17:22 -05:00
const auto cartesianIdx = elemCtx . simulator ( ) . vanguard ( ) . grid ( ) . globalCell ( ) [ globalDofIdx ] ;
failedCellsPb_ . push_back ( cartesianIdx ) ;
2017-12-07 05:38:48 -06:00
}
}
2018-04-30 10:17:22 -05:00
if ( dewPointPressure_ . size ( ) > 0 ) {
2017-12-07 05:38:48 -06:00
try {
2018-01-29 01:43:42 -06:00
dewPointPressure_ [ globalDofIdx ] = Opm : : getValue ( FluidSystem : : dewPointPressure ( fs , intQuants . pvtRegionIndex ( ) ) ) ;
2017-12-07 05:38:48 -06:00
}
2018-03-03 06:06:58 -06:00
catch ( const Opm : : NumericalIssue & ) {
2018-04-30 10:17:22 -05:00
const auto cartesianIdx = elemCtx . simulator ( ) . vanguard ( ) . grid ( ) . globalCell ( ) [ globalDofIdx ] ;
failedCellsPd_ . push_back ( cartesianIdx ) ;
2017-12-07 05:38:48 -06:00
}
}
if ( soMax_ . size ( ) > 0 )
2019-03-12 09:51:41 -05:00
soMax_ [ globalDofIdx ] =
std : : max ( Opm : : getValue ( fs . saturation ( oilPhaseIdx ) ) ,
problem . maxOilSaturation ( globalDofIdx ) ) ;
if ( swMax_ . size ( ) > 0 )
swMax_ [ globalDofIdx ] =
std : : max ( Opm : : getValue ( fs . saturation ( waterPhaseIdx ) ) ,
problem . maxWaterSaturation ( globalDofIdx ) ) ;
if ( minimumOilPressure_ . size ( ) > 0 )
minimumOilPressure_ [ globalDofIdx ] =
std : : min ( Opm : : getValue ( fs . pressure ( oilPhaseIdx ) ) ,
problem . minOilPressure ( globalDofIdx ) ) ;
2017-12-07 05:38:48 -06:00
2019-03-12 09:51:41 -05:00
if ( overburdenPressure_ . size ( ) > 0 )
overburdenPressure_ [ globalDofIdx ] = problem . overburdenPressure ( globalDofIdx ) ;
if ( rockCompPorvMultiplier_ . size ( ) > 0 )
rockCompPorvMultiplier_ [ globalDofIdx ] = problem . template rockCompPoroMultiplier < Scalar > ( intQuants , globalDofIdx ) ;
if ( rockCompTransMultiplier_ . size ( ) > 0 )
rockCompTransMultiplier_ [ globalDofIdx ] = problem . template rockCompTransMultiplier < Scalar > ( intQuants , globalDofIdx ) ;
const auto & matLawManager = problem . materialLawManager ( ) ;
2018-01-09 07:01:30 -06:00
if ( matLawManager - > enableHysteresis ( ) ) {
if ( pcSwMdcOw_ . size ( ) > 0 & & krnSwMdcOw_ . size ( ) > 0 ) {
2017-12-07 05:38:48 -06:00
matLawManager - > oilWaterHysteresisParams (
pcSwMdcOw_ [ globalDofIdx ] ,
krnSwMdcOw_ [ globalDofIdx ] ,
globalDofIdx ) ;
2018-01-09 07:01:30 -06:00
}
if ( pcSwMdcGo_ . size ( ) > 0 & & krnSwMdcGo_ . size ( ) > 0 ) {
2017-12-07 05:38:48 -06:00
matLawManager - > gasOilHysteresisParams (
pcSwMdcGo_ [ globalDofIdx ] ,
krnSwMdcGo_ [ globalDofIdx ] ,
globalDofIdx ) ;
}
}
2018-09-07 03:19:00 -05:00
2020-01-13 08:46:50 -06:00
if ( ppcw_ . size ( ) > 0 ) {
2018-09-07 03:19:00 -05:00
ppcw_ [ globalDofIdx ] = matLawManager - > oilWaterScaledEpsInfoDrainage ( globalDofIdx ) . maxPcow ;
2020-01-13 08:46:50 -06:00
//printf("ppcw_[%d] = %lg\n", globalDofIdx, ppcw_[globalDofIdx]);
}
2017-12-07 05:38:48 -06:00
// hack to make the intial output of rs and rv Ecl compatible.
// For cells with swat == 1 Ecl outputs; rs = rsSat and rv=rvSat, in all but the initial step
// where it outputs rs and rv values calculated by the initialization. To be compatible we overwrite
// rs and rv with the values computed in the initially.
// Volume factors, densities and viscosities need to be recalculated with the updated rs and rv values.
// This can be removed when ebos has 100% controll over output
2018-04-30 10:17:22 -05:00
if ( elemCtx . simulator ( ) . episodeIndex ( ) < 0 & & FluidSystem : : phaseIsActive ( oilPhaseIdx ) & & FluidSystem : : phaseIsActive ( gasPhaseIdx ) ) {
2017-12-07 05:38:48 -06:00
2019-03-12 09:51:41 -05:00
const auto & fsInitial = problem . initialFluidState ( globalDofIdx ) ;
2017-12-07 05:38:48 -06:00
// use initial rs and rv values
2018-01-09 07:01:30 -06:00
if ( rv_ . size ( ) > 0 )
2018-04-30 10:17:22 -05:00
rv_ [ globalDofIdx ] = fsInitial . Rv ( ) ;
2018-01-09 07:01:30 -06:00
if ( rs_ . size ( ) > 0 )
2018-04-30 10:17:22 -05:00
rs_ [ globalDofIdx ] = fsInitial . Rs ( ) ;
2017-12-07 05:38:48 -06:00
// re-compute the volume factors, viscosities and densities if asked for
if ( density_ [ oilPhaseIdx ] . size ( ) > 0 )
2018-04-30 10:17:22 -05:00
density_ [ oilPhaseIdx ] [ globalDofIdx ] = FluidSystem : : density ( fsInitial ,
oilPhaseIdx ,
intQuants . pvtRegionIndex ( ) ) ;
2017-12-07 05:38:48 -06:00
if ( density_ [ gasPhaseIdx ] . size ( ) > 0 )
2018-04-30 10:17:22 -05:00
density_ [ gasPhaseIdx ] [ globalDofIdx ] = FluidSystem : : density ( fsInitial ,
gasPhaseIdx ,
intQuants . pvtRegionIndex ( ) ) ;
2017-12-07 05:38:48 -06:00
if ( invB_ [ oilPhaseIdx ] . size ( ) > 0 )
2018-04-30 10:17:22 -05:00
invB_ [ oilPhaseIdx ] [ globalDofIdx ] = FluidSystem : : inverseFormationVolumeFactor ( fsInitial ,
oilPhaseIdx ,
intQuants . pvtRegionIndex ( ) ) ;
2017-12-07 05:38:48 -06:00
if ( invB_ [ gasPhaseIdx ] . size ( ) > 0 )
2018-04-30 10:17:22 -05:00
invB_ [ gasPhaseIdx ] [ globalDofIdx ] = FluidSystem : : inverseFormationVolumeFactor ( fsInitial ,
gasPhaseIdx ,
intQuants . pvtRegionIndex ( ) ) ;
2017-12-07 05:38:48 -06:00
if ( viscosity_ [ oilPhaseIdx ] . size ( ) > 0 )
2018-04-30 10:17:22 -05:00
viscosity_ [ oilPhaseIdx ] [ globalDofIdx ] = FluidSystem : : viscosity ( fsInitial ,
oilPhaseIdx ,
intQuants . pvtRegionIndex ( ) ) ;
2017-12-07 05:38:48 -06:00
if ( viscosity_ [ gasPhaseIdx ] . size ( ) > 0 )
2018-04-30 10:17:22 -05:00
viscosity_ [ gasPhaseIdx ] [ globalDofIdx ] = FluidSystem : : viscosity ( fsInitial ,
gasPhaseIdx ,
intQuants . pvtRegionIndex ( ) ) ;
2017-12-07 05:38:48 -06:00
}
2018-01-29 01:43:42 -06:00
// Add fluid in Place values
updateFluidInPlace_ ( elemCtx , dofIdx ) ;
2018-01-12 08:32:43 -06:00
2018-02-09 05:57:34 -06:00
// Adding block data
2018-04-30 10:17:22 -05:00
const auto cartesianIdx = elemCtx . simulator ( ) . vanguard ( ) . grid ( ) . globalCell ( ) [ globalDofIdx ] ;
for ( auto & val : blockData_ ) {
2018-01-23 02:46:56 -06:00
const auto & key = val . first ;
2018-04-30 10:17:22 -05:00
int cartesianIdxBlock = key . second - 1 ;
if ( cartesianIdx = = cartesianIdxBlock ) {
if ( key . first = = " BWSAT " )
2018-01-29 01:43:42 -06:00
val . second = Opm : : getValue ( fs . saturation ( waterPhaseIdx ) ) ;
2018-04-30 10:17:22 -05:00
else if ( key . first = = " BGSAT " )
2018-01-29 01:43:42 -06:00
val . second = Opm : : getValue ( fs . saturation ( gasPhaseIdx ) ) ;
2019-06-03 04:11:41 -05:00
else if ( key . first = = " BOSAT " )
2019-04-12 09:48:27 -05:00
val . second = 1. - Opm : : getValue ( fs . saturation ( gasPhaseIdx ) ) - Opm : : getValue ( fs . saturation ( waterPhaseIdx ) ) ;
2018-04-30 10:17:22 -05:00
else if ( key . first = = " BPR " )
2018-01-29 01:43:42 -06:00
val . second = Opm : : getValue ( fs . pressure ( oilPhaseIdx ) ) ;
2019-06-03 04:11:41 -05:00
else if ( key . first = = " BWKR " | | key . first = = " BKRW " )
2019-04-12 09:48:27 -05:00
val . second = Opm : : getValue ( intQuants . relativePermeability ( waterPhaseIdx ) ) ;
2019-06-03 04:11:41 -05:00
else if ( key . first = = " BGKR " | | key . first = = " BKRG " )
2019-04-12 09:48:27 -05:00
val . second = Opm : : getValue ( intQuants . relativePermeability ( gasPhaseIdx ) ) ;
2019-06-03 04:11:41 -05:00
else if ( key . first = = " BOKR " | | key . first = = " BKRO " )
2019-04-12 09:48:27 -05:00
val . second = Opm : : getValue ( intQuants . relativePermeability ( oilPhaseIdx ) ) ;
2019-06-03 04:11:41 -05:00
else if ( key . first = = " BWPC " )
2019-04-12 09:48:27 -05:00
val . second = Opm : : getValue ( fs . pressure ( oilPhaseIdx ) ) - Opm : : getValue ( fs . pressure ( waterPhaseIdx ) ) ;
2019-06-03 04:11:41 -05:00
else if ( key . first = = " BGPC " )
2019-04-12 09:48:27 -05:00
val . second = Opm : : getValue ( fs . pressure ( gasPhaseIdx ) ) - Opm : : getValue ( fs . pressure ( oilPhaseIdx ) ) ;
2019-06-03 04:11:41 -05:00
else if ( key . first = = " BVWAT " | | key . first = = " BWVIS " )
2019-04-12 09:48:27 -05:00
val . second = Opm : : getValue ( fs . viscosity ( waterPhaseIdx ) ) ;
2019-06-03 04:11:41 -05:00
else if ( key . first = = " BVGAS " | | key . first = = " BGVIS " )
2019-04-12 09:48:27 -05:00
val . second = Opm : : getValue ( fs . viscosity ( gasPhaseIdx ) ) ;
2019-06-03 04:11:41 -05:00
else if ( key . first = = " BVOIL " | | key . first = = " BOVIS " )
2019-04-12 09:48:27 -05:00
val . second = Opm : : getValue ( fs . viscosity ( oilPhaseIdx ) ) ;
2018-04-30 10:17:22 -05:00
else {
2018-01-23 02:46:56 -06:00
std : : string logstring = " Keyword ' " ;
logstring . append ( key . first ) ;
logstring . append ( " ' is unhandled for output to file. " ) ;
Opm : : OpmLog : : warning ( " Unhandled output keyword " , logstring ) ;
2018-01-19 08:45:42 -06:00
}
}
}
2018-02-07 07:30:43 -06:00
// Adding Well RFT data
2018-06-28 08:49:45 -05:00
if ( oilConnectionPressures_ . count ( cartesianIdx ) > 0 ) {
oilConnectionPressures_ [ cartesianIdx ] = Opm : : getValue ( fs . pressure ( oilPhaseIdx ) ) ;
2018-02-07 07:30:43 -06:00
}
2018-06-28 08:49:45 -05:00
if ( waterConnectionSaturations_ . count ( cartesianIdx ) > 0 ) {
waterConnectionSaturations_ [ cartesianIdx ] = Opm : : getValue ( fs . saturation ( waterPhaseIdx ) ) ;
2018-02-07 07:30:43 -06:00
}
2018-06-28 08:49:45 -05:00
if ( gasConnectionSaturations_ . count ( cartesianIdx ) > 0 ) {
gasConnectionSaturations_ [ cartesianIdx ] = Opm : : getValue ( fs . saturation ( gasPhaseIdx ) ) ;
2018-02-07 07:30:43 -06:00
}
2018-11-14 06:10:01 -06:00
// tracers
const auto & tracerModel = simulator_ . problem ( ) . tracerModel ( ) ;
if ( tracerConcentrations_ . size ( ) > 0 ) {
for ( int tracerIdx = 0 ; tracerIdx < tracerModel . numTracers ( ) ; tracerIdx + + ) {
if ( tracerConcentrations_ [ tracerIdx ] . size ( ) = = 0 )
continue ;
tracerConcentrations_ [ tracerIdx ] [ globalDofIdx ] = tracerModel . tracerConcentration ( tracerIdx , globalDofIdx ) ;
}
}
2017-12-07 05:38:48 -06:00
}
}
void outputErrorLog ( )
{
const size_t maxNumCellsFaillog = 20 ;
2018-04-30 10:17:22 -05:00
int pbSize = failedCellsPb_ . size ( ) , pdSize = failedCellsPd_ . size ( ) ;
2017-12-07 05:38:48 -06:00
std : : vector < int > displPb , displPd , recvLenPb , recvLenPd ;
const auto & comm = simulator_ . gridView ( ) . comm ( ) ;
2018-04-30 10:17:22 -05:00
if ( isIORank_ ( ) ) {
2017-12-07 05:38:48 -06:00
displPb . resize ( comm . size ( ) + 1 , 0 ) ;
displPd . resize ( comm . size ( ) + 1 , 0 ) ;
recvLenPb . resize ( comm . size ( ) ) ;
recvLenPd . resize ( comm . size ( ) ) ;
}
comm . gather ( & pbSize , recvLenPb . data ( ) , 1 , 0 ) ;
2018-04-30 10:17:22 -05:00
comm . gather ( & pdSize , recvLenPd . data ( ) , 1 , 0 ) ;
2017-12-07 05:38:48 -06:00
std : : partial_sum ( recvLenPb . begin ( ) , recvLenPb . end ( ) , displPb . begin ( ) + 1 ) ;
std : : partial_sum ( recvLenPd . begin ( ) , recvLenPd . end ( ) , displPd . begin ( ) + 1 ) ;
std : : vector < int > globalFailedCellsPb , globalFailedCellsPd ;
2018-04-30 10:17:22 -05:00
if ( isIORank_ ( ) ) {
2017-12-07 05:38:48 -06:00
globalFailedCellsPb . resize ( displPb . back ( ) ) ;
globalFailedCellsPd . resize ( displPd . back ( ) ) ;
}
comm . gatherv ( failedCellsPb_ . data ( ) , static_cast < int > ( failedCellsPb_ . size ( ) ) ,
globalFailedCellsPb . data ( ) , recvLenPb . data ( ) ,
displPb . data ( ) , 0 ) ;
comm . gatherv ( failedCellsPd_ . data ( ) , static_cast < int > ( failedCellsPd_ . size ( ) ) ,
globalFailedCellsPd . data ( ) , recvLenPd . data ( ) ,
displPd . data ( ) , 0 ) ;
std : : sort ( globalFailedCellsPb . begin ( ) , globalFailedCellsPb . end ( ) ) ;
std : : sort ( globalFailedCellsPd . begin ( ) , globalFailedCellsPd . end ( ) ) ;
if ( globalFailedCellsPb . size ( ) > 0 ) {
std : : stringstream errlog ;
errlog < < " Finding the bubble point pressure failed for " < < globalFailedCellsPb . size ( ) < < " cells [ " ;
errlog < < globalFailedCellsPb [ 0 ] ;
2018-04-30 10:17:22 -05:00
const size_t maxElems = std : : min ( maxNumCellsFaillog , globalFailedCellsPb . size ( ) ) ;
for ( size_t i = 1 ; i < maxElems ; + + i ) {
2017-12-07 05:38:48 -06:00
errlog < < " , " < < globalFailedCellsPb [ i ] ;
}
if ( globalFailedCellsPb . size ( ) > maxNumCellsFaillog ) {
errlog < < " , ... " ;
}
errlog < < " ] " ;
Opm : : OpmLog : : warning ( " Bubble point numerical problem " , errlog . str ( ) ) ;
}
if ( globalFailedCellsPd . size ( ) > 0 ) {
std : : stringstream errlog ;
errlog < < " Finding the dew point pressure failed for " < < globalFailedCellsPd . size ( ) < < " cells [ " ;
errlog < < globalFailedCellsPd [ 0 ] ;
2018-04-30 10:17:22 -05:00
const size_t maxElems = std : : min ( maxNumCellsFaillog , globalFailedCellsPd . size ( ) ) ;
for ( size_t i = 1 ; i < maxElems ; + + i ) {
2017-12-07 05:38:48 -06:00
errlog < < " , " < < globalFailedCellsPd [ i ] ;
}
if ( globalFailedCellsPd . size ( ) > maxNumCellsFaillog ) {
errlog < < " , ... " ;
}
errlog < < " ] " ;
Opm : : OpmLog : : warning ( " Dew point numerical problem " , errlog . str ( ) ) ;
2014-11-28 05:58:48 -06:00
}
}
2018-02-07 07:30:43 -06:00
void addRftDataToWells ( Opm : : data : : Wells & wellDatas , size_t reportStepNum )
2018-03-12 08:31:36 -05:00
{
2019-04-04 00:27:39 -05:00
const auto & schedule = simulator_ . vanguard ( ) . schedule ( ) ;
const auto & rft_config = schedule . rftConfig ( ) ;
2019-11-13 16:16:11 -06:00
for ( const auto & well : schedule . getWells ( reportStepNum ) ) {
2018-02-07 07:30:43 -06:00
// don't bother with wells not on this process
2018-04-30 10:17:22 -05:00
const auto & defunctWellNames = simulator_ . vanguard ( ) . defunctWellNames ( ) ;
2019-05-02 05:51:25 -05:00
if ( defunctWellNames . find ( well . name ( ) ) ! = defunctWellNames . end ( ) ) {
2018-02-07 07:30:43 -06:00
continue ;
}
//add data infrastructure for shut wells
2019-05-02 05:51:25 -05:00
if ( ! wellDatas . count ( well . name ( ) ) ) {
2018-02-07 07:30:43 -06:00
Opm : : data : : Well wellData ;
2019-04-04 00:27:39 -05:00
if ( ! rft_config . active ( reportStepNum ) )
2018-02-07 07:30:43 -06:00
continue ;
2019-04-04 00:27:39 -05:00
2019-05-02 05:51:25 -05:00
wellData . connections . resize ( well . getConnections ( ) . size ( ) ) ;
2018-02-07 07:30:43 -06:00
size_t count = 0 ;
2019-05-02 05:51:25 -05:00
for ( const auto & connection : well . getConnections ( ) ) {
2018-06-28 08:49:45 -05:00
const size_t i = size_t ( connection . getI ( ) ) ;
const size_t j = size_t ( connection . getJ ( ) ) ;
const size_t k = size_t ( connection . getK ( ) ) ;
2018-02-07 07:30:43 -06:00
2020-02-25 05:33:15 -06:00
const size_t index = simulator_ . vanguard ( ) . eclState ( ) . gridDims ( ) . getGlobalIndex ( i , j , k ) ;
2018-06-28 08:49:45 -05:00
auto & connectionData = wellData . connections [ count ] ;
connectionData . index = index ;
2018-02-07 07:30:43 -06:00
count + + ;
}
2019-05-02 05:51:25 -05:00
wellDatas . emplace ( std : : make_pair ( well . name ( ) , wellData ) ) ;
2018-02-07 07:30:43 -06:00
}
2019-05-02 05:51:25 -05:00
Opm : : data : : Well & wellData = wellDatas . at ( well . name ( ) ) ;
2018-06-28 08:49:45 -05:00
for ( auto & connectionData : wellData . connections ) {
const auto index = connectionData . index ;
if ( oilConnectionPressures_ . count ( index ) > 0 )
connectionData . cell_pressure = oilConnectionPressures_ . at ( index ) ;
if ( waterConnectionSaturations_ . count ( index ) > 0 )
connectionData . cell_saturation_water = waterConnectionSaturations_ . at ( index ) ;
if ( gasConnectionSaturations_ . count ( index ) > 0 )
connectionData . cell_saturation_gas = gasConnectionSaturations_ . at ( index ) ;
2018-02-07 07:30:43 -06:00
}
}
2018-06-28 08:49:45 -05:00
oilConnectionPressures_ . clear ( ) ;
waterConnectionSaturations_ . clear ( ) ;
gasConnectionSaturations_ . clear ( ) ;
2018-02-07 07:30:43 -06:00
}
2014-11-28 05:58:48 -06:00
/*!
2018-01-09 04:28:20 -06:00
* \ brief Move all buffers to data : : Solution .
2014-11-28 05:58:48 -06:00
*/
2017-12-07 05:38:48 -06:00
void assignToSolution ( Opm : : data : : Solution & sol )
2014-11-28 05:58:48 -06:00
{
2019-09-05 10:04:39 -05:00
if ( ! std : : is_same < Discretization , Opm : : EcfvDiscretization < TypeTag > > : : value )
2014-11-28 05:58:48 -06:00
return ;
2018-04-30 10:17:22 -05:00
if ( oilPressure_ . size ( ) > 0 ) {
sol . insert ( " PRESSURE " , Opm : : UnitSystem : : measure : : pressure , std : : move ( oilPressure_ ) , Opm : : data : : TargetType : : RESTART_SOLUTION ) ;
2017-12-07 05:38:48 -06:00
}
2014-11-28 05:58:48 -06:00
2018-11-16 07:51:07 -06:00
if ( enableEnergy ) {
2018-04-30 10:17:22 -05:00
sol . insert ( " TEMP " , Opm : : UnitSystem : : measure : : temperature , std : : move ( temperature_ ) , Opm : : data : : TargetType : : RESTART_SOLUTION ) ;
2017-12-07 05:38:48 -06:00
}
2015-01-25 10:27:08 -06:00
2018-04-30 10:17:22 -05:00
if ( FluidSystem : : phaseIsActive ( waterPhaseIdx ) & & saturation_ [ waterPhaseIdx ] . size ( ) > 0 ) {
sol . insert ( " SWAT " , Opm : : UnitSystem : : measure : : identity , std : : move ( saturation_ [ waterPhaseIdx ] ) , Opm : : data : : TargetType : : RESTART_SOLUTION ) ;
2017-12-07 05:38:48 -06:00
}
2018-04-30 10:17:22 -05:00
if ( FluidSystem : : phaseIsActive ( gasPhaseIdx ) & & saturation_ [ gasPhaseIdx ] . size ( ) > 0 ) {
sol . insert ( " SGAS " , Opm : : UnitSystem : : measure : : identity , std : : move ( saturation_ [ gasPhaseIdx ] ) , Opm : : data : : TargetType : : RESTART_SOLUTION ) ;
2018-01-09 07:01:30 -06:00
}
2018-09-07 03:19:00 -05:00
if ( ppcw_ . size ( ) > 0 ) {
sol . insert ( " PPCW " , Opm : : UnitSystem : : measure : : pressure , std : : move ( ppcw_ ) , Opm : : data : : TargetType : : RESTART_SOLUTION ) ;
2018-09-04 02:07:18 -05:00
}
2018-01-09 07:01:30 -06:00
2018-04-30 10:17:22 -05:00
if ( gasDissolutionFactor_ . size ( ) > 0 ) {
sol . insert ( " RSSAT " , Opm : : UnitSystem : : measure : : gas_oil_ratio , std : : move ( gasDissolutionFactor_ ) , Opm : : data : : TargetType : : RESTART_AUXILIARY ) ;
2017-12-07 05:38:48 -06:00
}
2018-04-30 10:17:22 -05:00
if ( oilVaporizationFactor_ . size ( ) > 0 ) {
sol . insert ( " RVSAT " , Opm : : UnitSystem : : measure : : oil_gas_ratio , std : : move ( oilVaporizationFactor_ ) , Opm : : data : : TargetType : : RESTART_AUXILIARY ) ;
2017-12-07 05:38:48 -06:00
}
2018-04-30 10:17:22 -05:00
if ( rs_ . size ( ) > 0 ) {
sol . insert ( " RS " , Opm : : UnitSystem : : measure : : gas_oil_ratio , std : : move ( rs_ ) , Opm : : data : : TargetType : : RESTART_SOLUTION ) ;
2017-12-07 05:38:48 -06:00
}
2018-04-30 10:17:22 -05:00
if ( rv_ . size ( ) > 0 ) {
sol . insert ( " RV " , Opm : : UnitSystem : : measure : : oil_gas_ratio , std : : move ( rv_ ) , Opm : : data : : TargetType : : RESTART_SOLUTION ) ;
2017-12-07 05:38:48 -06:00
}
2018-04-30 10:17:22 -05:00
if ( invB_ [ waterPhaseIdx ] . size ( ) > 0 ) {
sol . insert ( " 1OVERBW " , Opm : : UnitSystem : : measure : : water_inverse_formation_volume_factor , std : : move ( invB_ [ waterPhaseIdx ] ) , Opm : : data : : TargetType : : RESTART_AUXILIARY ) ;
2017-12-07 05:38:48 -06:00
}
2018-04-30 10:17:22 -05:00
if ( invB_ [ oilPhaseIdx ] . size ( ) > 0 ) {
sol . insert ( " 1OVERBO " , Opm : : UnitSystem : : measure : : oil_inverse_formation_volume_factor , std : : move ( invB_ [ oilPhaseIdx ] ) , Opm : : data : : TargetType : : RESTART_AUXILIARY ) ;
2017-12-07 05:38:48 -06:00
}
2018-04-30 10:17:22 -05:00
if ( invB_ [ gasPhaseIdx ] . size ( ) > 0 ) {
sol . insert ( " 1OVERBG " , Opm : : UnitSystem : : measure : : gas_inverse_formation_volume_factor , std : : move ( invB_ [ gasPhaseIdx ] ) , Opm : : data : : TargetType : : RESTART_AUXILIARY ) ;
2017-12-07 05:38:48 -06:00
}
2018-01-09 07:01:30 -06:00
2018-04-30 10:17:22 -05:00
if ( density_ [ waterPhaseIdx ] . size ( ) > 0 ) {
sol . insert ( " WAT_DEN " , Opm : : UnitSystem : : measure : : density , std : : move ( density_ [ waterPhaseIdx ] ) , Opm : : data : : TargetType : : RESTART_AUXILIARY ) ;
2018-01-09 07:01:30 -06:00
}
2018-04-30 10:17:22 -05:00
if ( density_ [ oilPhaseIdx ] . size ( ) > 0 ) {
sol . insert ( " OIL_DEN " , Opm : : UnitSystem : : measure : : density , std : : move ( density_ [ oilPhaseIdx ] ) , Opm : : data : : TargetType : : RESTART_AUXILIARY ) ;
2018-01-09 07:01:30 -06:00
}
2018-04-30 10:17:22 -05:00
if ( density_ [ gasPhaseIdx ] . size ( ) > 0 ) {
sol . insert ( " GAS_DEN " , Opm : : UnitSystem : : measure : : density , std : : move ( density_ [ gasPhaseIdx ] ) , Opm : : data : : TargetType : : RESTART_AUXILIARY ) ;
2018-01-09 07:01:30 -06:00
}
2018-04-30 10:17:22 -05:00
if ( viscosity_ [ waterPhaseIdx ] . size ( ) > 0 ) {
sol . insert ( " WAT_VISC " , Opm : : UnitSystem : : measure : : viscosity , std : : move ( viscosity_ [ waterPhaseIdx ] ) , Opm : : data : : TargetType : : RESTART_AUXILIARY ) ;
2018-01-09 07:01:30 -06:00
}
2018-04-30 10:17:22 -05:00
if ( viscosity_ [ oilPhaseIdx ] . size ( ) > 0 ) {
sol . insert ( " OIL_VISC " , Opm : : UnitSystem : : measure : : viscosity , std : : move ( viscosity_ [ oilPhaseIdx ] ) , Opm : : data : : TargetType : : RESTART_AUXILIARY ) ;
2018-01-09 07:01:30 -06:00
}
2018-04-30 10:17:22 -05:00
if ( viscosity_ [ gasPhaseIdx ] . size ( ) > 0 ) {
sol . insert ( " GAS_VISC " , Opm : : UnitSystem : : measure : : viscosity , std : : move ( viscosity_ [ gasPhaseIdx ] ) , Opm : : data : : TargetType : : RESTART_AUXILIARY ) ;
2018-01-09 07:01:30 -06:00
}
if ( relativePermeability_ [ waterPhaseIdx ] . size ( ) > 0 ) {
2018-04-30 10:17:22 -05:00
sol . insert ( " WATKR " , Opm : : UnitSystem : : measure : : identity , std : : move ( relativePermeability_ [ waterPhaseIdx ] ) , Opm : : data : : TargetType : : RESTART_AUXILIARY ) ;
2018-01-09 07:01:30 -06:00
}
2018-04-30 10:17:22 -05:00
if ( relativePermeability_ [ oilPhaseIdx ] . size ( ) > 0 ) {
sol . insert ( " OILKR " , Opm : : UnitSystem : : measure : : identity , std : : move ( relativePermeability_ [ oilPhaseIdx ] ) , Opm : : data : : TargetType : : RESTART_AUXILIARY ) ;
2018-01-09 07:01:30 -06:00
}
2018-04-30 10:17:22 -05:00
if ( relativePermeability_ [ gasPhaseIdx ] . size ( ) > 0 ) {
sol . insert ( " GASKR " , Opm : : UnitSystem : : measure : : identity , std : : move ( relativePermeability_ [ gasPhaseIdx ] ) , Opm : : data : : TargetType : : RESTART_AUXILIARY ) ;
2017-12-07 05:38:48 -06:00
}
2018-09-07 03:19:00 -05:00
if ( pcSwMdcOw_ . size ( ) > 0 )
sol . insert ( " PCSWM_OW " , Opm : : UnitSystem : : measure : : identity , std : : move ( pcSwMdcOw_ ) , Opm : : data : : TargetType : : RESTART_AUXILIARY ) ;
2018-01-09 07:01:30 -06:00
if ( krnSwMdcOw_ . size ( ) > 0 )
2018-01-09 04:28:20 -06:00
sol . insert ( " KRNSW_OW " , Opm : : UnitSystem : : measure : : identity , std : : move ( krnSwMdcOw_ ) , Opm : : data : : TargetType : : RESTART_AUXILIARY ) ;
2018-01-09 07:01:30 -06:00
if ( pcSwMdcGo_ . size ( ) > 0 )
2018-01-09 04:28:20 -06:00
sol . insert ( " PCSWM_GO " , Opm : : UnitSystem : : measure : : identity , std : : move ( pcSwMdcGo_ ) , Opm : : data : : TargetType : : RESTART_AUXILIARY ) ;
2018-01-09 07:01:30 -06:00
if ( krnSwMdcGo_ . size ( ) > 0 )
2018-01-09 04:28:20 -06:00
sol . insert ( " KRNSW_GO " , Opm : : UnitSystem : : measure : : identity , std : : move ( krnSwMdcGo_ ) , Opm : : data : : TargetType : : RESTART_AUXILIARY ) ;
2017-12-07 05:38:48 -06:00
2018-01-09 07:01:30 -06:00
if ( soMax_ . size ( ) > 0 )
2018-01-09 04:28:20 -06:00
sol . insert ( " SOMAX " , Opm : : UnitSystem : : measure : : identity , std : : move ( soMax_ ) , Opm : : data : : TargetType : : RESTART_SOLUTION ) ;
2017-12-07 05:38:48 -06:00
2018-01-09 07:01:30 -06:00
if ( sSol_ . size ( ) > 0 )
2018-05-09 07:52:43 -05:00
sol . insert ( " SSOLVENT " , Opm : : UnitSystem : : measure : : identity , std : : move ( sSol_ ) , Opm : : data : : TargetType : : RESTART_SOLUTION ) ;
2017-12-07 05:38:48 -06:00
2018-01-09 07:01:30 -06:00
if ( cPolymer_ . size ( ) > 0 )
2018-01-09 04:28:20 -06:00
sol . insert ( " POLYMER " , Opm : : UnitSystem : : measure : : identity , std : : move ( cPolymer_ ) , Opm : : data : : TargetType : : RESTART_SOLUTION ) ;
2017-12-07 05:38:48 -06:00
2019-04-26 03:38:37 -05:00
if ( cFoam_ . size ( ) > 0 )
sol . insert ( " FOAM " , Opm : : UnitSystem : : measure : : identity , std : : move ( cFoam_ ) , Opm : : data : : TargetType : : RESTART_SOLUTION ) ;
2019-11-07 02:39:42 -06:00
if ( cSalt_ . size ( ) > 0 )
2020-08-18 02:16:40 -05:00
sol . insert ( " SALT " , Opm : : UnitSystem : : measure : : salinity , std : : move ( cSalt_ ) , Opm : : data : : TargetType : : RESTART_SOLUTION ) ;
2019-11-07 02:39:42 -06:00
2018-01-09 07:01:30 -06:00
if ( dewPointPressure_ . size ( ) > 0 )
2018-01-09 04:28:20 -06:00
sol . insert ( " PDEW " , Opm : : UnitSystem : : measure : : pressure , std : : move ( dewPointPressure_ ) , Opm : : data : : TargetType : : RESTART_AUXILIARY ) ;
2017-12-07 05:38:48 -06:00
2018-01-09 07:01:30 -06:00
if ( bubblePointPressure_ . size ( ) > 0 )
2018-01-09 04:28:20 -06:00
sol . insert ( " PBUB " , Opm : : UnitSystem : : measure : : pressure , std : : move ( bubblePointPressure_ ) , Opm : : data : : TargetType : : RESTART_AUXILIARY ) ;
2017-12-07 05:38:48 -06:00
2019-03-12 09:51:41 -05:00
if ( swMax_ . size ( ) > 0 )
sol . insert ( " SWMAX " , Opm : : UnitSystem : : measure : : identity , std : : move ( swMax_ ) , Opm : : data : : TargetType : : RESTART_SOLUTION ) ;
if ( minimumOilPressure_ . size ( ) > 0 )
sol . insert ( " PRESROCC " , Opm : : UnitSystem : : measure : : pressure , std : : move ( minimumOilPressure_ ) , Opm : : data : : TargetType : : RESTART_SOLUTION ) ;
if ( overburdenPressure_ . size ( ) > 0 )
sol . insert ( " PRES_OVB " , Opm : : UnitSystem : : measure : : pressure , std : : move ( overburdenPressure_ ) , Opm : : data : : TargetType : : RESTART_SOLUTION ) ;
if ( rockCompPorvMultiplier_ . size ( ) > 0 )
sol . insert ( " PORV_RC " , Opm : : UnitSystem : : measure : : identity , std : : move ( rockCompPorvMultiplier_ ) , Opm : : data : : TargetType : : RESTART_SOLUTION ) ;
if ( rockCompTransMultiplier_ . size ( ) > 0 )
sol . insert ( " TMULT_RC " , Opm : : UnitSystem : : measure : : identity , std : : move ( rockCompTransMultiplier_ ) , Opm : : data : : TargetType : : RESTART_SOLUTION ) ;
2018-01-12 08:32:43 -06:00
// Fluid in place
2020-09-07 03:22:42 -05:00
for ( int i = 0 ; i < FipDataType : : numFipTypes ; i + + ) {
2018-01-22 06:38:50 -06:00
if ( outputFipRestart_ & & fip_ [ i ] . size ( ) > 0 ) {
2020-09-07 03:22:42 -05:00
sol . insert ( FipDataType : : EclString ( i ) ,
2018-01-12 08:32:43 -06:00
Opm : : UnitSystem : : measure : : volume ,
2018-04-30 10:17:22 -05:00
fip_ [ i ] ,
2018-01-12 08:32:43 -06:00
Opm : : data : : TargetType : : SUMMARY ) ;
}
}
2018-11-14 06:10:01 -06:00
// tracers
const auto & tracerModel = simulator_ . problem ( ) . tracerModel ( ) ;
2019-02-01 10:33:30 -06:00
if ( tracerConcentrations_ . size ( ) > 0 ) {
2018-11-14 06:10:01 -06:00
for ( int tracerIdx = 0 ; tracerIdx < tracerModel . numTracers ( ) ; tracerIdx + + ) {
std : : string tmp = tracerModel . tracerName ( tracerIdx ) + " F " ;
2019-02-01 10:33:30 -06:00
sol . insert ( tmp , Opm : : UnitSystem : : measure : : identity , std : : move ( tracerConcentrations_ [ tracerIdx ] ) , Opm : : data : : TargetType : : RESTART_SOLUTION ) ;
2018-11-14 06:10:01 -06:00
}
}
2018-01-12 08:32:43 -06:00
}
2020-09-07 03:22:42 -05:00
int regionMax ( const std : : vector < int > & region ) {
const auto max_value = region . empty ( ) ? 0 : * std : : max_element ( region . begin ( ) , region . end ( ) ) ;
return this - > simulator_ . gridView ( ) . comm ( ) . max ( max_value ) ;
}
RegionSum makeRegionSum ( const std : : vector < int > & region , bool is_fipnum ) {
RegionSum rsum ;
rsum . ntFip = this - > regionMax ( region ) ;
2018-01-12 08:32:43 -06:00
// sum values over each region
2020-09-07 03:22:42 -05:00
rsum . regPressurePv = this - > regionSum ( this - > pressureTimesPoreVolume_ , region , rsum . ntFip ) ;
rsum . regPvHydrocarbon = this - > regionSum ( this - > hydrocarbonPoreVolume_ , region , rsum . ntFip ) ;
rsum . regPressurePvHydrocarbon = this - > regionSum ( pressureTimesHydrocarbonVolume_ , region , rsum . ntFip ) ;
for ( int fip_type = 0 ; fip_type < FipDataType : : numFipTypes ; fip_type + + )
rsum . regFipValues [ fip_type ] = this - > regionSum ( this - > fip_ [ fip_type ] , region , rsum . ntFip ) ;
2018-01-12 08:32:43 -06:00
// sum all region values to compute the field total
2020-09-07 03:22:42 -05:00
rsum . fieldPressurePv = sum ( rsum . regPressurePv ) ;
rsum . fieldPvHydrocarbon = sum ( rsum . regPvHydrocarbon ) ;
rsum . fieldPressurePvHydrocarbon = sum ( rsum . regPressurePvHydrocarbon ) ;
for ( int fip_type = 0 ; fip_type < FipDataType : : numFipTypes ; fip_type + + ) {
const auto & regionFip = rsum . regFipValues [ fip_type ] ;
rsum . fieldFipValues [ fip_type ] = sum ( regionFip ) ;
}
if ( is_fipnum ) {
// The first time the outputFipLog function is run we store the inplace values in
// the initialInplace_ member. This has at least two problems:
//
// o We really want the *initial* value - now we get the value after
// the first timestep.
//
// o For restarted runs this is obviously wrong.
//
// Finally it is of course not desirable to mutate state in an output
// routine.
if ( ! this - > regionInitialInplace_ ) {
this - > regionInitialInplace_ . emplace ( ) ;
for ( int fip_type = 0 ; fip_type < FipDataType : : numFipTypes ; fip_type + + )
this - > regionInitialInplace_ . value ( ) [ fip_type ] = rsum . regFipValues [ fip_type ] ;
}
if ( ! this - > fieldInitialInplace_ )
this - > fieldInitialInplace_ = rsum . fieldFipValues ;
}
return rsum ;
}
std : : unordered_map < std : : string , RegionSum > accumulateRegionSums ( ) {
std : : unordered_map < std : : string , RegionSum > rsum_map ;
2018-02-01 09:26:58 -06:00
const Opm : : SummaryConfig summaryConfig = simulator_ . vanguard ( ) . summaryConfig ( ) ;
2020-09-07 03:22:42 -05:00
rsum_map . emplace ( " FIPNUM " , makeRegionSum ( this - > regions_ . at ( " FIPNUM " ) , true ) ) ;
for ( const auto & fip_region : summaryConfig . fip_regions ( ) ) {
if ( fip_region = = " FIPNUM " )
continue ;
const auto & region = this - > regions_ . at ( fip_region ) ;
rsum_map . emplace ( fip_region , makeRegionSum ( region , false ) ) ;
}
return rsum_map ;
}
Scalar sum ( const ScalarBuffer & v ) {
return std : : accumulate ( v . begin ( ) , v . end ( ) , Scalar { 0 } ) ;
}
void updateSummaryRegionValues ( const std : : unordered_map < std : : string , RegionSum > & rsum_map ,
std : : map < std : : string , double > & miscSummaryData ,
std : : map < std : : string , std : : vector < double > > & regionData ) const {
const Opm : : SummaryConfig summaryConfig = simulator_ . vanguard ( ) . summaryConfig ( ) ;
// The field summary vectors should only use the FIPNUM based region sum.
{
const auto & rsum = rsum_map . at ( " FIPNUM " ) ;
for ( int fip_type = 0 ; fip_type < FipDataType : : numFipTypes ; fip_type + + ) {
std : : string key = " F " + FipDataType : : EclString ( fip_type ) ;
2018-01-17 08:24:24 -06:00
if ( summaryConfig . hasKeyword ( key ) )
2020-09-07 03:22:42 -05:00
miscSummaryData [ key ] = rsum . fieldFipValues [ fip_type ] ;
2018-01-12 08:32:43 -06:00
}
2020-09-07 03:22:42 -05:00
if ( summaryConfig . hasKeyword ( " FOE " ) & & this - > fieldInitialInplace_ )
miscSummaryData [ " FOE " ] = rsum . fieldFipValues [ FipDataType : : OilInPlace ]
/ this - > fieldInitialInplace_ . value ( ) [ FipDataType : : OilInPlace ] ;
2018-01-12 08:32:43 -06:00
2018-01-17 08:24:24 -06:00
if ( summaryConfig . hasKeyword ( " FPR " ) )
2020-09-07 03:22:42 -05:00
miscSummaryData [ " FPR " ] = pressureAverage_ ( rsum . fieldPressurePvHydrocarbon ,
rsum . fieldPvHydrocarbon ,
rsum . fieldPressurePv ,
rsum . fieldFipValues [ FipDataType : : PoreVolume ] ,
true ) ;
2018-01-12 08:32:43 -06:00
2018-01-17 08:24:24 -06:00
if ( summaryConfig . hasKeyword ( " FPRP " ) )
2020-09-07 03:22:42 -05:00
miscSummaryData [ " FPRP " ] = pressureAverage_ ( rsum . fieldPressurePvHydrocarbon ,
rsum . fieldPvHydrocarbon ,
rsum . fieldPressurePv ,
rsum . fieldFipValues [ FipDataType : : PoreVolume ] ,
false ) ;
2018-01-12 08:32:43 -06:00
2020-09-07 03:22:42 -05:00
}
// The region summary vectors should loop through the FIPxxx regions to
// support the RPR__xxx summary keywords.
{
for ( int fip_type = 0 ; fip_type < FipDataType : : numFipTypes ; fip_type + + ) {
for ( const auto & node : this - > regionNodes_ [ fip_type ] ) {
const auto & rsum = rsum_map . at ( node . fip_region ( ) ) ;
regionData [ node . keyword ( ) ] = rsum . regFipValues [ fip_type ] ;
}
2018-01-17 08:24:24 -06:00
}
2020-09-07 03:22:42 -05:00
// The exact same quantity is calculated for RPR and RPRP - is that correct?
for ( const auto & node : this - > RPRNodes_ ) {
const auto & rsum = rsum_map . at ( node . fip_region ( ) ) ;
regionData [ node . keyword ( ) ] = pressureAverage_ ( rsum . regPressurePvHydrocarbon ,
rsum . regPvHydrocarbon ,
rsum . regPressurePv ,
rsum . regFipValues [ FipDataType : : PoreVolume ] ,
true ) ;
}
2018-01-17 08:24:24 -06:00
2020-09-07 03:22:42 -05:00
for ( const auto & node : this - > RPRPNodes_ ) {
const auto & rsum = rsum_map . at ( node . fip_region ( ) ) ;
regionData [ node . keyword ( ) ] = pressureAverage_ ( rsum . regPressurePvHydrocarbon ,
rsum . regPvHydrocarbon ,
rsum . regPressurePv ,
rsum . regFipValues [ FipDataType : : PoreVolume ] ,
false ) ;
}
}
}
2018-01-17 08:24:24 -06:00
2020-09-07 03:22:42 -05:00
void outputFipLogImpl ( const RegionSum & rsum ) const {
{
Scalar fieldHydroCarbonPoreVolumeAveragedPressure = pressureAverage_ ( rsum . fieldPressurePvHydrocarbon ,
rsum . fieldPvHydrocarbon ,
rsum . fieldPressurePv ,
rsum . fieldFipValues [ FipDataType : : PoreVolume ] ,
true ) ;
std : : array < Scalar , FipDataType : : numFipTypes > initial_values = * this - > fieldInitialInplace_ ;
std : : array < Scalar , FipDataType : : numFipTypes > current_values = rsum . fieldFipValues ;
fipUnitConvert_ ( initial_values ) ;
fipUnitConvert_ ( current_values ) ;
pressureUnitConvert_ ( fieldHydroCarbonPoreVolumeAveragedPressure ) ;
outputRegionFluidInPlace_ ( initial_values ,
current_values ,
fieldHydroCarbonPoreVolumeAveragedPressure ) ;
}
for ( size_t reg = 0 ; reg < rsum . ntFip ; + + reg ) {
std : : array < Scalar , FipDataType : : numFipTypes > initial_values ;
std : : array < Scalar , FipDataType : : numFipTypes > current_values ;
for ( std : : size_t fip_type = 0 ; fip_type < FipDataType : : numFipTypes ; fip_type + + ) {
initial_values [ fip_type ] = this - > regionInitialInplace_ . value ( ) [ fip_type ] [ reg ] ;
current_values [ fip_type ] = rsum . regFipValues [ fip_type ] [ reg ] ;
2018-01-12 08:32:43 -06:00
}
2020-09-07 03:22:42 -05:00
fipUnitConvert_ ( initial_values ) ;
fipUnitConvert_ ( current_values ) ;
Scalar regHydroCarbonPoreVolumeAveragedPressure
= pressureAverage_ ( rsum . regPressurePvHydrocarbon [ reg ] ,
rsum . regPvHydrocarbon [ reg ] ,
rsum . regPressurePv [ reg ] ,
rsum . regFipValues [ FipDataType : : PoreVolume ] [ reg ] ,
true ) ;
pressureUnitConvert_ ( regHydroCarbonPoreVolumeAveragedPressure ) ;
outputRegionFluidInPlace_ ( initial_values , current_values , regHydroCarbonPoreVolumeAveragedPressure , reg + 1 ) ;
2018-01-12 08:32:43 -06:00
}
2020-09-07 03:22:42 -05:00
}
2018-01-17 08:24:24 -06:00
2020-09-07 03:22:42 -05:00
// write Fluid In Place to output log
void outputFipLog ( std : : map < std : : string , double > & miscSummaryData , std : : map < std : : string , std : : vector < double > > & regionData , const bool substep )
{
auto rsum_map = this - > accumulateRegionSums ( ) ;
if ( ! isIORank_ ( ) )
return ;
updateSummaryRegionValues ( rsum_map ,
miscSummaryData ,
regionData ) ;
if ( ! substep )
outputFipLogImpl ( rsum_map . at ( " FIPNUM " ) ) ;
2018-01-12 08:32:43 -06:00
}
2019-10-30 11:51:49 -05:00
2020-09-07 03:22:42 -05:00
2020-09-10 02:42:52 -05:00
// write production report to output
void outputProdLog ( size_t reportStepNum , const bool substep , bool forceDisableProdOutput )
2019-10-26 06:13:44 -05:00
{
2019-11-01 06:56:20 -05:00
if ( ! substep ) {
2020-09-10 02:42:52 -05:00
2019-11-01 06:56:20 -05:00
ScalarBuffer tmp_values ( WellProdDataType : : numWPValues , 0.0 ) ;
StringBuffer tmp_names ( WellProdDataType : : numWPNames , " " ) ;
outputProductionReport_ ( tmp_values , tmp_names , forceDisableProdOutput ) ;
2020-09-10 02:42:52 -05:00
const auto & st = simulator_ . vanguard ( ) . summaryState ( ) ;
2019-11-01 06:56:20 -05:00
const auto & schedule = simulator_ . vanguard ( ) . schedule ( ) ;
2020-09-10 02:42:52 -05:00
2019-11-01 06:56:20 -05:00
for ( const auto & gname : schedule . groupNames ( ) ) {
2020-09-10 02:42:52 -05:00
auto gName = static_cast < std : : string > ( gname ) ;
2019-11-01 06:56:20 -05:00
auto get = [ & st , & gName ] ( const std : : string & vector )
{
const auto key = vector + ' : ' + gName ;
2019-10-30 08:09:51 -05:00
2019-11-01 06:56:20 -05:00
return st . has ( key ) ? st . get ( key ) : 0.0 ;
2020-09-10 02:42:52 -05:00
} ;
2019-11-01 06:56:20 -05:00
tmp_names [ 0 ] = gname ;
2020-09-10 02:42:52 -05:00
tmp_values [ 2 ] = get ( " GOPR " ) ; //WellProdDataType::OilRate
2019-11-01 06:56:20 -05:00
tmp_values [ 3 ] = get ( " GWPR " ) ; //WellProdDataType::WaterRate
tmp_values [ 4 ] = get ( " GGPR " ) ; //WellProdDataType::GasRate
tmp_values [ 5 ] = get ( " GVPR " ) ; //WellProdDataType::FluidResVol
tmp_values [ 6 ] = get ( " GWCT " ) ; //WellProdDataType::WaterCut
tmp_values [ 7 ] = get ( " GGOR " ) ; //WellProdDataType::GasOilRatio
2020-09-10 02:42:52 -05:00
tmp_values [ 8 ] = get ( " GWPR " ) / get ( " GGPR " ) ; //WellProdDataType::WaterGasRatio
outputProductionReport_ ( tmp_values , tmp_names , forceDisableProdOutput ) ;
2019-11-01 06:56:20 -05:00
}
2020-09-10 02:42:52 -05:00
2019-11-01 06:56:20 -05:00
for ( const auto & wname : schedule . wellNames ( reportStepNum ) ) {
2020-09-10 02:42:52 -05:00
// don't bother with wells not on this process
const auto & defunctWellNames = simulator_ . vanguard ( ) . defunctWellNames ( ) ;
2019-11-01 06:56:20 -05:00
if ( defunctWellNames . find ( wname ) ! = defunctWellNames . end ( ) ) {
continue ;
}
2020-09-10 02:42:52 -05:00
const auto & well = schedule . getWell ( wname , reportStepNum ) ;
// Ignore injector wells
if ( well . isInjector ( ) ) {
2019-11-01 06:56:20 -05:00
continue ;
}
2020-09-10 02:42:52 -05:00
2019-11-01 06:56:20 -05:00
tmp_names [ 0 ] = wname ; //WellProdDataType::WellName
2020-09-10 02:42:52 -05:00
auto wName = static_cast < std : : string > ( wname ) ;
2019-11-01 06:56:20 -05:00
auto get = [ & st , & wName ] ( const std : : string & vector )
{
const auto key = vector + ' : ' + wName ;
return st . has ( key ) ? st . get ( key ) : 0.0 ;
} ;
2020-09-10 02:42:52 -05:00
2019-11-01 06:56:20 -05:00
const auto & controls = well . productionControls ( st ) ;
2019-11-13 16:16:11 -06:00
using CMode = : : Opm : : Well : : ProducerCMode ;
2020-09-10 02:42:52 -05:00
2019-11-01 06:56:20 -05:00
auto fctl = [ ] ( const auto wmctl ) - > std : : string
{
switch ( wmctl ) {
case CMode : : ORAT : return " ORAT " ;
case CMode : : WRAT : return " WRAT " ;
case CMode : : GRAT : return " GRAT " ;
case CMode : : LRAT : return " LRAT " ;
case CMode : : RESV : return " RESV " ;
case CMode : : THP : return " THP " ;
case CMode : : BHP : return " BHP " ;
case CMode : : CRAT : return " CRate " ;
case CMode : : GRUP : return " GRUP " ;
default :
{
return " none " ;
}
}
} ;
tmp_names [ 1 ] = fctl ( controls . cmode ) ; //WellProdDataType::CTRLMode
2020-09-10 02:42:52 -05:00
2019-11-01 06:56:20 -05:00
tmp_values [ 0 ] = well . getHeadI ( ) + 1 ; //WellProdDataType::WellLocationi
tmp_values [ 1 ] = well . getHeadJ ( ) + 1 ; //WellProdDataType::WellLocationj
2020-09-10 02:42:52 -05:00
tmp_values [ 2 ] = get ( " WOPR " ) ; //WellProdDataType::OilRate
2019-11-01 06:56:20 -05:00
tmp_values [ 3 ] = get ( " WWPR " ) ; //WellProdDataType::WaterRate
tmp_values [ 4 ] = get ( " WGPR " ) ; //WellProdDataType::GasRate
tmp_values [ 5 ] = get ( " WVPR " ) ; //WellProdDataType::FluidResVol
tmp_values [ 6 ] = get ( " WWCT " ) ; //WellProdDataType::WaterCut
tmp_values [ 7 ] = get ( " WGOR " ) ; //WellProdDataType::GasOilRatio
2020-09-10 02:42:52 -05:00
tmp_values [ 8 ] = get ( " WWPR " ) / get ( " WGPR " ) ; //WellProdDataType::WaterGasRatio
2019-11-01 06:56:20 -05:00
tmp_values [ 9 ] = get ( " WBHP " ) ; //WellProdDataType::BHP
tmp_values [ 10 ] = get ( " WTHP " ) ; //WellProdDataType::THP
2020-09-10 02:42:52 -05:00
//tmp_values[11] = 0; //WellProdDataType::SteadyStatePI //
outputProductionReport_ ( tmp_values , tmp_names , forceDisableProdOutput ) ;
2019-11-01 06:56:20 -05:00
}
}
2019-10-26 06:13:44 -05:00
}
2020-09-10 02:42:52 -05:00
// write injection report to output
2019-10-26 06:13:44 -05:00
void outputInjLog ( size_t reportStepNum , const bool substep , bool forceDisableInjOutput )
{
2020-09-10 02:42:52 -05:00
if ( ! substep ) {
2019-11-01 06:56:20 -05:00
ScalarBuffer tmp_values ( WellInjDataType : : numWIValues , 0.0 ) ;
StringBuffer tmp_names ( WellInjDataType : : numWINames , " " ) ;
outputInjectionReport_ ( tmp_values , tmp_names , forceDisableInjOutput ) ;
2020-09-10 02:42:52 -05:00
2019-11-01 06:56:20 -05:00
const auto & st = simulator_ . vanguard ( ) . summaryState ( ) ;
const auto & schedule = simulator_ . vanguard ( ) . schedule ( ) ;
for ( const auto & gname : schedule . groupNames ( ) ) {
2020-09-10 02:42:52 -05:00
auto gName = static_cast < std : : string > ( gname ) ;
2019-11-01 06:56:20 -05:00
auto get = [ & st , & gName ] ( const std : : string & vector )
{
const auto key = vector + ' : ' + gName ;
2019-10-30 08:09:51 -05:00
2019-11-01 06:56:20 -05:00
return st . has ( key ) ? st . get ( key ) : 0.0 ;
2020-09-10 02:42:52 -05:00
} ;
tmp_names [ 0 ] = gname ;
tmp_values [ 2 ] = get ( " GOIR " ) ; //WellInjDataType::OilRate
2019-11-01 06:56:20 -05:00
tmp_values [ 3 ] = get ( " GWIR " ) ; //WellInjDataType::WaterRate
2020-09-10 02:42:52 -05:00
tmp_values [ 4 ] = get ( " GGIR " ) ; //WellInjDataType::GasRate
tmp_values [ 5 ] = get ( " GVIR " ) ; //WellInjDataType::FluidResVol
outputInjectionReport_ ( tmp_values , tmp_names , forceDisableInjOutput ) ;
2019-11-01 06:56:20 -05:00
}
2020-09-10 02:42:52 -05:00
2019-11-01 06:56:20 -05:00
for ( const auto & wname : schedule . wellNames ( reportStepNum ) ) {
2020-09-10 02:42:52 -05:00
// don't bother with wells not on this process
const auto & defunctWellNames = simulator_ . vanguard ( ) . defunctWellNames ( ) ;
2019-11-01 06:56:20 -05:00
if ( defunctWellNames . find ( wname ) ! = defunctWellNames . end ( ) ) {
continue ;
}
2020-09-10 02:42:52 -05:00
const auto & well = schedule . getWell ( wname , reportStepNum ) ;
// Ignore Producer wells
if ( well . isProducer ( ) ) {
2019-11-01 06:56:20 -05:00
continue ;
}
2020-09-10 02:42:52 -05:00
tmp_names [ 0 ] = wname ; //WellInjDataType::WellName
auto wName = static_cast < std : : string > ( wname ) ;
2019-11-01 06:56:20 -05:00
auto get = [ & st , & wName ] ( const std : : string & vector )
{
const auto key = vector + ' : ' + wName ;
return st . has ( key ) ? st . get ( key ) : 0.0 ;
2020-09-10 02:42:52 -05:00
} ;
2019-11-01 06:56:20 -05:00
const auto & controls = well . injectionControls ( st ) ;
const auto ctlMode = controls . cmode ;
2020-09-10 02:42:52 -05:00
const auto injType = controls . injector_type ;
2019-11-13 16:16:11 -06:00
using CMode = : : Opm : : Well : : InjectorCMode ;
2020-03-03 02:08:02 -06:00
using WType = : : Opm : : InjectorType ;
2020-09-10 02:42:52 -05:00
2019-11-01 06:56:20 -05:00
auto ftype = [ ] ( const auto wtype ) - > std : : string
{
switch ( wtype ) {
case WType : : OIL : return " Oil " ;
case WType : : WATER : return " Wat " ;
case WType : : GAS : return " Gas " ;
2020-09-10 02:42:52 -05:00
case WType : : MULTI : return " Multi " ;
2019-11-01 06:56:20 -05:00
default :
{
return " " ;
}
}
} ;
2020-09-10 02:42:52 -05:00
2019-11-01 06:56:20 -05:00
auto fctl = [ ] ( const auto wmctl ) - > std : : string
{
switch ( wmctl ) {
case CMode : : RATE : return " RATE " ;
case CMode : : RESV : return " RESV " ;
case CMode : : THP : return " THP " ;
case CMode : : BHP : return " BHP " ;
case CMode : : GRUP : return " GRUP " ;
default :
{
return " " ;
}
}
} ;
2020-09-10 02:42:52 -05:00
2019-11-01 06:56:20 -05:00
const auto flowtype = ftype ( injType ) ;
const auto flowctl = fctl ( ctlMode ) ;
if ( flowtype = = " Oil " ) //WellInjDataType::CTRLModeOil
2020-09-10 02:42:52 -05:00
{
2019-11-01 06:56:20 -05:00
if ( flowctl = = " RATE " ) { tmp_names [ 1 ] = " ORAT " ; }
else { tmp_names [ 1 ] = flowctl ; }
2020-09-10 02:42:52 -05:00
}
2019-11-01 06:56:20 -05:00
else if ( flowtype = = " Wat " ) //WellInjDataType::CTRLModeWat
{
if ( flowctl = = " RATE " ) { tmp_names [ 3 ] = " WRAT " ; }
else { tmp_names [ 2 ] = flowctl ; }
2020-09-10 02:42:52 -05:00
}
2019-11-01 06:56:20 -05:00
else if ( flowtype = = " Gas " ) //WellInjDataType::CTRLModeGas
{
if ( flowctl = = " RATE " ) { tmp_names [ 3 ] = " GRAT " ; }
else { tmp_names [ 3 ] = flowctl ; }
2020-09-10 02:42:52 -05:00
}
2019-11-01 06:56:20 -05:00
tmp_values [ 0 ] = well . getHeadI ( ) + 1 ; //WellInjDataType::wellLocationi
2020-09-10 02:42:52 -05:00
tmp_values [ 1 ] = well . getHeadJ ( ) + 1 ; //WellInjDataType::wellLocationj
2019-11-01 06:56:20 -05:00
tmp_values [ 2 ] = get ( " WOIR " ) ; //WellInjDataType::OilRate
tmp_values [ 3 ] = get ( " WWIR " ) ; //WellInjDataType::WaterRate
2020-09-10 02:42:52 -05:00
tmp_values [ 4 ] = get ( " WGIR " ) ; //WellInjDataType::GasRate
tmp_values [ 5 ] = get ( " WVIR " ) ; //WellInjDataType::FluidResVol
2019-11-01 06:56:20 -05:00
tmp_values [ 6 ] = get ( " WBHP " ) ; //WellInjDataType::BHP
tmp_values [ 7 ] = get ( " WTHP " ) ; //WellInjDataType::THP
//tmp_values[8] = 0; //WellInjDataType::SteadyStateII
2020-09-10 02:42:52 -05:00
outputInjectionReport_ ( tmp_values , tmp_names , forceDisableInjOutput ) ;
2019-11-01 06:56:20 -05:00
}
}
2019-10-26 06:13:44 -05:00
}
2020-09-10 02:42:52 -05:00
2019-10-26 06:13:44 -05:00
// write cumulative production and injection reports to output
2019-11-01 06:56:20 -05:00
void outputCumLog ( size_t reportStepNum , const bool substep , bool forceDisableCumOutput )
2019-10-26 06:13:44 -05:00
{
2020-09-10 02:42:52 -05:00
if ( ! substep ) {
2019-11-01 06:56:20 -05:00
ScalarBuffer tmp_values ( WellCumDataType : : numWCValues , 0.0 ) ;
StringBuffer tmp_names ( WellCumDataType : : numWCNames , " " ) ;
outputCumulativeReport_ ( tmp_values , tmp_names , forceDisableCumOutput ) ;
2020-09-10 02:42:52 -05:00
2019-11-01 06:56:20 -05:00
const auto & st = simulator_ . vanguard ( ) . summaryState ( ) ;
const auto & schedule = simulator_ . vanguard ( ) . schedule ( ) ;
2020-09-10 02:42:52 -05:00
2019-11-01 06:56:20 -05:00
for ( const auto & gname : schedule . groupNames ( ) ) {
2020-09-10 02:42:52 -05:00
auto gName = static_cast < std : : string > ( gname ) ;
2019-11-01 06:56:20 -05:00
auto get = [ & st , & gName ] ( const std : : string & vector )
{
const auto key = vector + ' : ' + gName ;
return st . has ( key ) ? st . get ( key ) : 0.0 ;
2020-09-10 02:42:52 -05:00
} ;
tmp_names [ 0 ] = gname ;
2019-11-01 06:56:20 -05:00
tmp_values [ 2 ] = get ( " GOPT " ) ; //WellCumDataType::OilProd
tmp_values [ 3 ] = get ( " GWPT " ) ; //WellCumDataType::WaterProd
2020-09-10 02:42:52 -05:00
tmp_values [ 4 ] = get ( " GGPT " ) ; //WellCumDataType::GasProd
tmp_values [ 5 ] = get ( " GVPT " ) ; //WellCumDataType::FluidResVolProd
2019-11-06 06:25:04 -06:00
tmp_values [ 6 ] = get ( " GOIT " ) ; //WellCumDataType::OilInj
tmp_values [ 7 ] = get ( " GWIT " ) ; //WellCumDataType::WaterInj
2020-09-10 02:42:52 -05:00
tmp_values [ 8 ] = get ( " GGIT " ) ; //WellCumDataType::GasInj
tmp_values [ 9 ] = get ( " GVIT " ) ; //WellCumDataType::FluidResVolInj
outputCumulativeReport_ ( tmp_values , tmp_names , forceDisableCumOutput ) ;
2019-11-01 06:56:20 -05:00
}
2020-09-10 02:42:52 -05:00
2019-11-01 06:56:20 -05:00
for ( const auto & wname : schedule . wellNames ( reportStepNum ) ) {
2020-09-10 02:42:52 -05:00
// don't bother with wells not on this process
const auto & defunctWellNames = simulator_ . vanguard ( ) . defunctWellNames ( ) ;
2019-11-01 06:56:20 -05:00
if ( defunctWellNames . find ( wname ) ! = defunctWellNames . end ( ) ) {
continue ;
2020-09-10 02:42:52 -05:00
}
2019-11-13 16:16:11 -06:00
const auto & well = schedule . getWell ( wname , reportStepNum ) ;
2019-11-01 06:56:20 -05:00
2020-09-10 02:42:52 -05:00
tmp_names [ 0 ] = wname ; //WellCumDataType::WellName
2019-11-01 06:56:20 -05:00
2020-09-10 02:42:52 -05:00
auto wName = static_cast < std : : string > ( wname ) ;
2019-11-01 06:56:20 -05:00
auto get = [ & st , & wName ] ( const std : : string & vector )
{
const auto key = vector + ' : ' + wName ;
return st . has ( key ) ? st . get ( key ) : 0.0 ;
2020-09-10 02:42:52 -05:00
} ;
2019-11-01 06:56:20 -05:00
if ( well . isInjector ( ) ) {
2020-09-10 02:42:52 -05:00
2019-11-01 06:56:20 -05:00
const auto & controls = well . injectionControls ( st ) ;
const auto ctlMode = controls . cmode ;
2020-09-10 02:42:52 -05:00
const auto injType = controls . injector_type ;
2019-11-13 16:16:11 -06:00
using CMode = : : Opm : : Well : : InjectorCMode ;
2020-03-03 02:08:02 -06:00
using WType = : : Opm : : InjectorType ;
2020-09-10 02:42:52 -05:00
2019-11-01 06:56:20 -05:00
auto ftype = [ ] ( const auto wtype ) - > std : : string
{
switch ( wtype ) {
case WType : : OIL : return " Oil " ;
case WType : : WATER : return " Wat " ;
case WType : : GAS : return " Gas " ;
2020-09-10 02:42:52 -05:00
case WType : : MULTI : return " Multi " ;
2019-11-01 06:56:20 -05:00
default :
{
return " " ;
}
}
} ;
2020-09-10 02:42:52 -05:00
2019-11-01 06:56:20 -05:00
auto fctl = [ ] ( const auto wmctl ) - > std : : string
{
switch ( wmctl ) {
case CMode : : RATE : return " RATE " ;
case CMode : : RESV : return " RESV " ;
case CMode : : THP : return " THP " ;
case CMode : : BHP : return " BHP " ;
case CMode : : GRUP : return " GRUP " ;
default :
{
return " " ;
}
}
2020-09-10 02:42:52 -05:00
} ;
2019-11-01 06:56:20 -05:00
2020-09-10 02:42:52 -05:00
tmp_names [ 1 ] = " INJ " ; //WellCumDataType::WellType
const auto flowctl = fctl ( ctlMode ) ;
2019-11-01 06:56:20 -05:00
if ( flowctl = = " RATE " ) //WellCumDataType::WellCTRL
{
const auto flowtype = ftype ( injType ) ;
if ( flowtype = = " Oil " ) { tmp_names [ 2 ] = " ORAT " ; }
else if ( flowtype = = " Wat " ) { tmp_names [ 2 ] = " WRAT " ; }
else if ( flowtype = = " Gas " ) { tmp_names [ 2 ] = " GRAT " ; }
}
else
{
tmp_names [ 2 ] = flowctl ;
}
2020-09-10 02:42:52 -05:00
}
2019-11-01 06:56:20 -05:00
else if ( well . isProducer ( ) ) {
2020-09-10 02:42:52 -05:00
2019-11-01 06:56:20 -05:00
const auto & controls = well . productionControls ( st ) ;
2019-11-13 16:16:11 -06:00
using CMode = : : Opm : : Well : : ProducerCMode ;
2020-09-10 02:42:52 -05:00
2019-11-01 06:56:20 -05:00
auto fctl = [ ] ( const auto wmctl ) - > std : : string
{
switch ( wmctl ) {
case CMode : : ORAT : return " ORAT " ;
case CMode : : WRAT : return " WRAT " ;
case CMode : : GRAT : return " GRAT " ;
case CMode : : LRAT : return " LRAT " ;
case CMode : : RESV : return " RESV " ;
case CMode : : THP : return " THP " ;
case CMode : : BHP : return " BHP " ;
case CMode : : CRAT : return " CRAT " ;
case CMode : : GRUP : return " GRUP " ;
default :
{
return " none " ;
}
}
} ;
2020-09-10 02:42:52 -05:00
tmp_names [ 1 ] = " PROD " ; //WellProdDataType::CTRLMode
tmp_names [ 2 ] = fctl ( controls . cmode ) ; //WellProdDataType::CTRLMode
2019-11-01 06:56:20 -05:00
}
2020-09-10 02:42:52 -05:00
2019-11-01 06:56:20 -05:00
tmp_values [ 0 ] = well . getHeadI ( ) + 1 ; //WellCumDataType::wellLocationi
2020-09-10 02:42:52 -05:00
tmp_values [ 1 ] = well . getHeadJ ( ) + 1 ; //WellCumDataType::wellLocationj
2019-11-01 06:56:20 -05:00
tmp_values [ 2 ] = get ( " WOPT " ) ; //WellCumDataType::OilProd
tmp_values [ 3 ] = get ( " WWPT " ) ; //WellCumDataType::WaterProd
2020-09-10 02:42:52 -05:00
tmp_values [ 4 ] = get ( " WGPT " ) ; //WellCumDataType::GasProd
tmp_values [ 5 ] = get ( " WVPT " ) ; //WellCumDataType::FluidResVolProd
2019-11-06 06:25:04 -06:00
tmp_values [ 6 ] = get ( " WOIT " ) ; //WellCumDataType::OilInj
tmp_values [ 7 ] = get ( " WWIT " ) ; //WellCumDataType::WaterInj
2020-09-10 02:42:52 -05:00
tmp_values [ 8 ] = get ( " WGIT " ) ; //WellCumDataType::GasInj
tmp_values [ 9 ] = get ( " WVIT " ) ; //WellCumDataType::FluidResVolInj
outputCumulativeReport_ ( tmp_values , tmp_names , forceDisableCumOutput ) ;
2019-11-01 06:56:20 -05:00
}
2019-10-26 06:13:44 -05:00
}
}
2020-09-10 02:42:52 -05:00
2019-06-03 04:11:41 -05:00
void setRestart ( const Opm : : data : : Solution & sol , unsigned elemIdx , unsigned globalDofIndex )
2017-12-07 05:38:48 -06:00
{
Scalar so = 1.0 ;
2018-04-30 10:17:22 -05:00
if ( saturation_ [ waterPhaseIdx ] . size ( ) > 0 & & sol . has ( " SWAT " ) ) {
2017-12-07 05:38:48 -06:00
saturation_ [ waterPhaseIdx ] [ elemIdx ] = sol . data ( " SWAT " ) [ globalDofIndex ] ;
so - = sol . data ( " SWAT " ) [ globalDofIndex ] ;
}
2018-04-30 10:17:22 -05:00
if ( saturation_ [ gasPhaseIdx ] . size ( ) > 0 & & sol . has ( " SGAS " ) ) {
2017-12-07 05:38:48 -06:00
saturation_ [ gasPhaseIdx ] [ elemIdx ] = sol . data ( " SGAS " ) [ globalDofIndex ] ;
so - = sol . data ( " SGAS " ) [ globalDofIndex ] ;
}
2019-09-25 05:28:58 -05:00
if ( sSol_ . size ( ) > 0 ) {
// keep the SSOL option for backward compatibility
// should be removed after 10.2018 release
if ( sol . has ( " SSOL " ) )
sSol_ [ elemIdx ] = sol . data ( " SSOL " ) [ globalDofIndex ] ;
else if ( sol . has ( " SSOLVENT " ) )
sSol_ [ elemIdx ] = sol . data ( " SSOLVENT " ) [ globalDofIndex ] ;
so - = sSol_ [ elemIdx ] ;
}
2018-02-19 01:49:02 -06:00
assert ( saturation_ [ oilPhaseIdx ] . size ( ) > 0 ) ;
2017-12-07 05:38:48 -06:00
saturation_ [ oilPhaseIdx ] [ elemIdx ] = so ;
2018-04-30 10:17:22 -05:00
if ( oilPressure_ . size ( ) > 0 & & sol . has ( " PRESSURE " ) )
oilPressure_ [ elemIdx ] = sol . data ( " PRESSURE " ) [ globalDofIndex ] ;
2018-12-17 04:37:07 -06:00
if ( enableEnergy & & sol . has ( " TEMP " ) )
2018-04-30 10:17:22 -05:00
temperature_ [ elemIdx ] = sol . data ( " TEMP " ) [ globalDofIndex ] ;
if ( rs_ . size ( ) > 0 & & sol . has ( " RS " ) )
2017-12-07 05:38:48 -06:00
rs_ [ elemIdx ] = sol . data ( " RS " ) [ globalDofIndex ] ;
2018-04-30 10:17:22 -05:00
if ( rv_ . size ( ) > 0 & & sol . has ( " RV " ) )
2017-12-07 05:38:48 -06:00
rv_ [ elemIdx ] = sol . data ( " RV " ) [ globalDofIndex ] ;
2018-04-30 10:17:22 -05:00
if ( cPolymer_ . size ( ) > 0 & & sol . has ( " POLYMER " ) )
2017-12-07 05:38:48 -06:00
cPolymer_ [ elemIdx ] = sol . data ( " POLYMER " ) [ globalDofIndex ] ;
2019-04-26 03:38:37 -05:00
if ( cFoam_ . size ( ) > 0 & & sol . has ( " FOAM " ) )
cFoam_ [ elemIdx ] = sol . data ( " FOAM " ) [ globalDofIndex ] ;
2019-11-07 02:39:42 -06:00
if ( cSalt_ . size ( ) > 0 & & sol . has ( " SALT " ) )
cSalt_ [ elemIdx ] = sol . data ( " SALT " ) [ globalDofIndex ] ;
2018-04-30 10:17:22 -05:00
if ( soMax_ . size ( ) > 0 & & sol . has ( " SOMAX " ) )
2017-12-07 05:38:48 -06:00
soMax_ [ elemIdx ] = sol . data ( " SOMAX " ) [ globalDofIndex ] ;
2018-04-30 10:17:22 -05:00
if ( pcSwMdcOw_ . size ( ) > 0 & & sol . has ( " PCSWM_OW " ) )
2017-12-07 05:38:48 -06:00
pcSwMdcOw_ [ elemIdx ] = sol . data ( " PCSWM_OW " ) [ globalDofIndex ] ;
2018-04-30 10:17:22 -05:00
if ( krnSwMdcOw_ . size ( ) > 0 & & sol . has ( " KRNSW_OW " ) )
2017-12-07 05:38:48 -06:00
krnSwMdcOw_ [ elemIdx ] = sol . data ( " KRNSW_OW " ) [ globalDofIndex ] ;
2018-04-30 10:17:22 -05:00
if ( pcSwMdcGo_ . size ( ) > 0 & & sol . has ( " PCSWM_GO " ) )
2017-12-07 05:38:48 -06:00
pcSwMdcGo_ [ elemIdx ] = sol . data ( " PCSWM_GO " ) [ globalDofIndex ] ;
2018-04-30 10:17:22 -05:00
if ( krnSwMdcGo_ . size ( ) > 0 & & sol . has ( " KRNSW_GO " ) )
2017-12-07 05:38:48 -06:00
krnSwMdcGo_ [ elemIdx ] = sol . data ( " KRNSW_GO " ) [ globalDofIndex ] ;
2018-09-07 03:19:00 -05:00
if ( ppcw_ . size ( ) > 0 & & sol . has ( " PPCW " ) )
ppcw_ [ elemIdx ] = sol . data ( " PPCW " ) [ globalDofIndex ] ;
2017-12-07 05:38:48 -06:00
}
template < class FluidState >
2018-04-30 10:17:22 -05:00
void assignToFluidState ( FluidState & fs , unsigned elemIdx ) const
2017-12-07 05:38:48 -06:00
{
2018-01-09 07:01:30 -06:00
for ( unsigned phaseIdx = 0 ; phaseIdx < numPhases ; + + phaseIdx ) {
if ( saturation_ [ phaseIdx ] . size ( ) = = 0 )
continue ;
2015-01-25 10:27:08 -06:00
2018-01-09 07:01:30 -06:00
fs . setSaturation ( phaseIdx , saturation_ [ phaseIdx ] [ elemIdx ] ) ;
2014-11-28 05:58:48 -06:00
}
2018-01-09 07:01:30 -06:00
if ( oilPressure_ . size ( ) > 0 ) {
2017-12-07 05:38:48 -06:00
// this assumes that capillary pressures only depend on the phase saturations
// and possibly on temperature. (this is always the case for ECL problems.)
2018-04-30 10:17:22 -05:00
Dune : : FieldVector < Scalar , numPhases > pc ( 0 ) ;
2017-12-07 05:38:48 -06:00
const MaterialLawParams & matParams = simulator_ . problem ( ) . materialLawParams ( elemIdx ) ;
MaterialLaw : : capillaryPressures ( pc , matParams , fs ) ;
Opm : : Valgrind : : CheckDefined ( oilPressure_ [ elemIdx ] ) ;
Opm : : Valgrind : : CheckDefined ( pc ) ;
assert ( FluidSystem : : phaseIsActive ( oilPhaseIdx ) ) ;
for ( unsigned phaseIdx = 0 ; phaseIdx < numPhases ; + + phaseIdx ) {
if ( ! FluidSystem : : phaseIsActive ( phaseIdx ) )
continue ;
fs . setPressure ( phaseIdx , oilPressure_ [ elemIdx ] + ( pc [ phaseIdx ] - pc [ oilPhaseIdx ] ) ) ;
}
2015-01-25 10:27:08 -06:00
}
2017-12-07 05:38:48 -06:00
2018-12-17 04:37:07 -06:00
if ( enableEnergy )
2018-04-30 10:17:22 -05:00
fs . setTemperature ( temperature_ [ elemIdx ] ) ;
if ( rs_ . size ( ) > 0 )
2017-12-07 05:38:48 -06:00
fs . setRs ( rs_ [ elemIdx ] ) ;
2018-04-30 10:17:22 -05:00
if ( rv_ . size ( ) > 0 )
2017-12-07 05:38:48 -06:00
fs . setRv ( rv_ [ elemIdx ] ) ;
2014-11-28 05:58:48 -06:00
}
2019-02-01 10:33:30 -06:00
void initHysteresisParams ( Simulator & simulator , unsigned elemIdx ) const
{
2018-01-09 07:01:30 -06:00
if ( soMax_ . size ( ) > 0 )
2018-02-19 01:46:27 -06:00
simulator . problem ( ) . setMaxOilSaturation ( elemIdx , soMax_ [ elemIdx ] ) ;
2017-12-07 05:38:48 -06:00
if ( simulator . problem ( ) . materialLawManager ( ) - > enableHysteresis ( ) ) {
auto matLawManager = simulator . problem ( ) . materialLawManager ( ) ;
2018-01-09 07:01:30 -06:00
if ( pcSwMdcOw_ . size ( ) > 0 & & krnSwMdcOw_ . size ( ) > 0 ) {
2017-12-07 05:38:48 -06:00
matLawManager - > setOilWaterHysteresisParams (
2018-01-09 07:01:30 -06:00
pcSwMdcOw_ [ elemIdx ] ,
krnSwMdcOw_ [ elemIdx ] ,
elemIdx ) ;
}
if ( pcSwMdcGo_ . size ( ) > 0 & & krnSwMdcGo_ . size ( ) > 0 ) {
2017-12-07 05:38:48 -06:00
matLawManager - > setGasOilHysteresisParams (
2018-01-09 07:01:30 -06:00
pcSwMdcGo_ [ elemIdx ] ,
krnSwMdcGo_ [ elemIdx ] ,
elemIdx ) ;
}
2017-12-07 05:38:48 -06:00
}
2020-01-13 08:46:50 -06:00
if ( simulator_ . vanguard ( ) . eclState ( ) . fieldProps ( ) . has_double ( " SWATINIT " ) ) {
2018-09-07 03:19:00 -05:00
auto oilWaterScaledEpsInfoDrainage = simulator . problem ( ) . materialLawManager ( ) - > oilWaterScaledEpsInfoDrainagePointerReferenceHack ( elemIdx ) ;
oilWaterScaledEpsInfoDrainage - > maxPcow = ppcw_ [ elemIdx ] ;
}
2017-12-07 05:38:48 -06:00
}
2019-02-01 10:33:30 -06:00
Scalar getSolventSaturation ( unsigned elemIdx ) const
{
2019-08-07 05:03:43 -05:00
if ( sSol_ . size ( ) > elemIdx )
2017-12-07 05:38:48 -06:00
return sSol_ [ elemIdx ] ;
return 0 ;
}
2019-02-01 10:33:30 -06:00
Scalar getPolymerConcentration ( unsigned elemIdx ) const
{
2019-08-07 05:03:43 -05:00
if ( cPolymer_ . size ( ) > elemIdx )
2017-12-07 05:38:48 -06:00
return cPolymer_ [ elemIdx ] ;
return 0 ;
}
2019-04-26 03:38:37 -05:00
Scalar getFoamConcentration ( unsigned elemIdx ) const
{
2019-08-07 05:03:43 -05:00
if ( cFoam_ . size ( ) > elemIdx )
2019-04-26 03:38:37 -05:00
return cFoam_ [ elemIdx ] ;
return 0 ;
}
2019-11-07 02:39:42 -06:00
Scalar getSaltConcentration ( unsigned elemIdx ) const
{
if ( cSalt_ . size ( ) > elemIdx )
return cSalt_ [ elemIdx ] ;
return 0 ;
}
2019-02-01 10:33:30 -06:00
const std : : map < std : : pair < std : : string , int > , double > & getBlockData ( )
{ return blockData_ ; }
2018-01-19 08:45:42 -06:00
2014-11-28 05:58:48 -06:00
private :
2017-12-07 05:38:48 -06:00
2018-01-09 07:01:30 -06:00
bool isIORank_ ( ) const
2017-12-07 05:38:48 -06:00
{
const auto & comm = simulator_ . gridView ( ) . comm ( ) ;
return comm . rank ( ) = = 0 ;
}
2018-01-29 01:43:42 -06:00
void updateFluidInPlace_ ( const ElementContext & elemCtx , unsigned dofIdx )
{
const auto & intQuants = elemCtx . intensiveQuantities ( dofIdx , /*timeIdx=*/ 0 ) ;
const auto & fs = intQuants . fluidState ( ) ;
unsigned globalDofIdx = elemCtx . globalSpaceIndex ( dofIdx , /*timeIdx=*/ 0 ) ;
// Fluid in Place calculations
// calculate the pore volume of the current cell. Note that the porosity
// returned by the intensive quantities is defined as the ratio of pore
// space to total cell volume and includes all pressure dependent (->
// rock compressibility) and static modifiers (MULTPV, MULTREGP, NTG,
// PORV, MINPV and friends). Also note that because of this, the porosity
// returned by the intensive quantities can be outside of the physical
// range [0, 1] in pathetic cases.
const double pv =
elemCtx . simulator ( ) . model ( ) . dofTotalVolume ( globalDofIdx )
* intQuants . porosity ( ) . value ( ) ;
if ( pressureTimesHydrocarbonVolume_ . size ( ) > 0 & & pressureTimesPoreVolume_ . size ( ) > 0 ) {
assert ( hydrocarbonPoreVolume_ . size ( ) = = pressureTimesHydrocarbonVolume_ . size ( ) ) ;
2018-04-30 10:17:22 -05:00
assert ( fip_ [ FipDataType : : PoreVolume ] . size ( ) = = pressureTimesPoreVolume_ . size ( ) ) ;
2018-01-29 01:43:42 -06:00
2018-01-29 05:23:23 -06:00
fip_ [ FipDataType : : PoreVolume ] [ globalDofIdx ] = pv ;
2018-01-29 01:43:42 -06:00
Scalar hydrocarbon = 0.0 ;
if ( FluidSystem : : phaseIsActive ( oilPhaseIdx ) )
hydrocarbon + = Opm : : getValue ( fs . saturation ( oilPhaseIdx ) ) ;
if ( FluidSystem : : phaseIsActive ( gasPhaseIdx ) )
hydrocarbon + = Opm : : getValue ( fs . saturation ( gasPhaseIdx ) ) ;
hydrocarbonPoreVolume_ [ globalDofIdx ] = pv * hydrocarbon ;
if ( FluidSystem : : phaseIsActive ( oilPhaseIdx ) ) {
pressureTimesPoreVolume_ [ globalDofIdx ] = Opm : : getValue ( fs . pressure ( oilPhaseIdx ) ) * pv ;
pressureTimesHydrocarbonVolume_ [ globalDofIdx ] = pressureTimesPoreVolume_ [ globalDofIdx ] * hydrocarbon ;
}
}
if ( computeFip_ ) {
Scalar fip [ FluidSystem : : numPhases ] ;
2018-04-30 10:17:22 -05:00
for ( unsigned phaseIdx = 0 ; phaseIdx < FluidSystem : : numPhases ; + + phaseIdx ) {
fip [ phaseIdx ] = 0.0 ;
if ( ! FluidSystem : : phaseIsActive ( phaseIdx ) )
2018-01-29 01:43:42 -06:00
continue ;
2018-04-30 10:17:22 -05:00
const double b = Opm : : getValue ( fs . invB ( phaseIdx ) ) ;
const double s = Opm : : getValue ( fs . saturation ( phaseIdx ) ) ;
fip [ phaseIdx ] = b * s * pv ;
2018-01-29 01:43:42 -06:00
}
2018-01-29 05:23:23 -06:00
if ( FluidSystem : : phaseIsActive ( oilPhaseIdx ) & & fip_ [ FipDataType : : OilInPlace ] . size ( ) > 0 )
fip_ [ FipDataType : : OilInPlace ] [ globalDofIdx ] = fip [ oilPhaseIdx ] ;
if ( FluidSystem : : phaseIsActive ( gasPhaseIdx ) & & fip_ [ FipDataType : : GasInPlace ] . size ( ) > 0 )
fip_ [ FipDataType : : GasInPlace ] [ globalDofIdx ] = fip [ gasPhaseIdx ] ;
if ( FluidSystem : : phaseIsActive ( waterPhaseIdx ) & & fip_ [ FipDataType : : WaterInPlace ] . size ( ) > 0 )
fip_ [ FipDataType : : WaterInPlace ] [ globalDofIdx ] = fip [ waterPhaseIdx ] ;
2018-01-29 01:43:42 -06:00
2018-01-29 05:23:23 -06:00
// Store the pure oil and gas Fip
if ( FluidSystem : : phaseIsActive ( oilPhaseIdx ) & & fip_ [ FipDataType : : OilInPlaceInLiquidPhase ] . size ( ) > 0 )
fip_ [ FipDataType : : OilInPlaceInLiquidPhase ] [ globalDofIdx ] = fip [ oilPhaseIdx ] ;
2018-01-29 01:43:42 -06:00
2018-01-29 05:23:23 -06:00
if ( FluidSystem : : phaseIsActive ( gasPhaseIdx ) & & fip_ [ FipDataType : : GasInPlaceInGasPhase ] . size ( ) > 0 )
fip_ [ FipDataType : : GasInPlaceInGasPhase ] [ globalDofIdx ] = fip [ gasPhaseIdx ] ;
2018-01-29 01:43:42 -06:00
if ( FluidSystem : : phaseIsActive ( oilPhaseIdx ) & & FluidSystem : : phaseIsActive ( gasPhaseIdx ) ) {
// Gas dissolved in oil and vaporized oil
Scalar gasInPlaceLiquid = Opm : : getValue ( fs . Rs ( ) ) * fip [ oilPhaseIdx ] ;
Scalar oilInPlaceGas = Opm : : getValue ( fs . Rv ( ) ) * fip [ gasPhaseIdx ] ;
2019-05-22 08:39:57 -05:00
if ( fip_ [ FipDataType : : GasInPlaceInLiquidPhase ] . size ( ) > 0 )
2018-01-29 05:23:23 -06:00
fip_ [ FipDataType : : GasInPlaceInLiquidPhase ] [ globalDofIdx ] = gasInPlaceLiquid ;
if ( fip_ [ FipDataType : : OilInPlaceInGasPhase ] . size ( ) > 0 )
fip_ [ FipDataType : : OilInPlaceInGasPhase ] [ globalDofIdx ] = oilInPlaceGas ;
// Add dissolved gas and vaporized oil to total Fip
if ( fip_ [ FipDataType : : OilInPlace ] . size ( ) > 0 )
fip_ [ FipDataType : : OilInPlace ] [ globalDofIdx ] + = oilInPlaceGas ;
if ( fip_ [ FipDataType : : GasInPlace ] . size ( ) > 0 )
fip_ [ FipDataType : : GasInPlace ] [ globalDofIdx ] + = gasInPlaceLiquid ;
2018-01-29 01:43:42 -06:00
}
}
}
2020-09-07 03:22:42 -05:00
void createLocalRegion_ ( std : : vector < int > & region )
2018-01-12 08:32:43 -06:00
{
2020-02-25 07:27:52 -06:00
ElementContext elemCtx ( simulator_ ) ;
ElementIterator elemIt = simulator_ . gridView ( ) . template begin < /*codim=*/ 0 > ( ) ;
const ElementIterator & elemEndIt = simulator_ . gridView ( ) . template end < /*codim=*/ 0 > ( ) ;
size_t elemIdx = 0 ;
for ( ; elemIt ! = elemEndIt ; + + elemIt , + + elemIdx ) {
const Element & elem = * elemIt ;
if ( elem . partitionType ( ) ! = Dune : : InteriorEntity )
2020-09-07 03:22:42 -05:00
region [ elemIdx ] = 0 ;
2018-01-12 08:32:43 -06:00
}
}
// Sum Fip values over regions.
2020-09-07 03:22:42 -05:00
ScalarBuffer regionSum ( const ScalarBuffer & property , const std : : vector < int > & regionId , size_t maxNumberOfRegions ) const
2018-01-12 08:32:43 -06:00
{
ScalarBuffer totals ( maxNumberOfRegions , 0.0 ) ;
2018-02-01 06:16:37 -06:00
2020-09-07 03:22:42 -05:00
if ( property . empty ( ) )
2018-02-01 06:16:37 -06:00
return totals ;
2020-09-07 03:22:42 -05:00
assert ( regionId . size ( ) = = property . size ( ) ) ;
2018-01-12 08:32:43 -06:00
for ( size_t j = 0 ; j < regionId . size ( ) ; + + j ) {
const int regionIdx = regionId [ j ] - 1 ;
// the cell is not attributed to any region. ignore it!
if ( regionIdx < 0 )
continue ;
assert ( regionIdx < static_cast < int > ( maxNumberOfRegions ) ) ;
2020-09-07 03:22:42 -05:00
totals [ regionIdx ] + = property [ j ] ;
2018-01-12 08:32:43 -06:00
}
2020-09-07 03:22:42 -05:00
const auto & comm = simulator_ . gridView ( ) . comm ( ) ;
for ( size_t i = 0 ; i < maxNumberOfRegions ; + + i )
totals [ i ] = comm . sum ( totals [ i ] ) ;
2018-01-12 08:32:43 -06:00
return totals ;
}
2020-09-07 03:22:42 -05:00
ScalarBuffer pressureAverage_ ( const ScalarBuffer & pressurePvHydrocarbon , const ScalarBuffer & pvHydrocarbon , const ScalarBuffer & pressurePv , const ScalarBuffer & pv , bool hydrocarbon ) const
2018-04-30 10:17:22 -05:00
{
2018-01-22 06:38:50 -06:00
size_t size = pressurePvHydrocarbon . size ( ) ;
assert ( pvHydrocarbon . size ( ) = = size ) ;
assert ( pressurePv . size ( ) = = size ) ;
assert ( pv . size ( ) = = size ) ;
2018-01-12 08:32:43 -06:00
2018-04-30 10:17:22 -05:00
ScalarBuffer fraction ( size , 0.0 ) ;
2018-01-22 06:38:50 -06:00
for ( size_t i = 0 ; i < size ; + + i ) {
fraction [ i ] = pressureAverage_ ( pressurePvHydrocarbon [ i ] , pvHydrocarbon [ i ] , pressurePv [ i ] , pv [ i ] , hydrocarbon ) ;
}
return fraction ;
}
2018-01-17 08:24:24 -06:00
2020-09-07 03:22:42 -05:00
Scalar pressureAverage_ ( const Scalar & pressurePvHydrocarbon , const Scalar & pvHydrocarbon , const Scalar & pressurePv , const Scalar & pv , bool hydrocarbon ) const
2018-04-30 10:17:22 -05:00
{
2018-01-22 06:38:50 -06:00
if ( pvHydrocarbon > 1e-10 & & hydrocarbon )
return pressurePvHydrocarbon / pvHydrocarbon ;
2018-01-12 08:32:43 -06:00
2018-01-22 06:38:50 -06:00
return pressurePv / pv ;
2018-01-12 08:32:43 -06:00
}
2020-09-07 03:22:42 -05:00
void fipUnitConvert_ ( std : : array < Scalar , FipDataType : : numFipTypes > & fip ) const
2018-01-12 08:32:43 -06:00
{
2018-02-01 09:26:58 -06:00
const Opm : : UnitSystem & units = simulator_ . vanguard ( ) . eclState ( ) . getUnits ( ) ;
2018-01-12 08:32:43 -06:00
if ( units . getType ( ) = = Opm : : UnitSystem : : UnitType : : UNIT_TYPE_FIELD ) {
2018-01-29 05:23:23 -06:00
fip [ FipDataType : : WaterInPlace ] = Opm : : unit : : convert : : to ( fip [ FipDataType : : WaterInPlace ] , Opm : : unit : : stb ) ;
fip [ FipDataType : : OilInPlace ] = Opm : : unit : : convert : : to ( fip [ FipDataType : : OilInPlace ] , Opm : : unit : : stb ) ;
fip [ FipDataType : : OilInPlaceInLiquidPhase ] = Opm : : unit : : convert : : to ( fip [ FipDataType : : OilInPlaceInLiquidPhase ] , Opm : : unit : : stb ) ;
fip [ FipDataType : : OilInPlaceInGasPhase ] = Opm : : unit : : convert : : to ( fip [ FipDataType : : OilInPlaceInGasPhase ] , Opm : : unit : : stb ) ;
fip [ FipDataType : : GasInPlace ] = Opm : : unit : : convert : : to ( fip [ FipDataType : : GasInPlace ] , 1000 * Opm : : unit : : cubic ( Opm : : unit : : feet ) ) ;
fip [ FipDataType : : GasInPlaceInLiquidPhase ] = Opm : : unit : : convert : : to ( fip [ FipDataType : : GasInPlaceInLiquidPhase ] , 1000 * Opm : : unit : : cubic ( Opm : : unit : : feet ) ) ;
fip [ FipDataType : : GasInPlaceInGasPhase ] = Opm : : unit : : convert : : to ( fip [ FipDataType : : GasInPlaceInGasPhase ] , 1000 * Opm : : unit : : cubic ( Opm : : unit : : feet ) ) ;
fip [ FipDataType : : PoreVolume ] = Opm : : unit : : convert : : to ( fip [ FipDataType : : PoreVolume ] , Opm : : unit : : stb ) ;
2018-01-12 08:32:43 -06:00
}
2019-01-21 07:55:40 -06:00
else if ( units . getType ( ) = = Opm : : UnitSystem : : UnitType : : UNIT_TYPE_LAB ) {
Scalar scc = Opm : : unit : : cubic ( Opm : : prefix : : centi * Opm : : unit : : meter ) ; //standard cubic cm.
fip [ FipDataType : : WaterInPlace ] = Opm : : unit : : convert : : to ( fip [ FipDataType : : WaterInPlace ] , scc ) ;
fip [ FipDataType : : OilInPlace ] = Opm : : unit : : convert : : to ( fip [ FipDataType : : OilInPlace ] , scc ) ;
fip [ FipDataType : : OilInPlaceInLiquidPhase ] = Opm : : unit : : convert : : to ( fip [ FipDataType : : OilInPlaceInLiquidPhase ] , scc ) ;
fip [ FipDataType : : OilInPlaceInGasPhase ] = Opm : : unit : : convert : : to ( fip [ FipDataType : : OilInPlaceInGasPhase ] , scc ) ;
fip [ FipDataType : : GasInPlace ] = Opm : : unit : : convert : : to ( fip [ FipDataType : : GasInPlace ] , scc ) ;
fip [ FipDataType : : GasInPlaceInLiquidPhase ] = Opm : : unit : : convert : : to ( fip [ FipDataType : : GasInPlaceInLiquidPhase ] , scc ) ;
fip [ FipDataType : : GasInPlaceInGasPhase ] = Opm : : unit : : convert : : to ( fip [ FipDataType : : GasInPlaceInGasPhase ] , scc ) ;
fip [ FipDataType : : PoreVolume ] = Opm : : unit : : convert : : to ( fip [ FipDataType : : PoreVolume ] , scc ) ;
}
2018-01-12 08:32:43 -06:00
else if ( units . getType ( ) = = Opm : : UnitSystem : : UnitType : : UNIT_TYPE_METRIC ) {
2018-01-17 08:24:24 -06:00
// nothing to do
2018-01-12 08:32:43 -06:00
}
else {
2018-02-01 07:40:01 -06:00
throw std : : runtime_error ( " Unsupported unit type for fluid in place output. " ) ;
2018-01-12 08:32:43 -06:00
}
}
2020-09-07 03:22:42 -05:00
void pressureUnitConvert_ ( Scalar & pav ) const
2018-04-30 10:17:22 -05:00
{
2018-02-01 09:26:58 -06:00
const Opm : : UnitSystem & units = simulator_ . vanguard ( ) . eclState ( ) . getUnits ( ) ;
2018-01-17 08:24:24 -06:00
if ( units . getType ( ) = = Opm : : UnitSystem : : UnitType : : UNIT_TYPE_FIELD ) {
pav = Opm : : unit : : convert : : to ( pav , Opm : : unit : : psia ) ;
2018-04-30 10:17:22 -05:00
}
else if ( units . getType ( ) = = Opm : : UnitSystem : : UnitType : : UNIT_TYPE_METRIC ) {
2018-01-17 08:24:24 -06:00
pav = Opm : : unit : : convert : : to ( pav , Opm : : unit : : barsa ) ;
}
2019-01-21 07:55:40 -06:00
else if ( units . getType ( ) = = Opm : : UnitSystem : : UnitType : : UNIT_TYPE_LAB ) {
pav = Opm : : unit : : convert : : to ( pav , Opm : : unit : : atm ) ;
}
2018-01-17 08:24:24 -06:00
else {
2018-02-01 07:40:01 -06:00
throw std : : runtime_error ( " Unsupported unit type for fluid in place output. " ) ;
2018-01-17 08:24:24 -06:00
}
}
2020-09-07 03:22:42 -05:00
void outputRegionFluidInPlace_ ( const std : : array < Scalar , FipDataType : : numFipTypes > & oip ,
const std : : array < Scalar , FipDataType : : numFipTypes > & cip ,
const Scalar & pav , const int reg = 0 ) const
2018-01-12 08:32:43 -06:00
{
2018-07-26 05:31:32 -05:00
if ( forceDisableFipOutput_ )
return ;
2018-11-06 02:02:30 -06:00
// don't output FIPNUM report if the region has no porv.
if ( cip [ FipDataType : : PoreVolume ] = = 0 )
return ;
2018-02-01 09:26:58 -06:00
const Opm : : UnitSystem & units = simulator_ . vanguard ( ) . eclState ( ) . getUnits ( ) ;
2018-01-12 08:32:43 -06:00
std : : ostringstream ss ;
2020-09-07 03:22:42 -05:00
if ( reg = = 0 ) {
2018-01-12 08:32:43 -06:00
ss < < " =================================================== \n "
< < " : Field Totals : \n " ;
2018-04-30 10:17:22 -05:00
}
else {
2018-01-12 08:32:43 -06:00
ss < < " =================================================== \n "
< < " : FIPNUM report region "
< < std : : setw ( 2 ) < < reg < < " : \n " ;
}
if ( units . getType ( ) = = Opm : : UnitSystem : : UnitType : : UNIT_TYPE_METRIC ) {
2018-01-17 08:24:24 -06:00
ss < < " : PAV = " < < std : : setw ( 14 ) < < pav < < " BARSA : \n "
2018-01-12 08:32:43 -06:00
< < std : : fixed < < std : : setprecision ( 0 )
2018-01-29 05:23:23 -06:00
< < " : PORV = " < < std : : setw ( 14 ) < < cip [ FipDataType : : PoreVolume ] < < " RM3 : \n " ;
2018-01-12 08:32:43 -06:00
if ( ! reg ) {
ss < < " : Pressure is weighted by hydrocarbon pore volume : \n "
< < " : Porv volumes are taken at reference conditions : \n " ;
}
ss < < " :--------------- Oil SM3 ---------------:-- Wat SM3 --:--------------- Gas SM3 ---------------: \n " ;
}
if ( units . getType ( ) = = Opm : : UnitSystem : : UnitType : : UNIT_TYPE_FIELD ) {
2018-01-17 08:24:24 -06:00
ss < < " : PAV = " < < std : : setw ( 14 ) < < pav < < " PSIA : \n "
2018-01-12 08:32:43 -06:00
< < std : : fixed < < std : : setprecision ( 0 )
2018-01-29 05:23:23 -06:00
< < " : PORV = " < < std : : setw ( 14 ) < < cip [ FipDataType : : PoreVolume ] < < " RB : \n " ;
2018-01-12 08:32:43 -06:00
if ( ! reg ) {
ss < < " : Pressure is weighted by hydrocarbon pore volume : \n "
< < " : Pore volumes are taken at reference conditions : \n " ;
}
ss < < " :--------------- Oil STB ---------------:-- Wat STB --:--------------- Gas MSCF ---------------: \n " ;
}
ss < < " : Liquid Vapour Total : Total : Free Dissolved Total : " < < " \n "
< < " :------------------------:------------------------------------------:----------------:------------------------------------------: " < < " \n "
2018-01-29 05:23:23 -06:00
< < " :Currently in place : " < < std : : setw ( 14 ) < < cip [ FipDataType : : OilInPlaceInLiquidPhase ] < < std : : setw ( 14 ) < < cip [ FipDataType : : OilInPlaceInGasPhase ] < < std : : setw ( 14 ) < < cip [ FipDataType : : OilInPlace ] < < " : "
< < std : : setw ( 13 ) < < cip [ FipDataType : : WaterInPlace ] < < " : " < < std : : setw ( 14 ) < < ( cip [ FipDataType : : GasInPlaceInGasPhase ] ) < < std : : setw ( 14 ) < < cip [ FipDataType : : GasInPlaceInLiquidPhase ] < < std : : setw ( 14 ) < < cip [ FipDataType : : GasInPlace ] < < " : \n "
2018-01-12 08:32:43 -06:00
< < " :------------------------:------------------------------------------:----------------:------------------------------------------: \n "
2018-01-29 05:23:23 -06:00
< < " :Originally in place : " < < std : : setw ( 14 ) < < oip [ FipDataType : : OilInPlaceInLiquidPhase ] < < std : : setw ( 14 ) < < oip [ FipDataType : : OilInPlaceInGasPhase ] < < std : : setw ( 14 ) < < oip [ FipDataType : : OilInPlace ] < < " : "
< < std : : setw ( 13 ) < < oip [ FipDataType : : WaterInPlace ] < < " : " < < std : : setw ( 14 ) < < oip [ FipDataType : : GasInPlaceInGasPhase ] < < std : : setw ( 14 ) < < oip [ FipDataType : : GasInPlaceInLiquidPhase ] < < std : : setw ( 14 ) < < oip [ FipDataType : : GasInPlace ] < < " : \n "
2018-01-12 08:32:43 -06:00
< < " :========================:==========================================:================:==========================================: \n " ;
Opm : : OpmLog : : note ( ss . str ( ) ) ;
}
2020-09-10 02:42:52 -05:00
2019-10-26 06:13:44 -05:00
void outputProductionReport_ ( const ScalarBuffer & wellProd , const StringBuffer & wellProdNames , const bool forceDisableProdOutput )
{
2019-11-01 06:56:20 -05:00
if ( forceDisableProdOutput )
return ;
2020-09-10 02:42:52 -05:00
2019-10-26 06:13:44 -05:00
const Opm : : UnitSystem & units = simulator_ . vanguard ( ) . eclState ( ) . getUnits ( ) ;
std : : ostringstream ss ;
if ( wellProdNames [ WellProdDataType : : WellName ] . empty ( ) ) {
ss < < " ======================================================= PRODUCTION REPORT ======================================================= \n " //=================== \n"
< < " : WELL : LOCATION :CTRL: OIL : WATER : GAS : FLUID : WATER : GAS/OIL : WAT/GAS : BHP OR : THP OR : \n " // STEADY-ST PI :\n"
< < " : NAME : (I,J,K) :MODE: RATE : RATE : RATE : RES.VOL. : CUT : RATIO : RATIO : CON.PR.: BLK.PR.: \n " ; // OR POTN OF PREF. PH:\n";
if ( units . getType ( ) = = Opm : : UnitSystem : : UnitType : : UNIT_TYPE_METRIC ) {
2019-11-01 06:56:20 -05:00
ss < < " : : : : SCM/DAY : SCM/DAY : SCM/DAY : RCM/DAY : SCM/SCM : SCM/SCM : SCM/SCM : BARSA : BARSA : \n " ; // :\n";
}
if ( units . getType ( ) = = Opm : : UnitSystem : : UnitType : : UNIT_TYPE_FIELD ) {
2020-09-10 02:42:52 -05:00
ss < < " : : : : STB/DAY : STB/DAY : MSCF/DAY : RB/DAY : : MSCF/STB : STB/MSCF : PSIA : PSIA : \n " ; // :\n";
2019-11-01 06:56:20 -05:00
}
if ( units . getType ( ) = = Opm : : UnitSystem : : UnitType : : UNIT_TYPE_LAB ) {
2020-09-10 02:42:52 -05:00
ss < < " : : : : SCC/HR : SCC/HR : SCC/HR : RCC : SCC/SCC : SCC/SCC : SCC/SCC : ATMA : ATMA : \n " ; // :\n";
2019-11-01 06:56:20 -05:00
}
ss < < " ================================================================================================================================= \n " ; //=================== \n";
}
else {
2019-10-30 08:09:51 -05:00
if ( wellProd [ WellProdDataType : : WellLocationi ] < 1 ) {
ss < < std : : right < < std : : fixed < < " : " < < std : : setw ( 8 ) < < wellProdNames [ WellProdDataType : : WellName ] < < " : " < < std : : setprecision ( 0 ) < < std : : setw ( 11 ) < < " " < < " : " < < std : : setw ( 4 ) < < wellProdNames [ WellProdDataType : : CTRLMode ] < < " : " < < std : : setprecision ( 1 ) < < std : : setw ( 11 ) < < wellProd [ WellProdDataType : : OilRate ] < < " : " < < std : : setw ( 11 ) < < wellProd [ WellProdDataType : : WaterRate ] < < " : " < < std : : setw ( 11 ) < < wellProd [ WellProdDataType : : GasRate ] < < " : " < < std : : setw ( 11 ) < < wellProd [ WellProdDataType : : FluidResVol ] < < std : : setprecision ( 3 ) < < " : " < < std : : setw ( 11 ) < < wellProd [ WellProdDataType : : WaterCut ] < < std : : setprecision ( 2 ) < < " : " < < std : : setw ( 10 ) < < wellProd [ WellProdDataType : : GasOilRatio ] < < std : : setprecision ( 4 ) < < " : " < < std : : setw ( 12 ) < < wellProd [ WellProdDataType : : WatGasRatio ] < < std : : setprecision ( 1 ) < < " : " < < std : : setw ( 8 ) < < " " < < " : " < < std : : setw ( 8 ) < < " " < < " : \n " ; //wellProd[WellProdDataType::SteadyStatePI] << std::setw(10) << "\n"
}
else {
ss < < std : : right < < std : : fixed < < " : " < < std : : setw ( 8 ) < < wellProdNames [ WellProdDataType : : WellName ] < < " : " < < std : : setprecision ( 0 ) < < std : : setw ( 5 ) < < wellProd [ WellProdDataType : : WellLocationi ] < < " , " < < std : : setw ( 5 ) < < wellProd [ WellProdDataType : : WellLocationj ] < < " : " < < std : : setw ( 4 ) < < wellProdNames [ WellProdDataType : : CTRLMode ] < < " : " < < std : : setprecision ( 1 ) < < std : : setw ( 11 ) < < wellProd [ WellProdDataType : : OilRate ] < < " : " < < std : : setw ( 11 ) < < wellProd [ WellProdDataType : : WaterRate ] < < " : " < < std : : setw ( 11 ) < < wellProd [ WellProdDataType : : GasRate ] < < " : " < < std : : setw ( 11 ) < < wellProd [ WellProdDataType : : FluidResVol ] < < std : : setprecision ( 3 ) < < " : " < < std : : setw ( 11 ) < < wellProd [ WellProdDataType : : WaterCut ] < < std : : setprecision ( 2 ) < < " : " < < std : : setw ( 10 ) < < wellProd [ WellProdDataType : : GasOilRatio ] < < std : : setprecision ( 4 ) < < " : " < < std : : setw ( 12 ) < < wellProd [ WellProdDataType : : WatGasRatio ] < < std : : setprecision ( 1 ) < < " : " < < std : : setw ( 8 ) < < wellProd [ WellProdDataType : : BHP ] < < " : " < < std : : setw ( 8 ) < < wellProd [ WellProdDataType : : THP ] < < " : \n " ; //wellProd[WellProdDataType::SteadyStatePI] << std::setw(10) << "\n"
}
2019-10-30 11:51:49 -05:00
ss < < " : " < < std : : setfill ( ' - ' ) < < std : : setw ( 9 ) < < " : " < < std : : setfill ( ' - ' ) < < std : : setw ( 12 ) < < " : " < < std : : setfill ( ' - ' ) < < std : : setw ( 5 ) < < " : " < < std : : setfill ( ' - ' ) < < std : : setw ( 12 ) < < " : " < < std : : setfill ( ' - ' ) < < std : : setw ( 12 ) < < " : " < < std : : setfill ( ' - ' ) < < std : : setw ( 12 ) < < " : " < < std : : setfill ( ' - ' ) < < std : : setw ( 12 ) < < " : " < < std : : setfill ( ' - ' ) < < std : : setw ( 12 ) < < " : " < < std : : setfill ( ' - ' ) < < std : : setw ( 11 ) < < " : " < < std : : setfill ( ' - ' ) < < std : : setw ( 13 ) < < " : " < < std : : setfill ( ' - ' ) < < std : : setw ( 9 ) < < " : " < < std : : setfill ( ' - ' ) < < std : : setw ( 9 ) < < " : " < < " \n " ;
2019-10-26 06:13:44 -05:00
}
2019-11-01 06:56:20 -05:00
Opm : : OpmLog : : note ( ss . str ( ) ) ;
2020-09-10 02:42:52 -05:00
}
2019-10-26 06:13:44 -05:00
void outputInjectionReport_ ( const ScalarBuffer & wellInj , const StringBuffer & wellInjNames , const bool forceDisableInjOutput )
{
2019-11-01 06:56:20 -05:00
if ( forceDisableInjOutput )
return ;
2020-09-10 02:42:52 -05:00
2019-10-26 06:13:44 -05:00
const Opm : : UnitSystem & units = simulator_ . vanguard ( ) . eclState ( ) . getUnits ( ) ;
std : : ostringstream ss ;
if ( wellInjNames [ WellInjDataType : : WellName ] . empty ( ) ) {
ss < < " =================================================== INJECTION REPORT ======================================== \n " //===================== \n"
< < " : WELL : LOCATION : CTRL : CTRL : CTRL : OIL : WATER : GAS : FLUID : BHP OR : THP OR : \n " // STEADY-ST II :\n"
< < " : NAME : (I,J,K) : MODE : MODE : MODE : RATE : RATE : RATE : RES.VOL. : CON.PR.: BLK.PR.: \n " ; // OR POTENTIAL :\n";
if ( units . getType ( ) = = Opm : : UnitSystem : : UnitType : : UNIT_TYPE_METRIC ) {
2019-11-01 06:56:20 -05:00
ss < < " : : : OIL : WAT : GAS : SCM/DAY : SCM/DAY : SCM/DAY : RCM/DAY : BARSA : BARSA : \n " ; // :\n";
}
if ( units . getType ( ) = = Opm : : UnitSystem : : UnitType : : UNIT_TYPE_FIELD ) {
2020-09-10 02:42:52 -05:00
ss < < " : : : OIL : WAT : GAS : STB/DAY : STB/DAY : MSCF/DAY : RB/DAY : PSIA : PSIA : \n " ; // :\n";
2019-11-01 06:56:20 -05:00
}
if ( units . getType ( ) = = Opm : : UnitSystem : : UnitType : : UNIT_TYPE_LAB ) {
2020-09-10 02:42:52 -05:00
ss < < " : : : OIL : WAT : GAS : SCC/HR : SCC/HR : SCC/HR : RCC/HR : ATMA : ATMA : \n " ; // :\n";
2019-11-01 06:56:20 -05:00
}
ss < < " ============================================================================================================== \n " ; //===================== \n";
}
else {
2019-10-30 08:09:51 -05:00
if ( wellInj [ WellInjDataType : : WellLocationi ] < 1 ) {
ss < < std : : right < < std : : fixed < < std : : setprecision ( 0 ) < < " : " < < std : : setw ( 8 ) < < wellInjNames [ WellInjDataType : : WellName ] < < " : " < < std : : setw ( 11 ) < < " " < < " : " < < std : : setw ( 6 ) < < wellInjNames [ WellInjDataType : : CTRLModeOil ] < < " : " < < std : : setw ( 6 ) < < wellInjNames [ WellInjDataType : : CTRLModeWat ] < < " : " < < std : : setw ( 6 ) < < wellInjNames [ WellInjDataType : : CTRLModeGas ] < < " : " < < std : : setprecision ( 1 ) < < std : : setw ( 11 ) < < wellInj [ WellInjDataType : : OilRate ] < < " : " < < std : : setw ( 11 ) < < wellInj [ WellInjDataType : : WaterRate ] < < " : " < < std : : setw ( 11 ) < < wellInj [ WellInjDataType : : GasRate ] < < " : " < < std : : setw ( 11 ) < < wellInj [ WellInjDataType : : FluidResVol ] < < " : " < < std : : setw ( 8 ) < < " " < < " : " < < std : : setw ( 8 ) < < " " < < " : \n " ; //wellInj[WellInjDataType::SteadyStateII] << std::setw(10) << "\n"
}
else {
ss < < std : : right < < std : : fixed < < std : : setprecision ( 0 ) < < " : " < < std : : setw ( 8 ) < < wellInjNames [ WellInjDataType : : WellName ] < < " : " < < std : : setw ( 5 ) < < wellInj [ WellInjDataType : : WellLocationi ] < < " , " < < std : : setw ( 5 ) < < wellInj [ WellInjDataType : : WellLocationj ] < < " : " < < std : : setw ( 6 ) < < wellInjNames [ WellInjDataType : : CTRLModeOil ] < < " : " < < std : : setw ( 6 ) < < wellInjNames [ WellInjDataType : : CTRLModeWat ] < < " : " < < std : : setw ( 6 ) < < wellInjNames [ WellInjDataType : : CTRLModeGas ] < < " : " < < std : : setprecision ( 1 ) < < std : : setw ( 11 ) < < wellInj [ WellInjDataType : : OilRate ] < < " : " < < std : : setw ( 11 ) < < wellInj [ WellInjDataType : : WaterRate ] < < " : " < < std : : setw ( 11 ) < < wellInj [ WellInjDataType : : GasRate ] < < " : " < < std : : setw ( 11 ) < < wellInj [ WellInjDataType : : FluidResVol ] < < " : " < < std : : setw ( 8 ) < < wellInj [ WellInjDataType : : BHP ] < < " : " < < std : : setw ( 8 ) < < wellInj [ WellInjDataType : : THP ] < < " : \n " ; //wellInj[WellInjDataType::SteadyStateII] << std::setw(10) << "\n"
}
2020-09-10 02:42:52 -05:00
ss < < " :--------:-----------:------:------:------:------------:----------:-----------:-----------:--------:--------: \n " ; //--------------------:\n";
2019-10-26 06:13:44 -05:00
}
2019-11-01 06:56:20 -05:00
Opm : : OpmLog : : note ( ss . str ( ) ) ;
2019-10-26 06:13:44 -05:00
}
2020-09-10 02:42:52 -05:00
2019-11-01 06:56:20 -05:00
void outputCumulativeReport_ ( const ScalarBuffer & wellCum , const StringBuffer & wellCumNames , const bool forceDisableCumOutput )
2019-10-26 06:13:44 -05:00
{
2019-11-01 06:56:20 -05:00
if ( forceDisableCumOutput )
return ;
2020-09-10 02:42:52 -05:00
2019-10-26 06:13:44 -05:00
const Opm : : UnitSystem & units = simulator_ . vanguard ( ) . eclState ( ) . getUnits ( ) ;
std : : ostringstream ss ;
if ( wellCumNames [ WellCumDataType : : WellName ] . empty ( ) ) {
ss < < " =================================================== CUMULATIVE PRODUCTION/INJECTION REPORT ========================================= \n "
< < " : WELL : LOCATION : WELL :CTRL: OIL : WATER : GAS : Prod : OIL : WATER : GAS : INJ : \n "
< < " : NAME : (I,J,K) : TYPE :MODE: PROD : PROD : PROD : RES.VOL. : INJ : INJ : INJ : RES.VOL. : \n " ;
if ( units . getType ( ) = = Opm : : UnitSystem : : UnitType : : UNIT_TYPE_METRIC ) {
2019-11-01 06:56:20 -05:00
ss < < " : : : : : MSCM : MSCM : MMSCM : MRCM : MSCM : MSCM : MMSCM : MRCM : \n " ;
}
if ( units . getType ( ) = = Opm : : UnitSystem : : UnitType : : UNIT_TYPE_FIELD ) {
2020-09-10 02:42:52 -05:00
ss < < " : : : : : MSTB : MSTB : MMSCF : MRB : MSTB : MSTB : MMSCF : MRB : \n " ;
2019-11-01 06:56:20 -05:00
}
if ( units . getType ( ) = = Opm : : UnitSystem : : UnitType : : UNIT_TYPE_LAB ) {
2020-09-10 02:42:52 -05:00
ss < < " : : : : : MSCC : MSCC : MMSCC : MRCC : MSCC : MSCC : MMSCC : MRCC : \n " ;
2019-11-01 06:56:20 -05:00
}
2020-09-10 02:42:52 -05:00
ss < < " ==================================================================================================================================== \n " ;
2019-11-01 06:56:20 -05:00
}
else {
2019-10-30 08:09:51 -05:00
if ( wellCum [ WellCumDataType : : WellLocationi ] < 1 ) {
2019-11-06 06:25:04 -06:00
ss < < std : : right < < std : : fixed < < std : : setprecision ( 0 ) < < " : " < < std : : setw ( 8 ) < < wellCumNames [ WellCumDataType : : WellName ] < < " : " < < std : : setw ( 11 ) < < " " < < " : " < < std : : setw ( 8 ) < < wellCumNames [ WellCumDataType : : WellType ] < < " : " < < std : : setw ( 4 ) < < wellCumNames [ WellCumDataType : : WellCTRL ] < < " : " < < std : : setprecision ( 1 ) < < std : : setw ( 11 ) < < wellCum [ WellCumDataType : : OilProd ] / 1000 < < " : " < < std : : setw ( 11 ) < < wellCum [ WellCumDataType : : WaterProd ] / 1000 < < " : " < < std : : setw ( 11 ) < < wellCum [ WellCumDataType : : GasProd ] / 1000 < < " : " < < std : : setw ( 11 ) < < wellCum [ WellCumDataType : : FluidResVolProd ] / 1000 < < " : " < < std : : setw ( 11 ) < < wellCum [ WellCumDataType : : OilInj ] / 1000 < < " : " < < std : : setw ( 11 ) < < wellCum [ WellCumDataType : : WaterInj ] / 1000 < < " : " < < std : : setw ( 11 ) < < wellCum [ WellCumDataType : : GasInj ] / 1000 < < " : " < < std : : setw ( 11 ) < < wellCum [ WellCumDataType : : FluidResVolInj ] / 1000 < < " : \n " ;
2019-10-30 08:09:51 -05:00
}
2020-09-10 02:42:52 -05:00
else {
2019-11-06 06:25:04 -06:00
ss < < std : : right < < std : : fixed < < std : : setprecision ( 0 ) < < " : " < < std : : setw ( 8 ) < < wellCumNames [ WellCumDataType : : WellName ] < < " : " < < std : : setw ( 5 ) < < wellCum [ WellCumDataType : : WellLocationi ] < < " , " < < std : : setw ( 5 ) < < wellCum [ WellCumDataType : : WellLocationj ] < < " : " < < std : : setw ( 8 ) < < wellCumNames [ WellCumDataType : : WellType ] < < " : " < < std : : setw ( 4 ) < < wellCumNames [ WellCumDataType : : WellCTRL ] < < " : " < < std : : setprecision ( 1 ) < < std : : setw ( 11 ) < < wellCum [ WellCumDataType : : OilProd ] / 1000 < < " : " < < std : : setw ( 11 ) < < wellCum [ WellCumDataType : : WaterProd ] / 1000 < < " : " < < std : : setw ( 11 ) < < wellCum [ WellCumDataType : : GasProd ] / 1000 < < " : " < < std : : setw ( 11 ) < < wellCum [ WellCumDataType : : FluidResVolProd ] / 1000 < < " : " < < std : : setw ( 11 ) < < wellCum [ WellCumDataType : : OilInj ] / 1000 < < " : " < < std : : setw ( 11 ) < < wellCum [ WellCumDataType : : WaterInj ] / 1000 < < " : " < < std : : setw ( 11 ) < < wellCum [ WellCumDataType : : GasInj ] / 1000 < < " : " < < std : : setw ( 11 ) < < wellCum [ WellCumDataType : : FluidResVolInj ] / 1000 < < " : \n " ;
2019-10-30 08:09:51 -05:00
}
2020-09-10 02:42:52 -05:00
ss < < " :--------:-----------:--------:----:------------:----------:-----------:-----------:------------:----------:-----------:-----------: \n " ;
2019-10-26 06:13:44 -05:00
}
2019-11-01 06:56:20 -05:00
Opm : : OpmLog : : note ( ss . str ( ) ) ;
2019-10-26 06:13:44 -05:00
}
2018-01-12 08:32:43 -06:00
2019-10-30 09:27:41 -05:00
std : : string WPEnumToString_ ( int i )
{
typedef typename WellProdDataType : : WPId WPId ;
switch ( static_cast < WPId > ( i ) )
{
2019-11-01 06:56:20 -05:00
case WellProdDataType : : WellName : return " WName " ;
case WellProdDataType : : WellLocationi : return " WLi " ;
case WellProdDataType : : WellLocationj : return " WLj " ;
case WellProdDataType : : CTRLMode : return " CTRL " ;
case WellProdDataType : : OilRate : return " OR " ;
case WellProdDataType : : WaterRate : return " WR " ;
case WellProdDataType : : GasRate : return " GR " ;
case WellProdDataType : : FluidResVol : return " FRV " ;
case WellProdDataType : : WaterCut : return " WC " ;
case WellProdDataType : : GasOilRatio : return " GOR " ;
case WellProdDataType : : WatGasRatio : return " WGR " ;
case WellProdDataType : : BHP : return " BHP " ;
case WellProdDataType : : THP : return " THP " ;
case WellProdDataType : : SteadyStatePI : return " SteadyStatePI " ;
2019-10-30 09:27:41 -05:00
}
return " ERROR " ;
2020-09-10 02:42:52 -05:00
}
2019-11-01 06:56:20 -05:00
std : : string WIEnumToString_ ( int i )
2019-10-26 06:13:44 -05:00
{
typedef typename WellInjDataType : : WIId WIId ;
switch ( static_cast < WIId > ( i ) )
{
2019-11-01 06:56:20 -05:00
case WellInjDataType : : WellName : return " WName " ;
case WellInjDataType : : WellLocationi : return " WLi " ;
case WellInjDataType : : WellLocationj : return " WLj " ;
case WellInjDataType : : CTRLModeOil : return " CTRLo " ;
case WellInjDataType : : CTRLModeWat : return " CTRLw " ;
case WellInjDataType : : CTRLModeGas : return " CTRLg " ;
case WellInjDataType : : OilRate : return " OR " ;
case WellInjDataType : : WaterRate : return " WR " ;
case WellInjDataType : : GasRate : return " GR " ;
case WellInjDataType : : FluidResVol : return " FRV " ;
case WellInjDataType : : BHP : return " BHP " ;
case WellInjDataType : : THP : return " THP " ;
case WellInjDataType : : SteadyStateII : return " SteadyStateII " ;
2019-10-26 06:13:44 -05:00
}
return " ERROR " ;
}
2019-11-01 06:56:20 -05:00
std : : string WCEnumToString_ ( int i )
2019-10-26 06:13:44 -05:00
{
typedef typename WellCumDataType : : WCId WCId ;
switch ( static_cast < WCId > ( i ) )
{
2019-11-01 06:56:20 -05:00
case WellCumDataType : : WellName : return " WName " ;
case WellCumDataType : : WellLocationi : return " WLi " ;
case WellCumDataType : : WellLocationj : return " WLj " ;
case WellCumDataType : : WellType : return " WType " ;
case WellCumDataType : : WellCTRL : return " WCTRL " ;
case WellCumDataType : : OilProd : return " OP " ;
case WellCumDataType : : WaterProd : return " WP " ;
case WellCumDataType : : GasProd : return " GP " ;
case WellCumDataType : : FluidResVolProd : return " FRVP " ;
case WellCumDataType : : OilInj : return " OI " ;
case WellCumDataType : : WaterInj : return " WI " ;
case WellCumDataType : : GasInj : return " GI " ;
case WellCumDataType : : FluidResVolInj : return " FRVI " ;
2019-10-26 06:13:44 -05:00
}
return " ERROR " ;
}
2018-01-12 08:32:43 -06:00
2020-03-25 05:15:35 -05:00
bool isOutputCreationDirective_ ( const std : : string & keyword ) const
{
return ( keyword = = " BASIC " ) | | ( keyword = = " FREQ " )
| | ( keyword = = " RESTART " ) // From RPTSCHED
| | ( keyword = = " SAVE " ) | | ( keyword = = " SFREQ " ) ; // Not really supported
}
2017-12-07 05:38:48 -06:00
const Simulator & simulator_ ;
2018-01-22 06:38:50 -06:00
bool outputFipRestart_ ;
2018-01-23 02:46:56 -06:00
bool computeFip_ ;
2018-07-26 05:31:32 -05:00
bool forceDisableFipOutput_ ;
2018-01-19 08:45:42 -06:00
2014-11-28 05:58:48 -06:00
ScalarBuffer saturation_ [ numPhases ] ;
2017-12-07 05:38:48 -06:00
ScalarBuffer oilPressure_ ;
ScalarBuffer temperature_ ;
2014-11-28 05:58:48 -06:00
ScalarBuffer gasDissolutionFactor_ ;
2016-11-15 11:00:48 -06:00
ScalarBuffer oilVaporizationFactor_ ;
2015-01-26 04:55:37 -06:00
ScalarBuffer gasFormationVolumeFactor_ ;
2017-12-07 05:38:48 -06:00
ScalarBuffer saturatedOilFormationVolumeFactor_ ;
2014-11-28 05:58:48 -06:00
ScalarBuffer oilSaturationPressure_ ;
2017-12-07 05:38:48 -06:00
ScalarBuffer rs_ ;
ScalarBuffer rv_ ;
ScalarBuffer invB_ [ numPhases ] ;
ScalarBuffer density_ [ numPhases ] ;
ScalarBuffer viscosity_ [ numPhases ] ;
ScalarBuffer relativePermeability_ [ numPhases ] ;
ScalarBuffer sSol_ ;
ScalarBuffer cPolymer_ ;
2019-04-26 03:38:37 -05:00
ScalarBuffer cFoam_ ;
2019-11-07 02:39:42 -06:00
ScalarBuffer cSalt_ ;
2017-12-07 05:38:48 -06:00
ScalarBuffer soMax_ ;
ScalarBuffer pcSwMdcOw_ ;
ScalarBuffer krnSwMdcOw_ ;
ScalarBuffer pcSwMdcGo_ ;
ScalarBuffer krnSwMdcGo_ ;
2018-09-07 03:19:00 -05:00
ScalarBuffer ppcw_ ;
2017-12-07 05:38:48 -06:00
ScalarBuffer bubblePointPressure_ ;
ScalarBuffer dewPointPressure_ ;
2019-03-12 09:51:41 -05:00
ScalarBuffer rockCompPorvMultiplier_ ;
ScalarBuffer rockCompTransMultiplier_ ;
ScalarBuffer swMax_ ;
ScalarBuffer overburdenPressure_ ;
ScalarBuffer minimumOilPressure_ ;
2017-12-07 05:38:48 -06:00
std : : vector < int > failedCellsPb_ ;
std : : vector < int > failedCellsPd_ ;
2020-09-07 03:22:42 -05:00
std : : unordered_map < std : : string , std : : vector < int > > regions_ ;
std : : array < ScalarBuffer , FipDataType : : numFipTypes > fip_ ;
std : : optional < std : : array < ScalarBuffer , FipDataType : : numFipTypes > > regionInitialInplace_ ;
std : : optional < std : : array < Scalar , FipDataType : : numFipTypes > > fieldInitialInplace_ ;
std : : vector < Opm : : SummaryConfigNode > RPRNodes_ ;
std : : vector < Opm : : SummaryConfigNode > RPRPNodes_ ;
std : : array < std : : vector < Opm : : SummaryConfigNode > , FipDataType : : numFipTypes > regionNodes_ ;
2018-01-29 01:43:42 -06:00
ScalarBuffer hydrocarbonPoreVolume_ ;
ScalarBuffer pressureTimesPoreVolume_ ;
ScalarBuffer pressureTimesHydrocarbonVolume_ ;
2018-02-09 05:57:34 -06:00
std : : map < std : : pair < std : : string , int > , double > blockData_ ;
2018-06-28 08:49:45 -05:00
std : : map < size_t , Scalar > oilConnectionPressures_ ;
std : : map < size_t , Scalar > waterConnectionSaturations_ ;
std : : map < size_t , Scalar > gasConnectionSaturations_ ;
2018-11-14 06:10:01 -06:00
std : : vector < ScalarBuffer > tracerConcentrations_ ;
2014-11-28 05:58:48 -06:00
} ;
2019-09-05 10:04:39 -05:00
} // namespace Opm
2014-11-28 05:58:48 -06:00
# endif