FlowGenericProblem.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*/
28#ifndef OPM_FLOW_GENERIC_PROBLEM_HPP
29#define OPM_FLOW_GENERIC_PROBLEM_HPP
30
31#include <opm/material/common/UniformXTabulated2DFunction.hpp>
32#include <opm/material/common/Tabulated1DFunction.hpp>
33
35
36#include <array>
37#include <cstddef>
38#include <functional>
39#include <string>
40#include <vector>
41
42namespace Dune {
43class ParameterTree;
44}
45
46namespace Opm {
47
48class Deck;
49class EclipseState;
50class Schedule;
51template<typename Grid, typename GridView> class LookUpData;
52
59template<class GridView, class FluidSystem>
61{
62public:
63 using Scalar = typename FluidSystem::Scalar;
64 using TabulatedTwoDFunction = UniformXTabulated2DFunction<Scalar>;
65 using TabulatedFunction = Tabulated1DFunction<Scalar>;
66
67 struct RockParams {
70 };
71
72 FlowGenericProblem(const EclipseState& eclState,
73 const Schedule& schedule,
74 const GridView& gridView);
75
76
77 static FlowGenericProblem serializationTestObject(const EclipseState& eclState,
78 const Schedule& schedule,
79 const GridView& gridView);
80
84 static std::string helpPreamble(int,
85 const char **argv);
86
90 static std::string briefDescription();
91
97 static void setBriefDescription(const std::string& msg)
98 { briefDescription_ = msg; }
99
109 Scalar maxWaterSaturation(unsigned globalDofIdx) const;
110
120 Scalar minOilPressure(unsigned globalDofIdx) const;
121
127 Scalar overburdenPressure(unsigned elementIdx) const;
128
137 Scalar referencePorosity(unsigned elementIdx, unsigned timeIdx) const
138 { return referencePorosity_[timeIdx][elementIdx]; }
139
140
149 Scalar rockFraction(unsigned elementIdx, unsigned timeIdx) const;
150
155 void setPorosity(Scalar poro, unsigned elementIdx, unsigned timeIdx = 0)
156 { referencePorosity_[timeIdx][elementIdx] = poro; }
157
161 Scalar solventSaturation(unsigned elemIdx) const;
162
166 Scalar solventRsw(unsigned elemIdx) const;
167
171 Scalar polymerConcentration(unsigned elemIdx) const;
172
176 // TODO: remove this function if not called
177 Scalar polymerMolecularWeight(const unsigned elemIdx) const;
178
182 Scalar microbialConcentration(unsigned elemIdx) const;
183
187 Scalar oxygenConcentration(unsigned elemIdx) const;
188
192 Scalar ureaConcentration(unsigned elemIdx) const;
193
197 Scalar biofilmVolumeFraction(unsigned elemIdx) const;
198
202 Scalar calciteVolumeFraction(unsigned elemIdx) const;
203
207 unsigned pvtRegionIndex(unsigned elemIdx) const;
208
209// const std::vector<int>& pvtRegionArray() const
210// { return pvtnum_; }
211
215 unsigned satnumRegionIndex(unsigned elemIdx) const;
216
220 unsigned miscnumRegionIndex(unsigned elemIdx) const;
221
225 unsigned plmixnumRegionIndex(unsigned elemIdx) const;
226
230 Scalar maxPolymerAdsorption(unsigned elemIdx) const;
231
239 Scalar rockCompressibility(unsigned globalSpaceIdx) const;
240
249 Scalar porosity(unsigned globalSpaceIdx, unsigned timeIdx) const;
250
251 bool vapparsActive(int episodeIdx) const;
252
254 { return numPressurePointsEquil_; }
255
256 bool operator==(const FlowGenericProblem& rhs) const;
257
258 template<class Serializer>
259 void serializeOp(Serializer& serializer)
260 {
261 serializer(maxOilSaturation_);
262 serializer(polymer_);
263 serializer(maxWaterSaturation_);
264 serializer(minRefPressure_);
265 serializer(overburdenPressure_);
266 serializer(solventSaturation_);
267 serializer(solventRsw_);
268 serializer(bioeffects_);
269 }
270
271protected:
272 void initFluidSystem_();
273
277 bool shouldWriteOutput() const
278 { return true; }
279
287 { return false; }
288
289 bool beginEpisode_(bool enableExperiments,
290 int episodeIdx);
291 void beginTimeStep_(bool enableExperiments,
292 int episodeIdx,
293 int timeStepIndex,
294 Scalar startTime,
295 Scalar time,
296 Scalar timeStepSize,
297 Scalar endTime);
298
299 void readRockParameters_(const std::vector<Scalar>& cellCenterDepths,
300 std::function<std::array<int,3>(const unsigned)> ijkIndex);
302
303 void readBlackoilExtentionsInitialConditions_(std::size_t numDof,
304 bool enableSolvent,
305 bool enablePolymer,
306 bool enablePolymerMolarWeight,
307 bool enableBioeffects,
308 bool enableMICP);
309
310 void updatePvtnum_();
311 void updateSatnum_();
312 void updateMiscnum_();
313 void updatePlmixnum_();
314
315 const EclipseState& eclState_;
316 const Schedule& schedule_;
317 const GridView& gridView_;
318
319 static inline std::string briefDescription_;
320 std::array<std::vector<Scalar>, 2> referencePorosity_;
321
322 std::vector<int> pvtnum_;
323 std::vector<unsigned short> satnum_;
324 std::vector<unsigned short> miscnum_;
325 std::vector<unsigned short> plmixnum_;
326
327 std::vector<RockParams> rockParams_;
328 std::vector<unsigned short> rockTableIdx_;
329 std::vector<TabulatedTwoDFunction> rockCompPoroMultWc_;
330 std::vector<TabulatedTwoDFunction> rockCompTransMultWc_;
331 std::vector<TabulatedFunction> rockCompPoroMult_;
332 std::vector<TabulatedFunction> rockCompTransMult_;
333 std::vector<Scalar> rockCompTransMultVal_;
334
336 std::vector<Scalar> maxOilSaturation_;
337 std::vector<Scalar> maxWaterSaturation_;
338 std::vector<Scalar> minRefPressure_;
339 std::vector<Scalar> overburdenPressure_;
340 std::vector<Scalar> solventSaturation_;
341 std::vector<Scalar> solventRsw_;
343
344 // time stepping parameters
348
349 // equilibration parameters
351
354
355 // To lookup origin cell indices
356 using Grid = std::remove_cv_t< typename std::remove_reference<decltype(gridView_.grid())>::type>;
359
360 // \brief Function to assign the origin cell index on level zero, for a cell on the leaf grid view.
361 //
362 // For CpGrid with local grid refinement, the field property of a cell on the leaf
363 // is inherited from its parent or equivalent (when has no parent) cell on level zero.
364 std::function<unsigned(unsigned)> lookupIdxOnLevelZeroAssigner_()
365 {
366 return [this](unsigned elemIdx) { return lookUpData_.template getFieldPropIdx<Grid>(elemIdx);};
367 }
368
369private:
370 template<class T>
371 void updateNum(const std::string& name, std::vector<T>& numbers, std::size_t num_regions);
372};
373
374} // namespace Opm
375
376#endif // OPM_FLOW_GENERIC_PROBLEM_HPP
This problem simulates an input file given in the data format used by the commercial ECLiPSE simulato...
Definition: FlowGenericProblem.hpp:61
void setPorosity(Scalar poro, unsigned elementIdx, unsigned timeIdx=0)
Sets the porosity of an element.
Definition: FlowGenericProblem.hpp:155
const EclipseState & eclState_
Definition: FlowGenericProblem.hpp:315
UniformXTabulated2DFunction< Scalar > TabulatedTwoDFunction
Definition: FlowGenericProblem.hpp:64
Scalar maxPolymerAdsorption(unsigned elemIdx) const
Returns the max polymer adsorption value.
Definition: FlowGenericProblem_impl.hpp:739
unsigned pvtRegionIndex(unsigned elemIdx) const
Returns the index the relevant PVT region given a cell index.
Definition: FlowGenericProblem_impl.hpp:698
Scalar oxygenConcentration(unsigned elemIdx) const
Returns the initial oxygen concentration for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:651
Scalar microbialConcentration(unsigned elemIdx) const
Returns the initial microbial concentration for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:639
PolymerSolutionContainer< Scalar > polymer_
Definition: FlowGenericProblem.hpp:335
std::vector< Scalar > rockCompTransMultVal_
Definition: FlowGenericProblem.hpp:333
std::function< unsigned(unsigned)> lookupIdxOnLevelZeroAssigner_()
Definition: FlowGenericProblem.hpp:364
static std::string briefDescription()
Returns a human readable description of the problem for the help message.
Definition: FlowGenericProblem_impl.hpp:129
Scalar solventRsw(unsigned elemIdx) const
Returns the initial solvent dissolved in water for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:602
std::vector< TabulatedTwoDFunction > rockCompPoroMultWc_
Definition: FlowGenericProblem.hpp:329
std::vector< unsigned short > miscnum_
Definition: FlowGenericProblem.hpp:324
Scalar overburdenPressure(unsigned elementIdx) const
Get the pressure of the overburden.
Definition: FlowGenericProblem_impl.hpp:580
void updateMiscnum_()
Definition: FlowGenericProblem_impl.hpp:390
Scalar porosity(unsigned globalSpaceIdx, unsigned timeIdx) const
Direct indexed access to the porosity.
Definition: FlowGenericProblem_impl.hpp:332
Scalar rockCompressibility(unsigned globalSpaceIdx) const
Definition: FlowGenericProblem_impl.hpp:317
Scalar initialTimeStepSize_
Definition: FlowGenericProblem.hpp:346
unsigned miscnumRegionIndex(unsigned elemIdx) const
Returns the index the relevant MISC region given a cell index.
Definition: FlowGenericProblem_impl.hpp:718
bool vapparsActive(int episodeIdx) const
Definition: FlowGenericProblem_impl.hpp:406
int numPressurePointsEquil() const
Definition: FlowGenericProblem.hpp:253
Scalar referencePorosity(unsigned elementIdx, unsigned timeIdx) const
Returns the porosity of an element.
Definition: FlowGenericProblem.hpp:137
std::vector< int > pvtnum_
Definition: FlowGenericProblem.hpp:322
unsigned satnumRegionIndex(unsigned elemIdx) const
Returns the index the relevant saturation function region given a cell index.
Definition: FlowGenericProblem_impl.hpp:708
Scalar rockFraction(unsigned elementIdx, unsigned timeIdx) const
Returns the rockFraction of an element.
Definition: FlowGenericProblem_impl.hpp:340
Scalar maxWaterSaturation(unsigned globalDofIdx) const
Returns an element's historic maximum water phase saturation that was observed during the simulation.
Definition: FlowGenericProblem_impl.hpp:558
std::vector< Scalar > solventSaturation_
Definition: FlowGenericProblem.hpp:340
void readRockCompactionParameters_()
Definition: FlowGenericProblem_impl.hpp:223
Tabulated1DFunction< Scalar > TabulatedFunction
Definition: FlowGenericProblem.hpp:65
void updateSatnum_()
Definition: FlowGenericProblem_impl.hpp:382
void updatePvtnum_()
Definition: FlowGenericProblem_impl.hpp:374
bool enableDriftCompensation_
Definition: FlowGenericProblem.hpp:352
static FlowGenericProblem serializationTestObject(const EclipseState &eclState, const Schedule &schedule, const GridView &gridView)
Definition: FlowGenericProblem_impl.hpp:94
void beginTimeStep_(bool enableExperiments, int episodeIdx, int timeStepIndex, Scalar startTime, Scalar time, Scalar timeStepSize, Scalar endTime)
Definition: FlowGenericProblem_impl.hpp:451
std::vector< TabulatedFunction > rockCompTransMult_
Definition: FlowGenericProblem.hpp:332
std::vector< unsigned short > plmixnum_
Definition: FlowGenericProblem.hpp:325
std::vector< TabulatedTwoDFunction > rockCompTransMultWc_
Definition: FlowGenericProblem.hpp:330
Scalar calciteVolumeFraction(unsigned elemIdx) const
Returns the initial calcite volume fraction for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:687
unsigned plmixnumRegionIndex(unsigned elemIdx) const
Returns the index the relevant PLMIXNUM (for polymer module) region given a cell index.
Definition: FlowGenericProblem_impl.hpp:728
FlowGenericProblem(const EclipseState &eclState, const Schedule &schedule, const GridView &gridView)
Definition: FlowGenericProblem_impl.hpp:60
BioeffectsSolutionContainer< Scalar > bioeffects_
Definition: FlowGenericProblem.hpp:342
bool enableTuning_
Definition: FlowGenericProblem.hpp:345
Scalar solventSaturation(unsigned elemIdx) const
Returns the initial solvent saturation for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:591
Scalar polymerMolecularWeight(const unsigned elemIdx) const
Returns the polymer molecule weight for a given cell index.
Definition: FlowGenericProblem_impl.hpp:627
std::vector< TabulatedFunction > rockCompPoroMult_
Definition: FlowGenericProblem.hpp:331
const GridView & gridView_
Definition: FlowGenericProblem.hpp:317
void readRockParameters_(const std::vector< Scalar > &cellCenterDepths, std::function< std::array< int, 3 >(const unsigned)> ijkIndex)
Definition: FlowGenericProblem_impl.hpp:136
std::vector< Scalar > maxOilSaturation_
Definition: FlowGenericProblem.hpp:336
std::vector< RockParams > rockParams_
Definition: FlowGenericProblem.hpp:327
std::array< std::vector< Scalar >, 2 > referencePorosity_
Definition: FlowGenericProblem.hpp:320
const Schedule & schedule_
Definition: FlowGenericProblem.hpp:316
std::vector< unsigned short > satnum_
Definition: FlowGenericProblem.hpp:323
void serializeOp(Serializer &serializer)
Definition: FlowGenericProblem.hpp:259
static std::string briefDescription_
Definition: FlowGenericProblem.hpp:319
const LookUpData lookUpData_
Definition: FlowGenericProblem.hpp:358
int numPressurePointsEquil_
Definition: FlowGenericProblem.hpp:350
Scalar minOilPressure(unsigned globalDofIdx) const
Returns an element's historic minimum pressure of the oil phase that was observed during the simulati...
Definition: FlowGenericProblem_impl.hpp:569
std::vector< Scalar > maxWaterSaturation_
Definition: FlowGenericProblem.hpp:337
void initFluidSystem_()
Definition: FlowGenericProblem_impl.hpp:475
bool operator==(const FlowGenericProblem &rhs) const
Definition: FlowGenericProblem_impl.hpp:750
Scalar maxTimeStepAfterWellEvent_
Definition: FlowGenericProblem.hpp:347
Scalar ureaConcentration(unsigned elemIdx) const
Returns the initial urea concentration for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:663
std::vector< Scalar > minRefPressure_
Definition: FlowGenericProblem.hpp:338
bool beginEpisode_(bool enableExperiments, int episodeIdx)
Definition: FlowGenericProblem_impl.hpp:414
bool shouldWriteOutput() const
Always returns true. The ecl output writer takes care of the rest.
Definition: FlowGenericProblem.hpp:277
static void setBriefDescription(const std::string &msg)
Specifies the string returned by briefDescription()
Definition: FlowGenericProblem.hpp:97
Scalar biofilmVolumeFraction(unsigned elemIdx) const
Returns the initial biofilm volume fraction for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:675
std::vector< Scalar > solventRsw_
Definition: FlowGenericProblem.hpp:341
static std::string helpPreamble(int, const char **argv)
Returns the string that is printed before the list of command line parameters in the help message.
Definition: FlowGenericProblem_impl.hpp:114
std::vector< Scalar > overburdenPressure_
Definition: FlowGenericProblem.hpp:339
void readBlackoilExtentionsInitialConditions_(std::size_t numDof, bool enableSolvent, bool enablePolymer, bool enablePolymerMolarWeight, bool enableBioeffects, bool enableMICP)
Definition: FlowGenericProblem_impl.hpp:482
bool shouldWriteRestartFile() const
Returns true if an eWoms restart file should be written to disk.
Definition: FlowGenericProblem.hpp:286
void updatePlmixnum_()
Definition: FlowGenericProblem_impl.hpp:398
std::vector< unsigned short > rockTableIdx_
Definition: FlowGenericProblem.hpp:328
bool explicitRockCompaction_
Definition: FlowGenericProblem.hpp:353
typename FluidSystem::Scalar Scalar
Definition: FlowGenericProblem.hpp:63
std::remove_cv_t< typename std::remove_reference< decltype(gridView_.grid())>::type > Grid
Definition: FlowGenericProblem.hpp:356
Scalar polymerConcentration(unsigned elemIdx) const
Returns the initial polymer concentration for a given a cell index.
Definition: FlowGenericProblem_impl.hpp:615
Definition: FlowGenericProblem.hpp:51
Definition: fvbaseprimaryvariables.hh:141
Definition: blackoilbioeffectsmodules.hh:43
Struct holding MICP extension data.
Definition: SolutionContainers.hpp:57
Definition: FlowGenericProblem.hpp:67
Scalar compressibility
Definition: FlowGenericProblem.hpp:69
Scalar referencePressure
Definition: FlowGenericProblem.hpp:68
Struct holding polymer extension data.
Definition: SolutionContainers.hpp:37