diff --git a/opm/core/wells/WellsManager_impl.hpp b/opm/core/wells/WellsManager_impl.hpp index 6f877b5d..3c315034 100644 --- a/opm/core/wells/WellsManager_impl.hpp +++ b/opm/core/wells/WellsManager_impl.hpp @@ -1,7 +1,13 @@ #include #include +#include + +#include #include +#include +#include +#include namespace WellsManagerDetail { @@ -46,30 +52,46 @@ double computeWellIndex(const double radius, const double* cell_permeability, const double skin_factor); -template -std::array getCubeDim(const C2F& c2f, FC begin_face_centroids, int dimensions, - int cell) +template +std::array +getCubeDim(const C2F& c2f, + FC begin_face_centroids, + int cell) { - using namespace std; - std::array cube; - //typedef Opm::UgGridHelpers::Cell2FacesTraits::Type Cell2Faces; - //Cell2Faces c2f=Opm::UgGridHelpers::cell2Faces(grid); - typedef typename C2F::row_type FaceRow; - FaceRow faces=c2f[cell]; - typename FaceRow::const_iterator face=faces.begin(); - int num_local_faces = faces.end()-face; - vector x(num_local_faces); - vector y(num_local_faces); - vector z(num_local_faces); - for (int lf=0; lf, dim > X; + { + const std::vector::size_type + nf = std::distance(c2f[cell].begin(), + c2f[cell].end ()); + + for (int d = 0; d < dim; ++d) { + X[d].reserve(nf); + } } - cube[0] = *max_element(x.begin(), x.end()) - *min_element(x.begin(), x.end()); - cube[1] = *max_element(y.begin(), y.end()) - *min_element(y.begin(), y.end()); - cube[2] = *max_element(z.begin(), z.end()) - *min_element(z.begin(), z.end()); + + typedef typename C2F::row_type::const_iterator FI; + + for (FI f = c2f[cell].begin(), e = c2f[cell].end(); f != e; ++f) { + using Opm::UgGridHelpers::increment; + using Opm::UgGridHelpers::getCoordinate; + + const FC& fc = increment(begin_face_centroids, *f, dim); + + for (int d = 0; d < dim; ++d) { + X[d].push_back(getCoordinate(fc, d)); + } + } + + std::array cube; + for (int d = 0; d < dim; ++d) { + typedef std::vector::iterator VI; + typedef std::pair PVI; + + const PVI m = std::minmax_element(X[d].begin(), X[d].end()); + + cube[d] = *m.second - *m.first; + } + return cube; } } // end namespace @@ -141,8 +163,10 @@ void WellsManager::createWellsFromSpecs(std::vector& wells, size_t radius = 0.5*unit::feet; OPM_MESSAGE("**** Warning: Well bore internal radius set to " << radius); } - std::array cubical = WellsManagerDetail::getCubeDim(c2f, begin_face_centroids, - dimensions, 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()); }