28 #ifdef DEAL_II_WITH_MUPARSER
29 # include <muParser.h>
41 return static_cast<int>(val + ((val >= 0.0) ? 0.5 : -0.5));
48 const double thenvalue,
49 const double elsevalue)
60 mu_or(
const double left,
const double right)
62 return static_cast<double>((
mu_round(left) != 0) ||
69 mu_and(
const double left,
const double right)
71 return static_cast<double>((
mu_round(left) != 0) &&
104 return 1.0 / std::tan(
value);
112 return 1.0 / std::sin(
value);
120 return 1.0 / std::cos(
value);
128 return std::log(
value);
136 return std::pow(a,
b);
162 static std::mutex rand_mutex;
163 std::lock_guard<std::mutex> lock(rand_mutex);
165 std::uniform_real_distribution<> uniform_distribution(0., 1.);
169 static std::map<double, std::mt19937> rng_map;
171 if (rng_map.find(seed) == rng_map.end())
172 rng_map[seed] = std::mt19937(
static_cast<unsigned int>(seed));
174 return uniform_distribution(rng_map[seed]);
182 static std::mutex rand_mutex;
183 std::lock_guard<std::mutex> lock(rand_mutex);
184 std::uniform_real_distribution<> uniform_distribution(0., 1.);
185 const unsigned int seed =
static_cast<unsigned long>(std::time(
nullptr));
186 static std::mt19937 rng(seed);
187 return uniform_distribution(rng);
192 std::vector<std::string>
237 #ifdef DEAL_II_WITH_MUPARSER
244 operator mu::Parser &()
249 operator const mu::Parser &()
const
261 template <
int dim,
typename Number>
269 template <
int dim,
typename Number>
272 const std::string &variables,
273 const std::vector<std::string> &expressions,
274 const std::map<std::string, double> &constants,
275 const bool time_dependent)
277 this->parser_data.clear();
279 this->constants = constants;
281 this->expressions = expressions;
282 AssertThrow(((time_dependent) ? dim + 1 : dim) == this->var_names.size(),
292 this->n_vars = dim + 1;
300 this->init_muparser();
301 this->initialized =
true;
306 template <
int dim,
typename Number>
310 #ifdef DEAL_II_WITH_MUPARSER
316 const unsigned int n_components = expressions.size();
319 data.
parsers.reserve(n_components);
320 data.
vars.resize(this->var_names.size());
321 for (
unsigned int component = 0; component < n_components; ++component)
323 data.
parsers.emplace_back(std::make_unique<Parser>());
324 mu::Parser &parser =
dynamic_cast<Parser &
>(*data.
parsers.back());
326 for (
const auto &
constant : this->constants)
329 for (
unsigned int iv = 0; iv < this->var_names.size(); ++iv)
330 parser.DefineVar(this->var_names[iv], &data.
vars[iv]);
333 parser.DefineFun(
"if",
mu_if,
true);
334 parser.DefineOprt(
"|",
mu_or, 1);
335 parser.DefineOprt(
"&",
mu_and, 2);
336 parser.DefineFun(
"int",
mu_int,
true);
337 parser.DefineFun(
"ceil",
mu_ceil,
true);
338 parser.DefineFun(
"cot",
mu_cot,
true);
339 parser.DefineFun(
"csc",
mu_csc,
true);
340 parser.DefineFun(
"floor",
mu_floor,
true);
341 parser.DefineFun(
"sec",
mu_sec,
true);
342 parser.DefineFun(
"log",
mu_log,
true);
343 parser.DefineFun(
"pow",
mu_pow,
true);
344 parser.DefineFun(
"erfc",
mu_erfc,
true);
348 parser.DefineFun(
"rand",
mu_rand,
false);
359 std::string transformed_expression = this->expressions[component];
363 const unsigned int function_name_length =
364 current_function_name.size();
371 transformed_expression.find(current_function_name, pos);
372 if (pos == std::string::npos)
377 (pos + function_name_length <
378 transformed_expression.size()) &&
379 ((transformed_expression[pos + function_name_length] ==
381 (transformed_expression[pos + function_name_length] ==
383 transformed_expression.erase(
384 transformed_expression.begin() + pos +
385 function_name_length);
389 pos += function_name_length;
394 parser.SetExpr(transformed_expression);
396 catch (mu::ParserError &
e)
398 std::cerr <<
"Message: <" <<
e.GetMsg() <<
">\n";
399 std::cerr <<
"Formula: <" <<
e.GetExpr() <<
">\n";
400 std::cerr <<
"Token: <" <<
e.GetToken() <<
">\n";
401 std::cerr <<
"Position: <" <<
e.GetPos() <<
">\n";
402 std::cerr <<
"Errc: <" <<
e.GetCode() <<
">" << std::endl;
411 template <
int dim,
typename Number>
415 unsigned int component)
const
417 #ifdef DEAL_II_WITH_MUPARSER
423 if (data.
vars.empty())
426 for (
unsigned int i = 0; i < dim; ++i)
428 if (dim != this->n_vars)
429 data.
vars[dim] = time;
436 mu::Parser &parser =
static_cast<Parser &
>(*data.
parsers[component]);
437 return parser.Eval();
439 catch (mu::ParserError &
e)
441 std::cerr <<
"Message: <" <<
e.GetMsg() <<
">\n";
442 std::cerr <<
"Formula: <" <<
e.GetExpr() <<
">\n";
443 std::cerr <<
"Token: <" <<
e.GetToken() <<
">\n";
444 std::cerr <<
"Position: <" <<
e.GetPos() <<
">\n";
445 std::cerr <<
"Errc: <" <<
e.GetCode() <<
">" << std::endl;
455 return std::numeric_limits<double>::signaling_NaN();
458 template <
int dim,
typename Number>
465 #ifdef DEAL_II_WITH_MUPARSER
471 if (data.
vars.empty())
474 for (
unsigned int i = 0; i < dim; ++i)
476 if (dim != this->n_vars)
477 data.
vars[dim] = time;
482 for (
unsigned int component = 0; component < data.
parsers.size();
491 values[component] = parser.Eval();
494 catch (mu::ParserError &
e)
496 std::cerr <<
"Message: <" <<
e.GetMsg() <<
">\n";
497 std::cerr <<
"Formula: <" <<
e.GetExpr() <<
">\n";
498 std::cerr <<
"Token: <" <<
e.GetToken() <<
">\n";
499 std::cerr <<
"Position: <" <<
e.GetPos() <<
">\n";
500 std::cerr <<
"Errc: <" <<
e.GetCode() <<
">" << std::endl;
512 #include "mu_parser_internal.inst"
Number do_value(const Point< dim > &p, const double time, unsigned int component) const
void init_muparser() const
void do_all_values(const Point< dim > &p, const double time, ArrayView< Number > &values) const
virtual void initialize(const std::string &vars, const std::vector< std::string > &expressions, const std::map< std::string, double > &constants, const bool time_dependent=false)
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcNotInitialized()
#define Assert(cond, exc)
static ::ExceptionBase & ExcParseError(int arg1, std::string arg2)
#define AssertDimension(dim1, dim2)
static ::ExceptionBase & ExcNeedsFunctionparser()
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
Expression ceil(const Expression &x)
Expression floor(const Expression &x)
Expression erfc(const Expression &x)
Expression erf(const Expression &x)
types::global_dof_index size_type
SymmetricTensor< 2, dim, Number > e(const Tensor< 2, dim, Number > &F)
SymmetricTensor< 2, dim, Number > b(const Tensor< 2, dim, Number > &F)
std::vector< std::string > split_string_list(const std::string &s, const std::string &delimiter=",")
double mu_if(double condition, double thenvalue, double elsevalue)
double mu_erf(double value)
double mu_sec(double value)
double mu_floor(double value)
double mu_csc(double value)
double mu_pow(double a, double b)
double mu_log(double value)
double mu_rand_seed(double seed)
double mu_ceil(double value)
std::vector< std::string > get_function_names()
double mu_cot(double value)
double mu_int(double value)
double mu_or(double left, double right)
double mu_and(double left, double right)
double mu_erfc(double value)
std::vector< double > vars
std::vector< std::unique_ptr< muParserBase > > parsers