00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00027 #ifndef OPM_NULL_MATERIAL_HPP
00028 #define OPM_NULL_MATERIAL_HPP
00029
00030 #include "NullMaterialParams.hpp"
00031
00032 #include <opm/common/ErrorMacros.hpp>
00033 #include <opm/common/Exceptions.hpp>
00034 #include <opm/material/common/MathToolbox.hpp>
00035
00036 #include <algorithm>
00037
00038 namespace Opm
00039 {
00046 template <class TraitsT>
00047 class NullMaterial : public TraitsT
00048 {
00049 public:
00050 typedef TraitsT Traits;
00051 typedef NullMaterialParams<TraitsT> Params;
00052 typedef typename Traits::Scalar Scalar;
00053
00055 static const unsigned numPhases = Traits::numPhases;
00056
00059 static const bool implementsTwoPhaseApi = (numPhases == 2);
00060
00063 static const bool implementsTwoPhaseSatApi = (numPhases == 2);
00064
00070 static const bool isSaturationDependent = true;
00071
00074 static const bool isPressureDependent = false;
00075
00078 static const bool isTemperatureDependent = false;
00079
00082 static const bool isCompositionDependent = false;
00083
00091 template <class ContainerT, class FluidState>
00092 static void capillaryPressures(ContainerT& values,
00093 const Params& ,
00094 const FluidState& )
00095 {
00096 for (unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx)
00097 values[phaseIdx] = 0.0;
00098 }
00099
00103 template <class ContainerT, class FluidState>
00104 static void saturations(ContainerT& ,
00105 const Params& ,
00106 const FluidState& )
00107 { OPM_THROW(std::logic_error, "Not defined: NullMaterial::saturations()"); }
00108
00112 template <class ContainerT, class FluidState>
00113 static void relativePermeabilities(ContainerT& values,
00114 const Params& ,
00115 const FluidState& fluidState)
00116 {
00117 typedef typename std::remove_reference<decltype(values[0])>::type Evaluation;
00118
00119 for (unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
00120 const Evaluation& S =
00121 Opm::decay<Evaluation>(fluidState.saturation(phaseIdx));
00122 values[phaseIdx] = Opm::max(Opm::min(S, 1.0), 0.0);
00123 }
00124 }
00125
00129 template <class FluidState, class Evaluation = typename FluidState::Scalar>
00130 static typename std::enable_if<(numPhases > 1), Evaluation>::type
00131 pcnw(const Params& , const FluidState& )
00132 { return 0; }
00133
00134 template <class Evaluation>
00135 static typename std::enable_if<numPhases == 2, Evaluation>::type
00136 twoPhaseSatPcnw(const Params& , const Evaluation& )
00137 { return 0; }
00138
00143 template <class FluidState, class Evaluation = typename FluidState::Scalar>
00144 static Scalar Sw(const Params& , const FluidState& )
00145 { OPM_THROW(std::logic_error, "Not defined: Sw()"); }
00146
00147 template <class Evaluation>
00148 static typename std::enable_if<numPhases == 2, Evaluation>::type
00149 twoPhaseSatSw(const Params& , const Evaluation& )
00150 { OPM_THROW(std::logic_error, "Not defined: twoPhaseSatSw()"); }
00151
00156 template <class FluidState, class Evaluation = typename FluidState::Scalar>
00157 static Scalar Sn(const Params& , const FluidState& )
00158 { OPM_THROW(std::logic_error, "Not defined: Sn()"); }
00159
00160 template <class Evaluation>
00161 static typename std::enable_if<numPhases == 2, Evaluation>::type
00162 twoPhaseSatSn(const Params& , const Evaluation& )
00163 { OPM_THROW(std::logic_error, "Not defined: twoPhaseSatSn()"); }
00164
00171 template <class FluidState, class Evaluation = typename FluidState::Scalar>
00172 static typename std::enable_if< (numPhases > 2), Evaluation>::type
00173 Sg(const Params& , const FluidState& )
00174 { OPM_THROW(std::logic_error, "Not defined: Sg()"); }
00175
00179 template <class FluidState, class Evaluation = typename FluidState::Scalar>
00180 static typename std::enable_if<(numPhases > 1), Evaluation>::type
00181 krw(const Params& , const FluidState& fluidState)
00182 {
00183 const Evaluation& Sw =
00184 Opm::decay<Evaluation>(fluidState.saturation(Traits::wettingPhaseIdx));
00185
00186 return Opm::max(0.0, Opm::min(1.0, Sw));
00187 }
00188
00189 template <class Evaluation>
00190 static typename std::enable_if<numPhases == 2, Evaluation>::type
00191 twoPhaseSatKrw(const Params& , const Evaluation& Sw)
00192 { return Opm::max(0.0, Opm::min(1.0, Sw)); }
00193
00197 template <class FluidState, class Evaluation = typename FluidState::Scalar>
00198 static typename std::enable_if<(numPhases > 1), Evaluation>::type
00199 krn(const Params& , const FluidState& fluidState)
00200 {
00201 const Evaluation& Sn =
00202 Opm::decay<Evaluation>(fluidState.saturation(Traits::nonWettingPhaseIdx));
00203
00204 return Opm::max(0.0, Opm::min(1.0, Sn));
00205 }
00206
00207 template <class Evaluation>
00208 static typename std::enable_if<numPhases == 2, Evaluation>::type
00209 twoPhaseSatKrn(const Params& , const Evaluation& Sw)
00210 {
00211 return Opm::max(0.0, Opm::min(1.0, 1.0 - Opm::decay<Evaluation>(Sw)));
00212 }
00213
00219 template <class FluidState, class Evaluation = typename FluidState::Scalar>
00220 static typename std::enable_if< (numPhases > 2), Evaluation>::type
00221 krg(const Params& , const FluidState& fluidState)
00222 {
00223 const Evaluation& Sg =
00224 Opm::decay<Evaluation>(fluidState.saturation(Traits::gasPhaseIdx));
00225
00226 return Opm::max(0.0, Opm::min(1.0, Sg));
00227 }
00228
00234 template <class FluidState, class Evaluation = typename FluidState::Scalar>
00235 static typename std::enable_if< (Traits::numPhases > 2), Evaluation>::type
00236 pcgn(const Params& , const FluidState& )
00237 { return 0.0; }
00238 };
00239 }
00240
00241 #endif