diff --git a/opm/core/wells/WellsManager_impl.hpp b/opm/core/wells/WellsManager_impl.hpp index 979ee4c0..4967980a 100644 --- a/opm/core/wells/WellsManager_impl.hpp +++ b/opm/core/wells/WellsManager_impl.hpp @@ -102,9 +102,9 @@ namespace Opm { template void WellsManager::createWellsFromSpecs(std::vector& 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& well_names, @@ -155,40 +155,46 @@ void WellsManager::createWellsFromSpecs(std::vector& wells, size_t CompletionSetConstPtr completionSet = well->getCompletions(timeStep); for (size_t c=0; csize(); 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::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::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 cubical = - WellsManagerDetail::getCubeDim<3>(c2f, begin_face_centroids, cell); + const std::array 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++; diff --git a/tests/test_wellsmanager.cpp b/tests/test_wellsmanager.cpp index c6239259..e20ebac3 100644 --- a/tests/test_wellsmanager.cpp +++ b/tests/test_wellsmanager.cpp @@ -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 ); } - + }