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
24 template <class Ostream, class Collection>
25 Ostream&
26 operator<<(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
37 namespace Opm{
38 template <class Vector>
39 class MaxNormStl {
40  public:
41  static double
42  norm(const Vector& v) {
43  return ImplicitTransportDefault::AccumulationNorm <Vector, ImplicitTransportDefault::MaxAbs>::norm(v);
44  }
45 };
46 
47 template <class Vector>
48 class MaxNormDune {
49 public:
50  static double
51  norm(const Vector& v) {
52  return v.infinity_norm();
53  }
54 };
55 
56 template <int np = 2>
58 public:
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 
74 private:
75  ::std::vector<double> press_ ;
76  ::std::vector<double> fpress_;
77  ::std::vector<double> flux_ ;
78  ::std::vector<double> sat_ ;
79 };
80 class Rock {
81 public:
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 
108 private:
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>
121 public:
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 
170 private:
172 };
173 
175 public:
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
182  solve(const ScalarBCRSMatrix& A,
183  const ScalarBlockVector& b,
184  ScalarBlockVector& x) {
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 
208 public:
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 
233 private:
234  std::unique_ptr<Opm::LinearSolverIstl> ls_;
235 };
236 
238 public:
239  TransportSource() : nsrc(0),pf(0) {}
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 };
250 template <class Arr>
251 void
252 append_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 }
262 void
263 compute_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
Dune::BCRSMatrix< ScalarMatrixBlockType > ScalarBCRSMatrix
Definition: ImplicitTransportDefs.hpp:180
int pf
Definition: ImplicitTransportDefs.hpp:242
Definition: ImplicitTransportDefs.hpp:120
void poro_homogeneous(double phi)
Definition: ImplicitTransportDefs.hpp:104
Definition: ImplicitTransportDefs.hpp:174
double densitySecondPhase() const
Density of second (oil) phase.
Definition: ReservoirPropertyCommon_impl.hpp:371
Definition: BlackoilFluid.hpp:31
double s_max(int c) const
Definition: ImplicitTransportDefs.hpp:165
Rock(::std::size_t nc,::std::size_t dim)
Definition: ImplicitTransportDefs.hpp:82
::std::vector< double > saturation
Definition: ImplicitTransportDefs.hpp:246
void mobility(int c, const Sat &s, Mob &mob, DMob &dmob) const
Definition: ImplicitTransportDefs.hpp:139
ReservoirState(const UnstructuredGrid *g)
Definition: ImplicitTransportDefs.hpp:59
::std::vector< double > & faceflux()
Definition: ImplicitTransportDefs.hpp:68
double s_min(int c) const
Definition: ReservoirPropertyCommon_impl.hpp:491
Definition: ImplicitTransportDefs.hpp:207
const ::std::vector< double > & perm() const
Definition: ImplicitTransportDefs.hpp:87
void perm_homogeneous(double k)
Definition: ImplicitTransportDefs.hpp:91
double capillaryPressure(int cell_index, double saturation) const
Capillary pressure.
Definition: ReservoirPropertyCommon_impl.hpp:465
Dune::FieldMatrix< double, 1, 1 > ScalarMatrixBlockType
Definition: ImplicitTransportDefs.hpp:177
int nsrc
Definition: ImplicitTransportDefs.hpp:241
::std::vector< double > & pressure()
Definition: ImplicitTransportDefs.hpp:66
::std::vector< double > & facepressure()
Definition: ImplicitTransportDefs.hpp:67
double densityFirstPhase() const
Density of first (water) phase.
Definition: ReservoirPropertyCommon_impl.hpp:364
double s_max(int c) const
Definition: ReservoirPropertyCommon_impl.hpp:504
::std::vector< double > periodic_faces
Definition: ImplicitTransportDefs.hpp:248
::std::vector< double > & saturation()
Definition: ImplicitTransportDefs.hpp:69
::std::vector< double > periodic_cells
Definition: ImplicitTransportDefs.hpp:247
void pc(int c, const Sat &s, PC &pc, DPC &dpc) const
Definition: ImplicitTransportDefs.hpp:149
double s_min(int c) const
Definition: ImplicitTransportDefs.hpp:162
LinearSolverISTLAMG()
Definition: ImplicitTransportDefs.hpp:209
std::basic_ostream< charT, traits > & operator<<(std::basic_ostream< charT, traits > &os, const BCBase< T > &bc)
Stream insertion for BCBase.
Definition: BoundaryConditions.hpp:110
::std::vector< double > flux
Definition: ImplicitTransportDefs.hpp:245
Dune::BlockVector< ScalarVectorBlockType > ScalarBlockVector
Definition: ImplicitTransportDefs.hpp:179
Definition: ImplicitTransportDefs.hpp:39
Definition: ImplicitTransportDefs.hpp:48
void append_transport_source(int c, double p, double v, const Arr &s, TransportSource &src)
Definition: ImplicitTransportDefs.hpp:252
const ::std::vector< double > & faceflux() const
Definition: ImplicitTransportDefs.hpp:71
const ::std::vector< double > & poro() const
Definition: ImplicitTransportDefs.hpp:88
Definition: ImplicitTransportDefs.hpp:237
void compute_porevolume(const UnstructuredGrid *g, const Rock &rock, std::vector< double > &porevol)
Definition: ImplicitTransportDefs.hpp:263
A property class for porous media rock.
Definition: ImplicitTransportDefs.hpp:80
TransportSource()
Definition: ImplicitTransportDefs.hpp:239
static double norm(const Vector &v)
Definition: ImplicitTransportDefs.hpp:51
Definition: ImplicitTransportDefs.hpp:57
::std::vector< int > cell
Definition: ImplicitTransportDefs.hpp:243
void phaseMobilitiesDeriv(int c, double s, Vector &dmob) const
Definition: ReservoirPropertyCapillary_impl.hpp:104
void phaseMobilities(int cell_index, double saturation, Vector &mobility) const
Mobilities for both phases.
Definition: ReservoirPropertyCapillary_impl.hpp:93
double density(int p) const
Definition: ImplicitTransportDefs.hpp:154
void solve(const ScalarBCRSMatrix &A, const ScalarBlockVector &b, ScalarBlockVector &x)
Definition: ImplicitTransportDefs.hpp:182
TwophaseFluidWrapper(const Opm::ReservoirPropertyCapillary< 3 > &r)
Definition: ImplicitTransportDefs.hpp:122
static double norm(const Vector &v)
Definition: ImplicitTransportDefs.hpp:42
const ::std::vector< double > & saturation() const
Definition: ImplicitTransportDefs.hpp:72
::std::vector< double > pressure
Definition: ImplicitTransportDefs.hpp:244
Dune::FieldVector< double, 1 > ScalarVectorBlockType
Definition: ImplicitTransportDefs.hpp:176
void solve(struct CSRMatrix *A, const double *b, double *x)
Definition: ImplicitTransportDefs.hpp:226
double capillaryPressureDeriv(int c, double s) const
Derivative of Capillary pressure.
Definition: ReservoirPropertyCommon_impl.hpp:478