2012-03-27 09:57:01 -05:00
|
|
|
#ifndef OPM_WELLSGROUP_HPP
|
|
|
|
#define OPM_WELLSGROUP_HPP
|
2012-03-28 08:49:39 -05:00
|
|
|
|
2012-03-27 09:57:01 -05:00
|
|
|
#include <opm/core/InjectionSpecification.hpp>
|
|
|
|
#include <opm/core/ProductionSpecification.hpp>
|
2012-03-29 11:34:51 -05:00
|
|
|
#include <opm/core/eclipse/EclipseGridParser.hpp>
|
2012-04-12 07:25:39 -05:00
|
|
|
#include <opm/core/grid.h>
|
2012-03-28 08:49:39 -05:00
|
|
|
#include <string>
|
|
|
|
|
2012-03-29 11:34:51 -05:00
|
|
|
|
2012-03-28 08:49:39 -05:00
|
|
|
namespace Opm
|
|
|
|
{
|
|
|
|
|
|
|
|
class WellsGroupInterface
|
|
|
|
{
|
|
|
|
public:
|
2012-04-11 03:52:45 -05:00
|
|
|
WellsGroupInterface(const std::string& name,
|
|
|
|
ProductionSpecification prod_spec,
|
|
|
|
InjectionSpecification inj_spec);
|
2012-03-28 08:49:39 -05:00
|
|
|
virtual ~WellsGroupInterface();
|
|
|
|
|
2012-03-30 03:51:31 -05:00
|
|
|
/// The unique identifier for the well or well group.
|
2012-03-28 08:49:39 -05:00
|
|
|
const std::string& name();
|
2012-03-30 03:51:31 -05:00
|
|
|
|
|
|
|
/// Production specifications for the well or well group.
|
2012-03-28 08:49:39 -05:00
|
|
|
const ProductionSpecification& prodSpec() const;
|
2012-03-30 03:51:31 -05:00
|
|
|
|
|
|
|
/// Injection specifications for the well or well group.
|
2012-03-28 08:49:39 -05:00
|
|
|
const InjectionSpecification& injSpec() const;
|
2012-03-30 03:51:31 -05:00
|
|
|
|
2012-04-13 03:32:36 -05:00
|
|
|
/// Production specifications for the well or well group.
|
|
|
|
ProductionSpecification& prodSpec();
|
|
|
|
|
|
|
|
/// Injection specifications for the well or well group.
|
|
|
|
InjectionSpecification& injSpec();
|
|
|
|
|
2012-04-13 13:41:09 -05:00
|
|
|
|
2012-03-30 03:51:31 -05:00
|
|
|
/// \returns true if the object is a leaf node (WellNode), false otherwise.
|
|
|
|
virtual bool isLeafNode() const;
|
2012-04-12 07:25:39 -05:00
|
|
|
|
2012-03-29 11:34:51 -05:00
|
|
|
/// \returns the pointer to the WellsGroupInterface with the given name. NULL if
|
|
|
|
/// the name is not found.a
|
|
|
|
virtual WellsGroupInterface* findGroup(std::string name_of_node) = 0;
|
2012-04-12 08:48:24 -05:00
|
|
|
|
|
|
|
void setParent(WellsGroupInterface* parent);
|
2012-04-13 04:37:50 -05:00
|
|
|
const WellsGroupInterface* getParent() const;
|
2012-04-13 03:32:36 -05:00
|
|
|
|
2012-04-16 06:44:53 -05:00
|
|
|
/// Recursively calculate the guide rate for each member of the well group.
|
|
|
|
/// This should be called after the guide rates are set to the non-normalized values.
|
2012-04-13 03:32:36 -05:00
|
|
|
virtual void calculateGuideRates() = 0;
|
2012-04-16 06:44:53 -05:00
|
|
|
|
|
|
|
/// Calculates the number of leaf nodes in the given group.
|
|
|
|
/// A leaf node is defined to have one leaf node in its group.
|
|
|
|
virtual int numberOfLeafNodes() = 0;
|
2012-04-12 08:48:24 -05:00
|
|
|
protected:
|
|
|
|
WellsGroupInterface* parent_;
|
|
|
|
|
2012-03-28 08:49:39 -05:00
|
|
|
private:
|
|
|
|
std::string name_;
|
|
|
|
ProductionSpecification production_specification_;
|
|
|
|
InjectionSpecification injection_specification_;
|
|
|
|
};
|
2012-03-27 09:57:01 -05:00
|
|
|
|
2012-04-11 03:52:45 -05:00
|
|
|
|
|
|
|
|
2012-03-28 08:49:39 -05:00
|
|
|
class WellsGroup : public WellsGroupInterface
|
|
|
|
{
|
2012-03-29 11:34:51 -05:00
|
|
|
public:
|
2012-04-11 03:52:45 -05:00
|
|
|
WellsGroup(const std::string& name,
|
|
|
|
ProductionSpecification prod_spec,
|
|
|
|
InjectionSpecification inj_spec);
|
2012-03-29 11:34:51 -05:00
|
|
|
|
|
|
|
virtual WellsGroupInterface* findGroup(std::string name_of_node);
|
|
|
|
|
|
|
|
void addChild(std::tr1::shared_ptr<WellsGroupInterface> child);
|
2012-04-12 07:25:39 -05:00
|
|
|
|
2012-04-13 05:57:47 -05:00
|
|
|
bool conditionsMet(const std::vector<double>& well_bhp, const std::vector<double>& well_rate,
|
|
|
|
const UnstructuredGrid& grid, const std::vector<double>& saturations, const struct Wells* wells,
|
|
|
|
int index_of_well, double epsilon = 1e-8);
|
2012-04-13 03:32:36 -05:00
|
|
|
|
|
|
|
virtual void calculateGuideRates();
|
2012-04-16 06:44:53 -05:00
|
|
|
|
|
|
|
|
|
|
|
virtual int numberOfLeafNodes();
|
2012-03-29 11:34:51 -05:00
|
|
|
private:
|
|
|
|
std::vector<std::tr1::shared_ptr<WellsGroupInterface> > children_;
|
2012-03-28 08:49:39 -05:00
|
|
|
};
|
2012-03-27 09:57:01 -05:00
|
|
|
|
2012-04-11 03:52:45 -05:00
|
|
|
|
|
|
|
|
2012-03-29 11:34:51 -05:00
|
|
|
class WellNode : public WellsGroupInterface
|
|
|
|
{
|
|
|
|
public:
|
2012-04-11 03:52:45 -05:00
|
|
|
WellNode(const std::string& name,
|
|
|
|
ProductionSpecification prod_spec,
|
2012-03-29 11:34:51 -05:00
|
|
|
InjectionSpecification inj_spec);
|
|
|
|
|
|
|
|
virtual WellsGroupInterface* findGroup(std::string name_of_node);
|
2012-04-13 05:57:47 -05:00
|
|
|
virtual bool conditionsMet(const std::vector<double>& well_bhp, const std::vector<double>& well_rate,
|
|
|
|
const UnstructuredGrid& grid, const std::vector<double>& saturations, double epsilon=1e-8);
|
2012-03-30 03:51:31 -05:00
|
|
|
virtual bool isLeafNode() const;
|
2012-04-12 07:25:39 -05:00
|
|
|
|
|
|
|
void setWellsPointer(const struct Wells* wells, int self_index);
|
|
|
|
|
2012-04-13 03:32:36 -05:00
|
|
|
virtual void calculateGuideRates();
|
2012-04-16 06:44:53 -05:00
|
|
|
virtual int numberOfLeafNodes();
|
2012-04-12 07:25:39 -05:00
|
|
|
private:
|
|
|
|
const struct Wells* wells_;
|
|
|
|
int self_index_;
|
2012-03-29 11:34:51 -05:00
|
|
|
};
|
|
|
|
|
2012-04-11 03:52:45 -05:00
|
|
|
/// Doc me!
|
2012-03-29 11:34:51 -05:00
|
|
|
std::tr1::shared_ptr<WellsGroupInterface> createWellsGroup(std::string name,
|
2012-04-11 03:52:45 -05:00
|
|
|
const EclipseGridParser& deck);
|
2012-03-29 11:34:51 -05:00
|
|
|
|
|
|
|
|
2012-03-27 09:57:01 -05:00
|
|
|
}
|
|
|
|
#endif /* OPM_WELLSGROUP_HPP */
|
|
|
|
|