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:
Tor Harald Sandve 2015-10-06 15:47:07 +02:00
parent 6dee686dc0
commit 9665b54ad3
4 changed files with 49 additions and 5 deletions

View File

@ -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 );
}

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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 =