mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
improve the ECL well model
the biggest change is that it is now based on a new approach: the well model now always calculates the bottom hole pressure for the full well when asked for a source term. This change makes it possible to implement cross flow within wells properly and should also make the well model physically correct. Also, the well model now uses the connection transmissibility factor which makes it possible to use this quantity if it is specified by the deck...
This commit is contained in:
parent
f6c4efce24
commit
66abdce594
File diff suppressed because it is too large
Load Diff
@ -55,6 +55,7 @@ class EclWellManager
|
||||
typedef typename GET_PROP_TYPE(TypeTag, Simulator) Simulator;
|
||||
typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView;
|
||||
typedef typename GET_PROP_TYPE(TypeTag, Grid) Grid;
|
||||
typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar;
|
||||
typedef typename GET_PROP_TYPE(TypeTag, FluidSystem) FluidSystem;
|
||||
typedef typename GET_PROP_TYPE(TypeTag, ElementContext) ElementContext;
|
||||
typedef typename GET_PROP_TYPE(TypeTag, RateVector) RateVector;
|
||||
@ -89,6 +90,21 @@ public:
|
||||
// specified by the updateWellCompletions_() method
|
||||
well->beginSpec();
|
||||
well->setName(wellName);
|
||||
|
||||
|
||||
// overwrite the automatically computed effective
|
||||
// permeability by the one specified in the deck. Note: this
|
||||
// is not implemented by opm-parser yet...
|
||||
//Scalar Kh = completion->getEffectivePermeability();
|
||||
Scalar Kh = 0.0;
|
||||
if (Kh > 0.0)
|
||||
well->setEffectivePermeability(elemCtx, dofIdx, Kh);
|
||||
|
||||
// overwrite the automatically computed connection
|
||||
// transmissibilty factor by the one specified in the deck.
|
||||
Scalar ctf = completion->getConnectionTransmissibilityFactor();
|
||||
if (ctf > 0.0)
|
||||
well->setConnectionTransmissibilityFactor(elemCtx, dofIdx, ctf);
|
||||
well->endSpec();
|
||||
}
|
||||
}
|
||||
@ -127,12 +143,13 @@ public:
|
||||
case Opm::WellCommon::AUTO:
|
||||
// TODO: for now, auto means open...
|
||||
case Opm::WellCommon::OPEN:
|
||||
well->setOpen(true);
|
||||
well->setWellStatus(Well::Open);
|
||||
break;
|
||||
case Opm::WellCommon::STOP:
|
||||
// TODO: cross flow
|
||||
well->setWellStatus(Well::Closed);
|
||||
break;
|
||||
case Opm::WellCommon::SHUT:
|
||||
well->setOpen(false);
|
||||
well->setWellStatus(Well::Shut);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -206,7 +223,10 @@ public:
|
||||
well->setMaximumSurfaceRate(injectProperties.surfaceInjectionRate);
|
||||
well->setMaximumReservoirRate(injectProperties.reservoirInjectionRate);
|
||||
well->setTargetBottomHolePressure(injectProperties.BHPLimit);
|
||||
well->setTargetTopHolePressure(injectProperties.THPLimit);
|
||||
|
||||
// TODO
|
||||
well->setTargetTopHolePressure(1e100);
|
||||
//well->setTargetTopHolePressure(injectProperties.THPLimit);
|
||||
}
|
||||
|
||||
if (deckWell->isProducer(episodeIdx)) {
|
||||
@ -264,7 +284,10 @@ public:
|
||||
}
|
||||
|
||||
well->setTargetBottomHolePressure(producerProperties.BHPLimit);
|
||||
well->setTargetTopHolePressure(producerProperties.THPLimit);
|
||||
|
||||
// TODO
|
||||
well->setTargetTopHolePressure(-1e100);
|
||||
//well->setTargetTopHolePressure(producerProperties.THPLimit);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -225,6 +225,8 @@ public:
|
||||
readMaterialParameters_();
|
||||
readInitialCondition_();
|
||||
|
||||
// initialize the wells. Note that this needs to be done after initializing the
|
||||
// intrinsic permeabilities because the well model uses them...
|
||||
wellManager_.init(simulator.gridManager().eclipseState());
|
||||
|
||||
// Start the first episode. For this, ask the Eclipse schedule.
|
||||
|
Loading…
Reference in New Issue
Block a user