]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Reorganize code a bit.
authorWolfgang Bangerth <bangerth@math.tamu.edu>
Sat, 13 Dec 2014 03:50:36 +0000 (21:50 -0600)
committerWolfgang Bangerth <bangerth@math.tamu.edu>
Sun, 14 Dec 2014 12:55:08 +0000 (06:55 -0600)
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

index ccd7e65659d2dad9b853506dff5f66d7786f8b61..2faa6ea9fabd33fd549379a980b9c8fcec5eceed 100644 (file)
@@ -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 <int dim>
 void FunctionParser<dim>:: 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; component<this->n_components; ++component)
@@ -308,9 +312,14 @@ void FunctionParser<dim>::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<dim>::value (const Point<dim>  &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<dim; ++i)
     vars.get()[i] = p(i);
@@ -408,8 +418,9 @@ void FunctionParser<dim>::vector_value (const Point<dim> &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<dim; ++i)
     vars.get()[i] = p(i);

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.