From 9aa8d2f3d4644401bdac327e81b99d48f0174eb3 Mon Sep 17 00:00:00 2001
From: Akash Anand <akasha@iitk.ac.in>
Date: Tue, 7 Aug 2007 21:58:51 +0000
Subject: [PATCH] moving FourierModel to its new home :-)

---
 contrib/FourierModel/BlendOperator.cpp        | 453 --------
 contrib/FourierModel/BlendOperator.h          |  60 --
 contrib/FourierModel/BlendedPatch.cpp         | 880 ----------------
 contrib/FourierModel/BlendedPatch.h           | 104 --
 contrib/FourierModel/ContinuationPatch.cpp    | 933 -----------------
 contrib/FourierModel/ContinuationPatch.h      |  77 --
 contrib/FourierModel/Curve.cpp                |  13 -
 contrib/FourierModel/Curve.h                  |  27 -
 .../CylindricalProjectionSurface.cpp          | 274 -----
 .../CylindricalProjectionSurface.h            |  88 --
 contrib/FourierModel/ExactPatch.cpp           |  76 --
 contrib/FourierModel/ExactPatch.h             |  36 -
 contrib/FourierModel/FCurve.cpp               |  96 --
 contrib/FourierModel/FCurve.h                 |  64 --
 contrib/FourierModel/FM_Edge.cpp              | 124 ---
 contrib/FourierModel/FM_Edge.h                |  52 -
 contrib/FourierModel/FM_Face.cpp              | 161 ---
 contrib/FourierModel/FM_Face.h                |  50 -
 contrib/FourierModel/FM_Info.cpp              |  28 -
 contrib/FourierModel/FM_Info.h                |  65 --
 contrib/FourierModel/FM_Reader.cpp            | 171 ---
 contrib/FourierModel/FM_Reader.h              |  49 -
 contrib/FourierModel/FM_Vertex.cpp            |   2 -
 contrib/FourierModel/FM_Vertex.h              |  30 -
 contrib/FourierModel/FPatch.cpp               | 979 ------------------
 contrib/FourierModel/FPatch.h                 |  96 --
 contrib/FourierModel/IntersectionCurve.cpp    | 367 -------
 contrib/FourierModel/IntersectionCurve.h      |  44 -
 contrib/FourierModel/Main.cpp                 | 117 ---
 contrib/FourierModel/Makefile                 |  91 --
 contrib/FourierModel/Message.cpp              | 163 ---
 contrib/FourierModel/Message.h                |  40 -
 .../ParaboloidProjectionSurface.cpp           | 209 ----
 .../ParaboloidProjectionSurface.h             |  66 --
 contrib/FourierModel/PartitionOfUnity.cpp     |   1 -
 contrib/FourierModel/PartitionOfUnity.h       | 140 ---
 contrib/FourierModel/Patch.cpp                |  85 --
 contrib/FourierModel/Patch.h                  | 120 ---
 .../FourierModel/PlaneProjectionSurface.cpp   | 183 ----
 contrib/FourierModel/PlaneProjectionSurface.h |  77 --
 contrib/FourierModel/ProjectionSurface.cpp    | 357 -------
 contrib/FourierModel/ProjectionSurface.h      | 150 ---
 .../RevolvedParabolaProjectionSurface.cpp     | 267 -----
 .../RevolvedParabolaProjectionSurface.h       |  74 --
 contrib/FourierModel/Utils.cpp                | 345 ------
 contrib/FourierModel/Utils.h                  |  18 -
 46 files changed, 7902 deletions(-)
 delete mode 100755 contrib/FourierModel/BlendOperator.cpp
 delete mode 100755 contrib/FourierModel/BlendOperator.h
 delete mode 100755 contrib/FourierModel/BlendedPatch.cpp
 delete mode 100755 contrib/FourierModel/BlendedPatch.h
 delete mode 100644 contrib/FourierModel/ContinuationPatch.cpp
 delete mode 100644 contrib/FourierModel/ContinuationPatch.h
 delete mode 100644 contrib/FourierModel/Curve.cpp
 delete mode 100644 contrib/FourierModel/Curve.h
 delete mode 100755 contrib/FourierModel/CylindricalProjectionSurface.cpp
 delete mode 100755 contrib/FourierModel/CylindricalProjectionSurface.h
 delete mode 100644 contrib/FourierModel/ExactPatch.cpp
 delete mode 100644 contrib/FourierModel/ExactPatch.h
 delete mode 100644 contrib/FourierModel/FCurve.cpp
 delete mode 100644 contrib/FourierModel/FCurve.h
 delete mode 100644 contrib/FourierModel/FM_Edge.cpp
 delete mode 100644 contrib/FourierModel/FM_Edge.h
 delete mode 100644 contrib/FourierModel/FM_Face.cpp
 delete mode 100644 contrib/FourierModel/FM_Face.h
 delete mode 100644 contrib/FourierModel/FM_Info.cpp
 delete mode 100644 contrib/FourierModel/FM_Info.h
 delete mode 100644 contrib/FourierModel/FM_Reader.cpp
 delete mode 100644 contrib/FourierModel/FM_Reader.h
 delete mode 100644 contrib/FourierModel/FM_Vertex.cpp
 delete mode 100644 contrib/FourierModel/FM_Vertex.h
 delete mode 100644 contrib/FourierModel/FPatch.cpp
 delete mode 100644 contrib/FourierModel/FPatch.h
 delete mode 100644 contrib/FourierModel/IntersectionCurve.cpp
 delete mode 100644 contrib/FourierModel/IntersectionCurve.h
 delete mode 100644 contrib/FourierModel/Main.cpp
 delete mode 100644 contrib/FourierModel/Makefile
 delete mode 100644 contrib/FourierModel/Message.cpp
 delete mode 100644 contrib/FourierModel/Message.h
 delete mode 100755 contrib/FourierModel/ParaboloidProjectionSurface.cpp
 delete mode 100755 contrib/FourierModel/ParaboloidProjectionSurface.h
 delete mode 100755 contrib/FourierModel/PartitionOfUnity.cpp
 delete mode 100755 contrib/FourierModel/PartitionOfUnity.h
 delete mode 100644 contrib/FourierModel/Patch.cpp
 delete mode 100644 contrib/FourierModel/Patch.h
 delete mode 100755 contrib/FourierModel/PlaneProjectionSurface.cpp
 delete mode 100755 contrib/FourierModel/PlaneProjectionSurface.h
 delete mode 100755 contrib/FourierModel/ProjectionSurface.cpp
 delete mode 100755 contrib/FourierModel/ProjectionSurface.h
 delete mode 100755 contrib/FourierModel/RevolvedParabolaProjectionSurface.cpp
 delete mode 100755 contrib/FourierModel/RevolvedParabolaProjectionSurface.h
 delete mode 100755 contrib/FourierModel/Utils.cpp
 delete mode 100755 contrib/FourierModel/Utils.h

diff --git a/contrib/FourierModel/BlendOperator.cpp b/contrib/FourierModel/BlendOperator.cpp
deleted file mode 100755
index a29c52dfd3..0000000000
--- a/contrib/FourierModel/BlendOperator.cpp
+++ /dev/null
@@ -1,453 +0,0 @@
-#include "BlendOperator.h"
-
-using namespace FM;
-
-bool BlendOperator::GetPointOnPatch_
-(int i, double u, double v, int j, double &x, double &y, double &z)
-{
-  double h = 1.e-8;
-  double tol = 1.e-12;
-
-  u = GetPatch(i)->RescaleU(u);
-  v = GetPatch(i)->RescaleV(v);
-
-  double P[3], d[3];
-  GetPatch(i)->GetProjectionSurface()->F(u,v,P[0],P[1],P[2]);
-  GetPatch(i)->GetProjectionSurface()->GetUnitNormal(u,v,d[0],d[1],d[2]);
-
-  u = GetPatch(i)->UnscaleU(u);
-  v = GetPatch(i)->UnscaleV(v);
-
-  double e1[3],e2[3];
-
-  if (std::abs(1.-std::abs(d[0])) < tol) {
-    e1[0] = 0.;
-    e1[1] = 1.;
-    e1[2] = 0.;
-  }
-  else if (std::abs(1.-std::abs(d[1])) < tol) {
-    e1[0] = 0.;
-    e1[1] = 0.;
-    e1[2] = 1.;
-  }
-  else if (std::abs(1.-std::abs(d[2])) < tol) {
-    e1[0] = 1.;
-    e1[1] = 0.;
-    e1[2] = 0.;
-  }
-  else {
-    e1[0] = - d[1] * d[2];
-    e1[1] = 2 * d[2] * d[0];
-    e1[2] = - d[0] * d[1];
-  }
-  double value = 0.;
-  for (int l=0;l<3;l++)
-    value += e1[l] * e1[l];
-  value = sqrt(value);
-  for (int l=0;l<3;l++)
-    e1[l] /= value;
-
-  e2[0] = d[1] * e1[2] - d[2] * e1[1];
-  e2[1] = d[2] * e1[0] - d[0] * e1[2];
-  e2[2] = d[0] * e1[1] - d[1] * e1[0];
-
-  bool converged = false;
-
-  double R[3];
-  GetPatch(i)->F(u,v,R[0],R[1],R[2]);
-
-  double Qu,Qv;
-  GetPatch(j)->GetProjectionSurface()->
-    OrthoProjectionOnSurface(R[0],R[1],R[2],Qu,Qv);
-
-  Qu = GetPatch(j)->UnscaleU(Qu);
-  Qv = GetPatch(j)->UnscaleV(Qv);
-
-  double Q[3];
-  GetPatch(j)->F(Qu,Qv,Q[0],Q[1],Q[2]);
-
-  int maxTotalIteration = 10;
-  int totalIterationCounter = 0;
-
-  while ((!converged) && (totalIterationCounter < maxTotalIteration)) {
-    totalIterationCounter++;
-    double QminusP[3];
-    for (int l=0;l<3;l++)
-      QminusP[l] = Q[l] - P[l];
-
-    double f[2];
-    f[0] = (QminusP[0] * e1[0] + QminusP[1] * e1[1] + QminusP[2] * e1[2]);
-    f[1] = (QminusP[0] * e2[0] + QminusP[1] * e2[1] + QminusP[2] * e2[2]);
-
-    //printf("(%g,%g) :: f = (%g,%g)\n",u,v,f[0],f[1]);
-
-    if ((std::abs(f[0]) < tol) && (std::abs(f[1]) < tol)) {
-      //bool IsGood = true;
-      
-      bool IsGood = GetPatch(i)->GetProjectionSurface()->
-      OrthoProjectionOnSurface(Q[0],Q[1],Q[2],u,v);
-      if (IsGood) {
-	double RR[3];
-	//printf("(u,v) = (%g,%g); (Qu,Qv) = (%g,%g)\n",u,v,Qu,Qv);
-	u = GetPatch(i)->UnscaleU(u);
-	v = GetPatch(i)->UnscaleV(v);
-	GetPatch(i)->F(u,v,RR[0],RR[1],RR[2]);
-	double dist = 0.;
-	for (int l=0;l<3;l++)
-	  dist += (RR[l] - R[l]) * (RR[l] - R[l]);
-	dist = sqrt(dist);
-	if (dist > 1.e-2)
-	  break;
-	else {
-	  //printf("R = (%g,%g,%g); RR = (%g,%g,%g)\n\n",
-	  // R[0],R[1],R[2],RR[0],RR[1],RR[2]);
-	  converged = true;
-	  x = Q[0]; y = Q[1]; z = Q[2];
-	}
-	converged = true;
-	x = Q[0]; y = Q[1]; z = Q[2];
-      }
-      else
-	break;
-    }
-    else {
-      double QuPlus = Qu + h;
-      double QvPlus = Qv + h;
-      if (GetPatch(j)->IsUPeriodic())
-	QuPlus -= std::floor(QuPlus);
-      if (GetPatch(j)->IsVPeriodic())
-	QvPlus -= std::floor(QvPlus);
-
-      double QplusU[3], QplusV[3];
-      GetPatch(j)->F(QuPlus,Qv,QplusU[0],QplusU[1],QplusU[2]);
-      GetPatch(j)->F(Qu,QvPlus,QplusV[0],QplusV[1],QplusV[2]);
-
-      double QplusUminusP[3], QplusVminusP[3];
-      for (int l=0;l<3;l++) {
-	QplusUminusP[l] = QplusU[l] - P[l];
-	QplusVminusP[l] = QplusV[l] - P[l];
-      }
-
-      double fuPlus[2], fvPlus[2];
-      fuPlus[0] = (QplusUminusP[0] * e1[0] + QplusUminusP[1] * e1[1] + 
-		   QplusUminusP[2] * e1[2]);
-      fuPlus[1] = (QplusUminusP[0] * e2[0] + QplusUminusP[1] * e2[1] + 
-		   QplusUminusP[2] * e2[2]);
-      fvPlus[0] = (QplusVminusP[0] * e1[0] + QplusVminusP[1] * e1[1] + 
-		   QplusVminusP[2] * e1[2]);
-      fvPlus[1] = (QplusVminusP[0] * e2[0] + QplusVminusP[1] * e2[1] + 
-		   QplusVminusP[2] * e2[2]);
-
-      double D[2][2];
-      D[0][0] = (fuPlus[0] - f[0]) / h;
-      D[0][1] = (fvPlus[0] - f[0]) / h;
-      D[1][0] = (fuPlus[1] - f[1]) / h;
-      D[1][1] = (fvPlus[1] - f[1]) / h;
-
-      double det = D[0][0] * D[1][1] - D[0][1] * D[1][0];
-      double update[2];
-      update[0] = (D[1][1] * f[0] - D[0][1] * f[1]) / det;
-      update[1] = (D[0][0] * f[1] - D[1][0] * f[0]) / det;
-
-      //printf("update = (%g,%g)\n",update[0],update[1]);
-
-      Qu -= update[0];
-      Qv -= update[1];
-
-      //printf("Q1 = (%g,%g)\n",Qu,Qv);
-
-      if (GetPatch(j)->IsUPeriodic())
-	Qu -= std::floor(Qu);
-      if (GetPatch(j)->IsVPeriodic())
-	Qv -= std::floor(Qv);
-
-      //printf("Q2 = (%g,%g)\n",Qu,Qv);
-
-      GetPatch(j)->F(Qu,Qv,Q[0],Q[1],Q[2]);
-    }
-  }
-    
-  return converged;
-}
-
-bool BlendOperator::E
-(int i, int j, double u, double v, double &x, double &y, double &z)
-{
-  bool found = false;
-
-  if (DoPatchesOverlap(i,j)) {
-    GetPatch(i)->F(u,v,x,y,z);
-    //if (1) {
-    if (IsPointInIntersectionBoundingBox(i,j,x,y,z)) {
-      if (GetPatch(i)->GetProjectionSurface()->GetTag() == 
-	  GetPatch(j)->GetProjectionSurface()->GetTag()) {
-	found = GetPatch(j)->Inverse(x,y,z,u,v);
-      }
-      else {
-	int tag = GetProjectionSurfaceTagForOverlap(i,j);
-	if (GetPatch(i)->GetProjectionSurface()->GetTag() == tag) {
-	  found = GetPointOnPatch_(i,u,v,j,x,y,z);
-	  if (!GetPatch(j)->Inverse(x,y,z,u,v))
-	    found = false;
-	}
-	else if (GetPatch(j)->GetProjectionSurface()->GetTag() == tag) {
-	  found = GetPatch(j)->GetProjectionSurface()->
-	    OrthoProjectionOnSurface(x,y,z,u,v);
-	  if (found) {
-	    u = GetPatch(j)->UnscaleU(u);
-	    v = GetPatch(j)->UnscaleV(v);
-	    double tol = 1.e-12;
-	    if ((u > - tol)&&(u < 1. + tol)&&(v > - tol)&&(v < 1. + tol)) {
-	      found = true;
-	      GetPatch(j)->F(u,v,x,y,z);
-	    }
-	    else
-	      found = false;
-	  }
-	}
-	else {
-	  found = E(i,tag,u,v,x,y,z);
-	  if (found) {
-	    found = GetPatch(tag)->Inverse(x,y,z,u,v);
-	    if (found)
-	      found = E(tag,j,u,v,x,y,z);
-	  }
-	}
-      }
-    }
-  }
-  return found;
-}
-
-double BlendOperator::GetBlendingPou
-(int patchTag, double u, double v)
-{
-  double x,y,z;
-  double pouNumerator = GetPatch(patchTag)->GetPou(u,v);
-
-  double pouDenominator = 0.;
-  for (int otherPatchTag = 0;otherPatchTag < patch_.size();otherPatchTag++) {
-    if (E(patchTag,otherPatchTag,u,v,x,y,z)) {
-      double uu,vv;
-      GetPatch(otherPatchTag)->Inverse(x,y,z,uu,vv);
-      if (GetPatch(otherPatchTag)->Inverse(x,y,z,uu,vv)) {
-	pouDenominator += GetPatch(otherPatchTag)->GetPou(uu,vv);
-      }
-    }
-  }
-  if (pouDenominator)
-    return pouNumerator / pouDenominator;
-  else {
-    printf("%d(%g,%g) :: %g %g\n",patchTag,u,v,pouNumerator,pouDenominator);
-    return 1.;
-  }
-}
-
-Patch* BlendOperator::GetPatch
-(int tag) {
-  for (int i=0;i<patch_.size();i++) {
-    if (patch_[i]->GetTag() == tag)
-      return patch_[i];
-  }
-}
-
-ProjectionSurface* BlendOperator::GetProjectionSurface
-(int tag) {
-  for (int i=0;i<ps_.size();i++) {
-    if (ps_[i]->GetTag() == tag)
-      return ps_[i];
-  }
-}
-
-bool BlendOperator::DoPatchesOverlap
-(int patchTag1, int patchTag2) {
-  bool result;
-  if (overlapChart_[patchTag1][patchTag2]->doesIntersect)
-    result = true;
-  else 
-    result = false;
-  
-  return result;
-}
-
-int BlendOperator::GetProjectionSurfaceTagForOverlap
-(int patchTag1, int patchTag2) {
-  return overlapChart_[patchTag1][patchTag2]->psTag;
-}
-
-bool BlendOperator::IsPointInIntersectionBoundingBox
-(int patchTag1, int patchTag2, double x, double y, double z) {
-  bool result = true;
-  double tol = 1.e-2;
-  double xMin = overlapChart_[patchTag1][patchTag2]->xMin - tol;
-  double xMax = overlapChart_[patchTag1][patchTag2]->xMax + tol;
-  double yMin = overlapChart_[patchTag1][patchTag2]->yMin - tol;
-  double yMax = overlapChart_[patchTag1][patchTag2]->yMax + tol;
-  double zMin = overlapChart_[patchTag1][patchTag2]->zMin - tol;
-  double zMax = overlapChart_[patchTag1][patchTag2]->zMax + tol;
-
-  //printf("%d %d :: %g %g %g :: %g %g %g :: %g %g %g\n",
-  // patchTag1,patchTag2, xMin,x,xMax,yMin,y,yMax,zMin,z,zMax);
-
-  if ((x < xMin)||(x > xMax)||(y < yMin)||(y > yMax)||(z < zMin)||(z > zMax))
-    result = false;
-
-  return result;
-}
-
-int BlendOperator::GetNumPatches
-() { 
-  return patch_.size();
-}
-
-bool BlendOperator::GetPointOnPatch
-(int patchTag, double d[3], double &x, double &y, double &z)
-{
-  double h = 1.e-6;
-  double tol = 1.e-12;
-
-  double P[3], R[3];
-  P[0] = R[0] = x; 
-  P[1] = R[1] = y; 
-  P[2] = R[2] = z;
-
-  double e1[3],e2[3];
-
-  if (std::abs(1.-std::abs(d[0])) < tol) {
-    e1[0] = 0.;
-    e1[1] = 1.;
-    e1[2] = 0.;
-  }
-  else if (std::abs(1.-std::abs(d[1])) < tol) {
-    e1[0] = 0.;
-    e1[1] = 0.;
-    e1[2] = 1.;
-  }
-  else if (std::abs(1.-std::abs(d[2])) < tol) {
-    e1[0] = 1.;
-    e1[1] = 0.;
-    e1[2] = 0.;
-  }
-  else {
-    e1[0] = - d[1] * d[2];
-    e1[1] = 2 * d[2] * d[0];
-    e1[2] = - d[0] * d[1];
-  }
-  double value = 0.;
-  for (int l=0;l<3;l++)
-    value += e1[l] * e1[l];
-  value = sqrt(value);
-  for (int l=0;l<3;l++)
-    e1[l] /= value;
-
-  e2[0] = d[1] * e1[2] - d[2] * e1[1];
-  e2[1] = d[2] * e1[0] - d[0] * e1[2];
-  e2[2] = d[0] * e1[1] - d[1] * e1[0];
-
-  bool converged = false;
-
-  double Qu,Qv;
-  GetPatch(patchTag)->GetProjectionSurface()->
-    OrthoProjectionOnSurface(P[0],P[1],P[2],Qu,Qv);
-
-
-  //printf("Q1 = (%g,%g)\n",Qu,Qv);
-
-  Qu = GetPatch(patchTag)->UnscaleU(Qu);
-  Qv = GetPatch(patchTag)->UnscaleV(Qv);
-
-  if (Qu < 0.)
-    Qu = 0.;
-  if (Qu > 1.)
-    Qu = 1.;
-
-  if (Qv < 0.)
-    Qv = 0.;
-  if (Qv > 1.)
-    Qv = 1.;
-
-  double Q[3];
-  GetPatch(patchTag)->F(Qu,Qv,Q[0],Q[1],Q[2]);
-      
-  int maxTotalIteration = 10;
-  int totalIterationCounter = 0;
-
-  while ((!converged) && (totalIterationCounter < maxTotalIteration)) {
-    totalIterationCounter++;
-    double QminusP[3];
-    for (int l=0;l<3;l++)
-      QminusP[l] = Q[l] - P[l];
-
-    double f[2];
-    f[0] = (QminusP[0] * e1[0] + QminusP[1] * e1[1] + QminusP[2] * e1[2]);
-    f[1] = (QminusP[0] * e2[0] + QminusP[1] * e2[1] + QminusP[2] * e2[2]);
-
-    //printf("Q2 = (%g,%g) -> %g -> %g\n",Qu,Qv,f[0],f[1]);
-
-    if ((std::abs(f[0]) < tol) && (std::abs(f[1]) < tol)) {
-      //printf("here too\n");
-      converged = true;
-      for (int l=0;l<3;l++)
-	R[l] = Q[l];
-    }
-    else {
-      double QuPlus = Qu + h;
-      double QvPlus = Qv + h;
-      if (GetPatch(patchTag)->IsUPeriodic())
-	QuPlus -= std::floor(QuPlus);
-      if (GetPatch(patchTag)->IsVPeriodic())
-	QvPlus -= std::floor(QvPlus);
-      
-      double QplusU[3], QplusV[3];
-      GetPatch(patchTag)->F(QuPlus,Qv,QplusU[0],QplusU[1],QplusU[2]);
-      GetPatch(patchTag)->F(Qu,QvPlus,QplusV[0],QplusV[1],QplusV[2]);
-      
-      double QplusUminusP[3], QplusVminusP[3];
-      for (int l=0;l<3;l++) {
-	QplusUminusP[l] = QplusU[l] - P[l];
-	QplusVminusP[l] = QplusV[l] - P[l];
-      }
-      
-      double fuPlus[2], fvPlus[2];
-      fuPlus[0] = (QplusUminusP[0] * e1[0] + QplusUminusP[1] * e1[1] + 
-		   QplusUminusP[2] * e1[2]);
-      fuPlus[1] = (QplusUminusP[0] * e2[0] + QplusUminusP[1] * e2[1] + 
-		   QplusUminusP[2] * e2[2]);
-      fvPlus[0] = (QplusVminusP[0] * e1[0] + QplusVminusP[1] * e1[1] + 
-		   QplusVminusP[2] * e1[2]);
-      fvPlus[1] = (QplusVminusP[0] * e2[0] + QplusVminusP[1] * e2[1] + 
-		   QplusVminusP[2] * e2[2]);
-      
-      double D[2][2];
-      D[0][0] = (fuPlus[0] - f[0]) / h;
-      D[0][1] = (fvPlus[0] - f[0]) / h;
-      D[1][0] = (fuPlus[1] - f[1]) / h;
-      D[1][1] = (fvPlus[1] - f[1]) / h;
-      
-      double det = D[0][0] * D[1][1] - D[0][1] * D[1][0];
-      double update[2];
-      update[0] = (D[1][1] * f[0] - D[0][1] * f[1]) / det;
-      update[1] = (D[0][0] * f[1] - D[1][0] * f[0]) / det;
-      
-      //printf("update = (%g,%g)\n",update[0],update[1]);
-      
-      Qu -= update[0];
-      Qv -= update[1];
-      
-      //printf("Q1 = (%g,%g)\n",Qu,Qv);
-      
-      //if (GetPatch(patchTag)->_PI->periodic[0] == 1)
-      //Qu -= std::floor(Qu);
-      //if (GetPatch(patchTag)->_PI->periodic[1] == 1)
-      //Qv -= std::floor(Qv);
-      
-      //printf("Q2 = (%g,%g)\n",Qu,Qv);
-      
-      GetPatch(patchTag)->F(Qu,Qv,Q[0],Q[1],Q[2]);
-    }
-  }
-  x = R[0];
-  y = R[1];
-  z = R[2];
-  return converged;
-}
diff --git a/contrib/FourierModel/BlendOperator.h b/contrib/FourierModel/BlendOperator.h
deleted file mode 100755
index ff8aa33509..0000000000
--- a/contrib/FourierModel/BlendOperator.h
+++ /dev/null
@@ -1,60 +0,0 @@
-#ifndef _BLEND_OPERATOR_H_
-#define _BLEND_OPERATOR_H_
-
-#include <vector>
-#include "FM_Info.h"
-#include "Patch.h"
-#include "ProjectionSurface.h"
-
-namespace FM {
-
-class BlendOperator {
- private:
-  std::vector<Patch*> patch_;
-  std::vector<ProjectionSurface*> ps_;
-  std::vector<std::vector<OverlapInfo*> > overlapChart_;
-  
-  bool GetPointOnPatch_
-    (int i, double u, double v, int j, double &x, double &y, double &z);
-  
- protected:
-
- public:
-  BlendOperator
-    (std::vector<Patch*> patch,std::vector<ProjectionSurface*> ps,
-     std::vector<std::vector<OverlapInfo*> > overlapChart) :
-      patch_(patch), ps_(ps), overlapChart_(overlapChart) {}
-
-  ~BlendOperator() {}
-
-  int GetNumPatches
-    ();
-
-  Patch* GetPatch
-    (int tag);
-
-  ProjectionSurface* GetProjectionSurface
-    (int tag);
-
-  bool DoPatchesOverlap
-    (int patchTag1, int patchTag2);
-
-  int GetProjectionSurfaceTagForOverlap
-    (int patchTag1, int patchTag2);
-
-  bool IsPointInIntersectionBoundingBox
-    (int patchTag1, int patchTag2, double x, double y, double z);
-
-  bool E
-    (int i, int j, double u, double v, double &x, double &y, double &z);
-
-  double GetBlendingPou
-    (int patchTag, double u, double v);
-
-  bool GetPointOnPatch
-    (int patchTag, double d[3], double &x, double &y, double &z);
-};
-
-}
-
-#endif
diff --git a/contrib/FourierModel/BlendedPatch.cpp b/contrib/FourierModel/BlendedPatch.cpp
deleted file mode 100755
index 9a4cb6b207..0000000000
--- a/contrib/FourierModel/BlendedPatch.cpp
+++ /dev/null
@@ -1,880 +0,0 @@
-#include "BlendedPatch.h"
-
-using namespace FM;
-
-BlendedPatch::BlendedPatch
-(Patch* patch, BlendOperator* blendOp) 
-  : _coeffData(0),_coeffDerivU(0),_coeffDerivV(0),
-    _coeffDerivUU(0),_coeffDerivVV(0),_coeffDerivUV(0)
-{
-  patch_ = patch;
-  blendOp_ = blendOp;
-
-  patchTag_ = patch_->GetTag();
-  nPatches_ = blendOp_->GetNumPatches();
-
-  _derivative = patch_->GetDerivativeBitField();
-
-  //_uM = patch_->GetUModes();
-  //_vM = patch_->GetVModes();
- 
-  _periodU = patch_->IsUPeriodic() ? 1. : 2.;
-  _periodV = patch_->IsVPeriodic() ? 1. : 2.;
-
-  IsUPeriodic = false;
-  IsVPeriodic = false;
-
-  _uM = 32;
-  _vM = 32;
-
-  //printf("%d %d\n",_uM,_vM);
-
-  if (IsUPeriodic) {
-    if ((_uM % 2) == 0) {
-      _uMLower = - _uM/2;
-      _uMUpper = _uM/2 - 1;
-    }
-    else {
-      _uMLower = - (_uM - 1)/2;
-      _uMUpper = (_uM - 1)/2;
-    }
-  }
-  else {
-    _uMLower = 0;
-    _uMUpper = _uM;
-  }
-  if (IsVPeriodic) {
-    if ((_vM % 2) == 0) {
-      _vMLower = - _vM/2;
-      _vMUpper = _vM/2 - 1;
-    }
-    else {
-      _vMLower = - (_vM - 1)/2;
-      _vMUpper = (_vM - 1)/2;
-    }
-  }
-  else {
-    _vMLower = 0;
-    _vMUpper = _vM;    
-  }
-
-  if (_derivative)
-    _ProcessSeriesCoeff();
-
-  /*
-  for (int j = 0; j < _uM; j++) {
-    for (int k = 0; k < _vM; k++)
-      printf("%g ",_coeffData[j][k].real());
-    printf("\n\n");
-  }
-  printf("\n");
-  */
-
-  // Check if we need to interpolate the derivative(s)
-  if(_derivative){
-    // Initialize _fineDeriv and _fineDeriv2 to zero
-    if(_derivative & 1){
-      _coeffDerivU = new std::complex<double>*[_uM];
-      _coeffDerivV = new std::complex<double>*[_uM];
-      for(int j = 0; j < _uM; j++){
-        _coeffDerivU[j] = new std::complex<double>[_vM];
-        _coeffDerivV[j] = new std::complex<double>[_vM];
-        for(int k = 0; k < _vM; k++){
-          _coeffDerivU[j][k] = 0.;
-          _coeffDerivV[j][k] = 0.;
-        }
-      }
-    }
-
-    if(_derivative & 2){
-      _coeffDerivUU = new std::complex<double>*[_uM];
-      _coeffDerivVV = new std::complex<double>*[_uM];
-      _coeffDerivUV = new std::complex<double>*[_uM];
-      for(int j = 0; j < _uM; j++){
-        _coeffDerivUU[j] = new std::complex<double>[_vM];
-        _coeffDerivVV[j] = new std::complex<double>[_vM];
-        _coeffDerivUV[j] = new std::complex<double>[_vM];
-        for(int k = 0; k < _vM; k++){
-          _coeffDerivUU[j][k] = 0.;
-          _coeffDerivVV[j][k] = 0.;
-          _coeffDerivUV[j][k] = 0.;
-        }
-      }
-    }
-
-    // Copy the Fourier coefficients into _coeffDeriv and _coeffDeriv2
-    std::complex<double> I(0., 1.);
-    for(int j = _uM - 1; j >= 0; j--){
-      for(int k = _vM - 1; k >= 0; k--){
-        if(_derivative & 1){
-	  if (IsUPeriodic) {
-	    int J = j+_uMLower;
-	    _coeffDerivU[j][k] = (2 * M_PI * J * I / _periodU) *
-	      _coeffData[j][k];
-	  }
-	  else {
-	    if (j == _uM - 1)
-	      _coeffDerivU[j][k] = 0.;
-	    else if (j == _uM - 2)
-	      _coeffDerivU[j][k] = 2. * (double)(j + 1) * _coeffData[j + 1][k];
-	    else
-	      _coeffDerivU[j][k] = _coeffDerivU[j + 2][k] +
-		2. * (double)(j + 1) * _coeffData[j + 1][k];
-	    //if (j != 0)
-	    //_coeffDerivU[j][k] *= 2.;
-	  }
-	  if (IsVPeriodic) {
-	    int K = k+_vMLower;
-	    _coeffDerivV[j][k] = (2 * M_PI * K * I / _periodV) *
-	      _coeffData[j][k];
-	  }
-	  else {
-	    if (k == _vM - 1)
-	      _coeffDerivV[j][k] = 0.;
-	    else if (k == _vM - 2)
-	      _coeffDerivV[j][k] = 2. * (double)(k + 1) * _coeffData[j][k + 1];
-	    else
-	      _coeffDerivV[j][k] = _coeffDerivV[j][k + 2] +
-		2. * (double)(k + 1) * _coeffData[j][k + 1];
-	    //if (k != 0)
-	    //_coeffDerivV[j][k] *= 2.;
-	  }
-        }
-      }
-    }
-    for (int j = 0; j < _uM; j++) {
-      for (int k = 0; k < _vM; k++) {
-	if (_derivative & 1) {
-	  if (!IsUPeriodic) {
-	    if (j != 0) {
-	      _coeffDerivU[j][k] *= 2.;
-	    }
-	  }
-	  if (!IsVPeriodic) {
-	    if (k != 0) {
-	      _coeffDerivV[j][k] *= 2.;
-	    }
-	  }
-	}
-      }
-    }
-    for(int j = _uM - 1; j >= 0; j--) {
-      for(int k = _vM - 1; k >= 0; k--) {
-        if(_derivative & 2) {
-	  if (IsUPeriodic) {
-	    int J = j+_uMLower;
-	    _coeffDerivUU[j][k] = (2 * M_PI * J * I / _periodU) * 
-	      _coeffDerivU[j][k];
-	  }
-	  else {
-	    if (j == _uM - 1)
-	      _coeffDerivUU[j][k] = 0.;
-	    else if (j == _uM - 2)
-	      _coeffDerivUU[j][k] = 2. * (double)(j + 1) * 
-		_coeffDerivU[j + 1][k];
-	    else
-	      _coeffDerivUU[j][k] = _coeffDerivUU[j + 2][k] +
-		2. * (double)(j + 1) * _coeffDerivU[j + 1][k];
-	    //if (j != 0)
-	    //_coeffDerivUU[j][k] *= 2.;
-	  }
-	  if (IsVPeriodic) {
-	    int K = k+_vMLower;
-	    _coeffDerivVV[j][k] = (2 * M_PI * K * I / _periodV) * 
-	      _coeffDerivV[j][k];
-	    _coeffDerivUV[j][k] = (2 * M_PI * K * I / _periodV) * 
-	      _coeffDerivU[j][k];
-	  }
-	  else {
-	    if (k == _vM - 1) {
-	      _coeffDerivVV[j][k] = 0.;
-	      _coeffDerivUV[j][k] = 0.;
-	    }
-	    else if (k == _vM - 2) {
-	      _coeffDerivVV[j][k] = 2. * (double)(k + 1) * 
-		_coeffDerivV[j][k + 1];
-	      _coeffDerivUV[j][k] = 2. * (double)(k + 1) * 
-		_coeffDerivU[j][k + 1];
-	    }
-	    else {
-	      _coeffDerivVV[j][k] = _coeffDerivVV[j][k + 2] +
-		2. * (double)(k + 1) * _coeffDerivV[j][k + 1];
-	      _coeffDerivUV[j][k] = _coeffDerivUV[j][k + 2] +
-		2. * (double)(k + 1) * _coeffDerivU[j][k + 1];
-	      //if (k != 0) {
-	      //_coeffDerivVV[j][k] *= 2.;
-	      //_coeffDerivUV[j][k] *= 2.;
-	      //}
-	    }
-	  }
-        }
-      }
-    }
-    for (int j = 0; j < _uM; j++) {
-      for (int k = 0; k < _vM; k++) {
-	if (_derivative & 2) {
-	  if (!IsUPeriodic && IsVPeriodic) {
-	    if (j != 0) {
-	      _coeffDerivUU[j][k] *= 2.;
-	    }
-	  }
-	  if (IsUPeriodic && !IsVPeriodic) {
-	    if (k != 0) {
-	      _coeffDerivVV[j][k] *= 2.;
-	      _coeffDerivUV[j][k] *= 2.;
-	    }
-	  }
-	}
-      }
-    }
-  }
-  // Initialize interpolation variables
-  _tmpCoeff = std::vector< std::complex<double> >(_vM);
-  _tmpInterp = std::vector< std::complex<double> >(_uM);
-}
-
-BlendedPatch::~BlendedPatch()
-{
-  for(int j = 0; j < _uM; j++)
-    delete [] _coeffData[j];
-  delete [] _coeffData;
-
-  if(_coeffDerivU){
-    for(int j = 0; j < _uM; j++)
-      delete [] _coeffDerivU[j];
-    delete [] _coeffDerivU;
-  }
-  if(_coeffDerivV){
-    for(int j = 0; j < _uM; j++)
-      delete [] _coeffDerivV[j];
-    delete [] _coeffDerivV;
-  }
-  if(_coeffDerivUU){
-    for(int j = 0; j < _uM; j++)
-      delete [] _coeffDerivUU[j];
-    delete [] _coeffDerivUU;
-  }
-  if(_coeffDerivVV){
-    for(int j = 0; j < _uM; j++)
-      delete [] _coeffDerivVV[j];
-    delete [] _coeffDerivVV;
-  }
-  if(_coeffDerivUV){
-    for(int j = 0; j < _uM; j++)
-      delete [] _coeffDerivUV[j];
-    delete [] _coeffDerivUV;
-  }
-}
-
-int BlendedPatch::_forwardSize = 0;
-int BlendedPatch::_backwardSize = 0;
-fftw_plan BlendedPatch::_forwardPlan;
-fftw_plan BlendedPatch::_backwardPlan;
-fftw_complex *BlendedPatch::_forwardData = 0;
-fftw_complex *BlendedPatch::_backwardData = 0;
-
-void BlendedPatch::_SetForwardPlan(int n)
-{
-  if(n != _forwardSize){
-    if(_forwardSize){
-      fftw_destroy_plan(_forwardPlan);
-      fftw_free(_forwardData);
-    }
-    _forwardSize = n;
-    _forwardData = 
-      (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * _forwardSize);
-    _forwardPlan = 
-      fftw_plan_dft_1d(_forwardSize, _forwardData, _forwardData,
-		       FFTW_FORWARD, FFTW_ESTIMATE);
-  }
-}
-
-void BlendedPatch::_SetBackwardPlan(int n)
-{
-  if(n != _backwardSize){
-    if(_backwardSize){
-      fftw_destroy_plan(_backwardPlan);
-      fftw_free(_backwardData);
-    }
-    _backwardSize = n;
-    _backwardData = 
-      (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * _backwardSize);
-    _backwardPlan = 
-      fftw_plan_dft_1d(_backwardSize, _backwardData, _backwardData,
-		       FFTW_BACKWARD, FFTW_ESTIMATE);
-  }
-}
-
-void BlendedPatch::_ForwardFft(int n, std::complex<double> *fftData)
-{
-  // Initialize fftw plan and array (ignoring the last element of
-  // fftData, which should just be the periodic extension)
-  _SetForwardPlan(n - 1);
-  for(int i = 0; i < n - 1; i++){
-    _forwardData[i][0] = fftData[i].real();
-    _forwardData[i][1] = fftData[i].imag();
-  }
-
-  // Perform forward FFT
-  fftw_execute(_forwardPlan);
-
-  // Copy data back into fftData and scale by 1/(n - 1)
-  double s = 1. / (double)(n - 1);
-  for(int i = 0; i < n - 1; i++)
-    fftData[i] = 
-      s * std::complex<double>(_forwardData[i][0], _forwardData[i][1]);
-}
-
-void BlendedPatch::_BackwardFft(int n, std::complex<double> *fftData)
-{
-  // Initialize fftw plan and array (ignoring last element of fftData)
-  _SetBackwardPlan(n - 1);
-  for(int i = 0; i < n - 1; i++){
-    _backwardData[i][0] = fftData[i].real();
-    _backwardData[i][1] = fftData[i].imag();
-  }
-
-  // Perform backward FFT
-  fftw_execute(_backwardPlan);
-
-  // Copy data back into fftData
-  for(int i = 0; i < n - 1; i++)
-    fftData[i] = 
-      std::complex<double>(_backwardData[i][0], _backwardData[i][1]);
-
-  // Fill in last element with copy of first element
-  fftData[n - 1] = fftData[0];
-}
-
-void BlendedPatch::_ProcessSeriesCoeff()
-{
-  _coeffData = new std::complex<double>*[_uM];
-  for(int j = 0; j < _uM; j++) {
-    _coeffData[j] = new std::complex<double>[_vM];
-    for(int k = 0; k < _vM; k++)
-      _coeffData[j][k] = 0.;
-  }
-  if (IsUPeriodic) {
-    std::vector<double> u(_uM), v(_vM + 1);
-    for (int j = 0; j < _uM; j++)
-      u[j] = (double)j / (double)(_uM-1);
-    for (int j = 0; j < _vM + 1; j++)
-      v[j] = (double)j / (double)_vM;
-
-    std::complex<double> **dataU = new std::complex<double> *[_vM];
-    for (int k = 0; k < _vM; k++)
-      dataU[k] = new std::complex<double> [_uM];
-    std::complex<double> *dataV = new std::complex<double>[2*_vM + 1];
-    for (int j = 0; j < _uM - 1; j++) {
-      for (int k = 0; k < _vM + 1; k++) {
-	
-	double X,Y,Z,pX,pY,pZ,nX,nY,nZ;
-	F(u[j],0.5 * cos(M_PI * v[k]) + 0.5,X,Y,Z);
-	patch_->GetProjectionSurface()->
-	  F(patch_->RescaleU(u[j]),
-	    patch_->RescaleV(0.5 * cos(M_PI * v[k]) + 0.5),pX,pY,pZ);
-	patch_->GetProjectionSurface()->GetUnitNormal
-	  (patch_->RescaleU(u[j]),
-	   patch_->RescaleV(0.5 * cos(M_PI * v[k]) + 0.5),nX,nY,nZ);
-	dataV[k] = (X-pX)*nX + (Y-pY)*nY + (Z-pZ)*nZ;
-	
-	//dataV[k] = (0.5 * cos(M_PI * u[j]) + 0.5) * 
-	//(0.5 * cos(M_PI * v[k]) + 0.5);
-     }
-
-      for (int k = 1; k < _vM+1; k++)
-	dataV[_vM + k] = dataV[_vM -k];
-      _BackwardFft(2*_vM + 1, dataV);
-      dataU[0][j] = 0.5 * dataV[0] / (double)_vM;
-      for (int k=1; k<_vM-1; k++)
-	dataU[k][j] = dataV[k] / (double)_vM;
-      dataU[_vM-1][j] = 0.5 * dataV[_vM-1] / (double)_vM;
-    }
-    
-    for (int k = 0; k < _vM; k++) {
-      dataU[k][_uM - 1] = dataU[k][0];
-      _ForwardFft(_uM, dataU[k]);
-    }
-
-    for (int j = _uMLower; j <= _uMUpper; j++) {
-      for (int k = 0; k < _vM; k++)
-	if ((j == _uMLower) || (j == _uMUpper))
-	  _coeffData[_uMUpper + j][k] = dataU[k][_uMUpper] / 2.;
-	else if ((j >= 0) && (j < _uMUpper))
-	  _coeffData[_uMUpper + j][k] = dataU[k][j];
-	else
-	  _coeffData[_uMUpper + j][k] = dataU[k][_uM + j -1];
-    }
-    for (int k = 0; k < _vM; k++)
-      delete [] dataU[k];
-    delete [] dataU;
-    delete [] dataV;
-  }
-  else if (IsVPeriodic) {
-    std::vector<double> u(_uM + 1), v(_vM);
-    for (int j = 0; j < _uM + 1; j++)
-      u[j] = (double)j / (double)_uM;
-    for (int j = 0; j < _vM; j++)
-      v[j] = (double)j / (double)(_vM-1);
-
-    std::complex<double> **dataV = new std::complex<double> *[_uM];
-    for (int j = 0; j < _uM; j++)
-      dataV[j] = new std::complex<double> [_vM];
-    std::complex<double> *dataU = new std::complex<double>[2*_uM + 1];
-    for (int k = 0; k < _vM - 1; k++) {
-      for (int j = 0; j < _uM + 1; j++) {
-	double X,Y,Z,pX,pY,pZ,nX,nY,nZ;
-	F(0.5 * cos(M_PI * u[j]) + 0.5,v[k],X,Y,Z);
-	patch_->GetProjectionSurface()->
-	  F(patch_->RescaleU(0.5 * cos(M_PI * u[j]) + 0.5),
-	    patch_->RescaleV(v[k]),pX,pY,pZ);
-	patch_->GetProjectionSurface()->GetUnitNormal
-	  (patch_->RescaleU(u[j]),
-	   patch_->RescaleV(0.5 * cos(M_PI * v[k]) + 0.5),nX,nY,nZ);
-	dataU[j] = (X-pX)*nX + (Y-pY)*nY + (Z-pZ)*nZ;
-      }
-      for (int j = 1; j < _uM+1; j++)
-	dataU[_uM + j] = dataU[_uM -j];
-      _BackwardFft(2*_uM + 1, dataU);
-      dataV[0][k] = 0.5 * dataU[0] / (double)_uM;
-      for (int j=1; j<_uM-1; j++)
-	dataV[j][k] = dataU[j] / (double)_uM;
-      dataV[_uM-1][k] = 0.5 * dataU[_uM-1] / (double)_uM;
-    }
-    for (int j = 0; j < _uM; j++) {
-      dataV[j][_uM - 1] = dataV[j][0];
-      _ForwardFft(_vM, dataV[j]);
-    }
-    for (int k = _vMLower; k <= _vMUpper; k++) {
-      //for (int j = 0; j < _uM - 1; j++) {
-      for (int j = 0; j < _uM; j++)
-	if ((k == _vMLower) || (k == _vMUpper))
-	  _coeffData[j][_vMUpper + k] = dataV[j][_vMUpper] / 2.;
-	else if ((j >= 0) && (j < _vMUpper))
-	  _coeffData[j][_uMUpper + k] = dataV[j][k];
-	else
-	  _coeffData[j][_uMUpper + k] = dataV[j][_uM + k -1];
-    }
-    for (int j = 0; j < _uM; j++)
-      delete [] dataV[j];
-    delete [] dataV;
-    delete [] dataU;
-  }
-  else {
-    std::vector<double> u(_uM + 1), v(_vM + 1);
-    for (int j = 0; j < _uM + 1; j++)
-      u[j] = (double)j / (double)_uM;
-    for (int j = 0; j < _vM + 1; j++)
-      v[j] = (double)j / (double)_vM;
-
-    std::complex<double> **dataU = new std::complex<double> *[_vM];
-    for (int k = 0; k < _vM; k++)
-      dataU[k] = new std::complex<double> [2*_uM + 1];
-
-    std::complex<double> *dataV = new std::complex<double>[2*_vM + 1];
-    for (int j = 0; j < _uM + 1; j++) {
-      for (int k = 0; k < _vM + 1; k++) {
-	/*
-	double X,Y,Z,pX,pY,pZ,nX,nY,nZ;
-	_F(0.5 * cos(M_PI * u[j]) + 0.5,0.5 * cos(M_PI * v[k]) + 0.5,X,Y,Z);
-	patch_->GetProjectionSurface()->
-	  F(patch_->RescaleU(0.5 * cos(M_PI * u[j]) + 0.5),
-	    patch_->RescaleV(0.5 * cos(M_PI * v[k]) + 0.5),pX,pY,pZ);
-	patch_->GetProjectionSurface()->GetUnitNormal
-	  (patch_->RescaleU(0.5 * cos(M_PI * u[j]) + 0.5),
-	   patch_->RescaleV(0.5 * cos(M_PI * v[k]) + 0.5),nX,nY,nZ);
-	dataV[k] = (X-pX)*nX + (Y-pY)*nY + (Z-pZ)*nZ;
-	*/
-	//dataV[k] = (0.5 * cos(M_PI * u[j]) + 0.5) * 
-	//(0.5 * cos(M_PI * v[k]) + 0.5);
-	dataV[k] = (0.5 * cos(M_PI * v[k]) + 0.5);
-      }
-      for (int k = 1; k < _vM+1; k++)
-	dataV[_vM + k] = dataV[_vM - k];
-      _BackwardFft(2*_vM + 1, dataV);
-      dataU[0][j] = 0.5 * dataV[0] / (double)_vM;
-      for (int k=1; k<_vM-1; k++)
-	dataU[k][j] = dataV[k] / (double)_vM;
-      dataU[_vM-1][j] = 0.5 * dataV[_vM-1] / (double)_vM;
-    }
-
-    /*
-    for (int k = 0; k < _vM; k++)
-      for (int j = 0; j < _uM + 1; j++)
-	printf("%d %d -> %g %g\n",k,j,dataU[k][j].real(),dataU[k][j].imag());
-    */
-
-    for (int k = 0; k < _vM; k++) {
-      for (int j = 1; j < _uM+1; j++) {
-	dataU[k][_uM + j] = dataU[k][_uM - k];
-      }
-      _BackwardFft(2*_uM + 1, dataU[k]);
-    }
-
-    for (int j = 0; j < _uM; j++) {
-      for (int k = 0; k < _vM; k++) {
-	if ((j == 0) || (j == _uM - 1))
-	  _coeffData[j][k] = 0.5 * dataU[k][j]/ (double)_uM;
-	else
-	  _coeffData[j][k] = dataU[k][j]/ (double)_uM;
-      }
-    }
-    for (int k = 0; k < _vM; k++)
-      delete [] dataU[k];
-    delete [] dataU;
-    delete [] dataV;
-  }
-}
-
-std::complex<double> BlendedPatch::
-_PolyEval(std::vector< std::complex<double> > _coeff, std::complex<double> x)
-{
-  int _polyOrder = _coeff.size()-1;
-  std::complex<double> out = 0.;
-
-  out = x * _coeff[_polyOrder];
-  for (int i = _polyOrder - 1; i > 0; i--)
-    out = x * (out + _coeff[i]);
-  out = out + _coeff[0];
-
-  return out;
-}
-
-std::complex<double> BlendedPatch::
-  _Interpolate(double u, double v, int uDer, int vDer)
-{
-  //Msg::Info("%d %d %d",uDer,vDer,_derivative);
-  if (((uDer==2 || vDer==2 || (uDer==1 && vDer==1)) && !(_derivative & 2) ) ||
-      ((uDer==1 || vDer==1) && !(_derivative & 1)) ||
-      (uDer<0 || uDer>2 || vDer<0 || vDer>2) ) {
-    Msg::Error("Derivative data not available: check contructor call %d %d %d",
-               uDer,vDer,_derivative);
-    return 0.;
-  }
-
-  double epsilon = 1e-12;
-  if (u < 0. - epsilon || u > 1. + epsilon) {
-    Msg::Error("Trying to interpolate outside interval: (u,v)=(%.16g,%.16g) "
-               "not in [%g,%g]x[%g,%g]", u, v, 0., 1., 0., 1.); 
-  }
-  std::vector<double> uT(_uM,0.);
-  std::vector<double> vT(_vM,0.);
-  if (!IsUPeriodic) {
-    for (int j = 0; j < _uM; j++)
-      if (j == 0)
-	uT[j] = 1.;
-      else if (j == 1)
-	uT[j] = 2. * u - 1;
-      else
-	uT[j] = 2. * uT[1] * uT[j-1] - uT[j-2];
-  }
-  if (!IsVPeriodic) {
-    for (int k = 0; k < _vM; k++)
-      if (k == 0)
-	vT[k] = 1.;
-      else if (k == 1)
-	vT[k] = 2. * v - 1.;
-      else
-	vT[k] = 2. * vT[1] * vT[k-1] - vT[k-2];
-  }
-  // Interpolate to find value at (u,v)
-  for(int j = 0; j < _uM; j++){
-    _tmpInterp[j] = 0.;
-    for(int k = 0; k < _vM; k++){
-      std::complex<double> tmp;
-      if(uDer == 0 && vDer == 0)
-	tmp = _coeffData[j][k];
-      else if(uDer == 1 && vDer == 0)
-	tmp = _coeffDerivU[j][k];
-      else if(uDer == 0 && vDer == 1)
-	tmp = _coeffDerivV[j][k];
-      else if(uDer == 2 && vDer == 0)
-	tmp = _coeffDerivUU[j][k];
-      else if(uDer == 0 && vDer == 2)
-	tmp = _coeffDerivVV[j][k];
-      else
-	tmp = _coeffDerivUV[j][k];
-      _tmpCoeff[k] = tmp;
-    }
-    if (IsVPeriodic) {
-      std::complex<double> y(cos(2 * M_PI * v / _periodV),
-			     sin(2 * M_PI * v / _periodV));
-      _tmpInterp[j] = _PolyEval(_tmpCoeff, y);
-      _tmpInterp[j] *= std::complex<double>
-	(cos(2 * M_PI * _vMLower * v / _periodV),
-	 sin(2 * M_PI * _vMLower * v / _periodV));
-    }
-    else {
-      //printf("i was here 0\n");
-      for(int k = 0; k < _vM; k++)
-	_tmpInterp[j] += _tmpCoeff[k] * vT[k];
-    }
-  }
-  if (IsUPeriodic) {
-    std::complex<double> x(cos(2 * M_PI * u / _periodU),
-			   sin(2 * M_PI * u / _periodU));
-    return _PolyEval(_tmpInterp, x) * std::complex<double>
-      (cos(2 * M_PI * _uMLower * u / _periodU),
-       sin(2 * M_PI * _uMLower * u / _periodU));
-  }
-  else {
-    std::complex<double> tmp = 0.;
-    for(int j = 0; j < _uM; j++)
-      tmp += _tmpInterp[j] * uT[j];
-    return tmp;
-  }
-}
-
-void BlendedPatch::F
-(double u, double v, double &x, double &y, double &z)
-{
-  x = y = z = 0.;
-
-  for (int otherPatchTag_ = 0;otherPatchTag_ < nPatches_; otherPatchTag_++) {
-    double xx, yy, zz;
-    if (blendOp_->E(patchTag_,otherPatchTag_,u,v,xx,yy,zz)) {
-      double uu,vv;
-      blendOp_->GetPatch(otherPatchTag_)->Inverse(xx,yy,zz,uu,vv);
-      double lambda = blendOp_->GetBlendingPou(otherPatchTag_,uu,vv);
-      x += lambda * xx;
-      y += lambda * yy;
-      z += lambda * zz;
-    }
-  }
-}
-
-bool BlendedPatch::Inverse
-(double x, double y, double z, double &u, double &v)
-{
-  bool found = false;
-  int projectionSurfaceTag_;
-  for (int otherPatchTag_ = 0;otherPatchTag_ < nPatches_; otherPatchTag_++) {
-    if (otherPatchTag_ != patchTag_) {
-      if (blendOp_->DoPatchesOverlap(patchTag_,otherPatchTag_)) {
-	if (blendOp_->
-	    IsPointInIntersectionBoundingBox(patchTag_,otherPatchTag_,x,y,z)) {
-	  projectionSurfaceTag_ = blendOp_->
-	    GetProjectionSurfaceTagForOverlap(patchTag_,otherPatchTag_);
-	  found = true;
-	  break;
-	}
-      }
-    }
-  }
-  if (found) {
-    found = blendOp_->GetProjectionSurface(projectionSurfaceTag_)->
-      OrthoProjectionOnSurface(x,y,z,u,v);
-    double xx,yy,zz;
-    blendOp_->GetProjectionSurface(projectionSurfaceTag_)->F(u,v,xx,yy,zz);
-    double d[3];
-    d[0] = x - xx;
-    d[1] = y - yy;
-    d[2] = z - zz;
-    double abs_d = 0.;
-    for (int l=0;l<3;l++)
-      abs_d += d[l] * d[l];
-    abs_d = std::sqrt(abs_d);
-    for (int l=0;l<3;l++)
-      d[l] /= abs_d;
-    found = blendOp_->GetPointOnPatch(patchTag_,d,x,y,z);
-  }
-  found = blendOp_->GetPatch(patchTag_)->Inverse(x,y,z,u,v);
-}
-
-/*
-void BlendedPatch::F
-(double u, double v, double &x, double &y, double &z)
-{
-  if (_derivative) {
-    double px, py, pz, nx, ny, nz, d;
-    
-    u = patch_->RescaleU(u);
-    v = patch_->RescaleV(v);
-    
-    patch_->GetProjectionSurface()->F(u,v,px,py,pz);
-    patch_->GetProjectionSurface()->GetUnitNormal(u,v,nx,ny,nz);
-
-    u = patch_->UnscaleU(u);
-    v = patch_->UnscaleV(v);
-
-    d = _Interpolate(u, v).real();
-    
-    x = px + d * nx;
-    y = py + d * ny;
-    z = pz + d * nz;
-  }
-  else
-    _F(u,v,x,y,z);
-}
-
-bool BlendedPatch::
-Inverse(double x,double y,double z,double &u,double &v)
-{
-  bool result;
-
-  if (_derivative) {
-    result = patch_->GetProjectionSurface()->
-      OrthoProjectionOnSurface(x,y,z,u,v);
-    
-    u = patch_->UnscaleU(u);
-    v = patch_->UnscaleV(v);
-    
-    double tol = 1.e-12;
-    if ((u > - tol) && (u < 1. + tol) && (v > - tol) && (v < 1. + tol))
-      result = true;
-    else
-      result = false;
-  }
-  else
-    result = _Inverse(x,y,z,u,v);
-
-  return result;
-}
-*/
-
-void BlendedPatch::
-Dfdu(double u, double v, double &x, double &y, double &z)
-{
-  double px, py, pz, nx, ny, nz, d;
-  double pxu, pyu, pzu, nxu, nyu, nzu, du;
-
-  u = patch_->RescaleU(u);
-  v = patch_->RescaleV(v);
-
-  patch_->GetProjectionSurface()->F(u,v,px,py,pz);
-  patch_->GetProjectionSurface()->GetUnitNormal(u,v,nx,ny,nz);
-  patch_->GetProjectionSurface()->Dfdu(u,v,pxu,pyu,pzu);
-  patch_->GetProjectionSurface()->Dndu(u,v,nxu, nyu, nzu);
-
-  d = _Interpolate(u, v, 0, 0).real();
-  du = _Interpolate(u, v, 1, 0).real();
-
-  x = pxu + du * nx + d * nxu;
-  y = pyu + du * ny + d * nyu;
-  z = pzu + du * nz + d * nzu;
-}
-
-void BlendedPatch::
-Dfdv(double u, double v, double &x, double &y, double &z)
-{
-  double px, py, pz, nx, ny, nz, d;
-  double pxv, pyv, pzv, nxv, nyv, nzv, dv;
-
-  u = patch_->RescaleU(u);
-  v = patch_->RescaleV(v);
-
-  patch_->GetProjectionSurface()->F(u,v,px,py,pz);
-  patch_->GetProjectionSurface()->GetUnitNormal(u,v,nx,ny,nz);
-  patch_->GetProjectionSurface()->Dfdv(u,v,pxv,pyv,pzv);
-  patch_->GetProjectionSurface()->Dndv(u,v,nxv,nyv,nzv);
-
-  d = _Interpolate(u, v, 0, 0).real();
-  dv = _Interpolate(u, v, 0, 1).real();
-
-  x = pxv + dv * nx + d * nxv;
-  y = pyv + dv * ny + d * nyv;
-  z = pzv + dv * nz + d * nzv;
-}
-
-void BlendedPatch::
-Dfdfdudu(double u, double v, double &x, double &y, double &z)
-{
-  double px, py, pz, nx, ny, nz, d;
-  double pxu, pyu, pzu, nxu, nyu, nzu, du;
-  double pxuu, pyuu, pzuu, nxuu, nyuu, nzuu, duu;
-
-  u = patch_->RescaleU(u);
-  v = patch_->RescaleV(v);
-
-  patch_->GetProjectionSurface()->F(u,v,px,py,pz);
-  patch_->GetProjectionSurface()->GetUnitNormal(u,v,nx,ny,nz);
-  patch_->GetProjectionSurface()->Dfdu(u,v,pxu,pyu,pzu);
-  patch_->GetProjectionSurface()->Dndu(u,v,nxu,nyu,nzu);
-  patch_->GetProjectionSurface()->Dfdfdudu(u,v,pxuu,pyuu,pzuu);
-  patch_->GetProjectionSurface()->Dndndudu(u,v,nxuu,nyuu,nzuu);
-
-  d = _Interpolate(u, v, 0, 0).real();
-  du = _Interpolate(u, v, 1, 0).real();
-  duu = _Interpolate(u, v, 2, 0).real();
-
-  x = pxuu + duu * nx + du * nxu + du * nxu + d * nxuu;
-  y = pyuu + duu * ny + du * nyu + du * nyu + d * nyuu;
-  z = pzuu + duu * nz + du * nzu + du * nzu + d * nzuu;
-}
-
-void BlendedPatch::
-Dfdfdvdv(double u, double v, double &x, double &y, double &z)
-{
-  double px, py, pz, nx, ny, nz, d;
-  double pxv, pyv, pzv, nxv, nyv, nzv, dv;
-  double pxvv, pyvv, pzvv, nxvv, nyvv, nzvv, dvv;
-
-  u = patch_->RescaleU(u);
-  v = patch_->RescaleV(v);
-
-  patch_->GetProjectionSurface()->F(u,v,px,py,pz);
-  patch_->GetProjectionSurface()->GetUnitNormal(u,v,nx,ny,nz);
-  patch_->GetProjectionSurface()->Dfdv(u,v,pxv,pyv,pzv);
-  patch_->GetProjectionSurface()->Dndv(u,v,nxv,nyv,nzv);
-  patch_->GetProjectionSurface()->Dfdfdvdv(u,v,pxvv,pyvv,pzvv);
-  patch_->GetProjectionSurface()->Dndndvdv(u,v,nxvv,nyvv,nzvv);
-
-  d = _Interpolate(u, v, 0, 0).real();
-  dv = _Interpolate(u, v, 0, 1).real();
-  dvv = _Interpolate(u, v, 0, 2).real();
-
-  x = pxvv + dvv * nx + dv * nxv + dv * nxv + d * nxvv;
-  y = pyvv + dvv * ny + dv * nyv + dv * nyv + d * nyvv;
-  z = pzvv + dvv * nz + dv * nzv + dv * nzv + d * nzvv;
-}
-
-void BlendedPatch::
-Dfdfdudv(double u, double v, double &x, double &y, double &z)
-{
-  double px, py, pz, nx, ny, nz, d;
-  double pxu, pyu, pzu, nxu, nyu, nzu, du;
-  double pxv, pyv, pzv, nxv, nyv, nzv, dv;
-  double pxuv, pyuv, pzuv, nxuv, nyuv, nzuv, duv;
-
-  u = patch_->RescaleU(u);
-  v = patch_->RescaleV(v);
-
-  patch_->GetProjectionSurface()->F(u,v,px,py,pz);
-  patch_->GetProjectionSurface()->GetUnitNormal(u,v,nx,ny,nz);
-  patch_->GetProjectionSurface()->Dfdu(u,v,pxu,pyu,pzu);
-  patch_->GetProjectionSurface()->Dndu(u,v,nxu,nyu,nzu);
-  patch_->GetProjectionSurface()->Dfdv(u,v,pxv,pyv,pzv);
-  patch_->GetProjectionSurface()->Dndv(u,v,nxv,nyv,nzv);
-  patch_->GetProjectionSurface()->Dfdfdudv(u,v,pxuv,pyuv,pzuv);
-  patch_->GetProjectionSurface()->Dndndudv(u,v,nxuv,nyuv,nzuv);
-
-  d = _Interpolate(u, v, 0, 0).real();
-  du = _Interpolate(u, v, 1, 0).real();
-  dv = _Interpolate(u, v, 1, 0).real();
-  duv = _Interpolate(u, v, 1, 1).real();
-
-  x = pxuv + duv * nx + du * nxv + dv * nxu + d * nxuv;
-  y = pyuv + duv * ny + du * nyv + dv * nyu + d * nyuv;
-  z = pzuv + duv * nz + du * nzv + dv * nzu + d * nzuv;
-}
-
-double  BlendedPatch::GetPou(double u, double v)
-{
-  double pouU, pouV;
-
-  if (patch_->IsHardEdge(3))
-    pouU = OneSidedPartitionOfUnity(0.,1.,u);
-  else if (patch_->IsHardEdge(1))
-    pouU = 1. - OneSidedPartitionOfUnity(0.,1.,u);
-  else
-    pouU = PartitionOfUnity(u, 0., 0.3, 0.7, 1.);
-
-  if (patch_->IsHardEdge(0))
-    pouV = OneSidedPartitionOfUnity(0.,1.,v);
-  else if (patch_->IsHardEdge(2))
-    pouV = 1. - OneSidedPartitionOfUnity(0.,1.,v);
-  else
-    pouV = PartitionOfUnity(v, 0., 0.3, 0.7, 1.);
-
-  return pouU * pouV;
-}
diff --git a/contrib/FourierModel/BlendedPatch.h b/contrib/FourierModel/BlendedPatch.h
deleted file mode 100755
index 7fa138168d..0000000000
--- a/contrib/FourierModel/BlendedPatch.h
+++ /dev/null
@@ -1,104 +0,0 @@
-#ifndef _BLENDED_PATCH_H_
-#define _BLENDED_PATCH_H_
-
-#include <fftw3.h>
-#include "Message.h"
-#include "Patch.h"
-#include "BlendOperator.h"
-#include "PartitionOfUnity.h"
-
-namespace FM {
-
-class BlendedPatch {
- private:
-  Patch* patch_;
-  BlendOperator* blendOp_;
-
-  int nPatches_;
-  int patchTag_;
-
-  bool IsUPeriodic, IsVPeriodic;
-
-  // bitfield telling if we also interpolate the derivative(s)
-  int _derivative;
-  // Number of Modes in reprocessed Fourier/Chebyshev series
-  int _uM, _vM;
-   // Period Information
-  double _periodU, _periodV;
-  // Limits in the series
-  int _uMLower, _uMUpper, _vMLower, _vMUpper;
-  // data (and its first 2 derivatives)
-  std::complex<double> **_coeffData, **_coeffDerivU, **_coeffDerivV;
-  std::complex<double> **_coeffDerivUU, **_coeffDerivVV, **_coeffDerivUV;
-  // temporary interpolation variables
-  std::vector< std::complex<double> > _tmpCoeff, _tmpInterp;
-  // polynomial evaluator
-  std::complex<double> _PolyEval(std::vector< std::complex<double> > _coeff,
-                                 std::complex<double> x);
-  // interpolation wrapper
-  std::complex<double> _Interpolate(double u,double v,int uDer=0,int vDer=0);
-  // other internal functions
-  void _ProcessSeriesCoeff();
-  // persistent fftw data (used to avoid recomputing the FFTW plans
-  // and reallocating memory every time)
-  static int _forwardSize, _backwardSize;
-  static fftw_plan _forwardPlan, _backwardPlan;
-  static fftw_complex *_forwardData, *_backwardData;
-  void _SetForwardPlan(int n);
-  void _SetBackwardPlan(int n);
-  // This routine computes the forward FFT (ignoring the last element
-  // of the data)
-  void _ForwardFft(int n, std::complex<double> *fftData);
-  // This routine computes the inverse FFT (ignoring the last element
-  // in the array), returns values in entire array (by using the
-  // periodic extension)
-  void _BackwardFft(int n, std::complex<double> *fftData);
-
- protected:
-
- public:
-  BlendedPatch(Patch* patch, BlendOperator* blendOp);
-  ~BlendedPatch();
-
-  double GetPou(double u, double v);
-
-  void F
-    (double u, double v, double &x, double &y, double &z);
-
-  bool Inverse
-    (double x,double y,double z,double &u,double &v);
-
-  void Dfdu
-    (double u, double v, double &x, double &y, double &z);
-
-  void Dfdv
-    (double u, double v, double &x, double &y, double &z);
-
-  void Dfdfdudu
-    (double u,double v,double &x,double &y,double &z);
-
-  void Dfdfdudv
-    (double u,double v,double &x,double &y,double &z);
-
-  void Dfdfdvdv
-    (double u,double v,double &x,double &y,double &z);
-
-  void Dndu
-    (double u, double v, double &x, double &y, double &z);
-
-  void Dndv
-    (double u, double v, double &x, double &y, double &z);
-
-  void GetUnitNormal
-    (double u,double v,double &x,double &y,double &z);
-
-  void GetNormal
-    (double u, double v, double &x, double &y, double &z);
-
-  int GetTag
-    () { return patchTag_; }
-};
-
-}
-
-#endif
diff --git a/contrib/FourierModel/ContinuationPatch.cpp b/contrib/FourierModel/ContinuationPatch.cpp
deleted file mode 100644
index 6ac87cbddd..0000000000
--- a/contrib/FourierModel/ContinuationPatch.cpp
+++ /dev/null
@@ -1,933 +0,0 @@
-#include <math.h>
-#include "Message.h"
-#include "ContinuationPatch.h"
-
-using namespace FM;
-
-ContinuationPatch::ContinuationPatch
-(PatchInfo* PI, ProjectionSurface* ps)
-  : Patch(),_coeffOriginalData(0),_coeffData(0),_coeffDerivU(0),
-    _coeffDerivV(0),_coeffDerivUU(0),_coeffDerivVV(0),_coeffDerivUV(0)
-{
-  _PI = PI;
-  _tag = _PI->tag;
-  _derivative = _PI->derivative;
-  _recompute = _PI->recompute;
-
-  SetProjectionSurface(ps);
-
-  _uMin = _PI->uMin;
-  _uMax = _PI->uMax;
-  _vMin = _PI->vMin;
-  _vMax = _PI->vMax;
-
-  if (_ps->IsUPeriodic())
-    _periodicityU = 1;
-  if (_ps->IsVPeriodic())
-    _periodicityV = 1;
-
-  for (int i = 0; i < 4; i++)
-    _hardEdge[i] = _PI->hardEdge[i];
-
-  if (_ps->IsUPeriodic())
-    _periodU = 1.;
-  else
-    _periodU = 2.;
-
-  if (_ps->IsVPeriodic())
-    _periodV = 1.;
-  else
-    _periodV = 2.;
-
-  _uModes = _PI->nModes[0];
-  _vModes = _PI->nModes[1];
-
-  if ((_uModes % 2) == 0) {
-    _uModesLower = - _uModes/2;
-    _uModesUpper = _uModes/2 - 1;
-  }
-  else {
-    _uModesLower = - (_uModes - 1)/2;
-    _uModesUpper = (_uModes - 1)/2;
-  }
-  if ((_vModes % 2) == 0) {
-    _vModesLower = - _vModes/2;
-    _vModesUpper = _vModes/2 - 1;
-  }
-  else {
-    _vModesLower = - (_vModes - 1)/2;
-    _vModesUpper = (_vModes - 1)/2;
-  }
-
-  _uM = _PI->nM[0];
-  _vM = _PI->nM[1];
-
-  if (IsUPeriodic()) {
-    if ((_uM % 2) == 0) {
-      _uMLower = - _uM/2;
-      _uMUpper = _uM/2 - 1;
-    }
-    else {
-      _uMLower = - (_uM - 1)/2;
-      _uMUpper = (_uM - 1)/2;
-    }
-  }
-  else {
-    _uMLower = 0;
-    _uMUpper = _uM;
-  }
-  if (IsVPeriodic()) {
-    if ((_vM % 2) == 0) {
-      _vMLower = - _vM/2;
-      _vMUpper = _vM/2 - 1;
-    }
-    else {
-      _vMLower = - (_vM - 1)/2;
-      _vMUpper = (_vM - 1)/2;
-    }
-  }
-  else {
-    _vMLower = 0;
-    _vMUpper = _vM;    
-  }
-
-  // Initialize interpolation variables
-  _tmpCoeff = std::vector< std::complex<double> >(_vM);
-  _tmpInterp = std::vector< std::complex<double> >(_uM);
-
-  // Initialize Data
-  _coeffOriginalData = new std::complex<double>*[_uModes];
-  for(int j = 0; j < _uModes; j++){
-    _coeffOriginalData[j] = new std::complex<double>[_vModes];
-    for(int k = 0; k < _vModes; k++)
-      _coeffOriginalData[j][k] = _PI->coeffFourier[j][k];
-  }
-
-  // Initialize interpolation variables
-  _tmpOrigCoeff = std::vector< std::complex<double> >(_vModes);
-  _tmpOrigInterp = std::vector< std::complex<double> >(_uModes);
-
-  if (_derivative) {
-    // Initialize Chebyshev coefficients
-    _coeffData = new std::complex<double>*[_uM];
-    for(int j = 0; j < _uM; j++) {
-      _coeffData[j] = new std::complex<double>[_vM];
-      for(int k = 0; k < _vM; k++)
-	_coeffData[j][k] = 0.;
-    }
-    // Initialize Deriv and Deriv2 to zero
-    if(_derivative & 1){
-      _coeffDerivU = new std::complex<double>*[_uM];
-      _coeffDerivV = new std::complex<double>*[_uM];
-      for(int j = 0; j < _uM; j++){
-	_coeffDerivU[j] = new std::complex<double>[_vM];
-	_coeffDerivV[j] = new std::complex<double>[_vM];
-	for(int k = 0; k < _vM; k++){
-	  _coeffDerivU[j][k] = 0.;
-	  _coeffDerivV[j][k] = 0.;
-	}
-      }
-    }
-    if(_derivative & 2){
-      _coeffDerivUU = new std::complex<double>*[_uM];
-      _coeffDerivVV = new std::complex<double>*[_uM];
-      _coeffDerivUV = new std::complex<double>*[_uM];
-      for(int j = 0; j < _uM; j++){
-        _coeffDerivUU[j] = new std::complex<double>[_vM];
-        _coeffDerivVV[j] = new std::complex<double>[_vM];
-        _coeffDerivUV[j] = new std::complex<double>[_vM];
-        for(int k = 0; k < _vM; k++){
-          _coeffDerivUU[j][k] = 0.;
-          _coeffDerivVV[j][k] = 0.;
-          _coeffDerivUV[j][k] = 0.;
-        }
-      }
-    }
-    if (_recompute) {
-      _ReprocessSeriesCoeff();
-      // Copy the Fourier coefficients into _coeffDeriv and _coeffDeriv2
-      std::complex<double> I(0., 1.);
-      for(int j = _uM - 1; j >= 0; j--){
-	for(int k = _vM - 1; k >= 0; k--){
-	  if(_derivative & 1){
-	    if (IsUPeriodic()) {
-	      int J = j+_uMLower;
-	      _coeffDerivU[j][k] = (2 * M_PI * J * I / _periodU) *
-		_coeffData[j][k];
-	    }
-	    else {
-	      if (j == _uM - 1)
-		_coeffDerivU[j][k] = 0.;
-	      else if (j == _uM - 2)
-		_coeffDerivU[j][k] = 
-		  2. * (double)(j + 1) * _coeffData[j + 1][k];
-	      else
-		_coeffDerivU[j][k] = _coeffDerivU[j + 2][k] +
-		  2. * (double)(j + 1) * _coeffData[j + 1][k];
-	    }
-	    if (IsVPeriodic()) {
-	      int K = k+_vMLower;
-	      _coeffDerivV[j][k] = (2 * M_PI * K * I / _periodV) *
-		_coeffData[j][k];
-	    }
-	    else {
-	      if (k == _vM - 1)
-		_coeffDerivV[j][k] = 0.;
-	      else if (k == _vM - 2)
-		_coeffDerivV[j][k] = 
-		  2. * (double)(k + 1) * _coeffData[j][k + 1];
-	      else
-		_coeffDerivV[j][k] = _coeffDerivV[j][k + 2] +
-		  2. * (double)(k + 1) * _coeffData[j][k + 1];
-	    }
-	  }
-	}
-      }
-      for (int j = 0; j < _uM; j++) {
-	for (int k = 0; k < _vM; k++) {
-	  if (_derivative & 1) {
-	    if (!IsUPeriodic()) {
-	      if (j != 0) {
-		_coeffDerivU[j][k] *= 2.;
-	      }
-	    }
-	    if (!IsVPeriodic()) {
-	      if (k != 0) {
-		_coeffDerivV[j][k] *= 2.;
-	      }
-	    }
-	  }
-	}
-      }
-      
-      for(int j = _uM - 1; j >= 0; j--) {
-	for(int k = _vM - 1; k >= 0; k--) {
-	  if(_derivative & 2) {
-	    if (IsUPeriodic()) {
-	      int J = j+_uMLower;
-	      _coeffDerivUU[j][k] = (2 * M_PI * J * I / _periodU) * 
-		_coeffDerivU[j][k];
-	    }
-	    else {
-	      if (j == _uM - 1)
-		_coeffDerivUU[j][k] = 0.;
-	      else if (j == _uM - 2)
-		_coeffDerivUU[j][k] = 2. * (double)(j + 1) * 
-		  _coeffDerivU[j + 1][k];
-	      else
-		_coeffDerivUU[j][k] = _coeffDerivUU[j + 2][k] +
-		  2. * (double)(j + 1) * _coeffDerivU[j + 1][k];
-	    }
-	    if (IsVPeriodic()) {
-	      int K = k+_vMLower;
-	      _coeffDerivVV[j][k] = (2 * M_PI * K * I / _periodV) * 
-		_coeffDerivV[j][k];
-	      _coeffDerivUV[j][k] = (2 * M_PI * K * I / _periodV) * 
-		_coeffDerivU[j][k];
-	    }
-	    else {
-	      if (k == _vM - 1) {
-		_coeffDerivVV[j][k] = 0.;
-		_coeffDerivUV[j][k] = 0.;
-	      }
-	      else if (k == _vM - 2) {
-		_coeffDerivVV[j][k] = 2. * (double)(k + 1) * 
-		  _coeffDerivV[j][k + 1];
-		_coeffDerivUV[j][k] = 2. * (double)(k + 1) * 
-		  _coeffDerivU[j][k + 1];
-	      }
-	      else {
-		_coeffDerivVV[j][k] = _coeffDerivVV[j][k + 2] +
-		  2. * (double)(k + 1) * _coeffDerivV[j][k + 1];
-		_coeffDerivUV[j][k] = _coeffDerivUV[j][k + 2] +
-		  2. * (double)(k + 1) * _coeffDerivU[j][k + 1];
-	      }
-	    }
-	  }
-	}
-      }
-      for (int j = 0; j < _uM; j++) {
-	for (int k = 0; k < _vM; k++) {
-	  if (_derivative & 2) {
-	    if (!IsUPeriodic() && IsVPeriodic()) {
-	      if (j != 0) {
-		_coeffDerivUU[j][k] *= 2.;
-	      }
-	    }
-	    if (IsUPeriodic() && !IsVPeriodic()) {
-	      if (k != 0) {
-		_coeffDerivVV[j][k] *= 2.;
-		_coeffDerivUV[j][k] *= 2.;
-	      }
-	    }
-	  }
-	}
-      }
-    }
-    else {
-      for (int j = 0; j < _uM; j++) {
-	for (int k = 0; k < _vM; k++) {
-	  _coeffData[j][k] = _PI->coeffCheby[j][k];
-	  _coeffDerivU[j][k] = _PI->coeffDerivU[j][k];
-	  _coeffDerivV[j][k] = _PI->coeffDerivV[j][k];
-	  _coeffDerivUU[j][k] = _PI->coeffDerivUU[j][k];
-	  _coeffDerivUV[j][k] = _PI->coeffDerivUV[j][k];
-	  _coeffDerivVV[j][k] = _PI->coeffDerivVV[j][k];
-	}
-      }
-    }
-  }
-}
-
-ContinuationPatch::~ContinuationPatch()
-{
-  for(int j = 0; j < _uModes; j++)
-    delete [] _coeffOriginalData[j];
-  delete [] _coeffOriginalData;
-
-  for(int j = 0; j < _uM; j++)
-    delete [] _coeffData[j];
-  delete [] _coeffData;
-
-  if(_coeffDerivU){
-    for(int j = 0; j < _uM; j++)
-      delete [] _coeffDerivU[j];
-    delete [] _coeffDerivU;
-  }
-  if(_coeffDerivV){
-    for(int j = 0; j < _uM; j++)
-      delete [] _coeffDerivV[j];
-    delete [] _coeffDerivV;
-  }
-  if(_coeffDerivUU){
-    for(int j = 0; j < _uM; j++)
-      delete [] _coeffDerivUU[j];
-    delete [] _coeffDerivUU;
-  }
-  if(_coeffDerivVV){
-    for(int j = 0; j < _uM; j++)
-      delete [] _coeffDerivVV[j];
-    delete [] _coeffDerivVV;
-  }
-  if(_coeffDerivUV){
-    for(int j = 0; j < _uM; j++)
-      delete [] _coeffDerivUV[j];
-    delete [] _coeffDerivUV;
-  }
-}
-
-int ContinuationPatch::_forwardSize = 0;
-int ContinuationPatch::_backwardSize = 0;
-fftw_plan ContinuationPatch::_forwardPlan;
-fftw_plan ContinuationPatch::_backwardPlan;
-fftw_complex *ContinuationPatch::_forwardData = 0;
-fftw_complex *ContinuationPatch::_backwardData = 0;
-
-void ContinuationPatch::_SetForwardPlan(int n)
-{
-  if(n != _forwardSize){
-    if(_forwardSize){
-      fftw_destroy_plan(_forwardPlan);
-      fftw_free(_forwardData);
-    }
-    _forwardSize = n;
-    _forwardData = 
-      (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * _forwardSize);
-    _forwardPlan = 
-      fftw_plan_dft_1d(_forwardSize, _forwardData, _forwardData,
-		       FFTW_FORWARD, FFTW_ESTIMATE);
-  }
-}
-
-void ContinuationPatch::_SetBackwardPlan(int n)
-{
-  if(n != _backwardSize){
-    if(_backwardSize){
-      fftw_destroy_plan(_backwardPlan);
-      fftw_free(_backwardData);
-    }
-    _backwardSize = n;
-    _backwardData = 
-      (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * _backwardSize);
-    _backwardPlan = 
-      fftw_plan_dft_1d(_backwardSize, _backwardData, _backwardData,
-		       FFTW_BACKWARD, FFTW_ESTIMATE);
-  }
-}
-
-void ContinuationPatch::_ForwardFft(int n, std::complex<double> *fftData)
-{
-  // Initialize fftw plan and array (ignoring the last element of
-  // fftData, which should just be the periodic extension)
-  _SetForwardPlan(n - 1);
-  for(int i = 0; i < n - 1; i++){
-    _forwardData[i][0] = fftData[i].real();
-    _forwardData[i][1] = fftData[i].imag();
-  }
-
-  // Perform forward FFT
-  fftw_execute(_forwardPlan);
-
-  // Copy data back into fftData and scale by 1/(n - 1)
-  double s = 1. / (double)(n - 1);
-  for(int i = 0; i < n - 1; i++)
-    fftData[i] = 
-      s * std::complex<double>(_forwardData[i][0], _forwardData[i][1]);
-}
-
-void ContinuationPatch::_BackwardFft(int n, std::complex<double> *fftData)
-{
-  // Initialize fftw plan and array (ignoring last element of fftData)
-  _SetBackwardPlan(n - 1);
-  for(int i = 0; i < n - 1; i++){
-    _backwardData[i][0] = fftData[i].real();
-    _backwardData[i][1] = fftData[i].imag();
-  }
-
-  // Perform backward FFT
-  fftw_execute(_backwardPlan);
-
-  // Copy data back into fftData
-  for(int i = 0; i < n - 1; i++)
-    fftData[i] = 
-      std::complex<double>(_backwardData[i][0], _backwardData[i][1]);
-
-  // Fill in last element with copy of first element
-  fftData[n - 1] = fftData[0];
-}
-
-void ContinuationPatch::_ReprocessSeriesCoeff()
-{
-  if (IsUPeriodic() && IsVPeriodic()) {
-    int uShift = (_uM-_uModes)%2 == 0 ? (_uM-_uModes)/2 : (_uM-_uModes)/2 + 1;
-    int vShift = (_vM-_vModes)%2 == 0 ? (_vM-_vModes)/2 : (_vM-_vModes)/2 + 1;
-    for (int j = 0; j < _uModes; j++)
-      for (int k = 0; k < _vModes; k++)
-	_coeffData[uShift + j][vShift + k] = _coeffOriginalData[j][k];
-  }
-  else if (IsUPeriodic()) {
-    std::vector<double> u(_uM), v(_vM + 1);
-    for (int j = 0; j < _uM; j++)
-      u[j] = (double)j / (double)(_uM-1);
-    for (int j = 0; j < _vM + 1; j++)
-      v[j] = (double)j / (double)_vM;
-
-    std::complex<double> **dataU = new std::complex<double> *[_vM];
-    for (int k = 0; k < _vM; k++)
-      dataU[k] = new std::complex<double> [_uM];
-    std::complex<double> *dataV = new std::complex<double>[2*_vM + 1];
-    for (int j = 0; j < _uM - 1; j++) {
-	for (int k = 0; k < _vM + 1; k++) {
-	  //dataV[k] = 1.;
-	  //dataV[k] = 2. * cos(M_PI * v[k]) * cos(M_PI * v[k]) - 1.;
-	  //dataV[k] = 2. * (0.5 * cos(M_PI * v[k]) + 0.5) *
-	  //(0.5 * cos(M_PI * v[k]) + 0.5) - 1.;
-	  //dataV[k] = 2. * (0.5 * cos(M_PI * v[k]) + 0.5) *
-	  //(0.5 * cos(M_PI * v[k]) + 0.5) * cos(2 * M_PI * u[j]);
-	  //dataV[k] = cos(0.5 * cos(M_PI * v[k]) + 0.5) * 
-	  //cos(2 * M_PI * u[j]);
-	  dataV[k] = _Interpolate(u[j],0.5 * cos(M_PI * v[k]) + 0.5);
-	}
-      for (int k = 1; k < _vM+1; k++)
-	dataV[_vM + k] = dataV[_vM -k];
-      _BackwardFft(2*_vM + 1, dataV);
-      dataU[0][j] = 0.5 * dataV[0] / (double)_vM;
-      for (int k=1; k<_vM-1; k++)
-	dataU[k][j] = dataV[k] / (double)_vM;
-      dataU[_vM-1][j] = 0.5 * dataV[_vM-1] / (double)_vM;
-    }
-    for (int k = 0; k < _vM; k++) {
-      dataU[k][_uM - 1] = dataU[k][0];
-      _ForwardFft(_uM, dataU[k]);
-    }
-    for (int j = _uMLower; j <= _uMUpper; j++) {
-      for (int k = 0; k < _vM; k++)
-	if ((j == _uMLower) || (j == _uMUpper))
-	  _coeffData[_uMUpper + j][k] = dataU[k][_uMUpper] / 2.;
-	else if ((j >= 0) && (j < _uMUpper))
-	  _coeffData[_uMUpper + j][k] = dataU[k][j];
-	else
-	  _coeffData[_uMUpper + j][k] = dataU[k][_uM + j -1];
-    }
-    for (int k = 0; k < _vM; k++)
-      delete [] dataU[k];
-    delete [] dataU;
-    delete [] dataV;
-  }
-  else if (IsVPeriodic()){
-    std::vector<double> u(_uM + 1), v(_vM);
-    for (int j = 0; j < _uM + 1; j++)
-      u[j] = (double)j / (double)_uM;
-    for (int j = 0; j < _vM; j++)
-      v[j] = (double)j / (double)(_vM-1);
-
-    std::complex<double> **dataV = new std::complex<double> *[_uM];
-    for (int j = 0; j < _uM; j++)
-      dataV[j] = new std::complex<double> [_vM];
-    std::complex<double> *dataU = new std::complex<double>[2*_uM + 1];
-    for (int k = 0; k < _vM - 1; k++) {
-      for (int j = 0; j < _uM + 1; j++) {
-	//dataU[j] = 1.;
-	//dataU[j] = 2. * cos(M_PI * u[j]) * cos(M_PI * u[j]);
-	dataU[j] = _Interpolate(0.5 * cos(M_PI * u[j]) + 0.5,v[k]);
-      }
-      for (int j = 1; j < _uM+1; j++)
-	dataU[_uM + j] = dataU[_uM -j];
-      _BackwardFft(2*_uM + 1, dataU);
-      dataV[0][k] = 0.5 * dataU[0] / (double)_uM;
-      for (int j=1; j<_uM-1; j++)
-	dataV[j][k] = dataU[j] / (double)_uM;
-      dataV[_uM-1][k] = 0.5 * dataU[_uM-1] / (double)_uM;
-    }
-    for (int j = 0; j < _uM; j++) {
-      dataV[j][_uM - 1] = dataV[j][0];
-      _ForwardFft(_vM, dataV[j]);
-    }
-    for (int k = _vMLower; k <= _vMUpper; k++) {
-      //for (int j = 0; j < _uM - 1; j++) {
-      for (int j = 0; j < _uM; j++)
-	if ((k == _vMLower) || (k == _vMUpper))
-	  _coeffData[j][_vMUpper + k] = dataV[j][_vMUpper] / 2.;
-	else if ((j >= 0) && (j < _vMUpper))
-	  _coeffData[j][_uMUpper + k] = dataV[j][k];
-	else
-	  _coeffData[j][_uMUpper + k] = dataV[j][_uM + k -1];
-    }
-    for (int j = 0; j < _uM; j++)
-      delete [] dataV[j];
-    delete [] dataV;
-    delete [] dataU;
-  }
-  else {
-    std::vector<double> u(_uM + 1), v(_vM + 1);
-    for (int j = 0; j < _uM + 1; j++)
-      u[j] = (double)j / (double)_uM;
-    for (int j = 0; j < _vM + 1; j++)
-      v[j] = (double)j / (double)_vM;
-
-    std::complex<double> **dataU = new std::complex<double> *[_vM];
-    for (int k = 0; k < _vM; k++)
-      dataU[k] = new std::complex<double> [2*_uM + 1];
-
-    std::complex<double> *dataV = new std::complex<double>[2*_vM + 1];
-    for (int j = 0; j < _uM + 1; j++) {
-      for (int k = 0; k < _vM + 1; k++) {
-	dataV[k] = _Interpolate(0.5 * cos(M_PI * u[j]) + 0.5,
-				0.5 * cos(M_PI * v[k]) + 0.5);
-      }
-      for (int k = 1; k < _vM+1; k++)
-	dataV[_vM + k] = dataV[_vM - k];
-      _BackwardFft(2*_vM + 1, dataV);
-      dataU[0][j] = 0.5 * dataV[0] / (double)_vM;
-      for (int k=1; k<_vM-1; k++)
-	dataU[k][j] = dataV[k] / (double)_vM;
-      dataU[_vM-1][j] = 0.5 * dataV[_vM-1] / (double)_vM;
-    }
-
-    for (int k = 0; k < _vM; k++) {
-      for (int j = 1; j < _uM+1; j++) {
-	dataU[k][_uM + j] = dataU[k][_uM - k];
-      }
-      _BackwardFft(2*_uM + 1, dataU[k]);
-    }
-
-    for (int j = 0; j < _uM; j++) {
-      for (int k = 0; k < _vM; k++) {
-	if ((j == 0) || (j == _uM - 1))
-	  _coeffData[j][k] = 0.5 * dataU[k][j]/ (double)_uM;
-	else
-	  _coeffData[j][k] = dataU[k][j]/ (double)_uM;
-      }
-    }
-    for (int k = 0; k < _vM; k++)
-      delete [] dataU[k];
-    delete [] dataU;
-    delete [] dataV;
-  }
-}
-
-std::complex<double> ContinuationPatch::
-_PolyEval(std::vector< std::complex<double> > _coeff, std::complex<double> x)
-{
-  int _polyOrder = _coeff.size()-1;
-  std::complex<double> out = 0.;
-
-  out = x * _coeff[_polyOrder];
-  for (int i = _polyOrder - 1; i > 0; i--)
-    out = x * (out + _coeff[i]);
-  out = out + _coeff[0];
-
-  return out;
-}
-
-std::complex<double> ContinuationPatch::
-  _Interpolate(double u, double v)
-{
-  double epsilon = 1e-12;
-  if (u < 0. - epsilon || u > 1. + epsilon || 
-      v < 0. - epsilon || v > 1. + epsilon) {
-    Msg::Error("Trying to interpolate outside interval: (u,v)=(%.16g,%.16g) "
-               "not in [%g,%g]x[%g,%g]", u, v, 0., 1., 0., 1.); 
-  }
-  
-  // Interpolate to find value at (u,v)
-  for(int j = 0; j < _uModes; j++){
-    for(int k = 0; k < _vModes; k++) {
-      _tmpOrigCoeff[k] = _coeffOriginalData[j][k];
-    }
-    std::complex<double> y(cos(2 * M_PI * v / _periodV),
-                           sin(2 * M_PI * v / _periodV));
-    _tmpOrigInterp[j] = _PolyEval(_tmpOrigCoeff, y);
-    _tmpOrigInterp[j] *= std::complex<double>
-      (cos(2 * M_PI * _vModesLower * v / _periodV),
-       sin(2 * M_PI * _vModesLower * v / _periodV));
-  }
-  std::complex<double> x(cos(2 * M_PI * u / _periodU),
-                         sin(2 * M_PI * u / _periodU));
-  return _PolyEval(_tmpOrigInterp, x) * std::complex<double>
-    (cos(2 * M_PI * _uModesLower * u / _periodU),
-     sin(2 * M_PI * _uModesLower * u / _periodU));
-}
-
-std::complex<double> ContinuationPatch::
-  _Interpolate(double u, double v, int uDer, int vDer)
-{
-  //Msg::Info("%d %d %d",uDer,vDer,_derivative);
-  if (((uDer==2 || vDer==2 || (uDer==1 && vDer==1)) && !(_derivative & 2) ) ||
-      ((uDer==1 || vDer==1) && !(_derivative & 1)) ||
-      (uDer<0 || uDer>2 || vDer<0 || vDer>2) ) {
-    Msg::Error("Derivative data not available: check contructor call %d %d %d",
-               uDer,vDer,_derivative);
-    return 0.;
-  }
-
-  double epsilon = 1e-12;
-  if (u < 0. - epsilon || u > 1. + epsilon) {
-    Msg::Error("Trying to interpolate outside interval: (u,v)=(%.16g,%.16g) "
-               "not in [%g,%g]x[%g,%g]", u, v, 0., 1., 0., 1.); 
-  }
-  std::vector<double> uT(_uM,0.);
-  std::vector<double> vT(_vM,0.);
-  if (!IsUPeriodic()) {
-    for (int j = 0; j < _uM; j++)
-      if (j == 0)
-	uT[j] = 1.;
-      else if (j == 1)
-	uT[j] = 2. * u - 1;
-      else
-	uT[j] = 2. * uT[1] * uT[j-1] - uT[j-2];
-  }
-  if (!IsVPeriodic()) {
-    for (int k = 0; k < _vM; k++)
-      if (k == 0)
-	vT[k] = 1.;
-      else if (k == 1)
-	vT[k] = 2. * v - 1.;
-      else
-	vT[k] = 2. * vT[1] * vT[k-1] - vT[k-2];
-  }
-  // Interpolate to find value at (u,v)
-  for(int j = 0; j < _uM; j++){
-    _tmpInterp[j] = 0.;
-    for(int k = 0; k < _vM; k++){
-      //printf("i was here %d %d\n",j,k);
-      std::complex<double> tmp;
-      if(uDer == 0 && vDer == 0)
-	tmp = _coeffData[j][k];
-      else if(uDer == 1 && vDer == 0)
-	tmp = _coeffDerivU[j][k];
-      else if(uDer == 0 && vDer == 1)
-	tmp = _coeffDerivV[j][k];
-      else if(uDer == 2 && vDer == 0)
-	tmp = _coeffDerivUU[j][k];
-      else if(uDer == 0 && vDer == 2)
-	tmp = _coeffDerivVV[j][k];
-      else
-	tmp = _coeffDerivUV[j][k];
-      _tmpCoeff[k] = tmp;
-    }
-    //printf("i was here 00\n");
-    if (IsVPeriodic()) {
-      std::complex<double> y(cos(2 * M_PI * v / _periodV),
-			     sin(2 * M_PI * v / _periodV));
-      _tmpInterp[j] = _PolyEval(_tmpCoeff, y);
-      _tmpInterp[j] *= std::complex<double>
-	(cos(2 * M_PI * _vMLower * v / _periodV),
-	 sin(2 * M_PI * _vMLower * v / _periodV));
-    }
-    else {
-      //printf("i was here 0\n");
-      for(int k = 0; k < _vM; k++)
-	_tmpInterp[j] += _tmpCoeff[k] * vT[k];
-    }
-  }
-  //printf("i was here\n");
-  if (IsUPeriodic()) {
-    std::complex<double> x(cos(2 * M_PI * u / _periodU),
-			   sin(2 * M_PI * u / _periodU));
-    return _PolyEval(_tmpInterp, x) * std::complex<double>
-      (cos(2 * M_PI * _uMLower * u / _periodU),
-       sin(2 * M_PI * _uMLower * u / _periodU));
-  }
-  else {
-    std::complex<double> tmp = 0.;
-    for(int j = 0; j < _uM; j++)
-      tmp += _tmpInterp[j] * uT[j];
-    return tmp;
-  }
-}
-
-void ContinuationPatch::
-F(double u, double v, double &x, double &y, double &z)
-{
-  double px, py, pz, nx, ny, nz, d;
-
-  u = RescaleU(u);
-  v = RescaleV(v);
-
-  _ps->F(u,v,px,py,pz);
-  _ps->GetUnitNormal(u,v,nx,ny,nz);
-
-  d = _Interpolate(u, v).real();
-
-  x = px + d * nx;
-  y = py + d * ny;
-  z = pz + d * nz;
-}
-
-bool ContinuationPatch::
-Inverse(double x,double y,double z,double &u,double &v)
-{
-  bool result = _ps->OrthoProjectionOnSurface(x,y,z,u,v);
-
-  u = UnscaleU(u);
-  v = UnscaleV(v);
-
-  double tol = 1.e-12;
-  if ((u > - tol) && (u < 1. + tol) && (v > - tol) && (v < 1. + tol))
-    result = true;
-  else
-    result = false;
-
-  return result;
-}
-
-void ContinuationPatch::
-Dfdu(double u, double v, double &x, double &y, double &z)
-{
-  double px, py, pz, nx, ny, nz, d;
-  double pxu, pyu, pzu, nxu, nyu, nzu, du;
-
-  u = RescaleU(u);
-  v = RescaleV(v);
-
-  _ps->F(u,v,px,py,pz);
-  _ps->GetUnitNormal(u,v,nx,ny,nz);
-  _ps->Dfdu(u,v,pxu,pyu,pzu);
-  _ps->Dndu(u,v,nxu, nyu, nzu);
-
-  d = _Interpolate(u, v, 0, 0).real();
-  du = _Interpolate(u, v, 1, 0).real();
-
-  x = pxu + du * nx + d * nxu;
-  y = pyu + du * ny + d * nyu;
-  z = pzu + du * nz + d * nzu;
-}
-
-void ContinuationPatch::
-Dfdv(double u, double v, double &x, double &y, double &z)
-{
-  double px, py, pz, nx, ny, nz, d;
-  double pxv, pyv, pzv, nxv, nyv, nzv, dv;
-
-  u = RescaleU(u);
-  v = RescaleV(v);
-
-  _ps->F(u,v,px,py,pz);
-  _ps->GetUnitNormal(u,v,nx,ny,nz);
-  _ps->Dfdv(u,v,pxv,pyv,pzv);
-  _ps->Dndv(u,v,nxv,nyv,nzv);
-
-  d = _Interpolate(u, v, 0, 0).real();
-  dv = _Interpolate(u, v, 0, 1).real();
-
-  x = pxv + dv * nx + d * nxv;
-  y = pyv + dv * ny + d * nyv;
-  z = pzv + dv * nz + d * nzv;
-}
-
-void ContinuationPatch::
-Dfdfdudu(double u, double v, double &x, double &y, double &z)
-{
-  double px, py, pz, nx, ny, nz, d;
-  double pxu, pyu, pzu, nxu, nyu, nzu, du;
-  double pxuu, pyuu, pzuu, nxuu, nyuu, nzuu, duu;
-
-  u = RescaleU(u);
-  v = RescaleV(v);
-
-  _ps->F(u,v,px,py,pz);
-  _ps->GetUnitNormal(u,v,nx,ny,nz);
-  _ps->Dfdu(u,v,pxu,pyu,pzu);
-  _ps->Dndu(u,v,nxu,nyu,nzu);
-  _ps->Dfdfdudu(u,v,pxuu,pyuu,pzuu);
-  _ps->Dndndudu(u,v,nxuu,nyuu,nzuu);
-
-  d = _Interpolate(u, v, 0, 0).real();
-  du = _Interpolate(u, v, 1, 0).real();
-  duu = _Interpolate(u, v, 2, 0).real();
-
-  x = pxuu + duu * nx + du * nxu + du * nxu + d * nxuu;
-  y = pyuu + duu * ny + du * nyu + du * nyu + d * nyuu;
-  z = pzuu + duu * nz + du * nzu + du * nzu + d * nzuu;
-}
-
-void ContinuationPatch::
-Dfdfdvdv(double u, double v, double &x, double &y, double &z)
-{
-  double px, py, pz, nx, ny, nz, d;
-  double pxv, pyv, pzv, nxv, nyv, nzv, dv;
-  double pxvv, pyvv, pzvv, nxvv, nyvv, nzvv, dvv;
-
-  u = RescaleU(u);
-  v = RescaleV(v);
-
-  _ps->F(u,v,px,py,pz);
-  _ps->GetUnitNormal(u,v,nx,ny,nz);
-  _ps->Dfdv(u,v,pxv,pyv,pzv);
-  _ps->Dndv(u,v,nxv,nyv,nzv);
-  _ps->Dfdfdvdv(u,v,pxvv,pyvv,pzvv);
-  _ps->Dndndvdv(u,v,nxvv,nyvv,nzvv);
-
-  d = _Interpolate(u, v, 0, 0).real();
-  dv = _Interpolate(u, v, 0, 1).real();
-  dvv = _Interpolate(u, v, 0, 2).real();
-
-  x = pxvv + dvv * nx + dv * nxv + dv * nxv + d * nxvv;
-  y = pyvv + dvv * ny + dv * nyv + dv * nyv + d * nyvv;
-  z = pzvv + dvv * nz + dv * nzv + dv * nzv + d * nzvv;
-}
-
-void ContinuationPatch::
-Dfdfdudv(double u, double v, double &x, double &y, double &z)
-{
-  double px, py, pz, nx, ny, nz, d;
-  double pxu, pyu, pzu, nxu, nyu, nzu, du;
-  double pxv, pyv, pzv, nxv, nyv, nzv, dv;
-  double pxuv, pyuv, pzuv, nxuv, nyuv, nzuv, duv;
-
-  u = RescaleU(u);
-  v = RescaleV(v);
-
-  _ps->F(u,v,px,py,pz);
-  _ps->GetUnitNormal(u,v,nx,ny,nz);
-  _ps->Dfdu(u,v,pxu,pyu,pzu);
-  _ps->Dndu(u,v,nxu,nyu,nzu);
-  _ps->Dfdv(u,v,pxv,pyv,pzv);
-  _ps->Dndv(u,v,nxv,nyv,nzv);
-  _ps->Dfdfdudv(u,v,pxuv,pyuv,pzuv);
-  _ps->Dndndudv(u,v,nxuv,nyuv,nzuv);
-
-  d = _Interpolate(u, v, 0, 0).real();
-  du = _Interpolate(u, v, 1, 0).real();
-  dv = _Interpolate(u, v, 1, 0).real();
-  duv = _Interpolate(u, v, 1, 1).real();
-
-  x = pxuv + duv * nx + du * nxv + dv * nxu + d * nxuv;
-  y = pyuv + duv * ny + du * nyv + dv * nyu + d * nyuv;
-  z = pzuv + duv * nz + du * nzv + dv * nzu + d * nzuv;
-}
-
-double  ContinuationPatch::GetPou(double u, double v)
-{
-  double pouU, pouV;
-
-  if (IsHardEdge(3))
-    pouU = OneSidedPartitionOfUnity(0.,1.,u);
-  else if (IsHardEdge(1))
-    pouU = 1. - OneSidedPartitionOfUnity(0.,1.,u);
-  else
-    pouU = PartitionOfUnity(u, 0., 0.3, 0.7, 1.);
-
-  if (IsHardEdge(0))
-    pouV = OneSidedPartitionOfUnity(0.,1.,v);
-  else if (IsHardEdge(2))
-    pouV = 1. - OneSidedPartitionOfUnity(0.,1.,v);
-  else
-    pouV = PartitionOfUnity(v, 0., 0.3, 0.7, 1.);
-
-  return pouU * pouV;
-}
-
-void ContinuationPatch::Export(FILE *fp)
-{
-  double x,y,z;
-
-  fprintf(fp, "%s\n", _ps->GetName().c_str());
-  fprintf(fp, "%d\n", _ps->GetTag());
-  _ps->GetOrigin(x,y,z);
-  fprintf(fp, "%g %g %g\n", x, y, z);
-  _ps->GetE0(x,y,z);
-  fprintf(fp, "%g %g %g\n", x, y, z);
-  _ps->GetE1(x,y,z);
-  fprintf(fp, "%g %g %g\n", x, y, z);
-  _ps->GetScale(x,y,z);
-  fprintf(fp, "%g %g %g\n", x, y, z);
-  fprintf(fp, "%d\n", _ps->GetNumParameters());
-  for (int i = 0; i < _ps->GetNumParameters(); i++)
-    fprintf(fp, "%g\n",_ps->GetParameter(i));
-
-  fprintf(fp, "%s\n", "ContinuationPatch");
-  fprintf(fp, "%d\n", _tag);
-  fprintf(fp, "%d\n", _derivative);
-  fprintf(fp, "%g %g\n", _uMin, _uMax);
-  fprintf(fp, "%g %g\n", _vMin, _vMax);
-  fprintf(fp, "%d %d %d %d\n", _hardEdge[0], _hardEdge[1], _hardEdge[2],
-	  _hardEdge[3]);
-  fprintf(fp, "%d %d\n", _uModes, _vModes);
-  for (int j = 0; j < _uModes; j++) {
-    for (int k = 0; k < _vModes; k++) {
-      fprintf(fp, "%g %g\n", _coeffOriginalData[j][k].real(),
-	      _coeffOriginalData[j][k].imag());
-    }
-  }
-  fprintf(fp, "%d\n", 0);
-  fprintf(fp, "%d %d\n", _uM, _vM);
-  for (int j = 0; j < _uM; j++) {
-    for (int k = 0; k < _vM; k++) {
-      fprintf(fp, "%g %g\n", _coeffData[j][k].real(), _coeffData[j][k].imag());
-    }
-  }
-  if (_derivative) {
-    for (int j = 0; j < _uM; j++) {
-      for (int k = 0; k < _vM; k++) {
-	fprintf(fp, "%g %g\n", _coeffDerivU[j][k].real(), 
-		_coeffDerivU[j][k].imag());
-      }
-    }
-    for (int j = 0; j < _uM; j++) {
-      for (int k = 0; k < _vM; k++) {
-	fprintf(fp, "%g %g\n", _coeffDerivV[j][k].real(), 
-		_coeffDerivV[j][k].imag());
-      }
-    }
-    for (int j = 0; j < _uM; j++) {
-      for (int k = 0; k < _vM; k++) {
-	fprintf(fp, "%g %g\n", _coeffDerivUU[j][k].real(), 
-		_coeffDerivUU[j][k].imag());
-      }
-    }
-    for (int j = 0; j < _uM; j++) {
-      for (int k = 0; k < _vM; k++) {
-	fprintf(fp, "%g %g\n", _coeffDerivUV[j][k].real(), 
-		_coeffDerivUV[j][k].imag());
-      }
-    }
-    for (int j = 0; j < _uM; j++) {
-      for (int k = 0; k < _vM; k++) {
-	fprintf(fp, "%g %g\n", _coeffDerivVV[j][k].real(), 
-		_coeffDerivVV[j][k].imag());
-      }
-    }
-  }
-}
diff --git a/contrib/FourierModel/ContinuationPatch.h b/contrib/FourierModel/ContinuationPatch.h
deleted file mode 100644
index 2e536fdee4..0000000000
--- a/contrib/FourierModel/ContinuationPatch.h
+++ /dev/null
@@ -1,77 +0,0 @@
-#ifndef _CONTINUATION_PATCH_H_
-#define _CONTINUATION_PATCH_H_
-
-#include <fftw3.h>
-#include "Patch.h"
-#include "FM_Info.h"
-#include "PartitionOfUnity.h"
-
-namespace FM {
-
-// The base class for the patches
-class ContinuationPatch : public Patch {
- protected:
-  // Do we recompute
-  int _recompute;
-  // Number of Fourier Modes
-  int _uModes, _vModes;
-  // Number of Modes in reprocessed Fourier/Chebyshev series
-  int _uM, _vM;
-   // Period Information
-  double _periodU, _periodV;
-  // Limits of Fourier Series
-  int _uModesLower, _uModesUpper, _vModesLower, _vModesUpper;
-  // Limits in the new series
-  int _uMLower, _uMUpper, _vMLower, _vMUpper;
-  // data (and its first 2 derivatives)
-  std::complex<double> **_coeffOriginalData;
-  std::complex<double> **_coeffData, **_coeffDerivU, **_coeffDerivV;
-  std::complex<double> **_coeffDerivUU, **_coeffDerivVV, **_coeffDerivUV;
-  // temporary interpolation variables
-  std::vector< std::complex<double> > _tmpOrigCoeff, _tmpOrigInterp;
-  std::vector< std::complex<double> > _tmpCoeff, _tmpInterp;
-  // polynomial evaluator
-  std::complex<double> _PolyEval(std::vector< std::complex<double> > _coeff,
-                                 std::complex<double> x);
-  // interpolation wrapper
-  std::complex<double> _Interpolate(double u,double v);
-  std::complex<double> _Interpolate(double u,double v,int uDer,int vDer);
-  // other internal functions
-  void _ReprocessSeriesCoeff();
-  // persistent fftw data (used to avoid recomputing the FFTW plans
-  // and reallocating memory every time)
-  static int _forwardSize, _backwardSize;
-  static fftw_plan _forwardPlan, _backwardPlan;
-  static fftw_complex *_forwardData, *_backwardData;
-  void _SetForwardPlan(int n);
-  void _SetBackwardPlan(int n);
-  // This routine computes the forward FFT (ignoring the last element
-  // of the data)
-  void _ForwardFft(int n, std::complex<double> *fftData);
-  // This routine computes the inverse FFT (ignoring the last element
-  // in the array), returns values in entire array (by using the
-  // periodic extension)
-  void _BackwardFft(int n, std::complex<double> *fftData);
- public:
-  ContinuationPatch
-    (PatchInfo* PI, ProjectionSurface* ps);
-  virtual ~ContinuationPatch();
-
-  PatchInfo* _PI;
-
-  // Abstract functions of Patch
-
-  virtual void Export(FILE *fp);
-  virtual double GetPou(double u, double v);
-  virtual void F(double u, double v, double &x, double &y, double &z);
-  virtual bool Inverse(double x,double y,double z,double &u,double &v);
-  virtual void Dfdu(double u, double v, double &x, double &y, double &z);
-  virtual void Dfdv(double u, double v, double &x, double &y, double &z);
-  virtual void Dfdfdudu(double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdudv(double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdvdv(double u,double v,double &x,double &y,double &z);
-};
-
-}
-
-#endif
diff --git a/contrib/FourierModel/Curve.cpp b/contrib/FourierModel/Curve.cpp
deleted file mode 100644
index 73a1baf49d..0000000000
--- a/contrib/FourierModel/Curve.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "Curve.h"
-
-using namespace FM;
-
-Curve::Curve() 
-{
-  _tag = -1;
-}
-
-Curve::Curve(int tag)
-{
-  _tag = tag;
-}
diff --git a/contrib/FourierModel/Curve.h b/contrib/FourierModel/Curve.h
deleted file mode 100644
index fc5353e033..0000000000
--- a/contrib/FourierModel/Curve.h
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef _CURVE_H_
-#define _CURVE_H_
-
-namespace FM {
-
-// The base class for the patches
-class Curve {
- protected:
-  int _tag;
- public:
-  // Intersection Information
-  Curve();
-  Curve(int tag);
-  virtual ~Curve() {}
-
-  inline int GetTag() { return _tag; }
-
-  virtual double GetPou(double t) = 0;
-  virtual void F(double t, double &x, double &y, double &z) = 0;
-  virtual bool Inverse(double x,double y,double z,double &t) = 0;
-  virtual void Dfdt(double t, double &x, double &y, double &z) = 0;
-  virtual void Dfdfdtdt(double t, double &x, double &y, double &z) = 0;
-};
-
-}
-
-#endif
diff --git a/contrib/FourierModel/CylindricalProjectionSurface.cpp b/contrib/FourierModel/CylindricalProjectionSurface.cpp
deleted file mode 100755
index 5663749349..0000000000
--- a/contrib/FourierModel/CylindricalProjectionSurface.cpp
+++ /dev/null
@@ -1,274 +0,0 @@
-#include "CylindricalProjectionSurface.h"
-
-using namespace FM;
-
-CylindricalProjectionSurface::CylindricalProjectionSurface
-(int tag) : ProjectionSurface(1.)
-{
-  SetTag(tag);
-  SetName(std::string("cylinder"));
-
-  twoPi_ = 2 * M_PI;
-
-  R_ = 1.;
-  Z_ = 1.;
-
-  numParameters_ = 2;
-
-  O_[0] = O_[1] = O_[2] = 0.;
-
-  E0_[0] = 1.; E0_[1] = 0.; E0_[2] = 0.;
-  E1_[0] = 0.; E1_[1] = 1.; E1_[2] = 0.;
-  E2_[0] = 0.; E2_[1] = 0.; E2_[2] = 1.;
-
-  scale_[0] = scale_[1] = scale_[2] = 1.;
-}
-
-CylindricalProjectionSurface::CylindricalProjectionSurface
-(int tag, double O[3], double E0[3], double E1[3], double scale[3])
-  : ProjectionSurface(1.)
-{
-  SetTag(tag);
-  SetName(std::string("Cylinder"));
-
-  twoPi_ = 2 * M_PI;
-
-  O_[0] = O[0]; O_[1] = O[1]; O_[2] = O[2];
-
-  E0_[0] = E0[0]; E0_[1] = E0[1]; E0_[2] = E0[2];
-  E1_[0] = E1[0]; E1_[1] = E1[1]; E1_[2] = E1[2];
-
-  E2_[0] = E0_[1] * E1_[2] - E0_[2] * E1_[1];
-  E2_[1] = E0_[2] * E1_[0] - E0_[0] * E1_[2];
-  E2_[2] = E0_[0] * E1_[1] - E0_[1] * E1_[0];
-
-  scale_[0] = scale[0]; scale_[1] = scale[1]; scale_[2] = scale[2];
-}
-
-CylindricalProjectionSurface::CylindricalProjectionSurface
-(int tag, double O[3], double E0[3], double E1[3], double scale[3],
- double R, double Z)
-  : ProjectionSurface(1.)
-{
-  SetTag(tag);
-  SetName(std::string("Cylinder"));
-
-  twoPi_ = 2 * M_PI;
-
-  O_[0] = O[0]; O_[1] = O[1]; O_[2] = O[2];
-
-  E0_[0] = E0[0]; E0_[1] = E0[1]; E0_[2] = E0[2];
-  E1_[0] = E1[0]; E1_[1] = E1[1]; E1_[2] = E1[2];
-
-  E2_[0] = E0_[1] * E1_[2] - E0_[2] * E1_[1];
-  E2_[1] = E0_[2] * E1_[0] - E0_[0] * E1_[2];
-  E2_[2] = E0_[0] * E1_[1] - E0_[1] * E1_[0];
-
-  scale_[0] = scale[0]; scale_[1] = scale[1]; scale_[2] = scale[2];
-
-  R_ = R;
-  Z_ = Z;
-}
-
-void CylindricalProjectionSurface::
-F(double u, double v, double &x, double &y, double &z)
-{
-  x = O_[0] + E0_[0] * Z_ * v;
-  y = O_[1] + E0_[1] * Z_ * v;
-  z = O_[2] + E0_[2] * Z_ * v;
-  
-  x += R_ * (E1_[0] * cos(twoPi_ * (u - 0.5)) + 
-	     E2_[0] * sin(twoPi_ * (u - 0.5)));
-  y += R_ * (E1_[1] * cos(twoPi_ * (u - 0.5)) +
-	     E2_[1] * sin(twoPi_ * (u - 0.5)));
-  z += R_ * (E1_[2] * cos(twoPi_ * (u - 0.5)) +
-	     E2_[2] * sin(twoPi_ * (u - 0.5)));
-}
-
-bool CylindricalProjectionSurface::
-Inverse(double x, double y, double z, double &u,double &v)
-{
-  double tol =1.e-12;
-
-  double t = (x - O_[0]) * E0_[0] +
-    (y - O_[1]) * E0_[1] +
-    (z - O_[2]) * E0_[2];
-  v = t / Z_;
-  double n[3];
-  n[0] = x - (O_[0] + t * E0_[0]);
-  n[1] = y - (O_[1] + t * E0_[1]);
-  n[2] = z - (O_[2] + t * E0_[2]);
-  double norm = sqrt(n[0] * n[0] + n[1] * n[1] + n[2] * n[2]);
-  for (int i=0;i<3;i++)
-    n[i] /= norm;
-  u = atan2((n[0]*E2_[0]+n[1]*E2_[1]+n[2]*E2_[2]),
-	    (n[0]*E1_[0]+n[1]*E1_[1]+
-	     n[2]*E1_[2]));
-  u /= twoPi_;
-  u += 0.5;
-
-  if ((u > - tol) && (u < 1. + tol) && (v > - tol) && (v < 1. + tol))
-    return true;
-  else
-    return false;
-}
-
-void CylindricalProjectionSurface::
-Dfdu(double u, double v, double &x, double &y, double &z)
-{
-  x = twoPi_ * R_ * 
-    (- E1_[0] * sin(twoPi_ * (u - 0.5)) +
-     E2_[0] * cos(twoPi_ * (u - 0.5)));
-  y = twoPi_ * R_ *
-    (- E1_[1] * sin(twoPi_ * (u - 0.5)) +
-     E2_[1] * cos(twoPi_ * (u - 0.5)));
-  z = twoPi_ * R_ *
-    (- E1_[2] * sin(twoPi_ * (u - 0.5)) +
-     E2_[2] * cos(twoPi_ * (u - 0.5)));
-}
-
-void CylindricalProjectionSurface::
-Dfdv(double u, double v, double &x, double &y, double &z)
-{
-  x = E0_[0] * Z_;
-  y = E0_[1] * Z_;
-  z = E0_[2] * Z_;
-}
-
-void CylindricalProjectionSurface::
-Dfdfdudu(double u,double v, double &x, double &y, double &z)
-{
-  x = -  twoPi_ *  twoPi_ * R_ *
-    (E1_[0] * cos(twoPi_ * (u - 0.5)) +
-     E2_[0] * sin(twoPi_ * (u - 0.5)));
-  y = -  twoPi_ *  twoPi_ * R_ *
-    (E1_[1] * cos(twoPi_ * (u - 0.5)) +
-     E2_[1] * sin(twoPi_ * (u - 0.5)));
-  z = -  twoPi_ *  twoPi_ * R_ *
-    (E1_[2] * cos(twoPi_ * (u - 0.5)) +
-     E2_[2] * sin(twoPi_ * (u - 0.5)));
-}
-
-void CylindricalProjectionSurface::
-Dfdfdudv(double u, double v, double &x, double &y, double &z)
-{
-  x = y = z = 0.;
-}
-
-void CylindricalProjectionSurface::
-Dfdfdvdv(double u, double v, double &x, double &y, double &z)
-{
-  x = y = z = 0.;
-}
-
-void CylindricalProjectionSurface::
-Dfdfdfdududu(double u,double v,double &x,double &y,double &z)
-{
-  x = twoPi_ *  twoPi_ * twoPi_ * R_ *
-    (E1_[0] * sin(twoPi_ * (u - 0.5)) -
-     E2_[0] * cos(twoPi_ * (u - 0.5)));
-  y = twoPi_ *  twoPi_ * twoPi_ * R_ *
-    (E1_[1] * sin(twoPi_ * (u - 0.5)) -
-     E2_[1] * cos(twoPi_ * (u - 0.5)));
-  z = twoPi_ *  twoPi_ * twoPi_ * R_ *
-    (E1_[2] * sin(twoPi_ * (u - 0.5)) +
-     E2_[2] * cos(twoPi_ * (u - 0.5)));
-}
-
-void CylindricalProjectionSurface::
-Dfdfdfdududv(double u,double v,double &x,double &y,double &z)
-{
-  x = y = z = 0.;
-}
-
-void CylindricalProjectionSurface::
-Dfdfdfdudvdv(double u,double v,double &x,double &y,double &z)
-{
-  x = y = z = 0.;
-}
-
-void CylindricalProjectionSurface::
-Dfdfdfdvdvdv(double u,double v,double &x,double &y,double &z)
-{
-  x = y = z = 0.;
-}
-
-void CylindricalProjectionSurface::
-GetNormal(double u, double v, double &x, double &y, double &z)
-{
-  x = E1_[0] * cos(twoPi_ * (u - 0.5)) + 
-    E2_[0] * sin(twoPi_ * (u - 0.5));
-  y = E1_[1] * cos(twoPi_ * (u - 0.5)) +
-    E2_[1] * sin(twoPi_ * (u - 0.5));
-  z = E1_[2] * cos(twoPi_ * (u - 0.5)) +
-    E2_[2] * sin(twoPi_ * (u - 0.5));
-}
-
-void CylindricalProjectionSurface::
-Dndu(double u, double v, double &x, double &y, double &z)
-{
-  Dfdu(u,v,x,y,z);
-}
-
-void CylindricalProjectionSurface::
-Dndv(double u, double v, double &x, double &y, double &z)
-{
-  Dfdv(u,v,x,y,z);
-}
-
-void CylindricalProjectionSurface::
-Dndndudu(double u, double v, double &x, double &y, double &z)
-{
-  Dfdfdudu(u,v,x,y,z);
-}
-
-void CylindricalProjectionSurface::
-Dndndudv(double u, double v, double &x, double &y, double &z)
-{
-  Dfdfdudv(u,v,x,y,z);
-}
-
-void CylindricalProjectionSurface::
-Dndndvdv(double u, double v, double &x, double &y, double &z)
-{
-  Dfdfdvdv(u,v,x,y,z);
-}
-
-bool CylindricalProjectionSurface::
-OrthoProjectionOnSurface(double x, double y, double z, double &u,double &v)
-{
-  return Inverse(x,y,z,u,v);
-}
-
-void CylindricalProjectionSurface::
-SetParameter(int i, double x)
-{
-  switch (i) {
-  case 0:
-    R_ = x;
-  case 1:
-    Z_ = x;
-  }
-}
-
-double CylindricalProjectionSurface::
-GetParameter(int i)
-{
-  switch (i) {
-  case 0:
-    return R_;
-  case 1:
-    return Z_;
-  }
-}
-
-std::string CylindricalProjectionSurface::
-GetLabel(int i)
-{
-  switch (i) {
-  case 0:
-    return std::string("R");
-  case 1:
-    return std::string("Hight Scale");
-  }
-}
diff --git a/contrib/FourierModel/CylindricalProjectionSurface.h b/contrib/FourierModel/CylindricalProjectionSurface.h
deleted file mode 100755
index 783ff6379f..0000000000
--- a/contrib/FourierModel/CylindricalProjectionSurface.h
+++ /dev/null
@@ -1,88 +0,0 @@
-#ifndef _CYLINDRICAL_PROJECTION_SURFACE_H_
-#define _CYLINDRICAL_PROJECTION_SURFACE_H_
-
-#include <cmath>
-#include "ProjectionSurface.h"
-
-namespace FM {
-
-class CylindricalProjectionSurface : public ProjectionSurface {
- private:
-  double twoPi_;
-  double R_, Z_;
- public:
-  CylindricalProjectionSurface
-    (int tag);
-  CylindricalProjectionSurface
-    (int tag, double O[3], double E0[3], double E1[3], double scale[3]);
-  CylindricalProjectionSurface
-    (int tag, double O[3], double E0[3], double E1[3], double scale[3],
-     double R, double Z);
-  CylindricalProjectionSurface(CylindricalProjectionSurface *ps) 
-    : ProjectionSurface(ps) 
-  {
-    twoPi_ = ps->twoPi_;
-    R_ = ps->R_;
-    Z_ = ps->Z_;
-  }
-
-  virtual ~CylindricalProjectionSurface
-    () {}
-
-  virtual ProjectionSurface *clone()
-  {
-    return new CylindricalProjectionSurface(this);
-  }
-
-  // Abstract methods of ProjectionSurface
-
-  virtual void F
-    (double u, double v, double &x, double &y, double &z);
-  virtual bool Inverse
-    (double x,double y,double z,double &u,double &v);
-  virtual void Dfdu
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dfdv
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dfdfdudu
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdudv
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdvdv
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdfdududu
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdfdududv
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdfdudvdv
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdfdvdvdv
-    (double u,double v,double &x,double &y,double &z);
-  virtual bool OrthoProjectionOnSurface
-    (double x, double y, double z, double &u,double &v);
-  virtual void SetParameter
-    (int i, double x);
-  virtual double GetParameter
-    (int i);
-  virtual std::string GetLabel
-    (int i);
-
-  // Redefinitions for CylindricalProjectionSurface
-
-  virtual void GetNormal
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dndu
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dndv
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dndndudu
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dndndudv
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dndndvdv
-    (double u, double v, double &x, double &y, double &z);
-};
-
-}
-
-#endif
diff --git a/contrib/FourierModel/ExactPatch.cpp b/contrib/FourierModel/ExactPatch.cpp
deleted file mode 100644
index 4a5173771f..0000000000
--- a/contrib/FourierModel/ExactPatch.cpp
+++ /dev/null
@@ -1,76 +0,0 @@
-#include "Message.h"
-#include "ExactPatch.h"
-
-using namespace FM;
-
-ExactPatch::ExactPatch(ProjectionSurface* ps) : Patch()
-{
-  SetProjectionSurface(ps);
-}
-
-void ExactPatch::F(double u, double v, double &x, double &y, double &z)
-{
-  _ps->F(u,v,x,y,z);
-}
-
-bool  ExactPatch::Inverse(double x,double y,double z,double &u,double &v)
-{
-  return _ps->Inverse(x,y,z,u,v);
-}
-
-void ExactPatch::Dfdu(double u, double v, double &x, double &y, double &z)
-{
-  _ps->Dfdu(u,v,x,y,z);
-}
-
-void ExactPatch::Dfdv(double u, double v, double &x, double &y, double &z)
-{
-  _ps->Dfdv(u,v,x,y,z);
-}
-
-void ExactPatch::Dfdfdudu(double u,double v,double &x,double &y,double &z)
-{
-  _ps->Dfdfdudu(u,v,x,y,z);
-}
-
-void ExactPatch::Dfdfdudv(double u,double v,double &x,double &y,double &z)
-{
-  _ps->Dfdfdudv(u,v,x,y,z);
-}
-
-void ExactPatch::Dfdfdvdv(double u,double v,double &x,double &y,double &z)
-{
-  _ps->Dfdfdvdv(u,v,x,y,z);
-}
-
-double ExactPatch::GetPou(double u, double v)
-{
-  return 1.;
-}
-
-void ExactPatch::Export(FILE *fp)
-{
-  double x,y,z;
-
-  fprintf(fp, "%s\n", _ps->GetName().c_str());
-  fprintf(fp, "%d\n", _ps->GetTag());
-  _ps->GetOrigin(x,y,z);
-  fprintf(fp, "%g %g %g\n", x, y, z);
-  _ps->GetE0(x,y,z);
-  fprintf(fp, "%g %g %g\n", x, y, z);
-  _ps->GetE1(x,y,z);
-  fprintf(fp, "%g %g %g\n", x, y, z);
-  _ps->GetScale(x,y,z);
-  fprintf(fp, "%g %g %g\n", x, y, z);
-  fprintf(fp, "%d\n", _ps->GetNumParameters());
-  for (int i = 0; i < _ps->GetNumParameters(); i++)
-    fprintf(fp, "%g\n",_ps->GetParameter(i));
-
-  fprintf(fp, "%s\n", "ExactPatch");
-  fprintf(fp, "%d\n", _tag);
-  fprintf(fp, "%d\n", _derivative);
-  fprintf(fp, "%g %g\n", _uMin, _uMax);
-  fprintf(fp, "%g %g\n", _vMin, _vMax);
-  fprintf(fp, "%d %d %d %d\n", _hardEdge[0], _hardEdge[1], _hardEdge[2],
-	  _hardEdge[3]);
-}
diff --git a/contrib/FourierModel/ExactPatch.h b/contrib/FourierModel/ExactPatch.h
deleted file mode 100644
index ebd2949295..0000000000
--- a/contrib/FourierModel/ExactPatch.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef _EXACT_PATCH_H_
-#define _EXACT_PATCH_H_
-
-#include "Patch.h"
-#include "FM_Info.h"
-#include "ProjectionSurface.h"
-
-namespace FM {
-
-// The base class for the patches
-class ExactPatch : public Patch {
- public:
-  ExactPatch(ProjectionSurface* ps);
-  virtual ~ExactPatch() {}
-
-  // These are the virtual functions that must be provided by all
-  // derived patches: GetPou() returns the original smooth
-  // (non-normalized) cutoff on the patch; F() and Inverse() implement
-  // the mapping f: (u,v)->(x,y,z) and its inverse; and the Df*() and Dn*()
-  // functions return the derivatives of the mapping f and unit normal n 
-  // with respect to u and v
-
-  virtual void Export(FILE *fp);
-  virtual double GetPou(double u, double v);
-  virtual void F(double u, double v, double &x, double &y, double &z);
-  virtual bool Inverse(double x,double y,double z,double &u,double &v);
-  virtual void Dfdu(double u, double v, double &x, double &y, double &z);
-  virtual void Dfdv(double u, double v, double &x, double &y, double &z);
-  virtual void Dfdfdudu(double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdudv(double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdvdv(double u,double v,double &x,double &y,double &z);
-};
-
-}
-
-#endif
diff --git a/contrib/FourierModel/FCurve.cpp b/contrib/FourierModel/FCurve.cpp
deleted file mode 100644
index fcac90e879..0000000000
--- a/contrib/FourierModel/FCurve.cpp
+++ /dev/null
@@ -1,96 +0,0 @@
-#include "FCurve.h"
-
-using namespace FM;
-
-FCurve::FCurve
-(int tag, Patch* patch) 
-  : Curve(tag)
-{
-  patch_ = patch;
-
-  // default end points
-  SP_[0] = SP_[1] = 0.;
-  EP_[0] = 1.; EP_[1] = 0.;
-}
-
-FCurve::FCurve
-(int tag, Patch* patch, double SP[2], double EP[2]) 
-  : Curve(tag)
-{
-  patch_ = patch;
-
-  SP_[0] = SP[0]; SP_[1] = SP[1];
-  EP_[0] = EP[0]; EP_[1] = EP[1];
-}
-
-double FCurve::GetPou
-(double t)
-{
-  return 1.;
-}
-
-void FCurve::F
-(double t, double &x, double &y, double &z)
-{
-  double u = SP_[0] + t * (EP_[0] - SP_[0]);
-  double v = SP_[1] + t * (EP_[1] - SP_[1]);
-
-  patch_->F(u,v,x,y,z);
-}
-
-bool FCurve::Inverse
-(double x, double y, double z, double &t)
-{
-  double u, v;
-  if (patch_->Inverse(x,y,z,u,v)) {
-    if (std::abs(EP_[0] - SP_[0]) > 1.e-12)
-      t = (u - SP_[0]) / (EP_[0] - SP_[0]);
-    else if (std::abs(EP_[1] - SP_[1]) > 1.e-12)
-      t = (v - SP_[1]) / (EP_[1] - SP_[1]);
-    else
-      t = 0.;
-    return true;
-  }
-  else
-    return false;
-}
-
-void FCurve::Dfdt
-(double t, double &x, double &y, double &z)
-{
-  double u = SP_[0] + t * (EP_[0] - SP_[0]);
-  double v = SP_[1] + t * (EP_[1] - SP_[1]);
-
-  double dfdu[3], dfdv[3];
-  patch_->Dfdu(u,v,dfdu[0],dfdu[1],dfdu[2]);
-  patch_->Dfdv(u,v,dfdv[0],dfdv[1],dfdv[2]);
-
-  x = dfdu[0] * (EP_[0] - SP_[0]) + dfdv[0] * (EP_[1] - SP_[1]);
-  y = dfdu[1] * (EP_[0] - SP_[0]) + dfdv[1] * (EP_[1] - SP_[1]);
-  z = dfdu[2] * (EP_[0] - SP_[0]) + dfdv[2] * (EP_[1] - SP_[1]);
-}
-
-void FCurve::Dfdfdtdt
-(double t, double &x, double &y, double &z)
-{
-  double u = SP_[0] + t * (EP_[0] - SP_[0]);
-  double v = SP_[1] + t * (EP_[1] - SP_[1]);
-
-  double dfdfdudu[3], dfdfdudv[3], dfdfdvdv[3];
-  patch_->Dfdfdudu(u,v,dfdfdudu[0],dfdfdudu[1],dfdfdudu[2]);
-  patch_->Dfdfdudv(u,v,dfdfdudv[0],dfdfdudv[1],dfdfdudv[2]);
-  patch_->Dfdfdvdv(u,v,dfdfdvdv[0],dfdfdvdv[1],dfdfdvdv[2]);  
-
-  x = 
-    dfdfdudu[0] * (EP_[0] - SP_[0]) * (EP_[0] - SP_[0]) +
-    dfdfdudv[0] * (EP_[0] - SP_[0]) * (EP_[1] - SP_[1]) * 2. +
-    dfdfdvdv[0] * (EP_[1] - SP_[1]) * (EP_[1] - SP_[1]);
-  y = 
-    dfdfdudu[1] * (EP_[0] - SP_[0]) * (EP_[0] - SP_[0]) +
-    dfdfdudv[1] * (EP_[0] - SP_[0]) * (EP_[1] - SP_[1]) * 2. +
-    dfdfdvdv[1] * (EP_[1] - SP_[1]) * (EP_[1] - SP_[1]);
-  z = 
-    dfdfdudu[2] * (EP_[0] - SP_[0]) * (EP_[0] - SP_[0]) +
-    dfdfdudv[2] * (EP_[0] - SP_[0]) * (EP_[1] - SP_[1]) * 2. +
-    dfdfdvdv[2] * (EP_[1] - SP_[1]) * (EP_[1] - SP_[1]);
-}
diff --git a/contrib/FourierModel/FCurve.h b/contrib/FourierModel/FCurve.h
deleted file mode 100644
index d024bfd274..0000000000
--- a/contrib/FourierModel/FCurve.h
+++ /dev/null
@@ -1,64 +0,0 @@
-#ifndef _F_CURVE_H_
-#define _F_CURVE_H_
-
-#include "Curve.h"
-#include "Patch.h"
-
-namespace FM {
-
-// The base class for the patches
-class FCurve : public Curve {
- protected:
-  // Underlying Patch
-  Patch* patch_;
-  // End Points
-  double SP_[2],EP_[2];
-
- public:
-  FCurve(int tag, Patch* patch);
-  FCurve(int tag, Patch* patch, double SP[2], double EP[2]);  
-  virtual ~FCurve() {}
-
-  void SetStartPoint
-    (double u, double v) 
-  { 
-    SP_[0] = u; SP_[1] = v; 
-  }
-  void GetStartPoint
-    (double &u, double &v) 
-  { 
-    u = SP_[0]; v = SP_[1]; 
-  }
-  void SetEndPoint
-    (double u, double v) 
-  { 
-    EP_[0] = u; EP_[1] = v; 
-  }
-  void GetEndPoint
-    (double &u, double &v) 
-  { 
-    u = EP_[0]; v = EP_[1]; 
-  }
-
-  // These are the virtual functions that must be provided by all
-  // derived patches: GetPou() returns the original smooth
-  // (non-normalized) cutoff on the patch; F() and Inverse() implement
-  // the mapping f: (t)->(x,y,z) and its inverse; and the Df*() and Dn*()
-  // functions return the derivatives of the mapping f and unit normal n 
-  // with respect to u and v
-
-  virtual double GetPou
-    (double t);
-  virtual void F
-    (double t, double &x, double &y, double &z);
-  virtual bool Inverse
-    (double x,double y,double z,double &t);
-  virtual void Dfdt
-    (double t, double &x, double &y, double &z);
-  virtual void Dfdfdtdt
-    (double t, double &x, double &y, double &z);
-};
-
-}
-
-#endif
diff --git a/contrib/FourierModel/FM_Edge.cpp b/contrib/FourierModel/FM_Edge.cpp
deleted file mode 100644
index 90622b4418..0000000000
--- a/contrib/FourierModel/FM_Edge.cpp
+++ /dev/null
@@ -1,124 +0,0 @@
-#include <cmath>
-#include "FM_Edge.h"
-#include "Message.h"
-
-using namespace FM;
-
-void FM_Edge::F(double t, double &x, double &y, double &z)
-{
-  if (_curve) {
-    _curve->F(t,x,y,z);
-  }
-  else {
-    x = _SP->GetX() + t * (_EP->GetX() - _SP->GetX());
-    y = _SP->GetY() + t * (_EP->GetY() - _SP->GetY());
-    z = _SP->GetZ() + t * (_EP->GetZ() - _SP->GetZ());
-  }
-}
-
-bool FM_Edge::Inverse(double x,double y,double z,double &t)
-{
-  if (_curve) {
-    _curve->Inverse(x,y,z,t);
-  }
-  else {
-    if (_EP->GetX() - _SP->GetX())
-      t = (x - _SP->GetX()) / (_EP->GetX() - _SP->GetX());
-    else if (_EP->GetY() - _SP->GetY())
-      t = (y - _SP->GetY()) / (_EP->GetY() - _SP->GetY());
-    else if (_EP->GetZ() - _SP->GetZ())
-      t = (z - _SP->GetZ()) / (_EP->GetZ() - _SP->GetZ());
-    else {
-      Msg::Warning("Cannnot invert the curve");
-      t = 0.;
-    }
-  }
-}
-
-void FM_Edge::Dfdt(double t, double &x, double &y, double &z)
-{
-  if (_curve) {
-    double xMinus, yMinus, zMinus;
-    double xPlus, yPlus, zPlus;
-    
-    double tStart, tEnd;
-    _curve->Inverse(_SP->GetX(),_SP->GetY(),_SP->GetZ(),tStart);
-    _curve->Inverse(_EP->GetX(),_EP->GetY(),_EP->GetZ(),tEnd);
-    
-    double h = 1.e-10;
-    double tRescaled;
-    if (std::abs(tEnd - tStart) < 1.e-12) {
-      tRescaled = tStart + t * (1. + tEnd - tStart);
-      tRescaled -= floor(tRescaled);
-    }
-    else
-      tRescaled = tStart + t * (tEnd - tStart);
-    if (tRescaled+0.5*h > tEnd) {
-      _curve->F(tRescaled, xPlus, yPlus, zPlus);
-      double tMinus = tRescaled - h;
-      _curve->F(tMinus, xMinus, yMinus, zMinus);
-    }
-    else if (tRescaled-0.5*h < tStart) {
-      _curve->F(tRescaled, xMinus, yMinus, zMinus);
-      double tPlus = tRescaled + h;
-      _curve->F(tPlus, xPlus, yPlus, zPlus);
-    }
-    else {
-      double tPlus = tRescaled + 0.5 * h;
-      double tMinus = tRescaled - 0.5 * h;
-      _curve->F(tPlus, xPlus, yPlus, zPlus);
-      _curve->F(tMinus, xMinus, yMinus, zMinus);
-    }
-    x = (xPlus - xMinus) / h;
-    y = (yPlus - yMinus) / h;
-    z = (zPlus - zMinus) / h;
-  }
-  else {
-    x = _EP->GetX() - _SP->GetX();
-    y = _EP->GetY() - _SP->GetY();
-    z = _EP->GetZ() - _SP->GetZ();
-  }
-}
-
-void FM_Edge::Dfdfdtdt(double t, double &x, double &y, double &z)
-{
-  if (_curve) {
-    double xMinus, yMinus, zMinus;
-    double xPlus, yPlus, zPlus;
-    
-    double tStart, tEnd;
-    _curve->Inverse(_SP->GetX(),_SP->GetY(),_SP->GetZ(),tStart);
-    _curve->Inverse(_EP->GetX(),_EP->GetY(),_EP->GetZ(),tEnd);
-    
-    double h = 1.e-10;
-    double tRescaled;
-    if (std::abs(tEnd - tStart) < 1.e-12) {
-      tRescaled = tStart + t * (1. + tEnd - tStart);
-      tRescaled -= floor(tRescaled);
-    }
-    else
-      tRescaled = tStart + t * (tEnd - tStart);
-    if (tRescaled+0.5*h > tEnd) {
-      Dfdt(tRescaled, xPlus, yPlus, zPlus);
-      double tMinus = tRescaled - h;
-      Dfdt(tMinus, xMinus, yMinus, zMinus);
-    }
-    else if (tRescaled-0.5*h < tStart) {
-      Dfdt(tRescaled, xMinus, yMinus, zMinus);
-      double tPlus = tRescaled + h;
-      Dfdt(tPlus, xPlus, yPlus, zPlus);
-    }
-    else {
-      double tPlus = tRescaled + 0.5 * h;
-      double tMinus = tRescaled - 0.5 * h;
-      Dfdt(tPlus, xPlus, yPlus, zPlus);
-      Dfdt(tMinus, xMinus, yMinus, zMinus);
-    }
-    x = (xPlus - xMinus) / h;
-    y = (yPlus - yMinus) / h;
-    z = (zPlus - zMinus) / h;
-  }
-  else {
-    x = y = z = 0.;
-  }
-}
diff --git a/contrib/FourierModel/FM_Edge.h b/contrib/FourierModel/FM_Edge.h
deleted file mode 100644
index 5d6a28987e..0000000000
--- a/contrib/FourierModel/FM_Edge.h
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef _FM_EDGE_H_
-#define _FM_EDGE_H_
-
-#include "Curve.h"
-#include "FM_Vertex.h"
-
-namespace FM {
-
-class FM_Edge {
- private:
-  int _tag;
-  Curve* _curve;
-  FM_Vertex* _SP;
-  FM_Vertex* _EP;
- public:
-  FM_Edge() : _tag(-1), _curve(0), _SP(0), _EP(0) {}
-  FM_Edge(Curve* curve) : _tag(-1), _curve(curve), _SP(0), _EP(0) {}
-  FM_Edge(int tag, Curve* curve, FM_Vertex* SP, FM_Vertex* EP) : 
-    _tag(tag), _curve(curve), _SP(SP), _EP(EP) {}
-  virtual ~FM_Edge() {}
-
-  inline int GetTag() { return _tag; }
-  inline FM_Vertex* GetStartPoint() { return _SP; }
-  inline FM_Vertex* GetEndPoint() { return _EP; }
-
-  inline void SetTag(int tag) { _tag = tag; }
-  inline void SetStartPoint(FM_Vertex* SP) { _SP = SP; }
-  inline void SetStartPoint(double x, double y, double z) { 
-    _SP = new FM_Vertex(x,y,z); 
-  }
-  inline void SetEndPoint(FM_Vertex* EP) { _EP = EP; }
-  inline void SetEndPoint(double x, double y, double z) { 
-    _EP = new FM_Vertex(x,y,z); 
-  }
-  inline bool IsPhysical() {
-    if (_curve)
-      return true;
-    else
-      return false;
-  }
-
-  bool GetCurveExtent(double &start, double &end);
-
-  void F(double t, double &x, double &y, double &z);
-  bool Inverse(double x,double y,double z,double &t);
-  void Dfdt(double t, double &x, double &y, double &z);  
-  void Dfdfdtdt(double t, double &x, double &y, double &z);
-};
-
-}
-
-#endif
diff --git a/contrib/FourierModel/FM_Face.cpp b/contrib/FourierModel/FM_Face.cpp
deleted file mode 100644
index 5330b5976f..0000000000
--- a/contrib/FourierModel/FM_Face.cpp
+++ /dev/null
@@ -1,161 +0,0 @@
-#include "FM_Face.h"
-#include "Message.h"
-
-using namespace FM;
-
-void FM_Face::F(double u, double v, double &x, double &y, double &z) {
-
-  _patch->F(u,v,x,y,z);
-  /*
-  if (_edge.size() == 1) {
-    double U = sqrt((2*u-1)*(2*u-1)+(2*v-1)*(2*v-1));
-    double V = 0.5 * (atan2(2*v-1,2*u-1)/ M_PI + 1.);
-    double cx, cy, cz;
-    _patch->F(0.,0.,cx,cy,cz);
-    double px, py, pz;
-    _edge[0]->F(V,px,py,pz);
-    double R = sqrt((px-cx)*(px-cx)+(py-cy)*(py-cy)+(pz-cz)*(pz-cz));
-    _patch->F(U*R,V,x,y,z);
-  }
-  else if (_edge.size() == 4) {
-    bool isPhysical = (_edge[0]->IsPhysical()) && (_edge[1]->IsPhysical()) &&
-      (_edge[2]->IsPhysical()) && (_edge[3]->IsPhysical());
-    if (isPhysical)
-      _patch->F(u,v,x,y,z);
-    else {
-      double xD, yD, zD, uD, vD;
-      double xU, yU, zU, uU, vU;
-      _edge[0]->F(v,xD,yD,zD);
-      _patch->Inverse(xD,yD,zD,uD,vD);
-      _edge[2]->F(1.-v,xU,yU,zU);
-      _patch->Inverse(xU,yU,zU,uU,vU);
-      
-      double U = uD + u * (uU - uD);
-      double V = vD;
-      
-      _patch->F(U,V,x,y,z);
-    }
-  }
-  else {
-    Msg::Info("Such a face not implemented yet");
-    x = y = z = 0.;
-  }
-  */
-}
-
-bool FM_Face::Inverse(double x,double y,double z,double &u, double &v)
-{
-  _patch->Inverse(x,y,z,u,v);
-
-  /*
-  if (_edge.size() == 1) {
-    double n[3], t[3], s[3], c[3], r[3];
-    _patch->F(0.,0.,c[0],c[1],c[2]);
-    for (int i=0;i<3;i++) {
-      t[i] = _patch->_PI->tangent[i];
-      n[i] = _patch->_PI->normal[i];
-    }
-
-    s[0] = n[1] * t[2] - n[2] * t[1];
-    s[1] = n[2] * t[0] - n[0] * t[2];
-    s[2] = n[0] * t[1] - n[1] * t[0];
-
-    r[0] = x - c[0];
-    r[1] = y - c[1];
-    r[2] = z - c[2];
-
-    double norm = sqrt(r[0]*r[0]+r[1]*r[1]+r[2]*r[2]);
-    for (int i=0;i<3;i++)
-      r[i] /= norm;
-    double xx, yy;
-    for (int i=0;i<3;i++) {
-      xx += r[i] * t[i];
-      yy += r[i] * s[i];
-    }
-    double U,V;
-    V = atan2(yy, xx)/(2. * M_PI) +0.5;
-    double px, py, pz;
-    _edge[0]->F(v,px,py,pz);
-    double R = sqrt((px-c[0])*(px-c[0])+(py-c[1])*(py-c[1])+
-		    (pz-c[2])*(pz-c[2]));
-    U = norm / R;
-    u = 0.5 * (1 + U * cos(2*M_PI*(v-0.5)));
-    v = 0.5 * (1 + U * cos(2*M_PI*(v-0.5)));
-  }
-  else if (_edge.size() == 4) {
-    bool isPhysical = (_edge[0]->IsPhysical()) && (_edge[1]->IsPhysical()) &&
-      (_edge[2]->IsPhysical()) && (_edge[3]->IsPhysical());
-    if (isPhysical)
-      _patch->Inverse(x,y,z,u,v);
-    else {
-      double U, V;
-      _patch->Inverse(x,y,z,U,V);
-      double u0,v0,u1,v1;
-      double xD, yD, zD, uD, vD;
-      double xU, yU, zU, uU, vU;
-      _edge[0]->F(0,xD,yD,zD);
-      _patch->Inverse(xD,yD,zD,u0,v0);
-      _edge[0]->F(1,xD,yD,zD);
-      _patch->Inverse(xD,yD,zD,u1,v1);
-      v = (V-v0)/(v1-v0);
-      _edge[0]->F(v,xD,yD,zD);
-      _patch->Inverse(xD,yD,zD,uD,vD);
-      _edge[2]->F(1.-v,xU,yU,zU);
-      _patch->Inverse(xU,yU,zU,uU,vU);
-      
-      u = (U - uD) / (uU - uD);
-    }
-  }
-  else {
-    Msg::Info("Such a face not implemented yet");
-    u = v = 0.;
-  }
-  */
-}
-
-void FM_Face::Dfdu(double u, double v, double &x, double &y, double &z)
-{
-  _patch->Dfdu(u,v,x,y,z);
-}
-
-void FM_Face::Dfdv(double u, double v, double &x, double &y, double &z)
-{
-  _patch->Dfdv(u,v,x,y,z);
-}
-
-void FM_Face::Dfdfdudu(double u, double v, double &x, double &y, double &z)
-{
-  _patch->Dfdfdudu(u,v,x,y,z);
-}
-
-void FM_Face::Dfdfdudv(double u, double v, double &x, double &y, double &z)
-{
-  _patch->Dfdfdudv(u,v,x,y,z);
-}
-
-void FM_Face::Dfdfdvdv(double u, double v, double &x, double &y, double &z)
-{
-  _patch->Dfdfdvdv(u,v,x,y,z);
-}
-
-void FM_Face::GetNormal(double u, double v, double &x, double &y, double &z)
-{
-  double dfdu[3], dfdv[3];
-  Dfdu(u, v, dfdu[0], dfdu[1], dfdu[2]);
-  Dfdv(u, v, dfdv[0], dfdv[1], dfdv[2]);
-  x = dfdu[1] * dfdv[2] - dfdu[2] * dfdv[1];
-  y = dfdu[2] * dfdv[0] - dfdu[0] * dfdv[2];
-  z = dfdu[0] * dfdv[1] - dfdu[1] * dfdv[0];
-}
-
-void FM_Face::
-GetUnitNormal(double u, double v, double &x, double &y, double &z)
-{
-  GetNormal(u, v, x, y, z);
-  double norm = sqrt(x * x + y * y + z * z);
-  if(norm > 0.) {
-    x /= norm;
-    y /= norm;
-    z /= norm;
-  }
-}
diff --git a/contrib/FourierModel/FM_Face.h b/contrib/FourierModel/FM_Face.h
deleted file mode 100644
index b2f26d46e5..0000000000
--- a/contrib/FourierModel/FM_Face.h
+++ /dev/null
@@ -1,50 +0,0 @@
-#ifndef _FM_FACE_H_
-#define _FM_FACE_H_
-
-#include <vector>
-#include "Patch.h"
-#include "FM_Edge.h"
-
-namespace FM {
-
-class FM_Face {
- private:
-  int _tag;
-  Patch* _patch;
-  std::vector<FM_Edge*> _edge;
- public:
-  FM_Face() : _tag(-1), _patch(0) {}
-  FM_Face(Patch* patch) : _tag(-1), _patch(patch) {}
-  FM_Face(int tag, Patch* patch) : _tag(tag), _patch(patch) {}
-  FM_Face(Patch* patch, std::vector<FM_Edge*> edge) :
-    _tag(-1), _patch(patch), _edge(edge) {}
-  FM_Face(int tag, Patch* patch, std::vector<FM_Edge*> edge) :
-    _tag(tag), _patch(patch), _edge(edge) {}
-  virtual ~FM_Face() {}
-
-  inline void SetTag(int tag) { _tag = tag; }
-  inline int GetTag() { return _tag; }
-  inline bool IsPeriodic(int dim) 
-    { 
-      if (dim) return _patch->IsVPeriodic();
-      else return _patch->IsUPeriodic();
-    }
-  inline void AddEdge(FM_Edge* edge) { _edge.push_back(edge); }
-  inline int GetNumEdges() { return _edge.size(); }
-  inline Patch* GetPatch() { return _patch; }
-  inline FM_Edge* GetEdge(int i) { return _edge[i]; }
-
-  void F(double u, double v, double &x, double &y, double &z);
-  bool Inverse(double x,double y,double z,double &u, double &v);
-  void Dfdu(double u, double v, double &x, double &y, double &z);
-  void Dfdv(double u, double v, double &x, double &y, double &z);
-  void Dfdfdudu(double u, double v, double &x, double &y, double &z);
-  void Dfdfdudv(double u, double v, double &x, double &y, double &z);
-  void Dfdfdvdv(double u, double v, double &x, double &y, double &z);
-  void GetUnitNormal(double u,double v,double &x,double &y,double &z);
-  void GetNormal(double u, double v, double &x, double &y, double &z);
-};
-
-}
-
-#endif
diff --git a/contrib/FourierModel/FM_Info.cpp b/contrib/FourierModel/FM_Info.cpp
deleted file mode 100644
index 29d08d37cb..0000000000
--- a/contrib/FourierModel/FM_Info.cpp
+++ /dev/null
@@ -1,28 +0,0 @@
-#include "FM_Info.h"
-
-using namespace FM;
-
-PatchInfo::PatchInfo() : tag(-1) 
-{
-  uMin = vMin = 0.;
-  uMax = vMax = 1.;
-  derivative = 3;
-  recompute = 1;
-}
-
-OverlapInfo::OverlapInfo()
-{
-  doesIntersect = 0;
-  xMin = xMax = 0.;
-  yMin = yMax = 0.;
-  zMin = zMax = 0.;
-}
-
-IntersectionInfo::IntersectionInfo() : tag(-1) 
-{
-  edgeInfo.edgeType = -1;
-  edgeInfo.constValue = 0.;
-  edgeInfo.startValue = 0.;
-  edgeInfo.endValue = 0.;
-  edgeInfo.acrossDiscontinuity = false;
-}
diff --git a/contrib/FourierModel/FM_Info.h b/contrib/FourierModel/FM_Info.h
deleted file mode 100644
index 2d3f8ffd6c..0000000000
--- a/contrib/FourierModel/FM_Info.h
+++ /dev/null
@@ -1,65 +0,0 @@
-#ifndef _FM_INFO_H_
-#define _FM_INFO_H_
-
-#include <complex>
-#include <vector>
-
-namespace FM {
-
-class PatchInfo {
- public:
-  int tag;
-  int derivative;
-  int recompute;
-  int nM[2];
-  int nModes[2];
-  double uMin, uMax, vMin, vMax;
-  int hardEdge[4];
-  std::vector<std::vector<std::complex<double> > > coeffFourier;
-  std::vector<std::vector<std::complex<double> > > coeffCheby;
-  std::vector<std::vector<std::complex<double> > > coeffDerivU;
-  std::vector<std::vector<std::complex<double> > > coeffDerivV;
-  std::vector<std::vector<std::complex<double> > > coeffDerivUU;
-  std::vector<std::vector<std::complex<double> > > coeffDerivUV;
-  std::vector<std::vector<std::complex<double> > > coeffDerivVV;
-
-  PatchInfo();
-  virtual ~PatchInfo() {}
-};
-
-class OverlapInfo {
- public:
-  short int doesIntersect;
-  int psTag;
-  double xMin, xMax;
-  double yMin, yMax;
-  double zMin, zMax;
-
-  OverlapInfo();
-  virtual ~OverlapInfo() {}
-};
-
-class IntersectionInfo {
- public:
-  int tag;
-  double SP[3];
-  double EP[3];
-  struct {
-    int patchTag;
-  } intersectingPatches[2];
-  int along;
-  struct {
-    int edgeType;
-    double constValue;
-    double startValue;
-    double endValue;
-    bool acrossDiscontinuity;
-  } edgeInfo;
-  
-  IntersectionInfo();
-  virtual ~IntersectionInfo() {}
-};
-
-}
-
-#endif
diff --git a/contrib/FourierModel/FM_Reader.cpp b/contrib/FourierModel/FM_Reader.cpp
deleted file mode 100644
index bb75dcfa5a..0000000000
--- a/contrib/FourierModel/FM_Reader.cpp
+++ /dev/null
@@ -1,171 +0,0 @@
-#include <iostream>
-#include <fstream>
-#include "Message.h"
-#include "FM_Reader.h"
-
-using namespace FM;
-
-FM_Reader::FM_Reader(const char* fn)
-{
-  char c;
-  char Exact[8] = "Exact";
-  char plane[16] = "plane";
-  char cylinder[16] = "cylinder";
-  char paraboloid[16] = "paraboloid";
-  char revolvedParabola[32] = "revolvedParabola";
-
-  std::ifstream InputFile(fn);
-  if (!InputFile) {
-    Msg::Info("Failed to open input file.");
-    exit(EXIT_FAILURE);
-  }
-  InputFile >> _nPatches;
-  _ps.resize(_nPatches, 0);
-  for (unsigned int i = 0; i < _nPatches; i++) {
-    char psName[32];
-    InputFile >> psName;
-    int psTag;
-    InputFile >> psTag;
-    double origin[3];
-    InputFile >> origin[0] >> origin[1] >> origin[2];
-    double E0[3];
-    InputFile >> E0[0] >> E0[1] >> E0[2];
-    double E1[3];
-    InputFile >> E1[0] >> E1[1] >> E1[2];
-    double scale[3];
-    InputFile >> scale[0] >> scale[1] >> scale[2];
-    int psNumParams;
-    InputFile >> psNumParams;
-    double *psParams = new double [psNumParams];
-    for (unsigned int j = 0; j < psNumParams; j++) {
-      double tmp;
-      InputFile >> psParams[j];
-    }
-    if (!strcmp(psName,plane))
-      _ps[i] = new PlaneProjectionSurface(psTag,origin,E0,E1,scale);
-    else if (!strcmp(psName,cylinder))
-      _ps[i] = new CylindricalProjectionSurface
-	(psTag,origin,E0,E1,scale,psParams[0],psParams[1]);
-    else if (!strcmp(psName,paraboloid))
-      _ps[i] = new ParaboloidProjectionSurface
-	(psTag,origin,E0,E1,scale);
-    else if (!strcmp(psName,revolvedParabola)) {
-      double R = psParams[0];
-      double K[2];
-      K[0] = psParams[1]; K[1] = psParams[2];
-
-      _ps[i] = new RevolvedParabolaProjectionSurface
-	(psTag,origin,E0,E1,scale,R,K);
-    }
-    else {
-      _ps[i] = new CylindricalProjectionSurface(psTag,origin,E0,E1,scale);
-      Msg::Error("Unknown projection surface. Replaced by Cylinder...");
-    }
-    delete [] psParams;
-    InputFile >> psName;
-    _patchList.push_back(new PatchInfo);
-    InputFile >> _patchList[i]->tag;
-    InputFile >> _patchList[i]->derivative;
-    InputFile >> _patchList[i]->uMin >> _patchList[i]->uMax;
-    InputFile >> _patchList[i]->vMin >> _patchList[i]->vMax;
-    if (strcmp(psName,Exact)) {
-      InputFile >> _patchList[i]->hardEdge[0] >> _patchList[i]->hardEdge[1] >>
-	_patchList[i]->hardEdge[2] >> _patchList[i]->hardEdge[3];
-      InputFile >> _patchList[i]->nModes[0] >> _patchList[i]->nModes[1];   
-      _patchList[i]->coeffFourier.resize(_patchList[i]->nModes[0]);
-      for (int j=0;j<_patchList[i]->nModes[0];j++) {
-	_patchList[i]->coeffFourier[j].resize(_patchList[i]->nModes[1]);
-	for (int k=0;k<_patchList[i]->nModes[1];k++) {
-	  double realCoeff, imagCoeff;
-	  InputFile >> realCoeff >> imagCoeff;
-	  _patchList[i]->coeffFourier[j][k] = 
-	    std::complex<double>(realCoeff,imagCoeff);
-	}
-      }
-      InputFile >> _patchList[i]->nM[0] >> _patchList[i]->nM[1];     
-      InputFile >> _patchList[i]->recompute; 
-      if ((_patchList[i]->derivative) && (!_patchList[i]->recompute)) {
-	_patchList[i]->coeffCheby.resize(_patchList[i]->nM[0]);
-	for (int j=0;j<_patchList[i]->nM[0];j++) {
-	  _patchList[i]->coeffCheby[j].resize(_patchList[i]->nM[1]);
-	  for (int k=0;k<_patchList[i]->nM[1];k++) {
-	    double realCoeff, imagCoeff;
-	    InputFile >> realCoeff >> imagCoeff;
-	    _patchList[i]->coeffCheby[j][k] = 
-	      std::complex<double>(realCoeff,imagCoeff);
-	  }
-	}
-	_patchList[i]->coeffDerivU.resize(_patchList[i]->nM[0]);
-	for (int j=0;j<_patchList[i]->nM[0];j++) {
-	  _patchList[i]->coeffDerivU[j].resize(_patchList[i]->nM[1]);
-	  for (int k=0;k<_patchList[i]->nM[1];k++) {
-	    double realCoeff, imagCoeff;
-	    InputFile >> realCoeff >> imagCoeff;
-	    _patchList[i]->coeffDerivU[j][k] = 
-	      std::complex<double>(realCoeff,imagCoeff);
-	  }
-	}
-	_patchList[i]->coeffDerivV.resize(_patchList[i]->nM[0]);
-	for (int j=0;j<_patchList[i]->nM[0];j++) {
-	  _patchList[i]->coeffDerivV[j].resize(_patchList[i]->nM[1]);
-	  for (int k=0;k<_patchList[i]->nM[1];k++) {
-	    double realCoeff, imagCoeff;
-	    InputFile >> realCoeff >> imagCoeff;
-	    _patchList[i]->coeffDerivV[j][k] = 
-	      std::complex<double>(realCoeff,imagCoeff);
-	  }
-	}
-	_patchList[i]->coeffDerivUU.resize(_patchList[i]->nM[0]);
-	for (int j=0;j<_patchList[i]->nM[0];j++) {
-	  _patchList[i]->coeffDerivUU[j].resize(_patchList[i]->nM[1]);
-	  for (int k=0;k<_patchList[i]->nM[1];k++) {
-	    double realCoeff, imagCoeff;
-	    InputFile >> realCoeff >> imagCoeff;
-	    _patchList[i]->coeffDerivUU[j][k] = 
-	      std::complex<double>(realCoeff,imagCoeff);
-	  }
-	}
-	_patchList[i]->coeffDerivUV.resize(_patchList[i]->nM[0]);
-	for (int j=0;j<_patchList[i]->nM[0];j++) {
-	  _patchList[i]->coeffDerivUV[j].resize(_patchList[i]->nM[1]);
-	  for (int k=0;k<_patchList[i]->nM[1];k++) {
-	    double realCoeff, imagCoeff;
-	    InputFile >> realCoeff >> imagCoeff;
-	    _patchList[i]->coeffDerivUV[j][k] = 
-	      std::complex<double>(realCoeff,imagCoeff);
-	  }
-	}
-	_patchList[i]->coeffDerivVV.resize(_patchList[i]->nM[0]);
-	for (int j=0;j<_patchList[i]->nM[0];j++) {
-	  _patchList[i]->coeffDerivVV[j].resize(_patchList[i]->nM[1]);
-	  for (int k=0;k<_patchList[i]->nM[1];k++) {
-	    double realCoeff, imagCoeff;
-	    InputFile >> realCoeff >> imagCoeff;
-	    _patchList[i]->coeffDerivVV[j][k] = 
-	      std::complex<double>(realCoeff,imagCoeff);
-	  }
-	}
-      }
-    }
-    _patch.push_back(new ContinuationPatch(_patchList[i], _ps[i]));
-  }
-}
-
-Patch* FM_Reader::GetPatch(int tag)
-{
-  for (int i=0;i<_patch.size();i++)
-    if (_patch[i]->GetTag() == tag)
-      return _patch[i];
-}
-
-ProjectionSurface* FM_Reader::GetProjectionSurface(int tag)
-{
-  ProjectionSurface* ps = 0;
-  for (int i=0;i<_ps.size();i++) {
-    if (_ps[i]->GetTag() == tag) {
-      ps = _ps[i];
-      break;
-    }
-  }
-  return ps;
-}
diff --git a/contrib/FourierModel/FM_Reader.h b/contrib/FourierModel/FM_Reader.h
deleted file mode 100644
index 199e9d5ed5..0000000000
--- a/contrib/FourierModel/FM_Reader.h
+++ /dev/null
@@ -1,49 +0,0 @@
-#ifndef _FM_READER_H_
-#define _FM_READER_H_
-
-#include <vector>
-#include <string>
-#include <complex>
-#include "Curve.h"
-#include "IntersectionCurve.h"
-#include "ExactPatch.h"
-#include "ContinuationPatch.h"
-#include "PlaneProjectionSurface.h"
-#include "CylindricalProjectionSurface.h"
-#include "ParaboloidProjectionSurface.h"
-#include "RevolvedParabolaProjectionSurface.h"
-#include "FM_Info.h"
-#include "FM_Face.h"
-#include "BlendOperator.h"
-#include "BlendedPatch.h"
-
-namespace FM {
-
-class FM_Reader {
- private:
-  int _nPatches;
-  std::vector<PatchInfo*> _patchList;
-  std::vector<Patch*> _patch;
-  std::vector<ProjectionSurface*> _ps;
-
- public:
-  FM_Reader(const char* fn);
-
-  virtual ~FM_Reader() {}
-
-  inline int GetNumPatches
-    () { return _nPatches; }
-
-  inline std::vector<PatchInfo*> GetPatchList
-    () { return _patchList; }
-
-  Patch* GetPatch
-    (int tag);
-
-  ProjectionSurface* GetProjectionSurface
-    (int tag);
-};
-
-}
-
-#endif
diff --git a/contrib/FourierModel/FM_Vertex.cpp b/contrib/FourierModel/FM_Vertex.cpp
deleted file mode 100644
index 139597f9cb..0000000000
--- a/contrib/FourierModel/FM_Vertex.cpp
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/contrib/FourierModel/FM_Vertex.h b/contrib/FourierModel/FM_Vertex.h
deleted file mode 100644
index b893144563..0000000000
--- a/contrib/FourierModel/FM_Vertex.h
+++ /dev/null
@@ -1,30 +0,0 @@
-#ifndef _FM_VERTEX_H_
-#define _FM_VERTEX_H_
-
-namespace FM {
-
-class FM_Vertex {
- private:
-  int _tag;
-  double _x,_y,_z;
- public:
-  FM_Vertex() : _tag(-1), _x(0), _y(0), _z(0) {}
-  FM_Vertex(double x, double y, double z) : _tag(-1), _x(x), _y(y), _z(z) {}
-  FM_Vertex(int tag, double x, double y, double z) : _tag(tag), 
-    _x(x), _y(y), _z(z) {}
-  virtual ~FM_Vertex() {}
-
-  inline int GetTag() { return _tag; }
-  inline double GetX() { return _x; }
-  inline double GetY() { return _y; }
-  inline double GetZ() { return _z; }
-
-  inline void SetTag(int tag) { _tag = tag; }
-  inline void SetX(double x) { _x = x; }
-  inline void SetY(double y) { _y = y; }
-  inline void SetZ(double z) { _z = z; }
-};
-
-}
-
-#endif
diff --git a/contrib/FourierModel/FPatch.cpp b/contrib/FourierModel/FPatch.cpp
deleted file mode 100644
index 188a6632e4..0000000000
--- a/contrib/FourierModel/FPatch.cpp
+++ /dev/null
@@ -1,979 +0,0 @@
-#include <math.h>
-#include "Message.h"
-#include "FPatch.h"
-
-using namespace FM;
-
-extern "C" {
-  void zgelss_(int &,int &,int &,std::complex<double> *,int &,
-               std::complex<double> *,int &,double *,double &,int &,
-               std::complex<double> *,int &,double *,int &);
-}
-
-FPatch::FPatch(int tag, ProjectionSurface* ps, 
-	       std::vector<double> &u, std::vector<double> &v,
-	       std::vector< std::complex<double> > &data, int derivative,
-	       int uModes, int vModes, int uM, int vM,
-	       bool hardEdge0, bool hardEdge1, bool hardEdge2, bool hardEdge3) 
-  : _coeffOriginalData(0),_coeffData(0),_coeffDerivU(0),
-    _coeffDerivV(0),_coeffDerivUU(0),_coeffDerivVV(0),_coeffDerivUV(0)
-{
-  _ps = ps;
-
-  _tag = tag;
-  _derivative = derivative;
-
-  _uModes = uModes;
-  _vModes = vModes;
-
-  _uM = (int)pow(2.,(int)(log((double)uM) / log(2.)));
-  _vM = (int)pow(2.,(int)(log((double)vM) / log(2.)));
-
-  if (_ps->IsUPeriodic())
-    _uM++;
-  if (_ps->IsVPeriodic())
-    _vM++;
-
-  _hardEdge[0] = hardEdge0;
-  _hardEdge[1] = hardEdge1;
-  _hardEdge[2] = hardEdge2;
-  _hardEdge[3] = hardEdge3;
-
-  if (_ps->IsUPeriodic())
-    _periodicityU = 1;
-  if (_ps->IsVPeriodic())
-    _periodicityV = 1;
-
-  if (_ps->IsUPeriodic())
-    _periodU = 1.;
-  else
-    _periodU = 2.;
-
-  if (_ps->IsVPeriodic())
-    _periodV = 1.;
-  else
-    _periodV = 2.;
-
-  if ((_uModes % 2) == 0) {
-    _uModesLower = - _uModes/2;
-    _uModesUpper = _uModes/2 - 1;
-  }
-  else {
-    _uModesLower = - (_uModes - 1)/2;
-    _uModesUpper = (_uModes - 1)/2;
-  }
-  if ((_vModes % 2) == 0) {
-    _vModesLower = - _vModes/2;
-    _vModesUpper = _vModes/2 - 1;
-  }
-  else {
-    _vModesLower = - (_vModes - 1)/2;
-    _vModesUpper = (_vModes - 1)/2;
-  }
-
-  if (_ps->IsUPeriodic()) {
-    if ((_uM % 2) == 0) {
-      _uMLower = - _uM/2;
-      _uMUpper = _uM/2 - 1;
-    }
-    else {
-      _uMLower = - (_uM - 1)/2;
-      _uMUpper = (_uM - 1)/2;
-    }
-  }
-  else {
-    _uMLower = 0;
-    _uMUpper = _uM;
-  }
-  if (_ps->IsVPeriodic()) {
-    if ((_vM % 2) == 0) {
-      _vMLower = - _vM/2;
-      _vMUpper = _vM/2 - 1;
-    }
-    else {
-      _vMLower = - (_vM - 1)/2;
-      _vMUpper = (_vM - 1)/2;
-    }
-  }
-  else {
-    _vMLower = 0;
-    _vMUpper = _vM;    
-  }
-
-
-  // Initialize Data
-
-  _coeffOriginalData = new std::complex<double>*[_uModes];
-  for(int j = 0; j < _uModes; j++){
-    _coeffOriginalData[j] = new std::complex<double>[_vModes];
-
-    //for(int k = 0; k < _vModes; k++)
-    //_coeffOriginalData[j][k] = _PI->coeff[j][k];
-  }
-
-  _nData = data.size();
-  _nModes = _uModes * _vModes;
-
-  std::complex<double> *LSRhs = new std::complex<double> [_nData];
-  std::complex<double> *LSMatrix = new std::complex<double> [_nModes * _nData];
-
-  for (int i=0;i<_nData;i++)
-    LSRhs[i] = data[i];
-
-  for (int j=0;j<_uModes;j++)
-    for (int k=0;k<_vModes;k++)
-      for (int i=0;i<_nData;i++)
-        LSMatrix[i+_nData*(k+_vModes*j)] = std::complex<double>
-          (cos(2*M_PI * ((j + _uModesLower) * u[i] / _periodU +
-                         (k + _vModesLower) * v[i] / _periodV)),
-           sin(2*M_PI * ((j + _uModesLower) * u[i] / _periodU +
-                         (k + _vModesLower) * v[i] / _periodV)));
-
-  // some parameters for the lease square solvers "zgelss"
-  int info, rank;
-  int lwork = 66*_nData, one = 1;
-  double rcond = -1.;
-  double *s = new double [_nModes];
-  double *rwork = new double [5*_nModes];
-  std::complex<double> *work = new std::complex<double> [lwork];
-
-  zgelss_(_nData,_nModes,one,&LSMatrix[0],_nData,&LSRhs[0],_nData,&s[0],rcond,
-          rank,&work[0],lwork,&rwork[0],info);
-
-  for(int j = 0; j < _uModes; j++)
-    for(int k = 0; k < _vModes; k++)
-      _coeffOriginalData[j][k] = LSRhs[k+_vModes*j];
-
-  // deleting lease square arrays
-  delete[] s, rwork, work;
-  delete[] LSMatrix, LSRhs;
-
-
-  // Initialize interpolation variables
-  _tmpOrigCoeff = std::vector< std::complex<double> >(_vModes);
-  _tmpOrigInterp = std::vector< std::complex<double> >(_uModes);
-
-  if (_derivative)
-    _ReprocessSeriesCoeff();
-
-  // Check if we need to interpolate the derivative(s)
-  if(_derivative){
-    // Initialize _fineDeriv and _fineDeriv2 to zero
-    if(_derivative & 1){
-      _coeffDerivU = new std::complex<double>*[_uM];
-      _coeffDerivV = new std::complex<double>*[_uM];
-      for(int j = 0; j < _uM; j++){
-        _coeffDerivU[j] = new std::complex<double>[_vM];
-        _coeffDerivV[j] = new std::complex<double>[_vM];
-        for(int k = 0; k < _vM; k++){
-          _coeffDerivU[j][k] = 0.;
-          _coeffDerivV[j][k] = 0.;
-        }
-      }
-    }
-
-    if(_derivative & 2){
-      _coeffDerivUU = new std::complex<double>*[_uM];
-      _coeffDerivVV = new std::complex<double>*[_uM];
-      _coeffDerivUV = new std::complex<double>*[_uM];
-      for(int j = 0; j < _uM; j++){
-        _coeffDerivUU[j] = new std::complex<double>[_vM];
-        _coeffDerivVV[j] = new std::complex<double>[_vM];
-        _coeffDerivUV[j] = new std::complex<double>[_vM];
-        for(int k = 0; k < _vM; k++){
-          _coeffDerivUU[j][k] = 0.;
-          _coeffDerivVV[j][k] = 0.;
-          _coeffDerivUV[j][k] = 0.;
-        }
-      }
-    }
-
-    // Copy the Fourier coefficients into _coeffDeriv and _coeffDeriv2
-    std::complex<double> I(0., 1.);
-    for(int j = _uM - 1; j >= 0; j--){
-      for(int k = _vM - 1; k >= 0; k--){
-        if(_derivative & 1){
-	  if (_ps->IsUPeriodic()) {
-	    int J = j+_uMLower;
-	    _coeffDerivU[j][k] = (2 * M_PI * J * I / _periodU) *
-	      _coeffData[j][k];
-	  }
-	  else {
-	    if (j == _uM - 1)
-	      _coeffDerivU[j][k] = 0.;
-	    else if (j == _uM - 2)
-	      _coeffDerivU[j][k] = 2. * (double)(j + 1) * _coeffData[j + 1][k];
-	    else
-	      _coeffDerivU[j][k] = _coeffDerivU[j + 2][k] +
-		2. * (double)(j + 1) * _coeffData[j + 1][k];
-	    //if (j != 0)
-	    //_coeffDerivU[j][k] *= 2.;
-	  }
-	  if (_ps->IsVPeriodic()) {
-	    int K = k+_vMLower;
-	    _coeffDerivV[j][k] = (2 * M_PI * K * I / _periodV) *
-	      _coeffData[j][k];
-	  }
-	  else {
-	    if (k == _vM - 1)
-	      _coeffDerivV[j][k] = 0.;
-	    else if (k == _vM - 2)
-	      _coeffDerivV[j][k] = 2. * (double)(k + 1) * _coeffData[j][k + 1];
-	    else
-	      _coeffDerivV[j][k] = _coeffDerivV[j][k + 2] +
-		2. * (double)(k + 1) * _coeffData[j][k + 1];
-	    //if (k != 0)
-	    //_coeffDerivV[j][k] *= 2.;
-	  }
-        }
-      }
-    }
-    for (int j = 0; j < _uM; j++) {
-      for (int k = 0; k < _vM; k++) {
-	if (_derivative & 1) {
-	  if (!_ps->IsUPeriodic()) {
-	    if (j != 0) {
-	      _coeffDerivU[j][k] *= 2.;
-	    }
-	  }
-	  if (!_ps->IsVPeriodic()) {
-	    if (k != 0) {
-	      _coeffDerivV[j][k] *= 2.;
-	    }
-	  }
-	}
-      }
-    }
-
-    for(int j = _uM - 1; j >= 0; j--) {
-      for(int k = _vM - 1; k >= 0; k--) {
-	if(_derivative & 2) {
-	  if (_ps->IsUPeriodic()) {
-	    int J = j+_uMLower;
-	    _coeffDerivUU[j][k] = (2 * M_PI * J * I / _periodU) * 
-	      _coeffDerivU[j][k];
-	  }
-	  else {
-	    if (j == _uM - 1)
-	      _coeffDerivUU[j][k] = 0.;
-	    else if (j == _uM - 2)
-	      _coeffDerivUU[j][k] = 2. * (double)(j + 1) * 
-		_coeffDerivU[j + 1][k];
-	    else
-	      _coeffDerivUU[j][k] = _coeffDerivUU[j + 2][k] +
-		2. * (double)(j + 1) * _coeffDerivU[j + 1][k];
-	    //if (j != 0)
-	    //_coeffDerivUU[j][k] *= 2.;
-	  }
-	  if (_ps->IsVPeriodic()) {
-	    int K = k+_vMLower;
-	    _coeffDerivVV[j][k] = (2 * M_PI * K * I / _periodV) * 
-	      _coeffDerivV[j][k];
-	    _coeffDerivUV[j][k] = (2 * M_PI * K * I / _periodV) * 
-	      _coeffDerivU[j][k];
-	  }
-	  else {
-	    if (k == _vM - 1) {
-	      _coeffDerivVV[j][k] = 0.;
-	      _coeffDerivUV[j][k] = 0.;
-	    }
-	    else if (k == _vM - 2) {
-	      _coeffDerivVV[j][k] = 2. * (double)(k + 1) * 
-		_coeffDerivV[j][k + 1];
-	      _coeffDerivUV[j][k] = 2. * (double)(k + 1) * 
-		_coeffDerivU[j][k + 1];
-	    }
-	    else {
-	      _coeffDerivVV[j][k] = _coeffDerivVV[j][k + 2] +
-		2. * (double)(k + 1) * _coeffDerivV[j][k + 1];
-	      _coeffDerivUV[j][k] = _coeffDerivUV[j][k + 2] +
-		2. * (double)(k + 1) * _coeffDerivU[j][k + 1];
-	    }
-	  }
-	}
-      }
-    }
-    for (int j = 0; j < _uM; j++) {
-      for (int k = 0; k < _vM; k++) {
-	if (_derivative & 2) {
-	  if (!_ps->IsUPeriodic() && _ps->IsVPeriodic()) {
-	    if (j != 0) {
-	      _coeffDerivUU[j][k] *= 2.;
-	    }
-	  }
-	  if (_ps->IsUPeriodic() && !_ps->IsVPeriodic()) {
-	    if (k != 0) {
-	      _coeffDerivVV[j][k] *= 2.;
-	      _coeffDerivUV[j][k] *= 2.;
-	    }
-	  }
-	}
-      }
-    }
-  }
-
-  // Initialize interpolation variables
-  _tmpCoeff = std::vector< std::complex<double> >(_vM);
-  _tmpInterp = std::vector< std::complex<double> >(_uM);
-
-}
-
-FPatch::~FPatch()
-{
-  for(int j = 0; j < _uModes; j++)
-    delete [] _coeffOriginalData[j];
-  delete [] _coeffOriginalData;
-
-  for(int j = 0; j < _uM; j++)
-    delete [] _coeffData[j];
-  delete [] _coeffData;
-
-  if(_coeffDerivU){
-    for(int j = 0; j < _uM; j++)
-      delete [] _coeffDerivU[j];
-    delete [] _coeffDerivU;
-  }
-  if(_coeffDerivV){
-    for(int j = 0; j < _uM; j++)
-      delete [] _coeffDerivV[j];
-    delete [] _coeffDerivV;
-  }
-  if(_coeffDerivUU){
-    for(int j = 0; j < _uM; j++)
-      delete [] _coeffDerivUU[j];
-    delete [] _coeffDerivUU;
-  }
-  if(_coeffDerivVV){
-    for(int j = 0; j < _uM; j++)
-      delete [] _coeffDerivVV[j];
-    delete [] _coeffDerivVV;
-  }
-  if(_coeffDerivUV){
-    for(int j = 0; j < _uM; j++)
-      delete [] _coeffDerivUV[j];
-    delete [] _coeffDerivUV;
-  }
-}
-
-int FPatch::_forwardSize = 0;
-int FPatch::_backwardSize = 0;
-fftw_plan FPatch::_forwardPlan;
-fftw_plan FPatch::_backwardPlan;
-fftw_complex *FPatch::_forwardData = 0;
-fftw_complex *FPatch::_backwardData = 0;
-
-void FPatch::_SetForwardPlan(int n)
-{
-  if(n != _forwardSize){
-    if(_forwardSize){
-      fftw_destroy_plan(_forwardPlan);
-      fftw_free(_forwardData);
-    }
-    _forwardSize = n;
-    _forwardData = 
-      (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * _forwardSize);
-    _forwardPlan = 
-      fftw_plan_dft_1d(_forwardSize, _forwardData, _forwardData,
-		       FFTW_FORWARD, FFTW_ESTIMATE);
-  }
-}
-
-void FPatch::_SetBackwardPlan(int n)
-{
-  if(n != _backwardSize){
-    if(_backwardSize){
-      fftw_destroy_plan(_backwardPlan);
-      fftw_free(_backwardData);
-    }
-    _backwardSize = n;
-    _backwardData = 
-      (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * _backwardSize);
-    _backwardPlan = 
-      fftw_plan_dft_1d(_backwardSize, _backwardData, _backwardData,
-		       FFTW_BACKWARD, FFTW_ESTIMATE);
-  }
-}
-
-void FPatch::_ForwardFft(int n, std::complex<double> *fftData)
-{
-  // Initialize fftw plan and array (ignoring the last element of
-  // fftData, which should just be the periodic extension)
-  _SetForwardPlan(n - 1);
-  for(int i = 0; i < n - 1; i++){
-    _forwardData[i][0] = fftData[i].real();
-    _forwardData[i][1] = fftData[i].imag();
-  }
-
-  // Perform forward FFT
-  fftw_execute(_forwardPlan);
-
-  // Copy data back into fftData and scale by 1/(n - 1)
-  double s = 1. / (double)(n - 1);
-  for(int i = 0; i < n - 1; i++)
-    fftData[i] = 
-      s * std::complex<double>(_forwardData[i][0], _forwardData[i][1]);
-}
-
-void FPatch::_BackwardFft(int n, std::complex<double> *fftData)
-{
-  // Initialize fftw plan and array (ignoring last element of fftData)
-  _SetBackwardPlan(n - 1);
-  for(int i = 0; i < n - 1; i++){
-    _backwardData[i][0] = fftData[i].real();
-    _backwardData[i][1] = fftData[i].imag();
-  }
-
-  // Perform backward FFT
-  fftw_execute(_backwardPlan);
-
-  // Copy data back into fftData
-  for(int i = 0; i < n - 1; i++)
-    fftData[i] = 
-      std::complex<double>(_backwardData[i][0], _backwardData[i][1]);
-
-  // Fill in last element with copy of first element
-  fftData[n - 1] = fftData[0];
-}
-
-void FPatch::_ReprocessSeriesCoeff()
-{
-  _coeffData = new std::complex<double>*[_uM];
-  for(int j = 0; j < _uM; j++) {
-    _coeffData[j] = new std::complex<double>[_vM];
-    for(int k = 0; k < _vM; k++)
-      _coeffData[j][k] = 0.;
-  }
-  if (_ps->IsUPeriodic() && _ps->IsVPeriodic()) {
-    int uShift = (_uM-_uModes)%2 == 0 ? (_uM-_uModes)/2 : (_uM-_uModes)/2 + 1;
-    int vShift = (_vM-_vModes)%2 == 0 ? (_vM-_vModes)/2 : (_vM-_vModes)/2 + 1;
-    for (int j = 0; j < _uModes; j++)
-      for (int k = 0; k < _vModes; k++)
-	_coeffData[uShift + j][vShift + k] = _coeffOriginalData[j][k];
-  }
-  else if (_ps->IsUPeriodic()) {
-    std::vector<double> u(_uM), v(_vM + 1);
-    for (int j = 0; j < _uM; j++)
-      u[j] = (double)j / (double)(_uM-1);
-    for (int j = 0; j < _vM + 1; j++)
-      v[j] = (double)j / (double)_vM;
-
-    std::complex<double> **dataU = new std::complex<double> *[_vM];
-    for (int k = 0; k < _vM; k++)
-      dataU[k] = new std::complex<double> [_uM];
-    std::complex<double> *dataV = new std::complex<double>[2*_vM + 1];
-    for (int j = 0; j < _uM - 1; j++) {
-      for (int k = 0; k < _vM + 1; k++) {
-	//dataV[k] = 1.;
-	//dataV[k] = 2. * cos(M_PI * v[k]) * cos(M_PI * v[k]) - 1.;
-	//dataV[k] = 2. * (0.5 * cos(M_PI * v[k]) + 0.5) *
-	//(0.5 * cos(M_PI * v[k]) + 0.5) - 1.;
-	//dataV[k] = 2. * (0.5 * cos(M_PI * v[k]) + 0.5) *
-	//(0.5 * cos(M_PI * v[k]) + 0.5) * cos(2 * M_PI * u[j]);
-	//dataV[k] = cos(0.5 * cos(M_PI * v[k]) + 0.5) * 
-	//cos(2 * M_PI * u[j]);
-	dataV[k] = _Interpolate(u[j],0.5 * cos(M_PI * v[k]) + 0.5);
-      }
-      for (int k = 1; k < _vM+1; k++)
-	dataV[_vM + k] = dataV[_vM -k];
-      _BackwardFft(2*_vM + 1, dataV);
-      dataU[0][j] = 0.5 * dataV[0] / (double)_vM;
-      for (int k=1; k<_vM-1; k++)
-	dataU[k][j] = dataV[k] / (double)_vM;
-      dataU[_vM-1][j] = 0.5 * dataV[_vM-1] / (double)_vM;
-    }
-    for (int k = 0; k < _vM; k++) {
-      dataU[k][_uM - 1] = dataU[k][0];
-      _ForwardFft(_uM, dataU[k]);
-    }
-    for (int j = _uMLower; j <= _uMUpper; j++) {
-      for (int k = 0; k < _vM; k++)
-	if ((j == _uMLower) || (j == _uMUpper))
-	  _coeffData[_uMUpper + j][k] = dataU[k][_uMUpper] / 2.;
-	else if ((j >= 0) && (j < _uMUpper))
-	  _coeffData[_uMUpper + j][k] = dataU[k][j];
-	else
-	  _coeffData[_uMUpper + j][k] = dataU[k][_uM + j -1];
-    }
-    for (int k = 0; k < _vM; k++)
-      delete [] dataU[k];
-    delete [] dataU;
-    delete [] dataV;
-  }
-  else if (_ps->IsVPeriodic()) {
-    std::vector<double> u(_uM + 1), v(_vM);
-    for (int j = 0; j < _uM + 1; j++)
-      u[j] = (double)j / (double)_uM;
-    for (int j = 0; j < _vM; j++)
-      v[j] = (double)j / (double)(_vM-1);
-
-    std::complex<double> **dataV = new std::complex<double> *[_uM];
-    for (int j = 0; j < _uM; j++)
-      dataV[j] = new std::complex<double> [_vM];
-    std::complex<double> *dataU = new std::complex<double>[2*_uM + 1];
-    for (int k = 0; k < _vM - 1; k++) {
-      for (int j = 0; j < _uM + 1; j++) {
-	//dataU[j] = 1.;
-	//dataU[j] = 2. * cos(M_PI * u[j]) * cos(M_PI * u[j]);
-	dataU[j] = _Interpolate(0.5 * cos(M_PI * u[j]) + 0.5,v[k]);
-      }
-      for (int j = 1; j < _uM+1; j++)
-	dataU[_uM + j] = dataU[_uM -j];
-      _BackwardFft(2*_uM + 1, dataU);
-      dataV[0][k] = 0.5 * dataU[0] / (double)_uM;
-      for (int j=1; j<_uM-1; j++)
-	dataV[j][k] = dataU[j] / (double)_uM;
-      dataV[_uM-1][k] = 0.5 * dataU[_uM-1] / (double)_uM;
-    }
-    for (int j = 0; j < _uM; j++) {
-      dataV[j][_uM - 1] = dataV[j][0];
-      _ForwardFft(_vM, dataV[j]);
-    }
-    for (int k = _vMLower; k <= _vMUpper; k++) {
-      //for (int j = 0; j < _uM - 1; j++) {
-      for (int j = 0; j < _uM; j++)
-	if ((k == _vMLower) || (k == _vMUpper))
-	  _coeffData[j][_vMUpper + k] = dataV[j][_vMUpper] / 2.;
-	else if ((j >= 0) && (j < _vMUpper))
-	  _coeffData[j][_uMUpper + k] = dataV[j][k];
-	else
-	  _coeffData[j][_uMUpper + k] = dataV[j][_uM + k -1];
-    }
-    for (int j = 0; j < _uM; j++)
-      delete [] dataV[j];
-    delete [] dataV;
-    delete [] dataU;
-  }
-  else {
-    std::vector<double> u(_uM + 1), v(_vM + 1);
-    for (int j = 0; j < _uM + 1; j++)
-      u[j] = (double)j / (double)_uM;
-    for (int j = 0; j < _vM + 1; j++)
-      v[j] = (double)j / (double)_vM;
-
-    std::complex<double> **dataU = new std::complex<double> *[_vM];
-    for (int k = 0; k < _vM; k++)
-      dataU[k] = new std::complex<double> [2*_uM + 1];
-
-    std::complex<double> *dataV = new std::complex<double>[2*_vM + 1];
-    for (int j = 0; j < _uM + 1; j++) {
-      for (int k = 0; k < _vM + 1; k++) {
-	dataV[k] = _Interpolate(0.5 * cos(M_PI * u[j]) + 0.5,
-				0.5 * cos(M_PI * v[k]) + 0.5);
-      }
-      for (int k = 1; k < _vM+1; k++)
-	dataV[_vM + k] = dataV[_vM - k];
-      _BackwardFft(2*_vM + 1, dataV);
-      dataU[0][j] = 0.5 * dataV[0] / (double)_vM;
-      for (int k=1; k<_vM-1; k++)
-	dataU[k][j] = dataV[k] / (double)_vM;
-      dataU[_vM-1][j] = 0.5 * dataV[_vM-1] / (double)_vM;
-    }
-
-    for (int k = 0; k < _vM; k++) {
-      for (int j = 1; j < _uM+1; j++) {
-	dataU[k][_uM + j] = dataU[k][_uM - k];
-      }
-      _BackwardFft(2*_uM + 1, dataU[k]);
-    }
-
-    for (int j = 0; j < _uM; j++) {
-      for (int k = 0; k < _vM; k++) {
-	if ((j == 0) || (j == _uM - 1))
-	  _coeffData[j][k] = 0.5 * dataU[k][j]/ (double)_uM;
-	else
-	  _coeffData[j][k] = dataU[k][j]/ (double)_uM;
-      }
-    }
-    for (int k = 0; k < _vM; k++)
-      delete [] dataU[k];
-    delete [] dataU;
-    delete [] dataV;
-  }
-}
-
-std::complex<double> FPatch::
-_PolyEval(std::vector< std::complex<double> > _coeff, std::complex<double> x)
-{
-  int _polyOrder = _coeff.size()-1;
-  std::complex<double> out = 0.;
-
-  out = x * _coeff[_polyOrder];
-  for (int i = _polyOrder - 1; i > 0; i--)
-    out = x * (out + _coeff[i]);
-  out = out + _coeff[0];
-
-  return out;
-}
-
-std::complex<double> FPatch::
-  _Interpolate(double u, double v)
-{
-  double epsilon = 1e-12;
-  if (u < 0. - epsilon || u > 1. + epsilon || 
-      v < 0. - epsilon || v > 1. + epsilon) {
-    Msg::Error("Trying to interpolate outside interval: (u,v)=(%.16g,%.16g) "
-               "not in [%g,%g]x[%g,%g]", u, v, 0., 1., 0., 1.); 
-  }
-  
-  // Interpolate to find value at (u,v)
-  for(int j = 0; j < _uModes; j++){
-    for(int k = 0; k < _vModes; k++) {
-      _tmpOrigCoeff[k] = _coeffOriginalData[j][k];
-    }
-    std::complex<double> y(cos(2 * M_PI * v / _periodV),
-                           sin(2 * M_PI * v / _periodV));
-    _tmpOrigInterp[j] = _PolyEval(_tmpOrigCoeff, y);
-    _tmpOrigInterp[j] *= std::complex<double>
-      (cos(2 * M_PI * _vModesLower * v / _periodV),
-       sin(2 * M_PI * _vModesLower * v / _periodV));
-  }
-  std::complex<double> x(cos(2 * M_PI * u / _periodU),
-                         sin(2 * M_PI * u / _periodU));
-  return _PolyEval(_tmpOrigInterp, x) * std::complex<double>
-    (cos(2 * M_PI * _uModesLower * u / _periodU),
-     sin(2 * M_PI * _uModesLower * u / _periodU));
-}
-
-std::complex<double> FPatch::
-  _Interpolate(double u, double v, int uDer, int vDer)
-{
-  //Msg::Info("%d %d %d",uDer,vDer,_derivative);
-  if (((uDer==2 || vDer==2 || (uDer==1 && vDer==1)) && !(_derivative & 2) ) ||
-      ((uDer==1 || vDer==1) && !(_derivative & 1)) ||
-      (uDer<0 || uDer>2 || vDer<0 || vDer>2) ) {
-    Msg::Error("Derivative data not available: check contructor call %d %d %d",
-               uDer,vDer,_derivative);
-    return 0.;
-  }
-
-  double epsilon = 1e-12;
-  if (u < 0. - epsilon || u > 1. + epsilon) {
-    Msg::Error("Trying to interpolate outside interval: (u,v)=(%.16g,%.16g) "
-               "not in [%g,%g]x[%g,%g]", u, v, 0., 1., 0., 1.); 
-  }
-  std::vector<double> uT(_uM,0.);
-  std::vector<double> vT(_vM,0.);
-  if (!_ps->IsUPeriodic()) {
-    for (int j = 0; j < _uM; j++)
-      if (j == 0)
-	uT[j] = 1.;
-      else if (j == 1)
-	uT[j] = 2. * u - 1;
-      else
-	uT[j] = 2. * uT[1] * uT[j-1] - uT[j-2];
-  }
-  if (!_ps->IsVPeriodic()) {
-    for (int k = 0; k < _vM; k++)
-      if (k == 0)
-	vT[k] = 1.;
-      else if (k == 1)
-	vT[k] = 2. * v - 1.;
-      else
-	vT[k] = 2. * vT[1] * vT[k-1] - vT[k-2];
-  }
-  // Interpolate to find value at (u,v)
-  for(int j = 0; j < _uM; j++){
-    _tmpInterp[j] = 0.;
-    for(int k = 0; k < _vM; k++){
-      //printf("i was here %d %d\n",j,k);
-      std::complex<double> tmp;
-      if(uDer == 0 && vDer == 0)
-	tmp = _coeffData[j][k];
-      else if(uDer == 1 && vDer == 0)
-	tmp = _coeffDerivU[j][k];
-      else if(uDer == 0 && vDer == 1)
-	tmp = _coeffDerivV[j][k];
-      else if(uDer == 2 && vDer == 0)
-	tmp = _coeffDerivUU[j][k];
-      else if(uDer == 0 && vDer == 2)
-	tmp = _coeffDerivVV[j][k];
-      else
-	tmp = _coeffDerivUV[j][k];
-      _tmpCoeff[k] = tmp;
-    }
-    //printf("i was here 00\n");
-    if (_ps->IsVPeriodic()) {
-      std::complex<double> y(cos(2 * M_PI * v / _periodV),
-			     sin(2 * M_PI * v / _periodV));
-      _tmpInterp[j] = _PolyEval(_tmpCoeff, y);
-      _tmpInterp[j] *= std::complex<double>
-	(cos(2 * M_PI * _vMLower * v / _periodV),
-	 sin(2 * M_PI * _vMLower * v / _periodV));
-    }
-    else {
-      //printf("i was here 0\n");
-      for(int k = 0; k < _vM; k++)
-	_tmpInterp[j] += _tmpCoeff[k] * vT[k];
-    }
-  }
-  //printf("i was here\n");
-  if (_ps->IsUPeriodic()) {
-    std::complex<double> x(cos(2 * M_PI * u / _periodU),
-			   sin(2 * M_PI * u / _periodU));
-    return _PolyEval(_tmpInterp, x) * std::complex<double>
-      (cos(2 * M_PI * _uMLower * u / _periodU),
-       sin(2 * M_PI * _uMLower * u / _periodU));
-  }
-  else {
-    std::complex<double> tmp = 0.;
-    for(int j = 0; j < _uM; j++)
-      tmp += _tmpInterp[j] * uT[j];
-    return tmp;
-  }
-}
-
-void FPatch::
-F(double u, double v, double &x, double &y, double &z)
-{
-  double px, py, pz, nx, ny, nz, d;
-
-  u = RescaleU(u);
-  v = RescaleV(v);
-
-  _ps->F(u,v,px,py,pz);
-  _ps->GetUnitNormal(u,v,nx,ny,nz);
-
-  d = _Interpolate(u, v).real();
-
-  x = px + d * nx;
-  y = py + d * ny;
-  z = pz + d * nz;
-}
-
-bool FPatch::
-Inverse(double x,double y,double z,double &u,double &v)
-{
-  bool result = _ps->OrthoProjectionOnSurface(x,y,z,u,v);
-
-  u = UnscaleU(u);
-  v = UnscaleV(v);
-
-  double tol = 1.e-12;
-  if ((u > - tol) && (u < 1. + tol) && (v > - tol) && (v < 1. + tol))
-    result = true;
-  else
-    result = false;
-
-  return result;
-}
-
-void FPatch::
-Dfdu(double u, double v, double &x, double &y, double &z)
-{
-  double px, py, pz, nx, ny, nz, d;
-  double pxu, pyu, pzu, nxu, nyu, nzu, du;
-
-  u = RescaleU(u);
-  v = RescaleV(v);
-
-  _ps->F(u,v,px,py,pz);
-  _ps->GetUnitNormal(u,v,nx,ny,nz);
-  _ps->Dfdu(u,v,pxu,pyu,pzu);
-  _ps->Dndu(u,v,nxu, nyu, nzu);
-
-  d = _Interpolate(u, v, 0, 0).real();
-  du = _Interpolate(u, v, 1, 0).real();
-
-  x = pxu + du * nx + d * nxu;
-  y = pyu + du * ny + d * nyu;
-  z = pzu + du * nz + d * nzu;
-}
-
-void FPatch::
-Dfdv(double u, double v, double &x, double &y, double &z)
-{
-  double px, py, pz, nx, ny, nz, d;
-  double pxv, pyv, pzv, nxv, nyv, nzv, dv;
-
-  u = RescaleU(u);
-  v = RescaleV(v);
-
-  _ps->F(u,v,px,py,pz);
-  _ps->GetUnitNormal(u,v,nx,ny,nz);
-  _ps->Dfdv(u,v,pxv,pyv,pzv);
-  _ps->Dndv(u,v,nxv,nyv,nzv);
-
-  d = _Interpolate(u, v, 0, 0).real();
-  dv = _Interpolate(u, v, 0, 1).real();
-
-  x = pxv + dv * nx + d * nxv;
-  y = pyv + dv * ny + d * nyv;
-  z = pzv + dv * nz + d * nzv;
-}
-
-void FPatch::
-Dfdfdudu(double u, double v, double &x, double &y, double &z)
-{
-  double px, py, pz, nx, ny, nz, d;
-  double pxu, pyu, pzu, nxu, nyu, nzu, du;
-  double pxuu, pyuu, pzuu, nxuu, nyuu, nzuu, duu;
-
-  u = RescaleU(u);
-  v = RescaleV(v);
-
-  _ps->F(u,v,px,py,pz);
-  _ps->GetUnitNormal(u,v,nx,ny,nz);
-  _ps->Dfdu(u,v,pxu,pyu,pzu);
-  _ps->Dndu(u,v,nxu,nyu,nzu);
-  _ps->Dfdfdudu(u,v,pxuu,pyuu,pzuu);
-  _ps->Dndndudu(u,v,nxuu,nyuu,nzuu);
-
-  d = _Interpolate(u, v, 0, 0).real();
-  du = _Interpolate(u, v, 1, 0).real();
-  duu = _Interpolate(u, v, 2, 0).real();
-
-  x = pxuu + duu * nx + du * nxu + du * nxu + d * nxuu;
-  y = pyuu + duu * ny + du * nyu + du * nyu + d * nyuu;
-  z = pzuu + duu * nz + du * nzu + du * nzu + d * nzuu;
-}
-
-void FPatch::
-Dfdfdvdv(double u, double v, double &x, double &y, double &z)
-{
-  double px, py, pz, nx, ny, nz, d;
-  double pxv, pyv, pzv, nxv, nyv, nzv, dv;
-  double pxvv, pyvv, pzvv, nxvv, nyvv, nzvv, dvv;
-
-  u = RescaleU(u);
-  v = RescaleV(v);
-
-  _ps->F(u,v,px,py,pz);
-  _ps->GetUnitNormal(u,v,nx,ny,nz);
-  _ps->Dfdv(u,v,pxv,pyv,pzv);
-  _ps->Dndv(u,v,nxv,nyv,nzv);
-  _ps->Dfdfdvdv(u,v,pxvv,pyvv,pzvv);
-  _ps->Dndndvdv(u,v,nxvv,nyvv,nzvv);
-
-  d = _Interpolate(u, v, 0, 0).real();
-  dv = _Interpolate(u, v, 0, 1).real();
-  dvv = _Interpolate(u, v, 0, 2).real();
-
-  x = pxvv + dvv * nx + dv * nxv + dv * nxv + d * nxvv;
-  y = pyvv + dvv * ny + dv * nyv + dv * nyv + d * nyvv;
-  z = pzvv + dvv * nz + dv * nzv + dv * nzv + d * nzvv;
-}
-
-void FPatch::
-Dfdfdudv(double u, double v, double &x, double &y, double &z)
-{
-  double px, py, pz, nx, ny, nz, d;
-  double pxu, pyu, pzu, nxu, nyu, nzu, du;
-  double pxv, pyv, pzv, nxv, nyv, nzv, dv;
-  double pxuv, pyuv, pzuv, nxuv, nyuv, nzuv, duv;
-
-  u = RescaleU(u);
-  v = RescaleV(v);
-
-  _ps->F(u,v,px,py,pz);
-  _ps->GetUnitNormal(u,v,nx,ny,nz);
-  _ps->Dfdu(u,v,pxu,pyu,pzu);
-  _ps->Dndu(u,v,nxu,nyu,nzu);
-  _ps->Dfdv(u,v,pxv,pyv,pzv);
-  _ps->Dndv(u,v,nxv,nyv,nzv);
-  _ps->Dfdfdudv(u,v,pxuv,pyuv,pzuv);
-  _ps->Dndndudv(u,v,nxuv,nyuv,nzuv);
-
-  d = _Interpolate(u, v, 0, 0).real();
-  du = _Interpolate(u, v, 1, 0).real();
-  dv = _Interpolate(u, v, 1, 0).real();
-  duv = _Interpolate(u, v, 1, 1).real();
-
-  x = pxuv + duv * nx + du * nxv + dv * nxu + d * nxuv;
-  y = pyuv + duv * ny + du * nyv + dv * nyu + d * nyuv;
-  z = pzuv + duv * nz + du * nzv + dv * nzu + d * nzuv;
-}
-
-double  FPatch::GetPou(double u, double v)
-{
-  double pouU, pouV;
-
-  if (_hardEdge[3])
-    pouU = OneSidedPartitionOfUnity(0.,1.,u);
-  else if (_hardEdge[1])
-    pouU = 1. - OneSidedPartitionOfUnity(0.,1.,u);
-  else
-    pouU = PartitionOfUnity(u, 0., 0.3, 0.7, 1.);
-
-  if (_hardEdge[0])
-    pouV = OneSidedPartitionOfUnity(0.,1.,v);
-  else if (_hardEdge[2])
-    pouV = 1. - OneSidedPartitionOfUnity(0.,1.,v);
-  else
-    pouV = PartitionOfUnity(v, 0., 0.3, 0.7, 1.);
-
-  return pouU * pouV;
-}
-
-void FPatch::Export(FILE *fp)
-{
-  double x,y,z;
-
-  fprintf(fp, "%s\n", _ps->GetName().c_str());
-  fprintf(fp, "%d\n", _ps->GetTag());
-  _ps->GetOrigin(x,y,z);
-  fprintf(fp, "%g %g %g\n", x, y, z);
-  _ps->GetE0(x,y,z);
-  fprintf(fp, "%g %g %g\n", x, y, z);
-  _ps->GetE1(x,y,z);
-  fprintf(fp, "%g %g %g\n", x, y, z);
-  _ps->GetScale(x,y,z);
-  fprintf(fp, "%g %g %g\n", x, y, z);
-  fprintf(fp, "%d\n", _ps->GetNumParameters());
-  for (int i = 0; i < _ps->GetNumParameters(); i++)
-    fprintf(fp, "%g\n",_ps->GetParameter(i));
-
-  fprintf(fp, "%s\n", "FPatch");
-  fprintf(fp, "%d\n", _tag);
-  fprintf(fp, "%d\n", _derivative);
-  fprintf(fp, "%g %g\n", _uMin, _uMax);
-  fprintf(fp, "%g %g\n", _vMin, _vMax);
-  fprintf(fp, "%d %d %d %d\n", _hardEdge[0], _hardEdge[1], _hardEdge[2],
-	  _hardEdge[3]);
-  fprintf(fp, "%d %d\n", _uModes, _vModes);
-  for (int j = 0; j < _uModes; j++) {
-    for (int k = 0; k < _vModes; k++) {
-      fprintf(fp, "%g %g\n", _coeffOriginalData[j][k].real(),
-	      _coeffOriginalData[j][k].imag());
-    }
-  }
-  fprintf(fp, "%d %d\n", _uM, _vM);
-  fprintf(fp, "%d\n", 0);
-  if (_derivative) {
-    for (int j = 0; j < _uM; j++) {
-      for (int k = 0; k < _vM; k++) {
-	fprintf(fp, "%g %g\n", _coeffData[j][k].real(), 
-		_coeffData[j][k].imag());
-      }
-    }
-    for (int j = 0; j < _uM; j++) {
-      for (int k = 0; k < _vM; k++) {
-	fprintf(fp, "%g %g\n", _coeffDerivU[j][k].real(), 
-		_coeffDerivU[j][k].imag());
-      }
-    }
-    for (int j = 0; j < _uM; j++) {
-      for (int k = 0; k < _vM; k++) {
-	fprintf(fp, "%g %g\n", _coeffDerivV[j][k].real(), 
-		_coeffDerivV[j][k].imag());
-      }
-    }
-    for (int j = 0; j < _uM; j++) {
-      for (int k = 0; k < _vM; k++) {
-	fprintf(fp, "%g %g\n", _coeffDerivUU[j][k].real(), 
-		_coeffDerivUU[j][k].imag());
-      }
-    }
-    for (int j = 0; j < _uM; j++) {
-      for (int k = 0; k < _vM; k++) {
-	fprintf(fp, "%g %g\n", _coeffDerivUV[j][k].real(), 
-		_coeffDerivUV[j][k].imag());
-      }
-    }
-    for (int j = 0; j < _uM; j++) {
-      for (int k = 0; k < _vM; k++) {
-	fprintf(fp, "%g %g\n", _coeffDerivVV[j][k].real(), 
-		_coeffDerivVV[j][k].imag());
-      }
-    }
-  }
-}
diff --git a/contrib/FourierModel/FPatch.h b/contrib/FourierModel/FPatch.h
deleted file mode 100644
index d3a24e1e5e..0000000000
--- a/contrib/FourierModel/FPatch.h
+++ /dev/null
@@ -1,96 +0,0 @@
-#ifndef _F_PATCH_H_
-#define _F_PATCH_H_
-
-#include <cmath>
-#include <vector>
-#include <fftw3.h>
-#include <complex>
-#include "Patch.h"
-#include "PartitionOfUnity.h"
-#include "ProjectionSurface.h"
-
-namespace FM {
-
-// The base class for the patches
-class FPatch : public Patch {
- protected:
-  // Data Size
-  int _nData;
-
-  // Number of Fourier Modes
-  int _uModes, _vModes, _nModes;
-
-  // Number of Modes in reprocessed Fourier/Chebyshev series
-  int _uM, _vM;
-
-   // Period Information
-  double _periodU, _periodV;
-
-  // Limits of Fourier Series
-  int _uModesLower, _uModesUpper, _vModesLower, _vModesUpper;
-
-  // Limits in the new series
-  int _uMLower, _uMUpper, _vMLower, _vMUpper;
-
-  // data (and its first 2 derivatives)
-  std::complex<double> **_coeffOriginalData;
-  std::complex<double> **_coeffData, **_coeffDerivU, **_coeffDerivV;
-  std::complex<double> **_coeffDerivUU, **_coeffDerivVV, **_coeffDerivUV;
-
-  // temporary interpolation variables
-  std::vector< std::complex<double> > _tmpOrigCoeff, _tmpOrigInterp;
-  std::vector< std::complex<double> > _tmpCoeff, _tmpInterp;
-
-  // polynomial evaluator
-  std::complex<double> _PolyEval(std::vector< std::complex<double> > _coeff,
-                                 std::complex<double> x);
-  // interpolation wrapper
-  std::complex<double> _Interpolate(double u,double v);
-  std::complex<double> _Interpolate(double u,double v,int uDer,int vDer);
-
-  // other internal functions
-  void _ReprocessSeriesCoeff();
-
-  // persistent fftw data (used to avoid recomputing the FFTW plans
-  // and reallocating memory every time)
-  static int _forwardSize, _backwardSize;
-  static fftw_plan _forwardPlan, _backwardPlan;
-  static fftw_complex *_forwardData, *_backwardData;
-  void _SetForwardPlan(int n);
-  void _SetBackwardPlan(int n);
-
-  // This routine computes the forward FFT (ignoring the last element
-  // of the data)
-  void _ForwardFft(int n, std::complex<double> *fftData);
-
-  // This routine computes the inverse FFT (ignoring the last element
-  // in the array), returns values in entire array (by using the
-  // periodic extension)
-  void _BackwardFft(int n, std::complex<double> *fftData);
-
- public:
-  FPatch
-    (int tag, ProjectionSurface* ps,
-     std::vector<double> &u, std::vector<double> &v,
-     std::vector< std::complex<double> > &data, int derivative = 3,
-     int uModes = 10, int vModes = 8, int uM = 17, int vM = 16,
-     bool hardEdge0 = false, bool hardEdge1 = false, bool hardEdge2 = false,
-     bool hardEdge3 = false);
-  virtual ~FPatch();
-
-  // Abstract functions of Patch
-
-  virtual void Export(FILE *fp);
-  virtual double GetPou(double u, double v);
-  virtual void F(double u, double v, double &x, double &y, double &z);
-  virtual bool Inverse(double x,double y,double z,double &u,double &v);
-  virtual void Dfdu(double u, double v, double &x, double &y, double &z);
-  virtual void Dfdv(double u, double v, double &x, double &y, double &z);
-  virtual void Dfdfdudu(double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdudv(double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdvdv(double u,double v,double &x,double &y,double &z);
-};
-
-}
-
-#endif
diff --git a/contrib/FourierModel/IntersectionCurve.cpp b/contrib/FourierModel/IntersectionCurve.cpp
deleted file mode 100644
index 88424a9520..0000000000
--- a/contrib/FourierModel/IntersectionCurve.cpp
+++ /dev/null
@@ -1,367 +0,0 @@
-#include <math.h>
-#include "Message.h"
-#include "IntersectionCurve.h"
-
-using namespace FM;
-
-IntersectionCurve::IntersectionCurve
-(IntersectionInfo* II, std::vector<Patch*> patches) 
-  : Curve(), _II(II)
-{
-  _tag = _II->tag;
-  _along = _II->along;
-  _h = 1.e-6;
-  _tol = 1.e-12;
-
-  for (int i=0;i<patches.size();i++) {
-    if (patches[i]->GetTag() == _II->intersectingPatches[0].patchTag) {
-      _patch0 = patches[i];
-      break;
-    }
-  }
-  for (int i=0;i<patches.size();i++) {
-    if (patches[i]->GetTag() == _II->intersectingPatches[1].patchTag) {
-      _patch1 = patches[i];
-      break;
-    }
-  }
-
-  double u,v,x,y,z;
-  x = _II->SP[0]; y = _II->SP[1]; z = _II->SP[2];
-  _patch0->Inverse(x,y,z,u,v);
-  _SP0[0] = u;
-  _SP0[1] = v;
-  _patch1->Inverse(x,y,z,u,v);
-  _SP1[0] = u;
-  _SP1[1] = v;
-  //printf("SPx = %g; SPy = %g; SPz = %g;\n",x,y,z);
-  
-  x = _II->EP[0]; y = _II->EP[1]; z = _II->EP[2];
-  _patch0->Inverse(x,y,z,u,v);
-  _EP0[0] = u;
-  _EP0[1] = v;
-  _patch1->Inverse(x,y,z,u,v);
-  _EP1[0] = u;
-  _EP1[1] = v;
-  //printf("EPx = %g; EPy = %g; EPz = %g;\n",x,y,z);
-}
-
-void IntersectionCurve::F(double t, double &x, double &y, double &z)
-{
-  double u0, v0, u1, v1;
-  //printf("patch0 : %d\n",_patch0->GetTag());
-  //printf("patch1 : %d\n",_patch1->GetTag());
-  //printf("%g,%g,%g\n",_II->SP[0],_II->SP[1],_II->SP[2]);
-  //printf("%g,%g,%g\n",_II->EP[0],_II->EP[1],_II->EP[2]);
-  //printf("%g,%g,%g,%g\n",_SP0[0],_SP0[1],_EP0[0],_EP0[1]);
-  //printf("%g,%g,%g,%g\n",_SP1[0],_SP1[1],_EP1[0],_EP1[1]);
-  
-  if (_patch0->IsUPeriodic()) {
-    if (std::abs(_SP0[0]-_EP0[0])<1.e-12)
-      u0 = _SP0[0] + t * (1. + _EP0[0] - _SP0[0]);
-    else
-      u0 = _SP0[0] + t * (_EP0[0] - _SP0[0]);
-    u0 -= floor(u0);
-  }
-  else
-    u0 = _SP0[0] + t * (_EP0[0] - _SP0[0]);
-  
-  if (_patch0->IsVPeriodic()) {
-    if (std::abs(_SP0[1]-_EP0[1])<1.e-12)
-      v0 = _SP0[1] + t * (1. + _EP0[1] - _SP0[1]);
-    else
-      v0 = _SP0[1] + t * (_EP0[1] - _SP0[1]);
-    v0 -= floor(v0);
-  }
-  else
-    v0 = _SP0[1] + t * (_EP0[1] - _SP0[1]);
-  
-  if (_patch1->IsUPeriodic()) {
-    if (std::abs(_SP1[0]-_EP1[0])<1.e-12)
-      u1 = _SP1[0] + t * (1. + _EP1[0] - _SP1[0]);
-    else
-      u1 = _SP1[0] + t * (_EP1[0] - _SP1[0]);
-    u1 -= floor(u1);
-  }
-  else
-    u1 = _SP1[0] + t * (_EP1[0] - _SP1[0]);
-  
-  if (_patch1->IsVPeriodic()) {
-    if (std::abs(_SP1[1]-_EP1[1])<1.e-12)
-      v1 = _SP1[1] + t * (1. + _EP1[1] - _SP1[1]);
-    else
-      v1 = _SP1[1] + t * (_EP1[1] - _SP1[1]);
-    v1 -= floor(v1);
-  }
-  else
-    v1 = _SP1[1] + t * (_EP1[1] - _SP1[1]);
-  
-  if (_along) {
-    double x0, y0, z0;
-    _patch0->F(u0,v0,x0,y0,z0);
-    
-    double x1, y1, z1;
-    _patch1->F(u1,v1,x1,y1,z1);
-    
-    double r,u,v,rPlus,uPlus,vPlus;
-    
-    r = u0;
-    u = u1;
-    v = v1;
-    
-    double F[3];
-    F[0] = x1 - x0;
-    F[1] = y1 - y0;
-    F[2] = z1 - z0;
-    
-    while ((std::abs(F[0])>_tol) || (std::abs(F[1])>_tol) ||
-	   (std::abs(F[2])>_tol)) {
-      rPlus = r + _h;
-      uPlus = u + _h;
-      vPlus = v + _h;
-      if (_patch0->IsUPeriodic())
-	rPlus -= std::floor(rPlus);
-      if (_patch1->IsUPeriodic())
-	uPlus -= std::floor(uPlus);
-      if (_patch1->IsVPeriodic())
-	vPlus -= floor(vPlus);
-      
-      double x0rPlus, y0rPlus, z0rPlus;
-      _patch0->F(rPlus,v0,x0rPlus,y0rPlus,z0rPlus);
-      double x1uPlus, y1uPlus, z1uPlus;
-      _patch1->F(uPlus,v,x1uPlus,y1uPlus,z1uPlus);
-      double x1vPlus, y1vPlus, z1vPlus;
-      _patch1->F(u,vPlus,x1vPlus,y1vPlus,z1vPlus);
-      
-      double Df[3][3];
-      Df[0][0] = - (x0rPlus - x0) / _h;
-      Df[0][1] = (x1uPlus - x1) / _h;
-      Df[0][2] = (x1vPlus - x1) / _h;
-      Df[1][0] = - (y0rPlus - y0) / _h;
-      Df[1][1] = (y1uPlus - y1) / _h;
-      Df[1][2] = (y1vPlus - y1) / _h;
-      Df[2][0] = - (z0rPlus - z0) / _h;
-      Df[2][1] = (z1uPlus - z1) / _h;
-      Df[2][2] = (z1vPlus - z1) / _h;
-      
-      double det = 
-	Df[0][0] * (Df[1][1] * Df[2][2] - Df[1][2] * Df[2][1]) +
-	Df[0][1] * (Df[1][2] * Df[2][0] - Df[1][0] * Df[2][2]) +
-	Df[0][2] * (Df[1][0] * Df[2][1] - Df[1][1] * Df[2][0]);
-      
-      double update[3];
-      update[0] = 
-	(Df[1][1] * Df[2][2] - Df[1][2] * Df[2][1]) * F[0] +
-	(Df[0][2] * Df[2][1] - Df[0][1] * Df[2][2]) * F[1] +
-	(Df[0][1] * Df[1][2] - Df[0][2] * Df[1][1]) * F[2];
-      update[1] =
-	(Df[1][2] * Df[2][0] - Df[1][0] * Df[2][2]) * F[0] +
-	(Df[0][0] * Df[2][2] - Df[0][2] * Df[2][0]) * F[1] +
-	(Df[0][2] * Df[1][0] - Df[0][0] * Df[1][2]) * F[2];
-      update[2] =
-	(Df[1][0] * Df[2][1] - Df[1][1] * Df[2][0]) * F[0] +
-	(Df[0][1] * Df[2][0] - Df[0][0] * Df[2][1]) * F[1] +
-	(Df[0][0] * Df[1][1] - Df[0][1] * Df[1][0]) * F[2];
-      
-      r -= update[0] / det;
-      u -= update[1] / det;
-      v -= update[2] / det;
-      
-      if (_patch0->IsUPeriodic())
-	r -= std::floor(r);
-      if (_patch1->IsUPeriodic())
-	u -= std::floor(u);
-      if (_patch1->IsVPeriodic())
-	v -= floor(v);
-      
-      _patch0->F(r,v0,x0,y0,z0);
-      _patch1->F(u,v,x1,y1,z1);
-      
-      F[0] = x1 - x0;
-      F[1] = y1 - y0;
-      F[2] = z1 - z0;
-    }
-    x = x0; y = y0; z = z0;
-  }
-  else {      
-    double x0, y0, z0;
-    _patch0->F(u0,v0,x0,y0,z0);
-    
-    double x1, y1, z1;
-    _patch1->F(u1,v1,x1,y1,z1);
-    
-    double r,u,v,rPlus,uPlus,vPlus;
-    
-    r = v0;
-    u = u1;
-    v = v1;
-    
-    double F[3];
-    F[0] = x1 - x0;
-    F[1] = y1 - y0;
-    F[2] = z1 - z0;
-    
-    while ((std::abs(F[0])>_tol) || (std::abs(F[1])>_tol) ||
-	   (std::abs(F[2])>_tol)) {
-      rPlus = r + _h;
-      uPlus = u + _h;
-      vPlus = v + _h;
-      if (_patch0->IsVPeriodic())
-	rPlus -= std::floor(rPlus);
-      if (_patch1->IsUPeriodic())
-	uPlus -= std::floor(uPlus);
-      if (_patch1->IsVPeriodic())
-	vPlus -= floor(vPlus);
-      
-      double x0rPlus, y0rPlus, z0rPlus;
-      _patch0->F(u0,rPlus,x0rPlus,y0rPlus,z0rPlus);
-      double x1uPlus, y1uPlus, z1uPlus;
-      _patch1->F(uPlus,v,x1uPlus,y1uPlus,z1uPlus);
-      double x1vPlus, y1vPlus, z1vPlus;
-      _patch1->F(u,vPlus,x1vPlus,y1vPlus,z1vPlus);
-      
-      double Df[3][3];
-      Df[0][0] = - (x0rPlus - x0) / _h;
-      Df[0][1] = (x1uPlus - x1) / _h;
-      Df[0][2] = (x1vPlus - x1) / _h;
-      Df[1][0] = - (y0rPlus - y0) / _h;
-      Df[1][1] = (y1uPlus - y1) / _h;
-      Df[1][2] = (y1vPlus - y1) / _h;
-      Df[2][0] = - (z0rPlus - z0) / _h;
-      Df[2][1] = (z1uPlus - z1) / _h;
-      Df[2][2] = (z1vPlus - z1) / _h;
-      
-      double det = 
-	Df[0][0] * (Df[1][1] * Df[2][2] - Df[1][2] * Df[2][1]) +
-	Df[0][1] * (Df[1][2] * Df[2][0] - Df[1][0] * Df[2][2]) +
-	Df[0][2] * (Df[1][0] * Df[2][1] - Df[1][1] * Df[2][0]);
-      
-      double update[3];
-      update[0] = 
-	(Df[1][1] * Df[2][2] - Df[1][2] * Df[2][1]) * F[0] +
-	(Df[0][2] * Df[2][1] - Df[0][1] * Df[2][2]) * F[1] +
-	(Df[0][1] * Df[1][2] - Df[0][2] * Df[1][1]) * F[2];
-      update[1] =
-	(Df[1][2] * Df[2][0] - Df[1][0] * Df[2][2]) * F[0] +
-	(Df[0][0] * Df[2][2] - Df[0][2] * Df[2][0]) * F[1] +
-	(Df[0][2] * Df[1][0] - Df[0][0] * Df[1][2]) * F[2];
-      update[2] =
-	(Df[1][0] * Df[2][1] - Df[1][1] * Df[2][0]) * F[0] +
-	(Df[0][1] * Df[2][0] - Df[0][0] * Df[2][1]) * F[1] +
-	(Df[0][0] * Df[1][1] - Df[0][1] * Df[1][0]) * F[2];
-      
-      r -= update[0] / det;
-      u -= update[1] / det;
-      v -= update[2] / det;
-      
-      if (_patch0->IsVPeriodic())
-	r -= std::floor(r);
-      if (_patch1->IsUPeriodic())
-	u -= std::floor(u);
-      if (_patch1->IsVPeriodic())
-	v -= floor(v);
-      
-      _patch0->F(u0,r,x0,y0,z0);
-      _patch1->F(u,v,x1,y1,z1);
-      
-      F[0] = x1 - x0;
-      F[1] = y1 - y0;
-      F[2] = z1 - z0;
-    }
-    x = x0; y = y0; z = z0;
-  }
-}
-
-bool IntersectionCurve::Inverse(double x,double y,double z,double &t)
-{
-  double u0, v0;
-  _patch0->Inverse(x,y,z,u0,v0);
-  if (_along) {
-    if ((std::abs(_SP0[1]-_EP0[1])<1.e-12) && 
-	(_patch0->IsVPeriodic())) {
-      t = (v0 - _SP0[1] > 0 ? v0 - _SP0[1] : 1. + v0 - _SP0[1]);
-    }
-    else
-      t = (v0 - _SP0[1]) / (_EP0[1] - _SP0[1]);
-  }
-  else {
-    if ((std::abs(_SP0[0]-_EP0[0])<1.e-12) && 
-	(_patch0->IsUPeriodic())) {
-      t = (u0 - _SP0[0] > 0 ? u0 - _SP0[0] : 1. + u0 - _SP0[0]);
-    }
-    else
-      t = (u0 - _SP0[0]) / (_EP0[0] - _SP0[0]);
-  }
-  
-  if ((t < 0.) || (t > 1.))
-    return false;
-  else
-    return true;
-}
-
-double IntersectionCurve::GetPou(double t)
-{
-  return 1.;
-}
-
-void IntersectionCurve::Dfdt(double t, double &x, double &y, double &z)
-{
-  double tPlus = t + _h;
-  double tMinus = t - _h;
-
-  double xPlus, yPlus, zPlus;
-  double xMinus, yMinus, zMinus;
-
-  if (tPlus > 1.) {
-    F(t,xPlus,yPlus,zPlus);
-    F(tMinus,xMinus,yMinus,zMinus);
-    x = (xPlus - xMinus) / _h;
-    y = (yPlus - yMinus) / _h;
-    z = (zPlus - zMinus) / _h;
-  }
-  else if (tMinus < 0.) {
-    F(tPlus,xPlus,yPlus,zPlus);
-    F(t,xMinus,yMinus,zMinus);
-    x = (xPlus - xMinus) / _h;
-    y = (yPlus - yMinus) / _h;
-    z = (zPlus - zMinus) / _h;
-  }
-  else {
-    F(tPlus,xPlus,yPlus,zPlus);
-    F(tMinus,xMinus,yMinus,zMinus);
-    x = 0.5 * (xPlus - xMinus) / _h;
-    y = 0.5 * (yPlus - yMinus) / _h;
-    z = 0.5 * (zPlus - zMinus) / _h;
-  }
-}
-
-void IntersectionCurve::Dfdfdtdt(double t, double &x, double &y, double &z)
-{
-  double tPlus = t + _h;
-  double tMinus = t - _h;
-
-  double xPlus, yPlus, zPlus;
-  double xMinus, yMinus, zMinus;
-
-  if (tPlus > 1.) {
-    Dfdt(t,xPlus,yPlus,zPlus);
-    Dfdt(tMinus,xMinus,yMinus,zMinus);
-    x = (xPlus - xMinus) / _h;
-    y = (yPlus - yMinus) / _h;
-    z = (zPlus - zMinus) / _h;
-  }
-  else if (tMinus < 0.) {
-    Dfdt(tPlus,xPlus,yPlus,zPlus);
-    Dfdt(t,xMinus,yMinus,zMinus);
-    x = (xPlus - xMinus) / _h;
-    y = (yPlus - yMinus) / _h;
-    z = (zPlus - zMinus) / _h;
-  }
-  else {
-    Dfdt(tPlus,xPlus,yPlus,zPlus);
-    Dfdt(tMinus,xMinus,yMinus,zMinus);
-    x = 0.5 * (xPlus - xMinus) / _h;
-    y = 0.5 * (yPlus - yMinus) / _h;
-    z = 0.5 * (zPlus - zMinus) / _h;
-  }
-}
diff --git a/contrib/FourierModel/IntersectionCurve.h b/contrib/FourierModel/IntersectionCurve.h
deleted file mode 100644
index b091d05956..0000000000
--- a/contrib/FourierModel/IntersectionCurve.h
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef _INTERSECTION_CURVE_H_
-#define _INTERSECTION_CURVE_H_
-
-#include "Curve.h"
-#include "Patch.h"
-#include "FM_Info.h"
-
-namespace FM {
-
-// The base class for the patches
-class IntersectionCurve : public Curve {
- private:
-  int _along;
-  double _h, _tol;
- protected:
-  // Patches
-  Patch* _patch0;
-  Patch* _patch1;
-  // End Points
-  double _SP0[2],_EP0[2];
-  double _SP1[2],_EP1[2];
-
- public:
-  // Intersection Information
-  IntersectionInfo* _II;
-  IntersectionCurve(IntersectionInfo* II, std::vector<Patch*> patches);
-  virtual ~IntersectionCurve() {}
-
-  // These are the virtual functions that must be provided by all
-  // derived patches: GetPou() returns the original smooth
-  // (non-normalized) cutoff on the patch; F() and Inverse() implement
-  // the mapping f: (t)->(x,y,z) and its inverse; and the Df*() and Dn*()
-  // functions return the derivatives of the mapping f and unit normal n 
-  // with respect to u and v
-  virtual double GetPou(double t);
-  virtual void F(double t, double &x, double &y, double &z);
-  virtual bool Inverse(double x,double y,double z,double &t);
-  virtual void Dfdt(double t, double &x, double &y, double &z);
-  virtual void Dfdfdtdt(double t, double &x, double &y, double &z);
-};
-
-}
-
-#endif
diff --git a/contrib/FourierModel/Main.cpp b/contrib/FourierModel/Main.cpp
deleted file mode 100644
index 1dc9e6185a..0000000000
--- a/contrib/FourierModel/Main.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-#include <cstring>
-#include <iostream>
-#include "Utils.h"
-#include "Message.h"
-#include "FM_Reader.h"
-
-int main(int argc, char *argv[])
-{
-  char* fn;
-  char continuation[16] = "continuation";
-
-  if (argc == 1) {
-    Msg::Info("Reading from default file : untitled.fm");
-    fn = "untitled.fm";
-  }
-  else
-    fn = argv[1];
-
-  FM_Reader reader(fn);
-
-  /*
-  
-  int n1=64;
-  int n2=64;
-  double h1 = 1./(n1-1);
-  double h2 = 1./(n2-1);
-  for (int j=0;j<n1;j++) {
-    for (int k=0;k<n2;k++) {
-      double u = j*h1;
-      double v = k*h2;
-      double x, y, z;
-      patches[0]->F(u,v,x,y,z);
-      printf("x(%d,%d) = %g; y(%d,%d) = %g; z(%d,%d) = %g;\n",
-	     j+1,k+1,x,j+1,k+1,y,j+1,k+1,z);
-    }
-  } 
-  
-  for (int i=0;i<reader.GetNumIntersections();i++) {
-    int n=128;
-    double h = 1./(n-1);
-    for (int j=0;j<n;j++) {
-      double t = j*h;
-      double x, y, z;
-      reader.GetIntersection(i)->F(t,x,y,z);
-      printf("x(%d,%d) = %g; y(%d,%d) = %g; z(%d,%d) = %g;\n",
-	     i+1,j+1,x,i+1,j+1,y,i+1,j+1,z);
-    }
-  }
-
-  for (int i=0;i<reader.GetNumPatches();i++) {
-    std::cout << reader.GetPatchList()[i]->tag << "\n";
-    std::cout << reader.GetPatchList()[i]->type << "\n";
-    std::cout << reader.GetPatchList()[i]->projection << "\n";
-    std::cout << reader.GetPatchList()[i]->normal[0] << " " << 
-      reader.GetPatchList()[i]->normal[1] << " " << 
-      reader.GetPatchList()[i]->normal[2] << "\n";
-    std::cout << reader.GetPatchList()[i]->origin[0] << " " <<
-      reader.GetPatchList()[i]->origin[1] << " " <<
-      reader.GetPatchList()[i]->origin[2] << "\n";
-    std::cout << reader.GetPatchList()[i]->tangent[0] << " " <<
-      reader.GetPatchList()[i]->tangent[1] << " " <<
-      reader.GetPatchList()[i]->tangent[2] << "\n";
-    if (!strcmp(reader.GetPatchList()[i]->type,continuation)) {
-      std::cout << reader.GetPatchList()[i]->periodic[0] << " " <<
-      reader.GetPatchList()[i]->periodic[1] << "\n";
-      std::cout << reader.GetPatchList()[i]->nModes[0] << " " <<
-      reader.GetPatchList()[i]->nModes[1] << "\n";
-      for (int j=0;j<reader.GetPatchList()[i]->nModes[0];j++)
-	for (int k=0;k<reader.GetPatchList()[i]->nModes[1];k++)
-	  std::cout << reader.GetPatchList()[i]->coeff[j][k].real() << " " <<
-	    reader.GetPatchList()[i]->coeff[j][k].imag() << "\n";
-    }
-  }
-  
-  for (int i=0;i<reader.GetIntersectionList().size();i++) {
-    std::cout << reader.GetIntersectionList()[i]->tag << "\n";
-    std::cout << reader.GetIntersectionList()[i]->SP[0] <<
-      " " << reader.GetIntersectionList()[i]->SP[1] << " " <<
-	      reader.GetIntersectionList()[i]->SP[2] << "\n";
-    std::cout << reader.GetIntersectionList()[i]->EP[0] <<
-      " " << reader.GetIntersectionList()[i]->EP[1] << " " <<
-      reader.GetIntersectionList()[i]->EP[2] << "\n";
-    std::cout << reader.GetIntersectionList()[i]->
-      intersectingPatches[0].patchTag << "\n";
-    std::cout << reader.GetIntersectionList()[i]->
-      intersectingPatches[1].patchTag << "\n";
-  }
-  */
-
-  int nU=64;
-  int nV=64;
-
-  std::vector<int> color(3);
-  color[0] = 0; color[1] = 0; color[2] = 1;
-  
-  std::vector<std::vector<double> > x(nU,std::vector<double>(nV));
-  std::vector<std::vector<double> > y(nU,std::vector<double>(nV));
-  std::vector<std::vector<double> > z(nU,std::vector<double>(nV));
-
-  std::vector<std::vector<int> > mask = ones(nU,nV);
-
-  for (int i=0;i<reader.GetNumFaces();i++) {
-    double hU = 1./(nU-1);
-    double hV = 1./(nV-1);
-    for (int j=0;j<nU;j++) {
-      for (int k=0;k<nV;k++) {
-	double u = j*hU;
-	double v = k*hV;
-	reader.GetFace(i)->F(u,v,x[j][k],y[j][k],z[j][k]);
-      }
-    }
-    if (i == 0)
-      plotSceneViewer(0,"snc.iv",color,x,y,z,nU,nV,mask);
-    else
-      plotSceneViewer(1,"snc.iv",color,x,y,z,nU,nV,mask);
-  }
-}
diff --git a/contrib/FourierModel/Makefile b/contrib/FourierModel/Makefile
deleted file mode 100644
index f8888acbfc..0000000000
--- a/contrib/FourierModel/Makefile
+++ /dev/null
@@ -1,91 +0,0 @@
-include ../../variables
-
-LIB = ../../lib/libGmshFourierModel.a
-
-CFLAGS = ${OPTIM} ${FLAGS}
-
-SRC = ProjectionSurface.cpp \
-	PlaneProjectionSurface.cpp \
-	ParaboloidProjectionSurface.cpp \
-	CylindricalProjectionSurface.cpp \
-	RevolvedParabolaProjectionSurface.cpp \
-      Patch.cpp \
-	FPatch.cpp \
-	ContinuationPatch.cpp \
-	ExactPatch.cpp\
-      Curve.cpp \
-	FCurve.cpp\
-	IntersectionCurve.cpp \
-      BlendedPatch.cpp \
-      BlendOperator.cpp \
-      FM_Edge.cpp\
-      FM_Face.cpp\
-      FM_Info.cpp\
-      FM_Reader.cpp\
-      FM_Vertex.cpp\
-      Message.cpp \
-      Utils.cpp \
-      PartitionOfUnity.cpp
-
-OBJ = ${SRC:.cpp=.o}
-
-.SUFFIXES: .o .cpp
-
-${LIB}: ${OBJ}
-	${AR} ${LIB} ${OBJ}
-	${RANLIB} ${LIB}
-
-.cpp.o:
-	${CXX} ${CFLAGS} -c $<
-
-clean:
-	rm -f *.o
-
-depend:
-	(sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \
-	${CXX} -MM ${CFLAGS} ${SRC} \
-	) >Makefile.new
-	cp Makefile Makefile.bak
-	cp Makefile.new Makefile
-	rm -f Makefile.new
-
-# DO NOT DELETE THIS LINE
-ProjectionSurface.o: ProjectionSurface.cpp ProjectionSurface.h
-PlaneProjectionSurface.o: PlaneProjectionSurface.cpp \
-  PlaneProjectionSurface.h ProjectionSurface.h
-ParaboloidProjectionSurface.o: ParaboloidProjectionSurface.cpp \
-  ParaboloidProjectionSurface.h Utils.h ProjectionSurface.h
-CylindricalProjectionSurface.o: CylindricalProjectionSurface.cpp \
-  CylindricalProjectionSurface.h ProjectionSurface.h
-RevolvedParabolaProjectionSurface.o:  \
- RevolvedParabolaProjectionSurface.cpp \
-  RevolvedParabolaProjectionSurface.h Utils.h ProjectionSurface.h
-Patch.o: Patch.cpp Patch.h ProjectionSurface.h
-FPatch.o: FPatch.cpp Message.h FPatch.h Patch.h ProjectionSurface.h \
-  PartitionOfUnity.h
-ContinuationPatch.o: ContinuationPatch.cpp Message.h ContinuationPatch.h \
-  Patch.h ProjectionSurface.h FM_Info.h PartitionOfUnity.h
-ExactPatch.o: ExactPatch.cpp Message.h ExactPatch.h Patch.h \
-  ProjectionSurface.h FM_Info.h
-Curve.o: Curve.cpp Curve.h
-FCurve.o: FCurve.cpp FCurve.h Curve.h Patch.h ProjectionSurface.h
-IntersectionCurve.o: IntersectionCurve.cpp Message.h IntersectionCurve.h \
-  Curve.h Patch.h ProjectionSurface.h FM_Info.h
-BlendedPatch.o: BlendedPatch.cpp BlendedPatch.h Message.h Patch.h \
-  ProjectionSurface.h BlendOperator.h FM_Info.h PartitionOfUnity.h
-BlendOperator.o: BlendOperator.cpp BlendOperator.h FM_Info.h Patch.h \
-  ProjectionSurface.h
-FM_Edge.o: FM_Edge.cpp FM_Edge.h Curve.h FM_Vertex.h Message.h
-FM_Face.o: FM_Face.cpp FM_Face.h Patch.h ProjectionSurface.h FM_Edge.h \
-  Curve.h FM_Vertex.h Message.h
-FM_Info.o: FM_Info.cpp FM_Info.h
-FM_Reader.o: FM_Reader.cpp Message.h FM_Reader.h Curve.h \
-  IntersectionCurve.h Patch.h ProjectionSurface.h FM_Info.h ExactPatch.h \
-  ContinuationPatch.h PartitionOfUnity.h PlaneProjectionSurface.h \
-  CylindricalProjectionSurface.h ParaboloidProjectionSurface.h Utils.h \
-  RevolvedParabolaProjectionSurface.h FM_Face.h FM_Edge.h FM_Vertex.h \
-  BlendOperator.h BlendedPatch.h
-FM_Vertex.o: FM_Vertex.cpp
-Message.o: Message.cpp Message.h
-Utils.o: Utils.cpp Utils.h Message.h
-PartitionOfUnity.o: PartitionOfUnity.cpp PartitionOfUnity.h
diff --git a/contrib/FourierModel/Message.cpp b/contrib/FourierModel/Message.cpp
deleted file mode 100644
index 945ce213bf..0000000000
--- a/contrib/FourierModel/Message.cpp
+++ /dev/null
@@ -1,163 +0,0 @@
-#include <stdlib.h>
-#include <stdio.h>
-
-#if !defined(WIN32) || defined(__CYGWIN__)
-#include <sys/time.h>
-#include <sys/resource.h>
-#endif
-
-#if defined(__APPLE__)
-#define RUSAGE_SELF      0
-#define RUSAGE_CHILDREN -1
-#endif
-
-#include "Message.h"
-
-using namespace FM;
-
-int Message::_commRank = 0;
-int Message::_commSize = 1;
-int Message::_verbosity = 3;
-int Message::_progressMeterStep = 10;
-int Message::_progressMeterCurrent = 0;
-
-void Message::Fatal(char *fmt, ...)
-{
-  va_list args;
-  va_start(args, fmt);
-  if(_commSize > 1) 
-    fprintf(stderr, "Fatal   : [On processor %d] ", _commRank);
-  else
-    fprintf(stderr, "Fatal   : ");
-  vfprintf(stderr, fmt, args);
-  fprintf(stderr, "\n");
-  va_end(args);
-  exit(1);
-}
-
-void Message::Error(char *fmt, ...)
-{
-  va_list args;
-  va_start(args, fmt);
-  if(_commSize > 1) 
-    fprintf(stderr, "Error   : [On processor %d] ", _commRank);
-  else
-    fprintf(stderr, "Error   : ");
-  vfprintf(stderr, fmt, args);
-  fprintf(stderr, "\n");
-  va_end(args);
-}
-
-void Message::Warning(char *fmt, ...)
-{
-  if(_commRank) return;
-  if(_verbosity >= 1){
-    va_list args;
-    va_start(args, fmt);
-    fprintf(stderr, "Warning : ");
-    vfprintf(stderr, fmt, args);
-    fprintf(stderr, "\n");
-    va_end(args);
-  }
-}
-
-void Message::Info(char *fmt, ...)
-{
-  if(_commRank) return;
-  if(_verbosity >= 2){
-    va_list args;
-    va_start(args, fmt);
-    fprintf(stderr, "Info    : ");
-    vfprintf(stderr, fmt, args);
-    fprintf(stderr, "\n");
-    va_end(args);
-  }
-}
-
-void Message::Debug(char *fmt, ...)
-{
-  if(_commRank) return;
-  if(_verbosity >= 99){
-    va_list args;
-    va_start(args, fmt);
-    fprintf(stderr, "Debug   : ");
-    vfprintf(stderr, fmt, args);
-    fprintf(stderr, "\n");
-    va_end(args);
-  }
-}
-
-void Message::Cpu(char *fmt, ...)
-{
-#if !defined(WIN32) || defined(__CYGWIN__)
-  if(_commRank) return;
-  if(_verbosity >= 1){
-    static struct rusage r;
-    getrusage(RUSAGE_SELF, &r);
-    double s = (double)r.ru_utime.tv_sec;
-    double us = (double)r.ru_utime.tv_usec;
-    double mem = (double)r.ru_maxrss;
-    va_list args;
-    va_start(args, fmt);
-    fprintf(stderr, "Info    : ");
-    vfprintf(stderr, fmt, args);
-    if(mem)
-      fprintf(stderr, " (CPU = %gs Mem = %gkb)\n", s + 1.e-6 * us, mem);
-    else
-      fprintf(stderr, " (CPU = %gs)\n", s + 1.e-6 * us);
-    va_end(args);
-  }
-#endif
-}
-
-void Message::ResetProgressMeter(int step)
-{
-  _progressMeterStep = step;
-  _progressMeterCurrent = 0;
-}
-
-void Message::ProgressMeter(int n, int N, char *fmt, ...)
-{
-  if(_commRank) return;
-  if(_verbosity >= 2){
-    va_list args;
-    va_start(args, fmt);
-    if(100. * (double)n/(double)N >= _progressMeterCurrent){
-      vfprintf(stderr, fmt, args);
-      fprintf(stderr, "(%d %%)                     \r", _progressMeterCurrent);
-      _progressMeterCurrent += _progressMeterStep;
-    }
-    if(n >= N - 1)
-      fprintf(stderr, "Done!                                              \r");
-  }
-}
-
-void Message::ProgressMeter(int n, int N)
-{
-  if(_commRank) return;
-  if(_verbosity >= 2){
-    if(100. * (double)n/(double)N >= _progressMeterCurrent){
-      fprintf(stderr, "(%d %%)\r", _progressMeterCurrent);
-      _progressMeterCurrent += _progressMeterStep;
-    }
-    if(n >= N - 1)
-      fprintf(stderr, "          \r") ;
-  }
-}
-
-#if defined(HAVE_PETSC)
-
-#include "petsc.h"
-
-void Message::Barrier()
-{
-  MPI_Barrier(PETSC_COMM_WORLD);
-}
-
-#else
-
-void Message::Barrier()
-{
-}
-
-#endif
diff --git a/contrib/FourierModel/Message.h b/contrib/FourierModel/Message.h
deleted file mode 100644
index 1fd9de2cf2..0000000000
--- a/contrib/FourierModel/Message.h
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef _MESSAGE_H_
-#define _MESSAGE_H_
-
-#include <stdarg.h>
-
-namespace FM {
-
-// a class to manage messages
-class Message {
- private:
-  // current cpu number and total number of cpus
-  static int _commRank, _commSize;
-  // verbosity level
-  static int _verbosity;
-  // step (in %) of the progress meter and current progress %
-  static int _progressMeterStep, _progressMeterCurrent;
- public:
-  Message() {}
-  static int GetCommRank(){ return _commRank; }
-  static int GetCommSize(){ return _commSize; }
-  static void SetCommRank(int val){ _commRank = val; }
-  static void SetCommSize(int val){ _commSize = val; }
-  static void Barrier();
-  static void SetVerbosity(int val){ _verbosity = val; }
-  static void Fatal(char *fmt, ...);
-  static void Error(char *fmt, ...);
-  static void Warning(char *fmt, ...);
-  static void Info(char *fmt, ...);
-  static void Debug(char *fmt, ...);
-  static void Cpu(char *fmt, ...);
-  static void ProgressMeter(int n, int N);
-  static void ProgressMeter(int n, int N, char *fmt, ...);
-  static void ResetProgressMeter(int step=10);
-};
-
-typedef Message Msg;
-
-}
-
-#endif
diff --git a/contrib/FourierModel/ParaboloidProjectionSurface.cpp b/contrib/FourierModel/ParaboloidProjectionSurface.cpp
deleted file mode 100755
index 52830b97e2..0000000000
--- a/contrib/FourierModel/ParaboloidProjectionSurface.cpp
+++ /dev/null
@@ -1,209 +0,0 @@
-#include "ParaboloidProjectionSurface.h"
-
-using namespace FM;
-
-ParaboloidProjectionSurface::ParaboloidProjectionSurface
-(int tag) : ProjectionSurface() 
-{
-  SetTag(tag);
-  SetName(std::string("paraboloid"));
-
-  numParameters_ = 0;
-
-  O_[0] = O_[1] = O_[2] = 0.;
-
-  E0_[0] = 0.; E0_[1] = 0.; E0_[2] = 1.;
-  E1_[0] = 1.; E1_[1] = 0.; E1_[2] = 0.;
-  E2_[0] = 0.; E2_[1] = 1.; E2_[2] = 0.;
-
-  scale_[0] = scale_[1] = scale_[2] = 1.;
-}
-
-ParaboloidProjectionSurface::ParaboloidProjectionSurface
-(int tag, double O[3], double E0[3], double E1[3], double scale[3]) 
-  : ProjectionSurface() 
-{
-  SetTag(tag);
-  SetName(std::string("Paraboloid"));
-
-  O_[0] = O[0]; O_[1] = O[1]; O_[2] = O[2];
-
-  E0_[0] = E0[0]; E0_[1] = E0[1]; E0_[2] = E0[2];
-  E1_[0] = E1[0]; E1_[1] = E1[1]; E1_[2] = E1[2];
-
-  E2_[0] = E0_[1] * E1_[2] - E0_[2] * E1_[1];
-  E2_[1] = E0_[2] * E1_[0] - E0_[0] * E1_[2];
-  E2_[2] = E0_[0] * E1_[1] - E0_[1] * E1_[0]; 
-
-  scale_[0] = scale[0]; scale_[1] = scale[1]; scale_[2] = scale[2];
-}
-
-void ParaboloidProjectionSurface::F
-(double u, double v, double &x, double &y, double &z)
-{
-  x = O_[0] + (u - 0.5) * scale_[1] * E1_[0] + (v - 0.5) * scale_[2] * E2_[0] +
-    ((u - 0.5) * scale_[1] * (u - 0.5) * scale_[1] +
-     (v - 0.5) * scale_[2] * (v - 0.5) * scale_[2]) * scale_[0] * E0_[0];
-  y = O_[1] + (u - 0.5) * scale_[1] * E1_[1] + (v - 0.5) * scale_[2] * E2_[1] +
-    ((u - 0.5) * scale_[1] * (u - 0.5) * scale_[1] +
-     (v - 0.5) * scale_[2] * (v - 0.5) * scale_[2]) * scale_[0] * E0_[1];
-  z = O_[2] + (u - 0.5) * scale_[1] * E1_[2] + (v - 0.5) * scale_[2] * E2_[2] +
-    ((u - 0.5) * scale_[1] * (u - 0.5) * scale_[1] +
-     (v - 0.5) * scale_[2] * (v - 0.5) * scale_[2]) * scale_[0] * E0_[2];
-}
-
-bool ParaboloidProjectionSurface::Inverse
-(double x, double y, double z, double &u,double &v)
-{
-  double R[3];
-  R[0] = x - O_[0];
-  R[1] = y - O_[1];
-  R[2] = z - O_[2];
-
-  double RdotT = 0., RdotNcT = 0.;
-  for (int i=0;i<3;i++) {
-    RdotT += R[i] * E1_[i];
-    RdotNcT += R[i] * E2_[i];
-  }
-
-  RdotT /= scale_[1];
-  RdotNcT /= scale_[2];
-
-  u = RdotT + 0.5;
-  v = RdotNcT + 0.5;
-}
-
-void ParaboloidProjectionSurface::Dfdu
-(double u, double v, double &x, double &y, double &z)
-{
-  x = scale_[1] * E1_[0] + 
-    2 * scale_[0] * scale_[1] * scale_[1] * (u - 0.5) * E0_[0];
-  y = scale_[1] * E1_[1] + 
-    2 * scale_[0] * scale_[1] * scale_[1] * (u - 0.5) * E0_[1];
-  z = scale_[1] * E1_[2] + 
-    2 * scale_[0] * scale_[1] * scale_[1] * (u - 0.5) * E0_[2];
-}
-
-void ParaboloidProjectionSurface::Dfdv
-(double u, double v, double &x, double &y, double &z)
-{
-  x = scale_[2] * E2_[0] + 2 * scale_[0] * scale_[2] * (v - 0.5) * E0_[0];
-  y = scale_[2] * E2_[1] + 2 * scale_[0] * scale_[2] * (v - 0.5) * E0_[1];
-  z = scale_[2] * E2_[2] + 2 * scale_[0] * scale_[2] * (v - 0.5) * E0_[2];
-}
-
-void ParaboloidProjectionSurface::Dfdfdudu
-(double u,double v, double &x, double &y, double &z)
-{
-  x = 2 * scale_[0] * scale_[1] * E0_[0];
-  y = 2 * scale_[0] * scale_[1] * E0_[1];
-  z = 2 * scale_[0] * scale_[1] * E0_[2];
-}
-
-void ParaboloidProjectionSurface::Dfdfdudv
-(double u, double v, double &x, double &y, double &z)
-{
-  x = y = z = 0.;
-}
-
-void ParaboloidProjectionSurface::Dfdfdvdv
-(double u, double v, double &x, double &y, double &z)
-{
-  x = 2. * scale_[0] * scale_[2] * E0_[0];
-  y = 2. * scale_[0] * scale_[2] * E0_[1];
-  z = 2. * scale_[0] * scale_[2] * E0_[2];
-}
-
-void ParaboloidProjectionSurface::Dfdfdfdududu
-(double u,double v,double &x,double &y,double &z)
-{
-  x = y = z = 0.;
-}
-
-void ParaboloidProjectionSurface::Dfdfdfdududv
-(double u,double v,double &x,double &y,double &z)
-{
-  x = y = z = 0.;
-}
-
-void ParaboloidProjectionSurface::Dfdfdfdudvdv
-(double u,double v,double &x,double &y,double &z)
-{
-  x = y = z = 0.;
-}
-
-void ParaboloidProjectionSurface::Dfdfdfdvdvdv
-(double u,double v,double &x,double &y,double &z)
-{
-  x = y = z = 0.;
-}
-
-bool ParaboloidProjectionSurface::OrthoProjectionOnSurface
-(double x, double y, double z, double& u, double& v)
-{
-  double R[3];
-  R[0] = x - O_[0];
-  R[1] = y - O_[1];
-  R[2] = z - O_[2];
-
-  double x0 = 0., y0 = 0., z0 = 0.;
-  for (int i=0;i<3;i++) {
-    x0 += R[i] * E1_[i];
-    y0 += R[i] * E2_[i];
-    z0 += R[i] * E0_[i];
-  }
-
-  z0 /= scale_[0];
-
-  double a = 4.;
-  double b = 4. * (1. + z0);
-  double c = 1 + 4. * z0;
-  double d = z0 - x0 * x0 - y0 * y0;
-
-  std::vector<double> root = SolveCubic(a,b,c,d);
-
-  if (root.size()) {
-    double xP,yP,zP;
-    double minDist = 1.e12;
-    double minRoot;
-    for (int i=0;i<root.size();i++) {
-      xP = x0 / (2 * root[i] + 1.);
-      yP = y0 / (2 * root[i] + 1.);
-      zP = z0 + root[i];
-      double dist = sqrt((x0-xP)*(x0-xP)+(y0-yP)*(y0-yP)+(z0-zP)*(z0-zP));
-      if (dist < minDist) {
-        minDist = dist;
-        minRoot = root[i];
-      }
-    }
-    xP = x0 / (2 * minRoot + 1.);
-    yP = y0 / (2 * minRoot + 1.);
-    zP = z0 + minRoot;
-    u = xP / scale_[1] + 0.5;
-    v = yP / scale_[2] + 0.5;
-    double tol =1.e-4;
-    if ((u > - tol) && (u < 1. + tol) && (v > - tol) && (v < 1. + tol))
-      return true;
-    else
-      return false;
-  }
-  else
-    return false;
-}
-
-void ParaboloidProjectionSurface::
-SetParameter(int i, double x)
-{
-}
-
-double ParaboloidProjectionSurface::
-GetParameter(int i)
-{
-  return 0.;
-}
-
-std::string ParaboloidProjectionSurface::
-GetLabel(int i)
-{
-  return std::string(" ");
-}
diff --git a/contrib/FourierModel/ParaboloidProjectionSurface.h b/contrib/FourierModel/ParaboloidProjectionSurface.h
deleted file mode 100755
index 92c13ce1cb..0000000000
--- a/contrib/FourierModel/ParaboloidProjectionSurface.h
+++ /dev/null
@@ -1,66 +0,0 @@
-#ifndef _PARABOLOID_PROJECTION_SURFACE_H_
-#define _PARABOLOID_PROJECTION_SURFACE_H_
-
-#include <cmath>
-#include <vector>
-#include "Utils.h"
-#include "ProjectionSurface.h"
-
-namespace FM {
-
-class ParaboloidProjectionSurface : public ProjectionSurface {
- public:
-  ParaboloidProjectionSurface
-    (int tag);
-  ParaboloidProjectionSurface
-    (int tag, double O[3], double E0[3], double E1[3], double scale[3]);
-  ParaboloidProjectionSurface(ParaboloidProjectionSurface *ps) 
-    : ProjectionSurface(ps) 
-  {
-  }
-
-  virtual ~ParaboloidProjectionSurface
-    () {}
-
-  virtual ProjectionSurface *clone()
-  {
-    return new ParaboloidProjectionSurface(this);
-  }
-
-  // Abstract methods of ProjectionSurface
-
-  virtual void F
-    (double u, double v, double &x, double &y, double &z);
-  virtual bool Inverse
-    (double x,double y,double z,double &u,double &v);
-  virtual void Dfdu
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dfdv
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dfdfdudu
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdudv
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdvdv
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdfdududu
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdfdududv
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdfdudvdv
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdfdvdvdv
-    (double u,double v,double &x,double &y,double &z);
-  virtual bool OrthoProjectionOnSurface
-    (double x, double y, double z, double &u,double &v);
-  virtual void SetParameter
-    (int i, double x);
-  virtual double GetParameter
-    (int i);
-  virtual std::string GetLabel
-    (int i);
-};
-
-}
-
-#endif
diff --git a/contrib/FourierModel/PartitionOfUnity.cpp b/contrib/FourierModel/PartitionOfUnity.cpp
deleted file mode 100755
index 13e079a5c6..0000000000
--- a/contrib/FourierModel/PartitionOfUnity.cpp
+++ /dev/null
@@ -1 +0,0 @@
-#include "PartitionOfUnity.h"
diff --git a/contrib/FourierModel/PartitionOfUnity.h b/contrib/FourierModel/PartitionOfUnity.h
deleted file mode 100755
index edb081e595..0000000000
--- a/contrib/FourierModel/PartitionOfUnity.h
+++ /dev/null
@@ -1,140 +0,0 @@
-#ifndef _PARTITION_OF_UNITY_H_
-#define _PARTITION_OF_UNITY_H_
-
-#include <cmath>
-
-namespace FM {
-
-inline double OneSidedPartitionOfUnity(double t0,
-				       double t1,
-				       double t)
-{
-  if (t <= t0) {
-    return 1.;
-  }
-  else if (t >= t1) {
-    return 0.;
-  } 
-  else {
-    double x = (t - t0) / (t1 - t0);
-    return exp(2.560851702 * exp(-1. / x) / (x - 1.));
-  }
-}
-
-inline double OneSidedPartitionOfUnityDt(double t0,
-					 double t1,
-					 double t)
-{
-  if (t <= t0) {
-    return 0.;
-  }
-  else if (t >= t1) {
-    return 0.;
-  } 
-  else {
-    // From Maple
-    return (0.2560851702e1 * pow(t - t0, -0.2e1) * (t1 - t0) * 
-	    exp(-0.10e1 / (t - t0) * (t1 - t0)) / ((t - t0) / (t1 - t0) - 0.10e1) - 
-	    0.2560851702e1 * exp(-0.10e1 / (t - t0) * (t1 - t0)) * 
-	    pow((t - t0) / (t1 - t0) - 0.10e1, -0.2e1) / (t1 - t0)) * 
-      exp(0.2560851702e1 * exp(-0.10e1 / (t - t0) * (t1 - t0)) / 
-	  ((t - t0) / (t1 - t0) - 0.10e1));
-  }
-}
-
-inline double OneSidedPartitionOfUnityDtDt(double t0,
-					   double t1,
-					   double t)
-{
-  if (t <= t0) {
-    return 0.;
-  }
-  else if (t >= t1) {
-    return 0.;
-  } 
-  else {
-    // From Maple
-    return ((-0.5121703404E1/pow(-t0+t,3.0)*(t1-t0)*exp(-0.1E1/(-t0+t)*(t1-t0))/
-	     ((-t0+t)/(t1-t0)-0.1E1)+0.2560851702E1/pow(-t0+t,4.0)*pow(t1-t0,2.0)*
-	     exp(-0.1E1/(-t0+t)*(t1-t0))/((-t0+t)/(t1-t0)-0.1E1)-0.5121703404E1/pow(-t0+t,2.0)*
-	     exp(-0.1E1/(-t0+t)*(t1-t0))/pow((-t0+t)/(t1-t0)-0.1E1,2.0)+0.5121703404E1*
-	     exp(-0.1E1/(-t0+t)*(t1-t0))/pow((-t0+t)/(t1-t0)-0.1E1,3.0)/pow(t1-t0,2.0))*
-	    exp(0.2560851702E1*exp(-0.1E1/(-t0+t)*(t1-t0))/((-t0+t)/(t1-t0)-0.1E1))+
-	    pow(0.2560851702E1/pow(-t0+t,2.0)*(t1-t0)*
-		exp(-0.1E1/(-t0+t)*(t1-t0))/((-t0+t)/(t1-t0)-0.1E1)-0.2560851702E1*
-		exp(-0.1E1/(-t0+t)*(t1-t0))/pow((-t0+t)/(t1-t0)-0.1E1,2.0)/(t1-t0),2.0)*
-	    exp(0.2560851702E1*exp(-0.1E1/(-t0+t)*(t1-t0))/((-t0+t)/(t1-t0)-0.1E1)));
-  }
-}
-
-// and we get the two sided POU by multiplying two One sided POUs
-inline double PartitionOfUnityInternalCall(double r,
-					   double start1, double end1,
-					   double end2, double start2)
-{
-  double leftPart = 1. - OneSidedPartitionOfUnity(start1, end1, r);
-  double rightPart = OneSidedPartitionOfUnity(end2, start2, r);
-  return leftPart * rightPart;
-}
-
-// and we get derivative of the the two sided POU by adding two One sided POUs
-inline double PartitionOfUnityDtInternalCall(double r,
-					     double start1, double end1,
-					     double end2, double start2)
-{
-  double leftPart = 1. - OneSidedPartitionOfUnity(start1, end1, r);
-  double rightPart = OneSidedPartitionOfUnity(end2, start2, r);
-  double leftPartDt = OneSidedPartitionOfUnityDt(start1, end1, r);
-  double rightPartDt = OneSidedPartitionOfUnityDt(end2, start2, r);
-  return leftPart * rightPartDt - rightPart * leftPartDt;
-}
-
-// and we get derivative of the the two sided POU by adding two One sided POUs
-inline double PartitionOfUnityDtDtInternalCall(double r,
-					       double start1, double end1,
-					       double end2, double start2)
-{
-  double leftPart = 1. - OneSidedPartitionOfUnity(start1, end1, r);
-  double rightPart = OneSidedPartitionOfUnity(end2, start2, r);
-  double leftPartDt = OneSidedPartitionOfUnityDt(start1, end1, r);
-  double rightPartDt = OneSidedPartitionOfUnityDt(end2, start2, r);
-  double leftPartDtDt = OneSidedPartitionOfUnityDtDt(start1, end1, r);
-  double rightPartDtDt = OneSidedPartitionOfUnityDtDt(end2, start2, r);
-
-  return leftPartDt * rightPartDt + leftPart * rightPartDtDt -
-    (rightPartDt * leftPartDt + rightPart * leftPartDtDt);
-}
-
-// Compute the value of a two sided partition of unity
-inline double PartitionOfUnity(double r,
-			       double start1, double end1,
-			       double end2, double start2)
-{
-  if(r < start1 || r > start2) { return 0.; }
-  if(r > end1 && r < end2) { return 1.; }
-  return PartitionOfUnityInternalCall(r, start1, end1, end2, start2);
-}
-
-// Compute the derivative of a two sided partition of unity
-inline double PartitionOfUnityDt(double r,
-				 double start1, double end1,
-				 double end2, double start2)
-{
-  if(r < start1 || r > start2) { return 0.; }
-  if(r > end1 && r < end2) { return 0.; }
-  return PartitionOfUnityDtInternalCall(r, start1, end1, end2, start2);
-}
-
-// Compute the second derivative of a two sided partition of unity
-inline double PartitionOfUnityDtDt(double r,
-				   double start1, double end1,
-				   double end2, double start2)
-{
-  if(r < start1 || r > start2) { return 0.; }
-  if(r > end1 && r < end2) { return 0.; }
-  return PartitionOfUnityDtDtInternalCall(r, start1, end1, end2, start2);
-}
-
-}
-
-#endif
diff --git a/contrib/FourierModel/Patch.cpp b/contrib/FourierModel/Patch.cpp
deleted file mode 100644
index cd5a0c03b0..0000000000
--- a/contrib/FourierModel/Patch.cpp
+++ /dev/null
@@ -1,85 +0,0 @@
-#include <cmath>
-#include "Patch.h"
-
-using namespace FM;
-
-Patch::Patch() :_ps(0), _uMin(0.), _uMax(1.), _vMin(0.), _vMax(1.),
-		_periodicityU(0), _periodicityV(0), _derivative(3), 
-		_tag(-1) {}
-
-void Patch::GetNormal(double u, double v, double &x, double &y, double &z)
-{
-  double dfdu[3], dfdv[3];
-  Dfdu(u, v, dfdu[0], dfdu[1], dfdu[2]);
-  Dfdv(u, v, dfdv[0], dfdv[1], dfdv[2]);
-  x = dfdu[1] * dfdv[2] - dfdu[2] * dfdv[1];
-  y = dfdu[2] * dfdv[0] - dfdu[0] * dfdv[2];
-  z = dfdu[0] * dfdv[1] - dfdu[1] * dfdv[0];
-}
-
-void Patch::GetUnitNormal(double u, double v, double &x, double &y, double &z)
-{
-  GetNormal(u, v, x, y, z);
-  double norm = sqrt(x * x + y * y + z * z);
-  if(norm > 0.) {
-    x /= norm;
-    y /= norm;
-    z /= norm;
-  }  
-}
-
-void Patch::Dndu(double u, double v, double &x, double &y, double &z) 
-{
-  double n[3],dfdu[3],dfdv[3],dfdfdudu[3],dfdfdudv[3],dfdfdvdv[3],dndu[3];
-  Dfdu(u, v, dfdu[0], dfdu[1], dfdu[2]);
-  Dfdv(u, v, dfdv[0], dfdv[1], dfdv[2]);
-  Dfdfdudu(u, v, dfdfdudu[0], dfdfdudu[1], dfdfdudu[2]);
-  Dfdfdudv(u, v, dfdfdudv[0], dfdfdudv[1], dfdfdudv[2]);
-  Dfdfdvdv(u, v, dfdfdvdv[0], dfdfdvdv[1], dfdfdvdv[2]);
-  GetNormal(u,v,n[0],n[1],n[2]);
-  double norm = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
-  double normSquared = norm * norm;
-  double normCubed = normSquared * norm;
-
-  dndu[0] = dfdfdudu[1] * dfdv[2] + dfdu[1] * dfdfdudv[2] - 
-    dfdfdudu[2] * dfdv[1] - dfdu[2] * dfdfdudv[1];
-  dndu[1] = dfdfdudu[2] * dfdv[0] + dfdu[2] * dfdfdudv[0] - 
-    dfdfdudu[0] * dfdv[2] - dfdu[0] * dfdfdudv[2];
-  dndu[2] = dfdfdudu[0] * dfdv[1] + dfdu[0] * dfdfdudv[1] - 
-    dfdfdudu[1] * dfdv[0] - dfdu[1] * dfdfdudv[0];
-
-  x = ((normSquared - n[0]*n[0])*dndu[0] - n[0]*n[1]*dndu[1] - 
-       n[0]*n[2]*dndu[2]) / normCubed;
-  y = ((normSquared - n[1]*n[1])*dndu[1] - n[1]*n[0]*dndu[0] -
-       n[1]*n[2]*dndu[2]) / normCubed;
-  z = ((normSquared - n[2]*n[2])*dndu[2] - n[2]*n[0]*dndu[0] -
-       n[2]*n[1]*dndu[1]) / normCubed;
-}
-
-void Patch::Dndv(double u, double v, double &x, double &y, double &z) 
-{
-  double n[3],dfdu[3],dfdv[3],dfdfdudu[3],dfdfdudv[3],dfdfdvdv[3],dndv[3];
-  Dfdu(u, v, dfdu[0], dfdu[1], dfdu[2]);
-  Dfdv(u, v, dfdv[0], dfdv[1], dfdv[2]);
-  Dfdfdudu(u, v, dfdfdudu[0], dfdfdudu[1], dfdfdudu[2]);
-  Dfdfdudv(u, v, dfdfdudv[0], dfdfdudv[1], dfdfdudv[2]);
-  Dfdfdvdv(u, v, dfdfdvdv[0], dfdfdvdv[1], dfdfdvdv[2]);
-  GetNormal(u,v,n[0],n[1],n[2]);
-  double norm = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
-  double normSquared = norm * norm;
-  double normCubed = normSquared * norm;
-
-  dndv[0] = dfdfdudv[1] * dfdv[2] + dfdu[1] * dfdfdvdv[2] -
-    dfdfdudv[2] * dfdv[1] - dfdu[2] * dfdfdvdv[1];
-  dndv[1] = dfdfdudv[2] * dfdv[0] + dfdu[2] * dfdfdvdv[0] -
-    dfdfdudv[0] * dfdv[2] - dfdu[0] * dfdfdvdv[2];
-  dndv[2] = dfdfdudv[0] * dfdv[1] + dfdu[0] * dfdfdvdv[1] -
-    dfdfdudv[1] * dfdv[0] - dfdu[1] * dfdfdvdv[0];
-
-  x = ((normSquared - n[0]*n[0])*dndv[0] - n[0]*n[1]*dndv[1] - 
-       n[0]*n[2]*dndv[2]) / normCubed;
-  y = ((normSquared - n[1]*n[1])*dndv[1] - n[1]*n[0]*dndv[0] -
-       n[1]*n[2]*dndv[2]) / normCubed;
-  z = ((normSquared - n[2]*n[2])*dndv[2] - n[2]*n[0]*dndv[0] -
-       n[2]*n[1]*dndv[1]) / normCubed;
-}
diff --git a/contrib/FourierModel/Patch.h b/contrib/FourierModel/Patch.h
deleted file mode 100644
index f428d514cc..0000000000
--- a/contrib/FourierModel/Patch.h
+++ /dev/null
@@ -1,120 +0,0 @@
-#ifndef _PATCH_H_
-#define _PATCH_H_
-
-#include <cmath>
-#include "ProjectionSurface.h"
-
-namespace FM {
-
-// The base class for the patches
-class Patch {
- protected:
-  // bitfield telling if we also interpolate the derivative(s)
-  int _tag;
-  int _derivative;
-  double _uMin, _uMax;
-  double _vMin, _vMax;
-  int _periodicityU, _periodicityV;
-  ProjectionSurface* _ps;
-  // Hard edges
-  int _hardEdge[4];
- public:
-  Patch();
-  virtual ~Patch() {}
-
-  inline int GetTag() { return _tag; }
-
-  inline double GetMinU() { return _uMin; }
-  inline double GetMaxU() { return _uMax; }
-  inline double GetMinV() { return _vMin; }
-  inline double GetMaxV() { return _vMax; }
-  inline void SetMinU(double uMin) { _uMin = uMin; }
-  inline void SetMaxU(double uMax) { _uMax = uMax; }
-  inline void SetMinV(double vMin) { _vMin = vMin; }
-  inline void SetMaxV(double vMax) { _vMax = vMax; }
-
-  inline bool IsUPeriodic() 
-    { if (_periodicityU) return true; else return false; }
-  inline bool IsVPeriodic() 
-    { if (_periodicityV) return true; else return false; }
-
-  inline bool IsHardEdge(int i)
-    { if (_hardEdge[i]) return true; else return false; }
-
-  inline void SetPeriodicity(int pU, int pV) 
-    { _periodicityU = pU; _periodicityV = pV; }
-
-  inline double RescaleU(double u)
-    {
-      u = _uMin + u * (_uMax - _uMin);
-      if (_periodicityU) {
-	u -= std::floor(float(u));
-      }
-      return u;
-    }
-  inline double RescaleV(double v)
-    {
-      v = _vMin + v * (_vMax - _vMin);
-      if (_periodicityV) {
-	v -= std::floor(float(v));
-      }
-      return v;
-    }
-
-  inline double UnscaleU(double u)
-    {
-      u -= _uMin;
-      //printf("u1 = %.16g\n",u);
-      if (_periodicityU) {
-	if ((std::abs(u) < 1.e-4)||(std::abs(u-1.) < 1.e-4)||
-	    (std::abs(u+1.) < 1.e-4))
-	  u -= std::floor(round(u));
-	else
-	  u -= std::floor(u);
-      }
-      //printf("u2 = %.16g\n",u);
-      u /= (_uMax - _uMin);
-      return u;
-    }
-  inline double UnscaleV(double v)
-    {
-      v -= _vMin;
-      if (_periodicityV) {
-	v -= std::floor(float(v));
-      }
-      v /= (_vMax - _vMin);
-      return v;
-    }
-
-  inline int GetDerivativeBitField() { return _derivative; }
-  inline ProjectionSurface* GetProjectionSurface() { return _ps; }
-  inline void SetProjectionSurface(ProjectionSurface* ps) { _ps = ps; }
-
-  // These are the virtual functions that must be provided by all
-  // derived patches: GetPou() returns the original smooth
-  // (non-normalized) cutoff on the patch; F() and Inverse() implement
-  // the mapping f: (u,v)->(x,y,z) and its inverse; and the Df*() and Dn*()
-  // functions return the derivatives of the mapping f and unit normal n 
-  // with respect to u and v
-  virtual void Export(FILE *fp) = 0;
-  virtual double GetPou(double u, double v) = 0;
-  virtual void F(double u, double v, double &x, double &y, double &z) = 0;
-  virtual bool Inverse(double x,double y,double z,double &u,double &v) = 0;
-  virtual void Dfdu(double u, double v, double &x, double &y, double &z) = 0;
-  virtual void Dfdv(double u, double v, double &x, double &y, double &z) = 0;
-  virtual void Dfdfdudu(double u,double v,double &x,double &y,double &z) = 0;
-  virtual void Dfdfdudv(double u,double v,double &x,double &y,double &z) = 0;
-  virtual void Dfdfdvdv(double u,double v,double &x,double &y,double &z) = 0;
-
-  // These functions may also be provided by the derived patches
-  // (usually for better performance), but they don't have to
-  virtual void Dndu(double u, double v, double &x, double &y, double &z);
-  virtual void Dndv(double u, double v, double &x, double &y, double &z);
-  virtual void GetUnitNormal(double u,double v,double &x,double &y,double &z);
-  virtual void GetNormal(double u, double v, double &x, double &y, double &z);
-
-};
-
-}
-
-#endif
diff --git a/contrib/FourierModel/PlaneProjectionSurface.cpp b/contrib/FourierModel/PlaneProjectionSurface.cpp
deleted file mode 100755
index e47808f394..0000000000
--- a/contrib/FourierModel/PlaneProjectionSurface.cpp
+++ /dev/null
@@ -1,183 +0,0 @@
-#include "PlaneProjectionSurface.h"
-
-using namespace FM;
-
-PlaneProjectionSurface::PlaneProjectionSurface
-(int tag) : ProjectionSurface()
-{
-  SetTag(tag);
-  SetName(std::string("plane"));
-
-  numParameters_ = 0;
-
-  O_[0] = O_[1] = O_[2] = 0.;
-
-  E0_[0] = 1.; E0_[1] = 0.; E0_[2] = 0.;
-  E1_[0] = 0.; E1_[1] = 1.; E1_[2] = 0.;
-  E2_[0] = 0.; E2_[1] = 0.; E2_[2] = 1.;
-
-  scale_[0] = scale_[1] = scale_[2] = 1.;
-}
-
-PlaneProjectionSurface::PlaneProjectionSurface
-(int tag, double O[3], double E0[3], double E1[3], double scale[3])
-  : ProjectionSurface()
-{
-  SetTag(tag);
-  SetName(std::string("Plane"));
-
-  O_[0] = O[0]; O_[1] = O[1]; O_[2] = O[2];
-
-  E0_[0] = E0[0]; E0_[1] = E0[1]; E0_[2] = E0[2];
-  E1_[0] = E1[0]; E1_[1] = E1[1]; E1_[2] = E1[2];
-
-  E2_[0] = E0_[1] * E1_[2] - E0_[2] * E1_[1];
-  E2_[1] = E0_[2] * E1_[0] - E0_[0] * E1_[2];
-  E2_[2] = E0_[0] * E1_[1] - E0_[1] * E1_[0];
-
-  scale_[0] = scale[0]; scale_[1] = scale[1]; scale_[2] = scale[2];
-}
-
-void PlaneProjectionSurface::
-F(double u, double v, double &x, double &y, double &z)
-{
-  x = O_[0] + u * scale_[1] * E1_[0] + v * scale_[2] * E2_[0];
-  y = O_[1] + u * scale_[1] * E1_[1] + v * scale_[2] * E2_[1];
-  z = O_[2] + u * scale_[1] * E1_[2] + v * scale_[2] * E2_[2];
-}
-
-bool PlaneProjectionSurface::
-Inverse(double x, double y, double z, double &u,double &v)
-{
-  u = (x - O_[0]) * E1_[0] + (y - O_[1]) * E1_[1] + (z - O_[2]) * E1_[2];
-  v = (x - O_[0]) * E2_[0] + (y - O_[1]) * E2_[1] + (z - O_[2]) * E2_[2];
-  
-  u /= scale_[1];
-  v /= scale_[2];
-
-  double tol = 1.e-12;
-  
-  if ((u > - tol) && (u < 1. + tol) && (v > - tol) && (v < 1. + tol))
-    return true;
-  else
-    return false;
-}
-
-void PlaneProjectionSurface::
-Dfdu(double u, double v, double &x, double &y, double &z)
-{
-  x = scale_[1] * E1_[0];
-  y = scale_[1] * E1_[1];
-  z = scale_[1] * E1_[2];
-}
-
-void PlaneProjectionSurface::
-Dfdv(double u, double v, double &x, double &y, double &z)
-{
-  x = scale_[2] * E2_[0];
-  y = scale_[2] * E2_[1];
-  z = scale_[2] * E2_[2];
-}
-
-void PlaneProjectionSurface::
-Dfdfdudu(double u,double v, double &x, double &y, double &z)
-{
-  x = y = z = 0.;
-}
-
-void PlaneProjectionSurface::
-Dfdfdudv(double u, double v, double &x, double &y, double &z)
-{
-  x = y = z = 0.;
-}
-
-void PlaneProjectionSurface::
-Dfdfdvdv(double u, double v, double &x, double &y, double &z)
-{
-  x = y = z = 0.;
-}
-
-void PlaneProjectionSurface::
-Dfdfdfdududu(double u,double v,double &x,double &y,double &z)
-{
-  x = y = z = 0.;
-}
-
-void PlaneProjectionSurface::
-Dfdfdfdududv(double u,double v,double &x,double &y,double &z)
-{
-  x = y = z = 0.;
-}
-
-void PlaneProjectionSurface::
-Dfdfdfdudvdv(double u,double v,double &x,double &y,double &z)
-{
-  x = y = z = 0.;
-}
-
-void PlaneProjectionSurface::
-Dfdfdfdvdvdv(double u,double v,double &x,double &y,double &z)
-{
-  x = y = z = 0.;
-}
-
-void PlaneProjectionSurface::
-GetNormal(double u, double v, double &x, double &y, double &z)
-{
-  x = E0_[0];
-  y = E0_[1];
-  z = E0_[2];
-}
-
-void PlaneProjectionSurface::
-Dndu(double u, double v, double &x, double &y, double &z)
-{
-  x = y = z = 0.;
-}
-
-void PlaneProjectionSurface::
-Dndv(double u, double v, double &x, double &y, double &z)
-{
-  x = y = z = 0.;
-}
-
-void PlaneProjectionSurface::
-Dndndudu(double u, double v, double &x, double &y, double &z)
-{
-  x = y = z = 0.;
-}
-
-void PlaneProjectionSurface::
-Dndndudv(double u, double v, double &x, double &y, double &z)
-{
-  x = y = z = 0.;
-}
-
-void PlaneProjectionSurface::
-Dndndvdv(double u, double v, double &x, double &y, double &z)
-{
-  x = y = z = 0.;
-}
-
-bool PlaneProjectionSurface::
-OrthoProjectionOnSurface(double x, double y, double z, double &u,double &v)
-{
-  return Inverse(x,y,z,u,v);
-}
-
-void PlaneProjectionSurface::
-SetParameter(int i, double x)
-{
-}
-
-double PlaneProjectionSurface::
-GetParameter(int i)
-{
-  return 0.;
-}
-
-std::string PlaneProjectionSurface::
-GetLabel(int i)
-{
-  return std::string(" ");
-}
diff --git a/contrib/FourierModel/PlaneProjectionSurface.h b/contrib/FourierModel/PlaneProjectionSurface.h
deleted file mode 100755
index 41a290f409..0000000000
--- a/contrib/FourierModel/PlaneProjectionSurface.h
+++ /dev/null
@@ -1,77 +0,0 @@
-#ifndef _PLANE_PROJECTION_SURFACE_H_
-#define _PLANE_PROJECTION_SURFACE_H_
-
-#include <cmath>
-#include "ProjectionSurface.h"
-
-namespace FM {
-
-class PlaneProjectionSurface : public ProjectionSurface {
- public:
-  PlaneProjectionSurface
-    (int tag);
-  PlaneProjectionSurface
-    (int tag, double O[3], double E0[3], double E1[3], double scale[3]);
-  PlaneProjectionSurface(PlaneProjectionSurface *ps) 
-    : ProjectionSurface(ps) {}
-
-  virtual ~PlaneProjectionSurface
-    () {}
-
-  virtual ProjectionSurface *clone()
-  {
-    return new PlaneProjectionSurface(this);
-  }
-
-  // Abstract methods of ProjectionSurface
-
-  virtual void F
-    (double u, double v, double &x, double &y, double &z);
-  virtual bool Inverse
-    (double x,double y,double z,double &u,double &v);
-  virtual void Dfdu
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dfdv
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dfdfdudu
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdudv
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdvdv
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdfdududu
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdfdududv
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdfdudvdv
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdfdvdvdv
-    (double u,double v,double &x,double &y,double &z);
-  virtual bool OrthoProjectionOnSurface
-    (double x, double y, double z, double &u,double &v);
-  virtual void SetParameter
-    (int i, double x);
-  virtual double GetParameter
-    (int i);
-  virtual std::string GetLabel
-    (int i);
-
-  // Redefinitions for PlaneProjectionSurface
-
-  virtual void GetNormal
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dndu
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dndv
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dndndudu
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dndndudv
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dndndvdv
-    (double u, double v, double &x, double &y, double &z);
-};
-
-}
-
-#endif
diff --git a/contrib/FourierModel/ProjectionSurface.cpp b/contrib/FourierModel/ProjectionSurface.cpp
deleted file mode 100755
index c1731f5001..0000000000
--- a/contrib/FourierModel/ProjectionSurface.cpp
+++ /dev/null
@@ -1,357 +0,0 @@
-#include <cmath>
-#include "ProjectionSurface.h"
-
-using namespace FM;
-
-ProjectionSurface::ProjectionSurface
-(double uPeriod, double vPeriod)
-{
-  tag_ = -1;
-  name_ = std::string("default");
-  numParameters_ = 0;
-
-  uPeriod_ = uPeriod;
-  vPeriod_ = vPeriod;
-
-  if (uPeriod_ < 0.)
-    uPeriodic_ = false;
-  else
-    uPeriodic_ = true;
-
-  if (vPeriod_ < 0.)
-    vPeriodic_ = false;
-  else
-    vPeriodic_ = true;
-
-  for (int l=0;l<3;l++) {
-    O_[l] = E0_[l] = E1_[l] = E2_[l] = scale_[l] = 0.;
-  }
-}
-
-void ProjectionSurface::GetNormal
-(double u, double v, double &x, double &y, double &z)
-{
-  double dfdu[3], dfdv[3];
-  Dfdu(u, v, dfdu[0], dfdu[1], dfdu[2]);
-  Dfdv(u, v, dfdv[0], dfdv[1], dfdv[2]);
-  x = dfdu[1] * dfdv[2] - dfdu[2] * dfdv[1];
-  y = dfdu[2] * dfdv[0] - dfdu[0] * dfdv[2];
-  z = dfdu[0] * dfdv[1] - dfdu[1] * dfdv[0];
-}
-
-void ProjectionSurface::GetUnitNormal
-(double u, double v, double &x, double &y, double &z)
-{
-  GetNormal(u, v, x, y, z);
-  double norm = sqrt(x * x + y * y + z * z);
-  if(norm > 0.) {
-    x /= norm;
-    y /= norm;
-    z /= norm;
-  }  
-}
-
-void ProjectionSurface::Dndu
-(double u, double v, double &x, double &y, double &z) 
-{
-  double n[3],dfdu[3],dfdv[3],dfdfdudu[3],dfdfdudv[3],dfdfdvdv[3],dndu[3];
-  Dfdu(u, v, dfdu[0], dfdu[1], dfdu[2]);
-  Dfdv(u, v, dfdv[0], dfdv[1], dfdv[2]);
-  Dfdfdudu(u, v, dfdfdudu[0], dfdfdudu[1], dfdfdudu[2]);
-  Dfdfdudv(u, v, dfdfdudv[0], dfdfdudv[1], dfdfdudv[2]);
-  Dfdfdvdv(u, v, dfdfdvdv[0], dfdfdvdv[1], dfdfdvdv[2]);
-  GetNormal(u,v,n[0],n[1],n[2]);
-  double norm = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
-  double normSquared = norm * norm;
-  double normCubed = normSquared * norm;
-
-  dndu[0] = dfdfdudu[1] * dfdv[2] + dfdu[1] * dfdfdudv[2] - 
-    dfdfdudu[2] * dfdv[1] - dfdu[2] * dfdfdudv[1];
-  dndu[1] = dfdfdudu[2] * dfdv[0] + dfdu[2] * dfdfdudv[0] - 
-    dfdfdudu[0] * dfdv[2] - dfdu[0] * dfdfdudv[2];
-  dndu[2] = dfdfdudu[0] * dfdv[1] + dfdu[0] * dfdfdudv[1] - 
-    dfdfdudu[1] * dfdv[0] - dfdu[1] * dfdfdudv[0];
-
-  x = ((normSquared - n[0]*n[0])*dndu[0] - n[0]*n[1]*dndu[1] - 
-       n[0]*n[2]*dndu[2]) / normCubed;
-  y = ((normSquared - n[1]*n[1])*dndu[1] - n[1]*n[0]*dndu[0] -
-       n[1]*n[2]*dndu[2]) / normCubed;
-  z = ((normSquared - n[2]*n[2])*dndu[2] - n[2]*n[0]*dndu[0] -
-       n[2]*n[1]*dndu[1]) / normCubed;
-}
-
-void ProjectionSurface::
-Dndv(double u, double v, double &x, double &y, double &z) 
-{
-  double n[3],dfdu[3],dfdv[3],dfdfdudu[3],dfdfdudv[3],dfdfdvdv[3],dndv[3];
-  Dfdu(u, v, dfdu[0], dfdu[1], dfdu[2]);
-  Dfdv(u, v, dfdv[0], dfdv[1], dfdv[2]);
-  Dfdfdudu(u, v, dfdfdudu[0], dfdfdudu[1], dfdfdudu[2]);
-  Dfdfdudv(u, v, dfdfdudv[0], dfdfdudv[1], dfdfdudv[2]);
-  Dfdfdvdv(u, v, dfdfdvdv[0], dfdfdvdv[1], dfdfdvdv[2]);
-  GetNormal(u,v,n[0],n[1],n[2]);
-  double norm = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
-  double normSquared = norm * norm;
-  double normCubed = normSquared * norm;
-
-  dndv[0] = dfdfdudv[1] * dfdv[2] + dfdu[1] * dfdfdvdv[2] -
-    dfdfdudv[2] * dfdv[1] - dfdu[2] * dfdfdvdv[1];
-  dndv[1] = dfdfdudv[2] * dfdv[0] + dfdu[2] * dfdfdvdv[0] -
-    dfdfdudv[0] * dfdv[2] - dfdu[0] * dfdfdvdv[2];
-  dndv[2] = dfdfdudv[0] * dfdv[1] + dfdu[0] * dfdfdvdv[1] -
-    dfdfdudv[1] * dfdv[0] - dfdu[1] * dfdfdvdv[0];
-
-  x = ((normSquared - n[0]*n[0])*dndv[0] - n[0]*n[1]*dndv[1] - 
-       n[0]*n[2]*dndv[2]) / normCubed;
-  y = ((normSquared - n[1]*n[1])*dndv[1] - n[1]*n[0]*dndv[0] -
-       n[1]*n[2]*dndv[2]) / normCubed;
-  z = ((normSquared - n[2]*n[2])*dndv[2] - n[2]*n[0]*dndv[0] -
-       n[2]*n[1]*dndv[1]) / normCubed;
-}
-
-void ProjectionSurface::
-Dndndudu(double u, double v, double &x, double &y, double &z)
-{
-  double n[3],dfdu[3],dfdv[3],dfdfdudu[3],dfdfdudv[3],dfdfdvdv[3],
-    dfdfdfdududu[3],dfdfdfdududv[3],dfdfdfdudvdv[3],dfdfdfdvdvdv[3],
-    dndu[3],dndndudu[3];
-
-  GetNormal(u,v,n[0],n[1],n[2]);
-  Dfdu(u, v, dfdu[0], dfdu[1], dfdu[2]);
-  Dfdv(u, v, dfdv[0], dfdv[1], dfdv[2]);
-  Dfdfdudu(u, v, dfdfdudu[0], dfdfdudu[1], dfdfdudu[2]);
-  Dfdfdudv(u, v, dfdfdudv[0], dfdfdudv[1], dfdfdudv[2]);
-  Dfdfdvdv(u, v, dfdfdvdv[0], dfdfdvdv[1], dfdfdvdv[2]);
-  Dfdfdfdududu(u,v,dfdfdfdududu[0],dfdfdfdududu[1],dfdfdfdududu[2]);
-  Dfdfdfdududv(u,v,dfdfdfdududv[0],dfdfdfdududv[1],dfdfdfdududv[2]);
-  Dfdfdfdudvdv(u,v,dfdfdfdudvdv[0],dfdfdfdudvdv[1],dfdfdfdudvdv[2]);
-  Dfdfdfdvdvdv(u,v,dfdfdfdvdvdv[0],dfdfdfdvdvdv[1],dfdfdfdvdvdv[2]);
-
-  dndu[0] = dfdfdudu[1] * dfdv[2] + dfdu[1] * dfdfdudv[2] -
-    dfdfdudu[2] * dfdv[1] - dfdu[2] * dfdfdudv[1];
-  dndu[1] = dfdfdudu[2] * dfdv[0] + dfdu[2] * dfdfdudv[0] -
-    dfdfdudu[0] * dfdv[2] - dfdu[0] * dfdfdudv[2];
-  dndu[2] = dfdfdudu[0] * dfdv[1] + dfdu[0] * dfdfdudv[1] -
-    dfdfdudu[1] * dfdv[0] - dfdu[1] * dfdfdudv[0];
-
-  dndndudu[0] = dfdfdfdududu[1] * dfdv[2] + dfdfdudu[1] * dfdfdudv[2] + 
-    dfdfdudu[1] * dfdfdudv[2] + dfdu[1] * dfdfdfdududv[2] -
-    dfdfdfdududu[2] * dfdv[1] - dfdfdudu[2] * dfdfdudv[1]  - 
-    dfdfdudu[2] * dfdfdudv[1] - dfdu[2] * dfdfdfdududv[1];
-  dndndudu[1] = dfdfdfdududu[2] * dfdv[0] + dfdfdudu[2] * dfdfdudv[0] +
-    dfdfdudu[2] * dfdfdudv[0] + dfdu[2] * dfdfdfdududv[0]  -
-    dfdfdfdududu[0] * dfdv[2] - dfdfdudu[0] * dfdfdudv[2]  - 
-    dfdfdudu[0] * dfdfdudv[2] - dfdu[0] * dfdfdfdududv[2];
-  dndndudu[2] = dfdfdfdududu[0] * dfdv[1] + dfdfdudu[0] * dfdfdudv[1] +
-    dfdfdudu[0] * dfdfdudv[1] +  dfdu[0] * dfdfdfdududv[1] -
-    dfdfdfdududu[1] * dfdv[0] - dfdfdudu[1] * dfdfdudv[0]  - 
-    dfdfdudu[1] * dfdfdudv[0] - dfdu[1] * dfdfdfdududv[0];
-
-  double nDotN = n[0]*n[0]+n[1]*n[1]+n[2]*n[2];
-  double nDotNu = n[0] * dndu[0] + n[1] * dndu[1] + n[2] * dndu[2];
-  double nuDotNu = dndu[0] * dndu[0] + dndu[1] * dndu[1] + dndu[2] * dndu[2];
-  double nDotNuu = n[0] * dndndudu[0] + n[1] * dndndudu[1] + 
-    n[2] * dndndudu[2];
-  
-  double norm = sqrt(nDotN);
-  double normCubed = nDotN * norm;
-  double normToFive = nDotN * normCubed;
-
-  x = (nDotN * dndndudu[0] - 2 * nDotNu * dndu[0] - 
-       (nuDotNu + nDotNuu) * n[0]) / normCubed +
-    3 * nDotNu * nDotNu * n[0] / normToFive;
-  y = (nDotN * dndndudu[1] - 2 * nDotNu * dndu[1] - 
-       (nuDotNu + nDotNuu) * n[1]) / normCubed +
-    3 * nDotNu * nDotNu * n[1] / normToFive;
-  z = (nDotN * dndndudu[2] - 2 * nDotNu * dndu[2] - 
-       (nuDotNu + nDotNuu) * n[2]) / normCubed +
-    3 * nDotNu * nDotNu * n[2] / normToFive;
-}
-
-void ProjectionSurface::
-Dndndudv(double u, double v, double &x, double &y, double &z)
-{
-  double n[3],dfdu[3],dfdv[3],dfdfdudu[3],dfdfdudv[3],dfdfdvdv[3],
-    dfdfdfdududu[3],dfdfdfdududv[3],dfdfdfdudvdv[3],dfdfdfdvdvdv[3],
-    dndu[3],dndv[3],dndndudv[3];
-
-  GetNormal(u,v,n[0],n[1],n[2]);
-  Dfdu(u, v, dfdu[0], dfdu[1], dfdu[2]);
-  Dfdv(u, v, dfdv[0], dfdv[1], dfdv[2]);
-  Dfdfdudu(u, v, dfdfdudu[0], dfdfdudu[1], dfdfdudu[2]);
-  Dfdfdudv(u, v, dfdfdudv[0], dfdfdudv[1], dfdfdudv[2]);
-  Dfdfdvdv(u, v, dfdfdvdv[0], dfdfdvdv[1], dfdfdvdv[2]);
-  Dfdfdfdududu(u,v,dfdfdfdududu[0],dfdfdfdududu[1],dfdfdfdududu[2]);
-  Dfdfdfdududv(u,v,dfdfdfdududv[0],dfdfdfdududv[1],dfdfdfdududv[2]);
-  Dfdfdfdudvdv(u,v,dfdfdfdudvdv[0],dfdfdfdudvdv[1],dfdfdfdudvdv[2]);
-  Dfdfdfdvdvdv(u,v,dfdfdfdvdvdv[0],dfdfdfdvdvdv[1],dfdfdfdvdvdv[2]);
-
-  dndu[0] = dfdfdudu[1] * dfdv[2] + dfdu[1] * dfdfdudv[2] -
-    dfdfdudu[2] * dfdv[1] - dfdu[2] * dfdfdudv[1];
-  dndu[1] = dfdfdudu[2] * dfdv[0] + dfdu[2] * dfdfdudv[0] -
-    dfdfdudu[0] * dfdv[2] - dfdu[0] * dfdfdudv[2];
-  dndu[2] = dfdfdudu[0] * dfdv[1] + dfdu[0] * dfdfdudv[1] -
-    dfdfdudu[1] * dfdv[0] - dfdu[1] * dfdfdudv[0];
-
-  dndv[0] = dfdfdudv[1] * dfdv[2] + dfdu[1] * dfdfdvdv[2] -
-    dfdfdudv[2] * dfdv[1] - dfdu[2] * dfdfdvdv[1];
-  dndv[1] = dfdfdudv[2] * dfdv[0] + dfdu[2] * dfdfdvdv[0] -
-    dfdfdudv[0] * dfdv[2] - dfdu[0] * dfdfdvdv[2];
-  dndv[2] = dfdfdudv[0] * dfdv[1] + dfdu[0] * dfdfdvdv[1] -
-    dfdfdudv[1] * dfdv[0] - dfdu[1] * dfdfdvdv[0];
-
-  dndndudv[0] = dfdfdfdududv[1] * dfdv[2] + dfdfdudu[1] * dfdfdvdv[2] + 
-    dfdfdudv[1] * dfdfdudv[2] + dfdu[1] * dfdfdfdudvdv[2] -
-    dfdfdfdududv[2] * dfdv[1] - dfdfdudu[2] * dfdfdvdv[1]  - 
-    dfdfdudv[2] * dfdfdudv[1] - dfdu[2] * dfdfdfdudvdv[1];
-  dndndudv[1] = dfdfdfdududv[2] * dfdv[0] + dfdfdudu[2] * dfdfdvdv[0] +
-    dfdfdudv[2] * dfdfdudv[0] + dfdu[2] * dfdfdfdudvdv[0]  -
-    dfdfdfdududv[0] * dfdv[2] - dfdfdudu[0] * dfdfdvdv[2]  - 
-    dfdfdudv[0] * dfdfdudv[2] - dfdu[0] * dfdfdfdudvdv[2];
-  dndndudv[2] = dfdfdfdududv[0] * dfdv[1] + dfdfdudu[0] * dfdfdvdv[1] +
-    dfdfdudv[0] * dfdfdudv[1] +  dfdu[0] * dfdfdfdudvdv[1] -
-    dfdfdfdududv[1] * dfdv[0] - dfdfdudu[1] * dfdfdvdv[0]  - 
-    dfdfdudv[1] * dfdfdudv[0] - dfdu[1] * dfdfdfdudvdv[0];
-
-  double nDotN = n[0]*n[0]+n[1]*n[1]+n[2]*n[2];
-  double nDotNu = n[0] * dndu[0] + n[1] * dndu[1] + n[2] * dndu[2];
-  double nDotNv = n[0] * dndv[0] + n[1] * dndv[1] + n[2] * dndv[2];
-  double nuDotNv = dndu[0] * dndv[0] + dndu[1] * dndv[1] + dndu[2] * dndv[2];
-  double nDotNuv = n[0] * dndndudv[0] + n[1] * dndndudv[1] + 
-    n[2] * dndndudv[2];
-  
-  double norm = sqrt(nDotN);
-  double normCubed = nDotN * norm;
-  double normToFive = nDotN * normCubed;
-
-  x = (nDotN * dndndudv[0] - nDotNv * dndu[0] - nDotNu * dndv[0] -
-       (nuDotNv + nDotNuv) * n[0]) / normCubed +
-    3 * nDotNu * nDotNv * n[0] / normToFive;
-  y = (nDotN * dndndudv[1] - nDotNv * dndu[1] - nDotNu * dndv[1] -
-       (nuDotNv + nDotNuv) * n[1]) / normCubed +
-    3 * nDotNu * nDotNv * n[1] / normToFive;
-  z = (nDotN * dndndudv[2] - nDotNv * dndu[2] - nDotNu * dndv[2] -
-       (nuDotNv + nDotNuv) * n[2]) / normCubed +
-    3 * nDotNu * nDotNv * n[2] / normToFive;
-}
-
-void ProjectionSurface::
-Dndndvdv(double u, double v, double &x, double &y, double &z)
-{
-  double n[3],dfdu[3],dfdv[3],dfdfdudu[3],dfdfdudv[3],dfdfdvdv[3],
-    dfdfdfdududu[3],dfdfdfdududv[3],dfdfdfdudvdv[3],dfdfdfdvdvdv[3],
-    dndv[3],dndndvdv[3];
-
-  GetNormal(u,v,n[0],n[1],n[2]);
-  Dfdu(u, v, dfdu[0], dfdu[1], dfdu[2]);
-  Dfdv(u, v, dfdv[0], dfdv[1], dfdv[2]);
-  Dfdfdudu(u, v, dfdfdudu[0], dfdfdudu[1], dfdfdudu[2]);
-  Dfdfdudv(u, v, dfdfdudv[0], dfdfdudv[1], dfdfdudv[2]);
-  Dfdfdvdv(u, v, dfdfdvdv[0], dfdfdvdv[1], dfdfdvdv[2]);
-  Dfdfdfdududu(u,v,dfdfdfdududu[0],dfdfdfdududu[1],dfdfdfdududu[2]);
-  Dfdfdfdududv(u,v,dfdfdfdududv[0],dfdfdfdududv[1],dfdfdfdududv[2]);
-  Dfdfdfdudvdv(u,v,dfdfdfdudvdv[0],dfdfdfdudvdv[1],dfdfdfdudvdv[2]);
-  Dfdfdfdvdvdv(u,v,dfdfdfdvdvdv[0],dfdfdfdvdvdv[1],dfdfdfdvdvdv[2]);
-
-  dndv[0] = dfdfdudv[1] * dfdv[2] + dfdu[1] * dfdfdvdv[2] -
-    dfdfdudv[2] * dfdv[1] - dfdu[2] * dfdfdvdv[1];
-  dndv[1] = dfdfdudv[2] * dfdv[0] + dfdu[2] * dfdfdvdv[0] -
-    dfdfdudv[0] * dfdv[2] - dfdu[0] * dfdfdvdv[2];
-  dndv[2] = dfdfdudv[0] * dfdv[1] + dfdu[0] * dfdfdvdv[1] -
-    dfdfdudv[1] * dfdv[0] - dfdu[1] * dfdfdvdv[0];
-
-  dndndvdv[0] = dfdfdfdudvdv[1] * dfdv[2] + dfdfdudv[1] * dfdfdvdv[2] + 
-    dfdfdudv[1] * dfdfdvdv[2] + dfdu[1] * dfdfdfdvdvdv[2] -
-    dfdfdfdudvdv[2] * dfdv[1] - dfdfdudv[2] * dfdfdvdv[1]  - 
-    dfdfdudv[2] * dfdfdvdv[1] - dfdu[2] * dfdfdfdvdvdv[1];
-  dndndvdv[1] = dfdfdfdudvdv[2] * dfdv[0] + dfdfdudv[2] * dfdfdvdv[0] +
-    dfdfdudv[2] * dfdfdvdv[0] + dfdu[2] * dfdfdfdvdvdv[0]  -
-    dfdfdfdudvdv[0] * dfdv[2] - dfdfdudv[0] * dfdfdvdv[2]  - 
-    dfdfdudv[0] * dfdfdvdv[2] - dfdu[0] * dfdfdfdvdvdv[2];
-  dndndvdv[2] = dfdfdfdudvdv[0] * dfdv[1] + dfdfdudv[0] * dfdfdvdv[1] +
-    dfdfdudv[0] * dfdfdvdv[1] +  dfdu[0] * dfdfdfdvdvdv[1] -
-    dfdfdfdudvdv[1] * dfdv[0] - dfdfdudv[1] * dfdfdvdv[0]  - 
-    dfdfdudv[1] * dfdfdvdv[0] - dfdu[1] * dfdfdfdvdvdv[0];
-
-  double nDotN = n[0]*n[0]+n[1]*n[1]+n[2]*n[2];
-  double nDotNv = n[0] * dndv[0] + n[1] * dndv[1] + n[2] * dndv[2];
-  double nvDotNv = dndv[0] * dndv[0] + dndv[1] * dndv[1] + dndv[2] * dndv[2];
-  double nDotNvv = n[0] * dndndvdv[0] + n[1] * dndndvdv[1] + 
-    n[2] * dndndvdv[2];
-  
-  double norm = sqrt(nDotN);
-  double normCubed = nDotN * norm;
-  double normToFive = nDotN * normCubed;
-
-  x = (nDotN * dndndvdv[0] - 2 * nDotNv * dndv[0] - 
-       (nvDotNv + nDotNvv) * n[0]) / normCubed +
-    3 * nDotNv * nDotNv * n[0] / normToFive;
-  y = (nDotN * dndndvdv[1] - 2 * nDotNv * dndv[1] - 
-       (nvDotNv + nDotNvv) * n[1]) / normCubed +
-    3 * nDotNv * nDotNv * n[1] / normToFive;
-  z = (nDotN * dndndvdv[2] - 2 * nDotNv * dndv[2] - 
-       (nvDotNv + nDotNvv) * n[2]) / normCubed +
-    3 * nDotNv * nDotNv * n[2] / normToFive;
-}
-
-void ProjectionSurface::
-Rotate(double A0, double A1, double A2)
-{
-  double tol = 1.e-14;
-
-  A0 = A0 * M_PI / 180.;
-  A1 = A1 * M_PI / 180.;
-  A2 = A2 * M_PI / 180.;
-
-  double cosA0 = cos(A0);
-  double sinA0 = sin(A0);
-  double cosA1 = cos(A1);
-  double sinA1 = sin(A1);
-  double cosA2 = cos(A2);
-  double sinA2 = sin(A2);
-
-  double c[3], E0[3], E1[3], E2[3];
-
-  for (int l = 0; l < 3; l++) {
-    E0[l] = E0_[l];
-    E1[l] = E1_[l];
-    E2[l] = E2_[l];
-  }
-
-  c[0] = cosA1 * cosA2;
-  c[1] = cosA1 * sinA2;
-  c[2] = - sinA1;
-
-  for (int l = 0; l < 3; l++)
-    E0_[l] = c[0] * E0[l] + c[1] * E1[l] + c[2] * E2[l];
-
-  c[0] = sinA0 * sinA1 * cosA2 - cosA0 * sinA2;
-  c[1] = sinA0 * sinA1 * sinA2 + cosA0 * cosA2;;
-  c[2] = sinA0 * cosA1;
-
-  for (int l = 0; l < 3; l++)
-    E1_[l] = c[0] * E0[l] + c[1] * E1[l] + c[2] * E2[l];
-
-  c[0] = cosA0 * sinA1 * cosA2 + sinA0 * sinA2;
-  c[1] = cosA0 * sinA1 * sinA2 - sinA0 * cosA2;;
-  c[2] = cosA0 * cosA1;
-
-  for (int l = 0; l < 3; l++)
-    E2_[l] = c[0] * E0[l] + c[1] * E1[l] + c[2] * E2[l];
-}
-
-void ProjectionSurface::
-Translate(double D0, double D1, double D2)
-{
-  O_[0] += D0;
-  O_[1] += D1;
-  O_[2] += D2;
-}
-
-void ProjectionSurface::
-Rescale(double S0, double S1, double S2)
-{
-  scale_[0] *= S0;
-  scale_[1] *= S1;
-  scale_[2] *= S2;
-}
diff --git a/contrib/FourierModel/ProjectionSurface.h b/contrib/FourierModel/ProjectionSurface.h
deleted file mode 100755
index 41840e7e80..0000000000
--- a/contrib/FourierModel/ProjectionSurface.h
+++ /dev/null
@@ -1,150 +0,0 @@
-#ifndef _PROJECTION_SURFACE_H_
-#define _PROJECTION_SURFACE_H_
-
-#include <string>
-
-namespace FM {
-
-class ProjectionSurface {
- private:
-  int tag_;
-  std::string name_;
- protected:
-  int numParameters_;
-  double uPeriod_, vPeriod_;
-  bool uPeriodic_, vPeriodic_;
-  double O_[3], E0_[3], E1_[3], E2_[3], scale_[3];
- public:
-  ProjectionSurface
-    (double uPeriod = -1., double vPeriod = -1.);
-
-  ProjectionSurface(ProjectionSurface *ps)
-  {
-    tag_ = ps->tag_;
-    name_ = ps->name_;
-    numParameters_ = ps->numParameters_;
-    uPeriod_ = ps->uPeriod_;
-    vPeriod_ = ps->vPeriod_;
-    uPeriodic_ = ps->uPeriodic_;
-    vPeriodic_ = ps->vPeriodic_;
-    for(int i = 0; i < 3; i++){
-      O_[i] = ps->O_[i];
-      E0_[i] = ps->E0_[i];
-      E1_[i] = ps->E1_[i];
-      E2_[i] = ps->E2_[i];
-      scale_[i] = ps->scale_[i];
-    }
-  }
-
-  virtual ProjectionSurface *clone() = 0;
-
-  virtual ~ProjectionSurface() {}
-
-  inline int GetTag() { return tag_; }
-  inline void SetTag(int tag) { tag_ = tag; }
-
-  inline std::string GetName() { return name_; }
-  inline void SetName(std::string name) { name_ = name; }
-
-  inline int GetNumParameters() { return numParameters_; }
-
-  inline bool IsUPeriodic() { return uPeriodic_; }
-  inline bool IsVPeriodic() { return vPeriodic_; }
-
-  // Public access functions
-
-  inline void GetOrigin
-    (double &x, double &y, double &z)
-    {
-      x = O_[0]; y = O_[1]; z = O_[2];
-    }
-  inline void SetOrigin
-  (double x, double y, double z)
-    {
-      O_[0] = x; O_[1] = y; O_[2] = z;
-    }
-  inline void GetE0
-    (double &x, double &y, double &z)
-    {
-      x = E0_[0]; y = E0_[1]; z = E0_[2];
-    }
-  inline void GetE1
-    (double &x, double &y, double &z)
-    {
-      x = E1_[0]; y = E1_[1]; z = E1_[2];
-    }
-  inline void GetE2
-    (double &x, double &y, double &z)
-    {
-      x = E2_[0]; y = E2_[1]; z = E2_[2];
-    }
-  inline void GetScale
-    (double &x, double &y, double &z)
-    {
-      x = scale_[0]; y = scale_[1]; z = scale_[2];
-    }
-
-  // These are the virtual functions that must be provided 
-  // by all derived projection surfaces
-
-  virtual void F
-    (double u, double v, double &x, double &y, double &z) = 0;
-  virtual bool Inverse
-    (double x,double y,double z,double &u,double &v) = 0;
-  virtual void Dfdu
-    (double u, double v, double &x, double &y, double &z) = 0;
-  virtual void Dfdv
-    (double u, double v, double &x, double &y, double &z) = 0;
-  virtual void Dfdfdudu
-    (double u,double v,double &x,double &y,double &z) = 0;
-  virtual void Dfdfdudv
-    (double u,double v,double &x,double &y,double &z) = 0;
-  virtual void Dfdfdvdv
-    (double u,double v,double &x,double &y,double &z) = 0;
-  virtual void Dfdfdfdududu
-    (double u,double v,double &x,double &y,double &z) = 0;
-  virtual void Dfdfdfdududv
-    (double u,double v,double &x,double &y,double &z) = 0;
-  virtual void Dfdfdfdudvdv
-    (double u,double v,double &x,double &y,double &z) = 0;
-  virtual void Dfdfdfdvdvdv
-    (double u,double v,double &x,double &y,double &z) = 0;
-  virtual bool OrthoProjectionOnSurface
-    (double x, double y, double z, double &u,double &v) = 0;
-  virtual void SetParameter
-    (int i, double x) = 0;
-  virtual double GetParameter
-    (int i) = 0;
-  virtual std::string GetLabel
-    (int i) = 0;
-
-  // These functions may also be provided by the derived 
-  // projection surfaces (usually for better performance), 
-  // but they don't have to
-
-  virtual void GetNormal
-    (double u, double v, double &x, double &y, double &z);
-  virtual void GetUnitNormal
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dndu
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dndv
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dndndudu
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dndndudv
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dndndvdv
-    (double u, double v, double &x, double &y, double &z);
-
-  virtual void Rotate
-    (double A0, double A1, double A2);
-  virtual void Translate
-    (double D0, double D1, double D2);
-  virtual void Rescale
-    (double S0, double S1, double S2);
-};
-
-}
-
-#endif
diff --git a/contrib/FourierModel/RevolvedParabolaProjectionSurface.cpp b/contrib/FourierModel/RevolvedParabolaProjectionSurface.cpp
deleted file mode 100755
index 21a9cfac48..0000000000
--- a/contrib/FourierModel/RevolvedParabolaProjectionSurface.cpp
+++ /dev/null
@@ -1,267 +0,0 @@
-#include "RevolvedParabolaProjectionSurface.h"
-
-using namespace FM;
-
-RevolvedParabolaProjectionSurface::RevolvedParabolaProjectionSurface
-(int tag) : ProjectionSurface(1.) 
-{
-  SetTag(tag);
-  SetName(std::string("revolvedParabola"));
-
-  twoPi_ = 2 * M_PI;
-
-  R_ = 1.;
-  K_[0] = K_[1] = 0.5;
-
-  numParameters_ = 3;
-
-  O_[0] = O_[1] = O_[2] = 0.;
-
-  E0_[0] = 0.; E0_[1] = 0.; E0_[2] = 1.;
-  E1_[0] = 1.; E1_[1] = 0.; E1_[2] = 0.;
-  E2_[0] = 0.; E2_[1] = 1.; E2_[2] = 0.;
-
-  scale_[0] = scale_[1] = scale_[2] = 1.;
-}
-
-RevolvedParabolaProjectionSurface::RevolvedParabolaProjectionSurface
-(int tag, double O[3], double E0[3], double E1[3], double scale[3],
- double R, double K[2]) : ProjectionSurface(1.) 
-{
-  SetTag(tag);
-  SetName(std::string("revolvedParabola"));
-
-  twoPi_ = 2 * M_PI;
-
-  R_ = R;
-  K_[0] = K[0]; K_[1] = K[1];
-
-  O_[0] = O[0]; O_[1] = O[1]; O_[2] = O[2];
-
-  E0_[0] = E0[0]; E0_[1] = E0[1]; E0_[2] = E0[2];
-  E1_[0] = E1[0]; E1_[1] = E1[1]; E1_[2] = E1[2];
-
-  E2_[0] = E0_[1] * E1_[2] - E0_[2] * E1_[1];
-  E2_[1] = E0_[2] * E1_[0] - E0_[0] * E1_[2];
-  E2_[2] = E0_[0] * E1_[1] - E0_[1] * E1_[0]; 
-
-  scale_[0] = scale[0]; scale_[1] = scale[1]; scale_[2] = scale[2];
-}
-
-void RevolvedParabolaProjectionSurface::F
-(double u, double v, double &x, double &y, double &z)
-{
-  x = O_[0] + (R_ + K_[0] * (v - 0.5)) *
-    (E1_[0] * cos(twoPi_ * (u - 0.5)) + E2_[0] * sin(twoPi_ * (u - 0.5))) + 
-    K_[1] * (v - 0.5) * (v - 0.5) * E0_[0];
-  y = O_[1] + (R_ + K_[0] * (v - 0.5)) *
-    (E1_[1] * cos(twoPi_ * (u - 0.5)) + E2_[1] * sin(twoPi_ * (u - 0.5))) + 
-    K_[1] * (v - 0.5) * (v - 0.5) * E0_[1];
-  z = O_[2] + (R_ + K_[0] * (v - 0.5)) *
-    (E1_[2] * cos(twoPi_ * (u - 0.5)) + E2_[2] * sin(twoPi_ * (u - 0.5))) + 
-    K_[1] * (v - 0.5) * (v - 0.5) * E0_[2];
-}
-
-bool RevolvedParabolaProjectionSurface::Inverse
-(double x, double y, double z, double &u,double &v)
-{
-  double R[3];
-  R[0] = x - O_[0];
-  R[1] = y - O_[1];
-  R[2] = z - O_[2];
-
-  double RdotT = 0., RdotNcT = 0.;
-  for (int i=0;i<3;i++) {
-    RdotT += R[i] * E1_[i];
-    RdotNcT += R[i] * E2_[i];
-  }
-
-  u = atan2(RdotNcT,RdotT);
-  u /= twoPi_;
-  u += 0.5;
-
-  v = sqrt(RdotT * RdotT + RdotNcT * RdotNcT);
-  v -= R_;
-  v /= K_[0];
-  v += 0.5;
-}
-
-void RevolvedParabolaProjectionSurface::Dfdu
-(double u, double v, double &x, double &y, double &z)
-{
-  x = twoPi_ * (R_ + K_[0] * (v - 0.5)) *
-    (- E1_[0] * sin(twoPi_ * (u - 0.5)) + E2_[0] * cos(twoPi_ * (u - 0.5)));
-  y = twoPi_ * (R_ + K_[0] * (v - 0.5)) *
-    (- E1_[1] * sin(twoPi_ * (u - 0.5)) + E2_[1] * cos(twoPi_ * (u - 0.5)));
-  z = twoPi_ * (R_ + K_[0] * (v - 0.5)) *
-    (- E1_[2] * sin(twoPi_ * (u - 0.5)) + E2_[2] * cos(twoPi_ * (u - 0.5)));
-}
-
-void RevolvedParabolaProjectionSurface::Dfdv
-(double u, double v, double &x, double &y, double &z)
-{
-  x = K_[0] * 
-    (E1_[0] * cos(twoPi_ * (u - 0.5)) + E2_[0] * sin(twoPi_ * (u - 0.5))) + 
-    2. * K_[1] * (v - 0.5) * E0_[0];
-  y = K_[0] *
-    (E1_[1] * cos(twoPi_ * (u - 0.5)) + E2_[1] * sin(twoPi_ * (u - 0.5))) + 
-    2. * K_[1] * (v - 0.5) * E0_[1];
-  z = K_[0] *
-    (E1_[2] * cos(twoPi_ * (u - 0.5)) + E2_[2] * sin(twoPi_ * (u - 0.5))) + 
-    2. * K_[1] * (v - 0.5) * E0_[2];
-}
-
-void RevolvedParabolaProjectionSurface::Dfdfdudu
-(double u,double v, double &x, double &y, double &z)
-{
-  x = -  twoPi_ *  twoPi_ * (R_ + K_[0] * (v - 0.5)) *
-    (E1_[0] * cos(twoPi_ * (u - 0.5)) + E2_[0] * sin(twoPi_ * (u - 0.5)));
-  y = -  twoPi_ *  twoPi_ * (R_ + K_[0] * (v - 0.5)) *
-    (E1_[1] * cos(twoPi_ * (u - 0.5)) + E2_[1] * sin(twoPi_ * (u - 0.5)));
-  z = -  twoPi_ *  twoPi_ * (R_ + K_[0] * (v - 0.5)) *
-    (E1_[2] * cos(twoPi_ * (u - 0.5)) + E2_[2] * sin(twoPi_ * (u - 0.5)));
-}
-
-void RevolvedParabolaProjectionSurface::Dfdfdudv
-(double u, double v, double &x, double &y, double &z)
-{
-  x = K_[0] * twoPi_ *
-    (- E1_[0] * sin(twoPi_ * (u - 0.5)) + E2_[0] * cos(twoPi_ * (u - 0.5)));
-  y = K_[0] * twoPi_ *
-    (- E1_[1] * sin(twoPi_ * (u - 0.5)) + E2_[1] * cos(twoPi_ * (u - 0.5)));
-  z = K_[0] * twoPi_ *
-    (- E1_[2] * sin(twoPi_ * (u - 0.5)) + E2_[2] * cos(twoPi_ * (u - 0.5)));
-}
-
-void RevolvedParabolaProjectionSurface::Dfdfdvdv
-(double u, double v, double &x, double &y, double &z)
-{
-  x = 2. * K_[1] * E0_[0];
-  y = 2. * K_[1] * E0_[1];
-  z = 2. * K_[1] * E0_[2];
-}
-
-void RevolvedParabolaProjectionSurface::Dfdfdfdududu
-(double u,double v,double &x,double &y,double &z)
-{
-  x = twoPi_ *  twoPi_ * twoPi_ * (R_ + K_[0] * (v - 0.5)) *
-    (E1_[0] * sin(twoPi_ * (u - 0.5)) - E2_[0] * cos(twoPi_ * (u - 0.5)));
-  y = twoPi_ *  twoPi_ * twoPi_ * (R_ + K_[0] * (v - 0.5)) *
-    (E1_[1] * sin(twoPi_ * (u - 0.5)) - E2_[1] * cos(twoPi_ * (u - 0.5)));
-  z = twoPi_ *  twoPi_ * twoPi_ * (R_ + K_[0] * (v - 0.5)) *
-    (E1_[2] * sin(twoPi_ * (u - 0.5)) + E2_[2] * cos(twoPi_ * (u - 0.5)));
-}
-
-void RevolvedParabolaProjectionSurface::Dfdfdfdududv
-(double u,double v,double &x,double &y,double &z)
-{
-  x = -  twoPi_ *  twoPi_ * K_[0] *
-    (E1_[0] * cos(twoPi_ * (u - 0.5)) + E2_[0] * sin(twoPi_ * (u - 0.5)));
-  y = -  twoPi_ *  twoPi_ * K_[0]  *
-    (E1_[1] * cos(twoPi_ * (u - 0.5)) + E2_[1] * sin(twoPi_ * (u - 0.5)));
-  z = -  twoPi_ *  twoPi_ * K_[0] *
-    (E1_[2] * cos(twoPi_ * (u - 0.5)) + E2_[2] * sin(twoPi_ * (u - 0.5)));
-}
-
-void RevolvedParabolaProjectionSurface::Dfdfdfdudvdv
-(double u,double v,double &x,double &y,double &z)
-{
-  x = y = z = 0.;
-}
-
-void RevolvedParabolaProjectionSurface::Dfdfdfdvdvdv
-(double u,double v,double &x,double &y,double &z)
-{
-  x = y = z = 0.;
-}
-
-bool RevolvedParabolaProjectionSurface::OrthoProjectionOnSurface
-(double x, double y, double z, double& u, double& v)
-{
-  double R[3];
-  R[0] = x - O_[0];
-  R[1] = y - O_[1];
-  R[2] = z - O_[2];
-
-  double RdotT = 0., RdotNcT = 0.;
-  for (int i=0;i<3;i++) {
-    RdotT += R[i] * E1_[i];
-    RdotNcT += R[i] * E2_[i];
-  }
-
-  u = atan2(RdotNcT,RdotT);
-  u /= twoPi_;
-  u += 0.5;      
-
-  double A = - R_, B = 0.;
-  for (int i=0;i<3;i++) {
-    A += R[i] * (E1_[i] * cos(twoPi_ * (u - 0.5)) +
-		 E2_[i] * sin(twoPi_ * (u - 0.5)));
-    B += R[i] * E0_[i];
-  }
-
-  double a = 2 * K_[1] * K_[1];
-  double b = K_[0] * K_[0] - 2 * K_[1] * B;
-  double c = - K_[0] * A;
-
-  std::vector<double> root = SolveCubic(a,b,c);
-
-  if (root.size()) {
-    double xP,yP,zP;
-    double minDist = 1.e12;
-    for (int i=0;i<root.size();i++) {
-      F(u,root[i] + 0.5,xP,yP,zP);
-      double dist = sqrt((x-xP)*(x-xP)+(y-yP)*(y-yP)+(z-zP)*(z-zP));
-      if (dist < minDist) {
-	minDist = dist;
-	v = root[i] + 0.5;
-      }
-    }
-    double tol =1.e-4;
-    if ((u > - tol) && (u < 1. + tol) && (v > - tol) && (v < 1. + tol))
-      return true;
-    else
-      return false;
-  }
-  else
-    return false;
-}
-
-void RevolvedParabolaProjectionSurface::
-SetParameter(int i, double x)
-{
-  switch (i) {
-  case 0:
-    R_ = x;
-  case 1:
-    K_[0] = x;
-  case 2:
-    K_[1] = x;
-  }
-}
-
-double RevolvedParabolaProjectionSurface::
-GetParameter(int i)
-{
-  switch (i) {
-  case 0:
-    return R_;
-  case 1:
-    return K_[0];
-  case 2:
-    return K_[1];
-  }
-}
-
-std::string RevolvedParabolaProjectionSurface::
-GetLabel(int i)
-{
-  switch (i) {
-  case 0:
-    return std::string("Radius");
-  case 1:
-    return std::string("Parabola Scale 1");
-  case 2:
-    return std::string("Parabola Scale 2");
-  }
-}
diff --git a/contrib/FourierModel/RevolvedParabolaProjectionSurface.h b/contrib/FourierModel/RevolvedParabolaProjectionSurface.h
deleted file mode 100755
index 29217da97b..0000000000
--- a/contrib/FourierModel/RevolvedParabolaProjectionSurface.h
+++ /dev/null
@@ -1,74 +0,0 @@
-#ifndef _REVOLVED_PARABOLA_PROJECTION_SURFACE_H_
-#define _REVOLVED_PARABOLA_PROJECTION_SURFACE_H_
-
-#include <cmath>
-#include <vector>
-#include "Utils.h"
-#include "ProjectionSurface.h"
-
-namespace FM {
-
-class RevolvedParabolaProjectionSurface : public ProjectionSurface {
- private:
-  double twoPi_;
-  double R_, K_[2];
- public:
-  RevolvedParabolaProjectionSurface
-    (int tag);
-  RevolvedParabolaProjectionSurface
-    (int tag, double O[3], double E0[3], double E1[3], double scale[3],
-     double R, double K[2]);
-  RevolvedParabolaProjectionSurface(RevolvedParabolaProjectionSurface *ps) 
-    : ProjectionSurface(ps) 
-  {
-    twoPi_ = ps->twoPi_;
-    R_ = ps->R_;
-    K_[0] = ps->K_[0];
-    K_[1] = ps->K_[1];
-  }
-
-  virtual ~RevolvedParabolaProjectionSurface
-    () {}
-
-  virtual ProjectionSurface *clone()
-  {
-    return new RevolvedParabolaProjectionSurface(this);
-  }
-
-  // Abstract methods of ProjectionSurface
-
-  virtual void F
-    (double u, double v, double &x, double &y, double &z);
-  virtual bool Inverse
-    (double x,double y,double z,double &u,double &v);
-  virtual void Dfdu
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dfdv
-    (double u, double v, double &x, double &y, double &z);
-  virtual void Dfdfdudu
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdudv
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdvdv
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdfdududu
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdfdududv
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdfdudvdv
-    (double u,double v,double &x,double &y,double &z);
-  virtual void Dfdfdfdvdvdv
-    (double u,double v,double &x,double &y,double &z);
-  virtual bool OrthoProjectionOnSurface
-    (double x, double y, double z, double &u,double &v);
-  virtual void SetParameter
-    (int i, double x);
-  virtual double GetParameter
-    (int i);
-  virtual std::string GetLabel
-    (int i);
-};
-
-}
-
-#endif
diff --git a/contrib/FourierModel/Utils.cpp b/contrib/FourierModel/Utils.cpp
deleted file mode 100755
index 82cdc925c5..0000000000
--- a/contrib/FourierModel/Utils.cpp
+++ /dev/null
@@ -1,345 +0,0 @@
-#include "Utils.h"
-#include "Message.h"
-
-using namespace FM;
-
-std::vector<double> SolveCubic(double a, double b, double c)
-{
-  std::vector<double> root;
-  // find real roots of polynomial a*x^3+ b*x +c=0
-
-  double tol=pow(10.0, -12.);
-
-  double error=1.;
-  int maxiter=100; int iter=0;
-
-  std::vector<double> initial_guess(5);
-  initial_guess[0]=0.;
-  initial_guess[1]=1.;
-  initial_guess[2]=-1.;
-  initial_guess[3]=0.5;
-  initial_guess[4]=-0.5;
-  
-  bool find=0; int init=0;
-  double x0=0., x1, f, df;
-  
-  while (find==0 && init< 5){
-
-      init=init+1;
-      x0=initial_guess[init-1];
-      error=1.; iter=0;
-
-      while (error>tol && iter<maxiter){
-
-        f=a*x0*x0*x0+b*x0+c;
-        df=a*3.*x0*x0+b;
-
-        x1=x0-f/df;
-
-        error=std::abs(x1-x0);
-        x0=x1;
-        iter=iter+1;
-      }
-
-      if (iter<maxiter){
-        find=1;
-      }
-  }
-
-  if (find) {
-    root.push_back(x0);
-
-    //%polynomial a*x^3+ b*x +c=(x-x0)*(a*x^2+bb*x+cc)
-    //%where bb=a*x0, cc=-c/x0 (=b-a*x^2);
-  
-    double aa=a, bb=a*x0, cc=b-a*x0*x0;
-    double D=bb*bb-4.*aa*cc;
-    
-    if (D>=0.){
-      root.push_back((-bb+sqrt(D))/2./aa);
-      root.push_back((-bb-sqrt(D))/2./aa);
-    }
-  
-    // it seems that the solution obtained by quadratic formula
-    //is not so accurate --> used as initial guess.
-
-    if (root.size() == 3){
-      for (int i=0 ; i < 2 ; i++){
-	x0=root[i+1];
-	error=1.; iter=0;
-	while (error>tol && iter<maxiter){
-	  
-	  f=a*x0*x0*x0+b*x0+c;
-	  df=a*3.*x0*x0+b;
-	  
-	  x1=x0-f/df;
-	  
-	  error=std::abs(x1-x0);
-	  x0=x1;
-	  iter=iter+1;
-	}
-	root[i+1]=x0;
-      }
-    }
-  }
-
-  return root;
-}
-
-std::vector<double> SolveCubic(double a, double b, double c, double d)
-{
-  std::vector<double> root;
-  // find real roots of polynomial a*x^3 + b*x^2 + c*x + d=0
-
-  double tol=pow(10.0, -12.);
-
-  double error=1.;
-  int maxiter=100; int iter=0;
-
-  std::vector<double> initial_guess(5);
-  initial_guess[0]=0.;
-  initial_guess[1]=1.;
-  initial_guess[2]=-1.;
-  initial_guess[3]=0.5;
-  initial_guess[4]=-0.5;
-  
-  bool find=0; int init=0;
-  double x0=0., x1, f, df;
-  
-  while (find==0 && init< 5){
-
-      init=init+1;
-      x0=initial_guess[init-1];
-      error=1.; iter=0;
-
-      while (error>tol && iter<maxiter){
-
-        f=a*x0*x0*x0+b*x0*x0+c*x0+d;
-        df=3.*a*x0*x0+2.*b*x0+c;
-
-        x1=x0-f/df;
-
-        error=std::abs(x1-x0);
-        x0=x1;
-        iter=iter+1;
-      }
-
-      if (iter<maxiter){
-        find=1;
-      }
-  }
-
-  if (find) {
-    root.push_back(x0);
-
-    //%polynomial a*x^3 + b*x^2 + c*x + d = (x-x0)*(a*x^2+bb*x+cc)
-    //%where bb=a*x0, cc=-c/x0 (=b-a*x^2);
-  
-    double aa=a, bb=b+a*x0, cc=c+b*x0+a*x0*x0;
-    double D=bb*bb-4.*aa*cc;
-    
-    if (D>=0.){
-      root.push_back((-bb+sqrt(D))/2./aa);
-      root.push_back((-bb-sqrt(D))/2./aa);
-    }
-  
-    /*
-    // it seems that the solution obtained by quadratic formula
-    //is not so accurate --> used as initial guess.
-
-    if (root.size() == 3){
-      for (int i=0 ; i < 2 ; i++){
-	x0=root[i+1];
-	error=1.; iter=0;
-	while (error>tol && iter<maxiter){
-	  
-	  f=a*x0*x0*x0+b*x0+c;
-	  df=a*3.*x0*x0+b;
-	  
-	  x1=x0-f/df;
-	  
-	  error=std::abs(x1-x0);
-	  x0=x1;
-	  iter=iter+1;
-	}
-	root[i+1]=x0;
-      }
-    }
-    */
-  }
-
-  return root;
-}
-
-void  find(std::vector<int> &a, int length, std::vector<int> &q, int &num){
-
-  int i,j=0;
-
-  for (i=0 ; i < length ; i++){
-    if (a[i]!=0){
-      q[j]=i+1;
-      j=j+1;
-    }
-  }
-  num=j;
-}
-
-int minVec(std::vector<int> &a,int n){
-//   vector<int> a(n);
-//   copyVec(aa,n,a);
-  int i;
-  int s=a[0];
-
-  for (i=1;i<n ;i++){
-    if (s>a[i]){
-      s=a[i];
-    }
-  }
-  return s;
-}
-
-int maxVec(std::vector<int> &a,int n){
-//   vector<int> a(n);
-//   copyVec(aa,n,a);
-  int i;
-  int s=a[0];
-
-  for (i=1;i<n ;i++){
-    if (s<a[i]){
-      s=a[i];
-    }
-  }
-  return s;
-}
-
-std::vector<std::vector<int> > ones(int row, int col){
-  std::vector<std::vector<int> > tmp(row, std::vector<int> (col));
-  for (int i=0 ; i < row ; i++){
-    for (int j=0 ; j < col ; j++){
-      tmp[i][j]=1;
-    }
-  }
-  return tmp;
-}
-
-void plotSceneViewer(int app, char* bffer, std::vector<int> &color,
-                      std::vector<std::vector<double> > &x,
-                      std::vector<std::vector<double> > &y,
-                      std::vector<std::vector<double> > &z, int ROW, int COL,
-                      std::vector<std::vector<int> > &mask){
-
-  std::fstream outfile;
-  if (app==0){
-    outfile.open(bffer, std::ios::out);
-  }else{
-    outfile.open(bffer, std::ios::out | std::ios::app);
-  }
-
-  if (outfile.fail())
-    {
-      Msg::Error("Could not open readfile.txt");
-      exit(1);
-    }
-  if (app==0){//not appending
-    outfile  << "#Inventor V2.1 ascii" << std::endl;
-    outfile  << "#created by allplot.cpp" << std::endl;
-  }
-
-  outfile  << "Separator {" << std::endl;
-  outfile  << "  Material {" << std::endl;
-  outfile  << "    diffuseColor [" << std::endl;
-  outfile  << "      " << ' ' << color[0] << ' ' << color[1] << ' ' << color[2] << std::endl;
-  outfile  << "    ]" << std::endl;
-  outfile  << "  }" << std::endl;
-  outfile  << "  IndexedTriangleStripSet {" << std::endl;;
-  outfile  << "    vertexProperty VertexProperty {"<< std::endl;;
-  outfile  << "      vertex [" << std::endl;
-  //outfile  << "        " << ' ' << x(0,0) << ' ' << y(0,0) << ' ' << z(0,0);
-
-  int i, j;
-
-  for (j=0 ; j < COL ; j++){
-    for (i=0 ; i < ROW ; i++){
-      if (i==0 & j==0 ){
-          outfile  << "        " << ' ' << x[i][j] << ' ' << y[i][j] << ' ' << z[i][j];
-      }else{
-        outfile  <<"," << ' ' << ' ' << std::endl;
-        outfile  << "        " << ' ' << x[i][j] << ' ' << y[i][j] << ' ' << z[i][j];
-      }
-    }
-  }
-
-  outfile  <<' ' << std::endl;
-  outfile  << "      ]" << std::endl;
-  outfile  << "    }" << std::endl;
-  outfile  << "    coordIndex [" << std::endl;
-
-  int jump=ROW;
-  int col, row;
-  int startrow, startoffset, endrow, endoffset;
-  std::vector<int> qq(ROW), qw(ROW);
-  int num1,num2,min1,min2,max1,max2;
-
-  //  for (col=0 ; col < ROW-1 ; col++){
-  for (col=0 ; col < COL-1 ; col++){
-    //copyColToVec(mask, ROW, col, qq);
-    for (int i=0 ; i < ROW ; i++){
-      qq[i]=mask[i][col];
-    }
-
-    find(qq, ROW, qw,  num1);//cout << num1 << endl;
-
-    if (num1!=0){
-      min1=minVec(qw,num1);
-      max1=maxVec(qw,num1);
-    }
-
-    //  copyColToVec(mask, ROW, col+1, qq);
-    for (int i=0 ; i < ROW ; i++){
-      qq[i]=mask[i][col+1];
-    }
-
-    find(qq, ROW, qw,  num2);
-    if (num2!=0){
-      min2=minVec(qw,num2);
-      max2=maxVec(qw,num2);
-    }
-
-    if (num1!=0 & num2!=0){
-      startrow=std::max(min1,min2)-1;
-      startoffset=min1-min2;
-
-      if (startoffset>0){
-        outfile  << "     " << ' ' << (col+1)*jump+startrow << ' ' <<"," << ' ' <<
-          col*jump+startrow << ' ' <<"," << ' ' << (col+1)*jump+startrow-1  << ' '<<"," << ' ' << "-1,"<< std::endl;
-      }else if (startoffset<0){
-        outfile  << "     " << ' ' << (col+1)*jump+startrow << ' ' <<"," << ' '<< 
-          col*jump+startrow << ' ' <<"," << ' ' << col*jump+startrow-1 <<' ' << "," << ' ' << "-1,"<< std::endl;
-      }
-
-      endrow=std::min(max1,max2)-1;
-      endoffset=max1-max2;
-
-      if (endoffset>0){
-        outfile  << "     " << ' ' <<(col+1)*jump+endrow<< ' ' <<"," << ' ' <<
-          col*jump+endrow+1 << ' ' <<"," << ' ' << col*jump+endrow << ' '<< "," << ' ' << "-1,"<<std::endl;
-      }else if (endoffset<0){
-        outfile  << "     " << ' ' <<(col+1)*jump+endrow << ' ' << "," << ' ' <<
-          (col+1)*jump+endrow+1 << ' ' <<"," << ' ' << col*jump+endrow <<' ' <<"," << ' ' << "-1,"<< std::endl;
-      }
-
-      outfile << "     " << ' ' << col*jump+startrow << ' ' <<"," << ' ' << (col+1)*jump+startrow<< ' ' << "," ;
-
-      for (row= startrow+1; row <= endrow ; row++){
-        outfile << col*jump+row << ' '  <<"," << ' '<< (col+1)*jump+row<< ' ' << ",";
-      }
-    }
-      outfile << " -1," << std::endl;
-  }
-
-  outfile  << "    ]" << std::endl;
-  outfile  << "  }" << std::endl;
-  outfile  << "}" << std::endl;
-
-  outfile.close();
-}
diff --git a/contrib/FourierModel/Utils.h b/contrib/FourierModel/Utils.h
deleted file mode 100755
index a33fe45c1f..0000000000
--- a/contrib/FourierModel/Utils.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef _UTILS_H_
-#define _UTILS_H_
-
-#include <cmath>
-#include <vector>
-#include <fstream>
-#include <iostream>
-
-std::vector<double> SolveCubic(double a, double b, double c);
-std::vector<double> SolveCubic(double a, double b, double c, double d);
-std::vector<std::vector<int> > ones(int row, int col);
-void plotSceneViewer(int app, char* bffer, std::vector<int>& color,
-                      std::vector<std::vector<double> > &x,
-                      std::vector<std::vector<double> > &y,
-                      std::vector<std::vector<double> > &z, int ROW, int COL,
-                      std::vector<std::vector<int> > &mask);
-
-#endif
-- 
GitLab