Merge pull request #715 from joakim-hove/check-completion-state
Check completion state
This commit is contained in:
@@ -102,9 +102,9 @@ namespace Opm
|
||||
{
|
||||
template<class C2F, class CC, class FC, class NTG>
|
||||
void WellsManager::createWellsFromSpecs(std::vector<WellConstPtr>& wells, size_t timeStep,
|
||||
const C2F& c2f,
|
||||
const C2F& c2f,
|
||||
const int* cart_dims,
|
||||
FC begin_face_centroids,
|
||||
FC begin_face_centroids,
|
||||
CC begin_cell_centroids,
|
||||
int dimensions,
|
||||
std::vector<std::string>& well_names,
|
||||
@@ -155,40 +155,46 @@ void WellsManager::createWellsFromSpecs(std::vector<WellConstPtr>& wells, size_t
|
||||
CompletionSetConstPtr completionSet = well->getCompletions(timeStep);
|
||||
for (size_t c=0; c<completionSet->size(); c++) {
|
||||
CompletionConstPtr completion = completionSet->get(c);
|
||||
int i = completion->getI();
|
||||
int j = completion->getJ();
|
||||
int k = completion->getK();
|
||||
if (completion->getState() == WellCompletion::OPEN) {
|
||||
int i = completion->getI();
|
||||
int j = completion->getJ();
|
||||
int k = completion->getK();
|
||||
|
||||
const int* cpgdim = cart_dims;
|
||||
int cart_grid_indx = i + cpgdim[0]*(j + cpgdim[1]*k);
|
||||
std::map<int, int>::const_iterator cgit = cartesian_to_compressed.find(cart_grid_indx);
|
||||
if (cgit == cartesian_to_compressed.end()) {
|
||||
const int* cpgdim = cart_dims;
|
||||
int cart_grid_indx = i + cpgdim[0]*(j + cpgdim[1]*k);
|
||||
std::map<int, int>::const_iterator cgit = cartesian_to_compressed.find(cart_grid_indx);
|
||||
if (cgit == cartesian_to_compressed.end()) {
|
||||
OPM_THROW(std::runtime_error, "Cell with i,j,k indices " << i << ' ' << j << ' '
|
||||
<< k << " not found in grid (well = " << well->name() << ')');
|
||||
}
|
||||
int cell = cgit->second;
|
||||
PerfData pd;
|
||||
pd.cell = cell;
|
||||
if (completion->getConnectionTransmissibilityFactor() > 0.0) {
|
||||
pd.well_index = completion->getConnectionTransmissibilityFactor();
|
||||
} else {
|
||||
double radius = 0.5*completion->getDiameter();
|
||||
if (radius <= 0.0) {
|
||||
radius = 0.5*unit::feet;
|
||||
OPM_MESSAGE("**** Warning: Well bore internal radius set to " << radius);
|
||||
}
|
||||
int cell = cgit->second;
|
||||
PerfData pd;
|
||||
pd.cell = cell;
|
||||
if (completion->getConnectionTransmissibilityFactor() > 0.0) {
|
||||
pd.well_index = completion->getConnectionTransmissibilityFactor();
|
||||
} else {
|
||||
double radius = 0.5*completion->getDiameter();
|
||||
if (radius <= 0.0) {
|
||||
radius = 0.5*unit::feet;
|
||||
OPM_MESSAGE("**** Warning: Well bore internal radius set to " << radius);
|
||||
}
|
||||
|
||||
const std::array<double, 3> cubical =
|
||||
WellsManagerDetail::getCubeDim<3>(c2f, begin_face_centroids, cell);
|
||||
const std::array<double, 3> cubical =
|
||||
WellsManagerDetail::getCubeDim<3>(c2f, begin_face_centroids, cell);
|
||||
|
||||
const double* cell_perm = &permeability[dimensions*dimensions*cell];
|
||||
pd.well_index =
|
||||
WellsManagerDetail::computeWellIndex(radius, cubical, cell_perm,
|
||||
completion->getSkinFactor(),
|
||||
completion->getDirection(),
|
||||
ntg[cell]);
|
||||
const double* cell_perm = &permeability[dimensions*dimensions*cell];
|
||||
pd.well_index =
|
||||
WellsManagerDetail::computeWellIndex(radius, cubical, cell_perm,
|
||||
completion->getSkinFactor(),
|
||||
completion->getDirection(),
|
||||
ntg[cell]);
|
||||
}
|
||||
wellperf_data[well_index].push_back(pd);
|
||||
} else {
|
||||
if (completion->getState() != WellCompletion::SHUT) {
|
||||
OPM_THROW(std::runtime_error, "Completion state: " << WellCompletion::StateEnum2String( completion->getState() ) << " not handled");
|
||||
}
|
||||
}
|
||||
wellperf_data[well_index].push_back(pd);
|
||||
}
|
||||
}
|
||||
well_index++;
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
void wells_static_check(const Wells* wells) {
|
||||
BOOST_CHECK_EQUAL(2 , wells->number_of_wells);
|
||||
BOOST_CHECK_EQUAL(3 , wells->number_of_phases);
|
||||
|
||||
|
||||
BOOST_CHECK_EQUAL("INJ1" , wells->name[0]);
|
||||
BOOST_CHECK_EQUAL("PROD1" , wells->name[1]);
|
||||
|
||||
@@ -49,11 +49,11 @@ void wells_static_check(const Wells* wells) {
|
||||
BOOST_CHECK_EQUAL(0 , wells->well_connpos[0]);
|
||||
BOOST_CHECK_EQUAL(1 , wells->well_connpos[1]);
|
||||
BOOST_CHECK_EQUAL(2 , wells->well_connpos[2]);
|
||||
|
||||
|
||||
/* Connection factor */
|
||||
BOOST_CHECK_CLOSE(1.2279166666666664e-12 , wells->WI[0] , 0.001);
|
||||
BOOST_CHECK_CLOSE(1.2279166666666664e-12 , wells->WI[1] , 0.001);
|
||||
|
||||
|
||||
/* Completed cells */
|
||||
BOOST_CHECK_EQUAL(0 , wells->well_cells[0]);
|
||||
BOOST_CHECK_EQUAL(9 + 2*10 + 2*10*10 , wells->well_cells[1]);
|
||||
@@ -84,7 +84,7 @@ void check_controls_epoch0( struct WellControls ** ctrls) {
|
||||
|
||||
// Which control is active
|
||||
BOOST_CHECK_EQUAL( 0 , well_controls_get_current(ctrls0) );
|
||||
|
||||
|
||||
// The phase distribution in the active target
|
||||
{
|
||||
const double * distr = well_controls_iget_distr( ctrls0 , 0 );
|
||||
@@ -93,7 +93,7 @@ void check_controls_epoch0( struct WellControls ** ctrls) {
|
||||
BOOST_CHECK_EQUAL( 1 , distr[2] ); // Gas
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// The producer
|
||||
{
|
||||
const struct WellControls * ctrls1 = ctrls[1];
|
||||
@@ -146,7 +146,7 @@ void check_controls_epoch1( struct WellControls ** ctrls) {
|
||||
BOOST_CHECK_EQUAL( 0 , distr[2] ); // Gas
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// The producer
|
||||
{
|
||||
const struct WellControls * ctrls1 = ctrls[1];
|
||||
@@ -202,7 +202,7 @@ BOOST_AUTO_TEST_CASE(New_Constructor_Works) {
|
||||
wells_static_check( wellsManager.c_wells() );
|
||||
check_controls_epoch1( wellsManager.c_wells()->ctrls );
|
||||
}
|
||||
|
||||
|
||||
|
||||
{
|
||||
Opm::WellsManager wellsManager(eclipseState, 3, *gridManager.c_grid(), NULL);
|
||||
@@ -217,7 +217,7 @@ BOOST_AUTO_TEST_CASE(New_Constructor_Works) {
|
||||
|
||||
check_controls_epoch3( wellsManager.c_wells()->ctrls );
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user