Télécharger mma_05.dgibi

Retour à la liste

Numérotation des lignes :

  1. * fichier : mma_05.dgibi
  2. ************************************************************************
  3. ************************************************************************
  4.  
  5. ************************************************************************
  6. * Test de l'opérateur MMA : Méthode des Asymptotes Mobiles *
  7. * Application à l'optimisation d'un treillis à 3 barres *
  8. * *
  9. * Référence : *
  10. * 2008 M. Bruggi *
  11. * On an alternative approach to stress constraints relaxation in *
  12. * topology optimization *
  13. * Struct Multidisc Optim, 36:125–141 *
  14. * https://link.springer.com/article/10.1007/s00158-007-0203-6 *
  15. * *
  16. * On considère un treillis de 3 barres réparties entre 4 noeuds *
  17. * Les noeuds p2, p3 et p4 sont encastrés, le noeud p1 est soumis à *
  18. * 2 cas de chargement f1 et f2 *
  19. * *
  20. * Ʌ f1 = [0 1.5]^T *
  21. * ‖ *
  22. * ‖ *
  23. * ‖ *
  24. * p1 *====> f2 = [1 0]^T *
  25. * /|\ *
  26. * / | \ *
  27. * / | \ *
  28. * x1 / | \ x3 *
  29. * / x2| \ *
  30. * * * * *
  31. * p2 p3 p4 *
  32. * *
  33. * Les variables d'optimisation sont les densités des barres x1, x2, x3 *
  34. * Le problème d'optimisation consiste à minimiser le volume de la *
  35. * structure tel que les contraintes ne depassent pas une valeur seuil *
  36. * En choisissant : *
  37. * - des caractéristiques géometriques/mécaniques unitaires *
  38. * - des longueurs de barre l1 = l3 = 1. et l2 = sqrt(2) *
  39. * - une limite en contrainte sigy = 3. pour chaque barre *
  40. * - une loi puissance reliant le module d'Young à la densité (SIMP) *
  41. * - d'éliminer la variable x3 (avec x3=x1), car la contrainte dans la *
  42. * barre 3 est superflue pour ce chargement *
  43. * alors, le problème d'optimisation s'écrit : *
  44. * *
  45. * Minimiser : f0(x1,x2) = 2sqrt(2) x1 + x2 *
  46. * sur x1,x2 *
  47. * 0.75 x1^p *
  48. * avec : f1(x1,x2) = ---------------------- - 3 x1^p <= 0 *
  49. * x1^p / sqrt(2) + x2^p *
  50. * *
  51. * 1.5 x2^p *
  52. * f2(x1,x2) = ---------------------- - 3 x2^p <= 0 *
  53. * x1^p / sqrt(2) + x2^p *
  54. * *
  55. * f3(x1,x2) = 1/sqrt(2) - 3 x1^p <= 0 *
  56. * *
  57. * 0 < x1 <= 1 0 <= x2 <= 1 *
  58. * *
  59. * Le problème admet un optimum global en x1 = 0.708 x2 = 0. *
  60. * un optimum local en x1 = 0.617 x2 = 0.7 *
  61. ************************************************************************
  62.  
  63. * Options
  64. OPTI 'ECHO' 0 ;
  65. itrac = FAUX ;
  66.  
  67. * Paramètres du problème
  68. p = 3. ;
  69. q = 3. ;
  70.  
  71. * Procédures pour le calcul de la fonction objectif (f0) des fonctions
  72. * limitations (f1 f2 f3) et de leurs dérivées partielles
  73. * Ici, l'exposant q est utilisé pour pénaliser les contraintes et
  74. * relaxer le problème original
  75. * Si q < p --> problème relaxé
  76. * Si q = p --> problème initial (singulier, avec espaces dégénérés)
  77.  
  78. * Juste les valeurs des fonctions
  79. DEBP F0123 x1 x2 p q ;
  80. rac2 = 2. ** 0.5 ;
  81. f0 = (2. * rac2 * x1) + x2 ;
  82. xdeno = ((x1 ** p) / rac2) + (x2 ** p) ;
  83. f1 = (0.75 * (x1 ** p) / xdeno) - (3. * (x1 ** q)) ;
  84. f2 = (1.5 * (x2 ** p) / xdeno) - (3. * (x2 ** q)) ;
  85. f3 = (1. / rac2) - (3. * (x1 ** q)) ;
  86. FINP f0 f1 f2 f3 ;
  87.  
  88. * Les fonctions et leurs dérivées
  89. DEBP FONC lx*'LISTREEL' p*'FLOTTANT' q*'FLOTTANT' ;
  90. x1 = EXTR lx 1 ;
  91. x2 = EXTR lx 2 ;
  92. rac2 = 2. ** 0.5 ;
  93. f0 f1 f2 f3 = F0123 x1 x2 p q ;
  94. f = PROG f1 f2 f3 ;
  95. df0dx = PROG (2. * rac2) 1. ;
  96. xdeno = ((x1 ** p) / rac2) + (x2 ** p) ;
  97. dfdx = TABL ;
  98. dfdx . 1 = PROG ((0.75 * p * (x1 ** (p - 1.)) * (x2 ** p) / (xdeno ** 2.)) - (3. * q * (x1 ** (q - 1.))))
  99. (-0.75 * p * (x2 ** (p - 1.)) * (x1 ** p) / (xdeno ** 2.)) ;
  100. dfdx . 2 = PROG ((-1.5 / rac2) * p * (x1 ** (p - 1.)) * (x2 ** p) / (xdeno ** 2.))
  101. ((( 1.5 / rac2) * p * (x2 ** (p - 1.)) * (x1 ** p) / (xdeno ** 2.)) - (3. * q * (x2 ** (q - 1.)))) ;
  102. dfdx . 3 = PROG (-1. * 3. * q * (x1 ** (p - 1.)))
  103. 0. ;
  104. FINP f0 df0dx f dfdx ;
  105.  
  106. * Solution de référence
  107. x1ref = 0.708 ;
  108. x2ref = 0. ;
  109. xref = PROG x1ref x2ref ;
  110. f0ref df0dxref fval0 dfdxref = FONC xref p q ;
  111. MESS 'Solution de reference' ;
  112. MESS ' x1 x2 f0' ;
  113. MESS (CHAI 'FORMAT' '(F10.5)' x1ref /4 x2ref /16 f0ref /28) ;
  114.  
  115. * Choix d'un point initial pour les inconnues
  116. x0 = PROG 0.95 0.45 ;
  117.  
  118. * Calcul de f0(x0), df0dx(x0), fval(x0), dfdx(x0)
  119. f0 df0dx fval dfdx = FONC x0 p q ;
  120.  
  121. * Initialisation de la table pour la MMA
  122. t = TABL ;
  123. t . 'X' = x0 ;
  124. t . 'XMIN' = PROG 1.E-6 0. ;
  125. t . 'XMAX' = 1. ;
  126. t . 'F0VAL' = f0 ;
  127. t . 'DF0DX' = df0dx ;
  128. t . 'FVAL' = fval ;
  129. t . 'DFDX' = dfdx ;
  130. t . 'A0' = 1. ;
  131. t . 'A' = PROG (DIME dfdx)*0. ;
  132. t . 'C' = PROG (DIME dfdx)*1.E5 ;
  133. t . 'D' = PROG (DIME dfdx)*1. ;
  134. t . 'MOVE' = 0.01 ;
  135.  
  136. * Iterations de la MMA
  137. x01 = EXTR x0 1 ;
  138. x02 = EXTR x0 2 ;
  139. lx1 = PROG x01 ;
  140. lx2 = PROG x02 ;
  141. lit = PROG 0. ;
  142. lf0 = PROG f0 ;
  143. li = PROG (MAXI (fval ET 0.)) ;
  144. MESS 'Optimisation par MMA' ;
  145. MESS 'It x1 x2 f0 kktnorm' ;
  146. MESS (CHAI 'FORMAT' '(F10.5)' 0 x01 /4 x02 /16 f0 /28) ;
  147. * Boucle d'optimisation
  148. REPE loop 150 ;
  149. * Appel à MMA
  150. lit = lit ET &loop ;
  151. MMA t ;
  152. xmma = t . 'X' ;
  153. x1 = EXTR xmma 1 ;
  154. x2 = EXTR xmma 2 ;
  155. lx1 = lx1 ET x1 ;
  156. lx2 = lx2 ET x2 ;
  157. * Mise à jour des valeurs des fonctions
  158. f0 df0dx fval dfdx = FONC xmma p q ;
  159. lf0 = lf0 ET f0 ;
  160. li = li ET (MAXI (fval ET 0.)) ;
  161. t . 'F0VAL' = f0 ;
  162. t . 'DF0DX' = df0dx ;
  163. t . 'FVAL' = fval ;
  164. t . 'DFDX' = dfdx ;
  165. * Calcul du résidu pour les conditions KKT
  166. res kkt2 kktinf = KKT_MMA t ;
  167. * Bilan de l'itération
  168. MESS (CHAI 'FORMAT' '(F10.5)' &loop x1 /4 x2 /16 f0 /28 kkt2 /40) ;
  169. FIN loop ;
  170. nit = (DIME lf0) - 1 ;
  171.  
  172. * Vérification du résultat
  173. errmax = MAXI 'ABS' ((xmma - xref)) ;
  174. MESS 'Erreur max (sur x)' ;
  175. MESS errmax ;
  176.  
  177. * Évolutions temporelles de f, de l'infaisabilité et des variables
  178. * en fonction des itérations d'optimisation
  179. SI itrac ;
  180. OPTI 'DIME' 2 'ELEM' 'QUA8' ;
  181. xmin = MAXI (t . 'XMIN') ;
  182. xmax = t . 'XMAX' ;
  183. msh = (DROI 100 (xmin xmin) (xmax xmin)) TRAN 100 (0. (xmax - xmin)) ;
  184. cmsh = CONT msh ;
  185. x y = COOR msh ;
  186. f0msh f1msh f2msh f3msh = F0123 x y p q ;
  187. lf1 toto = @ISOSURF msh (PROG 0.) f1msh ;
  188. lf2 toto = @ISOSURF msh (PROG 0.) f2msh ;
  189. lf3 toto = @ISOSURF msh (PROG 0.) f3msh ;
  190. path = QUEL 'SEG2' lx1 lx2 ;
  191. pdep = x01 x02 ;
  192. pfin = x1 x2 ;
  193. cdep = (CERC 10 'ROTA' 360. (pdep PLUS (0.01 0.)) pdep) COUL 'VIOL' ;
  194. cfin = (CERC 10 'ROTA' 360. (pfin PLUS (0.01 0.)) pfin) COUL 'ROUG' ;
  195. annd = ANNO 'ETIQ' pdep 'VIOL' 'NE' 0.1 VRAI 'Depart' ;
  196. annf = ANNO 'ETIQ' pfin 'ROUG' 'NE' 0.1 VRAI 'Arrivee' ;
  197. TRAC f0msh msh (cmsh ET path ET lf1 ET lf2 ET lf3 ET cdep ET cfin) 25
  198. (annd ET annf) 'TITR' 'Isovaleurs de la fonction objectif F0 et chemin au cours de l''optimisation' ;
  199. lit = PROG 0. 'PAS' 1. nit ;
  200. evf0 = EVOL 'ROUG' 'MANU' 'Iteration' lit 'F0' lf0 ;
  201. evfr = EVOL 'ROUG' 'MANU' 'Iteration' (PROG 0. nit) 'F0' (PROG f0ref f0ref) ;
  202. tl = TABL ;
  203. tl . 2 = 'TIRR' ;
  204. tl . 'TITRE' = TABL ;
  205. tl . 'TITRE' . 1 = 'F0 calculee' ;
  206. tl . 'TITRE' . 2 = 'F0 ref.' ;
  207. DESS (evf0 ET evfr) 'TITR' 'Fonction objectif F0(x) VS Iterations' 'LEGE' tl ;
  208. evi = EVOL 'VERT' 'MANU' 'Iteration' lit 'Inf' li ;
  209. tl . 'TITRE' . 1 = 'Infaisabilite' ;
  210. DESS evi 'TITR' 'Infaisabilite VS Iterations' 'LEGE' tl ;
  211. evx1 = EVOL 'ROUG' 'MANU' 'Iteration' lit 'x' lx1 ;
  212. evx1r = EVOL 'ROUG' 'MANU' 'Iteration' (PROG 0. nit) 'x' (PROG x1ref x1ref) ;
  213. evx2 = EVOL 'ORAN' 'MANU' 'Iteration' lit 'x' lx2 ;
  214. evx2r = EVOL 'ORAN' 'MANU' 'Iteration' (PROG 0. nit) 'x' (PROG x2ref x2ref) ;
  215. tl . 4 = 'TIRR' ;
  216. tl . 'TITRE' . 1 = 'x1 calcule' ;
  217. tl . 'TITRE' . 2 = 'x1 ref.' ;
  218. tl . 'TITRE' . 3 = 'x2 calcule' ;
  219. tl . 'TITRE' . 4 = 'x2 ref.' ;
  220. DESS (evx1 ET evx1r ET evx2 ET evx2r) 'TITR' 'Valeurs x VS Iterations' 'LEGE' tl ;
  221. FINSI ;
  222.  
  223. * Sortie en erreur si l'écart aux valeurs de références est trop important
  224. SI (errmax > 1.E-3) ;
  225. ERRE 'Erreur dans le calcul d''optimisation' ;
  226. SINON ;
  227. MESS 'Cas test passe avec succes !' ;
  228. FINSI ;
  229.  
  230.  
  231. FIN ;
  232.  
  233.  
  234.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales