Télécharger topoboot.procedur

Retour à la liste

Numérotation des lignes :

  1. * TOPOBOOT PROCEDUR PV090527 24/01/10 21:15:06 11818
  2. * TOPOBOOT PROCEDUR CB215821 21/04/22 14:10:01 9715
  3.  
  4. ************************************************************************
  5. ** Procedure called by TOPOPTIM for preprocessing the input data.
  6. **
  7. ** Author:
  8. ** Guenhael Le Quilliec (LaMe - Polytech Tours)
  9. **
  10. ** Version:
  11. ** 2.0 2021/04/22 Making the procedure compatible with Cast3M-2020
  12. ** for linear resolution with thermo-mechanical loading
  13. ** 1.0 2021/04/15
  14. ************************************************************************
  15.  
  16. DEBP TOPOBOOT tab0*'TABLE' ;
  17.  
  18. * Working table initialization
  19. * ****************************
  20.  
  21. tab0.'WTABLE' = TABL ;
  22. wtab0 = tab0.'WTABLE' ;
  23. * Boolean variables
  24. wtab0.'BOOL' = TABL ;
  25. bool0 = wtab0.'BOOL' ;
  26. wtab0.'RESOLUTION' = TABL ;
  27. wtab0.'MAILLAGE' = TABL ;
  28. wtab0.'MODELE' = TABL ;
  29.  
  30. * Mesh, model, boundary conditions and loading
  31. * ********************************************
  32.  
  33. * Table of the finite element model data
  34. bool0.'PASAPAS' = EXIS tab0 'RESOLUTION_PASAPAS' ;
  35. SI bool0.'PASAPAS' ;
  36. mdl0 = tab0.'RESOLUTION_PASAPAS' ;
  37. SINO ;
  38. mdl0 = tab0.'RESOLUTION_LINEAIRE' ;
  39. FINS ;
  40. wtab0.'RESOLUTION'.(0) = mdl0 ;
  41.  
  42. * Mechanical boundary conditions
  43. bcM_nb0 = 0 ;
  44. SI (EXIS mdl0 'BLOCAGES_MECANIQUES') ;
  45. bcM_nb0 = 1 ;
  46. bcM0 = mdl0.'BLOCAGES_MECANIQUES' ;
  47. SI (EGA (TYPE bcM0) 'TABLE') ;
  48. REPE loop0 (DIME bcM0) ;
  49. SI (EXIS bcM0 &loop0) ;
  50. bcM_nb0 = &loop0 ;
  51. FINS ;
  52. FIN loop0 ;
  53. SI (EGA bcM_nb0 1) ;
  54. bcM0 = bcM0.(1) ;
  55. FINS ;
  56. FINS ;
  57. FINS ;
  58.  
  59. * Thermal boundary conditions
  60. bcT_nb0 = 0 ;
  61. SI (EXIS mdl0 'BLOCAGES_THERMIQUES') ;
  62. bcT_nb0 = 1 ;
  63. bcT0 = mdl0.'BLOCAGES_THERMIQUES' ;
  64. SI (EGA (TYPE bcT0) 'TABLE') ;
  65. REPE loop0 (DIME bcT0) ;
  66. SI (EXIS bcT0 &loop0) ;
  67. bcT_nb0 = &loop0 ;
  68. FINS ;
  69. FIN loop0 ;
  70. SI (EGA bcT_nb0 1) ;
  71. bcT0 = bcT0.(1) ;
  72. FINS ;
  73. FINS ;
  74. FINS ;
  75.  
  76. * Loading
  77. load_nb0 = 1 ;
  78. load0 = mdl0.'CHARGEMENT' ;
  79. SI (EGA (TYPE load0) 'TABLE') ;
  80. REPE loop0 (DIME load0) ;
  81. SI (EXIS load0 &loop0) ;
  82. load_nb0 = &loop0 ;
  83. FINS ;
  84. FIN loop0 ;
  85. SI (EGA load_nb0 1) ;
  86. load0 = load0.(1) ;
  87. FINS ;
  88. FINS ;
  89.  
  90. * Model
  91. mod0 = mdl0.'MODELE' ;
  92. mecha0 = EXIS mod0 'FORM' 'MECANIQUE' ;
  93. bool0.'MECANIQUE' = mecha0 ;
  94. SI mecha0 ;
  95. wtab0.'MECANIQUE' = TABL ;
  96. wtab0.'MECANIQUE'.'MODELE' = TABL ;
  97. modM0 = EXTR mod0 'FORM' 'MECANIQUE' ;
  98. wtab0.'MECANIQUE'.'MODELE'.(0) = modM0 ;
  99. wtab0.'MECANIQUE'.'CARACTERISTIQUES' = TABL ;
  100. FINS ;
  101. therm0 = EXIS mod0 'FORM' 'THERMIQUE' ;
  102. bool0.'THERMIQUE' = therm0 ;
  103. SI therm0 ;
  104. wtab0.'THERMIQUE' = TABL ;
  105. wtab0.'THERMIQUE'.'MODELE' = TABL ;
  106. modT0 = EXTR mod0 'FORM' 'THERMIQUE' ;
  107. wtab0.'THERMIQUE'.'MODELE'.(0) = modT0 ;
  108. wtab0.'THERMIQUE'.'CARACTERISTIQUES' = TABL ;
  109. FINS ;
  110. cntct0 = EXIS mod0 'FORM' 'CONTACT' ;
  111. bool0.'CONTACT' = cntct0 ;
  112. SI cntct0 ;
  113. wtab0.'CONTACT' = TABL ;
  114. wtab0.'CONTACT'.'MAILLAGE' = TABL ;
  115. wtab0.'CONTACT'.'MODELE' = TABL ;
  116. modC0 = EXTR mod0 'FORM' 'CONTACT' ;
  117. wtab0.'CONTACT'.'MODELE'.(0) = modC0 ;
  118. wtab0.'CONTACT'.'CARACTERISTIQUES' = TABL ;
  119. FINS ;
  120.  
  121. * Material
  122. mat0 = mdl0.'CARACTERISTIQUES' ;
  123. SI mecha0 ;
  124. matM0 = REDU mat0 modM0 ;
  125. wtab0.'MECANIQUE'.'CARACTERISTIQUES'.(0) = matM0 ;
  126. FINS ;
  127. SI therm0 ;
  128. matT0 = REDU mat0 modT0 ;
  129. wtab0.'THERMIQUE'.'CARACTERISTIQUES'.(0) = matT0 ;
  130. FINS ;
  131. SI cntct0 ;
  132. matC0 = REDU mat0 modC0 ;
  133. wtab0.'CONTACT'.'CARACTERISTIQUES'.(0) = matC0 ;
  134. FINS ;
  135.  
  136. * Mesh (without Contact mesh, only Mechanic and/or Thermic)
  137. SI mecha0 ;
  138. msh0 = EXTR modM0 'MAIL' ;
  139. SINO ;
  140. msh0 = EXTR modT0 'MAIL' ;
  141. FINS ;
  142. wtab0.'MAILLAGE'.(0) = msh0 ;
  143. SI cntct0 ;
  144. wtab0.'CONTACT'.'MAILLAGE'.(0) = EXTR modC0 'MAIL' ;
  145. FINS ;
  146.  
  147. * Check that the number of elements of each mesh (thermal and mecha)
  148. * equals that of the global mesh otherwise the procedure can't work
  149. SI (mecha0 ET therm0) ;
  150. SI (NEG (NBEL (EXTR modM0 'MAIL')) (NBEL (EXTR modT0 'MAIL'))) ;
  151. MESS 'Les modeles thermique et mecanique doivent s''appuyer sur un meme maillage.' ;
  152. ERRE 'Veuillez adapter vos modeles en consequence.' ;
  153. FINS ;
  154. FINS ;
  155.  
  156. * Compliant mechanism topology optimization
  157. mcn0 = EXIS tab0 'MECANISME' ;
  158. bool0.'MECANISME' = mcn0 ;
  159.  
  160. * Compliant mechanism output loading
  161. load_nb1 = 0 ;
  162. SI mcn0 ;
  163. load_nb1 = 1 ;
  164. load1 = tab0.'MECANISME' ;
  165. SI (EGA (TYPE load1) 'TABLE') ;
  166. REPE loop0 (DIME load1) ;
  167. SI (EXIS load1 &loop0) ;
  168. load_nb1 = &loop0 ;
  169. FINS ;
  170. FIN loop0 ;
  171. SI (EGA load_nb1 1) ;
  172. load1 = load1.(1) ;
  173. FINS ;
  174. FINS ;
  175. FINS ;
  176.  
  177. * Solve the problem also without springs
  178. SI (NON (EXIS tab0 'MECANISME_ZERO_SPRING')) ;
  179. tab0.'MECANISME_ZERO_SPRING' = FAUX ;
  180. FINS ;
  181.  
  182. * Check that a mechanical model exists
  183. SI (mcn0 ET (NON mecha0)) ;
  184. MESS 'Pour effectuer une optimisation de mecanisme deformable, il faut imperativement preciser un modele mecanique.' ;
  185. ERRE 'Veuillez preciser le modele mecanique a utiliser.' ;
  186. FINS ;
  187.  
  188. * General optimization options
  189. * ****************************
  190.  
  191. * Frozen area
  192. froz0 = EXIS tab0 'ZONE_FIGEE' ;
  193. bool0.'ZONE_FIGEE' = froz0 ;
  194. SI froz0 ;
  195. msh2 = tab0.'ZONE_FIGEE' ;
  196. msh1 = DIFF msh0 msh2 ;
  197. SI mecha0 ;
  198. modM1 = REDU modM0 msh1 ;
  199. modM2 = REDU modM0 msh2 ;
  200. wtab0.'MECANIQUE'.'MODELE'.(2) = modM2 ;
  201. matM1 = REDU matM0 msh1 ;
  202. matM2 = REDU matM0 msh2 ;
  203. wtab0.'MECANIQUE'.'CARACTERISTIQUES'.(2) = matM2 ;
  204. FINS ;
  205. SI therm0 ;
  206. modT1 = REDU modT0 msh1 ;
  207. modT2 = REDU modT0 msh2 ;
  208. wtab0.'THERMIQUE'.'MODELE'.(2) = modT2 ;
  209. matT1 = REDU matT0 msh1 ;
  210. matT2 = REDU matT0 msh2 ;
  211. wtab0.'THERMIQUE'.'CARACTERISTIQUES'.(2) = matT2 ;
  212. FINS ;
  213. SINO ;
  214. msh1 = msh0 ;
  215. SI mecha0 ;
  216. modM1 = modM0 ;
  217. matM1 = matM0 ;
  218. FINS ;
  219. SI therm0 ;
  220. modT1 = modT0 ;
  221. matT1 = matT0 ;
  222. FINS ;
  223. FINS ;
  224. wtab0.'MAILLAGE'.(1) = msh1 ;
  225. SI mecha0 ;
  226. wtab0.'MECANIQUE'.'MODELE'.(1) = modM1 ;
  227. wtab0.'MECANIQUE'.'CARACTERISTIQUES'.(1) = matM1 ;
  228. FINS ;
  229. SI therm0 ;
  230. wtab0.'THERMIQUE'.'MODELE'.(1) = modT1 ;
  231. wtab0.'THERMIQUE'.'CARACTERISTIQUES'.(1) = matT1 ;
  232. FINS ;
  233. SI mecha0 ;
  234. wtab0.'MODELE'.(0) = modM0 ;
  235. wtab0.'MODELE'.(1) = modM1 ;
  236. SI froz0 ;
  237. wtab0.'MODELE'.(2) = modM2 ;
  238. FINS ;
  239. SINO ;
  240. wtab0.'MODELE'.(0) = modT0 ;
  241. wtab0.'MODELE'.(1) = modT1 ;
  242. SI froz0 ;
  243. wtab0.'MODELE'.(2) = modT2 ;
  244. FINS ;
  245. FINS ;
  246.  
  247. * Ratio between the mechanical stiffness of the voids and the material
  248. SI (NON (EXIS tab0 'RAPPORT_RAIDEURS_MECANIQUES')) ;
  249. SI (mcn0 OU therm0) ;
  250. tab0.'RAPPORT_RAIDEURS_MECANIQUES' = 1.0e-8 ;
  251. SINO ;
  252. tab0.'RAPPORT_RAIDEURS_MECANIQUES' = 0.0 ;
  253. FINS ;
  254. FINS ;
  255.  
  256. * Ratio between the thermal stiffness of the voids and the material
  257. SI (NON (EXIS tab0 'RAPPORT_RAIDEURS_THERMIQUES')) ;
  258. tab0.'RAPPORT_RAIDEURS_THERMIQUES' = 0.001 ;
  259. FINS ;
  260.  
  261. * Minimal threshold value of the topology field to save elements
  262. SI (NON (EXIS tab0 'SEUIL')) ;
  263. tab0.'SEUIL' = 1.0e-9 ;
  264. FINS ;
  265.  
  266. * Volume fraction
  267. SI (NON (EXIS tab0 'FRACTION_VOLUME')) ;
  268. tab0.'FRACTION_VOLUME' = 0.4 ;
  269. FINS ;
  270. volfrac0 = FLOT tab0.'FRACTION_VOLUME' ;
  271.  
  272. * Personal procedure that can be used, amongst others, to
  273. * calculate/modify the sensibility field and objective value
  274. SI (NON (EXIS tab0 'PROCEDURE_TOPOPERS')) ;
  275. tab0.'PROCEDURE_TOPOPERS' = FAUX ;
  276. FINS ;
  277.  
  278. * Weights
  279. SI (NON (EXIS tab0 'POIDS_MECANISME')) ;
  280. tab0.'POIDS_MECANISME' = 1.0 ;
  281. FINS ;
  282.  
  283. SI (NON (EXIS tab0 'POIDS_ENERGIE_DEFO')) ;
  284. SI mcn0 ;
  285. tab0.'POIDS_ENERGIE_DEFO' = 0.0 ;
  286. SINO ;
  287. tab0.'POIDS_ENERGIE_DEFO' = 1.0 ;
  288. FINS ;
  289. FINS ;
  290.  
  291. SI (NON (EXIS tab0 'POIDS_TEMPERATURE')) ;
  292. SI mcn0 ;
  293. tab0.'POIDS_TEMPERATURE' = 0.0 ;
  294. SINO ;
  295. tab0.'POIDS_TEMPERATURE' = 1.0 ;
  296. FINS ;
  297. FINS ;
  298.  
  299. * Procedure to add a geometric restrictions
  300. bool0.'RESTRICTIONS' = EXIS tab0 'RESTRICTIONS' ;
  301.  
  302. * Number of the last completed cycle
  303. SI (NON (EXIS tab0 'CYCLE')) ;
  304. tab0.'CYCLE' = 0 ;
  305. FINS ;
  306. cy0 = (ENTI (tab0.'CYCLE')) + 1 ;
  307. wtab0.'CYCLE' = cy0 ;
  308.  
  309. * Maximum number of optimization cycles
  310. SI (NON (EXIS tab0 'MAX_CYCLES')) ;
  311. tab0.'MAX_CYCLES' = 100 ;
  312. FINS ;
  313.  
  314. * Filter type
  315. SI (NON (EXIS tab0 'FILTRE')) ;
  316. tab0.'FILTRE' = MOT 'GIBIANE' ;
  317. FINS ;
  318.  
  319. * Parameters for matrix filter type
  320. SI (EGA tab0.'FILTRE' 'MATRICE');
  321. * Filter radius
  322. SI (NON (EXIS tab0 'FILTRE_RAYON')) ;
  323. ERRE 'Veuillez preciser un rayon de filtrage.' ;
  324. FINS ;
  325. * Filter exponent
  326. SI (NON (EXIS tab0 'FILTRE_EXPOSANT')) ;
  327. tab0.'FILTRE_EXPOSANT' = 1.0 ;
  328. FINS ;
  329. * Filter weight minimum threshold
  330. SI (NON (EXIS tab0 'FILTRE_CRITERE')) ;
  331. tab0.'FILTRE_CRITERE' = 0.0 ;
  332. FINS ;
  333. * Number of POINTEUR of the mesh for detecting remeshing
  334. tab0.'WTABLE'.'MFIL_POINTEUR' = -1 ;
  335. FINS ;
  336.  
  337. * Parameters for Gibiane filter type
  338. SI (EGA tab0.'FILTRE' 'GIBIANE');
  339. * Filter rate
  340. SI (NON (EXIS tab0 'FILTRE_TAUX')) ;
  341. tab0.'FILTRE_TAUX' = 1 ;
  342. FINS ;
  343. FINS ;
  344.  
  345. * Convergence criterion
  346. SI (NON (EXIS tab0 'CRITERE')) ;
  347. tab0.'CRITERE' = 0.01 ;
  348. FINS ;
  349.  
  350. * Maximum increment of the topology field between two cycles
  351. SI (NON (EXIS tab0 'TOPOLOGIE_MAX_INC')) ;
  352. tab0.'TOPOLOGIE_MAX_INC' = 0.2 ;
  353. FINS ;
  354.  
  355. * Topology minimum value of the optimality criterion method
  356. SI (NON (EXIS tab0 'TOPOLOGIE_MIN')) ;
  357. SI mcn0 ;
  358. tab0.'TOPOLOGIE_MIN' = 0.001 ;
  359. SINO ;
  360. tab0.'TOPOLOGIE_MIN' = 0.0 ;
  361. FINS ;
  362. FINS ;
  363.  
  364. * Optimality criterion (OC)
  365. * *************************
  366.  
  367. * Initial lower bound for the Lagrangian multiplier
  368. SI (NON (EXIS tab0 'OC_L1')) ;
  369. tab0.'OC_L1' = 0.0 ;
  370. FINS ;
  371.  
  372. * Initial upper bound for the Lagrangian multiplier
  373. *SI (NON (EXIS tab0 'OC_L2')) ;
  374. * tab0.'OC_L2' = 1.0e5 ;
  375. *FINS ;
  376.  
  377. * Minimal value for the upper bound
  378. SI (NON (EXIS tab0 'OC_L2_MIN')) ;
  379. tab0.'OC_L2_MIN' = 1.0e-40 ;
  380. FINS ;
  381.  
  382. * Convergence criterion for the bi-sectioning algorithm
  383. SI (NON (EXIS tab0 'OC_CRITERE')) ;
  384. tab0.'OC_CRITERE' = 1.0e-8 ;
  385. FINS ;
  386.  
  387. * Maximum number of iterations for the bi-sectioning algorithm
  388. SI (NON (EXIS tab0 'OC_MAX_IT')) ;
  389. tab0.'OC_MAX_IT' = 100000;
  390. FINS ;
  391.  
  392. * Lower bound for B (where B**D is the ratio between the new and the
  393. * previous topology fields)
  394. SI (NON (EXIS tab0 'OC_B_MIN')) ;
  395. tab0.'OC_B_MIN' = 1.0e-10 ;
  396. FINS ;
  397.  
  398. * Damping factor (D)
  399. * ******************
  400.  
  401. SI (NON (EXIS tab0 'FACTEUR_D')) ;
  402. tab0.'FACTEUR_D' = 0.5 ;
  403. FINS ;
  404. bool0.'FACTEUR_D_EVOL' = EGA (TYPE tab0.'FACTEUR_D') 'EVOLUTIO' ;
  405. SI (NON bool0.'FACTEUR_D_EVOL') ;
  406. wtab0.'FACTEUR_D' = tab0.'FACTEUR_D' ;
  407. FINS ;
  408.  
  409. * Penalty factor (P)
  410. * ******************
  411.  
  412. * Start value of P
  413. SI (NON (EXIS tab0 'FACTEUR_P')) ;
  414. tab0.'FACTEUR_P' = 3.0 ;
  415. FINS ;
  416. bool0.'FACTEUR_P_EVOL' = EGA (TYPE tab0.'FACTEUR_P') 'EVOLUTIO' ;
  417. SI (NON bool0.'FACTEUR_P_EVOL') ;
  418. wtab0.'FACTEUR_P' = tab0.'FACTEUR_P' ;
  419. FINS ;
  420.  
  421. * Grey Scale Factor (Q)
  422. * *********************
  423.  
  424. * Start value of Q
  425. SI (NON (EXIS tab0 'FACTEUR_Q')) ;
  426. tab0.'FACTEUR_Q' = 1.0 ;
  427. FINS ;
  428. bool0.'FACTEUR_Q_EVOL' = EGA (TYPE tab0.'FACTEUR_Q') 'EVOLUTIO' ;
  429. SI (NON bool0.'FACTEUR_Q_EVOL') ;
  430. wtab0.'FACTEUR_Q' = tab0.'FACTEUR_Q' ;
  431. FINS ;
  432.  
  433. * Complementary options
  434. * *********************
  435.  
  436. * Only for step by step resolution
  437. SI bool0.'PASAPAS' ;
  438. * Save time list
  439. SI (NON (EXIS mdl0 'TEMPS_SAUVES')) ;
  440. SavTime0 = EXTR (LECT 1 (DIME mdl0.'TEMPS_CALCULES')) mdl0.'TEMPS_CALCULES' ;
  441. SINO ;
  442. SavTime0 = mdl0.'TEMPS_SAUVES' ;
  443. FINS ;
  444. wtab0.'TEMPS_SAUVES' = SavTime0 ;
  445. * Number of steps
  446. wtab0.'NB_PAS' = (DIME SavTime0) - 1 ;
  447. FINS ;
  448.  
  449. * Numerical precision
  450. SI (NON (EXIS tab0 'PRECISION')) ;
  451. tab0.'PRECISION' = 1.0e-9 ;
  452. FINS ;
  453.  
  454. * Division by zero protection
  455. SI (NON (EXIS tab0 'ZERO_DIVISION')) ;
  456. tab0.'ZERO_DIVISION' = 0.001 ;
  457. FINS ;
  458. zdiv0 = tab0.'ZERO_DIVISION' ;
  459.  
  460. * Draw topology
  461. SI (NON (EXIS tab0 'TRAC')) ;
  462. tab0.'TRAC' = VRAI ;
  463. FINS ;
  464.  
  465. * Convergence
  466. tab0.'CONVERGENCE' = FAUX ;
  467.  
  468. * Cycles to be saved
  469. SI (NON (EXIS tab0 'CYCLES_SAUVEGARDES')) ;
  470. tab0.'CYCLES_SAUVEGARDES' = LECT ;
  471. FINS ;
  472.  
  473. * Data to be saved
  474. SI (NON (EXIS tab0 'MES_SAUVEGARDES')) ;
  475. tab0.'MES_SAUVEGARDES' = TABL ;
  476. FINS ;
  477. SI (NON (EXIS tab0.'MES_SAUVEGARDES' 'TOPOLOGIE')) ;
  478. tab0.'MES_SAUVEGARDES'.'TOPOLOGIE' = VRAI ;
  479. FINS ;
  480. SI (NON (EXIS tab0.'MES_SAUVEGARDES' 'MAILLAGE')) ;
  481. tab0.'MES_SAUVEGARDES'.'MAILLAGE' = VRAI ;
  482. FINS ;
  483. SI (NON (EXIS tab0.'MES_SAUVEGARDES' 'RESOLUTION')) ;
  484. tab0.'MES_SAUVEGARDES'.'RESOLUTION' = FAUX ;
  485. FINS ;
  486.  
  487. * Topology output table
  488. SI (NON (EXIS tab0 'TOPOLOGIE')) ;
  489. tab0.'TOPOLOGIE' = TABL ;
  490. FINS ;
  491.  
  492. * Mesh output table
  493. SI (NON (EXIS tab0 'MAILLAGE')) ;
  494. tab0.'MAILLAGE' = TABL ;
  495. FINS ;
  496.  
  497. * Resolution output table
  498. SI (NON (EXIS tab0 'RESOLUTION')) ;
  499. tab0.'RESOLUTION' = TABL ;
  500. FINS ;
  501.  
  502. **********************************************************************
  503. * PREPROCESSING *
  504. **********************************************************************
  505.  
  506. * Various element fields
  507. * **********************
  508.  
  509. * Mechanical model element fields
  510. SI mecha0 ;
  511. * Unitary field
  512. unM1 = MANU 'CHML' modM1 'SCAL' 1.0 'TYPE' 'SCALAIRE' 'GRAVITE' ;
  513. * Volume of each element
  514. volElM1 = INTG 'ELEM' unM1 modM1 matM0 ;
  515. * Change the unitary field so that is not considered as constant
  516. * to avoid problems with the function POIN 'SUPE'
  517. unM1 = volElM1 / volElM1 ;
  518. wtab0.'MECANIQUE'.'UN' = TABL ;
  519. wtab0.'MECANIQUE'.'UN'.(1) = unM1 ;
  520. wtab0.'MECANIQUE'.'VOLUME' = TABL ;
  521. wtab0.'MECANIQUE'.'VOLUME'.(1) = volElM1 ;
  522. SI froz0 ;
  523. * Unitary field
  524. unM2 = MANU 'CHML' modM2 'SCAL' 1.0 'TYPE' 'SCALAIRE' 'GRAVITE' ;
  525. * Volume of each element
  526. volElM2 = INTG 'ELEM' unM2 modM2 matM0 ;
  527. wtab0.'MECANIQUE'.'UN'.(2) = unM2 ;
  528. wtab0.'MECANIQUE'.'VOLUME'.(2) = volElM2 ;
  529. FINS ;
  530. FINS ;
  531.  
  532. * Thermal model element fields
  533. SI therm0 ;
  534. * Unitary field
  535. unT1 = MANU 'CHML' modT1 'SCAL' 1.0 'TYPE' 'SCALAIRE' 'GRAVITE' ;
  536. * Volume of each element
  537. volElT1 = INTG 'ELEM' unT1 modT1 matT0 ;
  538. * In thermal mode, 'GRAVITE' option is not respected
  539. * This problem is solved by INTG 'ELEM' divided by itself
  540. * This also change the unitary field so that is not considered as
  541. * constant to avoid problems with the function POIN 'SUPE'
  542. unT1 = volElT1 / volElT1 ;
  543. wtab0.'THERMIQUE'.'UN' = TABL ;
  544. wtab0.'THERMIQUE'.'UN'.(1) = unT1 ;
  545. wtab0.'THERMIQUE'.'VOLUME' = TABL ;
  546. wtab0.'THERMIQUE'.'VOLUME'.(1) = volElT1 ;
  547. SI froz0 ;
  548. * Unitary field
  549. unT2 = MANU 'CHML' modT2 'SCAL' 1.0 'TYPE' 'SCALAIRE' 'GRAVITE' ;
  550. * Volume of each element
  551. volElT2 = INTG 'ELEM' unT2 modT2 matT0 ;
  552. * In thermal mode, 'GRAVITE' option is not respected
  553. * This problem is solved by INTG 'ELEM' divided by itself
  554. unT2 = volElT2 / volElT2 ;
  555. wtab0.'THERMIQUE'.'UN'.(2) = unT2 ;
  556. wtab0.'THERMIQUE'.'VOLUME'.(2) = volElT2 ;
  557. FINS ;
  558. FINS ;
  559.  
  560. * Default fields
  561. SI mecha0 ;
  562. un1 = unM1 ;
  563. SI froz0 ;
  564. un2 = unM2 ;
  565. FINS ;
  566. SINO ;
  567. un1 = unT1 ;
  568. SI froz0 ;
  569. un2 = unT2 ;
  570. FINS ;
  571. FINS ;
  572. wtab0.'ZERO' = TABL ;
  573. wtab0.'ZERO'.(1) = un1 * 0.0 ;
  574. wtab0.'UN' = TABL ;
  575. wtab0.'UN'.(1) = un1 ;
  576. SI froz0 ;
  577. wtab0.'UN'.(2) = un2 ;
  578. FINS ;
  579. SI mecha0 ;
  580. wtab0.'MECANIQUE'.'CHAMP_MIN' = un1 * tab0.'RAPPORT_RAIDEURS_MECANIQUES' ;
  581. FINS ;
  582. SI therm0 ;
  583. wtab0.'THERMIQUE'.'CHAMP_MIN' = un1 * tab0.'RAPPORT_RAIDEURS_THERMIQUES' ;
  584. FINS ;
  585. * Node mesh of the barycenters
  586. wtab0.'MAILLAGE'.'GRAVITE' = un1 POIN 'SUPE' -1.0 ;
  587. * Zero point field
  588. wtab0.'CHPO_ZERO' = TABL ;
  589. wtab0.'CHPO_ZERO'.(1) = PROI wtab0.'MAILLAGE'.'GRAVITE' wtab0.'ZERO'.(1) ;
  590.  
  591. * Initial volumes
  592. wtab0.'VOLUME' = TABL ;
  593. SI froz0 ;
  594. SI mecha0 ;
  595. vol1 = INTG un1 modM1 matM1 ;
  596. vol2 = INTG un2 modM2 matM2 ;
  597. SINO ;
  598. vol1 = INTG un1 modT1 matT1 ;
  599. vol2 = INTG un2 modT2 matT2 ;
  600. FINS ;
  601. wtab0.'VOLUME'.(0) = vol1 + vol2 ;
  602. SINO ;
  603. SI mecha0 ;
  604. vol1 = INTG un1 modM1 matM1 ;
  605. SINO ;
  606. vol1 = INTG un1 modT1 matT1 ;
  607. FINS ;
  608. wtab0.'VOLUME'.(0) = vol1 ;
  609. FINS ;
  610. wtab0.'VOLUME'.(1) = vol1 ;
  611.  
  612. * Initial topology
  613. SI (EXIS tab0.'TOPOLOGIE' (cy0 - 1)) ;
  614. SI mecha0 ;
  615. * Express the input topology element field at the barycenters of
  616. * the elements of the model modM1
  617. x0 = TOPOCHAN tab0.'TOPOLOGIE'.(cy0 - 1) modM1 wtab0.'MAILLAGE'.'GRAVITE' ;
  618. x0 = x0 * (vol1 * volfrac0 / (INTG x0 modM1 matM1)) ;
  619. SINO ;
  620. * Express the input topology element field at the barycenters of
  621. * the elements of the model modT1
  622. x0 = TOPOCHAN tab0.'TOPOLOGIE'.(cy0 - 1) modT1 wtab0.'MAILLAGE'.'GRAVITE' ;
  623. * In thermal mode, 'GRAVITE' option is not respected
  624. * This problem is solved by INTG 'ELEM'
  625. x0 = (INTG 'ELEM' x0 modT1 matT1) / volElT1 ;
  626. x0 = x0 * (vol1 * volfrac0 / (INTG x0 modT1 matT1)) ;
  627. FINS ;
  628. SINO ;
  629. SI (NEG cy0 1) ;
  630. MESS (CHAI 'Le cycle de depart est le' ' ' cy0 '.') ;
  631. MESS (CHAI 'Or la topologie' ' ' (cy0 - 1) ' n''existe pas.') ;
  632. ERRE 'Veuillez preciser la topologie du cycle precedent.' ;
  633. SINO ;
  634. x0 = un1 * volfrac0 ;
  635. FINS ;
  636. FINS ;
  637. wtab0.'TOPOLOGIE' = x0 ;
  638.  
  639. * Number and name of the components for the forces and the displacements
  640. SI mecha0 ;
  641. CompFrc0 = EXTR modM0 'FORC' ;
  642. CompDpl0 = EXTR modM0 'DEPL' ;
  643. CompMNb0 = DIME CompDpl0 ;
  644. FINS ;
  645. * Number and name of the components for the thermal flux and the temperature
  646. SI therm0 ;
  647. CompQ0 = EXTR modT0 'FORC' ;
  648. CompT0 = EXTR modT0 'DEPL' ;
  649. CompTNb0 = DIME CompT0 ;
  650. FINS ;
  651.  
  652. * Multiple cases of loads and/or boundary conditions
  653. case_nb0 = MAXI (LECT load_nb0 load_nb1 bcT_nb0 bcM_nb0) ;
  654. wtab0.'NB_CAS' = case_nb0 ;
  655. bool0.'CAS_MULTIPLES' = case_nb0 > 1 ;
  656. SI bool0.'CAS_MULTIPLES' ;
  657. SI (((load_nb0 > 1) ET (NEG load_nb0 case_nb0)) OU
  658. ((load_nb1 > 1) ET (NEG load_nb1 case_nb0)) OU
  659. ((bcT_nb0 > 1) ET (NEG bcT_nb0 case_nb0)) OU
  660. ((bcM_nb0 > 1) ET (NEG bcM_nb0 case_nb0))) ;
  661. MESS 'Le nombre de cas de charges ne correspond pas au nombre de cas de conditions aux limites.'
  662. ' Lorsque superieurs a 1, le nombre de cas de charge et de cas de conditions aux limites doivent correspondre.';
  663. ERRE 'Veuillez verifier vos donnees d''entree.' ;
  664. FINS ;
  665. * Transform a single load into a list of identical loads in a table
  666. SI (EGA load_nb0 1) ;
  667. tmp0 = TABL ;
  668. REPE loop0 case_nb0 ;
  669. tmp0.&loop0 = load0 ;
  670. FIN loop0 ;
  671. load0 = tmp0 ;
  672. FINS ;
  673. * Transform a single load into a list of identical loads in a table
  674. SI (EGA load_nb1 1) ;
  675. tmp0 = TABL ;
  676. REPE loop0 case_nb0 ;
  677. tmp0.&loop0 = load1 ;
  678. FIN loop0 ;
  679. load1 = tmp0 ;
  680. FINS ;
  681. * Transform mecha. BC into a list of identical mecha. BC in a table
  682. SI (EGA bcM_nb0 1) ;
  683. tmp0 = TABL ;
  684. REPE loop0 case_nb0 ;
  685. tmp0.&loop0 = bcM0 ;
  686. FIN loop0 ;
  687. bcM0 = tmp0 ;
  688. FINS ;
  689. * Transform therm. BC into a list of identical therm. BC in a table
  690. SI (EGA bcT_nb0 1) ;
  691. tmp0 = TABL ;
  692. REPE loop0 case_nb0 ;
  693. tmp0.&loop0 = bcT0 ;
  694. FIN loop0 ;
  695. bcT0 = tmp0 ;
  696. FINS ;
  697. FINS ;
  698. wtab0.'CHARGEMENT' = load0 ;
  699. SI mcn0 ;
  700. wtab0.'MECANISME' = load1 ;
  701. FINS ;
  702. SI mecha0 ;
  703. wtab0.'MECANIQUE'.'BLOCAGES' = bcM0 ;
  704. FINS ;
  705. SI therm0 ;
  706. wtab0.'THERMIQUE'.'BLOCAGES' = bcT0 ;
  707. FINS ;
  708. SI mecha0 ;
  709. SI therm0 ;
  710. SI bool0.'CAS_MULTIPLES' ;
  711. REPE loop0 case_nb0 ;
  712. wtab0.'MECANIQUE'.'CHARGEMENT' = TABL ;
  713. wtab0.'MECANIQUE'.'CHARGEMENT'.&loop0 = EXCO CompFrc0 'NOID' load0.&loop0 ;
  714. FIN loop0 ;
  715. SINO ;
  716. wtab0.'MECANIQUE'.'CHARGEMENT' = EXCO CompFrc0 'NOID' load0 ;
  717. FINS ;
  718. SINO ;
  719. wtab0.'MECANIQUE'.'CHARGEMENT' = load0 ;
  720. FINS ;
  721. FINS ;
  722. SI therm0 ;
  723. SI mecha0 ;
  724. SI bool0.'CAS_MULTIPLES' ;
  725. REPE loop0 case_nb0 ;
  726. wtab0.'THERMIQUE'.'CHARGEMENT' = TABL ;
  727. wtab0.'THERMIQUE'.'CHARGEMENT'.&loop0 = EXCO CompQ0 'NOID' load0.&loop0 ;
  728. FIN loop0 ;
  729. SINO ;
  730. wtab0.'THERMIQUE'.'CHARGEMENT' = EXCO CompQ0 'NOID' load0 ;
  731. FINS ;
  732. SINO ;
  733. wtab0.'THERMIQUE'.'CHARGEMENT' = load0 ;
  734. FINS ;
  735. FINS ;
  736.  
  737. * Springs for the compliant mechanism optimization
  738. SI mcn0 ;
  739. SI bool0.'CAS_MULTIPLES' ;
  740. Spr0 = TABL ;
  741. REPE loop0 case_nb0 ;
  742. Spr0.&loop0 = VIDE 'RIGIDITE'/'RIGIDITE' ;
  743. SI bool0.'PASAPAS' ;
  744. tmp0 = EXTR (DIME SavTime0) SavTime0 ;
  745. tmp0 = (TIRE load0.&loop0 tmp0) + (TIRE load1.&loop0 tmp0) ;
  746. SINO ;
  747. tmp0 = load0.&loop0 + load1.&loop0 ;
  748. FINS ;
  749. tmp1 = EXTR tmp0 'MAIL' ;
  750. tmp2 = NBNO tmp1 ;
  751. REPE loop1 CompMNb0 ;
  752. tmp3 = EXTR CompFrc0 &loop1 ;
  753. tmp4 = EXTR CompDpl0 &loop1 ;
  754. REPE loop2 tmp2 ;
  755. tmp5 = tmp1 POIN &loop2 ;
  756. tmp6 = (ABS (EXTR tmp0 tmp3 tmp5)) * 0.1 ;
  757. Spr0.&loop0 = Spr0.&loop0 ET (APPU tmp4 tmp6 tmp5) ;
  758. FIN loop2 ;
  759. FIN loop1 ;
  760. FIN loop0 ;
  761. SINO ;
  762. Spr0 = VIDE 'RIGIDITE'/'RIGIDITE' ;
  763. SI bool0.'PASAPAS' ;
  764. tmp0 = EXTR (DIME SavTime0) SavTime0 ;
  765. tmp0 = (TIRE load0 tmp0) + (TIRE load1 tmp0) ;
  766. SINO ;
  767. tmp0 = load0 + load1 ;
  768. FINS ;
  769. tmp1 = EXTR tmp0 'MAIL' ;
  770. tmp2 = NBNO tmp1 ;
  771. REPE loop0 CompMNb0 ;
  772. tmp3 = EXTR CompFrc0 &loop0 ;
  773. tmp4 = EXTR CompDpl0 &loop0 ;
  774. REPE loop1 tmp2 ;
  775. tmp5 = tmp1 POIN &loop1 ;
  776. tmp6 = (ABS (EXTR tmp0 tmp3 tmp5)) * 0.1 ;
  777. Spr0 = Spr0 ET (APPU tmp4 tmp6 tmp5) ;
  778. FIN loop1 ;
  779. FIN loop0 ;
  780. FINS ;
  781. wtab0.'RESSORTS' = Spr0 ;
  782. FINS ;
  783.  
  784. * Initializations needed for the cleaning at the begining of the first cycle
  785. wtab0.'MAILLAGE'.'A' = 0 ;
  786. SI mecha0 ;
  787. wtab0.'MECANIQUE'.'MODELE'.'A' = 0 ;
  788. wtab0.'MECANIQUE'.'CARACTERISTIQUES'.'A' = 0 ;
  789. FINS ;
  790. SI therm0 ;
  791. wtab0.'THERMIQUE'.'MODELE'.'A' = 0 ;
  792. wtab0.'THERMIQUE'.'CARACTERISTIQUES'.'A' = 0 ;
  793. FINS ;
  794. SI cntct0 ;
  795. wtab0.'CONTACT'.'MODELE'.'A' = 0 ;
  796. wtab0.'CONTACT'.'CARACTERISTIQUES'.'A' = 0 ;
  797. FINS ;
  798. wtab0.'RESOLUTION'.'A' = 0 ;
  799.  
  800. FINP ;
  801.  
  802.  
  803.  
  804.  

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