/* Copyright 2012 SINTEF ICT, Applied Mathematics. This file is part of the Open Porous Media project (OPM). OPM is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. OPM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OPM. If not, see . */ #ifndef OPM_BLACKOILSTATE_HEADER_INCLUDED #define OPM_BLACKOILSTATE_HEADER_INCLUDED #include #include #include #include namespace Opm { /// Simulator state for a blackoil simulator. class BlackoilState { public: void init(const UnstructuredGrid& g, const int num_phases) { num_phases_ = num_phases; press_.resize(g.number_of_cells, 0.0); fpress_.resize(g.number_of_faces, 0.0); flux_.resize(g.number_of_faces, 0.0); sat_.resize(num_phases * g.number_of_cells, 0.0); for (int cell = 0; cell < g.number_of_cells; ++cell) { // Defaulting the second saturation to 1.0. // This will usually be oil in a water-oil case, // gas in an oil-gas case. // For proper initialization, one should not rely on this, // but use available phase information instead. sat_[num_phases*cell + 1] = 1.0; } gor_.resize(g.number_of_cells, 0.0); } enum ExtremalSat { MinSat, MaxSat }; /// Set the first saturation to either its min or max value in /// the indicated cells. The second saturation value s2 is set /// to (1.0 - s1) for each cell. Any further saturation values /// are unchanged. void setFirstSat(const std::vector& cells, const Opm::BlackoilPropertiesInterface& props, ExtremalSat es) { if (cells.empty()) { return; } const int n = cells.size(); assert(n > 0); std::vector smin(num_phases_*n); std::vector smax(num_phases_*n); props.satRange(n, &cells[0], &smin[0], &smax[0]); const double* svals = (es == MinSat) ? &smin[0] : &smax[0]; for (int ci = 0; ci < n; ++ci) { const int cell = cells[ci]; sat_[num_phases_*cell] = svals[num_phases_*ci]; sat_[num_phases_*cell + 1] = 1.0 - sat_[num_phases_*cell]; } } int numPhases() const { return num_phases_; } std::vector& pressure () { return press_ ; } std::vector& facepressure() { return fpress_; } std::vector& faceflux () { return flux_ ; } std::vector& surfacevol () { return surfvol_; } std::vector& saturation () { return sat_ ; } std::vector& gasoilratio () { return gor_ ; } const std::vector& pressure () const { return press_ ; } const std::vector& facepressure() const { return fpress_; } const std::vector& faceflux () const { return flux_ ; } const std::vector& surfacevol () const { return surfvol_; } const std::vector& saturation () const { return sat_ ; } const std::vector& gasoilratio () const { return gor_ ; } private: int num_phases_; std::vector press_ ; std::vector fpress_; std::vector flux_ ; std::vector surfvol_; std::vector sat_ ; std::vector gor_ ; }; } // namespace Opm #endif // OPM_BLACKOILSTATE_HEADER_INCLUDED