// -*- 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 . Consult the COPYING file in the top-level source directory of this module for the precise wording of the license and the list of copyright holders. */ /** * \file * * \copydoc Opm::TracerModel */ #ifndef OPM_GENERIC_TRACER_MODEL_HPP #define OPM_GENERIC_TRACER_MODEL_HPP #include #include #include #include #include #include #include #include #include #include #include #include namespace Opm { class EclipseState; class Well; template class GenericTracerModel { public: using TracerVectorSingle = Dune::BlockVector>; using TracerMatrix = Dune::BCRSMatrix>; using TracerVector = Dune::BlockVector>; using CartesianIndexMapper = Dune::CartesianIndexMapper; static constexpr int dimWorld = Grid::dimensionworld; /*! * \brief Return the number of tracers considered by the tracerModel. */ int numTracers() const; /*! * \brief Return the tracer name */ const std::string& name(int tracerIdx) const; std::string fname(int tracerIdx) const; std::string sname(int tracerIdx) const; std::string wellfname(int tracerIdx) const; std::string wellsname(int tracerIdx) const; Phase phase(int tracerIdx) const; const std::vector& enableSolTracers() const; /*! * \brief Return the tracer concentration for tracer index and global DofIdx */ Scalar freeTracerConcentration(int tracerIdx, int globalDofIdx) const; Scalar solTracerConcentration(int tracerIdx, int globalDofIdx) const; void setFreeTracerConcentration(int tracerIdx, int globalDofIdx, Scalar value); void setSolTracerConcentration(int tracerIdx, int globalDofIdx, Scalar value); void setEnableSolTracers(int tracerIdx, bool enableSolTracer); /*! * \brief Return well tracer rates */ const std::map, Scalar>& getWellTracerRates() const {return wellTracerRate_;} const std::map, Scalar>& getWellFreeTracerRates() const {return wellFreeTracerRate_;} const std::map, Scalar>& getWellSolTracerRates() const {return wellSolTracerRate_;} const std::map, Scalar>& getMswTracerRates() const {return mSwTracerRate_;} template void serializeOp(Serializer& serializer) { serializer(tracerConcentration_); serializer(freeTracerConcentration_); serializer(solTracerConcentration_); serializer(wellTracerRate_); serializer(wellFreeTracerRate_); serializer(wellSolTracerRate_); serializer(mSwTracerRate_); } protected: GenericTracerModel(const GridView& gridView, const EclipseState& eclState, const CartesianIndexMapper& cartMapper, const DofMapper& dofMapper, const std::function(int)> centroids); /*! * \brief Initialize all internal data structures needed by the tracer module */ void doInit(bool rst, std::size_t numGridDof, std::size_t gasPhaseIdx, std::size_t oilPhaseIdx, std::size_t waterPhaseIdx); bool linearSolve_(const TracerMatrix& M, TracerVector& x, TracerVector& b); bool linearSolveBatchwise_(const TracerMatrix& M, std::vector& x, std::vector& b); Scalar currentConcentration_(const Well& eclWell, const std::string& name) const; const GridView& gridView_; const EclipseState& eclState_; const CartesianIndexMapper& cartMapper_; const DofMapper& dofMapper_; std::vector tracerPhaseIdx_; std::vector enableSolTracers_; std::vector tracerConcentration_; std::unique_ptr tracerMatrix_; std::vector freeTracerConcentration_; std::vector solTracerConcentration_; // -> wellRate std::map, Scalar> wellTracerRate_; std::map, Scalar> wellFreeTracerRate_; std::map, Scalar> wellSolTracerRate_; // -> wellRate std::map, Scalar> mSwTracerRate_; /// \brief Function returning the cell centers std::function(int)> centroids_; }; } // namespace Opm #endif // OPM_GENERIC_TRACER_MODEL_HPP