diff --git a/MaterialLib/MPL/Properties/Function.cpp b/MaterialLib/MPL/Properties/Function.cpp index 65897c1c11cc9d0d967393e773b8c3b7321c35f5..2c256f7935c71a15ecdc88abf1707fa886f1004c 100644 --- a/MaterialLib/MPL/Properties/Function.cpp +++ b/MaterialLib/MPL/Properties/Function.cpp @@ -77,13 +77,18 @@ static void updateVariableValues( static PropertyDataType evaluateExpressions( std::vector<std::pair<Variable, double*>> const& symbol_values, VariableArray const& variable_array, - std::vector<exprtk::expression<double>> const& expressions) + std::vector<exprtk::expression<double>> const& expressions, + std::mutex& mutex) { - updateVariableValues(symbol_values, variable_array); - std::vector<double> result(expressions.size()); - std::transform(begin(expressions), end(expressions), begin(result), - [](auto const& e) { return e.value(); }); + + { + std::lock_guard lock_guard(mutex); + updateVariableValues(symbol_values, variable_array); + + std::transform(begin(expressions), end(expressions), begin(result), + [](auto const& e) { return e.value(); }); + } switch (result.size()) { @@ -187,7 +192,7 @@ PropertyDataType Function::value(VariableArray const& variable_array, double const /*t*/, double const /*dt*/) const { return evaluateExpressions(symbol_values_, variable_array, - value_expressions_); + value_expressions_, mutex_); } PropertyDataType Function::dValue(VariableArray const& variable_array, @@ -208,7 +213,8 @@ PropertyDataType Function::dValue(VariableArray const& variable_array, variable_enum_to_string[static_cast<int>(variable)], name_); } - return evaluateExpressions(symbol_values_, variable_array, it->second); + return evaluateExpressions(symbol_values_, variable_array, it->second, + mutex_); } } // namespace MaterialPropertyLib diff --git a/MaterialLib/MPL/Properties/Function.h b/MaterialLib/MPL/Properties/Function.h index 49263d67987fe5b1c2322c955ec26a7ecfb600d1..f7ec49e35be47dc19235429a5760a648f3e5a745 100644 --- a/MaterialLib/MPL/Properties/Function.h +++ b/MaterialLib/MPL/Properties/Function.h @@ -55,5 +55,7 @@ private: /// Multiple expressions are representing vector-valued functions. std::vector<std::pair<Variable, std::vector<Expression>>> dvalue_expressions_; + + mutable std::mutex mutex_; }; } // namespace MaterialPropertyLib