Télécharger topoptim.procedur

Retour à la liste

Numérotation des lignes :

  1. * TOPOPTIM PROCEDUR FD218221 21/04/14 21:15:09 10965
  2.  
  3. ************************************************************************
  4. ** Topology optimization procedure
  5. **
  6. ** Author:
  7. ** Guenhael Le Quilliec (LaMe - Polytech Tours)
  8. **
  9. ** Version:
  10. ** 2.4 2021/04/14 Fixing an issue with TET4 in frozen area
  11. ** 2.3 2021/03/19 Modification of default value of 'OC_L2'
  12. ** 2.2 2018/02/09 Make it compatible with the new version of TOPOSAUV
  13. ** allowing early stop and restart of the optimization
  14. ** 2.1 2017/11/11 Compliant mechanism output displacement maximization
  15. ** 2.0 2017/04/18 Geometric restrictions, non-linear, multiobjective,
  16. ** multiphysic, customable topology optimization
  17. ** 1.1 2015/11/02 Check if volume fraction > proportion of frozen area
  18. ** 1.0 2014/04/28 Linear mono-objective topology optimization
  19. ************************************************************************
  20.  
  21. DEBP TOPOPTIM tab0*'TABLE' ;
  22.  
  23. **********************************************************************
  24. * START MESSAGE *
  25. **********************************************************************
  26.  
  27. MESS ' ' ;
  28. MESS ' ' ;
  29. MESS ' ' ;
  30. MESS '+-----------------------------------------------------------------------------+' ;
  31. MESS '| |' ;
  32. MESS '| |' ;
  33. MESS '| DEBUT DE LA PROCEDURE |' ;
  34. MESS '| |' ;
  35. MESS '| ______ ______ ______ ______ ______ ______ __ __ __ |' ;
  36. MESS '| /\__ _\/\ __ \ /\ == \/\ __ \ /\ == \/\__ _\/\ \ /\ =-./ \ v2.4 |' ;
  37. MESS '| \/_/\ \/\ \ \/\ \\ \ _-/\ \ \/\ \\ \ _-/\/_/\ \/\ \ \\ \ \-./\ \ ---- |' ;
  38. MESS '| \ \_\ \ \_____\\ \_\ \ \_____\\ \_\ \ \_\ \ \_\\ \_\ \ \_\ |' ;
  39. MESS '| \/_/ \/_____/ \/_/ \/_____/ \/_/ \/_/ \/_/ \/_/ \/_/ |' ;
  40. MESS '| _______________________________________________________________ |' ;
  41. MESS '| /\______________________________________________________________\ |' ;
  42. MESS '| \/______________________________________________________________/ |' ;
  43. MESS '| |' ;
  44. MESS '| |' ;
  45. MESS '+-----------------------------------------------------------------------------+' ;
  46. MESS ' ' ;
  47.  
  48. **********************************************************************
  49. * INPUT *
  50. **********************************************************************
  51.  
  52. * Mesh, model, boundary conditions and loading
  53. * ********************************************
  54.  
  55. * Table of the finite element model data
  56. sbs0 = EXIS tab0 'RESOLUTION_PASAPAS' ;
  57. SI sbs0 ;
  58. mdl0 = tab0.'RESOLUTION_PASAPAS' ;
  59. SINO ;
  60. mdl0 = tab0.'RESOLUTION_LINEAIRE' ;
  61. FINS ;
  62.  
  63. * Mechanical boundary conditions
  64. bcM_nb0 = 0 ;
  65. SI (EXIS mdl0 'BLOCAGES_MECANIQUES') ;
  66. bcM_nb0 = 1 ;
  67. bcM0 = mdl0.'BLOCAGES_MECANIQUES' ;
  68. SI (EGA (TYPE bcM0) 'TABLE') ;
  69. REPE loop1 (DIME bcM0) ;
  70. SI (EXIS bcM0 &loop1) ;
  71. bcM_nb0 = &loop1 ;
  72. FINS ;
  73. FIN loop1 ;
  74. SI (EGA bcM_nb0 1) ;
  75. bcM0 = bcM0.(1) ;
  76. FINS ;
  77. FINS ;
  78. FINS ;
  79.  
  80. * Thermal boundary conditions
  81. bcT_nb0 = 0 ;
  82. SI (EXIS mdl0 'BLOCAGES_THERMIQUES') ;
  83. bcT_nb0 = 1 ;
  84. bcT0 = mdl0.'BLOCAGES_THERMIQUES' ;
  85. SI (EGA (TYPE bcT0) 'TABLE') ;
  86. REPE loop1 (DIME bcT0) ;
  87. SI (EXIS bcT0 &loop1) ;
  88. bcT_nb0 = &loop1 ;
  89. FINS ;
  90. FIN loop1 ;
  91. SI (EGA bcT_nb0 1) ;
  92. bcT0 = bcT0.(1) ;
  93. FINS ;
  94. FINS ;
  95. FINS ;
  96.  
  97. * Loading
  98. load_nb0 = 1 ;
  99. load0 = mdl0.'CHARGEMENT' ;
  100. SI (EGA (TYPE load0) 'TABLE') ;
  101. REPE loop1 (DIME load0) ;
  102. SI (EXIS load0 &loop1) ;
  103. load_nb0 = &loop1 ;
  104. FINS ;
  105. FIN loop1 ;
  106. SI (EGA load_nb0 1) ;
  107. load0 = load0.(1) ;
  108. FINS ;
  109. FINS ;
  110.  
  111. * Model
  112. mod0 = mdl0.'MODELE' ;
  113. mecha0 = EXIS mod0 'FORM' 'MECANIQUE' ;
  114. SI mecha0 ;
  115. modM0 = EXTR mod0 'FORM' 'MECANIQUE' ;
  116. FINS ;
  117. therm0 = EXIS mod0 'FORM' 'THERMIQUE' ;
  118. SI therm0 ;
  119. modT0 = EXTR mod0 'FORM' 'THERMIQUE' ;
  120. FINS ;
  121. cntct0 = EXIS mod0 'FORM' 'CONTACT' ;
  122. SI cntct0 ;
  123. modC0 = EXTR mod0 'FORM' 'CONTACT' ;
  124. FINS ;
  125.  
  126. * Material
  127. mat0 = mdl0.'CARACTERISTIQUES' ;
  128. SI mecha0 ;
  129. matM0 = REDU mat0 modM0 ;
  130. FINS ;
  131. SI therm0 ;
  132. matT0 = REDU mat0 modT0 ;
  133. FINS ;
  134. SI cntct0 ;
  135. matC0 = REDU mat0 modC0 ;
  136. FINS ;
  137.  
  138. * Mesh
  139. msh0 = EXTR mod0 'MAIL' ;
  140. SI mecha0 ;
  141. mshMT0 = EXTR modM0 'MAIL' ;
  142. SINO ;
  143. mshMT0 = EXTR modT0 'MAIL' ;
  144. FINS ;
  145. SI cntct0 ;
  146. mshC0 = EXTR modC0 'MAIL' ;
  147. FINS ;
  148.  
  149. * Check that the number of elements of each mesh (thermal and mecha)
  150. * equals that of the global mesh otherwise the procedure can't work
  151. SI (mecha0 ET therm0) ;
  152. SI (NEG (NBEL (EXTR modM0 'MAIL')) (NBEL (EXTR modT0 'MAIL'))) ;
  153. MESS 'Les modeles thermique et mecanique doivent s''appuyer sur un meme maillage.' ;
  154. ERRE 'Veuillez adapter vos modeles en consequence.' ;
  155. FINS ;
  156. FINS ;
  157.  
  158. * Compliant mechanism topology optimization
  159. mcn0 = EXIS tab0 'MECANISME' ;
  160.  
  161. * Compliant mechanism output loading
  162. load_nb1 = 0 ;
  163. SI mcn0 ;
  164. load_nb1 = 1 ;
  165. load1 = tab0.'MECANISME' ;
  166. SI (EGA (TYPE load1) 'TABLE') ;
  167. REPE loop1 (DIME load1) ;
  168. SI (EXIS load1 &loop1) ;
  169. load_nb1 = &loop1 ;
  170. FINS ;
  171. FIN loop1 ;
  172. SI (EGA load_nb1 1) ;
  173. load1 = load1.(1) ;
  174. FINS ;
  175. FINS ;
  176. FINS ;
  177.  
  178. * Solve the problem also without springs
  179. SI (NON (EXIS tab0 'MECANISME_ZERO_SPRING')) ;
  180. tab0.'MECANISME_ZERO_SPRING' = FAUX ;
  181. FINS ;
  182. ZeroSpg0 = tab0.'MECANISME_ZERO_SPRING' ;
  183.  
  184. * Check that a mechanical model exists
  185. SI (mcn0 ET (NON mecha0)) ;
  186. MESS 'Pour effectuer une optimisation de mecanisme deformable, il faut imperativement preciser un modele mecanique.' ;
  187. ERRE 'Veuillez preciser le modele mecanique a utiliser.' ;
  188. FINS ;
  189.  
  190. * General optimization options
  191. * ****************************
  192.  
  193. * Frozen area
  194. froz0 = EXIS tab0 'ZONE_FIGEE' ;
  195. SI froz0 ;
  196. msh2 = tab0.'ZONE_FIGEE' ;
  197. msh1 = DIFF mshMT0 msh2 ;
  198. SI mecha0 ;
  199. modM1 = REDU modM0 msh1 ;
  200. modM2 = REDU modM0 msh2 ;
  201. matM1 = REDU matM0 msh1 ;
  202. matM2 = REDU matM0 msh2 ;
  203. FINS ;
  204. SI therm0 ;
  205. modT1 = REDU modT0 msh1 ;
  206. modT2 = REDU modT0 msh2 ;
  207. matT1 = REDU matT0 msh1 ;
  208. matT2 = REDU matT0 msh2 ;
  209. FINS ;
  210. SINO ;
  211. msh1 = mshMT0 ;
  212. SI mecha0 ;
  213. modM1 = modM0 ;
  214. matM1 = matM0 ;
  215. FINS ;
  216. SI therm0 ;
  217. modT1 = modT0 ;
  218. matT1 = matT0 ;
  219. FINS ;
  220. FINS ;
  221.  
  222. * Ratio between the mechanical stiffness of the voids and the material
  223. SI (NON (EXIS tab0 'RAPPORT_RAIDEURS_MECANIQUES')) ;
  224. SI (mcn0 OU therm0) ;
  225. tab0.'RAPPORT_RAIDEURS_MECANIQUES' = 1.0e-8 ;
  226. SINO ;
  227. tab0.'RAPPORT_RAIDEURS_MECANIQUES' = 0.0 ;
  228. FINS ;
  229. FINS ;
  230. vdM0 = tab0.'RAPPORT_RAIDEURS_MECANIQUES' ;
  231.  
  232. * Ratio between the thermal stiffness of the voids and the material
  233. SI (NON (EXIS tab0 'RAPPORT_RAIDEURS_THERMIQUES')) ;
  234. tab0.'RAPPORT_RAIDEURS_THERMIQUES' = 0.001 ;
  235. FINS ;
  236. vdT0 = tab0.'RAPPORT_RAIDEURS_THERMIQUES' ;
  237.  
  238. * Minimal threshold value of the topology field to save elements
  239. SI (NON (EXIS tab0 'SEUIL')) ;
  240. tab0.'SEUIL' = 1.0e-9 ;
  241. FINS ;
  242. thrsh0 = tab0.'SEUIL' ;
  243.  
  244. * Volume fraction
  245. SI (NON (EXIS tab0 'FRACTION_VOLUME')) ;
  246. tab0.'FRACTION_VOLUME' = 0.4 ;
  247. FINS ;
  248. volfrac0 = FLOT tab0.'FRACTION_VOLUME' ;
  249.  
  250. * Personal procedure that can be used, amongst others, to
  251. * calculate/modify the sensibility field and objective value
  252. SI (NON (EXIS tab0 'PROCEDURE_TOPOPERS')) ;
  253. tab0.'PROCEDURE_TOPOPERS' = FAUX ;
  254. FINS ;
  255. ProcP0 = tab0.'PROCEDURE_TOPOPERS' ;
  256.  
  257. * Weights
  258. SI (NON (EXIS tab0 'POIDS_MECANISME')) ;
  259. tab0.'POIDS_MECANISME' = 1.0 ;
  260. FINS ;
  261. WghtMcn0 = tab0.'POIDS_MECANISME' ;
  262. SI (NON (EXIS tab0 'POIDS_ENERGIE_DEFO')) ;
  263. SI mcn0 ;
  264. tab0.'POIDS_ENERGIE_DEFO' = 0.0 ;
  265. SINO ;
  266. tab0.'POIDS_ENERGIE_DEFO' = 1.0 ;
  267. FINS ;
  268. FINS ;
  269. WghtM0 = tab0.'POIDS_ENERGIE_DEFO' ;
  270. SI (NON (EXIS tab0 'POIDS_TEMPERATURE')) ;
  271. SI mcn0 ;
  272. tab0.'POIDS_TEMPERATURE' = 0.0 ;
  273. SINO ;
  274. tab0.'POIDS_TEMPERATURE' = 1.0 ;
  275. FINS ;
  276. FINS ;
  277. WghtT0 = tab0.'POIDS_TEMPERATURE' ;
  278.  
  279. * Procedure to add a geometric restrictions
  280. ProcR0 = EXIS tab0 'RESTRICTIONS' ;
  281.  
  282. * Number of the last completed cycle
  283. SI (NON (EXIS tab0 'CYCLE')) ;
  284. tab0.'CYCLE' = 0 ;
  285. FINS ;
  286. cy0 = (ENTI (tab0.'CYCLE')) + 1 ;
  287.  
  288. * Maximum number of optimization cycles
  289. SI (NON (EXIS tab0 'MAX_CYCLES')) ;
  290. tab0.'MAX_CYCLES' = 100 ;
  291. FINS ;
  292. maxcy0 = ENTI (tab0.'MAX_CYCLES') ;
  293.  
  294. * Filter rate
  295. SI (NON (EXIS tab0 'TAUX_FILTRAGE')) ;
  296. tab0.'TAUX_FILTRAGE' = 1 ;
  297. FINS ;
  298. frate0 = tab0.'TAUX_FILTRAGE' ;
  299.  
  300. * Convergence criterion
  301. SI (NON (EXIS tab0 'CRITERE')) ;
  302. tab0.'CRITERE' = 0.01 ;
  303. FINS ;
  304. crit0 = tab0.'CRITERE' ;
  305.  
  306. * Maximum increment of the topology field between two cycles
  307. SI (NON (EXIS tab0 'TOPOLOGIE_MAX_INC')) ;
  308. tab0.'TOPOLOGIE_MAX_INC' = 0.2 ;
  309. FINS ;
  310.  
  311. * Topology minimum value of the optimality criterion method
  312. SI (NON (EXIS tab0 'TOPOLOGIE_MIN')) ;
  313. SI mcn0 ;
  314. tab0.'TOPOLOGIE_MIN' = 0.001 ;
  315. SINO ;
  316. tab0.'TOPOLOGIE_MIN' = 0.0 ;
  317. FINS ;
  318. FINS ;
  319.  
  320. * Optimality criterion (OC)
  321. * *************************
  322.  
  323. * Initial lower bound for the Lagrangian multiplier
  324. SI (NON (EXIS tab0 'OC_L1')) ;
  325. tab0.'OC_L1' = 0.0 ;
  326. FINS ;
  327.  
  328. * Initial upper bound for the Lagrangian multiplier
  329. *SI (NON (EXIS tab0 'OC_L2')) ;
  330. * tab0.'OC_L2' = 1.0e5 ;
  331. *FINS ;
  332.  
  333. * Minimal value for the upper bound
  334. SI (NON (EXIS tab0 'OC_L2_MIN')) ;
  335. tab0.'OC_L2_MIN' = 1.0e-40 ;
  336. FINS ;
  337.  
  338. * Convergence criterion for the bi-sectioning algorithm
  339. SI (NON (EXIS tab0 'OC_CRITERE')) ;
  340. tab0.'OC_CRITERE' = 1.0e-8 ;
  341. FINS ;
  342.  
  343. * Maximum number of iterations for the bi-sectioning algorithm
  344. SI (NON (EXIS tab0 'OC_MAX_IT')) ;
  345. tab0.'OC_MAX_IT' = 1.0e5 ;
  346. FINS ;
  347.  
  348. * Lower bound for B (where B**D is the ratio between the new and the
  349. * previous topology fields)
  350. SI (NON (EXIS tab0 'OC_B_MIN')) ;
  351. tab0.'OC_B_MIN' = 1.0e-10 ;
  352. FINS ;
  353.  
  354. * Damping factor (D)
  355. * ******************
  356.  
  357. SI (NON (EXIS tab0 'FACTEUR_D')) ;
  358. tab0.'FACTEUR_D' = 0.5 ;
  359. FINS ;
  360. dVari0 = EGA (TYPE tab0.'FACTEUR_D') 'EVOLUTIO' ;
  361. SI dVari0 ;
  362. dEvol0 = tab0.'FACTEUR_D' ;
  363. d0 = IPOL (FLOT cy0) dEvol0 ;
  364. SINO ;
  365. d0 = tab0.'FACTEUR_D' ;
  366. FINS ;
  367.  
  368. * Penalty factor (P)
  369. * ******************
  370.  
  371. * Start value of P
  372. SI (NON (EXIS tab0 'FACTEUR_P')) ;
  373. tab0.'FACTEUR_P' = 3.0 ;
  374. FINS ;
  375. pVari0 = EGA (TYPE tab0.'FACTEUR_P') 'EVOLUTIO' ;
  376. SI pVari0 ;
  377. pEvol0 = tab0.'FACTEUR_P' ;
  378. p0 = IPOL (FLOT cy0) pEvol0 ;
  379. SINO ;
  380. p0 = tab0.'FACTEUR_P' ;
  381. FINS ;
  382.  
  383. * Grey Scale Factor (Q)
  384. * *********************
  385.  
  386. * Start value of Q
  387. SI (NON (EXIS tab0 'FACTEUR_Q')) ;
  388. tab0.'FACTEUR_Q' = 1.0 ;
  389. FINS ;
  390. qVari0 = EGA (TYPE tab0.'FACTEUR_Q') 'EVOLUTIO' ;
  391. SI qVari0 ;
  392. qEvol0 = tab0.'FACTEUR_Q' ;
  393. q0 = IPOL (FLOT cy0) qEvol0 ;
  394. SINO ;
  395. q0 = tab0.'FACTEUR_Q' ;
  396. FINS ;
  397.  
  398. * Complementary options
  399. * *********************
  400.  
  401. * Only for step by step resolution
  402. SI sbs0 ;
  403. * Save time list
  404. SI (NON (EXIS mdl0 'TEMPS_SAUVES')) ;
  405. SavTime0 = EXTR (LECT 1 (DIME mdl0.'TEMPS_CALCULES')) mdl0.'TEMPS_CALCULES' ;
  406. SINO ;
  407. SavTime0 = mdl0.'TEMPS_SAUVES' ;
  408. FINS ;
  409. * Number of steps
  410. NbStp0 = (DIME SavTime0) - 1 ;
  411. FINS ;
  412.  
  413. * Numerical precision
  414. SI (NON (EXIS tab0 'PRECISION')) ;
  415. tab0.'PRECISION' = 1.0e-9 ;
  416. FINS ;
  417. prec0 = tab0.'PRECISION' ;
  418.  
  419. * Division by zero protection
  420. SI (NON (EXIS tab0 'ZERO_DIVISION')) ;
  421. tab0.'ZERO_DIVISION' = 0.001 ;
  422. FINS ;
  423. zdiv0 = tab0.'ZERO_DIVISION' ;
  424.  
  425. * Draw topology
  426. SI (NON (EXIS tab0 'TRAC')) ;
  427. tab0.'TRAC' = VRAI ;
  428. FINS ;
  429. trac0 = tab0.'TRAC' ;
  430.  
  431. * Convergence
  432. tab0.'CONVERGENCE' = FAUX ;
  433.  
  434. * Cycles to be saved
  435. SI (NON (EXIS tab0 'CYCLES_SAUVEGARDES')) ;
  436. tab0.'CYCLES_SAUVEGARDES' = LECT ;
  437. FINS ;
  438.  
  439. * Data to be saved
  440. SI (NON (EXIS tab0 'MES_SAUVEGARDES')) ;
  441. tab0.'MES_SAUVEGARDES' = TABL ;
  442. FINS ;
  443. SI (NON (EXIS tab0.'MES_SAUVEGARDES' 'TOPOLOGIE')) ;
  444. tab0.'MES_SAUVEGARDES'.'TOPOLOGIE' = VRAI ;
  445. FINS ;
  446. SI (NON (EXIS tab0.'MES_SAUVEGARDES' 'MAILLAGE')) ;
  447. tab0.'MES_SAUVEGARDES'.'MAILLAGE' = VRAI ;
  448. FINS ;
  449. SI (NON (EXIS tab0.'MES_SAUVEGARDES' 'RESOLUTION')) ;
  450. tab0.'MES_SAUVEGARDES'.'RESOLUTION' = FAUX ;
  451. FINS ;
  452.  
  453. * Topology output table
  454. SI (NON (EXIS tab0 'TOPOLOGIE')) ;
  455. tab0.'TOPOLOGIE' = TABL ;
  456. FINS ;
  457.  
  458. * Mesh output table
  459. SI (NON (EXIS tab0 'MAILLAGE')) ;
  460. tab0.'MAILLAGE' = TABL ;
  461. FINS ;
  462.  
  463. * Resolution output table
  464. SI (NON (EXIS tab0 'RESOLUTION')) ;
  465. tab0.'RESOLUTION' = TABL ;
  466. FINS ;
  467.  
  468. **********************************************************************
  469. * PREPROCESSING *
  470. **********************************************************************
  471.  
  472. * Various element fields
  473. * **********************
  474.  
  475. * Mechanical model element fields
  476. SI mecha0 ;
  477. * Unitary field
  478. unM1 = MANU 'CHML' modM1 'SCAL' 1.0 'TYPE' 'SCALAIRE' 'GRAVITE' ;
  479. * Volume of each element
  480. volElM1 = INTG 'ELEM' unM1 modM1 matM0 ;
  481. * Change the unitary field so that is not considered as constant
  482. * to avoid problems with the function POIN 'SUPE'
  483. unM1 = volElM1 / volElM1 ;
  484. SI froz0 ;
  485. * Unitary field
  486. unM2 = MANU 'CHML' modM2 'SCAL' 1.0 'TYPE' 'SCALAIRE' 'GRAVITE' ;
  487. * Volume of each element
  488. volElM2 = INTG 'ELEM' unM2 modM2 matM0 ;
  489. FINS ;
  490. FINS ;
  491.  
  492. * Thermal model element fields
  493. SI therm0 ;
  494. * Unitary field
  495. unT1 = MANU 'CHML' modT1 'SCAL' 1.0 'TYPE' 'SCALAIRE' 'GRAVITE' ;
  496. * Volume of each element
  497. volElT1 = INTG 'ELEM' unT1 modT1 matT0 ;
  498. * In thermal mode, 'GRAVITE' option is not respected
  499. * This problem is solved by INTG 'ELEM' divided by itself
  500. * This also change the unitary field so that is not considered as
  501. * constant to avoid problems with the function POIN 'SUPE'
  502. unT1 = volElT1 / volElT1 ;
  503. SI froz0 ;
  504. * Unitary field
  505. unT2 = MANU 'CHML' modT2 'SCAL' 1.0 'TYPE' 'SCALAIRE' 'GRAVITE' ;
  506. * Volume of each element
  507. volElT2 = INTG 'ELEM' unT2 modT2 matT0 ;
  508. * In thermal mode, 'GRAVITE' option is not respected
  509. * This problem is solved by INTG 'ELEM' divided by itself
  510. unT2 = volElT2 / volElT2 ;
  511. FINS ;
  512. FINS ;
  513.  
  514. * Default fields
  515. SI mecha0 ;
  516. un1 = unM1 ;
  517. SI froz0 ;
  518. un2 = unM2 ;
  519. FINS ;
  520. SINO ;
  521. un1 = unT1 ;
  522. SI froz0 ;
  523. un2 = unT2 ;
  524. FINS ;
  525. FINS ;
  526. zero1 = un1 * 0.0 ;
  527. voidM1 = un1 * vdM0 ;
  528. voidT1 = un1 * vdT0 ;
  529. * Node mesh of the barycenters
  530. bmsh1 = un1 POIN 'SUPE' -1.0 ;
  531.  
  532. * Initial volumes
  533. SI froz0 ;
  534. SI mecha0 ;
  535. vol1 = INTG un1 modM1 matM1 ;
  536. vol2 = INTG un2 modM2 matM2 ;
  537. SINO ;
  538. vol1 = INTG un1 modT1 matT1 ;
  539. vol2 = INTG un2 modT2 matT2 ;
  540. FINS ;
  541. vol0 = vol1 + vol2 ;
  542. SINO ;
  543. SI mecha0 ;
  544. vol1 = INTG un1 modM1 matM1 ;
  545. SINO ;
  546. vol1 = INTG un1 modT1 matT1 ;
  547. FINS ;
  548. vol2 = 0.0 ;
  549. vol0 = vol1 ;
  550. FINS ;
  551.  
  552. * Initial topology
  553. SI (EXIS tab0.'TOPOLOGIE' (cy0 - 1)) ;
  554. SI mecha0 ;
  555. * Express the input topology element field at the barycenters of
  556. * the elements of the model modM1
  557. x0 = TOPOCHAN tab0.'TOPOLOGIE'.(cy0 - 1) modM1 bmsh1 ;
  558. x0 = CHAN 'TYPE' x0 'SCALAIRE' ;
  559. x0 = x0 * (vol1 * volfrac0 / (INTG x0 modM1 matM1)) ;
  560. SINO ;
  561. * Express the input topology element field at the barycenters of
  562. * the elements of the model modT1
  563. x0 = TOPOCHAN tab0.'TOPOLOGIE'.(cy0 - 1) modT1 bmsh1 ;
  564. x0 = CHAN 'TYPE' x0 'SCALAIRE' ;
  565. * In thermal mode, 'GRAVITE' option is not respected
  566. * This problem is solved by INTG 'ELEM'
  567. x0 = (INTG 'ELEM' x0 modT1 matT1) / volElT1 ;
  568. x0 = x0 * (vol1 * volfrac0 / (INTG x0 modT1 matT1)) ;
  569. FINS ;
  570. SINO ;
  571. SI (NEG cy0 1) ;
  572. MESS (CHAI 'Le cycle de depart est le ' cy0 '.') ;
  573. MESS (CHAI 'Or la topologie ' (cy0 - 1) ' n''existe pas.') ;
  574. ERRE 'Veuillez preciser la topologie du cycle precedent.' ;
  575. SINO ;
  576. x0 = un1 * volfrac0 ;
  577. FINS ;
  578. FINS ;
  579.  
  580. * Multiple cases of loads and/or boundary conditions
  581. case_nb0 = MAXI (LECT load_nb0 load_nb1 bcT_nb0 bcM_nb0) ;
  582. mltcase0 = case_nb0 > 1 ;
  583. SI mltcase0 ;
  584. SI (((load_nb0 > 1) ET (NEG load_nb0 case_nb0)) OU
  585. ((load_nb1 > 1) ET (NEG load_nb1 case_nb0)) OU
  586. ((bcT_nb0 > 1) ET (NEG bcT_nb0 case_nb0)) OU
  587. ((bcM_nb0 > 1) ET (NEG bcM_nb0 case_nb0))) ;
  588. MESS 'Le nombre de cas de charges ne correspond pas au nombre de cas de conditions aux limites.'
  589. ' Lorsque superieurs a 1, le nombre de cas de charge et de cas de conditions aux limites doivent correspondre.';
  590. ERRE 'Veuillez verifier vos donnees d''entree.' ;
  591. FINS ;
  592. * Transform a single load into a list of identical loads in a table
  593. SI (EGA load_nb0 1) ;
  594. tmp0 = TABL ;
  595. REPE loop1 case_nb0 ;
  596. tmp0.&loop1 = load0 ;
  597. FIN loop1 ;
  598. load0 = tmp0 ;
  599. FINS ;
  600. * Transform a single load into a list of identical loads in a table
  601. SI (EGA load_nb1 1) ;
  602. tmp0 = TABL ;
  603. REPE loop1 case_nb0 ;
  604. tmp0.&loop1 = load1 ;
  605. FIN loop1 ;
  606. load1 = tmp0 ;
  607. FINS ;
  608. * Transform mecha. BC into a list of identical mecha. BC in a table
  609. SI (EGA bcM_nb0 1) ;
  610. tmp0 = TABL ;
  611. REPE loop1 case_nb0 ;
  612. tmp0.&loop1 = bcM0 ;
  613. FIN loop1 ;
  614. bcM0 = tmp0 ;
  615. FINS ;
  616. * Transform therm. BC into a list of identical therm. BC in a table
  617. SI (EGA bcT_nb0 1) ;
  618. tmp0 = TABL ;
  619. REPE loop1 case_nb0 ;
  620. tmp0.&loop1 = bcT0 ;
  621. FIN loop1 ;
  622. bcT0 = tmp0 ;
  623. FINS ;
  624. FINS ;
  625.  
  626. * Number and name of the components for the forces and the
  627. * displacements
  628. SI mecha0 ;
  629. CompFrc0 = EXTR modM0 'FORC' ;
  630. CompDpl0 = EXTR modM0 'DEPL' ;
  631. CompNb0 = DIME CompDpl0 ;
  632. FINS ;
  633.  
  634. * Springs for the compliant mechanism optimization
  635. SI mcn0 ;
  636. SI mltcase0 ;
  637. Spr0 = TABL ;
  638. REPE loop1 case_nb0 ;
  639. Spr0.&loop1 = VIDE 'RIGIDITE'/'RIGIDITE' ;
  640. SI sbs0 ;
  641. tmp0 = EXTR (DIME SavTime0) SavTime0 ;
  642. tmp0 = (TIRE load0.&loop1 tmp0) + (TIRE load1.&loop1 tmp0) ;
  643. SINO ;
  644. tmp0 = load0.&loop1 + load1.&loop1 ;
  645. FINS ;
  646. tmp1 = EXTR tmp0 'MAIL' ;
  647. tmp2 = NBNO tmp1 ;
  648. REPE loop2 CompNb0 ;
  649. tmp3 = EXTR CompFrc0 &loop2 ;
  650. tmp4 = EXTR CompDpl0 &loop2 ;
  651. REPE loop3 tmp2 ;
  652. tmp5 = tmp1 POIN &loop3 ;
  653. tmp6 = (ABS (EXTR tmp0 tmp3 tmp5)) * 0.1 ;
  654. Spr0.&loop1 = Spr0.&loop1 ET (APPU tmp4 tmp6 tmp5) ;
  655. FIN loop3 ;
  656. FIN loop2 ;
  657. FIN loop1 ;
  658. SINO ;
  659. Spr0 = VIDE 'RIGIDITE'/'RIGIDITE' ;
  660. SI sbs0 ;
  661. tmp0 = EXTR (DIME SavTime0) SavTime0 ;
  662. tmp0 = (TIRE load0 tmp0) + (TIRE load1 tmp0) ;
  663. SINO ;
  664. tmp0 = load0 + load1 ;
  665. FINS ;
  666. tmp1 = EXTR tmp0 'MAIL' ;
  667. tmp2 = NBNO tmp1 ;
  668. REPE loop1 CompNb0 ;
  669. tmp3 = EXTR CompFrc0 &loop1 ;
  670. tmp4 = EXTR CompDpl0 &loop1 ;
  671. REPE loop2 tmp2 ;
  672. tmp5 = tmp1 POIN &loop2 ;
  673. tmp6 = (ABS (EXTR tmp0 tmp3 tmp5)) * 0.1 ;
  674. Spr0 = Spr0 ET (APPU tmp4 tmp6 tmp5) ;
  675. FIN loop2 ;
  676. FIN loop1 ;
  677. FINS ;
  678. FINS ;
  679.  
  680. * Isovalues
  681. isoval0 = PROG 0.0 'PAS' (1.0 / 56.0) 1.0 ;
  682.  
  683. * Initializations
  684. Lstobj0 = PROG ;
  685. Lstchg0 = PROG ;
  686. Lstp0 = PROG ;
  687. Lstq0 = PROG ;
  688. Lstnbel0 = LECT ;
  689.  
  690. **********************************************************************
  691. * WORKING TABLE *
  692. **********************************************************************
  693.  
  694. * This table will be used to save some data in case they are needed
  695. * outsite this procedure
  696.  
  697. * Some input data
  698. * ***************
  699.  
  700. tab0.'WTABLE' = TABL ;
  701. tab0.'WTABLE'.'CYCLE' = cy0 ;
  702. tab0.'WTABLE'.'NB_CAS' = case_nb0 ;
  703. tab0.'WTABLE'.'MAILLAGE' = TABL ;
  704. tab0.'WTABLE'.'MAILLAGE'.(0) = msh0 ;
  705. tab0.'WTABLE'.'MAILLAGE'.(1) = msh1 ;
  706. tab0.'WTABLE'.'MAILLAGE'.'GRAVITE' = bmsh1 ;
  707. SI froz0 ;
  708. tab0.'WTABLE'.'MAILLAGE'.(2) = msh2 ;
  709. FINS ;
  710. tab0.'WTABLE'.'MODELE' = TABL ;
  711. SI mecha0 ;
  712. tab0.'WTABLE'.'MECANIQUE' = TABL ;
  713. tab0.'WTABLE'.'MECANIQUE'.'MODELE' = TABL ;
  714. tab0.'WTABLE'.'MECANIQUE'.'MODELE'.(0) = modM0 ;
  715. tab0.'WTABLE'.'MECANIQUE'.'MODELE'.(1) = modM1 ;
  716. tab0.'WTABLE'.'MECANIQUE'.'CARACTERISTIQUES' = TABL ;
  717. tab0.'WTABLE'.'MECANIQUE'.'CARACTERISTIQUES'.(0) = matM0 ;
  718. tab0.'WTABLE'.'MECANIQUE'.'CARACTERISTIQUES'.(1) = matM1 ;
  719. SI froz0 ;
  720. tab0.'WTABLE'.'MECANIQUE'.'MODELE'.(2) = modM2 ;
  721. tab0.'WTABLE'.'MECANIQUE'.'CARACTERISTIQUES'.(2) = matM2 ;
  722. FINS ;
  723. FINS ;
  724. SI therm0 ;
  725. tab0.'WTABLE'.'THERMIQUE' = TABL ;
  726. tab0.'WTABLE'.'THERMIQUE'.'MODELE' = TABL ;
  727. tab0.'WTABLE'.'THERMIQUE'.'MODELE'.(0) = modT0 ;
  728. tab0.'WTABLE'.'THERMIQUE'.'MODELE'.(1) = modT1 ;
  729. tab0.'WTABLE'.'THERMIQUE'.'CARACTERISTIQUES' = TABL ;
  730. tab0.'WTABLE'.'THERMIQUE'.'CARACTERISTIQUES'.(0) = matT0 ;
  731. tab0.'WTABLE'.'THERMIQUE'.'CARACTERISTIQUES'.(1) = matT1 ;
  732. SI froz0 ;
  733. tab0.'WTABLE'.'THERMIQUE'.'MODELE'.(2) = modT2 ;
  734. tab0.'WTABLE'.'THERMIQUE'.'CARACTERISTIQUES'.(2) = matT2 ;
  735. FINS ;
  736. FINS ;
  737. SI cntct0 ;
  738. tab0.'WTABLE'.'CONTACT' = TABL ;
  739. tab0.'WTABLE'.'CONTACT'.'MODELE' = modC0 ;
  740. FINS ;
  741.  
  742. * Element fields
  743. * **************
  744.  
  745. SI mecha0 ;
  746. tab0.'WTABLE'.'MECANIQUE'.'UN' = TABL ;
  747. tab0.'WTABLE'.'MECANIQUE'.'UN'.(1) = unM1 ;
  748. tab0.'WTABLE'.'MECANIQUE'.'VOLUME' = TABL ;
  749. tab0.'WTABLE'.'MECANIQUE'.'VOLUME'.(1) = volElM1 ;
  750. SI froz0 ;
  751. tab0.'WTABLE'.'MECANIQUE'.'UN'.(2) = unM2 ;
  752. tab0.'WTABLE'.'MECANIQUE'.'VOLUME'.(2) = volElM2 ;
  753. FINS ;
  754. FINS ;
  755. SI therm0 ;
  756. tab0.'WTABLE'.'THERMIQUE'.'UN' = TABL ;
  757. tab0.'WTABLE'.'THERMIQUE'.'UN'.(1) = unT1 ;
  758. tab0.'WTABLE'.'THERMIQUE'.'VOLUME' = TABL ;
  759. tab0.'WTABLE'.'THERMIQUE'.'VOLUME'.(1) = volElT1 ;
  760. SI froz0 ;
  761. tab0.'WTABLE'.'THERMIQUE'.'UN'.(2) = unT2 ;
  762. tab0.'WTABLE'.'THERMIQUE'.'VOLUME'.(2) = volElT2 ;
  763. FINS ;
  764. FINS ;
  765. tab0.'WTABLE'.'UN' = TABL ;
  766. tab0.'WTABLE'.'UN'.(1) = un1 ;
  767. SI froz0 ;
  768. tab0.'WTABLE'.'UN'.(2) = un2 ;
  769. FINS ;
  770.  
  771. * Volumes
  772. * *******
  773.  
  774. tab0.'WTABLE'.'VOLUME' = TABL ;
  775. tab0.'WTABLE'.'VOLUME'.(0) = vol0 ;
  776. tab0.'WTABLE'.'VOLUME'.(1) = vol1 ;
  777. SI froz0 ;
  778. tab0.'WTABLE'.'VOLUME'.(1) = vol1 ;
  779. FINS ;
  780.  
  781. * Optimization data
  782. * *****************
  783.  
  784. tab0.'WTABLE'.'FACTEUR_D' = d0 ;
  785. tab0.'WTABLE'.'FACTEUR_P' = p0 ;
  786. tab0.'WTABLE'.'FACTEUR_Q' = q0 ;
  787. tab0.'WTABLE'.'TOPOLOGIE' = x0 ;
  788.  
  789. **********************************************************************
  790. * INFORMATION *
  791. **********************************************************************
  792.  
  793. MESS 'Informations sur l''optimisation topologique :' ;
  794. MESS '=============================================' ;
  795. SI (NEG cy0 1) ;
  796. MESS ' - Poursuite / reprise d''une optimisation topologique' ;
  797. FINS ;
  798. SI sbs0 ;
  799. MESS ' - Resolution non lineaire (via la procedure PASAPAS)' ;
  800. SINO ;
  801. MESS ' - Resolution lineaire (via l''operateur RESO)' ;
  802. FINS ;
  803. SI (mecha0 ET therm0) ;
  804. MESS ' d''un probleme thermo-mecanique' ;
  805. SINO ;
  806. SI mecha0 ;
  807. MESS ' d''un probleme mecanique' ;
  808. FINS ;
  809. SI therm0 ;
  810. MESS ' d''un probleme thermique' ;
  811. FINS ;
  812. FINS ;
  813. SI mltcase0 ;
  814. MESS ' avec de multiples cas de charge ('case_nb0')' ;
  815. SI ProcR0 ;
  816. MESS ' et des restrictions geometriques' ;
  817. FINS ;
  818. SINO ;
  819. SI ProcR0 ;
  820. MESS ' avec des restrictions geometriques' ;
  821. FINS ;
  822. FINS ;
  823. SI mcn0 ;
  824. MESS ' - Maximisation des deplacements de sortie d''un mecanisme';
  825. FINS ;
  826. SI (mecha0 ET ((ABS WghtM0) > prec0)) ;
  827. MESS ' - Minimisation de l''energie de deformation elastique';
  828. FINS ;
  829. SI (therm0 ET ((ABS WghtT0) > prec0)) ;
  830. MESS ' - Minimisation de la quantite de chaleur' ;
  831. FINS ;
  832. MESS ' - Contrainte sur la fraction volumique de ' volfrac0 ;
  833. SI froz0 ;
  834. MESS ' avec une portion du domaine initial figee' ;
  835. FINS ;
  836. SI ProcP0 ;
  837. MESS ' - Appel d''une procedure utilisateur (TOPOPERS)' ;
  838. FINS ;
  839. SI (NEG (VALE 'RESO') 'ITER') ;
  840. MESS ' ' ;
  841. MESS 'Remarque :' ;
  842. MESS '==========' ;
  843. MESS ' - L''option de resolution iterative n''est pas activee.' ;
  844. MESS ' Activez la pour de meilleures performances.' ;
  845. FINS ;
  846. MESS ' ' ;
  847. SI (NON sbs0) ;
  848. MESS ' Cyc. | Obj. | Max change | Penal. fac. | GSF fac. | Nb. el.' ;
  849. FINS ;
  850.  
  851. **********************************************************************
  852. * OPTIMIZATION LOOP *
  853. **********************************************************************
  854.  
  855. * Optimization loop
  856. REPE loop0 (maxcy0 - cy0 + 1) ;
  857.  
  858. * Initializations
  859. obj0 = 0.0 ;
  860. dc0 = zero1 ;
  861. tab0.'WTABLE'.'OBJECTIF' = obj0 ;
  862. tab0.'WTABLE'.'SENSIBILITE' = dc0 ;
  863.  
  864. * A factor
  865. SI dVari0 ;
  866. d0 = IPOL (FLOT cy0) dEvol0 ;
  867. * Save it in case it is needed outsite this procedure
  868. tab0.'WTABLE'.'FACTEUR_D' = d0 ;
  869. FINS ;
  870.  
  871. * P factor
  872. SI pVari0 ;
  873. p0 = IPOL (FLOT cy0) pEvol0 ;
  874. * Save it in case it is needed outsite this procedure
  875. tab0.'WTABLE'.'FACTEUR_P' = p0 ;
  876. FINS ;
  877.  
  878. * Q factor
  879. SI qVari0 ;
  880. q0 = IPOL (FLOT cy0) qEvol0 ;
  881. * Save it in case it is needed outsite this procedure
  882. tab0.'WTABLE'.'FACTEUR_Q' = q0 ;
  883. FINS ;
  884.  
  885. * Density fields
  886. SI mecha0 ;
  887. DensM0 = voidM1 + ((1.0 - vdM0) * (x0**p0)) ;
  888. DensMax0 = DensM0 ;
  889. FINS ;
  890. SI therm0 ;
  891. DensT0 = voidT1 + ((1.0 - vdT0) * (x0**p0)) ;
  892. SI mecha0 ;
  893. * Switch the model of the element field DensT0
  894. * from Mecha to Therm
  895. DensT0 = TOPOCHAN DensT0 modT1 bmsh1 ;
  896. DensMax0 = MAXI DensM0 DensT0 ;
  897. SINO ;
  898. DensMax0 = DensT0 ;
  899. FINS ;
  900. FINS ;
  901.  
  902. * Active mesh, model and material
  903. SI froz0 ;
  904. mshA = (DensMax0 + un2) ELEM 'SUPE' thrsh0 ;
  905. SINO ;
  906. mshA = DensMax0 ELEM 'SUPE' thrsh0 ;
  907. FINS ;
  908. SI cntct0 ;
  909. tmp0 = DIFF mshMT0 mshA ;
  910. SI ((NBEL tmp0) > 0) ;
  911. tmp0 = (MANU 'CHPO' tmp0 1 'SCAL'1.0) POIN 'SUPE' 0.0 ;
  912. tmp0 = mshC0 ELEM 'APPU' 'LARG' tmp0 ;
  913. mshCA = DIFF mshC0 tmp0 ;
  914. SINO ;
  915. mshCA = mshC0 ;
  916. FINS ;
  917. modCA = REDU modC0 mshCA ;
  918. matCA = REDU matC0 mshCA ;
  919. FINS ;
  920.  
  921. * Material
  922. matA = VIDE 'MCHAML' ;
  923. SI mecha0 ;
  924. SI froz0 ;
  925. matMA = (TOPOMATE modM1 matM1 DensM0) ET matM2 ;
  926. SINO ;
  927. matMA = TOPOMATE modM1 matM1 DensM0 ;
  928. FINS ;
  929. matMA = REDU matMA mshA ;
  930. matA = matA ET matMA ;
  931. FINS ;
  932. SI therm0 ;
  933. SI froz0 ;
  934. matTA = (TOPOMATE modT1 matT1 DensT0) ET matT2 ;
  935. SINO ;
  936. matTA = TOPOMATE modT1 matT1 DensT0 ;
  937. FINS ;
  938. matTA = REDU matTA mshA ;
  939. matA = matA ET matTA ;
  940. FINS ;
  941.  
  942. * Model
  943. modA = VIDE 'MMODEL' ;
  944. SI mecha0 ;
  945. modMA = REDU modM0 mshA ;
  946. modA = modA ET modMA ;
  947. FINS ;
  948. SI therm0 ;
  949. modTA = REDU modT0 mshA ;
  950. modA = modA ET modTA ;
  951. FINS ;
  952.  
  953. * Number of active elements
  954. nbel0 = NBEL mshA ;
  955.  
  956. * Solve FE problem(s)
  957. SI mltcase0 ;
  958. SI (NON sbs0) ;
  959. MESS ' ' ;
  960. FINS ;
  961. mdlA = TABL ;
  962. REPE loop1 case_nb0 ;
  963. mdlA.&loop1 = COPI mdl0 ;
  964. SI mecha0 ;
  965. mdlA.&loop1.'BLOCAGES_MECANIQUES' = bcM0.&loop1 ;
  966. FINS ;
  967. SI therm0 ;
  968. mdlA.&loop1.'BLOCAGES_THERMIQUES' = bcT0.&loop1 ;
  969. FINS ;
  970. mdlA.&loop1.'CHARGEMENT' = load0.&loop1 ;
  971. SI cntct0 ;
  972. mdlA.&loop1.'MODELE' = modA ET modCA ;
  973. mdlA.&loop1.'CARACTERISTIQUES' = matA ET matCA ;
  974. SINO ;
  975. mdlA.&loop1.'MODELE' = modA ;
  976. mdlA.&loop1.'CARACTERISTIQUES' = matA ;
  977. FINS ;
  978. SI mcn0 ;
  979. mdlA.&loop1.'MECANISME_ENTREE' = TABL ;
  980. mdlA.&loop1.'MECANISME_SORTIE' = TABL ;
  981. FINS ;
  982. MENA 'OBLI' ;
  983. SI sbs0 ;
  984. mdlA.&loop1.'TEMPS_SAUVES' = SavTime0 ;
  985. SI mcn0 ;
  986. mdlA.&loop1.'MECANISME_ENTREE' = COPI mdlA.&loop1 ;
  987. mdlA.&loop1.'MECANISME_ENTREE'.'RIGIDITE_CONSTANTE' = Spr0.&loop1 ;
  988. mdlA.&loop1.'MECANISME_SORTIE' = COPI mdlA.&loop1.'MECANISME_ENTREE' ;
  989. mdlA.&loop1.'MECANISME_SORTIE'.'CHARGEMENT' = load1.&loop1 ;
  990. MESS ' ' ;
  991. MESS '+--------------------------------------+' ;
  992. MESS '| |' ;
  993. MESS '| TOPOPTIM : Progression |' ;
  994. MESS '| |' ;
  995. MESS '| Resolution Mecanisme Entree |' ;
  996. MESS '| Cycle ' cy0 ' |' ;
  997. MESS '| Cas de charge '&loop1'/'case_nb0' |';
  998. MESS '| |' ;
  999. MESS '+--------------------------------------+' ;
  1000. MESS ' ' ;
  1001. PASAPAS (mdlA.&loop1.'MECANISME_ENTREE') ;
  1002. MESS ' ' ;
  1003. MESS '+--------------------------------------+' ;
  1004. MESS '| |' ;
  1005. MESS '| TOPOPTIM : Progression |' ;
  1006. MESS '| |' ;
  1007. MESS '| Resolution Mecanisme Sortie |' ;
  1008. MESS '| Cycle ' cy0 ' |' ;
  1009. MESS '| Cas de charge '&loop1'/'case_nb0' |';
  1010. MESS '| |' ;
  1011. MESS '+--------------------------------------+' ;
  1012. MESS ' ' ;
  1013. PASAPAS (mdlA.&loop1.'MECANISME_SORTIE') ;
  1014. FINS ;
  1015. SI (((NON mcn0) ET mecha0) OU (mcn0 ET
  1016. (ZeroSpg0 OU ((ABS WghtM0) > prec0)))) ;
  1017. MESS ' ' ;
  1018. MESS '+--------------------------------------+' ;
  1019. MESS '| |' ;
  1020. MESS '| TOPOPTIM : Progression |' ;
  1021. MESS '| |' ;
  1022. SI mcn0 ;
  1023. MESS '| Resolution Sans Ressorts |';
  1024. FINS ;
  1025. MESS '| Cycle ' cy0 ' |' ;
  1026. MESS '| Cas de charge '&loop1'/'case_nb0' |';
  1027. MESS '| |' ;
  1028. MESS '+--------------------------------------+' ;
  1029. MESS ' ' ;
  1030. PASAPAS (mdlA.&loop1) ;
  1031. FINS ;
  1032. SINO ;
  1033. MESS 'Cas de charge' ' ' &loop1 ' /' ' ' case_nb0 ;
  1034. SI mecha0 ;
  1035. tmp0 = (RIGI modMA matMA) ET bcM0.&loop1 ;
  1036. SI mcn0 ;
  1037. tmp1 = tmp0 ET Spr0.&loop1 ;
  1038. tmp2 = RESO tmp1 load0.&loop1 ;
  1039. mdlA.&loop1.'MECANISME_ENTREE'.'DEPLACEMENTS'= tmp2 ;
  1040. mdlA.&loop1.'MECANISME_ENTREE'.'CONTRAINTES' = SIGM 'LINE' modMA matMA tmp2 ;
  1041. mdlA.&loop1.'MECANISME_ENTREE'.'DEFORMATIONS'= EPSI 'LINE' modMA matMA tmp2 ;
  1042. tmp2 = RESO tmp1 load1.&loop1 ;
  1043. mdlA.&loop1.'MECANISME_SORTIE'.'DEPLACEMENTS'= tmp2 ;
  1044. mdlA.&loop1.'MECANISME_SORTIE'.'CONTRAINTES' = SIGM 'LINE' modMA matMA tmp2 ;
  1045. mdlA.&loop1.'MECANISME_SORTIE'.'DEFORMATIONS'= EPSI 'LINE' modMA matMA tmp2 ;
  1046. FINS ;
  1047. SI (((NON mcn0) ET mecha0) OU (mcn0 ET
  1048. (ZeroSpg0 OU ((ABS WghtM0) > prec0)))) ;
  1049. tmp0 = RESO tmp0 load0.&loop1 ;
  1050. mdlA.&loop1.'DEPLACEMENTS' = tmp0 ;
  1051. mdlA.&loop1.'CONTRAINTES' = SIGM 'LINE' modMA matMA tmp0 ;
  1052. mdlA.&loop1.'DEFORMATIONS' = EPSI 'LINE' modMA matMA tmp0 ;
  1053. FINS ;
  1054. FINS ;
  1055. SI therm0 ;
  1056. mdlA.&loop1.'TEMPERATURES' = RESO ((COND modTA matTA) ET bcT0.&loop1) load0.&loop1 ;
  1057. FINS ;
  1058. FINS ;
  1059. FIN loop1 ;
  1060. SI (NON sbs0) ;
  1061. MESS ' ' ;
  1062. FINS ;
  1063. SINO ;
  1064. mdlA = COPI mdl0 ;
  1065. SI cntct0 ;
  1066. mdlA.'MODELE' = modA ET modCA ;
  1067. mdlA.'CARACTERISTIQUES' = matA ET matCA ;
  1068. SINO ;
  1069. mdlA.'MODELE' = modA ;
  1070. mdlA.'CARACTERISTIQUES' = matA ;
  1071. FINS ;
  1072. SI mcn0 ;
  1073. mdlA.'MECANISME_ENTREE' = TABL ;
  1074. mdlA.'MECANISME_SORTIE' = TABL ;
  1075. FINS ;
  1076. MENA 'OBLI' ;
  1077. SI sbs0 ;
  1078. mdlA.'TEMPS_SAUVES' = SavTime0 ;
  1079. SI mcn0 ;
  1080. mdlA.'MECANISME_ENTREE' = COPI mdlA ;
  1081. mdlA.'MECANISME_ENTREE'.'RIGIDITE_CONSTANTE' = Spr0 ;
  1082. mdlA.'MECANISME_SORTIE' = COPI mdlA.'MECANISME_ENTREE' ;
  1083. mdlA.'MECANISME_SORTIE'.'CHARGEMENT' = load1 ;
  1084. MESS ' ' ;
  1085. MESS '+--------------------------------------+' ;
  1086. MESS '| |' ;
  1087. MESS '| TOPOPTIM : Progression |' ;
  1088. MESS '| |' ;
  1089. MESS '| Resolution Mecanisme Entree |' ;
  1090. MESS '| |' ;
  1091. MESS '+--------------------------------------+' ;
  1092. MESS ' ' ;
  1093. PASAPAS (mdlA.'MECANISME_ENTREE') ;
  1094. MESS ' ' ;
  1095. MESS '+--------------------------------------+' ;
  1096. MESS '| |' ;
  1097. MESS '| TOPOPTIM : Progression |' ;
  1098. MESS '| |' ;
  1099. MESS '| Resolution Mecanisme Sortie |' ;
  1100. MESS '| |' ;
  1101. MESS '+--------------------------------------+' ;
  1102. MESS ' ' ;
  1103. PASAPAS (mdlA.'MECANISME_SORTIE') ;
  1104. FINS ;
  1105. SI (((NON mcn0) ET mecha0) OU (mcn0 ET (ZeroSpg0 OU ((ABS WghtM0) > prec0)))) ;
  1106. SI mcn0 ;
  1107. MESS ' ' ;
  1108. MESS '+--------------------------------------+' ;
  1109. MESS '| |' ;
  1110. MESS '| TOPOPTIM : Progression |' ;
  1111. MESS '| |' ;
  1112. MESS '| Resolution Sans Ressorts |' ;
  1113. MESS '| |' ;
  1114. MESS '+--------------------------------------+' ;
  1115. MESS ' ' ;
  1116. FINS ;
  1117. PASAPAS mdlA ;
  1118. FINS ;
  1119. SINO ;
  1120. SI mecha0 ;
  1121. tmp0 = (RIGI modMA matMA) ET bcM0 ;
  1122. SI mcn0 ;
  1123. tmp1 = tmp0 ET Spr0 ;
  1124. tmp2 = RESO tmp1 load0 ;
  1125. mdlA.'MECANISME_ENTREE'.'DEPLACEMENTS' = tmp2 ;
  1126. mdlA.'MECANISME_ENTREE'.'CONTRAINTES' = SIGM 'LINE' modMA matMA tmp2 ;
  1127. mdlA.'MECANISME_ENTREE'.'DEFORMATIONS' = EPSI 'LINE' modMA matMA tmp2 ;
  1128. tmp2 = RESO tmp1 load1 ;
  1129. mdlA.'MECANISME_SORTIE'.'DEPLACEMENTS' = tmp2 ;
  1130. mdlA.'MECANISME_SORTIE'.'CONTRAINTES' = SIGM 'LINE' modMA matMA tmp2 ;
  1131. mdlA.'MECANISME_SORTIE'.'DEFORMATIONS' = EPSI 'LINE' modMA matMA tmp2 ;
  1132. FINS ;
  1133. SI (((NON mcn0) ET mecha0) OU (mcn0 ET
  1134. (ZeroSpg0 OU ((ABS WghtM0) > prec0)))) ;
  1135. tmp0 = RESO tmp0 load0 ;
  1136. mdlA.'DEPLACEMENTS' = tmp0 ;
  1137. mdlA.'CONTRAINTES' = SIGM 'LINE' modMA matMA tmp0 ;
  1138. mdlA.'DEFORMATIONS' = EPSI 'LINE' modMA matMA tmp0 ;
  1139. FINS ;
  1140. FINS ;
  1141. SI therm0 ;
  1142. mdlA.'TEMPERATURES' = RESO ((COND modTA matTA) ET bcT0) load0 ;
  1143. FINS ;
  1144. FINS ;
  1145. FINS ;
  1146.  
  1147. * Active mesh, model, material and resolution belonging to msh1
  1148. mshA = INTE mshA msh1 ;
  1149. modA = REDU modA mshA ;
  1150. SI mecha0 ;
  1151. modMA = REDU modM0 mshA ;
  1152. matMA = REDU matMA mshA ;
  1153. FINS ;
  1154. SI therm0 ;
  1155. modTA = REDU modT0 mshA ;
  1156. matTA = REDU matTA mshA ;
  1157. FINS ;
  1158.  
  1159. * Save these data in case they are needed outsite this procedure
  1160. tab0.'WTABLE'.'RESOLUTION' = mdlA ;
  1161. tab0.'WTABLE'.'MAILLAGE'.'A' = mshA ;
  1162. tab0.'WTABLE'.'MODELE'.'A' = modA ;
  1163. SI mecha0 ;
  1164. tab0.'WTABLE'.'MECANIQUE'.'MODELE'.'A' = modMA ;
  1165. tab0.'WTABLE'.'MECANIQUE'.'CARACTERISTIQUES'.'A' = matMA ;
  1166. FINS ;
  1167. SI therm0 ;
  1168. tab0.'WTABLE'.'THERMIQUE'.'MODELE'.'A' = modTA ;
  1169. tab0.'WTABLE'.'THERMIQUE'.'CARACTERISTIQUES'.'A' = matTA ;
  1170. FINS ;
  1171.  
  1172. * User defined procedure
  1173. SI ProcP0 ;
  1174. TOPOPERS tab0 ;
  1175. * Collect the previous data in case they changed in TOPOPERS
  1176. obj0 = tab0.'WTABLE'.'OBJECTIF' ;
  1177. dc0 = tab0.'WTABLE'.'SENSIBILITE' ;
  1178. FINS ;
  1179.  
  1180. * Mechanism objective value and the sensitivity field
  1181. SI mcn0 ;
  1182. SI mltcase0 ;
  1183. REPE loop1 case_nb0 ;
  1184. SI sbs0 ;
  1185. sigAE = REDU (mdlA.&loop1.'MECANISME_ENTREE'.'CONTRAINTES'.NbStp0) mshA ;
  1186. epsAE = ELAS modMA sigAE matMA ;
  1187. sigAS = REDU (mdlA.&loop1.'MECANISME_SORTIE'.'CONTRAINTES'.NbStp0) mshA ;
  1188. * epsAS = ELAS modMA sigAS matMA ;
  1189. SINO ;
  1190. * sigAE = REDU (mdlA.&loop1.'MECANISME_ENTREE'.'CONTRAINTES') mshA ;
  1191. epsAE = REDU (mdlA.&loop1.'MECANISME_ENTREE'.'DEFORMATIONS') mshA ;
  1192. sigAS = REDU (mdlA.&loop1.'MECANISME_SORTIE'.'CONTRAINTES') mshA ;
  1193. * epsAS = REDU (mdlA.&loop1.'MECANISME_SORTIE'.'DEFORMATIONS') mshA ;
  1194. FINS ;
  1195. * 1/2.Cijkl.[1/2(diUEj+djUEi)].[1/2(dkUSl+dlUSk)]
  1196. * =1/2.Cijkl.EPSEij.EPSSkl
  1197. * =1/2.EPSEij.SIGSij
  1198. eneA = ENER modMA sigAS epsAE ;
  1199. * Element field of the strain energy density at barycenter
  1200. eneA = (INTG 'ELEM' eneA modMA matMA) / (REDU volElM1 modMA) ;
  1201. * Total strain energy
  1202. tmp0 = INTG eneA modMA matMA ;
  1203. * Objective function:
  1204. obj0 = obj0 + (WghtMcn0 * tmp0 / case_nb0) ;
  1205. * Rigidity property field at barycenter
  1206. tmp0 = CHAN 'CHAM' (EXCO 'YOUN' matMA 'SCAL') modMA 'GRAVITE' '' ;
  1207. * 1/2.EPSEij.EPSSij
  1208. tmp0 = zero1 + (REDU (eneA/tmp0) modM1) ;
  1209. * Sensitivity field:
  1210. dc0 = dc0 + ((WghtMcn0 / case_nb0) * tmp0 * ((1.0 - vdM0) * p0 * (x0**(p0 - 1.0)))) ;
  1211. * Objective function:
  1212. obj0 = obj0 + (0.0 / case_nb0) ;
  1213. FIN loop1 ;
  1214. SINO ;
  1215. SI sbs0 ;
  1216. sigAE = REDU (mdlA.'MECANISME_ENTREE'.'CONTRAINTES'.NbStp0) mshA ;
  1217. epsAE = ELAS modMA sigAE matMA ;
  1218. sigAS = REDU (mdlA.'MECANISME_SORTIE'.'CONTRAINTES'.NbStp0) mshA ;
  1219. * epsAS = ELAS modMA sigAS matMA ;
  1220. SINO ;
  1221. * sigAE = REDU (mdlA.'MECANISME_ENTREE'.'CONTRAINTES') mshA ;
  1222. epsAE = REDU (mdlA.'MECANISME_ENTREE'.'DEFORMATIONS') mshA ;
  1223. sigAS = REDU (mdlA.'MECANISME_SORTIE'.'CONTRAINTES') mshA ;
  1224. * epsAS = REDU (mdlA.'MECANISME_SORTIE'.'DEFORMATIONS') mshA ;
  1225. FINS ;
  1226. * 1/2.Cijkl.[1/2(diUEj+djUEi)].[1/2(dkUSl+dlUSk)]
  1227. * =1/2.Cijkl.EPSEij.EPSSkl
  1228. * =1/2.EPSEij.SIGSij
  1229. eneA = ENER modMA sigAS epsAE ;
  1230. * Element field of the strain energy density at barycenter
  1231. eneA = (INTG 'ELEM' eneA modMA matMA) / (REDU volElM1 modMA) ;
  1232. * Total strain energy
  1233. tmp0 = INTG eneA modMA matMA ;
  1234. * Objective function:
  1235. obj0 = obj0 + (WghtMcn0 * tmp0) ;
  1236. * Rigidity property field at barycenter
  1237. tmp0 = CHAN 'CHAM' (EXCO 'YOUN' matMA 'SCAL') modMA 'GRAVITE' '' ;
  1238. * 1/2.EPSEij.EPSSij
  1239. tmp0 = zero1 + (REDU (eneA/tmp0) modM1) ;
  1240. * Sensitivity field:
  1241. dc0 = dc0 + (WghtMcn0 * tmp0 * ((1.0 - vdM0) * p0 * (x0**(p0 - 1.0)))) ;
  1242. FINS ;
  1243. * Save these data in case they are needed outsite this procedure
  1244. tab0.'WTABLE'.'OBJECTIF' = obj0 ;
  1245. tab0.'WTABLE'.'SENSIBILITE' = dc0 ;
  1246. FINS ;
  1247.  
  1248. * Strain energy objective value and the sensitivity field
  1249. SI (mecha0 ET ((ABS WghtM0) > prec0)) ;
  1250. SI mltcase0 ;
  1251. REPE loop1 case_nb0 ;
  1252. SI sbs0 ;
  1253. sigA = REDU (mdlA.&loop1.'CONTRAINTES'.NbStp0) mshA ;
  1254. epsA = ELAS modMA sigA matMA ;
  1255. SINO ;
  1256. sigA = REDU (mdlA.&loop1.'CONTRAINTES') mshA ;
  1257. epsA = REDU (mdlA.&loop1.'DEFORMATIONS') mshA ;
  1258. FINS ;
  1259. * 1/2.Cijkl.[1/2(diUj+djUi)].[1/2(dkUl+dlUk)]
  1260. * =1/2.Cijkl.EPSij.EPSkl
  1261. * =1/2.EPSij.SIGij
  1262. * =Element field of the elastic strain energy density at
  1263. * integration points:
  1264. eneA = ENER modMA sigA epsA ;
  1265. * Element field of the strain energy density at barycenter
  1266. eneA = (INTG 'ELEM' eneA modMA matMA) / (REDU volElM1 modMA) ;
  1267. * Objective function:
  1268. * Add the total elastic strain energy * weight / nb of cases
  1269. obj0 = obj0 + (WghtM0 * (INTG eneA modMA matMA) / case_nb0) ;
  1270. * Rigidity property field at barycenter
  1271. tmp0 = CHAN 'CHAM' (EXCO 'YOUN' matMA 'SCAL') modMA 'GRAVITE' '' ;
  1272. * 1/2.EPSij.EPSij
  1273. tmp0 = zero1 + (REDU (eneA/tmp0) modM1) ;
  1274. * Sensitivity field:
  1275. dc0 = dc0 + ((WghtM0 / case_nb0) * tmp0 * ((vdM0 - 1.0) * p0 * (x0**(p0 - 1.0)))) ;
  1276. FIN loop1 ;
  1277. SINO ;
  1278. SI sbs0 ;
  1279. sigA = REDU (mdlA.'CONTRAINTES'.NbStp0) mshA ;
  1280. epsA = ELAS modMA sigA matMA ;
  1281. SINO ;
  1282. sigA = REDU (mdlA.'CONTRAINTES') mshA ;
  1283. epsA = REDU (mdlA.'DEFORMATIONS') mshA ;
  1284. FINS ;
  1285. * 1/2.Cijkl.[1/2(diUj+djUi)].[1/2(dkUl+dlUk)]
  1286. * =1/2.Cijkl.EPSij.EPSkl
  1287. * =1/2.EPSij.SIGij
  1288. * =Element field of the elastic strain energy density at
  1289. * integration points:
  1290. eneA = ENER modMA sigA epsA ;
  1291. * Element field of the strain energy density at barycenter
  1292. eneA = (INTG 'ELEM' eneA modMA matMA) / (REDU volElM1 modMA) ;
  1293. * Total strain energy
  1294. tmp0 = INTG eneA modMA matMA ;
  1295. * Objective function
  1296. obj0 = obj0 + (WghtM0 * tmp0) ;
  1297. * Rigidity property field at barycenter
  1298. tmp0 = CHAN 'CHAM' (EXCO 'YOUN' matMA 'SCAL') modMA 'GRAVITE' '' ;
  1299. * 1/2.EPSij.EPSij
  1300. tmp0 = zero1 + (REDU (eneA/tmp0) modM1) ;
  1301. * Sensitivity field
  1302. dc0 = dc0 + (WghtM0 * tmp0 * ((vdM0 - 1.0) * p0 * (x0**(p0 - 1.0)))) ;
  1303. FINS ;
  1304. * Save these data in case they are needed outsite this procedure
  1305. tab0.'WTABLE'.'OBJECTIF' = obj0 ;
  1306. tab0.'WTABLE'.'SENSIBILITE' = dc0 ;
  1307. FINS ;
  1308.  
  1309. * Thermal compliance objective value and the sensitivity field
  1310. SI (therm0 ET ((ABS WghtT0) > prec0)) ;
  1311. SI mltcase0 ;
  1312. REPE loop1 case_nb0 ;
  1313. * Temperature node field
  1314. SI sbs0 ;
  1315. TA = REDU (mdlA.&loop1.'TEMPERATURES'.NbStp0) mshA ;
  1316. SINO ;
  1317. TA = REDU (mdlA.&loop1.'TEMPERATURES') mshA ;
  1318. FINS ;
  1319. * 1/2.K.grad(T).grad(T)
  1320. * =1/2.K.grad(T)^2
  1321. * =Element field of the thermal compliance density at
  1322. * integration points:
  1323. * (without 1/2 nor K, they will be added locally for
  1324. * better performances)
  1325. grdTA = GRAD modTA TA ;
  1326. cmp0 = EXTR grdTA 'COMP' ;
  1327. eneA = (EXCO (EXTR cmp0 (DIME cmp0)) grdTA 'SCAL')**2 ;
  1328. REPE loop2 ((DIME cmp0) - 1) ;
  1329. eneA = eneA + ((EXCO (EXTR cmp0 &loop2) grdTA 'SCAL')**2) ;
  1330. FIN loop2 ;
  1331. * Element field at barycenter
  1332. eneA = (INTG 'ELEM' eneA modTA matTA) / (REDU volElT1 modTA) ;
  1333. * Conductivity field at barycenter: K
  1334. tmp0 = CHAN 'CHAM' (EXCO 'K' matTA 'SCAL') modTA 'GRAVITE' '' ;
  1335. * Integration (with K)
  1336. tmp0 = INTG (eneA * tmp0) modTA matTA ;
  1337. * Objective function (with 1/2)
  1338. obj0 = obj0 + (WghtT0 * 0.5 * tmp0 / case_nb0) ;
  1339. * Switch the model of the element field eneA
  1340. * from Therm to Mecha
  1341. tmp0 = zero1 + (REDU eneA modT1) ;
  1342. SI mecha0 ;
  1343. tmp0 = TOPOCHAN tmp0 modM1 bmsh1 ;
  1344. FINS ;
  1345. * Sensitivity field (with 1/2)
  1346. dc0 = dc0 + ((WghtT0 * 0.5 / case_nb0) * tmp0 * ((vdT0 - 1.0) * p0 * (x0**(p0 - 1.0)))) ;
  1347. FIN loop1 ;
  1348. SINO ;
  1349. * Temperature node field
  1350. SI sbs0 ;
  1351. TA = REDU (mdlA.'TEMPERATURES'.NbStp0) mshA ;
  1352. SINO ;
  1353. TA = REDU (mdlA.'TEMPERATURES') mshA ;
  1354. FINS ;
  1355. * 1/2.K.grad(T).grad(T)
  1356. * =1/2.K.grad(T)^2
  1357. * =Element field of the thermal compliance density at
  1358. * integration points:
  1359. * (without 1/2 nor K, they will be added locally for
  1360. * better performances)
  1361. grdTA = GRAD modTA TA ;
  1362. cmp0 = EXTR grdTA 'COMP' ;
  1363. eneA = (EXCO (EXTR cmp0 (DIME cmp0)) grdTA 'SCAL')**2 ;
  1364. REPE loop2 ((DIME cmp0) - 1) ;
  1365. eneA = eneA + ((EXCO (EXTR cmp0 &loop2) grdTA 'SCAL')**2) ;
  1366. FIN loop2 ;
  1367. * Element field at barycenter
  1368. eneA = (INTG 'ELEM' eneA modTA matTA) / (REDU volElT1 modTA) ;
  1369. * Conductivity field at barycenter: K
  1370. tmp0 = CHAN 'CHAM' (EXCO 'K' matTA 'SCAL') modTA 'GRAVITE' '' ;
  1371. * Integration (with K)
  1372. tmp0 = INTG (eneA * tmp0) modTA matTA ;
  1373. * Objective function (with 1/2)
  1374. obj0 = obj0 + (WghtT0 * 0.5 * tmp0) ;
  1375. * Switch the model of the element field eneA
  1376. * from Therm to Mecha
  1377. tmp0 = zero1 + (REDU eneA modT1) ;
  1378. SI mecha0 ;
  1379. tmp0 = TOPOCHAN tmp0 modM1 bmsh1 ;
  1380. FINS ;
  1381. * Sensitivity field (with 1/2)
  1382. dc0 = dc0 + ((WghtT0 * 0.5) * tmp0 * ((vdT0 - 1.0) * p0 * (x0**(p0 - 1.0)))) ;
  1383. FINS ;
  1384. * Save these data in case they are needed outsite this procedure
  1385. tab0.'WTABLE'.'OBJECTIF' = obj0 ;
  1386. tab0.'WTABLE'.'SENSIBILITE' = dc0 ;
  1387. FINS ;
  1388.  
  1389. * Add some restrictions
  1390. SI ProcR0 ;
  1391. TOPORSTR tab0 ;
  1392. * Get the new sensitivity field generated from TOPORSTR
  1393. dc0 = tab0.'WTABLE'.'SENSIBILITE' ;
  1394. FINS ;
  1395.  
  1396. * Sensitivity filtering
  1397. TOPOFILT tab0 ;
  1398. dc0 = tab0.'WTABLE'.'SENSIBILITE' ;
  1399.  
  1400. * Previous topology
  1401. xOld0 = x0 ;
  1402.  
  1403. * Topology update using the optimality criterion method
  1404. TOPOCRIT tab0 ;
  1405. x0 = tab0.'WTABLE'.'TOPOLOGIE' ;
  1406.  
  1407. * Compute the change
  1408. change0 = MAXI (ABS (x0 - xOld0)) ;
  1409. * Save it in case it is needed outsite this procedure
  1410. tab0.'WTABLE'.'CHANGE' = change0 ;
  1411.  
  1412. * Save progression information
  1413. Lstobj0 = Lstobj0 ET (PROG obj0) ;
  1414. Lstchg0 = Lstchg0 ET (PROG change0) ;
  1415. Lstp0 = Lstp0 ET (PROG p0) ;
  1416. Lstq0 = Lstq0 ET (PROG q0) ;
  1417. Lstnbel0 = Lstnbel0 ET (LECT nbel0) ;
  1418.  
  1419. * Save output data
  1420. TOPOSAUV tab0 ;
  1421.  
  1422. * Save the number of the last completed cycle
  1423. tab0.'CYCLE' = cy0 ;
  1424.  
  1425. * Plot to screen
  1426. SI trac0 ;
  1427. SI froz0 ;
  1428. tmp1 = x0 + un2 ;
  1429. SI mecha0 ;
  1430. tmp2 = modM0 REDU (mshA ET msh2) ;
  1431. SINO ;
  1432. tmp2 = modT0 REDU (mshA ET msh2) ;
  1433. FINS ;
  1434. SINO ;
  1435. tmp1 = x0 ;
  1436. SI mecha0 ;
  1437. tmp2 = modMA ;
  1438. SINO ;
  1439. tmp2 = modTA ;
  1440. FINS ;
  1441. FINS ;
  1442. tmp1 = REDU tmp1 tmp2 ;
  1443. SI ((NON mltcase0) ET (NON mcn0) ET mecha0 ET sbs0) ;
  1444. tmp1 tmp2 = tmp1 tmp2 PLUS mdlA.'DEPLACEMENTS'.NbStp0 ;
  1445. FINS ;
  1446. TRAC tmp1 tmp2 isoval0 'NCLK' ;
  1447. FINS ;
  1448.  
  1449. * Write progression to screen
  1450. SI (NON sbs0) ;
  1451. MESS (CHAI 'FORMAT' '(I5)' cy0 /2
  1452. 'FORMAT' '(ES14.7E2)' obj0 /8
  1453. 'FORMAT' '(ES14.7E2)' change0 /23
  1454. 'FORMAT' '(ES14.7E2)' p0 /38
  1455. 'FORMAT' '(ES14.7E2)' q0 /53
  1456. nbel0 /69) ;
  1457. FINS ;
  1458.  
  1459. * Convergence test
  1460. SI ((change0 < crit0) OU (EGA cy0 maxcy0)) ;
  1461. tab0.'CONVERGENCE' = change0 < crit0 ;
  1462. QUIT loop0 ;
  1463. FINS ;
  1464.  
  1465. * Write progression to screen
  1466. * After the test in case of step by step resolution since there will
  1467. * be a summary at the end
  1468. SI sbs0 ;
  1469. MESS ' ' ;
  1470. MESS '+-----------------------------------------------------------------------------+' ;
  1471. MESS '| |' ;
  1472. MESS '| TOPOPTIM : Progression |' ;
  1473. MESS '| |' ;
  1474. MESS (CHAI '| Cycle' cy0 /40 '|' /79) ;
  1475. MESS '| |' ;
  1476. MESS '| Obj. | Max change | Penal. fac. | GSF fac. | Nb. el. |' ;
  1477. MESS (CHAI '|' 'FORMAT' '(ES14.7E2)' obj0 /2
  1478. 'FORMAT' '(ES14.7E2)' change0 /18
  1479. 'FORMAT' '(ES14.7E2)' p0 /34
  1480. 'FORMAT' '(ES14.7E2)' q0 /50
  1481. nbel0 /67
  1482. '|' /79) ;
  1483. MESS '| |' ;
  1484. MESS '+-----------------------------------------------------------------------------+' ;
  1485. MESS ' ' ;
  1486. FINS ;
  1487.  
  1488. * Cleaning
  1489. mshA = 0 ;
  1490. modA = 0 ;
  1491. SI mecha0 ;
  1492. modMA = 0 ;
  1493. matMA = 0 ;
  1494. FINS ;
  1495. SI therm0 ;
  1496. modTA = 0 ;
  1497. matTA = 0 ;
  1498. FINS ;
  1499. OTER (tab0.'WTABLE') 'RESOLUTION' ;
  1500. OTER (tab0.'WTABLE'.'MAILLAGE') 'A' ;
  1501. OTER (tab0.'WTABLE'.'MODELE') 'A' ;
  1502. SI mecha0 ;
  1503. OTER (tab0.'WTABLE'.'MECANIQUE'.'MODELE') 'A' ;
  1504. OTER (tab0.'WTABLE'.'MECANIQUE'.'CARACTERISTIQUES') 'A' ;
  1505. FINS ;
  1506. SI therm0 ;
  1507. OTER (tab0.'WTABLE'.'THERMIQUE'.'MODELE') 'A' ;
  1508. OTER (tab0.'WTABLE'.'THERMIQUE'.'CARACTERISTIQUES') 'A' ;
  1509. FINS ;
  1510.  
  1511. * Number of the next cycle
  1512. cy0 = cy0 + 1 ;
  1513. * Save the number of the current cycle in the working table in case
  1514. * it is needed outsite this procedure
  1515. tab0.'WTABLE'.'CYCLE' = cy0 ;
  1516.  
  1517. FIN loop0 ;
  1518.  
  1519. **********************************************************************
  1520. * OUTPUT *
  1521. **********************************************************************
  1522.  
  1523. * Cleaning
  1524. OTER tab0 'WTABLE' ;
  1525. MENA 'OBLI' ;
  1526.  
  1527. **********************************************************************
  1528. * END MESSAGE *
  1529. **********************************************************************
  1530.  
  1531. * Write cycle history to screen
  1532. SI sbs0 ;
  1533. MESS ' ' ;
  1534. MESS '+-----------------------------------------------------------------------------+' ;
  1535. MESS '| |' ;
  1536. MESS '| TOPOPTIM : Bilan |' ;
  1537. MESS '| |' ;
  1538. MESS '+-----------------------------------------------------------------------------+' ;
  1539. MESS ' ' ;
  1540. MESS ' Cyc. | Obj. | Max change | Penal. fac. | GSF fac. | Nb. el.' ;
  1541. REPE loop0 (DIME Lstobj0) ;
  1542. MESS (CHAI 'FORMAT' '(I5)' &loop0 /2
  1543. 'FORMAT' '(ES14.7E2)' (EXTR Lstobj0 &loop0) /8
  1544. 'FORMAT' '(ES14.7E2)' (EXTR Lstchg0 &loop0) /23
  1545. 'FORMAT' '(ES14.7E2)' (EXTR Lstp0 &loop0) /38
  1546. 'FORMAT' '(ES14.7E2)' (EXTR Lstq0 &loop0) /53
  1547. (EXTR Lstnbel0 &loop0) /69) ;
  1548. FIN loop0 ;
  1549. FINS ;
  1550. MESS ' ' ;
  1551. SI tab0.'CONVERGENCE' ;
  1552. MESS ' Convergence apres' ' ' (DIME Lstobj0) ' cycles.' ;
  1553. SINO ;
  1554. MESS ' Nombre maximum de cycles d''optimisation atteint.' ;
  1555. FINS ;
  1556. MESS ' ' ;
  1557. MESS '+-----------------------------------------------------------------------------+' ;
  1558. MESS '| |' ;
  1559. MESS '| FIN DE LA PROCEDURE |' ;
  1560. MESS '| |' ;
  1561. MESS '| T O P O P T I M |' ;
  1562. MESS '| |' ;
  1563. MESS '+-----------------------------------------------------------------------------+' ;
  1564. MESS ' ' ;
  1565. MESS ' ' ;
  1566. MESS ' ' ;
  1567.  
  1568. FINP ;
  1569.  
  1570.  
  1571.  
  1572.  

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