]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Add guarentee that wrapper resets time state of wrapped class
authorJean-Paul Pelteret <jppelteret@gmail.com>
Wed, 24 Oct 2018 12:10:28 +0000 (14:10 +0200)
committerDenis Davydov <davydden@gmail.com>
Fri, 26 Oct 2018 22:00:32 +0000 (00:00 +0200)
include/deal.II/base/incremental_function.h
source/base/incremental_function.cc

index a69af70e00e6fb9cc7bdb35f58fe0c28838144ee..abd963e4238311d11bde366380db97aa8c2f42cd 100644 (file)
@@ -62,6 +62,9 @@ namespace Functions
      * @note This class stores a non-constant reference to @p base
      * and will call <code>base.set_time()</code> during evaluation
      * in order to evaluate the @p base class at any arbitrary time.
+     * It is guaranteed that the temporal state of @p base is returned
+     * to its original settings after each function evaluation in this
+     * class.
      */
     IncrementalFunction(Function<dim, RangeNumberType> &base);
 
index 027424e6d9ccdc3d5426ca671de57d0458d15177..f5e23b1c40c2d4040ac91efc3b5ea0a06f5add5b 100644 (file)
@@ -43,6 +43,30 @@ namespace Functions
 
 
 
+  template <int dim, typename RangeNumberType>
+  RangeNumberType
+  IncrementalFunction<dim, RangeNumberType>::value(const Point<dim> &p,
+                                                   unsigned int      comp) const
+  {
+    // Cache the time state of the base class in case it has been changed
+    // within the user code. We reset the wrapped function to the original
+    // state once we're done with our own evaluations.
+    const auto orig_time = base.get_time();
+
+    base.set_time(this->get_time());
+    const RangeNumberType current = base.value(p, comp);
+
+    base.set_time(this->get_time() - delta_t);
+    const RangeNumberType old = base.value(p, comp);
+
+    // Reset wrapped function time setting
+    base.set_time(orig_time);
+
+    return current - old;
+  }
+
+
+
   template <int dim, typename RangeNumberType>
   void
   IncrementalFunction<dim, RangeNumberType>::vector_value(
@@ -53,6 +77,11 @@ namespace Functions
     // the data via a mutex
     std::lock_guard<std::mutex> lock(mutex);
 
+    // Cache the time state of the base class in case it has been changed
+    // within the user code. We reset the wrapped function to the original
+    // state once we're done with our own evaluations.
+    const auto orig_time = base.get_time();
+
     base.set_time(this->get_time());
     base.vector_value(p, values);
 
@@ -60,22 +89,9 @@ namespace Functions
     base.vector_value(p, values_old);
 
     values -= values_old;
-  }
-
-
 
-  template <int dim, typename RangeNumberType>
-  RangeNumberType
-  IncrementalFunction<dim, RangeNumberType>::value(const Point<dim> &p,
-                                                   unsigned int      comp) const
-  {
-    base.set_time(this->get_time());
-    const RangeNumberType current = base.value(p, comp);
-
-    base.set_time(this->get_time() - delta_t);
-    const RangeNumberType old = base.value(p, comp);
-
-    return current - old;
+    // Reset wrapped function time setting
+    base.set_time(orig_time);
   }
 
 

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.