00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00028 #ifndef OPM_FLUID_STATE_VISCOSITY_MODULES_HPP
00029 #define OPM_FLUID_STATE_VISCOSITY_MODULES_HPP
00030
00031 #include <opm/common/ErrorMacros.hpp>
00032 #include <opm/common/Exceptions.hpp>
00033
00034 #include <opm/material/common/MathToolbox.hpp>
00035 #include <opm/common/Valgrind.hpp>
00036
00037 #include <algorithm>
00038
00039 namespace Opm {
00044 template <class Scalar,
00045 unsigned numPhases,
00046 class Implementation>
00047 class FluidStateExplicitViscosityModule
00048 {
00049 public:
00050 FluidStateExplicitViscosityModule()
00051 { Valgrind::SetUndefined(viscosity_); }
00052
00056 const Scalar& viscosity(unsigned phaseIdx) const
00057 { return viscosity_[phaseIdx]; }
00058
00062 void setViscosity(unsigned phaseIdx, Scalar value)
00063 { viscosity_[phaseIdx] = value; }
00064
00069 template <class FluidState>
00070 void assign(const FluidState& fs)
00071 {
00072 for (unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
00073 viscosity_[phaseIdx] = Opm::decay<Scalar>(fs.viscosity(phaseIdx));
00074 }
00075 }
00076
00085 void checkDefined() const
00086 {
00087 Valgrind::CheckDefined(viscosity_);
00088 }
00089
00090 protected:
00091 Scalar viscosity_[numPhases];
00092 };
00093
00098 template <class Scalar,
00099 unsigned numPhases,
00100 class Implementation>
00101 class FluidStateNullViscosityModule
00102 {
00103 public:
00104 FluidStateNullViscosityModule()
00105 { }
00106
00110 const Scalar& viscosity(unsigned ) const
00111 { OPM_THROW(std::logic_error, "Viscosity is not provided by this fluid state"); }
00112
00117 template <class FluidState>
00118 void assign(const FluidState& )
00119 { }
00120
00129 void checkDefined() const
00130 { }
00131 };
00132
00133 }
00134
00135 #endif