Merge pull request #435 from akva2/test_init

Change static intialization of CO2 tables to avoid function call, use construction.
This commit is contained in:
Atgeirr Flø Rasmussen 2020-12-11 07:34:52 +01:00 committed by GitHub
commit ce4cbafe95
2 changed files with 34 additions and 41 deletions

View File

@ -62,6 +62,17 @@ public:
resize(minX, maxX, m, minY, maxY, n); resize(minX, maxX, m, minY, maxY, n);
} }
UniformTabulated2DFunction(Scalar minX, Scalar maxX, unsigned m,
Scalar minY, Scalar maxY, unsigned n,
const std::vector<std::vector<Scalar>>& 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. * \brief Resize the tabulation to a new range.
*/ */

View File

@ -23,7 +23,7 @@ struct TabulatedDensityTraits {
static const Scalar yMin; static const Scalar yMin;
static const Scalar yMax; static const Scalar yMax;
static const Scalar vals[numX][numY]; static const std::vector<std::vector<Scalar>> vals;
}; };
inline const double TabulatedDensityTraits::xMin = 2.800000000000000e+02; 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 double TabulatedDensityTraits::yMax = 1.000000000000000e+08;
inline const char *TabulatedDensityTraits::name = "density"; inline const char *TabulatedDensityTraits::name = "density";
inline const double TabulatedDensityTraits::vals[200][500] = inline const std::vector<std::vector<double>> TabulatedDensityTraits::vals =
{ {
{ {
1.902062465274410e+00, 5.782408947482105e+00, 9.764909779046345e+00, 1.385694970929571e+01, 1.806682704790397e+01, 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 int numY = 500;
static const Scalar yMin; static const Scalar yMin;
static const Scalar yMax; static const Scalar yMax;
static const Scalar vals[numX][numY]; static const std::vector<std::vector<Scalar>> vals;
}; };
inline const double TabulatedEnthalpyTraits::xMin = 2.800000000000000e+02; 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 double TabulatedEnthalpyTraits::yMax = 1.000000000000000e+08;
inline const char *TabulatedEnthalpyTraits::name = "enthalpy"; inline const char *TabulatedEnthalpyTraits::name = "enthalpy";
inline const double TabulatedEnthalpyTraits::vals[200][500] = inline const std::vector<std::vector<double>> TabulatedEnthalpyTraits::vals =
{ {
{ {
5.700580815972213e+03, 3.531328941638982e+03, 1.311308233079838e+03, -9.631993272332195e+02, -3.296365473729317e+03, 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 // this class collects all the tabulated quantities in one convenient place
struct CO2Tables { struct CO2Tables {
static TabulatedFunction tabulatedEnthalpy; static const TabulatedFunction tabulatedEnthalpy;
static TabulatedFunction tabulatedDensity; static const TabulatedFunction tabulatedDensity;
static const double brineSalinity; static constexpr double brineSalinity = 1.000000000000000e-01;
}; };
inline TabulatedFunction CO2Tables::tabulatedEnthalpy; inline const TabulatedFunction CO2Tables::tabulatedEnthalpy
inline TabulatedFunction CO2Tables::tabulatedDensity; {TabulatedEnthalpyTraits::xMin,
inline const double CO2Tables::brineSalinity = 1.000000000000000e-01;
// 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::xMax,
TabulatedEnthalpyTraits::numX, TabulatedEnthalpyTraits::numX,
TabulatedEnthalpyTraits::yMin, TabulatedEnthalpyTraits::yMin,
TabulatedEnthalpyTraits::yMax, TabulatedEnthalpyTraits::yMax,
TabulatedEnthalpyTraits::numY); TabulatedEnthalpyTraits::numY,
TabulatedEnthalpyTraits::vals};
for (unsigned i = 0; i < TabulatedEnthalpyTraits::numX; ++i) inline const TabulatedFunction CO2Tables::tabulatedDensity
for (unsigned j = 0; j < TabulatedEnthalpyTraits::numY; ++j) {TabulatedDensityTraits::xMin,
CO2Tables::tabulatedEnthalpy.setSamplePoint(i, j, TabulatedEnthalpyTraits::vals[i][j]);
CO2Tables::tabulatedDensity.resize(TabulatedDensityTraits::xMin,
TabulatedDensityTraits::xMax, TabulatedDensityTraits::xMax,
TabulatedDensityTraits::numX, TabulatedDensityTraits::numX,
TabulatedDensityTraits::yMin, TabulatedDensityTraits::yMin,
TabulatedDensityTraits::yMax, TabulatedDensityTraits::yMax,
TabulatedDensityTraits::numY); TabulatedDensityTraits::numY,
TabulatedDensityTraits::vals};
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 */ #endif /* CO2TABLES_INC */