00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef OPM_INCOMPPROPERTIESDEFAULTPOLYMER_HEADER_INCLUDED
00021 #define OPM_INCOMPPROPERTIESDEFAULTPOLYMER_HEADER_INCLUDED
00022
00023 #include <opm/core/props/IncompPropertiesBasic.hpp>
00024 #include <opm/core/utility/parameters/ParameterGroup.hpp>
00025 #include <opm/common/ErrorMacros.hpp>
00026 #include <opm/core/utility/linearInterpolation.hpp>
00027 #include <vector>
00028
00029 namespace Opm
00030 {
00031
00032 class IncompPropertiesDefaultPolymer : public Opm::IncompPropertiesBasic
00033 {
00034 public:
00043 IncompPropertiesDefaultPolymer(const Opm::ParameterGroup& param, int dim, int num_cells)
00044 : Opm::IncompPropertiesBasic(param, dim, num_cells)
00045 {
00046 assert(numPhases() == 2);
00047 sw_.resize(3);
00048 sw_[0] = 0.2;
00049 sw_[1] = 0.7;
00050 sw_[2] = 1.0;
00051 krw_.resize(3);
00052 krw_[0] = 0.0;
00053 krw_[1] = 0.7;
00054 krw_[2] = 1.0;
00055 so_.resize(2);
00056 so_[0] = 0.3;
00057 so_[1] = 0.8;
00058 kro_.resize(2);
00059 kro_[0] = 0.0;
00060 kro_[1] = 1.0;
00061 }
00062
00072
00073 virtual void relperm(const int n,
00074 const double* s,
00075 const int* ,
00076 double* kr,
00077 double* dkrds) const
00078 {
00079
00080
00081 for (int i = 0; i < n; ++i) {
00082 kr[2*i] = krw(s[2*i]);
00083 kr[2*i+1] = kro(s[2*i+1]);
00084 if (dkrds != 0) {
00085 dkrds[4*i + 0] = krw_dsw(s[2*i]);
00086 dkrds[4*i + 3] = kro_dso(s[2*i+1]);
00087 dkrds[4*i + 1] = 0.0;
00088 dkrds[4*i + 2] = 0.0;
00089 }
00090 }
00091 }
00092
00100 virtual void satRange(const int n,
00101 const int* ,
00102 double* smin,
00103 double* smax) const
00104 {
00105 const int np = 2;
00106 for (int i = 0; i < n; ++i) {
00107 smin[np*i + 0] = sw_[0];
00108 smax[np*i + 0] = sw_.back();
00109 smin[np*i + 1] = 1.0 - sw_[0];
00110 smax[np*i + 1] = 1.0 - sw_.back();
00111 }
00112 }
00113
00114 private:
00115 double krw(double s) const
00116 {
00117 return Opm::linearInterpolation(sw_, krw_, s);
00118 }
00119
00120 double krw_dsw(double s) const
00121 {
00122 return Opm::linearInterpolationDerivative(sw_, krw_, s);
00123 }
00124
00125
00126 double kro(double s) const
00127 {
00128 return Opm::linearInterpolation(so_, kro_, s);
00129 }
00130
00131 double kro_dso(double s) const
00132 {
00133 return Opm::linearInterpolationDerivative(so_, kro_, s);
00134 }
00135
00136 std::vector<double> sw_;
00137 std::vector<double> krw_;
00138 std::vector<double> so_;
00139 std::vector<double> kro_;
00140 };
00141
00142 }
00143
00144 #endif // OPM_INCOMPPROPERTIESDEFAULTPOLYMER_HEADER_INCLUDED