opm-common
EclMultiplexerMaterial.hpp
Go to the documentation of this file.
1 // -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 // vi: set et ts=4 sw=4 sts=4:
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 2 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  Consult the COPYING file in the top-level source directory of this
20  module for the precise wording of the license and the list of
21  copyright holders.
22 */
27 #ifndef OPM_ECL_MULTIPLEXER_MATERIAL_HPP
28 #define OPM_ECL_MULTIPLEXER_MATERIAL_HPP
29 
31 #include "EclDefaultMaterial.hpp"
32 #include "EclStone1Material.hpp"
33 #include "EclStone2Material.hpp"
34 #include "EclTwoPhaseMaterial.hpp"
35 
36 #include <opm/common/TimingMacros.hpp>
37 #include <opm/common/ErrorMacros.hpp>
38 
39 #include <opm/common/utility/gpuDecorators.hpp>
40 
41 #include <algorithm>
42 #include <stdexcept>
43 
44 namespace Opm {
45 #if OPM_IS_INSIDE_DEVICE_FUNCTION
46 #define OPM_ECL_MULTIPLEXER_MATERIAL_CALL(codeToCall, onePhaseCode) \
47  { \
48  constexpr EclMultiplexerApproach approach = EclMultiplexerApproach::Default; \
49  auto& realParams = params.template getRealParams<approach>(); \
50  using ActualLaw = DefaultMaterial; \
51  codeToCall; \
52  }
53 #else
54 #define OPM_ECL_MULTIPLEXER_MATERIAL_CALL(codeToCall, onePhaseCode) \
55  switch (params.approach()) { \
56  case EclMultiplexerApproach::Stone1: { \
57  [[maybe_unused]] constexpr EclMultiplexerApproach approach = EclMultiplexerApproach::Stone1; \
58  auto& realParams = params.template getRealParams<approach>(); \
59  using ActualLaw = Stone1Material; \
60  codeToCall; \
61  break; \
62  } \
63  case EclMultiplexerApproach::Stone2: { \
64  [[maybe_unused]] constexpr EclMultiplexerApproach approach = EclMultiplexerApproach::Stone2; \
65  auto& realParams = params.template getRealParams<approach>(); \
66  using ActualLaw = Stone2Material; \
67  codeToCall; \
68  break; \
69  } \
70  case EclMultiplexerApproach::Default: { \
71  [[maybe_unused]] constexpr EclMultiplexerApproach approach = EclMultiplexerApproach::Default; \
72  auto& realParams = params.template getRealParams<approach>(); \
73  using ActualLaw = DefaultMaterial; \
74  codeToCall; \
75  break; \
76  } \
77  case EclMultiplexerApproach::TwoPhase: { \
78  [[maybe_unused]] constexpr EclMultiplexerApproach approach = EclMultiplexerApproach::TwoPhase; \
79  auto& realParams = params.template getRealParams<approach>(); \
80  using ActualLaw = TwoPhaseMaterial; \
81  codeToCall; \
82  break; \
83  } \
84  case EclMultiplexerApproach::OnePhase: { \
85  [[maybe_unused]] constexpr EclMultiplexerApproach approach = EclMultiplexerApproach::OnePhase; \
86  onePhaseCode; \
87  break; \
88  } \
89  }
90 #endif
91 
92 // The static_assert does not compile with gcc 12 and earlier (or nvcc) when placed in the multiplexer below.
93 #if (defined(__GNUC__) && (__GNUC__ < 13)) || defined(__CUDACC__)
94  #define STATIC_ASSERT_ECL_MULTIPLEXER_UNLESS_GCC_LT_13 throw std::logic_error("Unhandled EclMultiplexerApproach")
95 #else
96  #define STATIC_ASSERT_ECL_MULTIPLEXER_UNLESS_GCC_LT_13 static_assert(false, "Unhandled EclMultiplexerApproach")
97 #endif
98 
99 #if OPM_IS_INSIDE_DEVICE_FUNCTION
100 #define OPM_ECL_MULTIPLEXER_MATERIAL_CALL_COMPILETIME(codeToCall, onePhaseCode) \
101  if constexpr (Head::approach == EclMultiplexerApproach::Default) { \
102  constexpr EclMultiplexerApproach approach = EclMultiplexerApproach::Default; \
103  auto& realParams = params.template getRealParams<approach>(); \
104  using ActualLaw = DefaultMaterial; \
105  codeToCall; \
106  }
107 
108 #else
109 #define OPM_ECL_MULTIPLEXER_MATERIAL_CALL_COMPILETIME(codeToCall, onePhaseCode) \
110  if constexpr (Head::approach == EclMultiplexerApproach::Stone1) { \
111  [[maybe_unused]] constexpr EclMultiplexerApproach approach = EclMultiplexerApproach::Stone1; \
112  auto& realParams = params.template getRealParams<approach>(); \
113  using ActualLaw = Stone1Material; \
114  codeToCall; \
115  } else if constexpr (Head::approach == EclMultiplexerApproach::Stone2) { \
116  [[maybe_unused]] constexpr EclMultiplexerApproach approach = EclMultiplexerApproach::Stone2; \
117  auto& realParams = params.template getRealParams<approach>(); \
118  using ActualLaw = Stone2Material; \
119  codeToCall; \
120  } else if constexpr (Head::approach == EclMultiplexerApproach::Default) { \
121  [[maybe_unused]] constexpr EclMultiplexerApproach approach = EclMultiplexerApproach::Default; \
122  auto& realParams = params.template getRealParams<approach>(); \
123  using ActualLaw = DefaultMaterial; \
124  codeToCall; \
125  } else if constexpr (Head::approach == EclMultiplexerApproach::TwoPhase) { \
126  [[maybe_unused]] constexpr EclMultiplexerApproach approach = EclMultiplexerApproach::TwoPhase; \
127  auto& realParams = params.template getRealParams<approach>(); \
128  using ActualLaw = TwoPhaseMaterial; \
129  codeToCall; \
130  } else if constexpr (Head::approach == EclMultiplexerApproach::OnePhase) { \
131  [[maybe_unused]] constexpr EclMultiplexerApproach approach = EclMultiplexerApproach::OnePhase; \
132  onePhaseCode; \
133  } else { \
134  STATIC_ASSERT_ECL_MULTIPLEXER_UNLESS_GCC_LT_13; \
135  }
136 #endif
137 // Pass this for the onePhaseCode argument if nothing is to be done.
138 inline void doNothing() { };
139 
146 template <class TraitsT,
147  class GasOilMaterialLawT,
148  class OilWaterMaterialLawT,
149  class GasWaterMaterialLawT,
150  class ParamsT = EclMultiplexerMaterialParams<TraitsT,
151  GasOilMaterialLawT,
152  OilWaterMaterialLawT,
153  GasWaterMaterialLawT> >
154 class EclMultiplexerMaterial : public TraitsT
155 {
156 public:
157  using GasOilMaterialLaw = GasOilMaterialLawT;
158  using OilWaterMaterialLaw = OilWaterMaterialLawT;
159  using GasWaterMaterialLaw = GasWaterMaterialLawT;
160 
165 
166  // some safety checks
167  static_assert(TraitsT::numPhases == 3,
168  "The number of phases considered by this capillary pressure "
169  "law is always three!");
170  static_assert(GasOilMaterialLaw::numPhases == 2,
171  "The number of phases considered by the gas-oil capillary "
172  "pressure law must be two!");
173  static_assert(OilWaterMaterialLaw::numPhases == 2,
174  "The number of phases considered by the oil-water capillary "
175  "pressure law must be two!");
176  static_assert(GasWaterMaterialLaw::numPhases == 2,
177  "The number of phases considered by the gas-water capillary "
178  "pressure law must be two!");
179  static_assert(std::is_same<typename GasOilMaterialLaw::Scalar,
180  typename OilWaterMaterialLaw::Scalar>::value,
181  "The two two-phase capillary pressure laws must use the same "
182  "type of floating point values.");
183 
184  using Traits = TraitsT;
185  using Params = ParamsT;
186  using Scalar = typename Traits::Scalar;
187 
188  static constexpr int numPhases = 3;
189  static constexpr int waterPhaseIdx = Traits::wettingPhaseIdx;
190  static constexpr int oilPhaseIdx = Traits::nonWettingPhaseIdx;
191  static constexpr int gasPhaseIdx = Traits::gasPhaseIdx;
192 
195  static constexpr bool implementsTwoPhaseApi = false;
196 
199  static constexpr bool implementsTwoPhaseSatApi = false;
200 
203  static constexpr bool isSaturationDependent = true;
204 
207  static constexpr bool isPressureDependent = false;
208 
211  static constexpr bool isTemperatureDependent = false;
212 
215  static constexpr bool isCompositionDependent = false;
216 
231  template <class ContainerT, class FluidState, class ...Args>
232  OPM_HOST_DEVICE static void capillaryPressures(ContainerT& values,
233  const Params& params,
234  const FluidState& fluidState)
235  {
236  OPM_TIMEFUNCTION_LOCAL(Subsystem::SatProps);
237  if constexpr (FrontIsEclMultiplexerDispatchV<Args...>) {
238  capillaryPressuresT<ContainerT, FluidState, Args...>(values, params, fluidState);
239  return;
240  }
241  OPM_ECL_MULTIPLEXER_MATERIAL_CALL(ActualLaw::capillaryPressures(values, realParams, fluidState),
242  values[0] = 0.0);
243  }
244 
245 
246  template <class ContainerT, class FluidState, class Head, class ...Args>
247  static void capillaryPressuresT(ContainerT& values,
248  const Params& params,
249  const FluidState& fluidState)
250  {
251 #define OPM_LOCAL_TEMPLATE_ARGS ContainerT, FluidState, Args...
252  OPM_ECL_MULTIPLEXER_MATERIAL_CALL_COMPILETIME(
253  ActualLaw::template capillaryPressures<OPM_LOCAL_TEMPLATE_ARGS>(values, realParams, fluidState),
254  values[0] = 0.0
255  );
256 #undef OPM_LOCAL_TEMPLATE_ARGS
257  }
258 
259  /*
260  * Hysteresis parameters for oil-water
261  * @see EclHysteresisTwoPhaseLawParams::soMax(...)
262  * @see EclHysteresisTwoPhaseLawParams::swMax(...)
263  * @see EclHysteresisTwoPhaseLawParams::swMin(...)
264  * \param params Parameters
265  */
266  static void oilWaterHysteresisParams(Scalar& soMax,
267  Scalar& swMax,
268  Scalar& swMin,
269  const Params& params)
270  {
271  OPM_TIMEFUNCTION_LOCAL(Subsystem::SatProps);
272  OPM_ECL_MULTIPLEXER_MATERIAL_CALL(ActualLaw::oilWaterHysteresisParams(soMax, swMax, swMin, realParams),
273  doNothing());
274  }
275 
276  /*
277  * Hysteresis parameters for oil-water
278  * @see EclHysteresisTwoPhaseLawParams::soMax(...)
279  * @see EclHysteresisTwoPhaseLawParams::swMax(...)
280  * @see EclHysteresisTwoPhaseLawParams::swMin(...)
281  * \param params Parameters
282  */
283  static void setOilWaterHysteresisParams(const Scalar& soMax,
284  const Scalar& swMax,
285  const Scalar& swMin,
286  Params& params)
287  {
288  OPM_TIMEFUNCTION_LOCAL(Subsystem::SatProps);
289  OPM_ECL_MULTIPLEXER_MATERIAL_CALL(ActualLaw::setOilWaterHysteresisParams(soMax, swMax, swMin, realParams),
290  doNothing());
291  }
292 
293  /*
294  * Hysteresis parameters for gas-oil
295  * @see EclHysteresisTwoPhaseLawParams::sgmax(...)
296  * @see EclHysteresisTwoPhaseLawParams::shmax(...)
297  * @see EclHysteresisTwoPhaseLawParams::somin(...)
298  * \param params Parameters
299  */
300  static void gasOilHysteresisParams(Scalar& sgmax,
301  Scalar& shmax,
302  Scalar& somin,
303  const Params& params)
304  {
305  OPM_TIMEFUNCTION_LOCAL(Subsystem::SatProps);
306  OPM_ECL_MULTIPLEXER_MATERIAL_CALL(ActualLaw::gasOilHysteresisParams(sgmax, shmax, somin, realParams),
307  doNothing());
308  }
309 
310  static Scalar trappedGasSaturation(const Params& params, bool maximumTrapping)
311  {
312  OPM_TIMEFUNCTION_LOCAL(Subsystem::SatProps);
313  OPM_ECL_MULTIPLEXER_MATERIAL_CALL(return ActualLaw::trappedGasSaturation(realParams, maximumTrapping),
314  return 0.0);
315  return 0.0;
316  }
317 
318  static Scalar strandedGasSaturation(const Params& params, Scalar Sg, Scalar Kg)
319  {
320  OPM_TIMEFUNCTION_LOCAL(Subsystem::SatProps);
321  OPM_ECL_MULTIPLEXER_MATERIAL_CALL(return ActualLaw::strandedGasSaturation(realParams, Sg, Kg),
322  return 0.0);
323  return 0.0;
324  }
325 
326  static Scalar trappedOilSaturation(const Params& params, bool maximumTrapping)
327  {
328  OPM_TIMEFUNCTION_LOCAL(Subsystem::SatProps);
329  OPM_ECL_MULTIPLEXER_MATERIAL_CALL(return ActualLaw::trappedOilSaturation(realParams, maximumTrapping),
330  return 0.0);
331  return 0.0;
332  }
333 
334  static Scalar trappedWaterSaturation(const Params& params)
335  {
336  OPM_TIMEFUNCTION_LOCAL(Subsystem::SatProps);
337  OPM_ECL_MULTIPLEXER_MATERIAL_CALL(return ActualLaw::trappedWaterSaturation(realParams),
338  return 0.0);
339  return 0.0;
340  }
341  /*
342  * Hysteresis parameters for gas-oil
343  * @see EclHysteresisTwoPhaseLawParams::sgmax(...)
344  * @see EclHysteresisTwoPhaseLawParams::shmax(...)
345  * @see EclHysteresisTwoPhaseLawParams::somin(...)
346  * \param params Parameters
347  */
348  static void setGasOilHysteresisParams(const Scalar& sgmax,
349  const Scalar& shmax,
350  const Scalar& somin,
351  Params& params)
352  {
353  OPM_TIMEFUNCTION_LOCAL(Subsystem::SatProps);
354  OPM_ECL_MULTIPLEXER_MATERIAL_CALL(ActualLaw::setGasOilHysteresisParams(sgmax, shmax, somin, realParams),
355  doNothing());
356  }
357 
367  template <class FluidState, class Evaluation = typename FluidState::ValueType>
368  static Evaluation pcgn(const Params& /* params */,
369  const FluidState& /* fs */)
370  {
371  throw std::logic_error("Not implemented: pcgn()");
372  }
373 
383  template <class FluidState, class Evaluation = typename FluidState::ValueType>
384  static Evaluation pcnw(const Params& /* params */,
385  const FluidState& /* fs */)
386  {
387  throw std::logic_error("Not implemented: pcnw()");
388  }
389 
393  template <class ContainerT, class FluidState>
394  static void saturations(ContainerT& /* values */,
395  const Params& /* params */,
396  const FluidState& /* fs */)
397  {
398  throw std::logic_error("Not implemented: saturations()");
399  }
400 
404  template <class FluidState, class Evaluation = typename FluidState::ValueType>
405  static Evaluation Sg(const Params& /* params */,
406  const FluidState& /* fluidState */)
407  {
408  throw std::logic_error("Not implemented: Sg()");
409  }
410 
414  template <class FluidState, class Evaluation = typename FluidState::ValueType>
415  static Evaluation Sn(const Params& /* params */,
416  const FluidState& /* fluidState */)
417  {
418  throw std::logic_error("Not implemented: Sn()");
419  }
420 
424  template <class FluidState, class Evaluation = typename FluidState::ValueType>
425  static Evaluation Sw(const Params& /* params */,
426  const FluidState& /* fluidState */)
427  {
428  throw std::logic_error("Not implemented: Sw()");
429  }
430 
446  template <class ContainerT, class FluidState, class ...Args>
447  OPM_HOST_DEVICE static void relativePermeabilities(ContainerT& values,
448  const Params& params,
449  const FluidState& fluidState)
450  {
451  OPM_TIMEFUNCTION_LOCAL(Subsystem::SatProps);
452  if constexpr (FrontIsEclMultiplexerDispatchV<Args...>) {
453  relativePermeabilitiesT<ContainerT, FluidState, Args...>(values, params, fluidState);
454  return;
455  }
456  OPM_ECL_MULTIPLEXER_MATERIAL_CALL(ActualLaw::relativePermeabilities(values, realParams, fluidState),
457  values[0] = 1.0);
458  }
459 
460  template <class ContainerT, class FluidState, class Head, class ...Args>
461  static void relativePermeabilitiesT(ContainerT& values,
462  const Params& params,
463  const FluidState& fluidState)
464  {
465 #define OPM_LOCAL_TEMPLATE_ARGS ContainerT, FluidState, Args...
466  OPM_ECL_MULTIPLEXER_MATERIAL_CALL_COMPILETIME(
467  ActualLaw::template relativePermeabilities<OPM_LOCAL_TEMPLATE_ARGS>(values, realParams, fluidState),
468  values[0] = 1.0
469  );
470 #undef OPM_LOCAL_TEMPLATE_ARGS
471  }
472 
473 
474 
475 
479  template <class Evaluation, class FluidState>
480  static Evaluation relpermOilInOilGasSystem(const Params& params,
481  const FluidState& fluidState)
482  {
483  OPM_TIMEFUNCTION_LOCAL(Subsystem::SatProps);
484  switch (params.approach()) {
485  case EclMultiplexerApproach::Stone1:
486  return Stone1Material::template relpermOilInOilGasSystem<Evaluation>
487  (params.template getRealParams<EclMultiplexerApproach::Stone1>(),
488  fluidState);
489 
490  case EclMultiplexerApproach::Stone2:
491  return Stone2Material::template relpermOilInOilGasSystem<Evaluation>
492  (params.template getRealParams<EclMultiplexerApproach::Stone2>(),
493  fluidState);
494 
495  case EclMultiplexerApproach::Default:
496  return DefaultMaterial::template relpermOilInOilGasSystem<Evaluation>
497  (params.template getRealParams<EclMultiplexerApproach::Default>(),
498  fluidState);
499 
500  default:
501  throw std::logic_error {
502  "relpermOilInOilGasSystem() is specific to three phases"
503  };
504  }
505  }
506 
510  template <class Evaluation, class FluidState>
511  static Evaluation relpermOilInOilWaterSystem(const Params& params,
512  const FluidState& fluidState)
513  {
514  OPM_TIMEFUNCTION_LOCAL(Subsystem::SatProps);
515  switch (params.approach()) {
516  case EclMultiplexerApproach::Stone1:
517  return Stone1Material::template relpermOilInOilWaterSystem<Evaluation>
518  (params.template getRealParams<EclMultiplexerApproach::Stone1>(),
519  fluidState);
520 
521  case EclMultiplexerApproach::Stone2:
522  return Stone2Material::template relpermOilInOilWaterSystem<Evaluation>
523  (params.template getRealParams<EclMultiplexerApproach::Stone2>(),
524  fluidState);
525 
526  case EclMultiplexerApproach::Default:
527  return DefaultMaterial::template relpermOilInOilWaterSystem<Evaluation>
528  (params.template getRealParams<EclMultiplexerApproach::Default>(),
529  fluidState);
530 
531  default:
532  throw std::logic_error {
533  "relpermOilInOilWaterSystem() is specific to three phases"
534  };
535  }
536  }
537 
541  template <class FluidState, class Evaluation = typename FluidState::ValueType>
542  static Evaluation krg(const Params& /* params */,
543  const FluidState& /* fluidState */)
544  {
545  throw std::logic_error("Not implemented: krg()");
546  }
547 
551  template <class FluidState, class Evaluation = typename FluidState::ValueType>
552  static Evaluation krw(const Params& /* params */,
553  const FluidState& /* fluidState */)
554  {
555  throw std::logic_error("Not implemented: krw()");
556  }
557 
561  template <class FluidState, class Evaluation = typename FluidState::ValueType>
562  static Evaluation krn(const Params& /* params */,
563  const FluidState& /* fluidState */)
564  {
565  throw std::logic_error("Not implemented: krn()");
566  }
567 
568 
576  template <class FluidState>
577  static bool updateHysteresis(Params& params, const FluidState& fluidState)
578  {
579  OPM_TIMEFUNCTION_LOCAL(Subsystem::SatProps);
580  OPM_ECL_MULTIPLEXER_MATERIAL_CALL(return ActualLaw::updateHysteresis(realParams, fluidState),
581  return false);
582  return false;
583  }
584 };
585 
586 } // namespace Opm
587 
588 #endif
static Evaluation krn(const Params &, const FluidState &)
The relative permeability of the non-wetting (i.e., oil) phase.
Definition: EclMultiplexerMaterial.hpp:562
Implements a multiplexer class that provides ECL saturation functions for twophase simulations...
static OPM_HOST_DEVICE void relativePermeabilities(ContainerT &values, const Params &params, const FluidState &fluidState)
The relative permeability of all phases.
Definition: EclMultiplexerMaterial.hpp:447
static Evaluation pcgn(const Params &, const FluidState &)
Capillary pressure between the gas and the non-wetting liquid (i.e., oil) phase.
Definition: EclMultiplexerMaterial.hpp:368
static OPM_HOST_DEVICE void capillaryPressures(ContainerT &values, const Params &params, const FluidState &fluidState)
Implements the multiplexer three phase capillary pressure law used by the ECLipse simulator...
Definition: EclMultiplexerMaterial.hpp:232
static bool updateHysteresis(Params &params, const FluidState &fluidState)
Update the hysteresis parameters after a time step.
Definition: EclMultiplexerMaterial.hpp:577
Implements the second phase capillary pressure/relperm law suggested by Stone as used by the ECLipse ...
static constexpr bool isCompositionDependent
Specify whether the quantities defined by this material law are dependent on the phase composition...
Definition: EclMultiplexerMaterial.hpp:215
static Evaluation relpermOilInOilGasSystem(const Params &params, const FluidState &fluidState)
The relative permeability of oil in oil/gas system.
Definition: EclMultiplexerMaterial.hpp:480
Implements the second phase capillary pressure/relperm law suggested by Stone as used by the ECLipse ...
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition: Exceptions.hpp:30
static constexpr bool isPressureDependent
Specify whether the quantities defined by this material law are dependent on the absolute pressure...
Definition: EclMultiplexerMaterial.hpp:207
static constexpr bool implementsTwoPhaseApi
Specify whether this material law implements the two-phase convenience API.
Definition: EclMultiplexerMaterial.hpp:195
Implements the second phase capillary pressure/relperm law suggested by Stone as used by the ECLipse ...
Definition: EclStone2Material.hpp:60
Implements the second phase capillary pressure/relperm law suggested by Stone as used by the ECLipse ...
Definition: EclStone1Material.hpp:60
static constexpr bool isTemperatureDependent
Specify whether the quantities defined by this material law are temperature dependent.
Definition: EclMultiplexerMaterial.hpp:211
Implements a multiplexer class that provides all three phase capillary pressure laws used by the ECLi...
Definition: EclMultiplexerMaterial.hpp:154
static Evaluation krw(const Params &, const FluidState &)
The relative permeability of the wetting phase.
Definition: EclMultiplexerMaterial.hpp:552
Multiplexer implementation for the parameters required by the multiplexed three-phase material law...
static Evaluation Sw(const Params &, const FluidState &)
The saturation of the wetting (i.e., water) phase.
Definition: EclMultiplexerMaterial.hpp:425
static Evaluation krg(const Params &, const FluidState &)
The relative permeability of the gas phase.
Definition: EclMultiplexerMaterial.hpp:542
static Evaluation Sg(const Params &, const FluidState &)
The saturation of the gas phase.
Definition: EclMultiplexerMaterial.hpp:405
static void saturations(ContainerT &, const Params &, const FluidState &)
The inverse of the capillary pressure.
Definition: EclMultiplexerMaterial.hpp:394
static constexpr bool implementsTwoPhaseSatApi
Specify whether this material law implements the two-phase convenience API which only depends on the ...
Definition: EclMultiplexerMaterial.hpp:199
static Evaluation pcnw(const Params &, const FluidState &)
Capillary pressure between the non-wetting liquid (i.e., oil) and the wetting liquid (i...
Definition: EclMultiplexerMaterial.hpp:384
static constexpr bool isSaturationDependent
Specify whether the quantities defined by this material law are saturation dependent.
Definition: EclMultiplexerMaterial.hpp:203
Implements the default three phase capillary pressure law used by the ECLipse simulator.
Definition: EclDefaultMaterial.hpp:62
static Evaluation relpermOilInOilWaterSystem(const Params &params, const FluidState &fluidState)
The relative permeability of oil in oil/water system.
Definition: EclMultiplexerMaterial.hpp:511
Implements a multiplexer class that provides ECL saturation functions for twophase simulations...
Definition: EclTwoPhaseMaterial.hpp:57
static Evaluation Sn(const Params &, const FluidState &)
The saturation of the non-wetting (i.e., oil) phase.
Definition: EclMultiplexerMaterial.hpp:415
Implements the default three phase capillary pressure law used by the ECLipse simulator.