ImplicitTransportDefs.hpp
Go to the documentation of this file.
1
2#ifndef OPENRS_IMPLICITTRANSPORTDEFS_HEADER
3#define OPENRS_IMPLICITTRANSPORTDEFS_HEADER
4
6#include <opm/core/linalg/LinearSolverIstl.hpp>
7#include <dune/istl/operators.hh>
8#include <dune/istl/solvers.hh>
9#include <dune/istl/bvector.hh>
10#include <dune/istl/bcrsmatrix.hh>
11#include <dune/istl/preconditioners.hh>
12#include <dune/common/fvector.hh>
13#include <dune/common/fmatrix.hh>
14#include <opm/core/utility/parameters/ParameterGroup.hpp>
15#include <dune/grid/common/GridAdapter.hpp>
16#include <opm/core/linalg/sparse_sys.h>
17#include <opm/core/pressure/tpfa/ifs_tpfa.h>
18#include <opm/core/pressure/tpfa/trans_tpfa.h>
19#include <opm/core/transport/implicit/NormSupport.hpp>
20#include <opm/core/transport/implicit/ImplicitTransport.hpp>
21#include <memory>
22
23#if 0
24template <class Ostream, class Collection>
25Ostream&
26operator<<(Ostream& os, const Collection& c)
27{
28 typedef typename Collection::value_type VT;
29
30 os << "[ ";
31 std::copy(c.begin(), c.end(), ::std::ostream_iterator<VT>(os, " "));
32 os << "]";
33
34 return os;
35}
36#endif
37namespace Opm{
38template <class Vector>
40 public:
41 static double
42 norm(const Vector& v) {
43 return ImplicitTransportDefault::AccumulationNorm <Vector, ImplicitTransportDefault::MaxAbs>::norm(v);
44 }
45};
46
47template <class Vector>
49public:
50 static double
51 norm(const Vector& v) {
52 return v.infinity_norm();
53 }
54};
55
56template <int np = 2>
58public:
59 ReservoirState(const UnstructuredGrid* g)
60 : press_ (g->number_of_cells),
61 fpress_(g->number_of_faces),
62 flux_ (g->number_of_faces),
63 sat_ (np * g->number_of_cells)
64 {}
65
66 ::std::vector<double>& pressure () { return press_ ; }
67 ::std::vector<double>& facepressure() { return fpress_; }
68 ::std::vector<double>& faceflux () { return flux_ ; }
69 ::std::vector<double>& saturation () { return sat_ ; }
70
71 const ::std::vector<double>& faceflux () const { return flux_; }
72 const ::std::vector<double>& saturation () const { return sat_ ; }
73
74private:
75 ::std::vector<double> press_ ;
76 ::std::vector<double> fpress_;
77 ::std::vector<double> flux_ ;
78 ::std::vector<double> sat_ ;
79};
80class Rock {
81public:
82 Rock(::std::size_t nc, ::std::size_t dim)
83 : dim_ (dim ),
84 perm_(nc * dim * dim),
85 poro_(nc ) {}
86
87 const ::std::vector<double>& perm() const { return perm_; }
88 const ::std::vector<double>& poro() const { return poro_; }
89
90 void
91 perm_homogeneous(double k) {
92 setVector(0.0, perm_);
93
94 const ::std::size_t d2 = dim_ * dim_;
95
96 for (::std::size_t c = 0, nc = poro_.size(); c < nc; ++c) {
97 for (::std::size_t i = 0; i < dim_; ++i) {
98 perm_[c*d2 + i*(dim_ + 1)] = k;
99 }
100 }
101 }
102
103 void
104 poro_homogeneous(double phi) {
105 setVector(phi, poro_);
106 }
107
108private:
109 void
110 setVector(double x, ::std::vector<double>& v) {
111 ::std::fill(v.begin(), v.end(), x);
112 }
113
114 ::std::size_t dim_ ;
115 ::std::vector<double> perm_;
116 ::std::vector<double> poro_;
117};
118
119//template <class P>
121public:
123 : r_(r)
124 {}
125 //TwophaseFluidWrapper(){}
126 //TwophaseFluidWrapper(TwophaseFluidWrapper){}
127
128 /*
129 void init(const Opm::ReservoirPropertyCapillary<3>& r)
130 {
131 r_ = r;
132 }
133 */
134
135 template <class Sat ,
136 class Mob ,
137 class DMob>
138 void
139 mobility(int c, const Sat& s, Mob& mob, DMob& dmob) const {
140 const double s1 = s[0];
141
142 r_.phaseMobilities (c, s1, mob );
143 r_.phaseMobilitiesDeriv(c, s1, dmob);
144 }
145 template <class Sat ,
146 class PC ,
147 class DPC>
148 void
149 pc(int c, const Sat& s, PC& pc, DPC& dpc) const {
150 const double s1 = s[0];
151 pc = r_.capillaryPressure(c, s1);
152 dpc= r_.capillaryPressureDeriv(c, s1);
153 }
154 double density(int p) const {
155 if (p == 0) {
156 return r_.densityFirstPhase();
157 } else {
158 return r_.densitySecondPhase();
159 }
160 }
161
162 double s_min(int c) const {
163 return r_.s_min(c);
164 }
165 double s_max(int c) const {
166 return r_.s_max(c);
167 }
168
169
170private:
172};
173
175public:
176 typedef Dune::FieldVector<double, 1> ScalarVectorBlockType;
177 typedef Dune::FieldMatrix<double, 1, 1> ScalarMatrixBlockType;
178
179 typedef Dune::BlockVector<ScalarVectorBlockType> ScalarBlockVector;
180 typedef Dune::BCRSMatrix <ScalarMatrixBlockType> ScalarBCRSMatrix;
181 void
183 const ScalarBlockVector& b,
185
186 Dune::MatrixAdapter<ScalarBCRSMatrix,
188 ScalarBlockVector> opA(A);
189
190 Dune::SeqILU0<ScalarBCRSMatrix,
192 ScalarBlockVector> precond(A, 1.0);
193
194 int maxit = A.N();
195 double tol = 5.0e-7;
196 int verb = 0;
197
198 Dune::BiCGSTABSolver<ScalarBlockVector>
199 solver(opA, precond, tol, maxit, verb);
200
201 ScalarBlockVector bcpy(b);
202 Dune::InverseOperatorResult res;
203 solver.apply(x, bcpy, res);
204 }
205};
206
208public:
210 {
211 Opm::parameter::ParameterGroup params;
212
213 params.insertParameter("linsolver_tolerance",
214 boost::lexical_cast<std::string>(5.0e-9));
215
216 params.insertParameter("linsoler_verbosity",
217 boost::lexical_cast<std::string>(1));
218
219 params.insertParameter("linsolver_type",
220 boost::lexical_cast<std::string>(1));
221
222 ls_.reset(new LinearSolverIstl(params));
223 }
224
225 void
226 solve(struct CSRMatrix* A,
227 const double* b,
228 double* x)
229 {
230 ls_->solve(A->m, A->nnz, A->ia, A->ja, A->sa, b, x);
231 }
232
233private:
234 std::unique_ptr<Opm::LinearSolverIstl> ls_;
235};
236
238public:
240
241 int nsrc ;
242 int pf ;
243 ::std::vector< int > cell ;
244 ::std::vector<double> pressure ;
245 ::std::vector<double> flux ;
246 ::std::vector<double> saturation;
247 ::std::vector<double> periodic_cells;
248 ::std::vector<double> periodic_faces;
249};
250template <class Arr>
251void
252append_transport_source(int c, double p, double v, const Arr& s,
253 TransportSource& src)
254{
255 src.cell .push_back(c);
256 src.pressure .push_back(p);
257 src.flux .push_back(v);
258 src.saturation.insert(src.saturation.end(),
259 s.begin(), s.end());
260 ++src.nsrc;
261}
262void
263compute_porevolume(const UnstructuredGrid* g,
264 const Rock& rock,
265 std::vector<double>& porevol)
266{
267 const ::std::vector<double>& poro = rock.poro();
268
269 assert (poro.size() == (::std::size_t)(g->number_of_cells));
270
271 porevol.resize(rock.poro().size());
272
273 ::std::transform(poro.begin(), poro.end(),
274 g->cell_volumes,
275 porevol.begin(),
276 ::std::multiplies<double>());
277}
278}
279#endif // /OPENRS_IMPLICITTRANSPORTDEFS_HEADER
Definition: ImplicitTransportDefs.hpp:174
Dune::BCRSMatrix< ScalarMatrixBlockType > ScalarBCRSMatrix
Definition: ImplicitTransportDefs.hpp:180
void solve(const ScalarBCRSMatrix &A, const ScalarBlockVector &b, ScalarBlockVector &x)
Definition: ImplicitTransportDefs.hpp:182
Dune::FieldMatrix< double, 1, 1 > ScalarMatrixBlockType
Definition: ImplicitTransportDefs.hpp:177
Dune::FieldVector< double, 1 > ScalarVectorBlockType
Definition: ImplicitTransportDefs.hpp:176
Dune::BlockVector< ScalarVectorBlockType > ScalarBlockVector
Definition: ImplicitTransportDefs.hpp:179
Definition: ImplicitTransportDefs.hpp:207
LinearSolverISTLAMG()
Definition: ImplicitTransportDefs.hpp:209
void solve(struct CSRMatrix *A, const double *b, double *x)
Definition: ImplicitTransportDefs.hpp:226
Definition: ImplicitTransportDefs.hpp:48
static double norm(const Vector &v)
Definition: ImplicitTransportDefs.hpp:51
Definition: ImplicitTransportDefs.hpp:39
static double norm(const Vector &v)
Definition: ImplicitTransportDefs.hpp:42
void phaseMobilities(int cell_index, double saturation, Vector &mobility) const
Mobilities for both phases.
Definition: ReservoirPropertyCapillary_impl.hpp:93
void phaseMobilitiesDeriv(int c, double s, Vector &dmob) const
Definition: ReservoirPropertyCapillary_impl.hpp:104
double densitySecondPhase() const
Density of second (oil) phase.
Definition: ReservoirPropertyCommon_impl.hpp:372
double densityFirstPhase() const
Density of first (water) phase.
Definition: ReservoirPropertyCommon_impl.hpp:365
double capillaryPressure(int cell_index, double saturation) const
Capillary pressure.
Definition: ReservoirPropertyCommon_impl.hpp:466
double capillaryPressureDeriv(int c, double s) const
Derivative of Capillary pressure.
Definition: ReservoirPropertyCommon_impl.hpp:479
double s_min(int c) const
Definition: ReservoirPropertyCommon_impl.hpp:492
double s_max(int c) const
Definition: ReservoirPropertyCommon_impl.hpp:505
Definition: ImplicitTransportDefs.hpp:57
ReservoirState(const UnstructuredGrid *g)
Definition: ImplicitTransportDefs.hpp:59
::std::vector< double > & pressure()
Definition: ImplicitTransportDefs.hpp:66
::std::vector< double > & faceflux()
Definition: ImplicitTransportDefs.hpp:68
::std::vector< double > & saturation()
Definition: ImplicitTransportDefs.hpp:69
const ::std::vector< double > & saturation() const
Definition: ImplicitTransportDefs.hpp:72
const ::std::vector< double > & faceflux() const
Definition: ImplicitTransportDefs.hpp:71
::std::vector< double > & facepressure()
Definition: ImplicitTransportDefs.hpp:67
A property class for porous media rock.
Definition: ImplicitTransportDefs.hpp:80
void poro_homogeneous(double phi)
Definition: ImplicitTransportDefs.hpp:104
void perm_homogeneous(double k)
Definition: ImplicitTransportDefs.hpp:91
Rock(::std::size_t nc, ::std::size_t dim)
Definition: ImplicitTransportDefs.hpp:82
const ::std::vector< double > & poro() const
Definition: ImplicitTransportDefs.hpp:88
const ::std::vector< double > & perm() const
Definition: ImplicitTransportDefs.hpp:87
Definition: ImplicitTransportDefs.hpp:237
::std::vector< double > periodic_faces
Definition: ImplicitTransportDefs.hpp:248
int pf
Definition: ImplicitTransportDefs.hpp:242
::std::vector< double > saturation
Definition: ImplicitTransportDefs.hpp:246
::std::vector< int > cell
Definition: ImplicitTransportDefs.hpp:243
TransportSource()
Definition: ImplicitTransportDefs.hpp:239
::std::vector< double > periodic_cells
Definition: ImplicitTransportDefs.hpp:247
int nsrc
Definition: ImplicitTransportDefs.hpp:241
::std::vector< double > flux
Definition: ImplicitTransportDefs.hpp:245
::std::vector< double > pressure
Definition: ImplicitTransportDefs.hpp:244
Definition: ImplicitTransportDefs.hpp:120
double s_max(int c) const
Definition: ImplicitTransportDefs.hpp:165
TwophaseFluidWrapper(const Opm::ReservoirPropertyCapillary< 3 > &r)
Definition: ImplicitTransportDefs.hpp:122
double s_min(int c) const
Definition: ImplicitTransportDefs.hpp:162
double density(int p) const
Definition: ImplicitTransportDefs.hpp:154
void pc(int c, const Sat &s, PC &pc, DPC &dpc) const
Definition: ImplicitTransportDefs.hpp:149
void mobility(int c, const Sat &s, Mob &mob, DMob &dmob) const
Definition: ImplicitTransportDefs.hpp:139
Definition: BlackoilFluid.hpp:32
void compute_porevolume(const UnstructuredGrid *g, const Rock &rock, std::vector< double > &porevol)
Definition: ImplicitTransportDefs.hpp:263
std::basic_ostream< charT, traits > & operator<<(std::basic_ostream< charT, traits > &os, const BCBase< T > &bc)
Stream insertion for BCBase.
Definition: BoundaryConditions.hpp:110
void append_transport_source(int c, double p, double v, const Arr &s, TransportSource &src)
Definition: ImplicitTransportDefs.hpp:252