00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00027 #ifndef OPM_CONSTANT_COMPRESSIBILITY_OIL_PVT_HPP
00028 #define OPM_CONSTANT_COMPRESSIBILITY_OIL_PVT_HPP
00029
00030 #include <opm/material/common/OpmFinal.hpp>
00031 #include <opm/material/common/UniformXTabulated2DFunction.hpp>
00032 #include <opm/material/common/Tabulated1DFunction.hpp>
00033 #include <opm/material/common/Spline.hpp>
00034
00035 #if HAVE_OPM_PARSER
00036 #include <opm/parser/eclipse/Deck/Deck.hpp>
00037 #include <opm/parser/eclipse/Deck/DeckItem.hpp>
00038 #include <opm/parser/eclipse/Deck/DeckKeyword.hpp>
00039 #include <opm/parser/eclipse/Deck/DeckRecord.hpp>
00040 #include <opm/parser/eclipse/EclipseState/EclipseState.hpp>
00041 #endif
00042
00043 namespace Opm {
00048 template <class Scalar>
00049 class ConstantCompressibilityOilPvt
00050 {
00051 typedef Opm::Tabulated1DFunction<Scalar> TabulatedOneDFunction;
00052 typedef std::vector<std::pair<Scalar, Scalar> > SamplingPoints;
00053
00054 public:
00055 #if HAVE_OPM_PARSER
00056
00063 void initFromDeck(const Deck& deck, const EclipseState& )
00064 {
00065 const auto& pvcdoKeyword = deck.getKeyword("PVCDO");
00066 const auto& densityKeyword = deck.getKeyword("DENSITY");
00067
00068 assert(pvcdoKeyword.size() == densityKeyword.size());
00069
00070 size_t numRegions = pvcdoKeyword.size();
00071 setNumRegions(numRegions);
00072
00073 for (unsigned regionIdx = 0; regionIdx < numRegions; ++ regionIdx) {
00074 Scalar rhoRefO = densityKeyword.getRecord(regionIdx).getItem("OIL").getSIDouble(0);
00075 Scalar rhoRefG = densityKeyword.getRecord(regionIdx).getItem("GAS").getSIDouble(0);
00076 Scalar rhoRefW = densityKeyword.getRecord(regionIdx).getItem("WATER").getSIDouble(0);
00077
00078 setReferenceDensities(regionIdx, rhoRefO, rhoRefG, rhoRefW);
00079
00080 auto pvcdoRecord = pvcdoKeyword.getRecord(regionIdx);
00081 oilReferencePressure_[regionIdx] =
00082 pvcdoRecord.getItem("P_REF").getSIDouble(0);
00083 oilReferenceFormationVolumeFactor_[regionIdx] =
00084 pvcdoRecord.getItem("OIL_VOL_FACTOR").getSIDouble(0);
00085 oilCompressibility_[regionIdx] =
00086 pvcdoRecord.getItem("OIL_COMPRESSIBILITY").getSIDouble(0);
00087 oilViscosity_[regionIdx] =
00088 pvcdoRecord.getItem("OIL_VISCOSITY").getSIDouble(0);
00089 oilViscosibility_[regionIdx] =
00090 pvcdoRecord.getItem("OIL_VISCOSIBILITY").getSIDouble(0);
00091 }
00092
00093 initEnd();
00094 }
00095 #endif
00096
00097 void setNumRegions(size_t numRegions)
00098 {
00099 oilReferenceDensity_.resize(numRegions);
00100 oilReferencePressure_.resize(numRegions);
00101 oilReferenceFormationVolumeFactor_.resize(numRegions);
00102 oilCompressibility_.resize(numRegions);
00103 oilViscosity_.resize(numRegions);
00104 oilViscosibility_.resize(numRegions);
00105
00106 for (unsigned regionIdx = 0; regionIdx < numRegions; ++regionIdx) {
00107 setReferenceFormationVolumeFactor(regionIdx, 1.0);
00108 setReferencePressure(regionIdx, 1.03125);
00109 }
00110 }
00111
00115 void setReferenceDensities(unsigned regionIdx,
00116 Scalar rhoRefOil,
00117 Scalar ,
00118 Scalar )
00119 { oilReferenceDensity_[regionIdx] = rhoRefOil; }
00120
00124 void setViscosity(unsigned regionIdx, Scalar muo, Scalar oilViscosibility = 0.0)
00125 {
00126 oilViscosity_[regionIdx] = muo;
00127 oilViscosibility_[regionIdx] = oilViscosibility;
00128 }
00129
00133 void setCompressibility(unsigned regionIdx, Scalar oilCompressibility)
00134 { oilCompressibility_[regionIdx] = oilCompressibility; }
00135
00139 void setReferencePressure(unsigned regionIdx, Scalar p)
00140 { oilReferencePressure_[regionIdx] = p; }
00141
00145 void setReferenceFormationVolumeFactor(unsigned regionIdx, Scalar BoRef)
00146 { oilReferenceFormationVolumeFactor_[regionIdx] = BoRef; }
00147
00151 void setViscosibility(unsigned regionIdx, Scalar muComp)
00152 { oilViscosibility_[regionIdx] = muComp; }
00153
00157 void initEnd()
00158 { }
00159
00163 unsigned numRegions() const
00164 { return oilViscosity_.size(); }
00165
00170 template <class Evaluation>
00171 Evaluation viscosity(unsigned regionIdx,
00172 const Evaluation& temperature,
00173 const Evaluation& pressure,
00174 const Evaluation& ) const
00175 { return saturatedViscosity(regionIdx, temperature, pressure); }
00176
00180 template <class Evaluation>
00181 Evaluation saturatedViscosity(unsigned regionIdx,
00182 const Evaluation& temperature,
00183 const Evaluation& pressure) const
00184 {
00185 Scalar BoMuoRef = oilViscosity_[regionIdx]*oilReferenceFormationVolumeFactor_[regionIdx];
00186 const Evaluation& bo = saturatedInverseFormationVolumeFactor(regionIdx, temperature, pressure);
00187
00188 Scalar pRef = oilReferencePressure_[regionIdx];
00189 const Evaluation& Y =
00190 (oilCompressibility_[regionIdx] - oilViscosibility_[regionIdx])
00191 * (pressure - pRef);
00192 return BoMuoRef*bo/(1.0 + Y*(1.0 + Y/2.0));
00193 }
00194
00198 template <class Evaluation>
00199 Evaluation inverseFormationVolumeFactor(unsigned regionIdx,
00200 const Evaluation& temperature,
00201 const Evaluation& pressure,
00202 const Evaluation& ) const
00203 { return saturatedInverseFormationVolumeFactor(regionIdx, temperature, pressure); }
00204
00211 template <class Evaluation>
00212 Evaluation saturatedInverseFormationVolumeFactor(unsigned regionIdx,
00213 const Evaluation& ,
00214 const Evaluation& pressure) const
00215 {
00216
00217 Scalar pRef = oilReferencePressure_[regionIdx];
00218 const Evaluation& X = oilCompressibility_[regionIdx]*(pressure - pRef);
00219
00220 Scalar BoRef = oilReferenceFormationVolumeFactor_[regionIdx];
00221 return (1 + X*(1 + X/2))/BoRef;
00222 }
00223
00227 template <class Evaluation>
00228 Evaluation saturatedGasDissolutionFactor(unsigned ,
00229 const Evaluation& ,
00230 const Evaluation& ) const
00231 { return 0.0; }
00232
00236 template <class Evaluation>
00237 Evaluation saturatedGasDissolutionFactor(unsigned ,
00238 const Evaluation& ,
00239 const Evaluation& ,
00240 const Evaluation& ,
00241 Scalar ) const
00242 { return 0.0; }
00243
00250 template <class Evaluation>
00251 Evaluation saturationPressure(unsigned ,
00252 const Evaluation& ,
00253 const Evaluation& ) const
00254 { return 0.0; }
00255
00256 private:
00257 std::vector<Scalar> oilReferenceDensity_;
00258 std::vector<Scalar> oilReferencePressure_;
00259 std::vector<Scalar> oilReferenceFormationVolumeFactor_;
00260 std::vector<Scalar> oilCompressibility_;
00261 std::vector<Scalar> oilViscosity_;
00262 std::vector<Scalar> oilViscosibility_;
00263 };
00264
00265 }
00266
00267 #endif