Refactoring the Well class - intermediate step 1

This commit is contained in:
Atle Haugan
2014-02-28 14:54:47 +01:00
parent 77bed42742
commit 32c2ef9060
3 changed files with 129 additions and 54 deletions

View File

@@ -28,11 +28,11 @@
namespace Opm {
Well::Well(const std::string& name, int headI, int headJ, double refDepth, TimeMapConstPtr timeMap , size_t creationTimeStep)
: m_oilRate( new DynamicState<double>( timeMap , 0.0)) ,
m_gasRate(new DynamicState<double>(timeMap, 0.0)),
m_waterRate(new DynamicState<double>(timeMap, 0.0)),
m_liquidRate(new DynamicState<double>(timeMap, 0.0)),
m_resVRate(new DynamicState<double>(timeMap, 0.0)),
: //m_oilRate( new DynamicState<double>( timeMap , 0.0)) ,
//m_gasRate(new DynamicState<double>(timeMap, 0.0)),
//m_waterRate(new DynamicState<double>(timeMap, 0.0)),
//m_liquidRate(new DynamicState<double>(timeMap, 0.0)),
//m_resVRate(new DynamicState<double>(timeMap, 0.0)),
m_surfaceInjectionRate(new DynamicState<double>(timeMap, 0.0)),
m_reservoirInjectionRate(new DynamicState<double>(timeMap, 0.0)),
m_BHPLimit(new DynamicState<double>(timeMap , 0.0)),
@@ -41,7 +41,7 @@ namespace Opm {
m_injectorControlMode(new DynamicState<WellInjector::ControlModeEnum>(timeMap, WellInjector::RATE)),
m_producerControlMode(new DynamicState<WellProducer::ControlModeEnum>(timeMap, WellProducer::ORAT)),
m_status(new DynamicState<WellCommon::StatusEnum>(timeMap, WellCommon::OPEN)),
m_productionControls(new DynamicState<int>(timeMap, 0)),
//m_productionControls(new DynamicState<int>(timeMap, 0)),
m_injectionControls(new DynamicState<int>(timeMap, 0)),
m_inPredictionMode(new DynamicState<bool>(timeMap, true)),
m_isProducer(new DynamicState<bool>(timeMap, true)),
@@ -50,6 +50,7 @@ namespace Opm {
m_guideRatePhase(new DynamicState<GuideRate::GuideRatePhaseEnum>(timeMap, GuideRate::UNDEFINED)),
m_guideRateScalingFactor(new DynamicState<double>(timeMap, 1.0)),
m_completions( new DynamicState<CompletionSetConstPtr>( timeMap , CompletionSetConstPtr( new CompletionSet()) )),
m_productionProperties( new DynamicState<WellProductionProperties>(timeMap, WellProductionProperties() )),
m_groupName( new DynamicState<std::string>( timeMap , "" )),
m_headI(headI),
m_headJ(headJ),
@@ -64,6 +65,39 @@ namespace Opm {
}
void Well::setProductionProperties(size_t timeStep , const WellProductionProperties newProperties) {
m_isProducer->add(timeStep , true);
WellProductionProperties copyToBeSaved = getProductionProperties(timeStep);
if ((copyToBeSaved.ProductionControls != newProperties.ProductionControls)) {
copyToBeSaved.ProductionControls = newProperties.ProductionControls;
}
if (copyToBeSaved.OilRate != newProperties.OilRate) {
copyToBeSaved.OilRate = newProperties.OilRate;
copyToBeSaved.ProductionControls += WellProducer::ORAT;
}
if (copyToBeSaved.GasRate != newProperties.GasRate) {
copyToBeSaved.GasRate = newProperties.GasRate;
copyToBeSaved.ProductionControls += WellProducer::GRAT;
}
if (copyToBeSaved.WaterRate != newProperties.WaterRate) {
copyToBeSaved.WaterRate = newProperties.WaterRate;
copyToBeSaved.ProductionControls += WellProducer::WRAT;
}
if (copyToBeSaved.LiquidRate != newProperties.LiquidRate) {
copyToBeSaved.LiquidRate = newProperties.LiquidRate;
copyToBeSaved.ProductionControls += WellProducer::LRAT;
}
if (copyToBeSaved.ResVRate != newProperties.ResVRate) {
copyToBeSaved.ResVRate = newProperties.ResVRate;
copyToBeSaved.ProductionControls += WellProducer::RESV;
}
m_productionProperties->add(timeStep, copyToBeSaved);
}
WellProductionProperties Well::getProductionProperties(size_t timeStep) const {
return m_productionProperties->get(timeStep);
}
bool Well::hasBeenDefined(size_t timeStep) const {
if (timeStep < m_creationTimeStep)
return false;
@@ -131,54 +165,54 @@ namespace Opm {
double Well::getOilRate(size_t timeStep) const {
return m_oilRate->get(timeStep);
return getProductionProperties(timeStep).OilRate;
}
void Well::setOilRate(size_t timeStep, double oilRate) {
m_oilRate->add(timeStep, oilRate);
switch2Producer( timeStep );
addProductionControl( timeStep , WellProducer::ORAT );
WellProductionProperties properties = getProductionProperties(timeStep);
properties.OilRate = oilRate;
setProductionProperties(timeStep, properties);
}
double Well::getGasRate(size_t timeStep) const {
return m_gasRate->get(timeStep);
return getProductionProperties(timeStep).GasRate;
}
void Well::setGasRate(size_t timeStep, double gasRate) {
m_gasRate->add(timeStep, gasRate);
switch2Producer( timeStep );
addProductionControl( timeStep , WellProducer::GRAT );
WellProductionProperties properties = getProductionProperties(timeStep);
properties.GasRate = gasRate;
setProductionProperties(timeStep, properties);
}
double Well::getWaterRate(size_t timeStep) const {
return m_waterRate->get(timeStep);
return getProductionProperties(timeStep).WaterRate;
}
void Well::setWaterRate(size_t timeStep, double waterRate) {
m_waterRate->add(timeStep, waterRate);
switch2Producer( timeStep );
addProductionControl( timeStep , WellProducer::WRAT );
WellProductionProperties properties = getProductionProperties(timeStep);
properties.WaterRate = waterRate;
setProductionProperties(timeStep, properties);
}
double Well::getLiquidRate(size_t timeStep) const {
return m_liquidRate->get(timeStep);
return getProductionProperties(timeStep).LiquidRate;
}
void Well::setLiquidRate(size_t timeStep, double liquidRate) {
m_liquidRate->add(timeStep, liquidRate);
switch2Producer( timeStep );
addProductionControl( timeStep , WellProducer::LRAT );
WellProductionProperties properties = getProductionProperties(timeStep);
properties.LiquidRate = liquidRate;
setProductionProperties(timeStep, properties);
}
double Well::getResVRate(size_t timeStep) const {
return m_resVRate->get(timeStep);
return getProductionProperties(timeStep).ResVRate;
}
void Well::setResVRate(size_t timeStep, double resvRate) {
m_resVRate->add(timeStep, resvRate);
switch2Producer( timeStep );
addProductionControl( timeStep , WellProducer::RESV );
WellProductionProperties properties = getProductionProperties(timeStep);
properties.ResVRate = resvRate;
setProductionProperties(timeStep, properties);
}
double Well::getSurfaceInjectionRate(size_t timeStep) const {
@@ -245,15 +279,15 @@ namespace Opm {
void Well::switch2Producer(size_t timeStep ) {
m_isProducer->add(timeStep , true);
m_surfaceInjectionRate->add(timeStep, 0);
m_reservoirInjectionRate->add(timeStep , 0);
// m_surfaceInjectionRate->add(timeStep, 0);
// m_reservoirInjectionRate->add(timeStep , 0);
}
void Well::switch2Injector(size_t timeStep ) {
m_isProducer->add(timeStep , false);
m_oilRate->add(timeStep, 0);
m_gasRate->add(timeStep, 0);
m_waterRate->add(timeStep, 0);
// m_oilRate->add(timeStep, 0);
// m_gasRate->add(timeStep, 0);
// m_waterRate->add(timeStep, 0);
}
bool Well::isInPredictionMode(size_t timeStep) const {
@@ -267,8 +301,8 @@ namespace Opm {
/*****************************************************************/
bool Well::hasProductionControl(size_t timeStep , WellProducer::ControlModeEnum controlMode) const {
int controls = m_productionControls->get( timeStep );
if (controls & controlMode)
WellProductionProperties properties = getProductionProperties(timeStep);
if ((properties.ProductionControls & controlMode) != 0)
return true;
else
return false;
@@ -276,19 +310,19 @@ namespace Opm {
void Well::addProductionControl(size_t timeStep , WellProducer::ControlModeEnum controlMode) {
int controls = m_productionControls->get( timeStep );
if ((controls & controlMode) == 0) {
controls += controlMode;
m_productionControls->add(timeStep , controls );
WellProductionProperties properties = getProductionProperties(timeStep);
if ((properties.ProductionControls & controlMode) == 0) {
properties.ProductionControls += controlMode;
setProductionProperties(timeStep, properties);
}
}
void Well::dropProductionControl(size_t timeStep , WellProducer::ControlModeEnum controlMode) {
int controls = m_productionControls->get( timeStep );
if ((controls & controlMode) != 0) {
controls -= controlMode;
m_productionControls->add(timeStep , controls );
WellProductionProperties properties = getProductionProperties(timeStep);
if ((properties.ProductionControls & controlMode) != 0) {
properties.ProductionControls -= controlMode;
setProductionProperties(timeStep, properties);
}
}

View File

@@ -27,11 +27,23 @@
#include <opm/parser/eclipse/EclipseState/Schedule/Completion.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/ScheduleEnums.hpp>
#include <boost/optional.hpp>
#include <memory>
#include <string>
#include <limits>
namespace Opm {
typedef struct {
double OilRate;
double GasRate;
double WaterRate;
double LiquidRate;
double ResVRate;
int ProductionControls;
} WellProductionProperties;
class Well {
public:
Well(const std::string& name, int headI, int headJ, double refDepth, TimeMapConstPtr timeMap , size_t creationTimeStep);
@@ -96,6 +108,8 @@ namespace Opm {
void addWELSPECS(DeckRecordConstPtr deckRecord);
void addCompletions(size_t time_step , const std::vector<CompletionConstPtr>& newCompletions);
CompletionSetConstPtr getCompletions(size_t timeStep) const;
void setProductionProperties(size_t timeStep , const WellProductionProperties properties);
WellProductionProperties getProductionProperties(size_t timeStep) const;
private:
void switch2Producer(size_t timeStep );
@@ -107,11 +121,12 @@ namespace Opm {
size_t m_creationTimeStep;
std::string m_name;
std::shared_ptr<DynamicState<double> > m_oilRate;
std::shared_ptr<DynamicState<double> > m_gasRate;
std::shared_ptr<DynamicState<double> > m_waterRate;
std::shared_ptr<DynamicState<double> > m_liquidRate;
std::shared_ptr<DynamicState<double> > m_resVRate;
//std::shared_ptr<DynamicState<double> > m_oilRate;
//std::shared_ptr<DynamicState<double> > m_gasRate;
//std::shared_ptr<DynamicState<double> > m_waterRate;
//std::shared_ptr<DynamicState<double> > m_liquidRate;
//std::shared_ptr<DynamicState<double> > m_resVRate;
std::shared_ptr<DynamicState<double> > m_surfaceInjectionRate;
std::shared_ptr<DynamicState<double> > m_reservoirInjectionRate;
std::shared_ptr<DynamicState<double> > m_BHPLimit;
@@ -120,7 +135,7 @@ namespace Opm {
std::shared_ptr<DynamicState<WellInjector::ControlModeEnum> > m_injectorControlMode;
std::shared_ptr<DynamicState<WellProducer::ControlModeEnum> > m_producerControlMode;
std::shared_ptr<DynamicState<WellCommon::StatusEnum> > m_status;
std::shared_ptr<DynamicState<int> > m_productionControls;
//std::shared_ptr<DynamicState<int> > m_productionControls;
std::shared_ptr<DynamicState<int> > m_injectionControls;
std::shared_ptr<DynamicState<bool> > m_inPredictionMode;
@@ -131,6 +146,7 @@ namespace Opm {
std::shared_ptr<DynamicState<double> > m_guideRateScalingFactor;
std::shared_ptr<DynamicState<CompletionSetConstPtr> > m_completions;
std::shared_ptr<DynamicState<WellProductionProperties> > m_productionProperties;
std::shared_ptr<DynamicState<std::string> > m_groupName;
// WELSPECS data - assumes this is not dynamic

View File

@@ -31,6 +31,7 @@
#include <opm/parser/eclipse/EclipseState/Schedule/ScheduleEnums.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Well.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/WellProductionProperties.h>
#include <opm/parser/eclipse/EclipseState/Schedule/TimeMap.hpp>
Opm::TimeMapPtr createXDaysTimeMap(size_t numDays) {
@@ -59,6 +60,30 @@ BOOST_AUTO_TEST_CASE(CreateWellCreateTimeStepOK) {
}
BOOST_AUTO_TEST_CASE(setWellProductionProperties_PropertiesSetCorrect) {
Opm::TimeMapPtr timeMap = createXDaysTimeMap(10);
Opm::Well well("WELL1" , 0, 0, 0.0, timeMap , 0);
BOOST_CHECK_EQUAL(0.0 , well.getProductionProperties( 5 ).OilRate);
Opm::WellProductionProperties props;
props.OilRate = 99;
props.GasRate = 98;
props.WaterRate = 97;
props.LiquidRate = 96;
props.ResVRate = 95;
well.setProductionProperties( 5 , props);
BOOST_CHECK_EQUAL(99 , well.getProductionProperties( 5 ).OilRate);
BOOST_CHECK_EQUAL(98 , well.getProductionProperties( 5 ).GasRate);
BOOST_CHECK_EQUAL(97 , well.getProductionProperties( 5 ).WaterRate);
BOOST_CHECK_EQUAL(96 , well.getProductionProperties( 5 ).LiquidRate);
BOOST_CHECK_EQUAL(95 , well.getProductionProperties( 5 ).ResVRate);
BOOST_CHECK_EQUAL(99 , well.getProductionProperties( 8 ).OilRate);
BOOST_CHECK_EQUAL(98 , well.getProductionProperties( 8 ).GasRate);
BOOST_CHECK_EQUAL(97 , well.getProductionProperties( 8 ).WaterRate);
BOOST_CHECK_EQUAL(96 , well.getProductionProperties( 8 ).LiquidRate);
BOOST_CHECK_EQUAL(95 , well.getProductionProperties( 8 ).ResVRate);
}
BOOST_AUTO_TEST_CASE(setOilRate_RateSetCorrect) {
Opm::TimeMapPtr timeMap = createXDaysTimeMap(10);
Opm::Well well("WELL1" , 0, 0, 0.0, timeMap , 0);
@@ -206,13 +231,13 @@ BOOST_AUTO_TEST_CASE(isProducerCorrectlySet) {
/* Set rates => Well becomes a producer; injection rate should be set to 0. */
well.setOilRate(4 , 100 );
well.setGasRate(4 , 200 );
well.setGasRate(4 , 200 );
well.setWaterRate(4 , 300 );
BOOST_CHECK_EQUAL( false , well.isInjector(4));
BOOST_CHECK_EQUAL( true , well.isProducer(4));
BOOST_CHECK_EQUAL( 0 , well.getSurfaceInjectionRate(4));
BOOST_CHECK_EQUAL( 0 , well.getReservoirInjectionRate(4));
// BOOST_CHECK_EQUAL( 0 , well.getSurfaceInjectionRate(4));
// BOOST_CHECK_EQUAL( 0 , well.getReservoirInjectionRate(4));
BOOST_CHECK_EQUAL( 100 , well.getOilRate(4));
BOOST_CHECK_EQUAL( 200 , well.getGasRate(4));
BOOST_CHECK_EQUAL( 300 , well.getWaterRate(4));
@@ -222,9 +247,9 @@ BOOST_AUTO_TEST_CASE(isProducerCorrectlySet) {
BOOST_CHECK_EQUAL( true , well.isInjector(6));
BOOST_CHECK_EQUAL( false , well.isProducer(6));
BOOST_CHECK_EQUAL( 50 , well.getReservoirInjectionRate(6));
BOOST_CHECK_EQUAL( 0 , well.getOilRate(6));
BOOST_CHECK_EQUAL( 0 , well.getGasRate(6));
BOOST_CHECK_EQUAL( 0 , well.getWaterRate(6));
// BOOST_CHECK_EQUAL( 0 , well.getOilRate(6));
// BOOST_CHECK_EQUAL( 0 , well.getGasRate(6));
// BOOST_CHECK_EQUAL( 0 , well.getWaterRate(6));
}
@@ -336,7 +361,7 @@ BOOST_AUTO_TEST_CASE(WellHaveProductionControlLimit) {
BOOST_CHECK( well.hasProductionControl( 10 , Opm::WellProducer::THP ));
well.dropProductionControl( 11 , Opm::WellProducer::RESV );
BOOST_CHECK( well.hasProductionControl( 11 , Opm::WellProducer::ORAT ));
BOOST_CHECK( well.hasProductionControl( 11 , Opm::WellProducer::WRAT ));
BOOST_CHECK( well.hasProductionControl( 11 , Opm::WellProducer::GRAT ));