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
31namespace Opm
32{
33
34
36 class BlackoilFluidData;
37
38
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 const auto& 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
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,
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
358 Dune::FMatrixHelp::invertMatrix(At, Ait);
359
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
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
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;
437 fluid.computePvt(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);
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
Definition: BlackoilDefs.hpp:31
Dune::FieldVector< Scalar, numComponents > CompVec
Definition: BlackoilDefs.hpp:40
Dune::FieldVector< Scalar, numPhases > PhaseVec
Definition: BlackoilDefs.hpp:41
Dune::FieldMatrix< Scalar, numComponents, numPhases > PhaseToCompMatrix
Definition: BlackoilDefs.hpp:43
@ Aqua
Definition: BlackoilDefs.hpp:37
@ Vapour
Definition: BlackoilDefs.hpp:37
@ Liquid
Definition: BlackoilDefs.hpp:37
@ numComponents
Definition: BlackoilDefs.hpp:33
Dune::FieldMatrix< Scalar, numPhases, numPhases > PhaseJacobian
Definition: BlackoilDefs.hpp:44
@ numPhases
Definition: BlackoilDefs.hpp:34
@ Gas
Definition: BlackoilDefs.hpp:36
@ Oil
Definition: BlackoilDefs.hpp:36
@ Water
Definition: BlackoilDefs.hpp:36
Definition: BlackoilFluid.hpp:42
void computePvtNoDerivs(States &states) const
Definition: BlackoilFluid.hpp:115
void init(Opm::DeckConstPtr deck)
Definition: BlackoilFluid.hpp:47
void computeBAndR(States &states) const
Definition: BlackoilFluid.hpp:102
const CompVec & surfaceDensities() const
Definition: BlackoilFluid.hpp:79
PhaseVec phaseDensities(const double *A) const
Definition: BlackoilFluid.hpp:85
void computePvt(States &states) const
Definition: BlackoilFluid.hpp:127
void computeMobilities(States &states) const
Definition: BlackoilFluid.hpp:224
void computePvtDepending(States &states) const
Definition: BlackoilFluid.hpp:169
FluidState computeState(PhaseVec phase_pressure, CompVec z) const
Definition: BlackoilFluid.hpp:58
BlackoilFluidData FluidData
Definition: BlackoilFluid.hpp:45
void computeStateMatrix(States &states) const
Definition: BlackoilFluid.hpp:144
FluidStateBlackoil FluidState
Definition: BlackoilFluid.hpp:44
void computeMobilitiesNoDerivs(States &states) const
Definition: BlackoilFluid.hpp:202
Definition: BlackoilPVT.hpp:34
double getViscosity(double press, const CompVec &surfvol, PhaseIndex phase) const
double R(double press, const CompVec &surfvol, PhaseIndex phase) const
void init(Opm::DeckConstPtr deck)
double B(double press, const CompVec &surfvol, PhaseIndex phase) const
double dBdp(double press, const CompVec &surfvol, PhaseIndex phase) const
double dRdp(double press, const CompVec &surfvol, PhaseIndex phase) const
void init(Opm::DeckConstPtr deck)
Definition: FluidMatrixInteractionBlackoil.hpp:47
static void kr(krContainerT &kr, const Params &params, const SatContainerT &saturations, Scalar)
The relative permeability of all phases.
Definition: FluidMatrixInteractionBlackoil.hpp:153
static void dkr(krContainerT &dkr, const Params &params, const SatContainerT &saturations, Scalar)
The saturation derivatives of relative permeability of all phases.
Definition: FluidMatrixInteractionBlackoil.hpp:179
A property class for porous media rock.
Definition: ImplicitTransportDefs.hpp:80
double porosity(int cell_index) const
Read-access to porosity.
Definition: Rock_impl.hpp:76
Definition: BlackoilFluid.hpp:32
Definition: BlackoilFluid.hpp:406
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
FaceFluidData face_data
Definition: BlackoilFluid.hpp:413
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
std::vector< double > voldiscr
Definition: BlackoilFluid.hpp:409
AllFluidStates cell_data
Definition: BlackoilFluid.hpp:408
std::vector< double > relvoldiscr
Definition: BlackoilFluid.hpp:410
Multiple fluid states for a black oil model.
Definition: FluidStateBlackoil.hpp:58
std::vector< PhaseJacobian > mobility_deriv
Definition: FluidStateBlackoil.hpp:85
std::vector< PhaseVec > phase_pressure
Definition: FluidStateBlackoil.hpp:61
std::vector< Scalar > total_phase_volume_density
Definition: FluidStateBlackoil.hpp:75
std::vector< PhaseToCompMatrix > state_matrix
Definition: FluidStateBlackoil.hpp:73
std::vector< PhaseVec > mobility
Definition: FluidStateBlackoil.hpp:84
std::vector< CompVec > surface_volume_density
Definition: FluidStateBlackoil.hpp:60
Definition: BlackoilFluid.hpp:382
std::vector< PhaseVec > gravity_potential
Definition: BlackoilFluid.hpp:401
std::vector< PhaseVec > solution_factor
Definition: BlackoilFluid.hpp:389
std::vector< PhaseVec > formation_volume_factor
Definition: BlackoilFluid.hpp:388
std::vector< PhaseVec > phase_pressure
Definition: BlackoilFluid.hpp:385
std::vector< PhaseVec > mobility
Definition: BlackoilFluid.hpp:397
std::vector< CompVec > surface_volume_density
Definition: BlackoilFluid.hpp:384
std::vector< PhaseJacobian > mobility_deriv
Definition: BlackoilFluid.hpp:398
std::vector< PhaseToCompMatrix > state_matrix
Definition: BlackoilFluid.hpp:394
Fluid state for a black oil model.
Definition: FluidStateBlackoil.hpp:33
CompVec surface_volume_
Definition: FluidStateBlackoil.hpp:35
PhaseVec mobility_
Definition: FluidStateBlackoil.hpp:49
PhaseVec saturation_
Definition: FluidStateBlackoil.hpp:42
PhaseVec phase_pressure_
Definition: FluidStateBlackoil.hpp:36
Scalar temperature_
Definition: FluidStateBlackoil.hpp:34
PhaseJacobian dmobility_
Definition: FluidStateBlackoil.hpp:50
PhaseJacobian drelperm_
Definition: FluidStateBlackoil.hpp:48
PhaseVec viscosity_
Definition: FluidStateBlackoil.hpp:46
PhaseVec relperm_
Definition: FluidStateBlackoil.hpp:47