From 03938997309d83ec5d8c0e15d7a86f17e1c619f2 Mon Sep 17 00:00:00 2001 From: Wolfgang Bangerth Date: Fri, 12 Dec 2014 21:50:36 -0600 Subject: [PATCH] Reorganize code a bit. Change the code so that checking whether a function parser object has already been created now happens at the place where we use the object, rather than as an early exit in the init_muparser() function. I find that this makes the code easier to read. This also allows us to remove the creation of a parser object on the thread where the object is actually created. In many (most) cases, we will simply create the parser later on anyway, but not necessarily. --- source/base/function_parser.cc | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/source/base/function_parser.cc b/source/base/function_parser.cc index ccd7e65659..2faa6ea9fa 100644 --- a/source/base/function_parser.cc +++ b/source/base/function_parser.cc @@ -1,6 +1,6 @@ // --------------------------------------------------------------------- // -// Copyright (C) 2005 - 2013 by the deal.II authors +// Copyright (C) 2005 - 2014 by the deal.II authors // // This file is part of the deal.II library. // @@ -141,9 +141,13 @@ namespace internal template void FunctionParser:: init_muparser() const { - if (fp.get().size()>0) - return; + // check that we have not already initialized the parser on the + // current thread, i.e., that the current function is only called + // once per thread + Assert (fp.get().size()==0, ExcInternalError()); + // initialize the objects for the current thread (fp.get() and + // vars.get()) fp.get().resize(this->n_components); vars.get().resize(var_names.size()); for (unsigned int component=0; componentn_components; ++component) @@ -308,9 +312,14 @@ void FunctionParser::initialize (const std::string &variables, else n_vars = dim; - init_muparser(); + // create a parser object for the current thread we can then query + // in value() and vector_value(). this is not strictly necessary + // because a user may never call these functions on the current + // thread, but it gets us error messages about wrong formulas right + // away + init_muparser (); - // Now set the initialization bit. + // finally set the initialization bit initialized = true; } @@ -373,8 +382,9 @@ double FunctionParser::value (const Point &p, Assert (component < this->n_components, ExcIndexRange(component, 0, this->n_components)); - // initialize if not done so on this thread yet: - init_muparser(); + // initialize the parser if that hasn't happened yet on the current thread + if (fp.get().size() == 0) + init_muparser(); for (unsigned int i=0; i::vector_value (const Point &p, ExcDimensionMismatch (values.size(), this->n_components)); - // initialize if not done so on this thread yet: - init_muparser(); + // initialize the parser if that hasn't happened yet on the current thread + if (fp.get().size() == 0) + init_muparser(); for (unsigned int i=0; i