// -*- 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::EclBaseVanguard */ #ifndef EWOMS_ECL_GENERIC_VANGUARD_HH #define EWOMS_ECL_GENERIC_VANGUARD_HH #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Opm { namespace Action { class State; } class Deck; class EclipseState; struct NumericalAquiferCell; class ParseContext; class Schedule; class Python; class SummaryConfig; class SummaryState; class UDQState; class WellTestState; class EclGenericVanguard { public: using ParallelWellStruct = std::vector>; struct SimulationModelParams { double setupTime_; std::unique_ptr udqState_; std::unique_ptr actionState_; std::unique_ptr summaryState_; std::unique_ptr wtestState_; std::shared_ptr eclState_; std::shared_ptr eclSchedule_; std::shared_ptr eclSummaryConfig_; }; static SimulationModelParams modelParams_; /*! * \brief Constructor. * \details Needs to be in compile unit. */ EclGenericVanguard(); explicit EclGenericVanguard(SimulationModelParams&& params); /*! * \brief Destructor. * \details Empty, but needs to be in compile unit. */ ~EclGenericVanguard(); static SimulationModelParams serializationTestParams(); /*! * \brief Returns the canonical path to a deck file. * * The input can either be the canonical deck file name or the name of the case * (i.e., without the .DATA extension) */ static std::string canonicalDeckPath(const std::string& caseName); /*! * \brief Returns the wall time required to set up the simulator before it was born. */ double setupTime() { return setupTime_; } /*! * \brief Read a deck. * \param filename file to read */ static void readDeck(const std::string& filename); /*! * \brief Set the simulation configuration objects. */ void defineSimulationModel(SimulationModelParams&& params); /*! * \brief Return a reference to the internalized ECL deck. */ const EclipseState& eclState() const { return *eclState_; } EclipseState& eclState() { return *eclState_; } /*! * \brief Return a reference to the object that managages the ECL schedule. */ const Schedule& schedule() const { return *eclSchedule_; } Schedule& schedule() { return *eclSchedule_; } /*! * \brief Return a reference to the object that determines which quantities ought to * be put into the ECL summary output. */ const SummaryConfig& summaryConfig() const { return *eclSummaryConfig_; } /*! * \brief Returns the summary state * * The summary state is a small container object for * computed, ready to use summary values. The values will typically be used by * the UDQ, WTEST and ACTIONX calculations. */ SummaryState& summaryState() { return *summaryState_; } const SummaryState& summaryState() const { return *summaryState_; } /*! * \brief Returns the action state * * The ActionState keeps track of how many times the various actions have run. */ Action::State& actionState() { return *actionState_; } const Action::State& actionState() const { return *actionState_; } /*! * \brief Returns the udq state * * The UDQState keeps track of the result of UDQ evaluations. */ UDQState& udqState() { return *udqState_; } const UDQState& udqState() const { return *udqState_; } WellTestState transferWTestState() { return *this->wtestState_.release(); } /*! * \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 Parameter deciding the edge-weight strategy of the load balancer. */ Dune::EdgeWeightMethod edgeWeightsMethod() const { return edgeWeightsMethod_; } /*! * \brief Number of blocks in the Block-Jacobi preconditioner. */ int numJacobiBlocks() const { #if HAVE_OPENCL return numJacobiBlocks_; #else return 0; #endif } /*! * \brief Parameter that decide if cells owned by rank are ordered before ghost cells. */ bool ownersFirst() const { return ownersFirst_; } #if HAVE_MPI /*! * \brief Parameter that decides if partitioning for parallel runs * should be performed on a single process only. */ bool serialPartitioning() const { return serialPartitioning_; } /*! * \brief Parameter that sets the zoltan imbalance tolarance. */ double zoltanImbalanceTol() const { return zoltanImbalanceTol_; } #endif /*! * \brief Whether perforations of a well might be distributed. */ bool enableDistributedWells() const { return enableDistributedWells_; } /*! * \brief Returns vector with name and whether the has local perforated cells * for all wells. * * Will only have usable values for CpGrid. */ const ParallelWellStruct& parallelWells() const { return parallelWells_; } //! \brief Set global communication. static void setCommunication(std::unique_ptr comm) { comm_ = std::move(comm); } //! \brief Obtain global communicator. static Parallel::Communication& comm() { assert(comm_); return *comm_; } // Private to avoid pulling schedule in header. // Static state is not serialized, only use for restart. template void serializeOp(Serializer& serializer); // Only compares dynamic state. bool operator==(const EclGenericVanguard& rhs) const; protected: void updateOutputDir_(std::string outputDir, bool enableEclCompatFile); bool drsdtconEnabled() const; std::unordered_map allAquiferCells() const; void init(); double setupTime_; // These variables may be owned by both Python and the simulator static std::unique_ptr comm_; std::string caseName_; std::string fileName_; Dune::EdgeWeightMethod edgeWeightsMethod_; #if HAVE_OPENCL int numJacobiBlocks_{0}; #endif // HAVE_OPENCL bool ownersFirst_; #if HAVE_MPI bool serialPartitioning_; double zoltanImbalanceTol_; std::string zoltanParams_; #endif bool enableDistributedWells_; std::string ignoredKeywords_; std::optional outputInterval_; bool useMultisegmentWell_; bool enableExperiments_; std::unique_ptr summaryState_; std::unique_ptr udqState_; std::unique_ptr actionState_; // Observe that this instance is handled differently from the other state // variables, it will only be initialized for a restart run. While // initializing a restarted run this instance is transferred to the WGState // member in the well model. std::unique_ptr wtestState_; // these attributes point either to the internal or to the external version of the // parser objects. std::shared_ptr python; // These variables may be owned by both Python and the simulator std::shared_ptr eclState_; std::shared_ptr eclSchedule_; std::shared_ptr eclSummaryConfig_; /*! \brief Information about wells in parallel * * For each well in the model there is an entry with its name * and a boolean indicating whether it perforates local cells. */ ParallelWellStruct parallelWells_; }; } // namespace Opm #endif