BlackoilFluid.hpp
Go to the documentation of this file.
1 /*
2  Copyright 2010 SINTEF ICT, Applied Mathematics.
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 3 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 
20 #ifndef OPM_BLACKOILFLUID_HEADER_INCLUDED
21 #define OPM_BLACKOILFLUID_HEADER_INCLUDED
22 
23 
27 #include <dune/common/fvector.hh>
28 #include <vector>
29 
30 
31 namespace Opm
32 {
33 
34 
36  class BlackoilFluidData;
37 
38 
41  class BlackoilFluid : public BlackoilDefs
42  {
43  public:
45  typedef BlackoilFluidData FluidData;
46 
47  void init(Opm::DeckConstPtr deck)
48  {
49  fmi_params_.init(deck);
50  // FluidSystemBlackoil<>::init(parser);
51  pvt_.init(deck);
52  Opm::DeckRecordConstPtr densityRecord = deck->getKeyword("DENSITY")->getRecord(0);
53  surface_densities_[Oil] = densityRecord->getItem("OIL")->getSIDouble(0);
54  surface_densities_[Water] = densityRecord->getItem("WATER")->getSIDouble(0);
55  surface_densities_[Gas] = densityRecord->getItem("GAS")->getSIDouble(0);
56  }
57 
58  FluidState computeState(PhaseVec phase_pressure, CompVec z) const
59  {
60  FluidState state;
61  state.temperature_ = 300;
62  state.phase_pressure_ = phase_pressure;
63  state.surface_volume_ = z;
64  // FluidSystemBlackoil<>::computeEquilibrium(state); // Sets everything but relperm and mobility.
65  computeEquilibrium(state);
68  for (int phase = 0; phase < numPhases; ++phase) {
69  state.mobility_[phase] = state.relperm_[phase]/state.viscosity_[phase];
70  for (int p2 = 0; p2 < numPhases; ++p2) {
71  // Ignoring pressure variation in viscosity for this one.
72  state.dmobility_[phase][p2] = state.drelperm_[phase][p2]/state.viscosity_[phase];
73  }
74  }
75  return state;
76  }
77 
78 
79  const CompVec& surfaceDensities() const
80  {
81  return surface_densities_;
82  }
83 
85  PhaseVec phaseDensities(const double* A) const
86  {
87  PhaseVec phase_dens(0.0);
88  for (int phase = 0; phase < numPhases; ++phase) {
89  for (int comp = 0; comp < numComponents; ++comp) {
90  phase_dens[phase] += A[numComponents*phase + comp]*surface_densities_[comp];
91  }
92  }
93  return phase_dens;
94  }
95 
96 
97  // ---- New interface ----
98 
101  template <class States>
102  void computeBAndR(States& states) const
103  {
104  const std::vector<PhaseVec>& p = states.phase_pressure;
105  const std::vector<CompVec>& z = states.surface_volume_density;
106  std::vector<PhaseVec>& B = states.formation_volume_factor;
107  std::vector<PhaseVec>& R = states.solution_factor;
108  pvt_.B(p, z, B);
109  pvt_.R(p, z, R);
110  }
111 
114  template <class States>
115  void computePvtNoDerivs(States& states) const
116  {
117  computeBAndR(states);
118  const std::vector<PhaseVec>& p = states.phase_pressure;
119  const std::vector<CompVec>& z = states.surface_volume_density;
120  std::vector<PhaseVec>& mu = states.viscosity;
121  pvt_.getViscosity(p, z, mu);
122  }
123 
126  template <class States>
127  void computePvt(States& states) const
128  {
129  const std::vector<PhaseVec>& p = states.phase_pressure;
130  const std::vector<CompVec>& z = states.surface_volume_density;
131  std::vector<PhaseVec>& B = states.formation_volume_factor;
132  std::vector<PhaseVec>& dB = states.formation_volume_factor_deriv;
133  std::vector<PhaseVec>& R = states.solution_factor;
134  std::vector<PhaseVec>& dR = states.solution_factor_deriv;
135  std::vector<PhaseVec>& mu = states.viscosity;
136  pvt_.dBdp(p, z, B, dB);
137  pvt_.dRdp(p, z, R, dR);
138  pvt_.getViscosity(p, z, mu);
139  }
140 
143  template <class States>
144  void computeStateMatrix(States& states) const
145  {
146  int num = states.formation_volume_factor.size();
147  states.state_matrix.resize(num);
148 #pragma omp parallel for
149  for (int i = 0; i < num; ++i) {
150  const PhaseVec& B = states.formation_volume_factor[i];
151  const PhaseVec& R = states.solution_factor[i];
152  PhaseToCompMatrix& At = states.state_matrix[i];
153  // Set the A matrix (A = RB^{-1})
154  // Using A transposed (At) since we really want Fortran ordering:
155  // ultimately that is what the opmpressure C library expects.
156  At = 0.0;
157  At[Aqua][Water] = 1.0/B[Aqua];
158  At[Vapour][Gas] = 1.0/B[Vapour];
159  At[Liquid][Gas] = R[Liquid]/B[Liquid];
160  At[Vapour][Oil] = R[Vapour]/B[Vapour];
161  At[Liquid][Oil] = 1.0/B[Liquid];
162  }
163  }
164 
165 
168  template <class States>
169  void computePvtDepending(States& states) const
170  {
171  int num = states.formation_volume_factor.size();
172  states.state_matrix.resize(num);
173  states.phase_volume_density.resize(num);
174  states.total_phase_volume_density.resize(num);
175  states.saturation.resize(num);
176  states.phase_compressibility.resize(num);
177  states.total_compressibility.resize(num);
178  states.experimental_term.resize(num);
179 #pragma omp parallel for
180  for (int i = 0; i < num; ++i) {
181  const CompVec& z = states.surface_volume_density[i];
182  const PhaseVec& B = states.formation_volume_factor[i];
183  const PhaseVec& dB = states.formation_volume_factor_deriv[i];
184  const PhaseVec& R = states.solution_factor[i];
185  const PhaseVec& dR = states.solution_factor_deriv[i];
186  PhaseToCompMatrix& At = states.state_matrix[i];
187  PhaseVec& u = states.phase_volume_density[i];
188  double& tot_phase_vol_dens = states.total_phase_volume_density[i];
189  PhaseVec& s = states.saturation[i];
190  PhaseVec& cp = states.phase_compressibility[i];
191  double& tot_comp = states.total_compressibility[i];
192  double& exp_term = states.experimental_term[i];
193  computeSingleEquilibrium(B, dB, R, dR, z,
194  At, u, tot_phase_vol_dens,
195  s, cp, tot_comp, exp_term);
196  }
197  }
198 
201  template <class States>
202  void computeMobilitiesNoDerivs(States& states) const
203  {
204  int num = states.saturation.size();
205  states.relperm.resize(num);
206  states.mobility.resize(num);
207 #pragma omp parallel for
208  for (int i = 0; i < num; ++i) {
209  const CompVec& s = states.saturation[i];
210  const PhaseVec& mu = states.viscosity[i];
211  PhaseVec& kr = states.relperm[i];
212  PhaseVec& lambda = states.mobility[i];
213  FluidMatrixInteractionBlackoil<double>::kr(kr, fmi_params_, s, 300.0);
214  for (int phase = 0; phase < numPhases; ++phase) {
215  lambda[phase] = kr[phase]/mu[phase];
216  }
217 
218  }
219  }
220 
223  template <class States>
224  void computeMobilities(States& states) const
225  {
226  int num = states.saturation.size();
227  states.relperm.resize(num);
228  states.relperm_deriv.resize(num);
229  states.mobility.resize(num);
230  states.mobility_deriv.resize(num);
231 #pragma omp parallel for
232  for (int i = 0; i < num; ++i) {
233  const CompVec& s = states.saturation[i];
234  const PhaseVec& mu = states.viscosity[i];
235  PhaseVec& kr = states.relperm[i];
236  PhaseJacobian& dkr = states.relperm_deriv[i];
237  PhaseVec& lambda = states.mobility[i];
238  PhaseJacobian& dlambda = states.mobility_deriv[i];
239  FluidMatrixInteractionBlackoil<double>::kr(kr, fmi_params_, s, 300.0);
240  FluidMatrixInteractionBlackoil<double>::dkr(dkr, fmi_params_, s, 300.0);
241  for (int phase = 0; phase < numPhases; ++phase) {
242  lambda[phase] = kr[phase]/mu[phase];
243  for (int p2 = 0; p2 < numPhases; ++p2) {
244  // Ignoring pressure variation in viscosity for this one.
245  dlambda[phase][p2] = dkr[phase][p2]/mu[phase];
246  }
247  }
248 
249  }
250  }
251 
252 
253  private:
254  BlackoilPVT pvt_;
256  CompVec surface_densities_;
257 
258 
264  template <class FluidState>
265  void computeEquilibrium(FluidState& fluid_state) const
266  {
267  // Get B and R factors.
268  const PhaseVec& p = fluid_state.phase_pressure_;
269  const CompVec& z = fluid_state.surface_volume_;
270  PhaseVec& B = fluid_state.formation_volume_factor_;
271  B[Aqua] = pvt_.B(p[Aqua], z, Aqua);
272  B[Vapour] = pvt_.B(p[Vapour], z, Vapour);
273  B[Liquid] = pvt_.B(p[Liquid], z, Liquid);
274  PhaseVec& R = fluid_state.solution_factor_;
275  R[Aqua] = 0.0;
276  R[Vapour] = pvt_.R(p[Vapour], z, Vapour);
277  R[Liquid] = pvt_.R(p[Liquid], z, Liquid);
278  PhaseVec dB;
279  dB[Aqua] = pvt_.dBdp(p[Aqua], z, Aqua);
280  dB[Vapour] = pvt_.dBdp(p[Vapour], z, Vapour);
281  dB[Liquid] = pvt_.dBdp(p[Liquid], z, Liquid);
282  PhaseVec dR;
283  dR[Aqua] = 0.0;
284  dR[Vapour] = pvt_.dRdp(p[Vapour], z, Vapour);
285  dR[Liquid] = pvt_.dRdp(p[Liquid], z, Liquid);
286 
287  // Convenience vars.
288  PhaseToCompMatrix& At = fluid_state.phase_to_comp_;
289  PhaseVec& u = fluid_state.phase_volume_density_;
290  double& tot_phase_vol_dens = fluid_state.total_phase_volume_density_;
291  PhaseVec& s = fluid_state.saturation_;
292  PhaseVec& cp = fluid_state.phase_compressibility_;
293  double& tot_comp = fluid_state.total_compressibility_;
294  double& exp_term = fluid_state.experimental_term_;
295 
296  computeSingleEquilibrium(B, dB, R, dR, z,
297  At, u, tot_phase_vol_dens,
298  s, cp, tot_comp, exp_term);
299 
300  // Compute viscosities.
301  PhaseVec& mu = fluid_state.viscosity_;
302  mu[Aqua] = pvt_.getViscosity(p[Aqua], z, Aqua);
303  mu[Vapour] = pvt_.getViscosity(p[Vapour], z, Vapour);
304  mu[Liquid] = pvt_.getViscosity(p[Liquid], z, Liquid);
305  }
306 
307 
308 
309  static void computeSingleEquilibrium(const PhaseVec& B,
310  const PhaseVec& dB,
311  const PhaseVec& R,
312  const PhaseVec& dR,
313  const CompVec& z,
314  PhaseToCompMatrix& At,
315  PhaseVec& u,
316  double& tot_phase_vol_dens,
317  PhaseVec& s,
318  PhaseVec& cp,
319  double& tot_comp,
320  double& exp_term)
321  {
322  // Set the A matrix (A = RB^{-1})
323  // Using At since we really want Fortran ordering
324  // (since ultimately that is what the opmpressure
325  // C library expects).
326  // PhaseToCompMatrix& At = fluid_state.phase_to_comp_[i];
327  At = 0.0;
328  At[Aqua][Water] = 1.0/B[Aqua];
329  At[Vapour][Gas] = 1.0/B[Vapour];
330  At[Liquid][Gas] = R[Liquid]/B[Liquid];
331  At[Vapour][Oil] = R[Vapour]/B[Vapour];
332  At[Liquid][Oil] = 1.0/B[Liquid];
333 
334  // Update phase volumes. This is the same as multiplying with A^{-1}
335  // PhaseVec& u = fluid_state.phase_volume_density_[i];
336  double detR = 1.0 - R[Vapour]*R[Liquid];
337  u[Aqua] = B[Aqua]*z[Water];
338  u[Vapour] = B[Vapour]*(z[Gas] - R[Liquid]*z[Oil])/detR;
339  u[Liquid] = B[Liquid]*(z[Oil] - R[Vapour]*z[Gas])/detR;
340  tot_phase_vol_dens = u[Aqua] + u[Vapour] + u[Liquid];
341 
342  // PhaseVec& s = fluid_state.saturation_[i];
343  for (int phase = 0; phase < numPhases; ++phase) {
344  s[phase] = u[phase]/tot_phase_vol_dens;
345  }
346 
347  // Phase compressibilities.
348  // PhaseVec& cp = fluid_state.phase_compressibility_[i];
349  // Set the derivative of the A matrix (A = RB^{-1})
350  PhaseToCompMatrix dAt(0.0);
351  dAt[Aqua][Water] = -dB[Aqua]/(B[Aqua]*B[Aqua]);
352  dAt[Vapour][Gas] = -dB[Vapour]/(B[Vapour]*B[Vapour]);
353  dAt[Liquid][Oil] = -dB[Liquid]/(B[Liquid]*B[Liquid]); // Different order than above.
354  dAt[Liquid][Gas] = dAt[Liquid][Oil]*R[Liquid] + dR[Liquid]/B[Liquid];
355  dAt[Vapour][Oil] = dAt[Vapour][Gas]*R[Vapour] + dR[Vapour]/B[Vapour];
356 
357  PhaseToCompMatrix Ait;
358  Dune::FMatrixHelp::invertMatrix(At, Ait);
359 
360  PhaseToCompMatrix Ct;
361  Dune::FMatrixHelp::multMatrix(dAt, Ait, Ct);
362 
363  cp[Aqua] = Ct[Aqua][Water];
364  cp[Liquid] = Ct[Liquid][Oil] + Ct[Liquid][Gas];
365  cp[Vapour] = Ct[Vapour][Gas] + Ct[Vapour][Oil];
366  tot_comp = cp*s;
367 
368  // Experimental term.
369  PhaseVec tmp1, tmp2, tmp3;
370  Ait.mtv(z, tmp1);
371  dAt.mtv(tmp1, tmp2);
372  Ait.mtv(tmp2, tmp3);
373  exp_term = tmp3[Aqua] + tmp3[Liquid] + tmp3[Gas];
374  }
375 
376 
377  };
378 
379 
380 
381  struct FaceFluidData : public BlackoilDefs
382  {
383  // Canonical state variables.
384  std::vector<CompVec> surface_volume_density; // z
385  std::vector<PhaseVec> phase_pressure; // p
386 
387  // Variables from PVT functions.
388  std::vector<PhaseVec> formation_volume_factor; // B
389  std::vector<PhaseVec> solution_factor; // R
390 
391  // Variables computed from PVT data.
392  // The A matrices are all in Fortran order (or, equivalently,
393  // we store the transposes).
394  std::vector<PhaseToCompMatrix> state_matrix; // A' = (RB^{-1})'
395 
396  // Variables computed from saturation.
397  std::vector<PhaseVec> mobility; // lambda
398  std::vector<PhaseJacobian> mobility_deriv; // dlambda/ds
399 
400  // Gravity and/or capillary pressure potential differences.
401  std::vector<PhaseVec> gravity_potential; // (\rho g \delta z)-ish contribution per face
402  };
403 
404 
405  struct AllFluidData : public BlackoilDefs
406  {
407  // Per-cell data
409  std::vector<double> voldiscr;
410  std::vector<double> relvoldiscr;
411 
412  // Per-face data.
414 
415  public:
416  template <class Grid, class Rock>
417  void computeNew(const Grid& grid,
418  const Rock& rock,
419  const BlackoilFluid& fluid,
420  const typename Grid::Vector gravity,
421  const std::vector<PhaseVec>& cell_pressure,
422  const std::vector<PhaseVec>& face_pressure,
423  const std::vector<CompVec>& cell_z,
424  const CompVec& bdy_z,
425  const double dt)
426  {
427  int num_cells = cell_z.size();
428  assert(num_cells == grid.numCells());
429  const int np = numPhases;
430  const int nc = numComponents;
431  static_assert(np == nc, "");
432  static_assert(np == 3, "");
433 
434  // p, z -> B, dB, R, dR, mu, A, dA, u, sum(u), s, c, cT, ex, kr, dkr, lambda, dlambda.
435  cell_data.phase_pressure = cell_pressure;
436  cell_data.surface_volume_density = cell_z;
437  fluid.computePvt(cell_data);
438  fluid.computePvtDepending(cell_data);
439  fluid.computeMobilities(cell_data);
440 
441  // Compute volume discrepancies.
442  voldiscr.resize(num_cells);
443  relvoldiscr.resize(num_cells);
444 #pragma omp parallel for
445  for (int cell = 0; cell < num_cells; ++cell) {
446  double pv = rock.porosity(cell)*grid.cellVolume(cell);
447  voldiscr[cell] = (cell_data.total_phase_volume_density[cell] - 1.0)*pv/dt;
448  relvoldiscr[cell] = std::fabs(cell_data.total_phase_volume_density[cell] - 1.0);
449  }
450 
451 
452  // Compute upwinded face properties, including z.
453  computeUpwindProperties(grid, fluid, gravity,
454  cell_pressure, face_pressure,
455  cell_z, bdy_z);
456 
457  // Compute state matrices for faces.
458  // p, z -> B, R, A
459  face_data.phase_pressure = face_pressure;
460  fluid.computeBAndR(face_data);
461  fluid.computeStateMatrix(face_data);
462  }
463 
464 
465  template <class Grid>
466  void computeUpwindProperties(const Grid& grid,
467  const BlackoilFluid& fluid,
468  const typename Grid::Vector gravity,
469  const std::vector<PhaseVec>& cell_pressure,
470  const std::vector<PhaseVec>& face_pressure,
471  const std::vector<CompVec>& cell_z,
472  const CompVec& bdy_z)
473  {
474  int num_faces = face_pressure.size();
475  assert(num_faces == grid.numFaces());
476  bool nonzero_gravity = gravity.two_norm() > 0.0;
477  face_data.state_matrix.resize(num_faces);
478  face_data.mobility.resize(num_faces);
479  face_data.mobility_deriv.resize(num_faces);
480  face_data.gravity_potential.resize(num_faces);
481  face_data.surface_volume_density.resize(num_faces);
482 #pragma omp parallel for
483  for (int face = 0; face < num_faces; ++face) {
484  // Obtain properties from both sides of the face.
485  typedef typename Grid::Vector Vec;
486  Vec fc = grid.faceCentroid(face);
487  int c[2] = { grid.faceCell(face, 0), grid.faceCell(face, 1) };
488 
489  // Get pressures and compute gravity contributions,
490  // to decide upwind directions.
491  PhaseVec phase_p[2];
492  PhaseVec gravcontrib[2];
493  for (int j = 0; j < 2; ++j) {
494  if (c[j] >= 0) {
495  // Pressures
496  phase_p[j] = cell_pressure[c[j]];
497  // Gravity contribution.
498  if (nonzero_gravity) {
499  Vec cdiff = fc;
500  cdiff -= grid.cellCentroid(c[j]);
501  gravcontrib[j] = fluid.phaseDensities(&cell_data.state_matrix[c[j]][0][0]);
502  gravcontrib[j] *= (cdiff*gravity);
503  } else {
504  gravcontrib[j] = 0.0;
505  }
506  } else {
507  // Pressures
508  phase_p[j] = face_pressure[face];
509  // Gravity contribution.
510  gravcontrib[j] = 0.0;
511  }
512  }
513 
514  // Gravity contribution:
515  // gravcapf = rho_1*g*(z_12 - z_1) - rho_2*g*(z_12 - z_2)
516  // where _1 and _2 refers to two neigbour cells, z is the
517  // z coordinate of the centroid, and z_12 is the face centroid.
518  // Also compute the potentials.
519  PhaseVec pot[2];
520  for (int phase = 0; phase < numPhases; ++phase) {
521  face_data.gravity_potential[face][phase] = gravcontrib[0][phase] - gravcontrib[1][phase];
522  pot[0][phase] = phase_p[0][phase] + face_data.gravity_potential[face][phase];
523  pot[1][phase] = phase_p[1][phase];
524  }
525 
526  // Now we can easily find the upwind direction for every phase,
527  // we can also tell which boundary faces are inflow bdys.
528 
529  // Compute face_z, which is averaged from the cells, unless on outflow or noflow bdy.
530  // Get mobilities and derivatives.
531  CompVec face_z(0.0);
532  double face_z_factor = 0.5;
533  PhaseVec phase_mob[2];
534  PhaseJacobian phasemob_deriv[2];
535  for (int j = 0; j < 2; ++j) {
536  if (c[j] >= 0) {
537  face_z += cell_z[c[j]];
538  phase_mob[j] = cell_data.mobility[c[j]];
539  phasemob_deriv[j] = cell_data.mobility_deriv[c[j]];
540  } else if (pot[j][Liquid] > pot[(j+1)%2][Liquid]) {
541  // Inflow boundary.
542  face_z += bdy_z;
543  FluidStateBlackoil bdy_state = fluid.computeState(face_pressure[face], bdy_z);
544  phase_mob[j] = bdy_state.mobility_;
545  phasemob_deriv[j] = bdy_state.dmobility_;
546  } else {
547  // For outflow or noflow boundaries, only cell z is used.
548  face_z_factor = 1.0;
549  // Also, make sure the boundary data are not used for mobilities.
550  pot[j] = -1e100;
551  }
552  }
553  face_z *= face_z_factor;
554  face_data.surface_volume_density[face] = face_z;
555 
556  // Computing upwind mobilities and derivatives
557  for (int phase = 0; phase < numPhases; ++phase) {
558  if (pot[0][phase] == pot[1][phase]) {
559  // Average.
560  double aver = 0.5*(phase_mob[0][phase] + phase_mob[1][phase]);
561  face_data.mobility[face][phase] = aver;
562  for (int p2 = 0; p2 < numPhases; ++p2) {
563  face_data.mobility_deriv[face][phase][p2] = phasemob_deriv[0][phase][p2]
564  + phasemob_deriv[1][phase][p2];
565  }
566  } else {
567  // Upwind.
568  int upwind = pot[0][phase] > pot[1][phase] ? 0 : 1;
569  face_data.mobility[face][phase] = phase_mob[upwind][phase];
570  for (int p2 = 0; p2 < numPhases; ++p2) {
571  face_data.mobility_deriv[face][phase][p2] = phasemob_deriv[upwind][phase][p2];
572  }
573  }
574  }
575  }
576  }
577 
578 
579  };
580 
581 
582 } // namespace Opm
583 
584 #endif // OPM_BLACKOILFLUID_HEADER_INCLUDED
std::vector< PhaseVec > mobility
Definition: FluidStateBlackoil.hpp:84
PhaseVec mobility_
Definition: FluidStateBlackoil.hpp:49
Multiple fluid states for a black oil model.
Definition: FluidStateBlackoil.hpp:57
Definition: BlackoilFluid.hpp:31
const CompVec & surfaceDensities() const
Definition: BlackoilFluid.hpp:79
Dune::FieldVector< Scalar, numComponents > CompVec
Definition: BlackoilDefs.hpp:40
double getViscosity(double press, const CompVec &surfvol, PhaseIndex phase) const
void computePvtDepending(States &states) const
Definition: BlackoilFluid.hpp:169
void computeBAndR(States &states) const
Definition: BlackoilFluid.hpp:102
std::vector< PhaseVec > gravity_potential
Definition: BlackoilFluid.hpp:401
Scalar temperature_
Definition: FluidStateBlackoil.hpp:34
std::vector< PhaseVec > solution_factor
Definition: BlackoilFluid.hpp:389
std::vector< PhaseJacobian > mobility_deriv
Definition: BlackoilFluid.hpp:398
std::vector< PhaseVec > phase_pressure
Definition: FluidStateBlackoil.hpp:61
Definition: BlackoilDefs.hpp:33
void init(Opm::DeckConstPtr deck)
Definition: FluidMatrixInteractionBlackoil.hpp:44
Definition: BlackoilDefs.hpp:34
Definition: BlackoilDefs.hpp:36
std::vector< PhaseVec > mobility
Definition: BlackoilFluid.hpp:397
std::vector< double > relvoldiscr
Definition: BlackoilFluid.hpp:410
PhaseVec phase_pressure_
Definition: FluidStateBlackoil.hpp:36
Dune::FieldVector< Scalar, numPhases > PhaseVec
Definition: BlackoilDefs.hpp:41
void computeStateMatrix(States &states) const
Definition: BlackoilFluid.hpp:144
void computePvtNoDerivs(States &states) const
Definition: BlackoilFluid.hpp:115
FluidState computeState(PhaseVec phase_pressure, CompVec z) const
Definition: BlackoilFluid.hpp:58
FaceFluidData face_data
Definition: BlackoilFluid.hpp:413
PhaseVec phaseDensities(const double *A) const
Definition: BlackoilFluid.hpp:85
std::vector< CompVec > surface_volume_density
Definition: BlackoilFluid.hpp:384
double dRdp(double press, const CompVec &surfvol, PhaseIndex phase) const
std::vector< PhaseVec > formation_volume_factor
Definition: BlackoilFluid.hpp:388
static void kr(krContainerT &kr, const Params &params, const SatContainerT &saturations, Scalar)
The relative permeability of all phases.
Definition: FluidMatrixInteractionBlackoil.hpp:150
std::vector< PhaseVec > phase_pressure
Definition: BlackoilFluid.hpp:385
void init(Opm::DeckConstPtr deck)
Definition: BlackoilFluid.hpp:47
void computeUpwindProperties(const Grid &grid, const BlackoilFluid &fluid, const typename Grid::Vector gravity, const std::vector< PhaseVec > &cell_pressure, const std::vector< PhaseVec > &face_pressure, const std::vector< CompVec > &cell_z, const CompVec &bdy_z)
Definition: BlackoilFluid.hpp:466
Definition: BlackoilDefs.hpp:37
Definition: BlackoilFluid.hpp:41
double B(double press, const CompVec &surfvol, PhaseIndex phase) const
Definition: BlackoilDefs.hpp:36
std::vector< double > voldiscr
Definition: BlackoilFluid.hpp:409
AllFluidStates cell_data
Definition: BlackoilFluid.hpp:408
PhaseVec relperm_
Definition: FluidStateBlackoil.hpp:47
Definition: BlackoilFluid.hpp:405
PhaseJacobian dmobility_
Definition: FluidStateBlackoil.hpp:50
double dBdp(double press, const CompVec &surfvol, PhaseIndex phase) const
PhaseVec saturation_
Definition: FluidStateBlackoil.hpp:42
double porosity(int cell_index) const
Read-access to porosity.
Definition: Rock_impl.hpp:76
Definition: BlackoilFluid.hpp:381
std::vector< PhaseJacobian > mobility_deriv
Definition: FluidStateBlackoil.hpp:85
double R(double press, const CompVec &surfvol, PhaseIndex phase) const
Definition: BlackoilDefs.hpp:30
BlackoilFluidData FluidData
Definition: BlackoilFluid.hpp:45
void computeMobilitiesNoDerivs(States &states) const
Definition: BlackoilFluid.hpp:202
void computePvt(States &states) const
Definition: BlackoilFluid.hpp:127
PhaseVec viscosity_
Definition: FluidStateBlackoil.hpp:46
A property class for porous media rock.
Definition: ImplicitTransportDefs.hpp:80
static void dkr(krContainerT &dkr, const Params &params, const SatContainerT &saturations, Scalar)
The saturation derivatives of relative permeability of all phases.
Definition: FluidMatrixInteractionBlackoil.hpp:176
Definition: BlackoilDefs.hpp:37
std::vector< PhaseToCompMatrix > state_matrix
Definition: FluidStateBlackoil.hpp:73
void computeMobilities(States &states) const
Definition: BlackoilFluid.hpp:224
Definition: BlackoilDefs.hpp:36
void init(Opm::DeckConstPtr deck)
std::vector< PhaseToCompMatrix > state_matrix
Definition: BlackoilFluid.hpp:394
void computeNew(const Grid &grid, const Rock &rock, const BlackoilFluid &fluid, const typename Grid::Vector gravity, const std::vector< PhaseVec > &cell_pressure, const std::vector< PhaseVec > &face_pressure, const std::vector< CompVec > &cell_z, const CompVec &bdy_z, const double dt)
Definition: BlackoilFluid.hpp:417
Definition: BlackoilDefs.hpp:37
std::vector< Scalar > total_phase_volume_density
Definition: FluidStateBlackoil.hpp:75
CompVec surface_volume_
Definition: FluidStateBlackoil.hpp:35
std::vector< CompVec > surface_volume_density
Definition: FluidStateBlackoil.hpp:60
FluidStateBlackoil FluidState
Definition: BlackoilFluid.hpp:44
PhaseJacobian drelperm_
Definition: FluidStateBlackoil.hpp:48
Fluid state for a black oil model.
Definition: FluidStateBlackoil.hpp:32
Definition: BlackoilPVT.hpp:33