Télécharger topology.procedur

Retour à la liste

Numérotation des lignes :

  1. * TOPOLOGY PROCEDUR FD218221 25/12/18 21:15:08 12429
  2.  
  3. ************************************************************************
  4. ** Procedure called by TOPOPTIM for updating the topology using:
  5. ** - Optimality Criteria method (OC);
  6. ** - Method of Moving Asymptotes (MMA).
  7. **
  8. ** This procedure also calculates the maximum increment of the design
  9. ** variables.
  10. **
  11. ** Author:
  12. ** Guenhael Le Quilliec (LaMe - Polytech Tours)
  13. **
  14. ** Version:
  15. ** 3.0 2025/11/13 Improved OC, added MMA, update MAX_X_CHANGE
  16. ** 2.2 2021/03/19 Modified default value of 'OC_L2'
  17. ** 2.1 2018/01/29 Fixed issue with quadratic elements
  18. ** 2.0 2017/11/11 Initial version
  19. ************************************************************************
  20.  
  21. DEBP TOPOLOGY tab*'TABLE' ;
  22.  
  23. * General input data
  24. * ******************
  25.  
  26. Wtab = tab.'WTABLE' ;
  27. Ltab = Wtab.'LOGIQUE' ;
  28.  
  29. modD = Wtab.'MODELE_D' ;
  30. oldXD = Wtab.'X_D' ;
  31. oldYD = Wtab.'Y_D' ;
  32. NdOdXD = Wtab.'SENSIBILITE_NORMALISEE_OBJECTIF_D' ;
  33. NdGdXDtab = Wtab.'SENSIBILITES_NORMALISEES_CONTRAINTES_D' ;
  34.  
  35. * Compliance minimization under total volume constraint
  36. * using the Optimality Criteria (Bendsoe 1995)
  37. * *****************************************************
  38.  
  39. SI (EGA tab.'OPTIMISEUR' 'OC') ;
  40.  
  41. * Input fields
  42. * ************
  43. matD = Wtab.'CARACTERISTIQUES_D' ;
  44. uniD = Wtab.'UNIT_D' ;
  45. XmaxD = BORN (oldXD + tab.'X_CHANGE_SEUIL') 'SCAL' 'MAXI' 1.0 ;
  46. XminD = BORN (oldXD - tab.'X_CHANGE_SEUIL') 'SCAL' 'MINI'
  47. tab.'X_MIN_SEUIL' ;
  48. VtotDlim = Wtab.'VOLUME_TOTAL_D' * tab.'FRACTION_VOLUME_LIMITE' ;
  49. * OC allows only one single volume constraint (verified in TOPOBOOT)
  50. NdGdXD = NdGdXDtab.(1) ;
  51.  
  52. * Compute "specific objective sensitivity"
  53. * dO/dX / dG/dX = dcpl/dX / dV/dX
  54. * Remark: constraint derivative is expressed as dV/dX / V_total,
  55. * Lagrange multiplier λ adapts automatically
  56. dO_dGD = NdOdXD / NdGdXD ;
  57.  
  58. * OC specific input data
  59. * **********************
  60. eta = Wtab.'OC_D' ;
  61. gsf = Wtab.'OC_Q' ;
  62. Lgsf = gsf > 1 ;
  63. **** Lmcn = Ltab.'MECANISME' ;
  64. * Bounds of Lagrange multiplier
  65. lam1 = tab.'OC_L1' ;
  66. SI (EXIS tab 'OC_L2') ;
  67. lam2 = tab.'OC_L2' ;
  68. SINO ;
  69. lam2 = MAXI 'ABS' dO_dGD ;
  70. FINS ;
  71. lam2min = tab.'OC_L2_MIN' ;
  72. crt = tab.'OC_CRITERE' ;
  73. **** SI Lmcn ;
  74. Bmin = tab.'OC_B_MIN' ;
  75. **** FINS ;
  76.  
  77. * OC optimization (Bisection algorithm)
  78. * *************************************
  79.  
  80. REPE itr tab.'OC_MAX_IT' ;
  81.  
  82. * Update value of the Lagrange multiplier
  83. lam = 0.5 * (lam2 + lam1) ;
  84.  
  85. * Compute scaled sensitivity B
  86. B = dO_dGD * (-1.0 / lam) ;
  87. * Negative values may occur for compliant mechanism synthesis
  88. * or elastic strain energy minimization with quadratic elements
  89. **** SI Lmcn ;
  90. B = BORN B 'SCAL' 'MINI' Bmin ;
  91. **** FINS ;
  92.  
  93. * Update design variables X on D
  94. XD = oldXD * (B**eta) ;
  95.  
  96. * Grey scale factor Q
  97. SI Lgsf ;
  98. XD = XD**gsf ;
  99. FINS ;
  100.  
  101. * Bound X: void < X < 1, and |X - Xold| < Xmax_increment
  102. msk = XD MASQ 'INFE' XmaxD ;
  103. XD = (XD * msk) - (XmaxD * (msk - uniD)) ;
  104. msk = XD MASQ 'SUPE' XminD ;
  105. XD = (XD * msk) - (XminD * (msk - uniD)) ;
  106. Wtab.'X_D' = XD ;
  107.  
  108. * Update physical densities (Y) from design variables (X) on D
  109. TOPOPHYS tab ;
  110.  
  111. * Update new bounds of Lagrange multiplier for total volume constraint
  112. SI ((INTG Wtab.'Y_D' modD matD) > VtotDlim) ;
  113. lam1 = lam ;
  114. SINO ;
  115. lam2 = lam ;
  116. FINS ;
  117.  
  118. * Convergence test
  119. SI (NON ((((lam2 - lam1) / (lam1 + lam2)) > crt) ET (lam2 > lam2min))) ;
  120. QUIT itr ;
  121. FINS ;
  122.  
  123. FIN itr ;
  124.  
  125. FINS ;
  126.  
  127. * Minimization under constraints using
  128. * Method of Moving Asymptotes (Svanberg 1987)
  129. * *******************************************
  130.  
  131. SI (EGA tab.'OPTIMISEUR' 'MMA') ;
  132.  
  133. * MMA specific input data
  134. * ***********************
  135.  
  136. VD = Wtab.'VOLUME_D' ;
  137. O = Wtab.'OBJECTIF' ;
  138. Glst = Wtab.'CONTRAINTES' ;
  139.  
  140. * MMA input table
  141. * ***************
  142.  
  143. * Extracting list of current design variables
  144. Xlst = EXTR oldXD 'VALE' 'SCAL' ;
  145. * Number of design variables
  146. nbrX = DIME Xlst ;
  147.  
  148. * Existing MMA table
  149. SI (EXIS Wtab 'MMA') ;
  150. mmatab = Wtab.'MMA' ;
  151. * If the mesh (or more precisely, the model and the frozen area)
  152. * have changed, then we reset the MMA table
  153. SI ((NEG mmatab.'ID'.'MODEL' Wtab.'RESOLUTION_B'.'MODELE')
  154. OU (NEG mmatab.'ID'.'ZONE_FIGEE' tab.'ZONE_FIGEE')) ;
  155. OTER Wtab 'MMA' ;
  156. FINS ;
  157. FINS ;
  158.  
  159. * Initialize table for MMA operator
  160. SI (NON (EXIS Wtab 'MMA')) ;
  161. mmatab = TABL ;
  162. mmatab.'XMAX' = 1.0 ;
  163. mmatab.'LOW' = PROG nbrX*1.0 ;
  164. mmatab.'UPP' = PROG nbrX*1.0 ;
  165. mmatab.'A0' = 1.0 ;
  166. mmatab.'A' = PROG 0.0 ;
  167. mmatab.'D' = PROG 0.0 ;
  168. Wtab.'MMA' = mmatab ;
  169. * TODO renvoie FAUX alors que les deux valent NaN
  170. * SI (EGA tab.'MMA_COEF_OBJECTIF' Wtab.'NAN') ;
  171. SI (EGA tab.'MMA_COEF_OBJECTIF' 0.0) ;
  172. tab.'MMA_COEF_OBJECTIF' = 100.0 / O ;
  173. FINS ;
  174. * Save identification data
  175. mmatab.'ID' = TABL ;
  176. mmatab.'ID'.'MODEL' = Wtab.'RESOLUTION_B'.'MODELE' ;
  177. mmatab.'ID'.'ZONE_FIGEE' = tab.'ZONE_FIGEE' ;
  178. FINS ;
  179.  
  180. * If the number of design variables has changed (e.g. remeshing)
  181. SI (NEG nbrX (DIME mmatab.'LOW')) ;
  182. mmatab.'LOW' = PROG nbrX*1.0 ;
  183. mmatab.'UPP' = PROG nbrX*1.0 ;
  184. FINS ;
  185.  
  186. * Set parameters
  187. * (or update if tab has changed between different calls to TOPOPTIM)
  188. mmatab.'XMIN' = tab.'X_MIN_SEUIL' ;
  189. mmatab.'MOVE' = tab.'X_CHANGE_SEUIL' ;
  190. mmatab.'C' = tab.'MMA_C' ;
  191.  
  192. * List of current design variables
  193. mmatab.'X' = Xlst ;
  194.  
  195. * Objective function value and its sensitivity
  196. * (MMA objective value should not exceed 100)
  197. mmatab.'F0VAL' = O * tab.'MMA_COEF_OBJECTIF' ;
  198. SI ((mmatab.'F0VAL' > 100) OU (mmatab.'F0VAL' < 1));
  199. SAUT 1 'LIGN' ;
  200. SI (mmatab.'F0VAL' > 100) ;
  201. MESS (CHAI ' /!\ F0 = MMA_COEF_OBJECTIF * OBJECTIF =' ' ' mmatab.'F0VAL' ' > 100') ;
  202. SINO ;
  203. MESS (CHAI ' /!\ F0 = MMA_COEF_OBJECTIF * OBJECTIF =' ' ' mmatab.'F0VAL' ' < 1') ;
  204. FINS ;
  205. MESS (CHAI ' avec MMA_COEF_OBJECTIF =' ' ' tab.'MMA_COEF_OBJECTIF') ;
  206. MESS (CHAI ' or il est preferable que 1 <= F0 <= 100.') ;
  207. * ERRE 'Veuillez adapter la valeur du coefficient MMA_COEF_OBJECTIF.' ;
  208. MESS (CHAI ' Veuillez adapter la valeur du coefficient MMA_COEF_OBJECTIF.') ;
  209. SAUT 1 'LIGN' ;
  210. FINS ;
  211. * mmatab.'DF0DX' = (EXTR (NdOdXD * VD) 'VALE' 'SCAL') * tab.'MMA_COEF_OBJECTIF' ;
  212. SI (TOPOMODI tab (CHAI 'VOLUME_D_x_MMA_COEF_OBJECTIF')
  213. VD tab.'MMA_COEF_OBJECTIF') ;
  214. Wtab.'VOLUME_D_x_MMA_COEF_OBJECTIF' = VD * tab.'MMA_COEF_OBJECTIF' ;
  215. FINS ;
  216. mmatab.'DF0DX' = (EXTR (NdOdXD * Wtab.'VOLUME_D_x_MMA_COEF_OBJECTIF') 'VALE' 'SCAL') ;
  217. * Constraints (fi < 0) and their sensitivity
  218. mmatab.'FVAL' = Glst ;
  219. mmatab.'DFDX' = TABL ;
  220. REPE itr (DIME Glst) ;
  221. mmatab.'DFDX'.&itr = EXTR (NdGdXDtab.&itr * VD) 'VALE' 'SCAL' ;
  222. FIN itr ;
  223.  
  224. * Call MMA operator to update design variables
  225. * ********************************************
  226.  
  227. MMA mmatab ;
  228.  
  229. * Postprocess MMA output data
  230. * ***************************
  231.  
  232. * MCHAML of new design variables
  233. XD = MANU 'CHML' modD 'REPA' 'SCAL' mmatab.'X' 'TYPE' 'SCALAIRE' 'GRAVITE' ;
  234.  
  235. * In thermal mode, 'GRAVITE' option is not respected
  236. * This issue is resolved by using CHAN 'GRAVITE'
  237. SI (NON Ltab.'MECANIQUE') ;
  238. XD = CHAN 'GRAVITE' XD modD ;
  239. FINS ;
  240. Wtab.'X_D' = XD ;
  241.  
  242. * Update physical densities from design variables
  243. TOPOPHYS tab ;
  244.  
  245. SINO ;
  246.  
  247. * If MMA is not used but a table exists
  248. SI (EXIS Wtab 'MMA') ;
  249. * Delete it
  250. OTER Wtab 'MMA' ;
  251. FINS ;
  252.  
  253. FINS ;
  254.  
  255. * Other output
  256. * ************
  257.  
  258. * Update maximum increment of design variables
  259. Wtab.'MAX_X_CHANGE' = MAXI (ABS (XD - oldXD)) ;
  260.  
  261. * Save previous design variables and previous physical densities
  262. Wtab.'X_D_PRECED' = oldXD ;
  263. Wtab.'Y_D_PRECED' = oldYD ;
  264.  
  265. FINP ;
  266.  
  267.  
  268.  

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