From ecf4d8358c813b85edfbe0bd39371041fe78b755 Mon Sep 17 00:00:00 2001
From: Thomas Witkowski <thomas.witkowski@gmx.de>
Date: Fri, 26 Sep 2008 13:51:19 +0000
Subject: [PATCH] * AbstractFunction changed to value (not reference) return

---
 demo/src/ball.cc           | 19 +++-----
 demo/src/bunny.cc          | 16 +++----
 demo/src/couple.cc         | 66 ++++++++++++++++------------
 demo/src/ellipt.cc         | 17 +++-----
 demo/src/heat.cc           | 19 +++-----
 demo/src/mpcci1.cc         | 63 ++++++++-------------------
 demo/src/mpccitest.cc      | 21 ++++-----
 demo/src/multigrid.cc      | 18 +++-----
 demo/src/navierstokes.cc   | 27 ++++--------
 demo/src/neumann.cc        | 25 ++++-------
 demo/src/nonlin.cc         | 28 ++++++------
 demo/src/nonlin2.cc        | 88 ++++++--------------------------------
 demo/src/nonlin3.cc        | 35 +++++++--------
 demo/src/parallelellipt.cc | 26 ++++-------
 demo/src/parallelheat.cc   | 25 ++++-------
 demo/src/parametric.cc     | 11 ++---
 demo/src/periodic.cc       | 14 +++---
 demo/src/smitest.cc        |  9 ----
 demo/src/sphere.cc         |  8 ++--
 demo/src/stokesnonlin.cc   | 27 ++++--------
 demo/src/torus.cc          | 12 +++---
 demo/src/vecellipt.cc      | 19 +++-----
 demo/src/vecheat.cc        | 20 +++------
 demo/src/vecmultigrid.cc   | 15 +++----
 demo/src/vecnonlin.cc      | 28 ++++++------
 25 files changed, 231 insertions(+), 425 deletions(-)

diff --git a/demo/src/ball.cc b/demo/src/ball.cc
index 3f8beab0..610e923f 100644
--- a/demo/src/ball.cc
+++ b/demo/src/ball.cc
@@ -18,12 +18,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const
-  {
-    static double result;
-    result = exp(-10.0*(x*x));
-    return result;  
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return exp(-10.0 * (x * x));
+  }
 };
 
 /** \brief
@@ -39,14 +36,12 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result = 0.0;
+  double operator()(const WorldVector<double>& x) const {
     int dim = x.getSize();
-    double r2 = (x*x);
+    double r2 = x * x;
     double ux = exp(-10.0*r2);
-    result = -(400.0*r2 - 20.0*dim)*ux;
-    return result;
-  };
+    return -(400.0 * r2 - 20.0 * dim) * ux;
+  }
 };
 
 // ===========================================================================
diff --git a/demo/src/bunny.cc b/demo/src/bunny.cc
index 8140a25e..3e6506b7 100644
--- a/demo/src/bunny.cc
+++ b/demo/src/bunny.cc
@@ -20,11 +20,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result = 0.0;
-    result = -2 * x[0];
-    return result;
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return -2 * x[0];
+  }
 };
 
 /** \brief
@@ -38,11 +36,11 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result = 10000.0;
-    return result;
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return 10000.0;
+  }
 };
+
 // ===========================================================================
 // ===== main program ========================================================
 // ===========================================================================
diff --git a/demo/src/couple.cc b/demo/src/couple.cc
index cc19311d..91b15d75 100644
--- a/demo/src/couple.cc
+++ b/demo/src/couple.cc
@@ -8,12 +8,9 @@ class G : public AbstractFunction<double, WorldVector<double> >
 public:
   MEMORY_MANAGED(G);
 
-  const double& operator()(const WorldVector<double>& x) const
-  {
-    static double result;
-    result = exp(-10.0*(x*x));
-    return result;  
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return exp(-10.0 * (x * x));
+  }
 };
 
 class F : public AbstractFunction<double, WorldVector<double> >
@@ -23,14 +20,12 @@ public:
 
   F(int degree) : AbstractFunction<double, WorldVector<double> >(degree) {};
 
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result = 0.0;
+  double operator()(const WorldVector<double>& x) const {
     int dow = x.getSize();
-    double r2 = (x*x);
-    double ux = exp(-10.0*r2);
-    result = -(400.0*r2 - 20.0*dow)*ux;
-    return result;
-  };
+    double r2 = (x * x);
+    double ux = exp(-10.0 * r2);
+    return -(400.0 * r2 - 20.0 * dow) * ux;
+  }
 };
 
 class MyCoupledIteration : public ProblemIterationInterface
@@ -39,8 +34,9 @@ public:
   MyCoupledIteration(ProblemStatBase *prob1,
 		     ProblemStatBase *prob2)
     : problem1(prob1),
-      problem2(prob2)
-  {};
+      problem2(prob2),
+      name("MyCoupledIteration")
+  {}
 
   void beginIteration(AdaptInfo *adaptInfo) 
   {
@@ -48,14 +44,14 @@ public:
     MSG("\n");
     MSG("begin of iteration number: %d\n", adaptInfo->getSpaceIteration()+1);
     MSG("=============================\n");
-  };
+  }
 
   void endIteration(AdaptInfo *adaptInfo) {
     FUNCNAME("StandardProblemIteration::endIteration()");
     MSG("\n");
     MSG("end of iteration number: %d\n", adaptInfo->getSpaceIteration()+1);
     MSG("=============================\n");
-  };
+  }
 
   Flag oneIteration(AdaptInfo *adaptInfo, Flag toDo = FULL_ITERATION) 
   {
@@ -71,25 +67,43 @@ public:
 
     if(toDo.isSet(ESTIMATE)) problem1->estimate(adaptInfo);    
     return flag;
-  };
+  }
 
   int getNumProblems() 
   {
     return 2;
-  };
+  }
 
   ProblemStatBase *getProblem(int number = 0) 
   {
     FUNCNAME("CoupledIteration::getProblem()");
-    if(number == 0) return problem1;
-    if(number == 1) return problem2;
+
+    if (number == 0) 
+      return problem1;
+    if (number == 1) 
+      return problem2;
+
     ERROR_EXIT("invalid problem number\n");
     return NULL;
-  };
+  }
+
+  const std::string& getName()
+  {
+    return name;
+  }
+
+  void serialize(std::ostream&)
+  {}
+
+  void deserialize(std::istream&)
+  {}
 
 private:
   ProblemStatBase *problem1;
+
   ProblemStatBase *problem2;
+
+  std::string name;
 };
 
 class Identity : public AbstractFunction<double, double>
@@ -99,11 +113,9 @@ public:
 
   Identity(int degree) : AbstractFunction<double, double>(degree) {};
 
-  const double& operator()(const double& x) const {
-    static double result;
-    result = x;
-    return result;
-  };
+  double operator()(const double& x) const {
+    return x;
+  }
 };
 
 int main(int argc, char* argv[])
diff --git a/demo/src/ellipt.cc b/demo/src/ellipt.cc
index 9ccaf4a4..9d303c63 100644
--- a/demo/src/ellipt.cc
+++ b/demo/src/ellipt.cc
@@ -15,12 +15,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const
-  {
-    static double result;
-    result = exp(-10.0 * (x * x));
-    return result;  
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return exp(-10.0 * (x * x));
+  }
 };
 
 /** \brief
@@ -34,14 +31,12 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result = 0.0;
+  double operator()(const WorldVector<double>& x) const {
     int dow = x.getSize();
     double r2 = (x * x);
     double ux = exp(-10.0 * r2);
-    result = -(400.0 * r2 - 20.0 * dow) * ux;
-    return result;
-  };
+    return -(400.0 * r2 - 20.0 * dow) * ux;
+  }
 };
 
 // // ===== main program // 
diff --git a/demo/src/heat.cc b/demo/src/heat.cc
index c7a1b632..b539fa1f 100644
--- a/demo/src/heat.cc
+++ b/demo/src/heat.cc
@@ -19,11 +19,8 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const
-  {
-    static double result;
-    result = sin(M_PI*(*timePtr)) * exp(-10.0*(x*x));
-    return result;  
+  double operator()(const WorldVector<double>& x) const {
+    return sin(M_PI * (*timePtr)) * exp(-10.0 * (x * x));
   };
 };
 
@@ -41,14 +38,12 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result;
+  double operator()(const WorldVector<double>& x) const {
     int dim = x.getSize();
-    double r2 = (x*x);
-    double ux = sin(M_PI * (*timePtr)) * exp(-10.0*r2);
-    double ut = M_PI * cos(M_PI*(*timePtr)) * exp(-10.0*r2);
-    result = ut -(400.0*r2 - 20.0*dim)*ux;
-    return result;
+    double r2 = x * x;
+    double ux = sin(M_PI * (*timePtr)) * exp(-10.0 * r2);
+    double ut = M_PI * cos(M_PI * (*timePtr)) * exp(-10.0 * r2);
+    return ut -(400.0 * r2 - 20.0 * dim) * ux;
   };
 };
 
diff --git a/demo/src/mpcci1.cc b/demo/src/mpcci1.cc
index 6b4de602..77ea2776 100644
--- a/demo/src/mpcci1.cc
+++ b/demo/src/mpcci1.cc
@@ -18,12 +18,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const
-  {
-    static double result;
-    result = exp(-10.0*(x*x));
-    return result;  
-  };
+  double operator()(const WorldVector<double>& x) const
+    return exp(-10.0 * (x * x));
+  }
 };
 
 /** \brief
@@ -39,59 +36,35 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result = 0.0;
+  double operator()(const WorldVector<double>& x) const {
     int dim = x.getSize();
-    double r2 = (x*x);
-    double ux = exp(-10.0*r2);
-    result = -(400.0*r2 - 20.0*dim)*ux;
-    return result;
-  };
+    double r2 = x * x;
+    double ux = exp(-10.0 * r2);
+    return -(400.0 * r2 - 20.0 * dim) * ux;
+  }
 };
 
 class WaitingProblem : public ProblemScal
 {
 public:
-  WaitingProblem(const char *name) : ProblemScal(name) {};
+  WaitingProblem(const char *name) 
+    : ProblemScal(name) 
+  {}
 
   void solve(AdaptInfo *adaptInfo) {
     FUNCNAME("WaitingProblem::solve()");
 
     static MultiGridSolver *mgSolver = NULL;
 
-    if(!mgSolver) mgSolver = NEW MultiGridSolver(feSpace_, 
-						 NEW GSSmoother(1.0),
-						 systemMatrix_,
-						 solution_,
-						 rhs_);
+    if (!mgSolver) 
+      mgSolver = NEW MultiGridSolver(feSpace_, 
+				     NEW GSSmoother(1.0),
+				     systemMatrix_,
+				     solution_,
+				     rhs_);
 
     mgSolver->solve();
-  };
-
-//   void endIteration(AdaptInfo *adaptInfo) 
-//   {
-//     int myConvergence = 
-//       (adaptInfo->getSpaceIteration() == adaptInfo->getMaxSpaceIteration()) ||
-//       adaptInfo->spaceToleranceReached() ? CCI_STOP : CCI_CONTINUE;
-//     int convergence;
-//     int syncPointID = 1;
-//     int quantityID = 1;
-
-//     ProblemScal::endIteration(adaptInfo);
-
-//     static MpCCIAdapter mpcciAdapter(123, 1, 1, 
-// 				     feSpace_, 1, -1,
-// 				     1, &quantityID, &solution_,
-// 				     1, &syncPointID);
-    
-//     mpcciAdapter.remesh();
-//     mpcciAdapter.checkConvergence(myConvergence, &convergence);
-
-//     mpcciAdapter.putNodes(1);
-//     mpcciAdapter.reachSyncPoint(1);
-
-//     WAIT;
-//   };
+  }
 };
 
 // // ===== main program // 
diff --git a/demo/src/mpccitest.cc b/demo/src/mpccitest.cc
index ec01163d..a09e79f0 100644
--- a/demo/src/mpccitest.cc
+++ b/demo/src/mpccitest.cc
@@ -16,12 +16,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const
-  {
-    static double result;
-    result = exp(-10.0*(x*x));
-    return result;  
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return exp(-10.0 * (x * x));
+  }
 };
 
 /** \brief
@@ -37,14 +34,12 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result = 0.0;
+  double operator()(const WorldVector<double>& x) const {
     int dim = x.getSize();
-    double r2 = (x*x);
-    double ux = exp(-10.0*r2);
-    result = -(400.0*r2 - 20.0*dim)*ux;
-    return result;
-  };
+    double r2 = (x * x);
+    double ux = exp(-10.0 * r2);
+    return -(400.0 * r2 - 20.0 * dim) * ux;
+  }
 };
 
 // // ===== main program // 
diff --git a/demo/src/multigrid.cc b/demo/src/multigrid.cc
index 77f26563..80d001aa 100644
--- a/demo/src/multigrid.cc
+++ b/demo/src/multigrid.cc
@@ -18,12 +18,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const
-  {
-    static double result;
-    result = exp(-10.0*(x*x));
-    return result;  
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return exp(-10.0 * (x * x));
+  }
 };
 
 /** \brief
@@ -39,15 +36,12 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result = 0.0;
+  double operator()(const WorldVector<double>& x) const {
     int dim = x.getSize();
     double r2 = (x*x);
     double ux = exp(-10.0*r2);
-    result = -(400.0*r2 - 20.0*dim)*ux;
-    //    result = 1000 * sin(2*M_PI*x[0])*cos(10*2*M_PI*x[1]);
-    return result;
-  };
+    return -(400.0*r2 - 20.0*dim)*ux;
+  }
 };
 
 // ===== main program // 
diff --git a/demo/src/navierstokes.cc b/demo/src/navierstokes.cc
index 685a83fb..73831a44 100644
--- a/demo/src/navierstokes.cc
+++ b/demo/src/navierstokes.cc
@@ -20,12 +20,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const
-  {
-    static double result;
-    result = x[comp];
-    return result;  
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return x[comp];
+  }
 
 protected:
   /** \brief
@@ -51,12 +48,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const 
-  {
-    static double result = 0.0;
-    result = constant;
-    return result;
-  };
+  double operator()(const WorldVector<double>& x) const  {
+    return constant;
+  }
 
 protected:
   double constant;
@@ -74,12 +68,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const 
-  {
-    static double result = 0.0;
-    result = (x[0] == 0.0) || (x[0] == 1.0) ? 0.0 : 1.0;
-    return result;
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return (x[0] == 0.0) || (x[0] == 1.0) ? 0.0 : 1.0;
+  }
 
 protected:
   double constant;
diff --git a/demo/src/neumann.cc b/demo/src/neumann.cc
index 920827c3..0259a1aa 100644
--- a/demo/src/neumann.cc
+++ b/demo/src/neumann.cc
@@ -8,11 +8,9 @@ class N : public AbstractFunction<double, WorldVector<double> >
 public:
   MEMORY_MANAGED(N);
 
-  const double& operator()(const WorldVector<double>& x) const
-  {
-    static double result = 1.0;
-    return result;  
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return 1.0;
+  }
 };
 
 // ===== function definitions // 
@@ -27,12 +25,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const
-  {
-    static double result;
-    result = exp(-10.0*(x*x));
-    return result;  
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return exp(-10.0 * (x * x));
+  }
 };
 
 /** \brief
@@ -48,14 +43,12 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result = 0.0;
+  double operator()(const WorldVector<double>& x) const {
     int dow = x.getSize();
     double r2 = (x*x);
     double ux = exp(-10.0*r2);
-    result = -(400.0*r2 - 20.0*dow)*ux;
-    return result;
-  };
+    return -(400.0*r2 - 20.0*dow)*ux;
+  }
 };
 
 // // ===== main program // 
diff --git a/demo/src/nonlin.cc b/demo/src/nonlin.cc
index 246bd6b5..00907933 100644
--- a/demo/src/nonlin.cc
+++ b/demo/src/nonlin.cc
@@ -18,11 +18,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result;
-    result = exp(-10.0*(x*x));
-    return result;
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return exp(-10.0*(x*x));
+  }
 };
 
 /** \brief
@@ -43,12 +41,12 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result;
-    double r2 = x*x, ux = exp(-10.0*r2), ux4 = ux*ux*ux*ux;
-    result = sigma*ux4 - k*(400.0*r2 - 20.0*dim)*ux;
-    return result;
-  };
+  double operator()(const WorldVector<double>& x) const {
+    double r2 = x*x;
+    double ux = exp(-10.0*r2);
+    double ux4 = ux*ux*ux*ux;
+    return sigma*ux4 - k*(400.0*r2 - 20.0*dim)*ux;
+  }
 
 private:
   double sigma;
@@ -74,11 +72,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const double& x) const {
-    static double result = 0.0;
-    result = sigma * x * x * x;
-    return result;
-  };
+  double operator()(const double& x) const {
+    return sigma * x * x * x;
+  }
 
 private:
   double sigma;
diff --git a/demo/src/nonlin2.cc b/demo/src/nonlin2.cc
index 0974540f..fc84f16c 100644
--- a/demo/src/nonlin2.cc
+++ b/demo/src/nonlin2.cc
@@ -18,11 +18,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result;
-    result = exp(-10.0*(x*x));
-    return result;
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return exp(-10.0 * (x * x));
+  }
 };
 
 class Zero : public AbstractFunction<double, WorldVector<double> >
@@ -31,8 +29,7 @@ public:
   MEMORY_MANAGED(Zero);
 
   const double& operator()(const WorldVector<double>& x) const {
-    static double result = 0.0;
-    return result;
+    return 0.0;
   };
 };
 
@@ -54,13 +51,13 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result;
+  double operator()(const WorldVector<double>& x) const {
     int dow = x.getSize();
-    double r2 = x*x, ux = exp(-10.0*r2), ux4 = ux*ux*ux*ux;
-    result = ux4 -(400.0*r2 - 20.0*dow)*ux;
-    return result;
-  };
+    double r2 = x*x;
+    double ux = exp(-10.0*r2);
+    double ux4 = ux*ux*ux*ux;
+    return ux4 -(400.0*r2 - 20.0*dow)*ux;
+  }
 };
 
 /** \brief
@@ -76,69 +73,10 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const double& x) const {
-    static double result = 0.0;
-    result = x * x * x;
-    return result;
-  };
-};
-
-#if 0
-class NewtonMethod : public ProblemIterationInterface
-{
-public:
-  NewtonMethod(ProblemScal *problem, ProblemScal *newton)
-    : problemNonlin(problem),
-      newtonStep(newton)
-  {
-    newtonTolerance = 1e-8;
-    newtonMaxIter = 100;
-  };
-
-  
-  Flag oneIteration(AdaptInfo *adaptInfo, Flag toDo = FULL_ITERATION)
-  {
-    Flag flag;
-    DOFVector<double> *correction = newtonStep->getSolution();
-    DOFVector<double> *solution = problemNonlin->getSolution();
-    int newtonIteration = 0;
-    double res = 0.0;
-    do {    
-      newtonIteration++;
-      newtonStep->buildAfterCoarsen(adaptInfo, flag);    
-      newtonStep->solve(adaptInfo);
-      res = correction->L2Norm();
-      *solution -= *correction;
-      MSG("newton iteration %d: residual %f (tol: %f)\n",
-	  newtonIteration, res, newtonTolerance);
-    } while((res > newtonTolerance) && (newtonIteration < newtonMaxIter));    
-  };
-
-  int getNumProblems() { return 2; };
-
-  ProblemStatBase *getProblem(int number = 0) 
-  {
-    FUNCNAME("NewtonMethod::getProblem()");
-    switch(number) {
-    case 0: 
-      return problemNonlin;
-      break;
-    case 1:
-      return newtonStep;
-      break;
-    default:
-      ERROR_EXIT("invalid problem number\n");
-      return NULL;
-    }
-  };
-
-private:
-  ProblemScal *problemNonlin;
-  ProblemScal *newtonStep;
-  double newtonTolerance;
-  int newtonMaxIter;
+  double operator()(const double& x) const {
+    return x * x * x;
+  }
 };
-#endif
 
 // ===========================================================================
 // ===== class NonLin ========================================================
diff --git a/demo/src/nonlin3.cc b/demo/src/nonlin3.cc
index a5971474..b27beea7 100644
--- a/demo/src/nonlin3.cc
+++ b/demo/src/nonlin3.cc
@@ -18,11 +18,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result;
-    result = exp(-10.0*(x*x));
-    return result;
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return exp(-10.0 * (x * x));
+  }
 };
 
 class Zero : public AbstractFunction<double, WorldVector<double> >
@@ -30,10 +28,9 @@ class Zero : public AbstractFunction<double, WorldVector<double> >
 public:
   MEMORY_MANAGED(Zero);
 
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result = 0.0;
-    return result;
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return 0.0;
+  }
 };
 
 /** \brief
@@ -54,13 +51,13 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result;
+  double operator()(const WorldVector<double>& x) const {
     int dow = x.getSize();
-    double r2 = x*x, ux = exp(-10.0*r2), ux4 = ux*ux*ux*ux;
-    result = ux4 -(400.0*r2 - 20.0*dow)*ux;
-    return result;
-  };
+    double r2 = x *x;
+    double ux = exp(-10.0*r2);
+    double ux4 = ux*ux*ux*ux;
+    return ux4 -(400.0*r2 - 20.0*dow)*ux;
+  }
 };
 
 /** \brief
@@ -76,11 +73,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const double& x) const {
-    static double result = 0.0;
-    result = x * x * x;
-    return result;
-  };
+  double operator()(const double& x) const {
+    return x * x * x;
+  }
 };
 
 class NewtonStepInterface
diff --git a/demo/src/parallelellipt.cc b/demo/src/parallelellipt.cc
index 3f9e2f74..dfd85111 100644
--- a/demo/src/parallelellipt.cc
+++ b/demo/src/parallelellipt.cc
@@ -17,12 +17,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const
-  {
-    static double result;
-    result = exp(-10.0*(x*x));
-    return result;  
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return exp(-10.0*(x*x));
+  }
 };
 
 class GrdG : public AbstractFunction<WorldVector<double>, WorldVector<double> >
@@ -32,12 +29,9 @@ class GrdG : public AbstractFunction<WorldVector<double>, WorldVector<double> >
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const WorldVector<double>& operator()(const WorldVector<double>& x) const
-  {
-    static WorldVector<double> result;
-    result = x * -20.0 * exp(-10.0*(x*x));
-    return result;  
-  };
+  WorldVector<double> operator()(const WorldVector<double>& x) const {
+    return x * -20.0 * exp(-10.0*(x*x));
+  }
 };
 
 /** \brief
@@ -53,14 +47,12 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result = 0.0;
+  double operator()(const WorldVector<double>& x) const {
     int dim = x.getSize();
     double r2 = (x*x);
     double ux = exp(-10.0*r2);
-    result = -(400.0*r2 - 20.0*dim)*ux;
-    return result;
-  };
+    return -(400.0*r2 - 20.0*dim)*ux;
+  }
 };
 
 // ===== main program ===== 
diff --git a/demo/src/parallelheat.cc b/demo/src/parallelheat.cc
index 45957be6..808222c7 100644
--- a/demo/src/parallelheat.cc
+++ b/demo/src/parallelheat.cc
@@ -21,18 +21,14 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& argX) const
-  {
+  double operator()(const WorldVector<double>& argX) const {
     WorldVector<double> x = argX;
-    static double result;
     int dim = x.getSize();
-    int i;
-    for(i = 0; i < dim; i++) {
+    for (int i = 0; i < dim; i++) {
       x[i] -= *timePtr;
     }
-    result = sin(M_PI*(*timePtr)) * exp(-10.0*(x*x));
-    return result;  
-  };
+    return sin(M_PI*(*timePtr)) * exp(-10.0*(x*x));
+  }
 };
 
 /** \brief
@@ -49,23 +45,18 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& argX) const {
+  double operator()(const WorldVector<double>& argX) const {
     WorldVector<double> x = argX;
-
-    static double result;
-
     int dim = x.getSize();
-    int i;
-    for(i = 0; i < dim; i++) {
+    for (int i = 0; i < dim; i++) {
       x[i] -= *timePtr;
     }
 
     double r2 = (x*x);
     double ux = sin(M_PI * (*timePtr)) * exp(-10.0*r2);
     double ut = M_PI * cos(M_PI*(*timePtr)) * exp(-10.0*r2);
-    result = ut -(400.0*r2 - 20.0*dim)*ux;
-    return result;
-  };
+    return = ut -(400.0*r2 - 20.0*dim)*ux;
+  }
 };
 
 // ===========================================================================
diff --git a/demo/src/parametric.cc b/demo/src/parametric.cc
index b452a398..1808b6d0 100644
--- a/demo/src/parametric.cc
+++ b/demo/src/parametric.cc
@@ -20,11 +20,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result = 0.0;
-    result = -2 * x[0];
-    return result;
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return -2.0 * x[0];
+  }
 };
 
 /** \brief
@@ -47,8 +45,7 @@ public:
    * destructor
    */
   ~ParametricSphere() {
-    int i;
-    for(i = 0; i < Global::getGeo(WORLD); i++) {
+    for (int i = 0; i < Global::getGeo(WORLD); i++) {
       DELETE parametricCoords[i];
     }
     DELETE parametric;
diff --git a/demo/src/periodic.cc b/demo/src/periodic.cc
index c98501ca..8219a71b 100644
--- a/demo/src/periodic.cc
+++ b/demo/src/periodic.cc
@@ -15,11 +15,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const
-  {
-    static double result = 0.0;
-    return result;
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return 0.0;
+  }
 };
 
 /** \brief
@@ -35,13 +33,11 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result = 0.0;
+  double operator()(const WorldVector<double>& x) const {
     int dim = x.getSize();
     double r2 = (x*x);
     double ux = exp(-10.0*r2);
-    result = -(400.0*r2 - 20.0*dim)*ux;
-    return result;
+    return -(400.0*r2 - 20.0*dim)*ux;
   };
 };
 
diff --git a/demo/src/smitest.cc b/demo/src/smitest.cc
index 004d4fb6..ba939365 100644
--- a/demo/src/smitest.cc
+++ b/demo/src/smitest.cc
@@ -26,17 +26,8 @@ int main(int argc, char* argv[])
   }
   std::cout << std::endl;
 
-
   SMI_Begin_read_transaction(applicationID, 1);
-  
-//   int dim;
-//   SMI_Get_dim_of_coords(applicationID, meshIDs[numMeshes-1], &dim);
-//   std::cout << dim << std::endl;
-
-//   SMI_End_read_transaction(applicationID, 1);
-
   SMI_Remove_application(applicationID);
-
   SMI_Disconnect();
 }
 
diff --git a/demo/src/sphere.cc b/demo/src/sphere.cc
index be03b663..28d7eb0e 100644
--- a/demo/src/sphere.cc
+++ b/demo/src/sphere.cc
@@ -20,11 +20,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result = 0.0;
-    result = -2 * x[0];
-    return result;
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return -2.0 * x[0];
+  }
 };
 
 // ===========================================================================
diff --git a/demo/src/stokesnonlin.cc b/demo/src/stokesnonlin.cc
index bd05f6dc..220bf1a5 100644
--- a/demo/src/stokesnonlin.cc
+++ b/demo/src/stokesnonlin.cc
@@ -20,12 +20,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const
-  {
-    static double result;
-    result = x[comp];
-    return result;  
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return x[comp];
+  }
 
 protected:
   /** \brief
@@ -51,12 +48,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const 
-  {
-    static double result = 0.0;
-    result = constant;
-    return result;
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return constant;
+  }
 
 protected:
   double constant;
@@ -74,12 +68,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const 
-  {
-    static double result = 0.0;
-    result = (x[0] == 0.0) || (x[0] == 1.0) ? 0.0 : 1.0;
-    return result;
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return (x[0] == 0.0) || (x[0] == 1.0) ? 0.0 : 1.0;
+  }
 
 protected:
   double constant;
diff --git a/demo/src/torus.cc b/demo/src/torus.cc
index fa1239d5..6d854270 100644
--- a/demo/src/torus.cc
+++ b/demo/src/torus.cc
@@ -34,15 +34,15 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result = 0.0;
+  double operator()(const WorldVector<double>& x) const {
     WorldVector<double> myX = x;
     YRotation::rotate(myX, -rotation);
-    result = -2 * myX[0];
-    return result;
-  };
+    return -2.0 * myX[0];
+  }
 
-  void rotate(double r) { rotation += r; };
+  void rotate(double r) { 
+    rotation += r; 
+  };
 
 private:
   double rotation;
diff --git a/demo/src/vecellipt.cc b/demo/src/vecellipt.cc
index e6d07b09..02981630 100644
--- a/demo/src/vecellipt.cc
+++ b/demo/src/vecellipt.cc
@@ -18,12 +18,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const
-  {
-    static double result;
-    result = exp(-10.0*(x*x));
-    return result;  
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return exp(-10.0 * (x * x));
+  }
 };
 
 /** \brief
@@ -39,13 +36,11 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result = 0.0;
+  double operator()(const WorldVector<double>& x) const {
     int dim = x.getSize();
-    double r2 = (x*x);
-    double ux = exp(-10.0*r2);
-    result = -(400.0*r2 - 20.0*dim)*ux;
-    return result;
+    double r2 = (x * x);
+    double ux = exp(-10.0 * r2);
+    return -(400.0 * r2 - 20.0 * dim) * ux;
   };
 };
 
diff --git a/demo/src/vecheat.cc b/demo/src/vecheat.cc
index 0fc5f976..86093642 100644
--- a/demo/src/vecheat.cc
+++ b/demo/src/vecheat.cc
@@ -19,11 +19,8 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const
-  {
-    static double result;
-    result = sin(M_PI*(*timePtr)) * exp(-10.0*(x*x));
-    return result;  
+  double operator()(const WorldVector<double>& x) const {
+    return sin(M_PI * (*timePtr)) * exp(-10.0 * (x * x));
   };
 };
 
@@ -41,15 +38,12 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const 
-  {
-    static double result;
+  double operator()(const WorldVector<double>& x) const {
     int dim = x.getSize();
-    double r2 = (x*x);
-    double ux = sin(M_PI * (*timePtr)) * exp(-10.0*r2);
-    double ut = M_PI * cos(M_PI*(*timePtr)) * exp(-10.0*r2);
-    result = ut -(400.0*r2 - 20.0*dim)*ux;
-    return result;
+    double r2 = x * x;
+    double ux = sin(M_PI * (*timePtr)) * exp(-10.0 * r2);
+    double ut = M_PI * cos(M_PI * (*timePtr)) * exp(-10.0 * r2);
+    return ut - (400.0 * r2 - 20.0 * dim) * ux;
   };
 };
 
diff --git a/demo/src/vecmultigrid.cc b/demo/src/vecmultigrid.cc
index 863721ac..44b6970b 100644
--- a/demo/src/vecmultigrid.cc
+++ b/demo/src/vecmultigrid.cc
@@ -19,12 +19,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const
-  {
-    static double result;
-    result = exp(-10.0*(x*x));
-    return result;  
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return exp(-10.0*(x*x));
+  }
 };
 
 /** \brief
@@ -40,13 +37,11 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result = 0.0;
+  double operator()(const WorldVector<double>& x) const {
     int dim = x.getSize();
     double r2 = (x*x);
     double ux = exp(-10.0*r2);
-    result = -(400.0*r2 - 20.0*dim)*ux;
-    return result;
+    return -(400.0*r2 - 20.0*dim)*ux;
   };
 };
 
diff --git a/demo/src/vecnonlin.cc b/demo/src/vecnonlin.cc
index a3922a9a..162c16ba 100644
--- a/demo/src/vecnonlin.cc
+++ b/demo/src/vecnonlin.cc
@@ -18,11 +18,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result;
-    result = exp(-10.0*(x*x));
-    return result;
-  };
+  double operator()(const WorldVector<double>& x) const {
+    return exp(-10.0*(x*x));
+  }
 };
 
 /** \brief
@@ -43,12 +41,12 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const WorldVector<double>& x) const {
-    static double result;
-    double r2 = x*x, ux = exp(-10.0*r2), ux4 = ux*ux*ux*ux;
-    result = sigma*ux4 - k*(400.0*r2 - 20.0*dim)*ux;
-    return result;
-  };
+  double operator()(const WorldVector<double>& x) const {
+    double r2 = x*x;
+    double ux = exp(-10.0*r2);
+    double ux4 = ux*ux*ux*ux;
+    return sigma*ux4 - k*(400.0*r2 - 20.0*dim)*ux;
+  }
 
 private:
   double sigma;
@@ -74,11 +72,9 @@ public:
   /** \brief
    * Implementation of AbstractFunction::operator().
    */
-  const double& operator()(const double& x) const {
-    static double result = 0.0;
-    result = sigma * x * x * x;
-    return result;
-  };
+  double operator()(const double& x) const {
+    return sigma * x * x * x;
+  }
 
 private:
   double sigma;
-- 
GitLab