diff --git a/Solver/function.cpp b/Solver/function.cpp
index 038b33b7d0c22af74aec6316dd794db45b398465..e927062ccd56f5d6ee1c595a483cdfc9708ec8e3 100644
--- a/Solver/function.cpp
+++ b/Solver/function.cpp
@@ -417,6 +417,65 @@ function *functionSumNew(const function *f0, const function *f1)
   return new functionSum (f0, f1);
 }
 
+// functionLevelset
+
+class functionLevelset : public function {
+ public:
+  fullMatrix<double> _f0;
+  double _valMin, _valPlus;
+  void call(dataCacheMap *m, fullMatrix<double> &val) 
+  {
+    for (int i = 0; i < val.size1(); i++)
+      for (int j = 0; j < val.size2(); j++){
+	val(i, j)= _valPlus;
+	if (_f0(i,j) < 0.0)
+	  val(i,j) = _valMin;
+      }
+  }
+  functionLevelset(const function *f0, const double valMin, const double valPlus) : function(f0->getNbCol()) 
+  {
+    setArgument (_f0, f0);
+    _valMin  = valMin;
+    _valPlus = valPlus;
+  }
+};
+
+function *functionLevelsetNew(const function *f0, const double valMin, const double valPlus) 
+{
+  return new functionLevelset (f0, valMin, valPlus);
+}
+
+class functionLevelsetSmooth : public function {
+ public:
+  fullMatrix<double> _f0;
+  double _valMin, _valPlus, _E;
+  void call(dataCacheMap *m, fullMatrix<double> &val) 
+  {
+    
+    for (int i = 0; i < val.size1(); i++)
+      for (int j = 0; j < val.size2(); j++){
+	double phi = _f0(i,j);
+	double Heps= 0.5+0.5*phi/_E + 0.5/3.14*sin(3.14*phi/_E);
+	if ( fabs(phi) < _E)  val(i, j)= Heps*_valPlus + (1-Heps)*_valMin;
+	else if (phi >  _E)   val(i, j) = _valPlus;
+	else if (phi < -_E)   val(i, j) = _valMin;
+      }
+  }
+  functionLevelsetSmooth(const function *f0, const double valMin, const double valPlus, const double E) : function(f0->getNbCol()) 
+  {
+    setArgument (_f0, f0);
+    _valMin  = valMin;
+    _valPlus = valPlus;
+    _E = E;
+  }
+};
+
+function *functionLevelsetSmoothNew(const function *f0, const double valMin, const double valPlus, const double E) 
+{
+  return new functionLevelsetSmooth (f0, valMin, valPlus, E);
+}
+
+
 // functionProd
 
 class functionProd : public function {
diff --git a/Solver/function.h b/Solver/function.h
index 4392469adb96ea649eef2affbd7e9103249ec10a..407de16ea224fac08cf6ebb3e2e4360dd49539a6 100644
--- a/Solver/function.h
+++ b/Solver/function.h
@@ -291,7 +291,8 @@ class functionC : public function {
   functionC (std::string file, std::string symbol, int nbCol, 
              std::vector<const function *> dependencies);
 };
-
+function *functionLevelsetNew (const function *f0, const double valMin, const double valPlus);
+function *functionLevelsetSmoothNew (const function *f0, const double valMin, const double valPlus, const double E);
 function *functionSumNew (const function *f0, const function *f1);
 function *functionProdNew (const function *f0, const function *f1);
 function *functionScaleNew (const function *f0, const double s);