From ee7acf2b3d9d61f4bab5cd6bf8942b9c353d3f47 Mon Sep 17 00:00:00 2001
From: Jonathan Lambrechts <jonathan.lambrechts@uclouvain.be>
Date: Wed, 2 May 2012 20:31:36 +0000
Subject: [PATCH] OptHom : split by bloc of connex elements

---
 contrib/HighOrderMeshOptimizer/OptHomRun.cpp | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/contrib/HighOrderMeshOptimizer/OptHomRun.cpp b/contrib/HighOrderMeshOptimizer/OptHomRun.cpp
index 61cb050989..8e8ee19478 100644
--- a/contrib/HighOrderMeshOptimizer/OptHomRun.cpp
+++ b/contrib/HighOrderMeshOptimizer/OptHomRun.cpp
@@ -263,7 +263,6 @@ std::set<MVertex*> filter2D_boundaryLayer(GFace *gf,
 					  std::set<MElement*> & badasses,
             std::set<MElement*> & result
             ) {
-  
   double jmin, jmax;
   MElement *worstDown = getTheWorstElementDown(badasses.begin(),badasses.end(),jmin);
   MElement *worstUp   = getTheWorstElementUp(badasses.begin(),badasses.end(),jmax);
@@ -417,12 +416,24 @@ void HighOrderMeshOptimizer (GModel *gm, OptHomParameters &p)
 	//	printf("START WITH %d bad asses\n",badasses.size());
 	if (badasses.size() == 0)continue;
       }
-      while (1){
+      if (p.filter == 0) {
+        std::set<MVertex*> toFix;
+        std::set<MElement*> toOptimize;
+        toFix = filterSimple(*itf, p.nbLayers, p.BARRIER_MIN, p.BARRIER_MAX, toOptimize);
+        std::vector<std::set<MElement*> > toOptimizeSplit = splitConnex(toOptimize);
+        for (int i = 0; i < toOptimizeSplit.size(); ++i) {
+          OptHOM temp(*itf, toOptimizeSplit[i], toFix, method);
+          temp.recalcJacDist();
+          temp.getJacDist(minJac, maxJac, distMaxBND, distAvgBND);
+          OptHomMessage("Optimizing a blob %i/%i composed of %4d elements  minJ %12.5E -- maxJ %12.5E", i, toOptimizeSplit.size(), toOptimizeSplit[i].size(), minJac, maxJac);
+          p.SUCCESS = std::min(p.SUCCESS,temp.optimize(p.weightFixed, p.weightFree, p.BARRIER_MIN, p.BARRIER_MAX, samples, p.itMax));
+        }
+      }
+      else while (1){
 	std::set<MVertex*> toFix;
   std::set<MElement*> toOptimize;
 
-	if (p.filter == 1) toFix = filter2D_boundaryLayer(*itf, p.nbLayers, p.BARRIER_MIN, p.BARRIER_MAX, p.DistanceFactor, badasses, toOptimize);
-	else toFix = filterSimple(*itf, p.nbLayers, p.BARRIER_MIN, p.BARRIER_MAX, toOptimize);
+	toFix = filter2D_boundaryLayer(*itf, p.nbLayers, p.BARRIER_MIN, p.BARRIER_MAX, p.DistanceFactor, badasses, toOptimize);
 	OptHOM temp(*itf, toOptimize, toFix, method);
 
 	temp.recalcJacDist();
@@ -438,7 +449,6 @@ void HighOrderMeshOptimizer (GModel *gm, OptHomParameters &p)
 //  temp.recalcJacDist();
 //  temp.getJacDist(minJac, maxJac, distMaxBND, distAvgBND);
 	temp.mesh.updateGEntityPositions();
-  if (p.filter == 0) break;
 	if (p.SUCCESS == -1) break;
 	ITER ++;
 	if (p.filter == 1 && ITER > badasses.size() * 2)break;
-- 
GitLab