diff --git a/opm/material/common/UniformTabulated2DFunction.hpp b/opm/material/common/UniformTabulated2DFunction.hpp index 67c7e1330..16dfac689 100644 --- a/opm/material/common/UniformTabulated2DFunction.hpp +++ b/opm/material/common/UniformTabulated2DFunction.hpp @@ -62,6 +62,17 @@ public: resize(minX, maxX, m, minY, maxY, n); } + UniformTabulated2DFunction(Scalar minX, Scalar maxX, unsigned m, + Scalar minY, Scalar maxY, unsigned n, + const std::vector>& vals) + { + resize(minX, maxX, m, minY, maxY, n); + + for (unsigned i = 0; i < m; ++i) + for (unsigned j = 0; j < n; ++j) + this->setSamplePoint(i, j, vals[i][j]); + } + /*! * \brief Resize the tabulation to a new range. */ diff --git a/opm/material/components/co2tables.inc b/opm/material/components/co2tables.inc index e94562aed..4ce500b44 100644 --- a/opm/material/components/co2tables.inc +++ b/opm/material/components/co2tables.inc @@ -23,7 +23,7 @@ struct TabulatedDensityTraits { static const Scalar yMin; static const Scalar yMax; - static const Scalar vals[numX][numY]; + static const std::vector> vals; }; inline const double TabulatedDensityTraits::xMin = 2.800000000000000e+02; @@ -32,7 +32,7 @@ inline const double TabulatedDensityTraits::yMin = 1.000000000000000e+05; inline const double TabulatedDensityTraits::yMax = 1.000000000000000e+08; inline const char *TabulatedDensityTraits::name = "density"; -inline const double TabulatedDensityTraits::vals[200][500] = +inline const std::vector> TabulatedDensityTraits::vals = { { 1.902062465274410e+00, 5.782408947482105e+00, 9.764909779046345e+00, 1.385694970929571e+01, 1.806682704790397e+01, @@ -20445,7 +20445,7 @@ struct TabulatedEnthalpyTraits { static const int numY = 500; static const Scalar yMin; static const Scalar yMax; - static const Scalar vals[numX][numY]; + static const std::vector> vals; }; inline const double TabulatedEnthalpyTraits::xMin = 2.800000000000000e+02; @@ -20454,7 +20454,7 @@ inline const double TabulatedEnthalpyTraits::yMin = 1.000000000000000e+05; inline const double TabulatedEnthalpyTraits::yMax = 1.000000000000000e+08; inline const char *TabulatedEnthalpyTraits::name = "enthalpy"; -inline const double TabulatedEnthalpyTraits::vals[200][500] = +inline const std::vector> TabulatedEnthalpyTraits::vals = { { 5.700580815972213e+03, 3.531328941638982e+03, 1.311308233079838e+03, -9.631993272332195e+02, -3.296365473729317e+03, @@ -40862,46 +40862,28 @@ typedef Opm::UniformTabulated2DFunction< double > TabulatedFunction; // this class collects all the tabulated quantities in one convenient place struct CO2Tables { - static TabulatedFunction tabulatedEnthalpy; - static TabulatedFunction tabulatedDensity; - static const double brineSalinity; + static const TabulatedFunction tabulatedEnthalpy; + static const TabulatedFunction tabulatedDensity; + static constexpr double brineSalinity = 1.000000000000000e-01; }; -inline TabulatedFunction CO2Tables::tabulatedEnthalpy; -inline TabulatedFunction CO2Tables::tabulatedDensity; -inline const double CO2Tables::brineSalinity = 1.000000000000000e-01; +inline const TabulatedFunction CO2Tables::tabulatedEnthalpy + {TabulatedEnthalpyTraits::xMin, + TabulatedEnthalpyTraits::xMax, + TabulatedEnthalpyTraits::numX, + TabulatedEnthalpyTraits::yMin, + TabulatedEnthalpyTraits::yMax, + TabulatedEnthalpyTraits::numY, + TabulatedEnthalpyTraits::vals}; -// initialize the static tables once. this is a bit hacky in so far as it uses some -// advanced C++ features (static initializer functions) -inline int initCO2Tables_(); -int initCO2Tables_() -{ - CO2Tables::tabulatedEnthalpy.resize(TabulatedEnthalpyTraits::xMin, - TabulatedEnthalpyTraits::xMax, - TabulatedEnthalpyTraits::numX, - TabulatedEnthalpyTraits::yMin, - TabulatedEnthalpyTraits::yMax, - TabulatedEnthalpyTraits::numY); +inline const TabulatedFunction CO2Tables::tabulatedDensity + {TabulatedDensityTraits::xMin, + TabulatedDensityTraits::xMax, + TabulatedDensityTraits::numX, + TabulatedDensityTraits::yMin, + TabulatedDensityTraits::yMax, + TabulatedDensityTraits::numY, + TabulatedDensityTraits::vals}; - for (unsigned i = 0; i < TabulatedEnthalpyTraits::numX; ++i) - for (unsigned j = 0; j < TabulatedEnthalpyTraits::numY; ++j) - CO2Tables::tabulatedEnthalpy.setSamplePoint(i, j, TabulatedEnthalpyTraits::vals[i][j]); - - CO2Tables::tabulatedDensity.resize(TabulatedDensityTraits::xMin, - TabulatedDensityTraits::xMax, - TabulatedDensityTraits::numX, - TabulatedDensityTraits::yMin, - TabulatedDensityTraits::yMax, - TabulatedDensityTraits::numY); - - for (unsigned i = 0; i < TabulatedDensityTraits::numX; ++i) - for (unsigned j = 0; j < TabulatedDensityTraits::numY; ++j) - CO2Tables::tabulatedDensity.setSamplePoint(i, j, TabulatedDensityTraits::vals[i][j]); - - return 0; -} - -extern int co2TablesInitDummy__; -inline int co2TablesInitDummy__ = initCO2Tables_(); #endif /* CO2TABLES_INC */