From bb2f418ba9da6facaf62c151c557e885712837fd Mon Sep 17 00:00:00 2001
From: ErinKuci <Erin.Kuci@ulg.ac.be>
Date: Wed, 31 Oct 2018 21:44:33 +0100
Subject: [PATCH] check sesnitivity with fd; adapt conveks or the unconstrained
 case

---
 Ccore/onelab_optimize.geo |  8 +++---
 Ccore/onelab_optimize.py  | 56 ++++++++++++++++++---------------------
 Ccore/shape.py            |  2 +-
 Ccore/shp.plt             | 53 ------------------------------------
 Lbracket/topo.py          |  2 +-
 Team25/shape.pro          |  2 ++
 Team25/shape.py           |  2 +-
 7 files changed, 35 insertions(+), 90 deletions(-)
 delete mode 100644 Ccore/shp.plt

diff --git a/Ccore/onelab_optimize.geo b/Ccore/onelab_optimize.geo
index d4ce25f..49a767b 100644
--- a/Ccore/onelab_optimize.geo
+++ b/Ccore/onelab_optimize.geo
@@ -36,13 +36,13 @@ If(PerturbMesh == 1)
   Plugin(ModifyComponents).Expression1 = "y";
   Plugin(ModifyComponents).Expression2 = "z";
   Plugin(ModifyComponents).Run;
-  Save View[0] StrCat(modelpath, Sprintf("view_%g.msh",0));
+  //Save View[0] StrCat(modelpath, Sprintf("view_%g.msh",0));
 
   // relocate the vertices of the original mesh on the perturbed geometry
-
   RelocateMesh Point "*";
   RelocateMesh Line "*";
   RelocateMesh Surface "*";
+  Save StrCat(modelpath, modelName, Sprintf("Perturb_%g.msh",VelocityTag));
 
   // Create a view with the perturbed node coordinates as vector dataset
   Plugin(NewView).NumComp = 3;
@@ -52,7 +52,7 @@ If(PerturbMesh == 1)
   Plugin(ModifyComponents).Expression1 = "y";
   Plugin(ModifyComponents).Expression2 = "z";
   Plugin(ModifyComponents).Run;
-  Save View[1] StrCat(modelpath, Sprintf("view_%g.msh",1));
+  //Save View[1] StrCat(modelpath, Sprintf("view_%g.msh",1));
 
   // compute the velocity field by subtracting the two vector datasets
   Plugin(ModifyComponents).View = 0;
@@ -62,7 +62,7 @@ If(PerturbMesh == 1)
   Plugin(ModifyComponents).Expression2 = Sprintf("(w2 - v2)/(%g)", Perturbation);
   Plugin(ModifyComponents).Run;
   View.Name = "velocity";
-  Save View[0] StrCat(modelpath, Sprintf("view_%g.msh",2));
+  //Save View[0] StrCat(modelpath, Sprintf("view_%g.msh",2));
   Delete View[1];
   Save View[0] StrCat(modelpath, Sprintf("velocity_%g.msh",VelocityTag));
   SendToServer View[0] Sprintf("Optimization/Results/velocity_%g",VelocityTag);
diff --git a/Ccore/onelab_optimize.py b/Ccore/onelab_optimize.py
index e2a5124..0ec1b8f 100644
--- a/Ccore/onelab_optimize.py
+++ b/Ccore/onelab_optimize.py
@@ -2,6 +2,7 @@ import numpy as np
 import conveks
 import onelab
 import scipy.optimize as spo
+from shutil import copyfile
 
 c = onelab.client(__file__)
 x = {}
@@ -63,33 +64,38 @@ def grad(xFromOpti):
       grads.append(c.getNumber('Optimization/Results/dwdtau_'+str(dv)))
     return np.asarray(grads)
 
+def grad_fd(xFromOpti, obj, basefile, perturb):
+    # generate the perturbed meshes (for each design variable)
+    getVelocityField(x,perturb) 
+        
+    # run the simulation for the perturbed mesh
+    grads = []
+    for dv, var in x.iteritems():
+        copyfile(basefile+'Perturb_'+str(dv)+'.msh', basefile+'.msh')
+        c.runSubClient('myGetDP', mygetdp + '-solve GetPerformances') 
+        obj_perturb = c.getNumber('Optimization/Results/w')
+        grads.append((obj_perturb-obj)/perturb)
+    return np.asarray(grads)
+
 def test(n):
     if n==0: return
+    perturb = 1e-5
     tab = np.zeros((n+1,4))
     for step in range(n+1):
         xstep = x[0][2] + (x[0][3]-x[0][2])/float(n)*step
-        f,g,d = fobj([xstep]), grad([xstep])[0], 0
-        tab[step] = [xstep, f, g, d]
-        if step >= 2 :
-            tab[step-1][3] = (tab[step][1]-tab[step-2][1]) \
-                           / (tab[step][0]-tab[step-2][0])
-        if c.getString(c.name+'/Action') == 'stop':
-            exit(1)
-    print
-    for step in range(n+1):
-        ind1, ind2 = max(step-1,0), min(step+1,n)
-        tab[step][3] = (tab[ind2][1]-tab[ind1][1])/(tab[ind2][0]-tab[ind1][0])
+        f,g = fobj([xstep]), grad([xstep])[0]
+        g_fd = grad_fd([xstep], f, modelName, perturb)[0]
+        tab[step] = [xstep, f, g, g_fd]
         print "%4d" % step,
         for item in tab[step] : print "%3.6f" % item,
         print
-    return
+        if c.getString(c.name+'/Action') == 'stop': exit(1)
 
 def callbackF(Xi):
     print Xi
     if (c.getString(c.name+'/Action') == 'stop'):
         raise StopIteration 
         
-
 def Optimize(Optimizer):
     print Optimizer
     print x
@@ -114,22 +120,15 @@ def Optimize(Optimizer):
         for label, var in x.iteritems():
             x[label] = var
             initialPoint[label] = var[1]
-            lowerBound[label]   = var[2]
-            upperBound[label]   = var[3]
+            lowerBound[label] = var[2]
+            upperBound[label] = var[3]
         
         # Initialize the MMA optimizer
         conveks.mma.initialize(initialPoint, lowerBound, upperBound)
 
         # Set some options for MMA
-        conveks.mma.option.setNumber('General.Verbosity', 4) # def 4
-        #conveks.mma.option.setNumber('General.SaveHistory', 0)
-        #conveks.mma.option.setNumber('SubProblem.isRobustMoveLimit', 1) # def 1
-        #conveks.mma.option.setNumber('SubProblem.isRobustAsymptotes', 1) # def 1  
-        #conveks.mma.option.setNumber('SubProblem.type', 0)
-        #conveks.mma.option.setNumber('SubProblem.addConvexity', 0)
-        #conveks.mma.option.setNumber('SubProblem.asymptotesRmax', 100.0)
-        #conveks.mma.option.setNumber('SubProblem.asymptotesRmin', 0.001) # def 0.001
-
+        conveks.mma.option.setNumber('General.Verbosity', 0) # def 4
+        
         # Get iteration count (here it will be 1 - could be different in case of restart)
         it = conveks.mma.getOuterIteration()
         change_mma = 1.0
@@ -139,9 +138,6 @@ def Optimize(Optimizer):
 
             xFromMMA = conveks.mma.getCurrentPoint()
 
-            constraints = np.array([np.sum(xFromMMA)/10.0-1.0])
-            grad_constraints = np.ones(numVariables)/10.0
-
             if (c.getString(c.name+'/Action') == 'stop'): break
             obj = fobj(xFromMMA)
             if (c.getString(c.name+'/Action') == 'stop'): break
@@ -161,11 +157,11 @@ def Optimize(Optimizer):
             objective = obj*fscale
             grad_objective = grad_obj*fscale
 
-            c.sendInfo('Optimization: it. {}, obj. {}, constr. {}'.format(it,objective,constraints[0]))
+            c.sendInfo('Optimization: it. {}, obj. {}'.format(it,objective))
 
             # call MMA and update the current point
-            #conveks.mma.setMoveLimits(lowerBound, upperBound, 1e-4) # parametre interessant
-            conveks.mma.updateCurrentPoint(constraints, grad_objective, grad_constraints)
+            #conveks.mma.setMoveLimits(lowerBound, upperBound, 0.01) # parametre interessant
+            conveks.mma.updateCurrentPoint(grad_objective)
             change_mma = conveks.mma.getDesignChange()
             if change_mma < maxChange: break
             it = conveks.mma.getOuterIteration()
diff --git a/Ccore/shape.py b/Ccore/shape.py
index 8c75326..029dc79 100644
--- a/Ccore/shape.py
+++ b/Ccore/shape.py
@@ -212,7 +212,7 @@ elif Optimizer=='mma':
 
         # call MMA and update the current point
         #conveks.mma.setMoveLimits(lowerBound, upperBound, 1e-0) # parametre interessant
-        conveks.mma.updateCurrentPoint(constraints,grad_objective,grad_constraints)
+        conveks.mma.updateCurrentPoint(grad_objective,constraints,grad_constraints)
         change = conveks.mma.getDesignChange()
         it = conveks.mma.getOuterIteration()
 
diff --git a/Ccore/shp.plt b/Ccore/shp.plt
deleted file mode 100644
index 7fee2e8..0000000
--- a/Ccore/shp.plt
+++ /dev/null
@@ -1,53 +0,0 @@
-#set terminal pdf
-
-set grid
-set ytics nomirror
-set y2tics
-set style data lines
-
-set xlabel "tau"
-set y2label "w"
-set ylabel "dw/dtau"
-
-set output "aaa.pdf"
-plot "aaa" u 2:3 axis x1y2 t"w",\
-     "aaa" u 2:4 t"dwdt",\
-     "aaa" u 2:5 w linesp t"dwdt FD"
-
-pause -1
-
-set output "optishape1.pdf"
-plot "Torque_linTH.txt" u 2:3 axis x1y2 t"w",\
-     "Torque_linTH.txt" u 2:4 t"dwdt",\
-     "Torque_linTH.txt" u 2:5 w linesp t"dwdt FD"
-
-pause -1
-
-set output "optishape2.pdf"
-plot "LieDevSmoother.txt" u 2:3 axis x1y2 t"w",\
-     "LieDevSmoother.txt" u 2:4 t"dwdt",\
-     "LieDevSmoother.txt" u 2:5 w linesp t"dwdt FD"
-
-pause -1
-
-set output "optishape3.pdf"
-plot "Torque_linTH2.txt" u 2:3 axis x1y2 t"w",\
-     "Torque_linTH2.txt" u 2:4 t"dwdt",\
-     "Torque_linTH2.txt" u 2:5 w linesp t"dwdt FD"
-
-pause -1
-
-set output "optishape4.pdf"
-plot "LieDevSmoother2.txt" u 2:3 axis x1y2 t"w",\
-     "LieDevSmoother2.txt" u 2:4 t"dwdt",\
-     "LieDevSmoother2.txt" u 2:5 w linesp t"dwdt FD"
-
-pause -1
-
-set output "optishape5.pdf"
-plot "Torque_TH.txt" u 2:3 axis x1y2 t"w",\
-     "Torque_TH.txt" u 2:4 t"dwdt",\
-     "Torque_TH.txt" u 2:5 w linesp t"dwdt FD"
-
-pause -1
-
diff --git a/Lbracket/topo.py b/Lbracket/topo.py
index 40c77b3..92dd5b2 100644
--- a/Lbracket/topo.py
+++ b/Lbracket/topo.py
@@ -155,7 +155,7 @@ while change > maxChange and it <= maxIter and c.getString('topo/Action') != 'st
 
     # call MMA and update the current point
     #conveks.mma.setMoveLimits(lowerBound, upperBound, 0.1)
-    conveks.mma.updateCurrentPoint(constraints, grad_objective, grad_constraints)
+    conveks.mma.updateCurrentPoint(grad_objective, constraints, grad_constraints)
     change = conveks.mma.getDesignChange()
     it = conveks.mma.getOuterIteration()
 
diff --git a/Team25/shape.pro b/Team25/shape.pro
index 8d3983d..d27346f 100644
--- a/Team25/shape.pro
+++ b/Team25/shape.pro
@@ -283,6 +283,8 @@ Formulation {
     Equation {
       Galerkin { [ nu[{d a}] * Dof{d Lva}, {d Lva} ];
         In Domain; Jacobian Vol; Integration Int2; }
+      Galerkin { [ dhdb_NL[{d a}] * Dof{d Lva} , {d Lva} ];
+        In Core; Jacobian Vol ; Integration Int2 ; }
       Galerkin { [LieOf_HB[{d a},dV[{d v_1},{d v_2},{d v_3}]],{d Lva}];
         In Domain; Jacobian Vol; Integration Int2; }
       Galerkin { [LieOf_HB_NL[{d a},dV[{d v_1},{d v_2},{d v_3}]],{d Lva}];
diff --git a/Team25/shape.py b/Team25/shape.py
index 25ca547..35e0834 100644
--- a/Team25/shape.py
+++ b/Team25/shape.py
@@ -158,7 +158,7 @@ while it <= maxIter and c.getString('shape/Action') != 'stop':
 
     # call MMA and update the current point
     conveks.mma.setMoveLimits(lowerBound, upperBound, 1.0e-3)
-    conveks.mma.updateCurrentPoint(constraints,grad_objective,grad_constraints)
+    conveks.mma.updateCurrentPoint(grad_objective,constraints,grad_constraints)
     change = conveks.mma.getDesignChange()
     it = conveks.mma.getOuterIteration()
 
-- 
GitLab