From eed3eae2eeb65cc7bccbec9d9fe0809811a310bf Mon Sep 17 00:00:00 2001 From: Wenqing Wang <wenqing.wang@ufz.de> Date: Mon, 19 Dec 2016 11:03:55 +0100 Subject: [PATCH] [FL] Removed the buffer member of a class that could cause problem in multithreads --- .../FluidProperties/CreateFluidProperties.cpp | 22 +++++++----------- .../Fluid/FluidProperties/FluidProperties.h | 20 ++++++++++++---- ...idPropertiesWithDensityDependentModels.cpp | 23 ++++++++++++------- ...luidPropertiesWithDensityDependentModels.h | 4 ++-- 4 files changed, 41 insertions(+), 28 deletions(-) diff --git a/MaterialLib/Fluid/FluidProperties/CreateFluidProperties.cpp b/MaterialLib/Fluid/FluidProperties/CreateFluidProperties.cpp index 7173661106f..e5ee1fa7aac 100644 --- a/MaterialLib/Fluid/FluidProperties/CreateFluidProperties.cpp +++ b/MaterialLib/Fluid/FluidProperties/CreateFluidProperties.cpp @@ -16,14 +16,14 @@ #include "BaseLib/ConfigTree.h" -#include "FluidProperties.h" -#include "PrimaryVariableDependentFluidProperties.h" -#include "FluidPropertiesWithDensityDependentModels.h" - #include "MaterialLib/Fluid/FluidPropertyHeaders.h" #include "MaterialLib/Fluid/SpecificHeatCapacity/CreateSpecificFluidHeatCapacityModel.h" #include "MaterialLib/Fluid/ThermalConductivity/CreateFluidThermalConductivityModel.h" +#include "FluidProperties.h" +#include "PrimaryVariableDependentFluidProperties.h" +#include "FluidPropertiesWithDensityDependentModels.h" + namespace MaterialLib { namespace Fluid @@ -39,9 +39,7 @@ std::unique_ptr<FluidProperties> createFluidProperties( auto const& mu_conf = config.getConfigSubtree("viscosity"); auto viscosity = MaterialLib::Fluid::createViscosityModel(mu_conf); const bool is_mu_density_dependent = - (viscosity->getName().find("density dependent") != std::string::npos) - ? true - : false; + (viscosity->getName().find("density dependent") != std::string::npos); bool is_cp_density_dependent = false; std::unique_ptr<MaterialLib::Fluid::FluidProperty> specific_heat_capacity = @@ -56,9 +54,7 @@ std::unique_ptr<FluidProperties> createFluidProperties( createSpecificFluidHeatCapacityModel(heat_capacity_conf); is_cp_density_dependent = (specific_heat_capacity->getName().find("density dependent") != - std::string::npos) - ? true - : false; + std::string::npos); } bool is_KT_density_dependent = false; @@ -69,15 +65,13 @@ std::unique_ptr<FluidProperties> createFluidProperties( config.getConfigSubtreeOptional("thermal_conductivity"); if (thermal_conductivity_opt_conf) { - auto& thermal_conductivity_conf = *thermal_conductivity_opt_conf; + auto const& thermal_conductivity_conf = *thermal_conductivity_opt_conf; thermal_conductivity = MaterialLib::Fluid::createFluidThermalConductivityModel( thermal_conductivity_conf); is_KT_density_dependent = (specific_heat_capacity->getName().find("density dependent") != - std::string::npos) - ? true - : false; + std::string::npos); } if (is_mu_density_dependent || is_cp_density_dependent || diff --git a/MaterialLib/Fluid/FluidProperties/FluidProperties.h b/MaterialLib/Fluid/FluidProperties/FluidProperties.h index f3b20840fbb..8cf352928a7 100644 --- a/MaterialLib/Fluid/FluidProperties/FluidProperties.h +++ b/MaterialLib/Fluid/FluidProperties/FluidProperties.h @@ -48,13 +48,25 @@ public: std::unique_ptr<MaterialLib::Fluid::FluidProperty>&& heat_capacity, std::unique_ptr<MaterialLib::Fluid::FluidProperty>&& thermal_conductivity) - : _property_models{{std::move(density), std::move(viscosity), - std::move(heat_capacity), - std::move(thermal_conductivity)}} + /* Will use this if MS visual studio compiler supports + : _property_models{{std::move(density), std::move(viscosity), + std::move(heat_capacity), + std::move(thermal_conductivity)}} + */ { + // Move to the initialization list if MS visual studio compiler supports + _property_models[static_cast<unsigned>(FluidPropertyType::Density)] = + std::move(density); + _property_models[static_cast<unsigned>(FluidPropertyType::Vicosity)] = + std::move(viscosity); + _property_models[static_cast<unsigned>( + FluidPropertyType::HeatCapacity)] = std::move(heat_capacity); + _property_models[static_cast<unsigned>( + FluidPropertyType::ThermalConductivity)] = + std::move(thermal_conductivity); } - virtual ~FluidProperties(){}; + virtual ~FluidProperties() = default; /** * Get the value of a Property. diff --git a/MaterialLib/Fluid/FluidProperties/FluidPropertiesWithDensityDependentModels.cpp b/MaterialLib/Fluid/FluidProperties/FluidPropertiesWithDensityDependentModels.cpp index 2e5fc5ae4e0..5ba4df620a4 100644 --- a/MaterialLib/Fluid/FluidProperties/FluidPropertiesWithDensityDependentModels.cpp +++ b/MaterialLib/Fluid/FluidProperties/FluidPropertiesWithDensityDependentModels.cpp @@ -47,17 +47,18 @@ double FluidPropertiesWithDensityDependentModels::getValue( switch (property_type) { case FluidPropertyType::Density: - _density_value = - _property_models[static_cast<unsigned>(property_type)] - ->getValue(variable_values); - return _density_value; + return _property_models[static_cast<unsigned>(property_type)] + ->getValue(variable_values); default: { ArrayType var_vals = variable_values; if (_is_density_depedent[static_cast<unsigned>(property_type)]) { var_vals[static_cast<unsigned>(PropertyVariableType::rho)] = - _density_value; + _property_models[static_cast<unsigned>( + FluidPropertyType::Density)] + ->getValue(variable_values); + ; } return _property_models[static_cast<unsigned>(property_type)] ->getValue(var_vals); @@ -79,14 +80,19 @@ double FluidPropertiesWithDensityDependentModels::getdValue( { if (_is_density_depedent[static_cast<unsigned>(property_type)]) { + const double density_value = + _property_models[static_cast<unsigned>( + FluidPropertyType::Density)] + ->getValue(variable_values); + ; if (variable_type == PropertyVariableType::T) { - compute_df_drho_drho_dT(_density_value, property_type, + compute_df_drho_drho_dT(density_value, property_type, variable_values); } else if (variable_type == PropertyVariableType::p) { - compute_df_drho_drho_dp(_density_value, property_type, + compute_df_drho_drho_dp(density_value, property_type, variable_values); } } @@ -111,10 +117,11 @@ double FluidPropertiesWithDensityDependentModels::compute_df_drho_drho_dT( variable_values, PropertyVariableType::T); ArrayType var_vals = variable_values; var_vals[static_cast<unsigned>(PropertyVariableType::rho)] = density_value; - // return d()/dT + d ()/drho * drho/dT const auto& fluid_property_model = _property_models[static_cast<unsigned>(property_type)]; + + // return d()/dT + d ()/drho * drho/dT return fluid_property_model->getdValue(var_vals, PropertyVariableType::T) + fluid_property_model->getdValue(var_vals, PropertyVariableType::rho) * diff --git a/MaterialLib/Fluid/FluidProperties/FluidPropertiesWithDensityDependentModels.h b/MaterialLib/Fluid/FluidProperties/FluidPropertiesWithDensityDependentModels.h index 40111aea417..cb979b54dbe 100644 --- a/MaterialLib/Fluid/FluidProperties/FluidPropertiesWithDensityDependentModels.h +++ b/MaterialLib/Fluid/FluidProperties/FluidPropertiesWithDensityDependentModels.h @@ -13,6 +13,8 @@ #ifndef OGS_FLUID_PROPERTIES_WITH_DENSITY_DEPENDENT_MODELS_H #define OGS_FLUID_PROPERTIES_WITH_DENSITY_DEPENDENT_MODELS_H +#include <atomic> + #include "FluidProperties.h" namespace MaterialLib @@ -68,8 +70,6 @@ public: const PropertyVariableType variable_type) const override; private: - mutable double _density_value = 0.; - /// Compute df/dT for f(T, rho) with rho(T, p) double compute_df_drho_drho_dT(const double density_value, const FluidPropertyType property_type, -- GitLab