Add flag allowCrossFlow()
This PR adds support for item 10 in welspecs where a flag is used to determine whether the well should allow cross flow or not. A test is added to check default behavior.
This commit is contained in:
parent
6dee686dc0
commit
9665b54ad3
@ -1272,7 +1272,12 @@ namespace Opm {
|
||||
if (refDepthItem->hasValue(0))
|
||||
refDepth.setValue( refDepthItem->getSIDouble(0));
|
||||
|
||||
well = std::make_shared<Well>(wellName, m_grid , headI, headJ, refDepth, preferredPhase, m_timeMap , timeStep, wellCompletionOrder);
|
||||
bool allowCrossFlow = true;
|
||||
const std::string& allowCrossFlowStr = record->getItem("CROSSFLOW")->getTrimmedString(0);
|
||||
if (allowCrossFlowStr == "NO")
|
||||
allowCrossFlow = false;
|
||||
|
||||
well = std::make_shared<Well>(wellName, m_grid , headI, headJ, refDepth, preferredPhase, m_timeMap , timeStep, wellCompletionOrder, allowCrossFlow);
|
||||
m_wells.insert( wellName , well);
|
||||
m_events.addEvent( ScheduleEvents::NEW_WELL , timeStep );
|
||||
}
|
||||
|
@ -31,7 +31,7 @@
|
||||
namespace Opm {
|
||||
|
||||
Well::Well(const std::string& name_, std::shared_ptr<const EclipseGrid> grid , int headI, int headJ, Value<double> refDepth , Phase::PhaseEnum preferredPhase,
|
||||
TimeMapConstPtr timeMap, size_t creationTimeStep, WellCompletion::CompletionOrderEnum completionOrdering)
|
||||
TimeMapConstPtr timeMap, size_t creationTimeStep, WellCompletion::CompletionOrderEnum completionOrdering, bool allowCrossFlow)
|
||||
: m_status(new DynamicState<WellCommon::StatusEnum>(timeMap, WellCommon::SHUT)),
|
||||
m_isAvailableForGroupControl(new DynamicState<bool>(timeMap, true)),
|
||||
m_guideRate(new DynamicState<double>(timeMap, -1.0)),
|
||||
@ -52,7 +52,8 @@ namespace Opm {
|
||||
m_refDepth(refDepth),
|
||||
m_preferredPhase(preferredPhase),
|
||||
m_grid( grid ),
|
||||
m_comporder(completionOrdering)
|
||||
m_comporder(completionOrdering),
|
||||
m_allowCrossFlow(allowCrossFlow)
|
||||
{
|
||||
m_name = name_;
|
||||
m_creationTimeStep = creationTimeStep;
|
||||
@ -303,6 +304,10 @@ namespace Opm {
|
||||
return wellNameInPattern;
|
||||
}
|
||||
|
||||
bool Well::getAllowCrossFlow() const {
|
||||
return m_allowCrossFlow;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -47,7 +47,7 @@ namespace Opm {
|
||||
class Well {
|
||||
public:
|
||||
Well(const std::string& name, std::shared_ptr<const EclipseGrid> grid , int headI, int headJ, Value<double> refDepth , Phase::PhaseEnum preferredPhase,
|
||||
TimeMapConstPtr timeMap, size_t creationTimeStep, WellCompletion::CompletionOrderEnum completionOrdering = WellCompletion::TRACK);
|
||||
TimeMapConstPtr timeMap, size_t creationTimeStep, WellCompletion::CompletionOrderEnum completionOrdering = WellCompletion::TRACK, bool allowCrossFlow = true);
|
||||
const std::string& name() const;
|
||||
|
||||
bool hasBeenDefined(size_t timeStep) const;
|
||||
@ -104,6 +104,9 @@ namespace Opm {
|
||||
|
||||
WellCompletion::CompletionOrderEnum getWellCompletionOrdering() const;
|
||||
|
||||
bool getAllowCrossFlow() const;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -129,7 +132,6 @@ namespace Opm {
|
||||
std::shared_ptr<DynamicState<bool> > m_rft;
|
||||
std::shared_ptr<DynamicState<bool> > m_plt;
|
||||
|
||||
|
||||
// WELSPECS data - assumes this is not dynamic
|
||||
|
||||
TimeMapConstPtr m_timeMap;
|
||||
@ -140,6 +142,8 @@ namespace Opm {
|
||||
std::shared_ptr<const EclipseGrid> m_grid;
|
||||
|
||||
WellCompletion::CompletionOrderEnum m_comporder;
|
||||
bool m_allowCrossFlow;
|
||||
|
||||
};
|
||||
typedef std::shared_ptr<Well> WellPtr;
|
||||
typedef std::shared_ptr<const Well> WellConstPtr;
|
||||
|
@ -73,6 +73,21 @@ static DeckPtr createDeckWithWells() {
|
||||
return parser.parseString(input, ParseMode());
|
||||
}
|
||||
|
||||
static DeckPtr createDeckForTestingCrossFlow() {
|
||||
Opm::Parser parser;
|
||||
std::string input =
|
||||
"START -- 0 \n"
|
||||
"10 MAI 2007 / \n"
|
||||
"SCHEDULE\n"
|
||||
"WELSPECS\n"
|
||||
" \'DEFAULT\' \'OP\' 30 37 3.33 \'OIL\' 7*/ \n"
|
||||
" \'ALLOW\' \'OP\' 30 37 3.33 \'OIL\' 3* YES / \n"
|
||||
" \'BAN\' \'OP\' 20 51 3.92 \'OIL\' 3* NO / \n"
|
||||
"/\n";
|
||||
|
||||
return parser.parseString(input, ParseMode());
|
||||
}
|
||||
|
||||
static DeckPtr createDeckWithWellsOrdered() {
|
||||
Opm::Parser parser;
|
||||
std::string input =
|
||||
@ -285,6 +300,21 @@ BOOST_AUTO_TEST_CASE(ReturnMaxNumCompletionsForWellsInTimestep) {
|
||||
BOOST_CHECK_EQUAL(schedule.getMaxNumCompletionsForWells(3), 9);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(TestCrossFlowHandling) {
|
||||
std::shared_ptr<const EclipseGrid> grid = std::make_shared<const EclipseGrid>(10,10,10);
|
||||
DeckPtr deck = createDeckForTestingCrossFlow();
|
||||
IOConfigPtr ioConfig;
|
||||
Schedule schedule(ParseMode() , grid , deck, ioConfig);
|
||||
|
||||
std::vector<WellPtr> well_default = schedule.getWells("DEFAULT");
|
||||
BOOST_CHECK_EQUAL(well_default[0]->getAllowCrossFlow(), true);
|
||||
std::vector<WellPtr> well_allow = schedule.getWells("ALLOW");
|
||||
BOOST_CHECK_EQUAL(well_allow[0]->getAllowCrossFlow(), true);
|
||||
std::vector<WellPtr> well_ban = schedule.getWells("BAN");
|
||||
BOOST_CHECK_EQUAL(well_ban[0]->getAllowCrossFlow(), false);
|
||||
|
||||
}
|
||||
|
||||
static DeckPtr createDeckWithWellsAndCompletionDataWithWELOPEN() {
|
||||
Opm::Parser parser;
|
||||
std::string input =
|
||||
|
Loading…
Reference in New Issue
Block a user