mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
Add license and documentation.
This commit is contained in:
@@ -7,161 +7,16 @@
|
||||
namespace Opm {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
typedef PolymerPropsAd::ADB ADB;
|
||||
typedef PolymerPropsAd::V V;
|
||||
|
||||
/*
|
||||
PolymerPropsAd::PolymerPropsAd()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
PolymerPropsAd::PolymerPropsAd(const int num_cells,
|
||||
const double c_max,
|
||||
const double mix_param,
|
||||
const double std::vector<double>& c_vals_visc,
|
||||
const double std::vector<double>& visc_mult_vals)
|
||||
: num_cells_ (num_cells)
|
||||
, c_max_ (c_max)
|
||||
, mix_param_(mix_param)
|
||||
, c_vals_visc_ (c_vals_visc)
|
||||
, visc_mult_vals_ (visc_mult_vals)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
double PolymerPropsAd::num_cells() const
|
||||
{
|
||||
return num__cells_;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
double PolymerPropsAd::cMax() const
|
||||
{
|
||||
return c_max_;
|
||||
}
|
||||
|
||||
|
||||
|
||||
double PolymerPropsAd::mixParam() const
|
||||
{
|
||||
return mix_param_;
|
||||
}
|
||||
|
||||
|
||||
|
||||
V PolymerPropsAd::muM(const V& c,
|
||||
const double* visc) const
|
||||
{
|
||||
const int nc = num_cells();
|
||||
assert(nc == c.size());
|
||||
std::vector<double> mu(nc);
|
||||
|
||||
for (int i = 0; i < nc; ++i) {
|
||||
mu[i] = Opm::linearInterpolation(c_vals_visc_, visc_mult_vals_, c(i));
|
||||
}
|
||||
|
||||
const V muM = Eigen::Map<const V>(&mu[0], nc);
|
||||
|
||||
const double mu_w = visc[0];
|
||||
|
||||
return muM * mu_w;
|
||||
}
|
||||
|
||||
|
||||
|
||||
ADB PolymerPropsAd::muM(const ADB& c,
|
||||
const double* visc) const
|
||||
{
|
||||
const int nc = num_cells();
|
||||
assert(nc == c.size());
|
||||
|
||||
V mu_m = muM(c.value());
|
||||
|
||||
std::vector<double> dmu_dc(nc);
|
||||
|
||||
for (int i = 0; i < nc; ++i) {
|
||||
dmu_dc[i] = Opm::linearInterpolationDerivative(c_vals_visc_, visc_mult_vals_, c.value()(i));
|
||||
}
|
||||
|
||||
const V dmu = Eigen::Map<const V>(&dmu_dc[0], nc);
|
||||
|
||||
ADB::M dmu_diag = spdiag(dmu);
|
||||
const int num_blocks = c.numBlocks();
|
||||
std::vector<ADB::M> jacs(num_blocks);
|
||||
|
||||
for (int block = 0; block < num_blocks; ++block) {
|
||||
jacs[block] = dmu_diag * c.derivative()[block];
|
||||
}
|
||||
|
||||
const double mu_w = visc[0]
|
||||
|
||||
return ADB::function(mu_m, jacs) * mu_w;
|
||||
}
|
||||
|
||||
|
||||
|
||||
V PolymerPropsAd::ToddLongstaff(const double mix_param,
|
||||
const V& muM,
|
||||
const V& mu) const
|
||||
{
|
||||
const int nc = num_cells();
|
||||
assert(nc == muM.size());
|
||||
|
||||
std::vector<double> mueff(nc);
|
||||
const double omega = mix_param;
|
||||
|
||||
for (int i = 0; i < nc; ++i) {
|
||||
mueff[i] = std::pow(muM(i),omega) * std::pow(mu(i), 1. - omega);
|
||||
}
|
||||
|
||||
const V muEff = Eigen::Map<const V>(&mueff[0], nc);
|
||||
|
||||
return muEff;
|
||||
}
|
||||
|
||||
|
||||
ADB PolymerPropsAd::ToddLongstaff(const double mix_param,
|
||||
const ADB& muM,
|
||||
const ADB& mu) const
|
||||
{
|
||||
const int nc = num_cells();
|
||||
|
||||
}
|
||||
|
||||
|
||||
V PolymerPropsAd::muPolyEff(const double mix_param,
|
||||
const V& muM,
|
||||
const V& muPoly) const
|
||||
{
|
||||
|
||||
return ToddLongstaff(mix_param, muM, muPoly);
|
||||
}
|
||||
|
||||
V PolymerPropsAd::muWatEff(const double mix_param,
|
||||
const std::vecotr<double>& c_max,
|
||||
const V& c,
|
||||
const V& muM,
|
||||
const V& muWat,
|
||||
const V& muPolyEff) const
|
||||
{
|
||||
const int nc = num_cells();
|
||||
assert(nc == c.size());
|
||||
V muWate = ToddLongstaff(mix_param, muM, muWat);
|
||||
|
||||
// V cmax = V::Constant(nc, 1, c_max);
|
||||
const V cmax = Eigen::Map<const V>(&c_max[0], nc);
|
||||
const V one = V::Ones(nc, 1);
|
||||
V inv_muWatEff = (one - c / cmax) / muWate + c / cmax / muPolyEff;
|
||||
|
||||
V muWatEff = one / inv_muWatEff;
|
||||
|
||||
return muWatEff;
|
||||
|
||||
}
|
||||
*/
|
||||
double
|
||||
PolymerPropsAd::rockDensity() const
|
||||
{
|
||||
@@ -171,17 +26,25 @@ namespace Opm {
|
||||
|
||||
|
||||
|
||||
|
||||
double
|
||||
PolymerPropsAd::deadPoreVol() const
|
||||
{
|
||||
return polymer_props_.deadPoreVol();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
double
|
||||
PolymerPropsAd::cMax() const
|
||||
{
|
||||
return polymer_props_.cMax();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
PolymerPropsAd::PolymerPropsAd(const PolymerProperties& polymer_props)
|
||||
@@ -192,6 +55,7 @@ namespace Opm {
|
||||
|
||||
|
||||
|
||||
|
||||
PolymerPropsAd::~PolymerPropsAd()
|
||||
{
|
||||
}
|
||||
@@ -199,6 +63,7 @@ namespace Opm {
|
||||
|
||||
|
||||
|
||||
|
||||
V PolymerPropsAd::effectiveInvWaterVisc(const V& c,
|
||||
const double* visc) const
|
||||
{
|
||||
@@ -217,7 +82,6 @@ namespace Opm {
|
||||
|
||||
|
||||
|
||||
|
||||
ADB PolymerPropsAd::effectiveInvWaterVisc(const ADB& c,
|
||||
const double* visc) const
|
||||
{
|
||||
@@ -242,6 +106,7 @@ namespace Opm {
|
||||
|
||||
|
||||
|
||||
|
||||
V PolymerPropsAd::polymerWaterVelocityRatio(const V& c) const
|
||||
{
|
||||
const int nc = c.size();
|
||||
@@ -288,6 +153,8 @@ namespace Opm {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
V PolymerPropsAd::adsorption(const V& c, const V& cmax_cells) const
|
||||
{
|
||||
const int nc = c.size();
|
||||
@@ -303,6 +170,10 @@ namespace Opm {
|
||||
return ads;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
ADB PolymerPropsAd::adsorption(const ADB& c, const ADB& cmax_cells) const
|
||||
{
|
||||
const int nc = c.value().size();
|
||||
@@ -329,6 +200,9 @@ namespace Opm {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
V
|
||||
PolymerPropsAd::effectiveRelPerm(const V& c,
|
||||
const V& cmax_cells,
|
||||
@@ -348,6 +222,9 @@ namespace Opm {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
ADB
|
||||
PolymerPropsAd::effectiveRelPerm(const ADB& c,
|
||||
const ADB& cmax_cells,
|
||||
@@ -355,9 +232,7 @@ namespace Opm {
|
||||
const ADB& sw) const
|
||||
{
|
||||
const int nc = c.value().size();
|
||||
|
||||
V one = V::Ones(nc);
|
||||
|
||||
ADB ads = adsorption(c, cmax_cells);
|
||||
V krw_eff = effectiveRelPerm(c.value(), cmax_cells.value(), krw.value());
|
||||
|
||||
@@ -365,15 +240,14 @@ namespace Opm {
|
||||
double res_factor = polymer_props_.resFactor();
|
||||
double factor = (res_factor - 1.) / max_ads;
|
||||
ADB rk = one + ads * factor;
|
||||
// ADB dkrw_ds = krw / rk.value();
|
||||
ADB dkrw_ds = krw / rk;
|
||||
// ADB dkrw_dc = -krw.value() / (rk.value() * rk.value()) * ads * factor;
|
||||
ADB dkrw_dc = -factor * krw / (rk * rk) * ads ;
|
||||
|
||||
const int num_blocks = c.numBlocks();
|
||||
std::vector<ADB::M> jacs(num_blocks);
|
||||
for (int block = 0; block < num_blocks; ++block) {
|
||||
jacs[block] = dkrw_ds.derivative()[block] * sw.derivative()[block] + dkrw_dc.derivative()[block] * c.derivative()[block];
|
||||
jacs[block] = dkrw_ds.derivative()[block] * sw.derivative()[block]
|
||||
+ dkrw_dc.derivative()[block] * c.derivative()[block];
|
||||
}
|
||||
|
||||
return ADB::function(krw_eff, jacs);
|
||||
|
||||
Reference in New Issue
Block a user