normalized tabification in spu_2p.
This commit is contained in:
parent
51c1da1df8
commit
fd9a3318b0
@ -162,9 +162,9 @@ class SimpleFluid2pWrappingProps
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SimpleFluid2pWrappingProps(const Opm::IncompPropertiesInterface& props)
|
SimpleFluid2pWrappingProps(const Opm::IncompPropertiesInterface& props)
|
||||||
: props_(props),
|
: props_(props),
|
||||||
smin_(props.numCells()*props.numPhases()),
|
smin_(props.numCells()*props.numPhases()),
|
||||||
smax_(props.numCells()*props.numPhases())
|
smax_(props.numCells()*props.numPhases())
|
||||||
{
|
{
|
||||||
if (props.numPhases() != 2) {
|
if (props.numPhases() != 2) {
|
||||||
THROW("SimpleFluid2pWrapper requires 2 phases.");
|
THROW("SimpleFluid2pWrapper requires 2 phases.");
|
||||||
@ -183,8 +183,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class Sat,
|
template <class Sat,
|
||||||
class Mob,
|
class Mob,
|
||||||
class DMob>
|
class DMob>
|
||||||
void mobility(int c, const Sat& s, Mob& mob, DMob& dmob) const
|
void mobility(int c, const Sat& s, Mob& mob, DMob& dmob) const
|
||||||
{
|
{
|
||||||
props_.relperm(1, &s[0], &c, &mob[0], &dmob[0]);
|
props_.relperm(1, &s[0], &c, &mob[0], &dmob[0]);
|
||||||
@ -203,8 +203,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class Sat,
|
template <class Sat,
|
||||||
class Pcap,
|
class Pcap,
|
||||||
class DPcap>
|
class DPcap>
|
||||||
void pc(int c, const Sat& s, Pcap& pcap, DPcap& dpcap) const
|
void pc(int c, const Sat& s, Pcap& pcap, DPcap& dpcap) const
|
||||||
{
|
{
|
||||||
double pcow[2];
|
double pcow[2];
|
||||||
@ -252,12 +252,12 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
typedef Opm::ImplicitTransport<TransportModel,
|
typedef Opm::ImplicitTransport<TransportModel,
|
||||||
JacSys ,
|
JacSys ,
|
||||||
MaxNorm ,
|
MaxNorm ,
|
||||||
VectorNegater ,
|
VectorNegater ,
|
||||||
VectorZero ,
|
VectorZero ,
|
||||||
MatrixZero ,
|
MatrixZero ,
|
||||||
VectorAssign > TransportSolver;
|
VectorAssign > TransportSolver;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -324,11 +324,11 @@ main(int argc, char** argv)
|
|||||||
// Gravity.
|
// Gravity.
|
||||||
gravity[2] = deck.hasField("NOGRAV") ? 0.0 : Opm::unit::gravity;
|
gravity[2] = deck.hasField("NOGRAV") ? 0.0 : Opm::unit::gravity;
|
||||||
// Init state variables (saturation and pressure).
|
// Init state variables (saturation and pressure).
|
||||||
if (param.has("init_saturation")) {
|
if (param.has("init_saturation")) {
|
||||||
initStateTwophaseBasic(*grid->c_grid(), *props, param, gravity[2], state);
|
initStateTwophaseBasic(*grid->c_grid(), *props, param, gravity[2], state);
|
||||||
} else {
|
} else {
|
||||||
initStateTwophaseFromDeck(*grid->c_grid(), *props, deck, gravity[2], state);
|
initStateTwophaseFromDeck(*grid->c_grid(), *props, deck, gravity[2], state);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Grid init.
|
// Grid init.
|
||||||
const int nx = param.getDefault("nx", 100);
|
const int nx = param.getDefault("nx", 100);
|
||||||
@ -560,75 +560,76 @@ main(int argc, char** argv)
|
|||||||
if (rock_comp->isActive()) {
|
if (rock_comp->isActive()) {
|
||||||
rc.resize(num_cells);
|
rc.resize(num_cells);
|
||||||
std::vector<double> initial_pressure = state.pressure();
|
std::vector<double> initial_pressure = state.pressure();
|
||||||
std::vector<double> initial_porevolume(num_cells);
|
std::vector<double> initial_porevolume(num_cells);
|
||||||
computePorevolume(*grid->c_grid(), *props, *rock_comp, initial_pressure, initial_porevolume);
|
computePorevolume(*grid->c_grid(), *props, *rock_comp, initial_pressure, initial_porevolume);
|
||||||
std::vector<double> pressure_increment(num_cells + num_wells);
|
std::vector<double> pressure_increment(num_cells + num_wells);
|
||||||
std::vector<double> prev_pressure(num_cells + num_wells);
|
std::vector<double> prev_pressure(num_cells + num_wells);
|
||||||
for (int iter = 0; iter < nl_pressure_maxiter; ++iter) {
|
for (int iter = 0; iter < nl_pressure_maxiter; ++iter) {
|
||||||
|
|
||||||
for (int cell = 0; cell < num_cells; ++cell) {
|
|
||||||
rc[cell] = rock_comp->rockComp(state.pressure()[cell]);
|
|
||||||
}
|
|
||||||
computePorevolume(*grid->c_grid(), *props, *rock_comp, state.pressure(), porevol);
|
|
||||||
std::copy(state.pressure().begin(), state.pressure().end(), prev_pressure.begin());
|
|
||||||
std::copy(well_bhp.begin(), well_bhp.end(), prev_pressure.begin() + num_cells);
|
|
||||||
// prev_pressure = state.pressure();
|
|
||||||
|
|
||||||
// compute pressure increment
|
|
||||||
psolver.solveIncrement(totmob, omega, src, wdp, bcs.c_bcs(), porevol, rc,
|
|
||||||
prev_pressure, initial_porevolume, simtimer.currentStepLength(),
|
|
||||||
pressure_increment);
|
|
||||||
|
|
||||||
double max_change = 0.0;
|
for (int cell = 0; cell < num_cells; ++cell) {
|
||||||
for (int cell = 0; cell < num_cells; ++cell) {
|
rc[cell] = rock_comp->rockComp(state.pressure()[cell]);
|
||||||
state.pressure()[cell] += pressure_increment[cell];
|
}
|
||||||
max_change = std::max(max_change, std::fabs(pressure_increment[cell]));
|
computePorevolume(*grid->c_grid(), *props, *rock_comp, state.pressure(), porevol);
|
||||||
}
|
std::copy(state.pressure().begin(), state.pressure().end(), prev_pressure.begin());
|
||||||
for (int well = 0; well < num_wells; ++well) {
|
std::copy(well_bhp.begin(), well_bhp.end(), prev_pressure.begin() + num_cells);
|
||||||
well_bhp[well] += pressure_increment[num_cells + well];
|
// prev_pressure = state.pressure();
|
||||||
max_change = std::max(max_change, std::fabs(pressure_increment[num_cells + well]));
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cout << "Pressure iter " << iter << " max change = " << max_change << std::endl;
|
|
||||||
if (max_change < nl_pressure_tolerance) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
psolver.computeFaceFlux(totmob, omega, src, wdp, bcs.c_bcs(), state.pressure(), state.faceflux(),
|
|
||||||
well_bhp, well_perfrates);
|
|
||||||
} else {
|
|
||||||
psolver.solve(totmob, omega, src, wdp, bcs.c_bcs(), state.pressure(), state.faceflux(),
|
|
||||||
well_bhp, well_perfrates);
|
|
||||||
}
|
|
||||||
pressure_timer.stop();
|
|
||||||
double pt = pressure_timer.secsSinceStart();
|
|
||||||
std::cout << "Pressure solver took: " << pt << " seconds." << std::endl;
|
|
||||||
ptime += pt;
|
|
||||||
|
|
||||||
if (check_well_controls) {
|
// compute pressure increment
|
||||||
Opm::computePhaseFlowRatesPerWell(*wells->c_wells(),
|
psolver.solveIncrement(totmob, omega, src, wdp, bcs.c_bcs(), porevol, rc,
|
||||||
fractional_flows,
|
prev_pressure, initial_porevolume, simtimer.currentStepLength(),
|
||||||
well_perfrates,
|
pressure_increment);
|
||||||
well_resflows_phase);
|
|
||||||
std::cout << "Checking well conditions." << std::endl;
|
double max_change = 0.0;
|
||||||
// For testing we set surface := reservoir
|
for (int cell = 0; cell < num_cells; ++cell) {
|
||||||
well_control_passed = wells->conditionsMet(well_bhp, well_resflows_phase, well_resflows_phase);
|
state.pressure()[cell] += pressure_increment[cell];
|
||||||
++well_control_iteration;
|
max_change = std::max(max_change, std::fabs(pressure_increment[cell]));
|
||||||
if (!well_control_passed && well_control_iteration > max_well_control_iterations) {
|
}
|
||||||
THROW("Could not satisfy well conditions in " << max_well_control_iterations << " tries.");
|
for (int well = 0; well < num_wells; ++well) {
|
||||||
}
|
well_bhp[well] += pressure_increment[num_cells + well];
|
||||||
if (!well_control_passed) {
|
max_change = std::max(max_change, std::fabs(pressure_increment[num_cells + well]));
|
||||||
std::cout << "Well controls not passed, solving again." << std::endl;
|
}
|
||||||
} else {
|
|
||||||
std::cout << "Well conditions met." << std::endl;
|
std::cout << "Pressure iter " << iter << " max change = " << max_change << std::endl;
|
||||||
}
|
if (max_change < nl_pressure_tolerance) {
|
||||||
}
|
break;
|
||||||
} while (!well_control_passed);
|
}
|
||||||
|
}
|
||||||
// Process transport sources (to include bdy terms and well flows).
|
psolver.computeFaceFlux(totmob, omega, src, wdp, bcs.c_bcs(), state.pressure(), state.faceflux(),
|
||||||
Opm::computeTransportSource(*grid->c_grid(), src, state.faceflux(), 1.0,
|
well_bhp, well_perfrates);
|
||||||
wells->c_wells(), well_perfrates, reorder_src);
|
} else {
|
||||||
if (!use_reorder) {
|
psolver.solve(totmob, omega, src, wdp, bcs.c_bcs(), state.pressure(), state.faceflux(),
|
||||||
|
well_bhp, well_perfrates);
|
||||||
|
}
|
||||||
|
pressure_timer.stop();
|
||||||
|
double pt = pressure_timer.secsSinceStart();
|
||||||
|
std::cout << "Pressure solver took: " << pt << " seconds." << std::endl;
|
||||||
|
ptime += pt;
|
||||||
|
|
||||||
|
|
||||||
|
if (check_well_controls) {
|
||||||
|
Opm::computePhaseFlowRatesPerWell(*wells->c_wells(),
|
||||||
|
fractional_flows,
|
||||||
|
well_perfrates,
|
||||||
|
well_resflows_phase);
|
||||||
|
std::cout << "Checking well conditions." << std::endl;
|
||||||
|
// For testing we set surface := reservoir
|
||||||
|
well_control_passed = wells->conditionsMet(well_bhp, well_resflows_phase, well_resflows_phase);
|
||||||
|
++well_control_iteration;
|
||||||
|
if (!well_control_passed && well_control_iteration > max_well_control_iterations) {
|
||||||
|
THROW("Could not satisfy well conditions in " << max_well_control_iterations << " tries.");
|
||||||
|
}
|
||||||
|
if (!well_control_passed) {
|
||||||
|
std::cout << "Well controls not passed, solving again." << std::endl;
|
||||||
|
} else {
|
||||||
|
std::cout << "Well conditions met." << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (!well_control_passed);
|
||||||
|
|
||||||
|
// Process transport sources (to include bdy terms and well flows).
|
||||||
|
Opm::computeTransportSource(*grid->c_grid(), src, state.faceflux(), 1.0,
|
||||||
|
wells->c_wells(), well_perfrates, reorder_src);
|
||||||
|
if (!use_reorder) {
|
||||||
clear_transport_source(tsrc);
|
clear_transport_source(tsrc);
|
||||||
for (int cell = 0; cell < num_cells; ++cell) {
|
for (int cell = 0; cell < num_cells; ++cell) {
|
||||||
if (reorder_src[cell] > 0.0) {
|
if (reorder_src[cell] > 0.0) {
|
||||||
|
Loading…
Reference in New Issue
Block a user