// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- // vi: set et ts=4 sw=4 sts=4: /* 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 2 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 . */ /*! * \file * \copydoc Ewoms::EclBaseGridManager */ #ifndef EWOMS_ECL_BASE_GRID_MANAGER_HH #define EWOMS_ECL_BASE_GRID_MANAGER_HH #include #include #include #include #include #include #include #include #include #include #include #include namespace Ewoms { template class EclBaseGridManager; namespace Properties { NEW_TYPE_TAG(EclBaseGridManager); // declare the properties required by the for the ecl grid manager NEW_PROP_TAG(Grid); NEW_PROP_TAG(EquilGrid); NEW_PROP_TAG(Scalar); NEW_PROP_TAG(EclDeckFileName); SET_STRING_PROP(EclBaseGridManager, EclDeckFileName, "ECLDECK.DATA"); } // namespace Properties /*! * \ingroup EclBlackOilSimulator * * \brief Helper class for grid instantiation of ECL file-format using problems. */ template class EclBaseGridManager : public BaseGridManager { typedef BaseGridManager ParentType; typedef typename GET_PROP_TYPE(TypeTag, GridManager) Implementation; typedef typename GET_PROP_TYPE(TypeTag, Scalar) Scalar; typedef typename GET_PROP_TYPE(TypeTag, Simulator) Simulator; public: typedef typename GET_PROP_TYPE(TypeTag, Grid) Grid; typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView; protected: static const int dimension = Grid::dimension; public: /*! * \brief Register all run-time parameters for the grid manager. */ static void registerParameters() { EWOMS_REGISTER_PARAM(TypeTag, std::string, EclDeckFileName, "The name of the file which contains the ECL deck to be simulated"); } /*! * \brief Create the grid for problem data files which use the ECL file format. * * This is the file format used by the commercial ECLiPSE simulator. Usually it uses * a cornerpoint description of the grid. */ EclBaseGridManager(Simulator &simulator) : ParentType(simulator) { std::string fileName = EWOMS_GET_PARAM(TypeTag, std::string, EclDeckFileName); // compute the base name of the input file name const char directorySeparator = '/'; long int i; for (i = fileName.size(); i >= 0; -- i) if (fileName[i] == directorySeparator) break; std::string baseName = fileName.substr(i + 1, fileName.size()); // remove the extension from the input file for (i = baseName.size(); i >= 0; -- i) if (baseName[i] == '.') break; std::string rawCaseName; if (i < 0) rawCaseName = baseName; else rawCaseName = baseName.substr(0, i); // transform the result to ALL_UPPERCASE caseName_ = ""; for (size_t i = 0; i < rawCaseName.size(); ++i) caseName_ += std::toupper(rawCaseName[i]); Opm::ParserPtr parser(new Opm::Parser()); typedef std::pair ParseModePair; typedef std::vector ParseModePairs; ParseModePairs tmp; tmp.push_back(ParseModePair(Opm::ParseMode::PARSE_RANDOM_SLASH , Opm::InputError::IGNORE)); Opm::ParseMode parseMode(tmp); std::cout << "Reading the deck file '" << fileName << "'" << std::endl; deck_ = parser->parseFile(fileName , parseMode); eclState_.reset(new Opm::EclipseState(deck_, parseMode)); asImp_().createGrids_(); asImp_().finalizeInit_(); } /*! * \brief Return a pointer to the parsed ECL deck */ Opm::DeckConstPtr deck() const { return deck_; } /*! * \brief Return a pointer to the internalized ECL deck */ Opm::EclipseStateConstPtr eclState() const { return eclState_; } /*! * \brief Return a pointer to the internalized schedule of the ECL deck */ Opm::ScheduleConstPtr schedule() const { return eclState_->getSchedule(); } /*! * \brief Return a pointer to the EclipseGrid object * * The EclipseGrid class is provided by the opm-parser module and is used to * internalize the cornerpoint grid representation and, amongst others, can be used * to write EGRID files (which tends to be difficult with a plain Dune::CpGrid) */ Opm::EclipseGridConstPtr eclGrid() const { return eclState_->getEclipseGrid(); } /*! * \brief Returns the name of the case. * * i.e., the all-uppercase version of the file name from which the * deck is loaded with the ".DATA" suffix removed. */ const std::string& caseName() const { return caseName_; } /*! * \brief Returns the number of logically Cartesian cells in each direction */ const std::array& cartesianDimensions() const { return asImp_().cartesianIndexMapper().cartesianDimensions(); } /*! * \brief Returns the overall number of cells of the logically Cartesian grid */ int cartesianSize() const { return asImp_().cartesianIndexMapper().cartesianSize(); } /*! * \brief Returns the Cartesian cell id for identifaction with ECL data */ unsigned cartesianIndex(unsigned compressedCellIdx) const { return asImp_().cartesianIndexMapper().cartesianIndex(compressedCellIdx); } /*! * \brief Return the index of the cells in the logical Cartesian grid */ unsigned cartesianIndex(const std::array& coords) const { unsigned cartIndex = coords[0]; int factor = cartesianDimensions()[0]; for (unsigned i = 1; i < dimension; ++i) { cartIndex += coords[i]*factor; factor *= cartesianDimensions()[i]; } return cartIndex; } /*! * \brief Extract Cartesian index triplet (i,j,k) of an active cell. * * \param [in] cellIdx Active cell index. * \param [out] ijk Cartesian index triplet */ void cartesianCoordinate(unsigned cellIdx, std::array& ijk) const { return asImp_().cartesianIndexMapper().cartesianCoordinate(cellIdx, ijk); } /*! * \brief Returns the Cartesian cell id given an element index for the grid used for equilibration */ unsigned equilCartesianIndex(unsigned compressedEquilCellIdx) const { return asImp_().equilCartesianIndexMapper().cartesianIndex(compressedEquilCellIdx); } /*! * \brief Extract Cartesian index triplet (i,j,k) of an active cell of the grid used for EQUIL. * * \param [in] cellIdx Active cell index. * \param [out] ijk Cartesian index triplet */ void equilCartesianCoordinate(unsigned cellIdx, std::array& ijk) const { return asImp_().equilCartesianIndexMapper().cartesianCoordinate(cellIdx, ijk); } private: Implementation& asImp_() { return *static_cast(this); } const Implementation& asImp_() const { return *static_cast(this); } std::string caseName_; Opm::DeckConstPtr deck_; Opm::EclipseStateConstPtr eclState_; }; } // namespace Ewoms #endif