Simple well handling done (only simple rates -> src terms).
This commit is contained in:
parent
30acd08b61
commit
9c226c1b24
@ -193,6 +193,28 @@ void outputState(const UnstructuredGrid* grid,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Create a src vector equivalent to a wells structure.
|
||||||
|
/// For this to be valid, the wells must be all rate-controlled and
|
||||||
|
/// single-perforation.
|
||||||
|
void wellsToSrc(const Wells& wells, const int num_cells, std::vector<double>& src)
|
||||||
|
{
|
||||||
|
src.resize(num_cells);
|
||||||
|
for (int w = 0; w < wells.number_of_wells; ++w) {
|
||||||
|
if (wells.ctrls[w]->num != 1) {
|
||||||
|
THROW("In wellsToSrc(): well has more than one control.");
|
||||||
|
}
|
||||||
|
if (wells.ctrls[w]->type[0] != RATE) {
|
||||||
|
THROW("In wellsToSrc(): well is BHP, not RATE.");
|
||||||
|
}
|
||||||
|
if (wells.well_connpos[w+1] - wells.well_connpos[w] != 1) {
|
||||||
|
THROW("In wellsToSrc(): well has multiple perforations.");
|
||||||
|
}
|
||||||
|
const double flow = wells.ctrls[w]->target[0];
|
||||||
|
const double cell = wells.well_cells[wells.well_connpos[w]];
|
||||||
|
src[cell] = (wells.type[w] == INJECTOR) ? flow : -flow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// --------------- Types needed to define transport solver ---------------
|
// --------------- Types needed to define transport solver ---------------
|
||||||
|
|
||||||
@ -428,9 +450,13 @@ main(int argc, char** argv)
|
|||||||
case 0:
|
case 0:
|
||||||
{
|
{
|
||||||
std::cout << "==== Scenario 0: single-cell source and sink.\n";
|
std::cout << "==== Scenario 0: single-cell source and sink.\n";
|
||||||
double flow_per_sec = 0.1*tot_porevol/Opm::unit::day;
|
if (wells->c_wells()) {
|
||||||
src[0] = flow_per_sec;
|
wellsToSrc(*wells->c_wells(), num_cells, src);
|
||||||
src[grid->c_grid()->number_of_cells - 1] = -flow_per_sec;
|
} else {
|
||||||
|
double flow_per_sec = 0.1*tot_porevol/Opm::unit::day;
|
||||||
|
src[0] = flow_per_sec;
|
||||||
|
src[grid->c_grid()->number_of_cells - 1] = -flow_per_sec;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 1:
|
case 1:
|
||||||
@ -505,6 +531,13 @@ main(int argc, char** argv)
|
|||||||
}
|
}
|
||||||
std::vector<double> reorder_src = src;
|
std::vector<double> reorder_src = src;
|
||||||
|
|
||||||
|
// Dirichlet boundary conditions.
|
||||||
|
if (param.getDefault("use_pside", false)) {
|
||||||
|
int pside = param.get<int>("pside");
|
||||||
|
double pside_pressure = param.get<double>("pside_pressure");
|
||||||
|
bcs.pressureSide(*grid->c_grid(), Opm::FlowBCManager::Side(pside), pside_pressure);
|
||||||
|
}
|
||||||
|
|
||||||
// Control init.
|
// Control init.
|
||||||
Opm::ImplicitTransportDetails::NRReport rpt;
|
Opm::ImplicitTransportDetails::NRReport rpt;
|
||||||
Opm::ImplicitTransportDetails::NRControl ctrl;
|
Opm::ImplicitTransportDetails::NRControl ctrl;
|
||||||
|
Loading…
Reference in New Issue
Block a user