mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
refactor well controls use new well controls gourp.
This commit is contained in:
@@ -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,15 +617,18 @@ 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);
|
||||||
for (int phase = 0; phase < np; ++phase) {
|
{
|
||||||
rate_distr.insert(w, phase*nw + w) = wc->distr[phase];
|
const double* distr = well_controls_get_current_distr(wc);
|
||||||
}
|
for (int phase = 0; phase < np; ++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.");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,15 +499,18 @@ 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);
|
||||||
for (int phase = 0; phase < np; ++phase) {
|
{
|
||||||
rate_distr.insert(w, phase*nw + w) = wc->distr[phase];
|
const double* distr = well_controls_get_current_distr(wc);
|
||||||
}
|
for (int phase = 0; phase < np; ++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.");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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_;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user