From dd95be9f858c1c856d59ccbab837d0dc709608ea Mon Sep 17 00:00:00 2001 From: Wenqing Wang <wenqing.wang@ufz.de> Date: Tue, 13 Dec 2016 13:26:14 +0100 Subject: [PATCH] [FL] Removed a static array buffer that can break multithread environment. --- .../Fluid/Viscosity/WaterViscosityIAPWS.cpp | 47 ++++++++++++++----- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/MaterialLib/Fluid/Viscosity/WaterViscosityIAPWS.cpp b/MaterialLib/Fluid/Viscosity/WaterViscosityIAPWS.cpp index b8181b51b63..c6e1e885e03 100644 --- a/MaterialLib/Fluid/Viscosity/WaterViscosityIAPWS.cpp +++ b/MaterialLib/Fluid/Viscosity/WaterViscosityIAPWS.cpp @@ -12,6 +12,7 @@ #include "WaterViscosityIAPWS.h" +#include <array> #include <cmath> namespace MaterialLib @@ -29,10 +30,13 @@ static const double Hij[6][7] = { static double computeBarMu0Factor(const double barT); -static double series_factorT[6]; -static double series_factorRho[7]; -static void computeSeriesFactorForMu1(const double barT, const double bar_rho); -static double computeBarMu1Factor(); +static std::array<double, 6> computeSeriesFactorTForMu1(const double barT, + const double bar_rho); +static std::array<double, 7> computeSeriesFactorRhoForMu1(const double barT, + const double bar_rho); +static double computeBarMu1Factor( + const std::array<double, 6>& series_factorT, + const std::array<double, 7>& series_factorRho); static double computedBarMu_dbarT(const double barT, double bar_rho); static double computedBarMu_dbarRho(const double barT, double bar_rho); @@ -46,8 +50,10 @@ double WaterViscosityIAPWS::getValue(const ArrayType& var_vals) const const double mu0 = 100. * std::sqrt(bar_T) / computeBarMu0Factor(bar_T); - computeSeriesFactorForMu1(bar_T, bar_rho); - const double mu1 = std::exp(bar_rho * computeBarMu1Factor()); + const auto& series_factorT = computeSeriesFactorTForMu1(bar_T, bar_rho); + const auto& series_factorRho = computeSeriesFactorRhoForMu1(bar_T, bar_rho); + const double mu1 = std::exp( + bar_rho * computeBarMu1Factor(series_factorT, series_factorRho)); return mu0 * mu1 * _ref_mu; } @@ -65,7 +71,6 @@ double WaterViscosityIAPWS::getdValue(const ArrayType& var_vals, case PropertyVariableType::T: return _ref_mu * computedBarMu_dbarT(bar_T, bar_rho) / _ref_T; case PropertyVariableType::rho: - computeSeriesFactorForMu1(bar_T, bar_rho); return _ref_mu * computedBarMu_dbarRho(bar_T, bar_rho) / _ref_rho; default: return 0.; @@ -84,8 +89,10 @@ double computeBarMu0Factor(const double barT) return sum_val; } -void computeSeriesFactorForMu1(const double barT, const double bar_rho) +std::array<double, 6> computeSeriesFactorTForMu1(const double barT, + const double bar_rho) { + std::array<double, 6> series_factorT; series_factorT[0] = 1.; const double barT_fac = 1 / barT - 1.0; for (int i = 1; i < 6; i++) @@ -93,14 +100,24 @@ void computeSeriesFactorForMu1(const double barT, const double bar_rho) series_factorT[i] = series_factorT[i - 1] * barT_fac; } + return series_factorT; +} + +std::array<double, 7> computeSeriesFactorRhoForMu1(const double barT, + const double bar_rho) +{ + std::array<double, 7> series_factorRho; series_factorRho[0] = 1.; for (int i = 1; i < 7; i++) { series_factorRho[i] = series_factorRho[i - 1] * (bar_rho - 1.0); } + + return series_factorRho; } -double computeBarMu1Factor() +double computeBarMu1Factor(const std::array<double, 6>& series_factorT, + const std::array<double, 7>& series_factorRho) { double sum_val = 0.; for (int i = 0; i < 6; i++) @@ -133,6 +150,9 @@ double computedBarMu_dbarT(const double barT, double bar_rho) 50. / (mu0_factor * sqrt_barT) - 100. * sqrt_barT * dmu0_factor_dbarT / (mu0_factor * mu0_factor); + const auto& series_factorT = computeSeriesFactorTForMu1(barT, bar_rho); + const auto& series_factorRho = computeSeriesFactorRhoForMu1(barT, bar_rho); + double dmu1_factor_dbarT = 0.0; for (int i = 1; i < 6; i++) { @@ -145,7 +165,8 @@ double computedBarMu_dbarT(const double barT, double bar_rho) sum_val_j / (barT * barT); } - const double mu1_factor = computeBarMu1Factor(); + const double mu1_factor = + computeBarMu1Factor(series_factorT, series_factorRho); const double dbar_mu1_dbarT = bar_rho * std::exp(bar_rho * mu1_factor) * dmu1_factor_dbarT; @@ -155,6 +176,9 @@ double computedBarMu_dbarT(const double barT, double bar_rho) double computedBarMu_dbarRho(const double barT, double bar_rho) { + const auto& series_factorT = computeSeriesFactorTForMu1(barT, bar_rho); + const auto& series_factorRho = computeSeriesFactorRhoForMu1(barT, bar_rho); + double dmu1_factor_dbar_rho = 0.0; for (int i = 0; i < 6; i++) { @@ -169,7 +193,8 @@ double computedBarMu_dbarRho(const double barT, double bar_rho) const double mu0 = 100. * std::sqrt(barT) / computeBarMu0Factor(barT); - const double mu1_factor = computeBarMu1Factor(); + const double mu1_factor = + computeBarMu1Factor(series_factorT, series_factorRho); return mu0 * std::exp(bar_rho * mu1_factor) * (mu1_factor + bar_rho * dmu1_factor_dbar_rho); } -- GitLab