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_PIECEWISE_LINEAR_TWO_PHASE_MATERIAL_PARAMS_HPP
00028 #define OPM_PIECEWISE_LINEAR_TWO_PHASE_MATERIAL_PARAMS_HPP
00029
00030 #include <vector>
00031 #include <cassert>
00032 #include <cstddef>
00033
00034 #include <opm/material/common/EnsureFinalized.hpp>
00035
00036 namespace Opm {
00043 template<class TraitsT>
00044 class PiecewiseLinearTwoPhaseMaterialParams : public EnsureFinalized
00045 {
00046 typedef typename TraitsT::Scalar Scalar;
00047
00048 public:
00049 typedef std::vector<Scalar> ValueVector;
00050
00051 typedef TraitsT Traits;
00052
00053 PiecewiseLinearTwoPhaseMaterialParams()
00054 {
00055 }
00056
00061 void finalize()
00062 {
00063 EnsureFinalized :: finalize ();
00064
00065
00066
00067 if (SwPcwnSamples_.front() > SwPcwnSamples_.back())
00068 swapOrder_(SwPcwnSamples_, pcwnSamples_);
00069
00070 if (SwKrwSamples_.front() > SwKrwSamples_.back())
00071 swapOrder_(SwKrwSamples_, krwSamples_);
00072
00073
00074 if (SwKrnSamples_.front() > SwKrnSamples_.back())
00075 swapOrder_(SwKrnSamples_, krnSamples_);
00076
00077 }
00078
00082 const ValueVector& SwKrwSamples() const
00083 { EnsureFinalized::check(); return SwKrwSamples_; }
00084
00088 const ValueVector& SwKrnSamples() const
00089 { EnsureFinalized::check(); return SwKrnSamples_; }
00090
00094 const ValueVector& SwPcwnSamples() const
00095 { EnsureFinalized::check(); return SwPcwnSamples_; }
00096
00102 const ValueVector& pcnwSamples() const
00103 { EnsureFinalized::check(); return pcwnSamples_; }
00104
00110 template <class Container>
00111 void setPcnwSamples(const Container& SwValues, const Container& values)
00112 {
00113 assert(SwValues.size() == values.size());
00114
00115 size_t n = SwValues.size();
00116 SwPcwnSamples_.resize(n);
00117 pcwnSamples_.resize(n);
00118
00119 std::copy(SwValues.begin(), SwValues.end(), SwPcwnSamples_.begin());
00120 std::copy(values.begin(), values.end(), pcwnSamples_.begin());
00121 }
00122
00129 const ValueVector& krwSamples() const
00130 { EnsureFinalized::check(); return krwSamples_; }
00131
00138 template <class Container>
00139 void setKrwSamples(const Container& SwValues, const Container& values)
00140 {
00141 assert(SwValues.size() == values.size());
00142
00143 size_t n = SwValues.size();
00144 SwKrwSamples_.resize(n);
00145 krwSamples_.resize(n);
00146
00147 std::copy(SwValues.begin(), SwValues.end(), SwKrwSamples_.begin());
00148 std::copy(values.begin(), values.end(), krwSamples_.begin());
00149 }
00150
00157 const ValueVector& krnSamples() const
00158 { EnsureFinalized::check(); return krnSamples_; }
00159
00166 template <class Container>
00167 void setKrnSamples(const Container& SwValues, const Container& values)
00168 {
00169 assert(SwValues.size() == values.size());
00170
00171 size_t n = SwValues.size();
00172 SwKrnSamples_.resize(n);
00173 krnSamples_.resize(n);
00174
00175 std::copy(SwValues.begin(), SwValues.end(), SwKrnSamples_.begin());
00176 std::copy(values.begin(), values.end(), krnSamples_.begin());
00177 }
00178
00179 private:
00180 void swapOrder_(ValueVector& swValues, ValueVector& values) const
00181 {
00182 if (swValues.front() > values.back()) {
00183 for (unsigned origSampleIdx = 0;
00184 origSampleIdx < swValues.size() / 2;
00185 ++ origSampleIdx)
00186 {
00187 size_t newSampleIdx = swValues.size() - origSampleIdx - 1;
00188
00189 std::swap(swValues[origSampleIdx], swValues[newSampleIdx]);
00190 std::swap(values[origSampleIdx], values[newSampleIdx]);
00191 }
00192 }
00193 }
00194
00195 ValueVector SwPcwnSamples_;
00196 ValueVector SwKrwSamples_;
00197 ValueVector SwKrnSamples_;
00198 ValueVector pcwnSamples_;
00199 ValueVector krwSamples_;
00200 ValueVector krnSamples_;
00201 };
00202 }
00203
00204 #endif