Télécharger topoadjo.procedur

Retour à la liste

Numérotation des lignes :

  1. * TOPOADJO PROCEDUR FD218221 25/12/18 21:15:02 12429
  2.  
  3. ************************************************************************
  4. ** Procedure called by TOPOCONT to compute the total derivative of the
  5. ** total constraint (G) with respect to the design variables, using the
  6. ** partial derivatives with respect to the physical densities and the
  7. ** adjoint method.
  8. **
  9. ** If the loading is physical density dependent, its volume-normalized
  10. ** sensitivity with respect to the design variables should also be
  11. ** provided on the design zone (D).
  12. **
  13. ** Author:
  14. ** Guenhael Le Quilliec (LaMe - Polytech Tours)
  15. **
  16. ** Version:
  17. ** 1.0 2025/11/21 Initial version
  18. ************************************************************************
  19.  
  20. DEBP TOPOADJO tab*'TABLE' dGdYD*'MCHAML' dGdUI*'CHPOINT' ;
  21.  
  22. * Input data
  23. * **********
  24.  
  25. Wtab = tab.'WTABLE' ;
  26. *Ltab = Wtab.'LOGIQUE' ;
  27.  
  28. VD = Wtab.'VOLUME_D' ;
  29.  
  30. mshI = Wtab.'MAILLAGE_I' ;
  31. modMD = Wtab.'MECANIQUE'.'MODELE_D' ;
  32. modMA = Wtab.'MECANIQUE'.'MODELE_A' ;
  33. modMI = Wtab.'MECANIQUE'.'MODELE_I' ;
  34. ZmatMA = Wtab.'MECANIQUE'.'CARACTERISTIQUES_Z_A' ;
  35. bdcMB = Wtab.'MECANIQUE'.'BLOCAGES' ;
  36.  
  37. resB = Wtab.'RESOLUTION_B' ;
  38.  
  39. UI = REDU Wtab.'RESOLUTION_A'.'DEPLACEMENTS' mshI ;
  40.  
  41. * Initialization
  42. * **************
  43.  
  44. * Derivative of the material characteristics with respect to Y
  45. dZmatMI = TOPOMATE modMI Wtab.'MECANIQUE'.'CARACTERISTIQUES_I'
  46. Wtab.'MECANIQUE'.'SENSIBILITE_Z_I'
  47. tab.'COMPOSANTES' ;
  48.  
  49. * Logical for physical density dependent loading
  50. LdFdY = EXIS resB 'SENSIBILITE_NORMALISEE_CHARGEMENT' ;
  51. * If loading is physical density dependent
  52. SI LdFdY ;
  53. NdFdYI = REDU resB.'SENSIBILITE_NORMALISEE_CHARGEMENT' mshI ;
  54. FINS ;
  55.  
  56. * Vector of adjoint variables λ on I
  57. * **********************************
  58.  
  59. * λ = - K_Z⁻¹ * ∂G/∂U
  60. * Remark1: -λ is calculated on mshA, then restricted to I
  61. * Remark2: minus sign is compensated later
  62. SI (EGA tab.'SEUIL_ELEMENTS_ACTIFS' 0.0) ;
  63. * Penalized rigidity matrix K on A
  64. ZKA = (RIGI modMA ZmatMA) ET bdcMB ;
  65. lamI = REDU (RESO ZKA dGdUI) mshI ;
  66. OUBL ZKA ;
  67. SINO ;
  68. ERRE 'Actuellement non compatible avec SEUIL_ELEMENTS_ACTIFS <> 0' ;
  69. * TODO à rendre compatible en cas de zone active non connexe.
  70. * En attendant on fait la résolution sur B
  71. * Appliquer un seuil sur l'aggrégation des contraintes locales? (c.f. Verbart Fig.14)
  72. tmp1 = Wtab.'MECANIQUE'.'MODELE_B' ;
  73. tmp2 = Wtab.'MECANIQUE'.'CARACTERISTIQUES_B' ;
  74. tmp2 = TOPOMATE tmp1 tmp2 Wtab.'MECANIQUE'.'Z_B' tab.'COMPOSANTES' ;
  75. ZKB = (RIGI tmp1 tmp2) ET bdcMB ;
  76. lamI = REDU (RESO ZKB dGdUI) mshI ;
  77. OUBL ZKB ;
  78. FINS ;
  79.  
  80. * Rename components and switch to mass integration points
  81. tmp = EXCO (EXTR lamI 'COMP') lamI (EXTR dGdUI 'COMP') ;
  82. lamI1 = CHAN 'CHAM' tmp modMI 'MASSE' ;
  83. lamI0 = CHAN 'ATTRIBUT' lamI 'NATURE' 'DISCRET' ;
  84.  
  85. * Sensitivities of the constraints term C with respect to physical densities Y on I
  86. * *********************************************************************************
  87.  
  88. * As the constraints are KU - F = 0, the constraints term is C = λᵀ * (KU - F).
  89. * Their sensitivities are ∂C/∂Y = λᵀ * (∂K/∂Y U - ∂F/∂Y)
  90.  
  91. * ∂K/∂Y on I
  92. dKdYI = RIGI modMI dZmatMI ;
  93.  
  94. * ∂K/∂Y * U on I
  95. **tmp = dKdYI * UI ;
  96. * TODO version approchée en attendant d'avoir une version Fortran ?
  97. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  98. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  99. * -λ * ∂K/∂Y * U on I
  100. SI FAUX ;
  101. tmp = PROG ;
  102. REPE itr (NBEL mshI) ;
  103. tmp1 = mshI ELEM &itr ;
  104. tmp2 = (REDU dKdYI tmp1) * UI ;
  105. tmp3 = REDU lamI0 tmp1 ;
  106. tmp4 = PSCA tmp2 tmp3 (EXTR tmp2 'COMP') (EXTR tmp3 'COMP') ;
  107. tmp4 = RESU tmp4 ;
  108. tmp = tmp ET (EXTR tmp4 'VALE' 'SCAL') ;
  109. FIN itr ;
  110. tmp = MANU 'CHML' modMI 'REPA' 'SCAL' tmp 'TYPE' 'SCALAIRE' 'GRAVITE' ;
  111. SINO ;
  112. * Création de maillages d'éléments dissociés à partir d'un maillage
  113. * initial dont tous les éléments reposent sur une grille régulière
  114. SI (NON (EXIS Wtab 'TOPOADJO_TEMPORAIRE')) ;
  115. MESS 'Pareparation du maillage temporaire pour TOPOADJO...' ;
  116. crt = tab.'ELIM_CRITERE' ;
  117. msh = Wtab.'MAILLAGE_B' ;
  118. SI (EGA (VALE 'MODE') 'TRID') ;
  119. env = ENVE msh ;
  120. edg = (ARET env) COUL 'ROUG' ;
  121. c1 = edg COOR 1 ;
  122. c2 = edg COOR 2 ;
  123. c3 = edg COOR 3 ;
  124. min1 = MINI c1 ;
  125. max1 = MAXI c1 ;
  126. min2 = MINI c2 ;
  127. max2 = MAXI c2 ;
  128. min3 = MINI c3 ;
  129. max3 = MAXI c3 ;
  130. el1 = msh ELEM 1 ;
  131. cel1 = el1 COOR 1 ;
  132. cel2 = el1 COOR 2 ;
  133. cel3 = el1 COOR 3 ;
  134. minel1 = MINI cel1 ;
  135. maxel1 = MAXI cel1 ;
  136. minel2 = MINI cel2 ;
  137. maxel2 = MAXI cel2 ;
  138. minel3 = MINI cel3 ;
  139. maxel3 = MAXI cel3 ;
  140. el1 = el1 PLUS ((min1 min2 min3) MOIN (minel1 minel2 minel3)) ;
  141. s1 = maxel1 - minel1 ;
  142. s2 = maxel2 - minel2 ;
  143. s3 = maxel3 - minel3 ;
  144. nb1 = ENTI 'PROC' ((max1 - min1) / s1) ;
  145. nb2 = ENTI 'PROC' ((max2 - min2) / s2) ;
  146. nb3 = ENTI 'PROC' ((max3 - min3) / s3) ;
  147. raw0 = el1 ;
  148. REPE itr (nb1 - 1) ;
  149. raw0 = raw0 ET (el1 PLUS ((&itr * s1) 0.0 0.0)) ;
  150. FIN itr ;
  151. ELIM raw0 crt ;
  152. raw1 = el1 ;
  153. REPE itr ((nb1 - 1) / 2) ;
  154. raw1 = raw1 ET (el1 PLUS ((s1 * (&itr * 2)) 0.0 0.0)) ;
  155. FIN itr ;
  156. ELIM raw0 raw1 crt ;
  157. raw2 = DIFF raw0 raw1 ;
  158. layer1 = raw1 ;
  159. layer2 = raw2 ;
  160. REPE itr ((nb2 - 1) / 2) ;
  161. layer1 = layer1 ET (raw1 PLUS (0.0 (s2 * (&itr * 2)) 0.0)) ;
  162. layer2 = layer2 ET (raw2 PLUS (0.0 (s2 * (&itr * 2)) 0.0)) ;
  163. FIN itr ;
  164. raw3 = raw1 PLUS (0.0 s2 0.0) ;
  165. raw4 = raw2 PLUS (0.0 s2 0.0) ;
  166. layer3 = raw3 ;
  167. layer4 = raw4 ;
  168. REPE itr ((nb2 - 2) / 2) ;
  169. layer3 = layer3 ET (raw3 PLUS (0.0 (s2 * (&itr * 2)) 0.0)) ;
  170. layer4 = layer4 ET (raw4 PLUS (0.0 (s2 * (&itr * 2)) 0.0)) ;
  171. FIN itr ;
  172. msh1 = layer1 ;
  173. msh2 = layer2 ;
  174. msh3 = layer3 ;
  175. msh4 = layer4 ;
  176. REPE itr ((nb3 - 1) / 2) ;
  177. msh1 = msh1 ET (layer1 PLUS (0.0 0.0 (s3 * (&itr * 2)))) ;
  178. msh2 = msh2 ET (layer2 PLUS (0.0 0.0 (s3 * (&itr * 2)))) ;
  179. msh3 = msh3 ET (layer3 PLUS (0.0 0.0 (s3 * (&itr * 2)))) ;
  180. msh4 = msh4 ET (layer4 PLUS (0.0 0.0 (s3 * (&itr * 2)))) ;
  181. FIN itr ;
  182. layer5 = layer1 PLUS (0.0 0.0 s3) ;
  183. layer6 = layer2 PLUS (0.0 0.0 s3) ;
  184. layer7 = layer3 PLUS (0.0 0.0 s3) ;
  185. layer8 = layer4 PLUS (0.0 0.0 s3) ;
  186. msh5 = layer5 ;
  187. msh6 = layer6 ;
  188. msh7 = layer7 ;
  189. msh8 = layer8 ;
  190. REPE itr ((nb3 - 2) / 2) ;
  191. msh5 = msh5 ET (layer5 PLUS (0.0 0.0 (s3 * (&itr * 2)))) ;
  192. msh6 = msh6 ET (layer6 PLUS (0.0 0.0 (s3 * (&itr * 2)))) ;
  193. msh7 = msh7 ET (layer7 PLUS (0.0 0.0 (s3 * (&itr * 2)))) ;
  194. msh8 = msh8 ET (layer8 PLUS (0.0 0.0 (s3 * (&itr * 2)))) ;
  195. FIN itr ;
  196. msh1to8 = msh1 ET msh2 ET msh3 ET msh4 ET msh5 ET msh6 ET msh7 et msh8 ;
  197. ELIM msh msh1to8 crt ;
  198. mshD = Wtab.'MAILLAGE_D' ;
  199. mshtab = TABL 'ESCLAVE' ;
  200. mshtab.(1) = mshD INTE msh1 ;
  201. mshtab.(2) = mshD INTE msh2 ;
  202. mshtab.(3) = mshD INTE msh3 ;
  203. mshtab.(4) = mshD INTE msh4 ;
  204. mshtab.(5) = mshD INTE msh5 ;
  205. mshtab.(6) = mshD INTE msh6 ;
  206. mshtab.(7) = mshD INTE msh7 ;
  207. mshtab.(8) = mshD INTE msh8 ;
  208. MESS 'Maillage temporaire genere pour TOPOADJO.' ;
  209. SINO ;
  210. cnt = CONT msh ;
  211. * cnt = cnt COUL 'ROUG' ;
  212. c1 = cnt COOR 1 ;
  213. c2 = cnt COOR 2 ;
  214. min1 = MINI c1 ;
  215. max1 = MAXI c1 ;
  216. min2 = MINI c2 ;
  217. max2 = MAXI c2 ;
  218. el1 = msh ELEM 1 ;
  219. cel1 = el1 COOR 1 ;
  220. cel2 = el1 COOR 2 ;
  221. minel1 = MINI cel1 ;
  222. maxel1 = MAXI cel1 ;
  223. minel2 = MINI cel2 ;
  224. maxel2 = MAXI cel2 ;
  225. el1 = el1 PLUS ((min1 min2) MOIN (minel1 minel2)) ;
  226. s1 = maxel1 - minel1 ;
  227. s2 = maxel2 - minel2 ;
  228. nb1 = ENTI 'PROC' ((max1 - min1) / s1) ;
  229. nb2 = ENTI 'PROC' ((max2 - min2) / s2) ;
  230. raw0 = el1 ;
  231. REPE itr (nb1 - 1) ;
  232. raw0 = raw0 ET (el1 PLUS ((&itr * s1) 0.0)) ;
  233. FIN itr ;
  234. ELIM raw0 crt ;
  235. raw1 = el1 ;
  236. REPE itr ((nb1 - 1) / 2) ;
  237. raw1 = raw1 ET (el1 PLUS ((s1 * (&itr * 2)) 0.0)) ;
  238. FIN itr ;
  239. ELIM raw0 raw1 crt ;
  240. raw2 = DIFF raw0 raw1 ;
  241. msh1 = raw1 ;
  242. msh2 = raw2 ;
  243. REPE itr ((nb2 - 1) / 2) ;
  244. msh1 = msh1 ET (raw1 PLUS (0.0 (s2 * (&itr * 2)))) ;
  245. msh2 = msh2 ET (raw2 PLUS (0.0 (s2 * (&itr * 2)))) ;
  246. FIN itr ;
  247. raw3 = raw1 PLUS (0.0 s2) ;
  248. msh3 = raw3 ;
  249. REPE itr ((nb2 - 2) / 2) ;
  250. msh3 = msh3 ET (raw3 PLUS (0.0 (s2 * (&itr * 2)))) ;
  251. FIN itr ;
  252. msh1234 = msh1 ET msh2 ET msh3 ;
  253. ELIM msh msh1234 crt ;
  254. msh4 = DIFF msh msh1234 ;
  255. msh1234 = msh1234 ET msh4 ;
  256. mshD = Wtab.'MAILLAGE_D' ;
  257. mshtab = TABL 'ESCLAVE' ;
  258. mshtab.(1) = mshD INTE msh1 ;
  259. mshtab.(2) = mshD INTE msh2 ;
  260. mshtab.(3) = mshD INTE msh3 ;
  261. mshtab.(4) = mshD INTE msh4 ;
  262. FINS ;
  263. Wtab.'TOPOADJO_TEMPORAIRE' = mshtab ;
  264. * REPE itr 4 ;
  265. * TRAC (mshtab.(&itr) ET cnt) ;
  266. * FIN itr ;
  267. SI (NEG (NBEL (DIFF mshD (ET mshtab))) 0) ;
  268. ERRE (CHAI 'Le maillage ne repose pas sur une grille reguliere.'
  269. ' Pour le moment, seuls les maillages reguliers sont'
  270. ' compatibles avec une contrainte limite de von Mises.') ;
  271. FINS ;
  272. FINS ;
  273. mshtab = Wtab.'TOPOADJO_TEMPORAIRE' ;
  274. matMI = Wtab.'MECANIQUE'.'CARACTERISTIQUES_I' ;
  275. VI = REDU VD mshI ;
  276. nbr = 4 ;
  277. SI (EGA (VALE 'MODE') 'TRID') ;
  278. nbr = 8 ;
  279. FINS ;
  280. REPE itr nbr ;
  281. tmp1 = mshI INTE mshtab.(&itr) ;
  282. tmp2 = (REDU dKdYI tmp1) * UI ;
  283. tmp3 = REDU lamI0 tmp1 ;
  284. tmp4 = PSCA tmp2 tmp3 (EXTR tmp2 'COMP') (EXTR tmp3 'COMP') ;
  285. tmp5 = REDU modMI tmp1 ;
  286. tmp6 = REDU matMI tmp5 ;
  287. tmp4 = CHAN 'CHAM' tmp4 tmp5 'NOEUD' 'SCALAIRE' ;
  288. * Je ne peux pas faire la résultante par élément, à la place
  289. * j'intègre, je divise par le volume puis je multiplie par le Nb de
  290. * noeuds. Ça diffère en axi car le volume que "représente" chaque noeud
  291. * est différent mais cette différence s'estompe loin de l'axe Z
  292. * et si les éléments sont radialement étroits.
  293. * Ça va aussi différer si les éléments sont quadratiques.
  294. * Bref c'est une rustine temporaire et qui aide à avoir des performances
  295. * raisonables.
  296. tmp4 = INTG 'ELEM' tmp4 tmp5 tmp6 ;
  297. tmp4 = tmp4 / (REDU VI tmp5) ;
  298. SI (EGA &itr 1) ;
  299. tmp = tmp4 ;
  300. SINO ;
  301. tmp = tmp Et tmp4 ;
  302. FINS ;
  303. FIN itr ;
  304. tmp = tmp * (NBNO (mshtab.(1) ELEM 1)) ;
  305. FINS ;
  306. *TRAC tmp modMI ;
  307. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  308. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  309.  
  310. * dC/dY on I
  311. * Remark: minus sign on λ is compensated here
  312. SI LdFdY ;
  313. * If the loading is physical density dependent
  314. * ∂C/∂Y = λᵀ * (∂K/∂Y * U - ∂F/∂Y)
  315. tmp1 = PSCA lamI1 NdFdYI (EXTR NdFdYI 'COMP') (EXTR NdFdYI 'COMP') ;
  316. dCdYI = (INTG 'ELEM' tmp1 modMI) - tmp ;
  317. SINO ;
  318. * Otherwise
  319. * ∂C/∂Y = λᵀ * (∂K/∂Y * U)
  320. dCdYI = -1.0 * tmp ;
  321. FINS ;
  322.  
  323. * Total derivative of G with respect to physical densities Y on D
  324. * ***************************************************************
  325.  
  326. * Total derivative dG/dY
  327. totdGdYD = dGdYD + (REDU dCdYI modMD) ;
  328.  
  329. * Volume-normalization
  330. * ********************
  331.  
  332. NtotdGdYD = totdGdYD / VD ;
  333.  
  334. FINP NtotdGdYD ;
  335.  
  336.  
  337.  

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