From ce03532c150a5dc6bc787a2a244505f6ccac98ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Atgeirr=20Fl=C3=B8=20Rasmussen?= Date: Fri, 9 Mar 2012 11:45:18 +0100 Subject: [PATCH] Implemented capillary pressure derivatives. --- opm/core/fluid/SaturationPropsFromDeck.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/opm/core/fluid/SaturationPropsFromDeck.cpp b/opm/core/fluid/SaturationPropsFromDeck.cpp index 804298c3..e70cf937 100644 --- a/opm/core/fluid/SaturationPropsFromDeck.cpp +++ b/opm/core/fluid/SaturationPropsFromDeck.cpp @@ -296,9 +296,27 @@ namespace Opm } } - void SaturationPropsFromDeck::evalPcDeriv(const double* /*s*/, double* /*pc*/, double* /*dpcds*/) const + void SaturationPropsFromDeck::evalPcDeriv(const double* s, double* pc, double* dpcds) const { - THROW("Evaluation of capillary pressure derivatives not yet implemented."); + // The problem of determining three-phase capillary pressures + // is very hard experimentally, usually one extends two-phase + // data (as for relative permeability). + // In our approach the derivative matrix is quite sparse, only + // the diagonal elements corresponding to non-oil phases are + // (potentially) nonzero. + const int np = phase_usage_.num_phases; + std::fill(dpcds, dpcds + np*np, 0.0); + pc[phase_usage_.phase_pos[Liquid]] = 0.0; + if (phase_usage_.phase_used[Aqua]) { + int pos = phase_usage_.phase_pos[Aqua]; + pc[pos] = pcow_(s[pos]); + dpcds[np*pos + pos] = pcow_.derivative(s[pos]); + } + if (phase_usage_.phase_used[Vapour]) { + int pos = phase_usage_.phase_pos[Vapour]; + pc[pos] = pcog_(s[pos]); + dpcds[np*pos + pos] = pcog_.derivative(s[pos]); + } }