refactor well controls use new well controls gourp.

This commit is contained in:
Liu Ming
2014-01-10 14:15:24 +08:00
parent 7243418cc5
commit 139bfb7e62
4 changed files with 34 additions and 21 deletions

View File

@@ -31,7 +31,7 @@
#include <opm/polymer/PolymerBlackoilState.hpp> #include <opm/polymer/PolymerBlackoilState.hpp>
#include <opm/core/simulator/WellState.hpp> #include <opm/core/simulator/WellState.hpp>
#include <opm/core/utility/ErrorMacros.hpp> #include <opm/core/utility/ErrorMacros.hpp>
#include <opm/core/well_controls.h>
#include <cassert> #include <cassert>
#include <cmath> #include <cmath>
#include <iostream> #include <iostream>
@@ -590,7 +590,7 @@ namespace {
const ADB perf_mob = producer.select(subset(cell_mob, well_cells), const ADB perf_mob = producer.select(subset(cell_mob, well_cells),
perf_mob_injector); perf_mob_injector);
const ADB perf_flux = perf_mob * (nkgradp_well); // No gravity term for perforations. const ADB perf_flux = perf_mob * (nkgradp_well); // No gravity term for perforations.
well_perf_rates[phase] = (perf_flux*perf_b); well_perf_rates[phase] = (perf_flux * perf_b);
const ADB well_rates = wops_.p2w * well_perf_rates[phase]; const ADB well_rates = wops_.p2w * well_perf_rates[phase];
well_rates_all += superset(well_rates, Span(nw, 1, phase*nw), nw*np); well_rates_all += superset(well_rates, Span(nw, 1, phase*nw), nw*np);
@@ -617,14 +617,17 @@ namespace {
M rate_distr(nw, np*nw); M rate_distr(nw, np*nw);
for (int w = 0; w < nw; ++w) { for (int w = 0; w < nw; ++w) {
const WellControls* wc = wells_.ctrls[w]; const WellControls* wc = wells_.ctrls[w];
if (wc->type[wc->current] == BHP) { if (well_controls_get_current_type(wc) == BHP) {
bhp_targets[w] = wc->target[wc->current]; bhp_targets[w] = well_controls_get_current_target(wc);
rate_targets[w] = -1e100; rate_targets[w] = -1e100;
} else if (wc->type[wc->current] == SURFACE_RATE) { } else if (well_controls_get_current_type(wc) == SURFACE_RATE) {
bhp_targets[w] = -1e100; bhp_targets[w] = -1e100;
rate_targets[w] = wc->target[wc->current]; rate_targets[w] = well_controls_get_current_target(wc);
{
const double* distr = well_controls_get_current_distr(wc);
for (int phase = 0; phase < np; ++phase) { for (int phase = 0; phase < np; ++phase) {
rate_distr.insert(w, phase*nw + w) = wc->distr[phase]; rate_distr.insert(w, phase*nw + w) = distr[phase];
}
} }
} else { } else {
OPM_THROW(std::runtime_error, "Can only handle BHP and SURFACE_RATE type controls."); OPM_THROW(std::runtime_error, "Can only handle BHP and SURFACE_RATE type controls.");

View File

@@ -15,7 +15,7 @@
#include <opm/core/simulator/TwophaseState.hpp> #include <opm/core/simulator/TwophaseState.hpp>
#include <opm/core/simulator/WellState.hpp> #include <opm/core/simulator/WellState.hpp>
#include <opm/core/utility/ErrorMacros.hpp> #include <opm/core/utility/ErrorMacros.hpp>
#include <opm/core/well_controls.h>
#include <cassert> #include <cassert>
#include <cmath> #include <cmath>
#include <iostream> #include <iostream>
@@ -499,14 +499,17 @@ namespace {
M rate_distr(nw, np*nw); M rate_distr(nw, np*nw);
for (int w = 0; w < nw; ++w) { for (int w = 0; w < nw; ++w) {
const WellControls* wc = wells_.ctrls[w]; const WellControls* wc = wells_.ctrls[w];
if (wc->type[wc->current] == BHP) { if (well_controls_get_current_type(wc) == BHP) {
bhp_targets[w] = wc->target[wc->current]; bhp_targets[w] = well_controls_get_current_target(wc);
rate_targets[w] = -1e100; rate_targets[w] = -1e100;
} else if (wc->type[wc->current] == SURFACE_RATE) { } else if (well_controls_get_current_type(wc) == SURFACE_RATE) {
bhp_targets[w] = -1e100; bhp_targets[w] = -1e100;
rate_targets[w] = wc->target[wc->current]; rate_targets[w] = well_controls_get_current_target(wc);
{
const double* distr = well_controls_get_current_distr(wc);
for (int phase = 0; phase < np; ++phase) { for (int phase = 0; phase < np; ++phase) {
rate_distr.insert(w, phase*nw + w) = wc->distr[phase]; rate_distr.insert(w, phase*nw + w) = distr[phase];
}
} }
} else { } else {
OPM_THROW(std::runtime_error, "Can only handle BHP type controls."); OPM_THROW(std::runtime_error, "Can only handle BHP type controls.");

View File

@@ -1,4 +1,3 @@
#include <cmath> #include <cmath>
#include <vector> #include <vector>
#include <opm/polymer/fullyimplicit/AutoDiffBlock.hpp> #include <opm/polymer/fullyimplicit/AutoDiffBlock.hpp>
@@ -170,6 +169,8 @@ namespace Opm {
} }
double double
PolymerPropsAd::deadPoreVol() const PolymerPropsAd::deadPoreVol() const
{ {
@@ -360,8 +361,10 @@ namespace Opm {
double res_factor = polymer_props_.resFactor(); double res_factor = polymer_props_.resFactor();
double factor = (res_factor - 1.) / max_ads; double factor = (res_factor - 1.) / max_ads;
ADB rk = one + ads * factor; ADB rk = one + ads * factor;
ADB dkrw_ds = krw / rk.value(); // ADB dkrw_ds = krw / rk.value();
ADB dkrw_dc = -krw.value() / (rk.value() * rk.value()) * ads * factor; 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(); const int num_blocks = c.numBlocks();
std::vector<ADB::M> jacs(num_blocks); std::vector<ADB::M> jacs(num_blocks);

View File

@@ -65,8 +65,10 @@ namespace Opm {
*/ */
double rockDensity() const; double rockDensity() const;
double deadPoreVol() const; double deadPoreVol() const;
typedef AutoDiffBlock<double> ADB; typedef AutoDiffBlock<double> ADB;
typedef ADB::V V; typedef ADB::V V;
PolymerPropsAd(const PolymerProperties& polymer_props); PolymerPropsAd(const PolymerProperties& polymer_props);
~PolymerPropsAd(); ~PolymerPropsAd();
@@ -94,6 +96,8 @@ namespace Opm {
ADB ADB
effectiveRelPerm(const ADB& c, const ADB& cmax_cells, const ADB& krw, const ADB& sw) const; effectiveRelPerm(const ADB& c, const ADB& cmax_cells, const ADB& krw, const ADB& sw) const;
private: private:
const PolymerProperties& polymer_props_; const PolymerProperties& polymer_props_;
}; };