diff --git a/Common/CommandLine.cpp b/Common/CommandLine.cpp
index a20cec15494731f9ebd7d28777b60e4fdd4bf860..e72ae9981a8a15596e6214b61e68701871a389e9 100644
--- a/Common/CommandLine.cpp
+++ b/Common/CommandLine.cpp
@@ -499,336 +499,12 @@ void GetOptions(int argc, char *argv[])
 #if defined(HAVE_MESH)
       else if(!strcmp(argv[i] + 1, "microstructure")) {
         i++;
-        int j;
-        int radical;
-        double max;
-        double xMax;
-        double yMax;
-        double zMax;
-        std::vector<double> properties;
-        if(argv[i]){
-          std::ifstream file(argv[i++]);
-          file >> max;
-          file >> radical;
-          file >> xMax;
-          file >> yMax;
-          file >> zMax;
-          properties.clear();
-          properties.resize(4*max);
-          for(j=0;j<max;j++){
-            file >> properties[4*j];
-            file >> properties[4*j+1];
-            file >> properties[4*j+2];
-            file >> properties[4*j+3];
-          }
-          voroMetal3D vm1;
-          vm1.execute(properties,radical,0.1,xMax,yMax,zMax);
-          GModel::current()->load("MicrostructurePolycrystal3D.geo");
-          voroMetal3D vm2;
-          vm2.correspondance(0.00001,xMax,yMax,zMax);
-        }
+        if(argv[i]) microstructure(argv[i++]);
       }
       else if(!strcmp(argv[i] + 1, "computeBestSeeds")) {
-              i++;
-              int j;
-              int radical;
-              double max;
-              double xMax;
-              double yMax;
-              double zMax;
-              std::vector<double> properties;
-              std::cout<<"entree dans computeBestSeeds"<<std::endl;
-              if(argv[i]){
-                std::ifstream file(argv[i++]);
-                file >> max;
-                file >> radical;
-                file >> xMax;
-                file >> yMax;
-                file >> zMax;
-                properties.clear();
-                properties.resize(4*max);
-                for(j=0;j<max;j++){
-                  file >> properties[4*j];
-                  file >> properties[4*j+1];
-                  file >> properties[4*j+2];
-                  file >> properties[4*j+3];
-                }
-                std::cout<<"Before count"<<std::endl;
-                std::vector<double> listDistances;
-                listDistances.clear();
-                int nbOfCount = 17;
-                listDistances.resize(nbOfCount);
-                for (int Count = 0; Count < nbOfCount; Count++){
-                	std::cout<<"Count"<<Count<<std::endl;
-                	double distMinGlobal = 0.0;
-                	int jMinGlobal = 0;
-                	int xORyORz = 0;
-                	int posORneg = 0;
-                	for(j=0;j<max;j++){
-                		std::cout<<"j "<<j<<std::endl;
-                		std::vector<double> propertiesModified;
-                		propertiesModified.clear();
-                		propertiesModified.resize(4*max);
-                		std::cout<<"before assign propModif"<<std::endl;
-                		for(unsigned int k=0;k < properties.size();k++){
-                			propertiesModified[k] = properties[k];
-                		}
-                		std::cout<<"after assign propModif"<<std::endl;
-                		propertiesModified[4*j] += 0.01;
-                		voroMetal3D vm1;
-                		std::cout<<"before execute"<<std::endl;
-                		//std::remove("MicrostructurePolycrystal3D.geo");
-                		vm1.execute(propertiesModified,radical,0.1,xMax,yMax,zMax);
-                		//GModel::current()->destroy();
-                		GModel *m = new GModel();
-                		//GModel::current()->load("MicrostructurePolycrystal3D.geo");
-                		m->load("MicrostructurePolycrystal3D.geo");
-                		double distMinTmp = 1000.0;
-                		//GModel *m = GModel::current();
-                		for (GModel::eiter ite= m->firstEdge();ite != m->lastEdge();ite++){
-                			GEdge* eTmp = (*ite);
-                			GVertex* vTmp1 = eTmp->getBeginVertex();
-                			GVertex* vTmp2 = eTmp->getEndVertex();
-                			double distTmp = sqrt((vTmp1->x() -  vTmp2->x()) * (vTmp1->x() -  vTmp2->x()) + (vTmp1->y() -  vTmp2->y()) * (vTmp1->y() -  vTmp2->y()) + (vTmp1->z() -  vTmp2->z()) * (vTmp1->z() -  vTmp2->z()));
-                			if (distTmp < distMinTmp){
-                				distMinTmp = distTmp;
-                			}
-                		}
-                		if (distMinTmp > distMinGlobal){
-                			distMinGlobal = distMinTmp;
-                			jMinGlobal = j;
-                			xORyORz = 1;
-                			posORneg = 1;
-                		}
-                		delete m;
-                	}
-                	for(j=0;j<max;j++){
-                		std::cout<<"j "<<j<<std::endl;
-                		std::vector<double> propertiesModified;
-                		propertiesModified.clear();
-                		propertiesModified.resize(4*max);
-                		std::cout<<"before assign propModif"<<std::endl;
-                		for(unsigned int k=0;k < properties.size();k++){
-                			propertiesModified[k] = properties[k];
-                		}
-                		std::cout<<"after assign propModif"<<std::endl;
-                		propertiesModified[4*j + 1] += 0.01;
-                		voroMetal3D vm1;
-                		std::cout<<"before execute"<<std::endl;
-                		//std::remove("MicrostructurePolycrystal3D.geo");
-                		vm1.execute(propertiesModified,radical,0.1,xMax,yMax,zMax);
-                		//GModel::current()->destroy();
-                		GModel *m = new GModel();
-                		//GModel::current()->load("MicrostructurePolycrystal3D.geo");
-                		m->load("MicrostructurePolycrystal3D.geo");
-                		double distMinTmp = 1000.0;
-                		//GModel *m = GModel::current();
-                		for (GModel::eiter ite= m->firstEdge();ite != m->lastEdge();ite++){
-                			GEdge* eTmp = (*ite);
-                			GVertex* vTmp1 = eTmp->getBeginVertex();
-                			GVertex* vTmp2 = eTmp->getEndVertex();
-                			double distTmp = sqrt((vTmp1->x() -  vTmp2->x()) * (vTmp1->x() -  vTmp2->x()) + (vTmp1->y() -  vTmp2->y()) * (vTmp1->y() -  vTmp2->y()) + (vTmp1->z() -  vTmp2->z()) * (vTmp1->z() -  vTmp2->z()));
-                			if (distTmp < distMinTmp){
-                				distMinTmp = distTmp;
-                			}
-                		}
-                		if (distMinTmp > distMinGlobal){
-                			distMinGlobal = distMinTmp;
-                			jMinGlobal = j;
-                			xORyORz = 2;
-                			posORneg = 1;
-                		}
-                		delete m;
-                	}
-                	for(j=0;j<max;j++){
-                		std::cout<<"j "<<j<<std::endl;
-                		std::vector<double> propertiesModified;
-                		propertiesModified.clear();
-                		propertiesModified.resize(4*max);
-                		std::cout<<"before assign propModif"<<std::endl;
-                		for(unsigned int k=0;k < properties.size();k++){
-                			propertiesModified[k] = properties[k];
-                		}
-                		std::cout<<"after assign propModif"<<std::endl;
-                		propertiesModified[4*j + 2] += 0.01;
-                		voroMetal3D vm1;
-                		std::cout<<"before execute"<<std::endl;
-                		//std::remove("MicrostructurePolycrystal3D.geo");
-                		vm1.execute(propertiesModified,radical,0.1,xMax,yMax,zMax);
-                		//GModel::current()->destroy();
-                		GModel *m = new GModel();
-                		//GModel::current()->load("MicrostructurePolycrystal3D.geo");
-                		m->load("MicrostructurePolycrystal3D.geo");
-                		double distMinTmp = 1000.0;
-                		//GModel *m = GModel::current();
-                		for (GModel::eiter ite= m->firstEdge();ite != m->lastEdge();ite++){
-                			GEdge* eTmp = (*ite);
-                			GVertex* vTmp1 = eTmp->getBeginVertex();
-                			GVertex* vTmp2 = eTmp->getEndVertex();
-                			double distTmp = sqrt((vTmp1->x() -  vTmp2->x()) * (vTmp1->x() -  vTmp2->x()) + (vTmp1->y() -  vTmp2->y()) * (vTmp1->y() -  vTmp2->y()) + (vTmp1->z() -  vTmp2->z()) * (vTmp1->z() -  vTmp2->z()));
-                			if (distTmp < distMinTmp){
-                				distMinTmp = distTmp;
-                			}
-                		}
-                		if (distMinTmp > distMinGlobal){
-                			distMinGlobal = distMinTmp;
-                			jMinGlobal = j;
-                			xORyORz = 3;
-                			posORneg = 1;
-                		}
-                		delete m;
-                	}
-                	for(j=0;j<max;j++){
-                		std::cout<<"j "<<j<<std::endl;
-                		std::vector<double> propertiesModified;
-                		propertiesModified.clear();
-                		propertiesModified.resize(4*max);
-                		std::cout<<"before assign propModif"<<std::endl;
-                		for(unsigned int k=0;k < properties.size();k++){
-                			propertiesModified[k] = properties[k];
-                		}
-                		std::cout<<"after assign propModif"<<std::endl;
-                		propertiesModified[4*j] -= 0.01;
-                		voroMetal3D vm1;
-                		std::cout<<"before execute"<<std::endl;
-                		//std::remove("MicrostructurePolycrystal3D.geo");
-                		vm1.execute(propertiesModified,radical,0.1,xMax,yMax,zMax);
-                		//GModel::current()->destroy();
-                		GModel *m = new GModel();
-                		//GModel::current()->load("MicrostructurePolycrystal3D.geo");
-                		m->load("MicrostructurePolycrystal3D.geo");
-                		double distMinTmp = 1000.0;
-                		//GModel *m = GModel::current();
-                		for (GModel::eiter ite= m->firstEdge();ite != m->lastEdge();ite++){
-                			GEdge* eTmp = (*ite);
-                			GVertex* vTmp1 = eTmp->getBeginVertex();
-                			GVertex* vTmp2 = eTmp->getEndVertex();
-                			double distTmp = sqrt((vTmp1->x() -  vTmp2->x()) * (vTmp1->x() -  vTmp2->x()) + (vTmp1->y() -  vTmp2->y()) * (vTmp1->y() -  vTmp2->y()) + (vTmp1->z() -  vTmp2->z()) * (vTmp1->z() -  vTmp2->z()));
-                			if (distTmp < distMinTmp){
-                				distMinTmp = distTmp;
-                			}
-                		}
-                		if (distMinTmp > distMinGlobal){
-                			distMinGlobal = distMinTmp;
-                			jMinGlobal = j;
-                			xORyORz = 1;
-                			posORneg = 2;
-                		}
-                		delete m;
-                	}
-                	for(j=0;j<max;j++){
-                		std::cout<<"j "<<j<<std::endl;
-                		std::vector<double> propertiesModified;
-                		propertiesModified.clear();
-                		propertiesModified.resize(4*max);
-                		std::cout<<"before assign propModif"<<std::endl;
-                		for(unsigned int k=0;k < properties.size();k++){
-                			propertiesModified[k] = properties[k];
-                		}
-                		std::cout<<"after assign propModif"<<std::endl;
-                		propertiesModified[4*j + 1] -= 0.01;
-                		voroMetal3D vm1;
-                		std::cout<<"before execute"<<std::endl;
-                		//std::remove("MicrostructurePolycrystal3D.geo");
-                		vm1.execute(propertiesModified,radical,0.1,xMax,yMax,zMax);
-                		//GModel::current()->destroy();
-                		GModel *m = new GModel();
-                		//GModel::current()->load("MicrostructurePolycrystal3D.geo");
-                		m->load("MicrostructurePolycrystal3D.geo");
-                		double distMinTmp = 1000.0;
-                		//GModel *m = GModel::current();
-                		for (GModel::eiter ite= m->firstEdge();ite != m->lastEdge();ite++){
-                			GEdge* eTmp = (*ite);
-                			GVertex* vTmp1 = eTmp->getBeginVertex();
-                			GVertex* vTmp2 = eTmp->getEndVertex();
-                			double distTmp = sqrt((vTmp1->x() -  vTmp2->x()) * (vTmp1->x() -  vTmp2->x()) + (vTmp1->y() -  vTmp2->y()) * (vTmp1->y() -  vTmp2->y()) + (vTmp1->z() -  vTmp2->z()) * (vTmp1->z() -  vTmp2->z()));
-                			if (distTmp < distMinTmp){
-                				distMinTmp = distTmp;
-                			}
-                		}
-                		if (distMinTmp > distMinGlobal){
-                			distMinGlobal = distMinTmp;
-                			jMinGlobal = j;
-                			xORyORz = 2;
-                			posORneg = 2;
-                		}
-                		delete m;
-                	}
-                	for(j=0;j<max;j++){
-                		std::cout<<"j "<<j<<std::endl;
-                		std::vector<double> propertiesModified;
-                		propertiesModified.clear();
-                		propertiesModified.resize(4*max);
-                		std::cout<<"before assign propModif"<<std::endl;
-                		for(unsigned int k=0;k < properties.size();k++){
-                			propertiesModified[k] = properties[k];
-                		}
-                		std::cout<<"after assign propModif"<<std::endl;
-                		propertiesModified[4*j + 2] -= 0.01;
-                		voroMetal3D vm1;
-                		std::cout<<"before execute"<<std::endl;
-                		//std::remove("MicrostructurePolycrystal3D.geo");
-                		vm1.execute(propertiesModified,radical,0.1,xMax,yMax,zMax);
-                		//GModel::current()->destroy();
-                		GModel *m = new GModel();
-                		//GModel::current()->load("MicrostructurePolycrystal3D.geo");
-                		m->load("MicrostructurePolycrystal3D.geo");
-                		double distMinTmp = 1000.0;
-                		//GModel *m = GModel::current();
-                		for (GModel::eiter ite= m->firstEdge();ite != m->lastEdge();ite++){
-                			GEdge* eTmp = (*ite);
-                			GVertex* vTmp1 = eTmp->getBeginVertex();
-                			GVertex* vTmp2 = eTmp->getEndVertex();
-                			double distTmp = sqrt((vTmp1->x() -  vTmp2->x()) * (vTmp1->x() -  vTmp2->x()) + (vTmp1->y() -  vTmp2->y()) * (vTmp1->y() -  vTmp2->y()) + (vTmp1->z() -  vTmp2->z()) * (vTmp1->z() -  vTmp2->z()));
-                			if (distTmp < distMinTmp){
-                				distMinTmp = distTmp;
-                			}
-                		}
-                		if (distMinTmp > distMinGlobal){
-                			distMinGlobal = distMinTmp;
-                			jMinGlobal = j;
-                			xORyORz = 3;
-                			posORneg = 2;
-                		}
-                		delete m;
-                	}
-                	std::cout<<"distance minimale de "<<distMinGlobal<<std::endl;
-                	listDistances[Count] = distMinGlobal;
-                	if (xORyORz == 1){
-                		if (posORneg == 1){
-                			properties[4*jMinGlobal] += 0.01;
-                		} else if (posORneg == 2){
-                			properties[4*jMinGlobal] -= 0.01;
-                		}
-                	} else if (xORyORz == 2){
-                		if (posORneg == 1){
-                			properties[4*jMinGlobal + 1] += 0.01;
-                		} else if (posORneg == 2){
-                			properties[4*jMinGlobal + 1] -= 0.01;
-                		}
-                	} else if (xORyORz == 3){
-                		if (posORneg == 1){
-                			properties[4*jMinGlobal + 2] += 0.01;
-                		} else if (posORneg == 2){
-                			properties[4*jMinGlobal + 2] -= 0.01;
-                		}
-                	}
-                }
-                voroMetal3D vm1;
-                vm1.execute(properties,radical,0.1,xMax,yMax,zMax);
-                GModel::current()->load("MicrostructurePolycrystal3D.geo");
-                voroMetal3D vm2;
-                vm2.correspondance(0.00001,xMax,yMax,zMax);
-                for (unsigned int iTmp = 0; iTmp < listDistances.size();iTmp++){
-                	std::cout<<"distMinGlobal "<<iTmp<<" egale a "<<listDistances[iTmp]<<std::endl;
-                }
-                std::cout<<"liste des nouveaux seeds :"<<std::endl;
-                for(unsigned int iTmp = 0; iTmp < max;iTmp++){
-                	std::cout<<properties[4*iTmp]<<" "<<properties[4*iTmp + 1]<<" "<<properties[4*iTmp + 2]<<" "<<properties[4*iTmp + 3]<<std::endl;
-
-                }
-              }
-            }
+        i++;
+        if(argv[i]) computeBestSeeds(argv[i++]);
+      }
 #endif
       else if(!strcmp(argv[i] + 1, "nopopup")) {
         CTX::instance()->noPopup = 1;
diff --git a/Mesh/periodical.cpp b/Mesh/periodical.cpp
index b2b3d6b63bab95f84b4ddb2e2660d1d1fd5c2c11..4b13aec65219277c5dbc8c47a65acca12270d837 100644
--- a/Mesh/periodical.cpp
+++ b/Mesh/periodical.cpp
@@ -937,3 +937,339 @@ bool voroMetal3D::equal(double x,double y,double e){
 
   return flag;
 }
+
+
+void microstructure(const char *filename)
+{
+  int j;
+  int radical;
+  double max;
+  double xMax;
+  double yMax;
+  double zMax;
+  std::vector<double> properties;
+  if(filename){
+    std::ifstream file(filename);
+    file >> max;
+    file >> radical;
+    file >> xMax;
+    file >> yMax;
+    file >> zMax;
+    properties.clear();
+    properties.resize(4*max);
+    for(j=0;j<max;j++){
+      file >> properties[4*j];
+      file >> properties[4*j+1];
+      file >> properties[4*j+2];
+      file >> properties[4*j+3];
+    }
+    voroMetal3D vm1;
+    vm1.execute(properties,radical,0.1,xMax,yMax,zMax);
+    GModel::current()->load("MicrostructurePolycrystal3D.geo");
+    voroMetal3D vm2;
+    vm2.correspondance(0.00001,xMax,yMax,zMax);
+  }
+}
+
+void computeBestSeeds(const char *filename)
+{
+  int j;
+  int radical;
+  double max;
+  double xMax;
+  double yMax;
+  double zMax;
+  std::vector<double> properties;
+  std::cout<<"entree dans computeBestSeeds"<<std::endl;
+  if(filename){
+    std::ifstream file(filename);
+    file >> max;
+    file >> radical;
+    file >> xMax;
+    file >> yMax;
+    file >> zMax;
+    properties.clear();
+    properties.resize(4*max);
+    for(j=0;j<max;j++){
+      file >> properties[4*j];
+      file >> properties[4*j+1];
+      file >> properties[4*j+2];
+      file >> properties[4*j+3];
+    }
+    std::cout<<"Before count"<<std::endl;
+    std::vector<double> listDistances;
+    listDistances.clear();
+    int nbOfCount = 17;
+    listDistances.resize(nbOfCount);
+    for (int Count = 0; Count < nbOfCount; Count++){
+      std::cout<<"Count"<<Count<<std::endl;
+      double distMinGlobal = 0.0;
+      int jMinGlobal = 0;
+      int xORyORz = 0;
+      int posORneg = 0;
+      for(j=0;j<max;j++){
+        std::cout<<"j "<<j<<std::endl;
+        std::vector<double> propertiesModified;
+        propertiesModified.clear();
+        propertiesModified.resize(4*max);
+        std::cout<<"before assign propModif"<<std::endl;
+        for(unsigned int k=0;k < properties.size();k++){
+          propertiesModified[k] = properties[k];
+        }
+        std::cout<<"after assign propModif"<<std::endl;
+        propertiesModified[4*j] += 0.01;
+        voroMetal3D vm1;
+        std::cout<<"before execute"<<std::endl;
+        //std::remove("MicrostructurePolycrystal3D.geo");
+        vm1.execute(propertiesModified,radical,0.1,xMax,yMax,zMax);
+        //GModel::current()->destroy();
+        GModel *m = new GModel();
+        //GModel::current()->load("MicrostructurePolycrystal3D.geo");
+        m->load("MicrostructurePolycrystal3D.geo");
+        double distMinTmp = 1000.0;
+        //GModel *m = GModel::current();
+        for (GModel::eiter ite= m->firstEdge();ite != m->lastEdge();ite++){
+          GEdge* eTmp = (*ite);
+          GVertex* vTmp1 = eTmp->getBeginVertex();
+          GVertex* vTmp2 = eTmp->getEndVertex();
+          double distTmp = sqrt((vTmp1->x() -  vTmp2->x()) * (vTmp1->x() -  vTmp2->x()) + (vTmp1->y() -  vTmp2->y()) * (vTmp1->y() -  vTmp2->y()) + (vTmp1->z() -  vTmp2->z()) * (vTmp1->z() -  vTmp2->z()));
+          if (distTmp < distMinTmp){
+            distMinTmp = distTmp;
+          }
+        }
+        if (distMinTmp > distMinGlobal){
+          distMinGlobal = distMinTmp;
+          jMinGlobal = j;
+          xORyORz = 1;
+          posORneg = 1;
+        }
+        delete m;
+      }
+      for(j=0;j<max;j++){
+        std::cout<<"j "<<j<<std::endl;
+        std::vector<double> propertiesModified;
+        propertiesModified.clear();
+        propertiesModified.resize(4*max);
+        std::cout<<"before assign propModif"<<std::endl;
+        for(unsigned int k=0;k < properties.size();k++){
+          propertiesModified[k] = properties[k];
+        }
+        std::cout<<"after assign propModif"<<std::endl;
+        propertiesModified[4*j + 1] += 0.01;
+        voroMetal3D vm1;
+        std::cout<<"before execute"<<std::endl;
+        //std::remove("MicrostructurePolycrystal3D.geo");
+        vm1.execute(propertiesModified,radical,0.1,xMax,yMax,zMax);
+        //GModel::current()->destroy();
+        GModel *m = new GModel();
+        //GModel::current()->load("MicrostructurePolycrystal3D.geo");
+        m->load("MicrostructurePolycrystal3D.geo");
+        double distMinTmp = 1000.0;
+        //GModel *m = GModel::current();
+        for (GModel::eiter ite= m->firstEdge();ite != m->lastEdge();ite++){
+          GEdge* eTmp = (*ite);
+          GVertex* vTmp1 = eTmp->getBeginVertex();
+          GVertex* vTmp2 = eTmp->getEndVertex();
+          double distTmp = sqrt((vTmp1->x() -  vTmp2->x()) * (vTmp1->x() -  vTmp2->x()) + (vTmp1->y() -  vTmp2->y()) * (vTmp1->y() -  vTmp2->y()) + (vTmp1->z() -  vTmp2->z()) * (vTmp1->z() -  vTmp2->z()));
+          if (distTmp < distMinTmp){
+            distMinTmp = distTmp;
+          }
+        }
+        if (distMinTmp > distMinGlobal){
+          distMinGlobal = distMinTmp;
+          jMinGlobal = j;
+          xORyORz = 2;
+          posORneg = 1;
+        }
+        delete m;
+      }
+      for(j=0;j<max;j++){
+        std::cout<<"j "<<j<<std::endl;
+        std::vector<double> propertiesModified;
+        propertiesModified.clear();
+        propertiesModified.resize(4*max);
+        std::cout<<"before assign propModif"<<std::endl;
+        for(unsigned int k=0;k < properties.size();k++){
+          propertiesModified[k] = properties[k];
+        }
+        std::cout<<"after assign propModif"<<std::endl;
+        propertiesModified[4*j + 2] += 0.01;
+        voroMetal3D vm1;
+        std::cout<<"before execute"<<std::endl;
+        //std::remove("MicrostructurePolycrystal3D.geo");
+        vm1.execute(propertiesModified,radical,0.1,xMax,yMax,zMax);
+        //GModel::current()->destroy();
+        GModel *m = new GModel();
+        //GModel::current()->load("MicrostructurePolycrystal3D.geo");
+        m->load("MicrostructurePolycrystal3D.geo");
+        double distMinTmp = 1000.0;
+        //GModel *m = GModel::current();
+        for (GModel::eiter ite= m->firstEdge();ite != m->lastEdge();ite++){
+          GEdge* eTmp = (*ite);
+          GVertex* vTmp1 = eTmp->getBeginVertex();
+          GVertex* vTmp2 = eTmp->getEndVertex();
+          double distTmp = sqrt((vTmp1->x() -  vTmp2->x()) * (vTmp1->x() -  vTmp2->x()) + (vTmp1->y() -  vTmp2->y()) * (vTmp1->y() -  vTmp2->y()) + (vTmp1->z() -  vTmp2->z()) * (vTmp1->z() -  vTmp2->z()));
+          if (distTmp < distMinTmp){
+            distMinTmp = distTmp;
+          }
+        }
+        if (distMinTmp > distMinGlobal){
+          distMinGlobal = distMinTmp;
+          jMinGlobal = j;
+          xORyORz = 3;
+          posORneg = 1;
+        }
+        delete m;
+      }
+      for(j=0;j<max;j++){
+        std::cout<<"j "<<j<<std::endl;
+        std::vector<double> propertiesModified;
+        propertiesModified.clear();
+        propertiesModified.resize(4*max);
+        std::cout<<"before assign propModif"<<std::endl;
+        for(unsigned int k=0;k < properties.size();k++){
+          propertiesModified[k] = properties[k];
+        }
+        std::cout<<"after assign propModif"<<std::endl;
+        propertiesModified[4*j] -= 0.01;
+        voroMetal3D vm1;
+        std::cout<<"before execute"<<std::endl;
+        //std::remove("MicrostructurePolycrystal3D.geo");
+        vm1.execute(propertiesModified,radical,0.1,xMax,yMax,zMax);
+        //GModel::current()->destroy();
+        GModel *m = new GModel();
+        //GModel::current()->load("MicrostructurePolycrystal3D.geo");
+        m->load("MicrostructurePolycrystal3D.geo");
+        double distMinTmp = 1000.0;
+        //GModel *m = GModel::current();
+        for (GModel::eiter ite= m->firstEdge();ite != m->lastEdge();ite++){
+          GEdge* eTmp = (*ite);
+          GVertex* vTmp1 = eTmp->getBeginVertex();
+          GVertex* vTmp2 = eTmp->getEndVertex();
+          double distTmp = sqrt((vTmp1->x() -  vTmp2->x()) * (vTmp1->x() -  vTmp2->x()) + (vTmp1->y() -  vTmp2->y()) * (vTmp1->y() -  vTmp2->y()) + (vTmp1->z() -  vTmp2->z()) * (vTmp1->z() -  vTmp2->z()));
+          if (distTmp < distMinTmp){
+            distMinTmp = distTmp;
+          }
+        }
+        if (distMinTmp > distMinGlobal){
+          distMinGlobal = distMinTmp;
+          jMinGlobal = j;
+          xORyORz = 1;
+          posORneg = 2;
+        }
+        delete m;
+      }
+      for(j=0;j<max;j++){
+        std::cout<<"j "<<j<<std::endl;
+        std::vector<double> propertiesModified;
+        propertiesModified.clear();
+        propertiesModified.resize(4*max);
+        std::cout<<"before assign propModif"<<std::endl;
+        for(unsigned int k=0;k < properties.size();k++){
+          propertiesModified[k] = properties[k];
+        }
+        std::cout<<"after assign propModif"<<std::endl;
+        propertiesModified[4*j + 1] -= 0.01;
+        voroMetal3D vm1;
+        std::cout<<"before execute"<<std::endl;
+        //std::remove("MicrostructurePolycrystal3D.geo");
+        vm1.execute(propertiesModified,radical,0.1,xMax,yMax,zMax);
+        //GModel::current()->destroy();
+        GModel *m = new GModel();
+        //GModel::current()->load("MicrostructurePolycrystal3D.geo");
+        m->load("MicrostructurePolycrystal3D.geo");
+        double distMinTmp = 1000.0;
+        //GModel *m = GModel::current();
+        for (GModel::eiter ite= m->firstEdge();ite != m->lastEdge();ite++){
+          GEdge* eTmp = (*ite);
+          GVertex* vTmp1 = eTmp->getBeginVertex();
+          GVertex* vTmp2 = eTmp->getEndVertex();
+          double distTmp = sqrt((vTmp1->x() -  vTmp2->x()) * (vTmp1->x() -  vTmp2->x()) + (vTmp1->y() -  vTmp2->y()) * (vTmp1->y() -  vTmp2->y()) + (vTmp1->z() -  vTmp2->z()) * (vTmp1->z() -  vTmp2->z()));
+          if (distTmp < distMinTmp){
+            distMinTmp = distTmp;
+          }
+        }
+        if (distMinTmp > distMinGlobal){
+          distMinGlobal = distMinTmp;
+          jMinGlobal = j;
+          xORyORz = 2;
+          posORneg = 2;
+        }
+        delete m;
+      }
+      for(j=0;j<max;j++){
+        std::cout<<"j "<<j<<std::endl;
+        std::vector<double> propertiesModified;
+        propertiesModified.clear();
+        propertiesModified.resize(4*max);
+        std::cout<<"before assign propModif"<<std::endl;
+        for(unsigned int k=0;k < properties.size();k++){
+          propertiesModified[k] = properties[k];
+        }
+        std::cout<<"after assign propModif"<<std::endl;
+        propertiesModified[4*j + 2] -= 0.01;
+        voroMetal3D vm1;
+        std::cout<<"before execute"<<std::endl;
+        //std::remove("MicrostructurePolycrystal3D.geo");
+        vm1.execute(propertiesModified,radical,0.1,xMax,yMax,zMax);
+        //GModel::current()->destroy();
+        GModel *m = new GModel();
+        //GModel::current()->load("MicrostructurePolycrystal3D.geo");
+        m->load("MicrostructurePolycrystal3D.geo");
+        double distMinTmp = 1000.0;
+        //GModel *m = GModel::current();
+        for (GModel::eiter ite= m->firstEdge();ite != m->lastEdge();ite++){
+          GEdge* eTmp = (*ite);
+          GVertex* vTmp1 = eTmp->getBeginVertex();
+          GVertex* vTmp2 = eTmp->getEndVertex();
+          double distTmp = sqrt((vTmp1->x() -  vTmp2->x()) * (vTmp1->x() -  vTmp2->x()) + (vTmp1->y() -  vTmp2->y()) * (vTmp1->y() -  vTmp2->y()) + (vTmp1->z() -  vTmp2->z()) * (vTmp1->z() -  vTmp2->z()));
+          if (distTmp < distMinTmp){
+            distMinTmp = distTmp;
+          }
+        }
+        if (distMinTmp > distMinGlobal){
+          distMinGlobal = distMinTmp;
+          jMinGlobal = j;
+          xORyORz = 3;
+          posORneg = 2;
+        }
+        delete m;
+      }
+      std::cout<<"distance minimale de "<<distMinGlobal<<std::endl;
+      listDistances[Count] = distMinGlobal;
+      if (xORyORz == 1){
+        if (posORneg == 1){
+          properties[4*jMinGlobal] += 0.01;
+        } else if (posORneg == 2){
+          properties[4*jMinGlobal] -= 0.01;
+        }
+      } else if (xORyORz == 2){
+        if (posORneg == 1){
+          properties[4*jMinGlobal + 1] += 0.01;
+        } else if (posORneg == 2){
+          properties[4*jMinGlobal + 1] -= 0.01;
+        }
+      } else if (xORyORz == 3){
+        if (posORneg == 1){
+          properties[4*jMinGlobal + 2] += 0.01;
+        } else if (posORneg == 2){
+          properties[4*jMinGlobal + 2] -= 0.01;
+        }
+      }
+    }
+    voroMetal3D vm1;
+    vm1.execute(properties,radical,0.1,xMax,yMax,zMax);
+    GModel::current()->load("MicrostructurePolycrystal3D.geo");
+    voroMetal3D vm2;
+    vm2.correspondance(0.00001,xMax,yMax,zMax);
+    for (unsigned int iTmp = 0; iTmp < listDistances.size();iTmp++){
+      std::cout<<"distMinGlobal "<<iTmp<<" egale a "<<listDistances[iTmp]<<std::endl;
+    }
+    std::cout<<"liste des nouveaux seeds :"<<std::endl;
+    for(unsigned int iTmp = 0; iTmp < max;iTmp++){
+      std::cout<<properties[4*iTmp]<<" "<<properties[4*iTmp + 1]<<" "<<properties[4*iTmp + 2]<<" "<<properties[4*iTmp + 3]<<std::endl;
+
+    }
+  }
+}
+
diff --git a/Mesh/periodical.h b/Mesh/periodical.h
index a794d65aff1983f05897fe82c9b428cac33f5158..a0dff0718b164d7b5c2216a95e39b309eaa04a23 100644
--- a/Mesh/periodical.h
+++ b/Mesh/periodical.h
@@ -35,3 +35,9 @@ class voroMetal3D{
   void correspondance(double,double,double,double,int,bool&,double,double,double);
   bool equal(double,double,double);
 };
+
+
+void microstructure(const char *filename);
+void computeBestSeeds(const char *filename);
+
+