EclEpsTwoPhaseLaw.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  Copyright (C) 2015 by Andreas Lauser
5 
6  This file is part of the Open Porous Media project (OPM).
7 
8  OPM is free software: you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation, either version 2 of the License, or
11  (at your option) any later version.
12 
13  OPM is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  GNU General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with OPM. If not, see <http://www.gnu.org/licenses/>.
20 */
25 #ifndef OPM_ECL_EPS_TWO_PHASE_LAW_HPP
26 #define OPM_ECL_EPS_TWO_PHASE_LAW_HPP
27 
29 
31 #include <opm/common/ErrorMacros.hpp>
32 #include <opm/common/Exceptions.hpp>
33 
34 namespace Opm {
46 template <class EffLawT,
47  class ParamsT = EclEpsTwoPhaseLawParams<EffLawT> >
48 class EclEpsTwoPhaseLaw : public EffLawT::Traits
49 {
50  typedef EffLawT EffLaw;
51 
52 public:
53  typedef typename EffLaw::Traits Traits;
54  typedef ParamsT Params;
55  typedef typename EffLaw::Scalar Scalar;
56 
57  enum { wettingPhaseIdx = Traits::wettingPhaseIdx };
58  enum { nonWettingPhaseIdx = Traits::nonWettingPhaseIdx };
59 
61  static const int numPhases = EffLaw::numPhases;
62  static_assert(numPhases == 2,
63  "The endpoint scaling applies to the nested twophase laws, not to "
64  "the threephase one!");
65 
68  static const bool implementsTwoPhaseApi = true;
69 
70  static_assert(EffLaw::implementsTwoPhaseApi,
71  "The material laws put into EclEpsTwoPhaseLaw must implement the "
72  "two-phase material law API!");
73 
76  static const bool implementsTwoPhaseSatApi = true;
77 
78  static_assert(EffLaw::implementsTwoPhaseSatApi,
79  "The material laws put into EclEpsTwoPhaseLaw must implement the "
80  "two-phase material law saturation API!");
81 
84  static const bool isSaturationDependent = true;
85 
88  static const bool isPressureDependent = false;
89 
92  static const bool isTemperatureDependent = false;
93 
96  static const bool isCompositionDependent = false;
97 
108  template <class Container, class FluidState>
109  static void capillaryPressures(Container& /*values*/, const Params& /*params*/, const FluidState& /*fluidState*/)
110  {
111  OPM_THROW(NotImplemented,
112  "The capillaryPressures(fs) method is not yet implemented");
113  }
114 
125  template <class Container, class FluidState>
126  static void relativePermeabilities(Container& /*values*/, const Params& /*params*/, const FluidState& /*fluidState*/)
127  {
128  OPM_THROW(NotImplemented,
129  "The pcnw(fs) method is not yet implemented");
130  }
131 
143  template <class FluidState, class Evaluation = typename FluidState::Scalar>
144  static Evaluation pcnw(const Params& /*params*/, const FluidState& /*fluidState*/)
145  {
146  OPM_THROW(NotImplemented,
147  "The pcnw(fs) method is not yet implemented");
148  }
149 
150  template <class Evaluation>
151  static Evaluation twoPhaseSatPcnw(const Params &params, const Evaluation& SwScaled)
152  {
153  const Evaluation& SwUnscaled = scaledToUnscaledSatPc(params, SwScaled);
154  const Evaluation& pcUnscaled = EffLaw::twoPhaseSatPcnw(params.effectiveLawParams(), SwUnscaled);
155  return unscaledToScaledPcnw_(params, pcUnscaled);
156  }
157 
158  template <class Evaluation>
159  static Evaluation twoPhaseSatPcnwInv(const Params &params, const Evaluation& pcnwScaled)
160  {
161  Evaluation pcnwUnscaled = scaledToUnscaledPcnw_(params, pcnwScaled);
162  Evaluation SwUnscaled = EffLaw::twoPhaseSatPcnwInv(params.effectiveLawParams(), pcnwUnscaled);
163  return unscaledToScaledSatPc(params, SwUnscaled);
164  }
165 
169  template <class Container, class FluidState>
170  static void saturations(Container& /*values*/, const Params& /*params*/, const FluidState& /*fluidState*/)
171  {
172  OPM_THROW(NotImplemented,
173  "The saturations(fs) method is not yet implemented");
174  }
175 
180  template <class FluidState, class Evaluation = typename FluidState::Scalar>
181  static Evaluation Sw(const Params& /*params*/, const FluidState& /*fluidState*/)
182  {
183  OPM_THROW(NotImplemented,
184  "The Sw(fs) method is not yet implemented");
185  }
186 
187  template <class Evaluation>
188  static Evaluation twoPhaseSatSw(const Params& /*params*/, const Evaluation& /*pc*/)
189  {
190  OPM_THROW(NotImplemented,
191  "The twoPhaseSatSw(pc) method is not yet implemented");
192  }
193 
198  template <class FluidState, class Evaluation = typename FluidState::Scalar>
199  static Evaluation Sn(const Params& /*params*/, const FluidState& /*fluidState*/)
200  {
201  OPM_THROW(NotImplemented,
202  "The Sn(pc) method is not yet implemented");
203  }
204 
205  template <class Evaluation>
206  static Evaluation twoPhaseSatSn(const Params& /*params*/, const Evaluation& /*pc*/)
207  {
208  OPM_THROW(NotImplemented,
209  "The twoPhaseSatSn(pc) method is not yet implemented");
210  }
211 
221  template <class FluidState, class Evaluation = typename FluidState::Scalar>
222  static Evaluation krw(const Params& /*params*/, const FluidState& /*fluidState*/)
223  {
224  OPM_THROW(NotImplemented,
225  "The krw(fs) method is not yet implemented");
226  }
227 
228  template <class Evaluation>
229  static Evaluation twoPhaseSatKrw(const Params &params, const Evaluation& SwScaled)
230  {
231  const Evaluation& SwUnscaled = scaledToUnscaledSatKrw(params, SwScaled);
232  const Evaluation& krwUnscaled = EffLaw::twoPhaseSatKrw(params.effectiveLawParams(), SwUnscaled);
233  return unscaledToScaledKrw_(params, krwUnscaled);
234  }
235 
236  template <class Evaluation>
237  static Evaluation twoPhaseSatKrwInv(const Params &params, const Evaluation& krwScaled)
238  {
239  Evaluation krwUnscaled = scaledToUnscaledKrw_(params, krwScaled);
240  Evaluation SwUnscaled = EffLaw::twoPhaseSatKrwInv(params.effectiveLawParams(), krwUnscaled);
241  return unscaledToScaledSatKrw(params, SwUnscaled);
242  }
243 
247  template <class FluidState, class Evaluation = typename FluidState::Scalar>
248  static Evaluation krn(const Params& /*params*/, const FluidState& /*fluidState*/)
249  {
250  OPM_THROW(NotImplemented,
251  "The krn(fs) method is not yet implemented");
252  }
253 
254  template <class Evaluation>
255  static Evaluation twoPhaseSatKrn(const Params &params, const Evaluation& SwScaled)
256  {
257  const Evaluation& SwUnscaled = scaledToUnscaledSatKrn(params, SwScaled);
258  const Evaluation& krnUnscaled = EffLaw::twoPhaseSatKrn(params.effectiveLawParams(), SwUnscaled);
259  return unscaledToScaledKrn_(params, krnUnscaled);
260  }
261 
262  template <class Evaluation>
263  static Evaluation twoPhaseSatKrnInv(const Params &params, const Evaluation& krnScaled)
264  {
265  Evaluation krnUnscaled = scaledToUnscaledKrn_(params, krnScaled);
266  Evaluation SwUnscaled = EffLaw::twoPhaseSatKrnInv(params.effectiveLawParams(), krnUnscaled);
267  return unscaledToScaledSatKrn(params, SwUnscaled);
268  }
269 
275  template <class Evaluation>
276  static Evaluation scaledToUnscaledSatPc(const Params &params, const Evaluation& SwScaled)
277  {
278  if (!params.config().enableSatScaling())
279  return SwScaled;
280 
281  // the saturations of capillary pressure are always scaled using two-point
282  // scaling
283  return scaledToUnscaledSatTwoPoint_(SwScaled,
284  params.unscaledPoints().saturationPcPoints(),
285  params.scaledPoints().saturationPcPoints());
286  }
287 
288  template <class Evaluation>
289  static Evaluation unscaledToScaledSatPc(const Params &params, const Evaluation& SwUnscaled)
290  {
291  if (!params.config().enableSatScaling())
292  return SwUnscaled;
293 
294  // the saturations of capillary pressure are always scaled using two-point
295  // scaling
296  return unscaledToScaledSatTwoPoint_(SwUnscaled,
297  params.unscaledPoints().saturationPcPoints(),
298  params.scaledPoints().saturationPcPoints());
299  }
300 
305  template <class Evaluation>
306  static Evaluation scaledToUnscaledSatKrw(const Params &params, const Evaluation& SwScaled)
307  {
308  if (!params.config().enableSatScaling())
309  return SwScaled;
310 
311  if (params.config().enableThreePointKrSatScaling()) {
312  return scaledToUnscaledSatThreePoint_(SwScaled,
313  params.unscaledPoints().saturationKrwPoints(),
314  params.scaledPoints().saturationKrwPoints());
315  }
316  else { // two-point relperm saturation scaling
317  return scaledToUnscaledSatTwoPoint_(SwScaled,
318  params.unscaledPoints().saturationKrwPoints(),
319  params.scaledPoints().saturationKrwPoints());
320  }
321  }
322 
323  template <class Evaluation>
324  static Evaluation unscaledToScaledSatKrw(const Params &params, const Evaluation& SwUnscaled)
325  {
326  if (!params.config().enableSatScaling())
327  return SwUnscaled;
328 
329  if (params.config().enableThreePointKrSatScaling()) {
330  return unscaledToScaledSatThreePoint_(SwUnscaled,
331  params.unscaledPoints().saturationKrwPoints(),
332  params.scaledPoints().saturationKrwPoints());
333  }
334  else { // two-point relperm saturation scaling
335  return unscaledToScaledSatTwoPoint_(SwUnscaled,
336  params.unscaledPoints().saturationKrwPoints(),
337  params.scaledPoints().saturationKrwPoints());
338  }
339  }
340 
345  template <class Evaluation>
346  static Evaluation scaledToUnscaledSatKrn(const Params &params, const Evaluation& SwScaled)
347  {
348  if (!params.config().enableSatScaling())
349  return SwScaled;
350 
351  if (params.config().enableThreePointKrSatScaling())
352  return scaledToUnscaledSatThreePoint_(SwScaled,
353  params.unscaledPoints().saturationKrnPoints(),
354  params.scaledPoints().saturationKrnPoints());
355  else // two-point relperm saturation scaling
356  return scaledToUnscaledSatTwoPoint_(SwScaled,
357  params.unscaledPoints().saturationKrnPoints(),
358  params.scaledPoints().saturationKrnPoints());
359  }
360 
361 
362  template <class Evaluation>
363  static Evaluation unscaledToScaledSatKrn(const Params &params, const Evaluation& SwUnscaled)
364  {
365  if (!params.config().enableSatScaling())
366  return SwUnscaled;
367 
368  if (params.config().enableThreePointKrSatScaling()) {
369  return unscaledToScaledSatThreePoint_(SwUnscaled,
370  params.unscaledPoints().saturationKrnPoints(),
371  params.scaledPoints().saturationKrnPoints());
372  }
373  else { // two-point relperm saturation scaling
374  return unscaledToScaledSatTwoPoint_(SwUnscaled,
375  params.unscaledPoints().saturationKrnPoints(),
376  params.scaledPoints().saturationKrnPoints());
377  }
378  }
379 
380 private:
381  template <class Evaluation, class PointsContainer>
382  static Evaluation scaledToUnscaledSatTwoPoint_(const Evaluation& scaledSat,
383  const PointsContainer& unscaledSats,
384  const PointsContainer& scaledSats)
385  {
386  return
387  unscaledSats[0]
388  +
389  (scaledSat - scaledSats[0])*((unscaledSats[1] - unscaledSats[0])/(scaledSats[1] - scaledSats[0]));
390  }
391 
392  template <class Evaluation, class PointsContainer>
393  static Evaluation unscaledToScaledSatTwoPoint_(const Evaluation& unscaledSat,
394  const PointsContainer& unscaledSats,
395  const PointsContainer& scaledSats)
396  {
397  return
398  scaledSats[0]
399  +
400  (unscaledSat - unscaledSats[0])*((scaledSats[1] - scaledSats[0])/(unscaledSats[1] - unscaledSats[0]));
401  }
402 
403  template <class Evaluation, class PointsContainer>
404  static Evaluation scaledToUnscaledSatThreePoint_(const Evaluation& scaledSat,
405  const PointsContainer& unscaledSats,
406  const PointsContainer& scaledSats)
407  {
408  if (unscaledSats[1] >= unscaledSats[2])
409  return scaledToUnscaledSatTwoPoint_(scaledSat, unscaledSats, scaledSats);
410 
411  if (scaledSat < scaledSats[1])
412  return
413  unscaledSats[0]
414  +
415  (scaledSat - scaledSats[0])*((unscaledSats[1] - unscaledSats[0])/(scaledSats[1] - scaledSats[0]));
416  else
417  return
418  unscaledSats[1]
419  +
420  (scaledSat - scaledSats[1])*((unscaledSats[2] - unscaledSats[1])/(scaledSats[2] - scaledSats[1]));
421  }
422 
423  template <class Evaluation, class PointsContainer>
424  static Evaluation unscaledToScaledSatThreePoint_(const Evaluation& unscaledSat,
425  const PointsContainer& unscaledSats,
426  const PointsContainer& scaledSats)
427  {
428  if (unscaledSats[1] >= unscaledSats[2])
429  return unscaledToScaledSatTwoPoint_(unscaledSat, unscaledSats, scaledSats);
430 
431  if (unscaledSat < unscaledSats[1])
432  return
433  scaledSats[0]
434  +
435  (unscaledSat - unscaledSats[0])*((scaledSats[1] - scaledSats[0])/(unscaledSats[1] - unscaledSats[0]));
436  else
437  return
438  scaledSats[1]
439  +
440  (unscaledSat - unscaledSats[1])*((scaledSats[2] - scaledSats[1])/(unscaledSats[2] - unscaledSats[1]));
441  }
442 
446  template <class Evaluation>
447  static Evaluation unscaledToScaledPcnw_(const Params &params, const Evaluation& unscaledPcnw)
448  {
449  if (!params.config().enablePcScaling())
450  return unscaledPcnw;
451 
452  Scalar alpha = params.scaledPoints().maxPcnw()/params.unscaledPoints().maxPcnw();
453  return unscaledPcnw*alpha;
454  }
455 
456  template <class Evaluation>
457  static Evaluation scaledToUnscaledPcnw_(const Params &params, const Evaluation& scaledPcnw)
458  {
459  if (!params.config().enablePcScaling())
460  return scaledPcnw;
461 
462  Scalar alpha = params.unscaledPoints().maxPcnw()/params.scaledPoints().maxPcnw();
463  return scaledPcnw/alpha;
464  }
465 
469  template <class Evaluation>
470  static Evaluation unscaledToScaledKrw_(const Params &params, const Evaluation& unscaledKrw)
471  {
472  if (!params.config().enableKrwScaling())
473  return unscaledKrw;
474 
475  // TODO: three point krw y-scaling
476  Scalar alpha = params.scaledPoints().maxKrw()/params.unscaledPoints().maxKrw();
477  return unscaledKrw*alpha;
478  }
479 
480  template <class Evaluation>
481  static Evaluation scaledToUnscaledKrw_(const Params &params, const Evaluation& scaledKrw)
482  {
483  if (!params.config().enableKrwScaling())
484  return scaledKrw;
485 
486  Scalar alpha = params.unscaledPoints().maxKrw()/params.scaledPoints().maxKrw();
487  return scaledKrw*alpha;
488  }
489 
493  template <class Evaluation>
494  static Evaluation unscaledToScaledKrn_(const Params &params, const Evaluation& unscaledKrn)
495  {
496  if (!params.config().enableKrnScaling())
497  return unscaledKrn;
498 
499  //TODO: three point krn y-scaling
500  Scalar alpha = params.scaledPoints().maxKrn()/params.unscaledPoints().maxKrn();
501  return unscaledKrn*alpha;
502  }
503 
504  template <class Evaluation>
505  static Evaluation scaledToUnscaledKrn_(const Params &params, const Evaluation& scaledKrn)
506  {
507  if (!params.config().enableKrnScaling())
508  return scaledKrn;
509 
510  Scalar alpha = params.unscaledPoints().maxKrn()/params.scaledPoints().maxKrn();
511  return scaledKrn*alpha;
512  }
513 };
514 } // namespace Opm
515 
516 #endif
Definition: Air_Mesitylene.hpp:31
Definition: EclEpsTwoPhaseLaw.hpp:58
Definition: EclEpsTwoPhaseLaw.hpp:57
A default implementation of the parameters for the material law adapter class which implements ECL en...
ParamsT Params
Definition: EclEpsTwoPhaseLaw.hpp:54
EffLaw::Scalar Scalar
Definition: EclEpsTwoPhaseLaw.hpp:55
EffLaw::Traits Traits
Definition: EclEpsTwoPhaseLaw.hpp:53
This material law takes a material law defined for unscaled saturation and converts it to a material ...
Definition: EclEpsTwoPhaseLaw.hpp:48
This is a fluid state which allows to set the fluid saturations and takes all other quantities from a...
static const int numPhases
The number of fluid phases.
Definition: EclEpsTwoPhaseLaw.hpp:61