Télécharger topoptim.procedur

Retour à la liste

Numérotation des lignes :

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

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