FlowGenericVanguard.hpp
Go to the documentation of this file.
1// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2// vi: set et ts=4 sw=4 sts=4:
3/*
4 This file is part of the Open Porous Media project (OPM).
5
6 OPM is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 2 of the License, or
9 (at your option) any later version.
10
11 OPM is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with OPM. If not, see <http://www.gnu.org/licenses/>.
18
19 Consult the COPYING file in the top-level source directory of this
20 module for the precise wording of the license and the list of
21 copyright holders.
22*/
27#ifndef OPM_FLOW_GENERIC_VANGUARD_HPP
28#define OPM_FLOW_GENERIC_VANGUARD_HPP
29
30#include <dune/common/parallel/communication.hh>
31
32#include <opm/common/OpmLog/OpmLog.hpp>
33
34#include <opm/grid/common/GridEnums.hpp>
35
36#include <opm/input/eclipse/Schedule/Well/WellTestState.hpp>
37
39
40#include <cassert>
41#include <memory>
42#include <optional>
43#include <string>
44#include <unordered_map>
45#include <utility>
46#include <vector>
47
48namespace Opm::Parameters {
49
50struct AllowDistributedWells { static constexpr bool value = false; };
51struct AllowSplittingInactiveWells { static constexpr bool value = true; };
52
53struct EclOutputInterval { static constexpr int value = -1; };
54struct EdgeWeightsMethod { static constexpr auto value = "transmissibility"; };
55struct EnableDryRun { static constexpr auto value = "auto"; };
56struct EnableEclOutput { static constexpr auto value = true; };
57struct EnableOpmRstFile { static constexpr bool value = false; };
58struct ExternalPartition { static constexpr auto* value = ""; };
59
60template<class Scalar>
61struct ImbalanceTol { static constexpr Scalar value = 1.1; };
62
63struct IgnoreKeywords { static constexpr auto value = ""; };
64struct InputSkipMode { static constexpr auto value = "100"; };
65struct MetisParams { static constexpr auto value = "default"; };
66
67#if HAVE_OPENCL || HAVE_ROCSPARSE || HAVE_CUDA
68struct NumJacobiBlocks { static constexpr int value = 0; };
69#endif // HAVE_OPENCL || HAVE_ROCSPARSE || HAVE_CUDA
70
71struct OwnerCellsFirst { static constexpr bool value = true; };
72struct ParsingStrictness { static constexpr auto value = "normal"; };
73struct ActionParsingStrictness { static constexpr auto value = "normal"; };
74
77struct PartitionMethod { static constexpr auto value = "zoltanwell"; };
78struct AddCorners { static constexpr bool value = false; };
79struct NumOverlap { static constexpr int value = 1; };
80struct EdgeConformal { static constexpr bool value = false; };
81struct MinpvMergeCells { static constexpr bool value = false; };
82
83struct SchedRestart{ static constexpr bool value = false; };
84struct SerialPartitioning{ static constexpr bool value = false; };
85
86template<class Scalar>
87struct ZoltanImbalanceTol { static constexpr Scalar value = 1.1; };
88
89struct ZoltanPhgEdgeSizeThreshold { static constexpr auto value = 0.35; };
90
91struct ZoltanParams { static constexpr auto value = "graph"; };
92
93} // namespace Opm::Parameters
94
95namespace Opm {
96
97namespace Action { class State; }
98class Deck;
99class EclipseState;
100struct NumericalAquiferCell;
101class ParseContext;
102class Schedule;
103class Python;
104class SummaryConfig;
105class SummaryState;
106class UDQState;
107class WellTestState;
108
110public:
111 using ParallelWellStruct = std::vector<std::pair<std::string,bool>>;
112
115 std::unique_ptr<UDQState> udqState_;
116 std::unique_ptr<Action::State> actionState_;
117 std::unique_ptr<SummaryState> summaryState_;
118 std::unique_ptr<WellTestState> wtestState_;
119 std::shared_ptr<EclipseState> eclState_;
120 std::shared_ptr<Schedule> eclSchedule_;
121 std::shared_ptr<SummaryConfig> eclSummaryConfig_;
122 };
123
125
132
138
140
147 static std::string canonicalDeckPath(const std::string& caseName);
148
152 double setupTime()
153 { return setupTime_; }
154
160 static void readDeck(const std::string& filename, const std::string& ignoredKeywords);
161
166
170 const EclipseState& eclState() const
171 { return *eclState_; }
172
173 EclipseState& eclState()
174 { return *eclState_; }
175
179 const Schedule& schedule() const
180 { return *eclSchedule_; }
181
182 Schedule& schedule()
183 { return *eclSchedule_; }
184
189 const SummaryConfig& summaryConfig() const
190 { return *eclSummaryConfig_; }
191
199 SummaryState& summaryState()
200 { return *summaryState_; }
201
202 const SummaryState& summaryState() const
203 { return *summaryState_; }
204
210 Action::State& actionState()
211 { return *actionState_; }
212
213 const Action::State& actionState() const
214 { return *actionState_; }
215
221 UDQState& udqState()
222 { return *udqState_; }
223
224 const UDQState& udqState() const
225 { return *udqState_; }
226
227 std::unique_ptr<WellTestState> transferWTestState() {
228 return std::move(this->wtestState_);
229 }
230
231
238 const std::string& caseName() const
239 { return caseName_; }
240
244 Dune::EdgeWeightMethod edgeWeightsMethod() const
245 { return edgeWeightsMethod_; }
246
250 int numJacobiBlocks() const
251 { return numJacobiBlocks_; }
252
256 bool ownersFirst() const
257 { return ownersFirst_; }
258
259 bool edgeConformal() const
260 { return edgeConformal_; }
261
264 bool minpvMergeCells() const
265 { return minpvMergeCells_; }
266
267#if HAVE_MPI
268 bool addCorners() const
269 { return addCorners_; }
270
271 int numOverlap() const
272 { return numOverlap_; }
273
277 Dune::PartitionMethod partitionMethod() const
278 { return partitionMethod_; }
279
285 { return serialPartitioning_; }
286
291 double imbalanceTol() const
292 {
294 OpmLog::info("The parameter --zoltan-imbalance-tol is deprecated "
295 "and has been renamed to --imbalance-tol, please "
296 "adjust your calls and scripts!");
297 return zoltanImbalanceTol_;
298 } else {
299 return imbalanceTol_;
300 }
301 }
302
303 const std::string& externalPartitionFile() const
304 {
305 return this->externalPartitionFile_;
306 }
307#endif // HAVE_MPI
308
313 { return enableDistributedWells_; }
314
319 bool enableEclOutput() const
320 { return enableEclOutput_; }
321
330 { return parallelWells_; }
331
333 static void setCommunication(std::unique_ptr<Opm::Parallel::Communication> comm)
334 { comm_ = std::move(comm); }
335
338 {
339 assert(comm_ != nullptr);
340 return *comm_;
341 }
342
343 // Private to avoid pulling schedule in header.
344 // Static state is not serialized, only use for restart.
345 template<class Serializer>
346 void serializeOp(Serializer& serializer);
347
348 // Only compares dynamic state.
349 bool operator==(const FlowGenericVanguard& rhs) const;
350
351protected:
352 void updateOutputDir_(std::string outputDir,
353 bool enableEclCompatFile);
354
355 void updateNOSIM_(std::string_view enableDryRun);
356
357 bool drsdtconEnabled() const;
358
359 std::unordered_map<std::size_t, const NumericalAquiferCell*> allAquiferCells() const;
360
361 void init();
362
363 template<class Scalar>
364 static void registerParameters_();
365
367
368 // These variables may be owned by both Python and the simulator
369 static std::unique_ptr<Parallel::Communication> comm_;
370
371 std::string caseName_;
372 std::string fileName_;
373 Dune::EdgeWeightMethod edgeWeightsMethod_;
374
375 // Not guarded by the GPU defines: those are private to the library, and
376 // the class layout must be the same wherever this header is compiled.
378
382
383#if HAVE_MPI
386
387 Dune::PartitionMethod partitionMethod_;
390
394 std::string zoltanParams_;
395
396 std::string metisParams_;
397
399#endif // HAVE_MPI
400
404
405 std::string ignoredKeywords_;
406 std::optional<int> outputInterval_;
409
410 std::unique_ptr<SummaryState> summaryState_;
411 std::unique_ptr<UDQState> udqState_;
412 std::unique_ptr<Action::State> actionState_;
413
414 // Observe that this instance is handled differently from the other state
415 // variables, it will only be initialized for a restart run. While
416 // initializing a restarted run this instance is transferred to the WGState
417 // member in the well model.
418 std::unique_ptr<WellTestState> wtestState_;
419
420 // these attributes point either to the internal or to the external version of the
421 // parser objects.
422 std::shared_ptr<Python> python;
423 // These variables may be owned by both Python and the simulator
424 std::shared_ptr<EclipseState> eclState_;
425 std::shared_ptr<Schedule> eclSchedule_;
426 std::shared_ptr<SummaryConfig> eclSummaryConfig_;
427
434};
435
436} // namespace Opm
437
438#endif // OPM_FLOW_GENERIC_VANGUARD_HPP
Definition: FlowGenericVanguard.hpp:109
bool enableDistributedWells_
Definition: FlowGenericVanguard.hpp:401
bool useMultisegmentWell_
Definition: FlowGenericVanguard.hpp:407
static Parallel::Communication & comm()
Obtain global communicator.
Definition: FlowGenericVanguard.hpp:337
bool ownersFirst_
Definition: FlowGenericVanguard.hpp:379
int numJacobiBlocks_
Definition: FlowGenericVanguard.hpp:377
int numJacobiBlocks() const
Number of blocks in the Block-Jacobi preconditioner.
Definition: FlowGenericVanguard.hpp:250
void updateNOSIM_(std::string_view enableDryRun)
const Schedule & schedule() const
Return a reference to the object that managages the ECL schedule.
Definition: FlowGenericVanguard.hpp:179
std::string zoltanParams_
Definition: FlowGenericVanguard.hpp:394
std::string caseName_
Definition: FlowGenericVanguard.hpp:371
std::unordered_map< std::size_t, const NumericalAquiferCell * > allAquiferCells() const
double setupTime()
Returns the wall time required to set up the simulator before it was born.
Definition: FlowGenericVanguard.hpp:152
bool addCorners() const
Definition: FlowGenericVanguard.hpp:268
std::string ignoredKeywords_
Definition: FlowGenericVanguard.hpp:405
Dune::PartitionMethod partitionMethod_
Definition: FlowGenericVanguard.hpp:387
const SummaryState & summaryState() const
Definition: FlowGenericVanguard.hpp:202
bool serialPartitioning() const
Parameter that decides if partitioning for parallel runs should be performed on a single process only...
Definition: FlowGenericVanguard.hpp:284
static void registerParameters_()
static SimulationModelParams modelParams_
Definition: FlowGenericVanguard.hpp:124
const SummaryConfig & summaryConfig() const
Return a reference to the object that determines which quantities ought to be put into the ECL summar...
Definition: FlowGenericVanguard.hpp:189
bool minpvMergeCells_
Definition: FlowGenericVanguard.hpp:381
bool zoltanImbalanceTolSet_
Definition: FlowGenericVanguard.hpp:391
static SimulationModelParams serializationTestParams()
ParallelWellStruct parallelWells_
Information about wells in parallel.
Definition: FlowGenericVanguard.hpp:433
void serializeOp(Serializer &serializer)
bool enableExperiments_
Definition: FlowGenericVanguard.hpp:408
static void setCommunication(std::unique_ptr< Opm::Parallel::Communication > comm)
Set global communication.
Definition: FlowGenericVanguard.hpp:333
bool enableDistributedWells() const
Whether perforations of a well might be distributed.
Definition: FlowGenericVanguard.hpp:312
bool serialPartitioning_
Definition: FlowGenericVanguard.hpp:388
~FlowGenericVanguard()
Destructor.
Action::State & actionState()
Returns the action state.
Definition: FlowGenericVanguard.hpp:210
std::shared_ptr< SummaryConfig > eclSummaryConfig_
Definition: FlowGenericVanguard.hpp:426
bool minpvMergeCells() const
Definition: FlowGenericVanguard.hpp:264
const EclipseState & eclState() const
Return a reference to the internalized ECL deck.
Definition: FlowGenericVanguard.hpp:170
double imbalanceTol() const
Parameter that sets the imbalance tolarance, depending on the chosen partition method.
Definition: FlowGenericVanguard.hpp:291
FlowGenericVanguard()
Constructor.
double zoltanPhgEdgeSizeThreshold_
Definition: FlowGenericVanguard.hpp:393
bool drsdtconEnabled() const
const std::string & externalPartitionFile() const
Definition: FlowGenericVanguard.hpp:303
Dune::EdgeWeightMethod edgeWeightsMethod_
Definition: FlowGenericVanguard.hpp:373
std::unique_ptr< WellTestState > transferWTestState()
Definition: FlowGenericVanguard.hpp:227
std::shared_ptr< Python > python
Definition: FlowGenericVanguard.hpp:422
const UDQState & udqState() const
Definition: FlowGenericVanguard.hpp:224
static std::string canonicalDeckPath(const std::string &caseName)
Returns the canonical path to a deck file.
void defineSimulationModel(SimulationModelParams &&params)
Set the simulation configuration objects.
bool enableEclOutput() const
Whether or not to emit result files that are compatible with a commercial reservoir simulator.
Definition: FlowGenericVanguard.hpp:319
bool enableEclOutput_
Definition: FlowGenericVanguard.hpp:402
const std::string & caseName() const
Returns the name of the case.
Definition: FlowGenericVanguard.hpp:238
bool ownersFirst() const
Parameter that decide if cells owned by rank are ordered before ghost cells.
Definition: FlowGenericVanguard.hpp:256
Dune::EdgeWeightMethod edgeWeightsMethod() const
Parameter deciding the edge-weight strategy of the load balancer.
Definition: FlowGenericVanguard.hpp:244
std::unique_ptr< WellTestState > wtestState_
Definition: FlowGenericVanguard.hpp:418
UDQState & udqState()
Returns the udq state.
Definition: FlowGenericVanguard.hpp:221
Dune::PartitionMethod partitionMethod() const
Parameter deciding which partition method to use.
Definition: FlowGenericVanguard.hpp:277
bool addCorners_
Definition: FlowGenericVanguard.hpp:384
bool edgeConformal() const
Definition: FlowGenericVanguard.hpp:259
EclipseState & eclState()
Definition: FlowGenericVanguard.hpp:173
double zoltanImbalanceTol_
Definition: FlowGenericVanguard.hpp:392
static std::unique_ptr< Parallel::Communication > comm_
Definition: FlowGenericVanguard.hpp:369
bool operator==(const FlowGenericVanguard &rhs) const
double imbalanceTol_
Definition: FlowGenericVanguard.hpp:389
std::unique_ptr< SummaryState > summaryState_
Definition: FlowGenericVanguard.hpp:410
static void readDeck(const std::string &filename, const std::string &ignoredKeywords)
Read a deck.
std::shared_ptr< Schedule > eclSchedule_
Definition: FlowGenericVanguard.hpp:425
const ParallelWellStruct & parallelWells() const
Retrieve collection (a vector of pairs) of well names and whether or not the corresponding well objec...
Definition: FlowGenericVanguard.hpp:329
Schedule & schedule()
Definition: FlowGenericVanguard.hpp:182
std::string externalPartitionFile_
Definition: FlowGenericVanguard.hpp:398
FlowGenericVanguard(SimulationModelParams &&params)
std::vector< std::pair< std::string, bool > > ParallelWellStruct
Definition: FlowGenericVanguard.hpp:111
bool allow_splitting_inactive_wells_
Definition: FlowGenericVanguard.hpp:403
double setupTime_
Definition: FlowGenericVanguard.hpp:366
std::optional< int > outputInterval_
Definition: FlowGenericVanguard.hpp:406
const Action::State & actionState() const
Definition: FlowGenericVanguard.hpp:213
int numOverlap_
Definition: FlowGenericVanguard.hpp:385
std::unique_ptr< UDQState > udqState_
Definition: FlowGenericVanguard.hpp:411
std::string fileName_
Definition: FlowGenericVanguard.hpp:372
std::string metisParams_
Definition: FlowGenericVanguard.hpp:396
std::unique_ptr< Action::State > actionState_
Definition: FlowGenericVanguard.hpp:412
SummaryState & summaryState()
Returns the summary state.
Definition: FlowGenericVanguard.hpp:199
int numOverlap() const
Definition: FlowGenericVanguard.hpp:271
std::shared_ptr< EclipseState > eclState_
Definition: FlowGenericVanguard.hpp:424
void updateOutputDir_(std::string outputDir, bool enableEclCompatFile)
bool edgeConformal_
Definition: FlowGenericVanguard.hpp:380
Dune::Communication< MPIComm > Communication
Definition: ParallelCommunication.hpp:30
Definition: blackoilnewtonmethodparams.hpp:31
Definition: blackoilbioeffectsmodules.hh:45
Definition: FlowGenericVanguard.hpp:113
std::unique_ptr< UDQState > udqState_
Definition: FlowGenericVanguard.hpp:115
std::shared_ptr< Schedule > eclSchedule_
Definition: FlowGenericVanguard.hpp:120
std::unique_ptr< SummaryState > summaryState_
Definition: FlowGenericVanguard.hpp:117
std::shared_ptr< EclipseState > eclState_
Definition: FlowGenericVanguard.hpp:119
std::shared_ptr< SummaryConfig > eclSummaryConfig_
Definition: FlowGenericVanguard.hpp:121
double setupTime_
Definition: FlowGenericVanguard.hpp:114
std::unique_ptr< WellTestState > wtestState_
Definition: FlowGenericVanguard.hpp:118
std::unique_ptr< Action::State > actionState_
Definition: FlowGenericVanguard.hpp:116
Definition: FlowGenericVanguard.hpp:73
static constexpr auto value
Definition: FlowGenericVanguard.hpp:73
Definition: FlowGenericVanguard.hpp:78
static constexpr bool value
Definition: FlowGenericVanguard.hpp:78
Definition: FlowGenericVanguard.hpp:50
static constexpr bool value
Definition: FlowGenericVanguard.hpp:50
Definition: FlowGenericVanguard.hpp:51
static constexpr bool value
Definition: FlowGenericVanguard.hpp:51
Definition: FlowGenericVanguard.hpp:53
static constexpr int value
Definition: FlowGenericVanguard.hpp:53
Definition: FlowGenericVanguard.hpp:80
static constexpr bool value
Definition: FlowGenericVanguard.hpp:80
Definition: FlowGenericVanguard.hpp:54
static constexpr auto value
Definition: FlowGenericVanguard.hpp:54
Definition: FlowGenericVanguard.hpp:55
static constexpr auto value
Definition: FlowGenericVanguard.hpp:55
Definition: FlowGenericVanguard.hpp:56
static constexpr auto value
Definition: FlowGenericVanguard.hpp:56
Definition: FlowGenericVanguard.hpp:57
static constexpr bool value
Definition: FlowGenericVanguard.hpp:57
Definition: FlowGenericVanguard.hpp:58
static constexpr auto * value
Definition: FlowGenericVanguard.hpp:58
Definition: FlowGenericVanguard.hpp:63
static constexpr auto value
Definition: FlowGenericVanguard.hpp:63
Definition: FlowGenericVanguard.hpp:61
static constexpr Scalar value
Definition: FlowGenericVanguard.hpp:61
Definition: FlowGenericVanguard.hpp:64
static constexpr auto value
Definition: FlowGenericVanguard.hpp:64
Definition: FlowGenericVanguard.hpp:65
static constexpr auto value
Definition: FlowGenericVanguard.hpp:65
Definition: FlowGenericVanguard.hpp:81
static constexpr bool value
Definition: FlowGenericVanguard.hpp:81
Definition: FlowGenericVanguard.hpp:79
static constexpr int value
Definition: FlowGenericVanguard.hpp:79
Definition: FlowGenericVanguard.hpp:71
static constexpr bool value
Definition: FlowGenericVanguard.hpp:71
Definition: FlowGenericVanguard.hpp:72
static constexpr auto value
Definition: FlowGenericVanguard.hpp:72
Definition: FlowGenericVanguard.hpp:77
static constexpr auto value
Definition: FlowGenericVanguard.hpp:77
Definition: FlowGenericVanguard.hpp:83
static constexpr bool value
Definition: FlowGenericVanguard.hpp:83
Definition: FlowGenericVanguard.hpp:84
static constexpr bool value
Definition: FlowGenericVanguard.hpp:84
Definition: FlowGenericVanguard.hpp:87
static constexpr Scalar value
Definition: FlowGenericVanguard.hpp:87
Definition: FlowGenericVanguard.hpp:91
static constexpr auto value
Definition: FlowGenericVanguard.hpp:91
Definition: FlowGenericVanguard.hpp:89
static constexpr auto value
Definition: FlowGenericVanguard.hpp:89