Télécharger mailtopo.procedur

Retour à la liste

Numérotation des lignes :

  1. * MAILTOPO PROCEDUR GOUNAND 25/11/24 21:15:07 12406
  2. ************************************************************************
  3. * NOM : MAILTOPO
  4. * DESCRIPTION : Algorithme topologique de génération ou d'optimisation
  5. * d'un maillage.
  6. *
  7. * Bibliographie :
  8. *
  9. *@article{doi:10.1080/12506559.2000.10511454,
  10. * author = {Coupez, Thierry},
  11. * title = {Génération de maillage et adaptation de maillage par
  12. * optimisation locale},
  13. * journal = {Revue Européenne des Éléments Finis},
  14. * volume = {9},
  15. * number = {4},
  16. * pages = {403-423},
  17. * year = {2000},
  18. * doi = {10.1080/12506559.2000.10511454},
  19. * URL = {http://www.tandfonline.com/doi/abs/10.1080/12506559.2000.10511454}}
  20. *
  21. *
  22. *@PhdThesis{,
  23. * author = {Cyril Gruau},
  24. * title = {Génération de métriques pour adaptation anisotrope
  25. * de maillage, application à la mise en forme des matériaux},
  26. * school = {ENSMP},
  27. * year = {2004},
  28. * month = {10 dec}}
  29. *
  30. *@article{Gruau20054951,
  31. * title = "3D tetrahedral, unstructured and anisotropic mesh
  32. * generation with adaptation to natural and multidomain metric",
  33. * journal = "Computer Methods in Applied Mechanics and Engineering",
  34. * volume = "194",
  35. * number = "48 - 49",
  36. * pages = "4951 - 4976",
  37. * year = "2005",
  38. * issn = "0045-7825",
  39. * doi = "10.1016/j.cma.2004.11.020",
  40. * url = "http://www.sciencedirect.com/science/article/pii/S0045782505000745",
  41. * author = "Cyril Gruau and Thierry Coupez",
  42. * keywords = "Topology and shape optimization",
  43. * keywords = "Elliptic interpolation",
  44. * keywords = "Thickness detection and curvature treatment",
  45. * keywords = "Interface refinement"}
  46. *
  47. * @article{Coupez20112391,
  48. * title = "Metric construction by length distribution tensor and
  49. * edge based error for anisotropic adaptive meshing",
  50. * journal = "Journal of Computational Physics",
  51. * volume = "230",
  52. * number = "7",
  53. * pages = "2391 - 2405",
  54. * year = "2011",
  55. * issn = "0021-9991",
  56. * doi = "10.1016/j.jcp.2010.11.041",
  57. * url = "http://www.sciencedirect.com/science/article/pii/S002199911000656X",
  58. * author = "T. Coupez",
  59. * keywords = "Metric",
  60. * keywords = "Length distribution tensor",
  61. * keywords = "Anisotropic meshing",
  62. * keywords = "Interpolation error",
  63. * keywords = "Edge error estimate"}
  64. *
  65. *
  66. * LANGAGE : GIBIANE-CAST3M
  67. * AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SEMT/LTA)
  68. * mél : stephane.gounand@cea.fr
  69. **********************************************************************
  70. * VERSION : v1, 28/11/2017, version initiale
  71. * HISTORIQUE : v1, 28/11/2017, création
  72. * DESCRIPTION : IJOB=0
  73. * Minimise le volume d'une topologie de maillage
  74. * en le maintenant supérieur à 0
  75. * IJOB=1
  76. * Minimise le volume, mais on a le droit d'ajouter des
  77. * noeuds internes
  78. * IJOB=2
  79. * La topologie de maillage est supposée être un maillage
  80. * On essaie de l'améliorer en conservant son volume
  81. * mais en augmentant sa qualité grace a l'adjonction
  82. * de noeuds internes
  83. *
  84. * 2017/11/30 : On remplace par ialgo (0 ou 1 : génération ou
  85. * optimisation de maillage) et iajno (autorise-t-on
  86. * l'algorithme à ajouter des noeuds.)
  87. * HISTORIQUE :
  88. * HISTORIQUE :
  89. ************************************************************************
  90. *
  91. 'DEBPROC' MAILTOPO ;
  92. * Mot-clé obligatoire :
  93. * TRIA : génération de maillage (ialgo=0)
  94. * REMA : remaillage (ialgo=1)
  95. 'ARGU' moalgo*'MOT' ;
  96. lmoalgo = 'MOTS' 'TRIA' 'REMA' ;
  97. ialgo = 'POSI' moalgo 'DANS' lmoalgo ;
  98. 'SI' ('EGA' ialgo 0) ;
  99. 'ERRE' 1052 'AVEC' moalgo lmoalgo ;
  100. 'FINS' ;
  101. ialgo = ialgo '-' 1 ;
  102. *
  103. 'ARGUMENT' topoini*'MAILLAGE' ;
  104. *dbg 'MESS' 'coucou mailtopo' ;
  105. *
  106. * Dans le cas REMA, le mailleur peut modifier le bord par défaut
  107. * seulement si on donne une métrique
  108. * à l'aide du noeud virtuel lvirt=vrai et on peut dire s'il y a une
  109. * partie du bord que l'on ne veut pas modifier
  110. * Dans le cas TRIA, le mailleur ne peut pas modifier le bord par défaut
  111. *
  112. 'SI' ('EGA' ialgo 1) ;
  113. lvirt = vrai ;
  114. 'ARGU' mbnc/'MAILLAGE' ;
  115. lmbnc = 'EXIS' mbnc ;
  116. 'FINS' ;
  117. 'SI' ('EGA' ialgo 0) ;
  118. lvirt = faux ;
  119. lmbnc = faux ;
  120. 'FINS' ;
  121. *
  122. * Valeur de la métrique
  123. * Attention pour les métriques scalaires, la donnée est homogène à une
  124. * longueur. Pour les métriques anisotropes (tensorielles), c'est
  125. * proportionnel à l'inverse du carré d'une longueur.
  126. *
  127. 'ARGU' metva/'FLOTTANT' ;
  128. 'SI' ('NON' ('EXIS' metva)) ;
  129. 'ARGU' metva/'CHPOINT' ;
  130. 'FINS' ;
  131. * Convention dans cette procédure : s'il n'y a pas de métrique
  132. * On met metva à faux
  133. lmet = 'EXIS' metva ;
  134. 'SI' ('NON' lmet) ;
  135. metva = FAUX ;
  136. 'FINS' ;
  137. tmetva = 'TYPE' metva ;
  138. *
  139. * Mot-clés optionnels :
  140. * IPOL : renvoie la métrique (type CHPOINT) interpolée
  141. * AJNO : on a le droit d'ajouter des noeuds internes (iajno=1
  142. * par défaut)
  143. * NOAJ : on n'ajoute pas de noeuds internes (iajno=0)
  144. *
  145. lmotcle = 'MOTS' 'IPOL' 'AJNO' 'NOAJ' ;
  146. lipol = faux ;
  147. iajno = 1 ;
  148. 'REPE' bmotcle ;
  149. 'ARGU' motcle/'MOT' ;
  150. 'SI' ('NON' ('EXIS' motcle)) ;
  151. 'QUIT' bmotcle ;
  152. 'SINO' ;
  153. * 'MESS' motcle ;
  154. 'SI' ('NON' ('EXIS' lmotcle motcle)) ;
  155. 'ERRE' 1052 'AVEC' motcle lmotcle ;
  156. 'FINS' ;
  157. 'SI' ('EGA' motcle 'IPOL') ;
  158. 'SI' ('EGA' tmetva 'CHPOINT') ;
  159. lipol = vrai ;
  160. 'SINO' ;
  161. 'ERRE' -370 'AVEC' motcle ;
  162. * 39 2
  163. *On ne veut pas d'objet de type %m1:8
  164. 'ERRE' 39 'AVEC' tmetva ;
  165. 'FINS' ;
  166. 'FINS' ;
  167. 'SI' ('EGA' motcle 'NOAJ') ; iajno = 0 ; 'FINS' ;
  168. 'SI' ('EGA' motcle 'AJNO') ; iajno = 1 ; 'FINS' ;
  169. 'FINS' ;
  170. 'FIN' bmotcle ;
  171. *
  172. * Lecture mots-clefs valeur jusqu'à épuisement obligatoire ou non,
  173. * valeurs par défaut...
  174. *
  175. * Obligatoire
  176. *
  177. * DESCRIPTION : IJOB=0
  178. * Minimise le volume d'une topologie de maillage
  179. * en le maintenant supérieur à 0
  180. * IJOB=1
  181. * Minimise le volume, mais on a le droit d'ajouter des
  182. * noeuds internes
  183. * IJOB=2
  184. * La topologie de maillage est supposée être un maillage
  185. * On essaie de l'améliorer en conservant son volume
  186. * mais en augmentant sa qualité grace a l'adjonction
  187. * de noeuds internes
  188. *
  189. * 2017/11/30 : On remplace par ialgo (0 ou 1 : génération ou
  190. * optimisation de maillage) et iajno (autorise-t-on
  191. * l'algorithme à ajouter des noeuds.)
  192. * 2018/01/17 : On essaie de faire aller l'algorithme plus vite en ne
  193. * parcourant que les éléments touchant les différences
  194. * d'un cycle d'optimisation à l'autre
  195. * paramètre
  196. *
  197. * 2018/06/16 : On a ajouté un indice bord_no_chan et corrigé quelques
  198. * bugs dans son implémentation
  199. *
  200. *
  201. *
  202. *
  203. *ijob = tparam . 'job' ;
  204. *
  205. * Optionnel
  206. *
  207. 'ARGU' tparam/'TABLE' ;
  208. xtparam = 'EXIS' tparam ;
  209. 'SI' ('NON' xtparam) ;
  210. tparam = 'TABL' ;
  211. 'FINS' ;
  212. *
  213. * Interpolation de la metrique
  214. *
  215. imomet = MATOUTIL 'GASTIDX' tparam 'ipol_met' 0 ;
  216. 'SI' ('EGA' imomet 0) ;
  217. momet = 'ARIT' ;
  218. 'SINO' ;
  219. 'SI' ('EGA' imomet 1) ;
  220. momet = 'GEOM' ;
  221. 'SINO' ;
  222. 'ERRE' ('CHAI' 'ipol_met=' imomet ' incorrect') ;
  223. 'FINS' ;
  224. 'FINS' ;
  225. *
  226. * Generation d'un nouveau noeud
  227. *
  228. imobary = MATOUTIL 'GASTIDX' tparam 'bary_topo' 0 ;
  229. 'SI' ('NON' ('EXIS' ('LECT' 0 1) imobary)) ;
  230. 'ERRE' ('CHAI' 'bary_topo=' imobary ' incorrect') ;
  231. 'FINS' ;
  232.  
  233. *
  234. * impr : niveau d'impression de la procédure
  235. *
  236. impr = MATOUTIL 'GASTIDX' tparam 'impr' 0 ;
  237. *
  238. 'SI' ('>' impr 0) ;
  239. 'MESS' 'Mailleur topologique v1.1' ' -'
  240. ' Bugs and suggestions to Stephane Gounand CEA France' ;
  241. 'FINS' ;
  242. *
  243. * graph : logique indiquant si la procédure émet des tracés
  244. * (leur nombre dépend de impr)
  245. graph = MATOUTIL 'GASTIDX' tparam 'graph' faux ;
  246. *
  247. * id_cas : une chaine de caractères pour nommer le cas courant
  248. *
  249. idk = 'CHAI' 'topoini=' ('VALE' 'POINTEUR' topoini) ;
  250. idk = MATOUTIL 'GASTIDX' tparam 'id_cas' idk ;
  251. *
  252. * Nombre de boucle d'optimisation max
  253. *
  254. nboptim = MATOUTIL 'GASTIDX' tparam 'max_iter' 100 ;
  255. *
  256. * Sens de parcours des entités topologiques
  257. * isens = 0 (points, arêtes, faces, éléments)
  258. * isens = 1 sens inverse
  259. *
  260. isens = MATOUTIL 'GASTIDX' tparam 'sens' 0 ;
  261. *
  262. * Sort-on la sequence des maillages generes a l'indice 'seqm' de la table en sortie ?
  263. *
  264. iseqm = MATOUTIL 'GASTIDX' tparam 'sort_seqm' 0 ;
  265. *
  266. * Verifie-t-on la sequence des maillages generes ?
  267. *
  268. vseqm = MATOUTIL 'GASTIDX' tparam 'veri_seqm' 0 ;
  269. *
  270. * veri_opto : niveau de vérification effectué dans les opérateurs appelés
  271. * (OPTO ou TOPV) (entre 0 et 2 pour l'instant)
  272. *
  273. vopto = MATOUTIL 'GASTIDX' tparam 'veri_opto' 0 ;
  274. *
  275. * impr_opto : niveau d'impression dans les opérateurs appelés
  276. * (OPTO ou TOPV) (entre 0 et 2 pour l'instant)
  277. *
  278. iopto = MATOUTIL 'GASTIDX' tparam 'impr_opto' 0 ;
  279. *
  280. * isegadj : impression des ajustements de dimension des segments
  281. * effectués dans les opérateurs appelés (OPTO ou TOPV) (entre 0 et 1)
  282. *
  283. isegadj = MATOUTIL 'GASTIDX' tparam 'impr_segadj_opto' 0 ;
  284. *
  285. *
  286. * igibi = MATOUTIL 'GASTIDX' tparam 'type_implem' 0 ;
  287. *
  288. *
  289. * Table indiquant la stratégie de parcours des types de topologie
  290. * 1=points 2=aretes 3=triangles 4=tétras
  291. * Attention, on applique isens dessus. De plus les éléments de dimension
  292. * égale à celle de l'espace (surfaciques en 2D, volumiques en 3D) ne
  293. * seront parcourus que si on autorise l'ajout de noeuds.
  294. *
  295. vdim = 'VALE' 'DIME' ;
  296. tstrat = 'TABL' ;
  297. tstrat . 1 = 'LECT' 1 2 ;
  298. tstrat . 2 = 'LECT' 1 'PAS' 1 ('+' vdim 1) ;
  299. *
  300. tstrat = MATOUTIL 'GASTIDX' tparam 'strat_parcou_topo' tstrat ;
  301. * Verif
  302. 'SI' ('NON' ('EXIS' tstrat 1)) ;
  303. ch1 = 'CHAI' 'La table de stratégie de parcours na pas dindice 1' ;
  304. 'MESS' ch1 ;
  305. * Données incompatibles
  306. 'ERRE' 21 ;
  307. 'FINS' ;
  308. *
  309. 'SI' ('EGA' isens 1) ;
  310. istrat = 1 ;
  311. 'REPE' binv ;
  312. 'SI' ('EXIS' tstrat istrat) ;
  313. tstrat . istrat = INVELIST (tstrat . istrat) ;
  314. istrat = istrat '+' 1 ;
  315. 'SINO' ;
  316. 'QUIT' binv ;
  317. 'FINS' ;
  318. 'FIN' binv ;
  319. 'FINS' ;
  320. *
  321. * Nb de candidats max autour de chaque topologie parcourue
  322. *
  323. incma = MATOUTIL 'GASTIDX' tparam 'nb_cand_max' 1000 ;
  324. *
  325. * Stratégie à adopter si on dépasse le nombre de candidats max.
  326. * 0 : on saute le cas
  327. * 1 : on teste quelques candidats celui avec un noeud à la moitié
  328. * du max. et avec le noeud milieu si possible
  329. * 2 : on sélectionne un nombre de candidats égal à incma^2 /
  330. * nb points du bord
  331. istma = MATOUTIL 'GASTIDX' tparam 'strat_cand_max' 0 ;
  332. *
  333. * Tentative de stratégie rapide
  334. *
  335. lfast = MATOUTIL 'GASTIDX' tparam 'strat_fast' faux ;
  336. *
  337. * Tests sur la topologie initiale et correction éventuelle
  338. *
  339. lokdeb = vrai ;
  340. * Type de job et type d'éléments du maillage
  341. 'SI' ('NON' ('EXIS' ('LECT' 2 3) vdim)) ;
  342. * 709 2
  343. *Fonction indisponible en dimension %i1.
  344. 'ERRE' 709 'AVEC' vdim ;
  345. 'FINS' ;
  346. *
  347. 'SI' ('EGA' vdim 2) ;
  348. typlici1 = 'MOTS' 'SEG2' 'TRI3' ;
  349. typlici2 = 'MOTS' 'SEG3' 'TRI6' ;
  350. 'FINS' ;
  351. 'SI' ('EGA' vdim 3) ;
  352. typlici1 = 'MOTS' 'TRI3' 'TET4' ;
  353. typlici2 = 'MOTS' 'TRI6' 'TE10' ;
  354. 'FINS' ;
  355. *
  356. ltini = 'ELEM' topoini 'TYPE' ;
  357. dltini = 'DIME' ltini ;
  358. 'SI' ('NEG' dltini 1) ;
  359. 'SI' ('EGA' dltini 0) ;
  360. *1027 2
  361. *Une donnee de type %M1:8 est vide
  362. 'ERRE' 1027 'AVEC' 'MAILLAGE' ;
  363. 'SINO' ;
  364. * 132 2
  365. *On veut un objet %m1:8 elementaire
  366. 'ERRE' 132 'AVEC' 'MAILLAGE' ;
  367. 'FINS' ;
  368. 'FINS' ;
  369. typel = 'EXTR' ltini 1 ;
  370. *'SI' ('EGA' ijob 2) ;
  371. 'SI' ('EGA' ialgo 1) ;
  372. typlici1 = 'EXTR' typlici1 ('LECT' ('DIME' typlici1)) ;
  373. typlici2 = 'EXTR' typlici2 ('LECT' ('DIME' typlici2)) ;
  374. lvol = vrai ;
  375. 'FINS' ;
  376. *
  377. 'SI' ('NON' ('EXIS' (typlici1 'ET' typlici2) typel)) ;
  378. * 926 2
  379. *Le type d'element fini %m1:8 ne convient pas.
  380. 'ERRE' 926 'AVEC' ('CHAI' typel ' ') ;
  381. 'FINS' ;
  382. *
  383. 'SI' ('EGA' ialgo 0) ;
  384. lvol = 'OU' ('EGA' typel ('EXTR' typlici1 ('DIME' typlici1)))
  385. ('EGA' typel ('EXTR' typlici2 ('DIME' typlici2))) ;
  386. 'FINS' ;
  387. *
  388. lquad = 'EXIS' typlici2 typel ;
  389. 'SI' lquad ;
  390. topoinq = topoini ;
  391. topoini = 'CHAN' 'LINE' topoinq ;
  392. 'SI' lmbnc ;
  393. mbncq = mbnc ;
  394. mbnc = 'CHAN' 'LINE' mbncq ;
  395. 'FINS' ;
  396. 'FINS' ;
  397. *
  398. 'SI' ('NON' lvol) ;
  399. borini = topoini ;
  400. noini = 'POIN' borini 'INITIAL' ;
  401. topoini = 'COUT' noini borini ;
  402. 'SINO' ;
  403. borini = MATOUTIL 'BORD' topoini ;
  404. 'FINS' ;
  405. 'SI' ('EGA' iseqm 1) ;
  406. seqtopo = 'ENUM' topoini ;
  407. 'FINS' ;
  408. *
  409. * Orientation
  410. *
  411. txt = 'CHAI' '!!! Topologie initiale :' ;
  412. 'SI' ('EGA' ialgo 1) ;
  413. topoino = 'ORIE' topoini ;
  414. pointr1 pointr2 = 'VALEUR' 'POINTEUR' topoino topoini ;
  415. 'SI' ('NEG' pointr1 pointr2) ;
  416. 'MESS' txt ' Changement orientation elements '
  417. 'pour le cas' ' ' idk ;
  418. lokdeb = lokdeb 'ET' faux ;
  419. 'FINS' ;
  420. 'FINS' ;
  421. *
  422. * Le bord doit être connexe pour la génération de maillage
  423. * Pas nécessairement pour l'optimisation de maillage
  424. *
  425. 'SI' ('EGA' ialgo 0) ;
  426. tcini = 'PART' 'CONN' borini ;
  427. lmc = 'EXIS' tcini 2 ;
  428. 'SI' lmc ;
  429. 'MESS' txt ' bord non connexe' ;
  430. lokdeb = lokdeb 'ET' faux ;
  431. 'FINS' ;
  432. 'FINS' ;
  433. *
  434. * mbnc : partie du bord ne devant pas changer
  435. * mbnc = bord si on est dans le cas TRIA (ialgo = 0)
  436. * S'il n'a pas été donné explicitement dans le cas REMA (ialgo
  437. * =1), on met la valeur par défaut :
  438. * mbnc = vide
  439. * Il faut que DIFF gère ce cas
  440. * et que ETOILE soit correct
  441. *
  442. 'SI' ('NON' lmbnc) ;
  443. 'SI' ('NON' lvirt) ;
  444. mbnc = borini ;
  445. 'SINO' ;
  446. lelem = 'MOTS' 'POI1' 'SEG2' 'TRI3' 'TET4' ;
  447. dimtopo = DEADUTIL 'DIMM' topoini ;
  448. dimbord = dimtopo '-' ialgo ;
  449. telemb = 'EXTR' lelem dimbord ;
  450. mbnc = 'VIDE' 'MAILLAGE'/telemb ;
  451. 'FINS' ;
  452. 'SINO' ;
  453. * 2020/05/02 : si le maillage à ne pas modifier est le bord, on peut
  454. * enlever le noeud virtuel
  455. mbc = 'DIFF' borini mbnc ;
  456. 'SI' ('EGA' ('NBEL' mbc) 0) ;
  457. lvirt = faux ;
  458. 'FINS' ;
  459. 'FINS' ;
  460. * Vérification que mbnc est inclus dans le bord
  461. * Est-ce nécessaire ? L'algorithme ne pourrait-il pas marcher
  462. * si mbnc est composé de bords internes. C'est à regarder mais
  463. * CONT et ENVE doivent alors gérer ces cas.
  464.  
  465. lokti = MATOUTIL 'VERITOPO' topoini txt mbnc ;
  466. lokdeb = lokdeb 'ET' lokti ;
  467. *
  468. * Précisions relatives sur les volumes et les qualités des éléments.
  469. * Attention à ces valeurs, elles peuvent changer les maillages obtenus
  470. * assez facilement.
  471. *
  472. precrelv = MATOUTIL 'GASTIDX' tparam 'precrel_volume' 1.d-11 ;
  473. precrelq = MATOUTIL 'GASTIDX' tparam 'precrel_qualite' 1.d-2 ;
  474. *
  475. * Ceci doit apparaître après les dernières modifications de tparam
  476. *
  477. 'SI' ('>EG' impr 2) ;
  478. 'MESS' 'Parametres utilises :' ;
  479. 'LIST' tparam ;
  480. 'FINS' ;
  481. * Vérification des indices de la table en entrée
  482. tindok = MATOUTIL 'GENTABIN' 'impr' 'graph' 'id_cas'
  483. 'max_iter' 'sens' 'sort_seqm' 'veri_seqm' 'veri_opto' 'impr_opto' 'impr_segadj_opto'
  484. 'strat_parcou_topo' 'nb_cand_max' 'strat_cand_max' 'strat_fast' ;
  485. tindok = MATOUTIL 'GENTABIN' tindok 'precrel_volume'
  486. 'precrel_qualite' 'ipol_met' 'bary_topo' 'parcou_topo' ;
  487. MATOUTIL 'VERTABIN' tparam tindok ;
  488. *
  489. * Algorithme d'amélioration du maillage
  490. *
  491. volucib = MATOUTIL 'MESUINTE' borini ;
  492. volutol = '*' volucib precrelv ;
  493. 'SI' ('>EG' impr 1) ;
  494. 'MESSAGE' ('CHAINE' 'Volume cible=' volucib ' tolerance=' volutol) ;
  495. 'SI' graph ;
  496. tit = 'CHAI' idk ' Topologie initiale' ;
  497. 'TRAC' 'CACH' topoini 'TITR' tit ;
  498. 'FINS' ;
  499. 'FINSI' ;
  500.  
  501. * Qualités
  502. 'SI' ('>' impr 0) ;
  503. dvol nctelem nnul nctno miq maq meq =
  504. MATOUTIL 'AFFQUAL' topoini volucib volutol 'REST' 'VMET' metva momet ;
  505. 'SINO' ;
  506. dvol nctelem nnul nctno miq maq meq =
  507. MATOUTIL 'AFFQUAL' topoini volucib volutol 'REST' 'VMET' metva momet 'NAFF' ;
  508. 'FINS' ;
  509. *
  510. * Tests sur la topologie initiale (éventuellement corrigée de
  511. * l'orientation et des éléments uniques)
  512. *
  513. 'SI' ('EGA' ialgo 1) ;
  514. 'SI' ('NEG' dvol 0. volutol) ;
  515. 'MESSAGE' txt ' Dvol non nul pour le cas' ' ' idk ;
  516. lokdeb = lokdeb 'ET' faux ;
  517. 'FINS' ;
  518. 'FINS' ;
  519. 'SI' ('<' ('+' dvol volutol) 0.) ;
  520. 'MESSAGE' txt ' Dvol negative pour le cas' ' ' idk ;
  521. lokdeb = lokdeb 'ET' faux ;
  522. 'FINSI' ;
  523. 'SI' ('NON' lokdeb) ;
  524. * 845 2
  525. *Maillage donne incorrect ?!!!
  526. 'ERRE' 845 ;
  527. 'FINS' ;
  528. *
  529. *'SI' lvirt ;
  530. * 'SI' ('EGA' vdim 2) ; pdep = 0.1 0.05 ; 'FINS' ;
  531. * 'SI' ('EGA' vdim 3) ; pdep = 0.1 0.05 0.066 ; 'FINS' ;
  532. * pzero = 'PLUS' ('BARYCENTRE' borini) pdep ;
  533. * mpzero = 'MANU' 'POI1' pzero ;
  534. *'SINO' ;
  535. * pzero = 0 ;
  536. * mpzero = 'VIDE' 'MAILLAGE'/'POI1' ;
  537. *'FINSI' ;
  538. *
  539. curtopo = topoini ;
  540. * Statistiques
  541. * nnascm : nombre d'appels de la stratégie de limitation
  542. * du nombre de candidats
  543. * nparcou : nombre de topologies parcourues
  544. * nexplor : nombre de topologies explorées
  545. * nchange : nombre de topologies changées
  546. nnascm = 0 ; nparcou = 0 ; nexplor = 0 ; nchange = 0 ;
  547. oldtopo = curtopo ;
  548. *
  549. * Boucle d'optimisation
  550. *
  551. istrat = 1 ; lstrat0 = 'LECT' ;
  552. 'SI' lfast ; tfast = 'TABL' ; 'FINS' ;
  553. *
  554. 'REPETER' boptim nboptim ;
  555. *tst 'REPETER' boptim 1 ;
  556. lokloc = vrai ;
  557. 'SI' ('EXIS' tstrat istrat) ;
  558. ltyptop = tstrat . istrat ;
  559. 'SINO' ;
  560. 'QUIT' boptim ;
  561. 'FINS' ;
  562. *dbg 'MESS' ('CHAI' 'istrat=' istrat ' ltyptop=') ;
  563. *dbg 'LIST' ltyptop ;
  564. ntyptop ='DIME' ltyptop ;
  565. *
  566. tchange = 0 ;
  567. 'REPE' typtop ntyptop ;
  568. iar = 'EXTR' ltyptop &typtop ;
  569. not1 = 'ET' ('EGA' iajno 0) ('EGA' iar ('+' vdim 1)) ;
  570. not2 = 'EXIS' lstrat0 iar ;
  571. *dbg 'MESS' ('CHAI' 'iar=' iar ' iajno=' iajno ' vdim=' vdim
  572. *dbg ' not1=' not1 ' not2=' not2) ;
  573. *dbg 'MESS' 'lstrat0' ; 'LIST' lstrat0 ;
  574. 'SI' ('NON' ('OU' not1 not2)) ;
  575. 'SI' lfast ;
  576. 'SI' ('EXIS' tfast iar) ;
  577. pretopo = tfast . iar ;
  578. elecom = 'INTE' pretopo curtopo ;
  579. eledifc = 'DIFF' curtopo elecom ;
  580. ncurtopo = 'NBEL' curtopo ;
  581. nelecom = 'NBEL' elecom ;
  582. neledifc = 'NBEL' eledifc ;
  583. * naparcav = 'NBEL' aparc ;
  584. * aparc = 'ELEM' aparc 'APPUYE' 'LARGEMENT' eledifc ;
  585. * naparcap = 'NBEL' aparc ;
  586. curtopor = 'ELEM' curtopo 'APPUYE' 'LARGEMENT' eledifc ;
  587. ncurr = 'NBEL' curtopor ;
  588. * ch = 'CHAI' 'Acceleration : maillage (' neledifc ' / '
  589. ch = 'CHAI' 'Acceleration : maillage (' ncurr ' / '
  590. ncurtopo ') ' ;
  591. * iar ' (' naparcap ' / ' naparcav ')' ;
  592. 'MESS' ch ;
  593. * AFFVAR 'ncurtopo' 'nelecom'
  594. * 'neledifc' 'naparcav' 'naparcap' ;
  595. 'SINO' ;
  596. 'MESS' 'Pas dacceleration' ;
  597. curtopor = curtopo ;
  598. 'FINS' ;
  599. tfast . iar = curtopo ;
  600. 'SINO' ;
  601. 'SI' ('EXIS' tparam 'parcou_topo') ;
  602. curtopor = tparam . 'parcou_topo' ;
  603. 'SINO' ;
  604. curtopor = curtopo ;
  605. 'FINS' ;
  606. 'FINS' ;
  607. 'SI' ('EGA' iar 1) ;
  608. aparc = 'CHANGER' curtopor 'POI1' ;
  609. motar = 'points' ;
  610. 'FINS' ;
  611. 'SI' ('EGA' iar 2) ;
  612. aparc = 'CHANGER' curtopor 'LIGN' ;
  613. motar = 'aretes' ;
  614. 'FINSI' ;
  615. 'SI' ('EGA' iar 3) ;
  616. aparc = 'CHAN' curtopor 'SURF' ;
  617. motar = 'triangles' ;
  618. 'FINSI' ;
  619. 'SI' ('EGA' iar 4) ;
  620. aparc = curtopor ;
  621. motar = 'tetras' ;
  622. 'FINSI' ;
  623. titec = 'CHAINE' 'bop=' &boptim ' ' motar ;
  624. * trr = ('EGA' ikas 34) 'ET' ('EGA' &boptim 2) 'ET' ('EGA' iar 2) ;
  625. * trr = ('EGA' ikas 35) 'ET' ('EGA' &boptim 1) 'ET' ('EGA' iar 3) ;
  626. * trr = ('EGA' &boptim 3) 'ET' ('EGA' iar 1) ;
  627. * 'SI' trr ; impr = 4 ; 'SINO' ; impr = 2 ; 'FINS' ;
  628. inascm = 0 ; iparcou = 0 ; iexplor = 0 ; ichange = 0 ;
  629. nparc = 'NBEL' aparc ;
  630. 'SI' ('>EG' impr 2) ;
  631. titt = 'CHAINE' titec ' nel=' nparc ;
  632. 'MESSAGE' titt ;
  633. 'FINS' ;
  634. 'SI' lvirt ;
  635. * curtopof = MATOUTIL 'FERMEPZ' curtopo mbnc pzero ;
  636. curtopof mpzero = MATOUTIL 'FERMEPZ' curtopo mbnc ;
  637. 'SINON' ;
  638. curtopof = curtopo ;
  639. mpzero = 'VIDE' 'MAILLAGE'/'POI1' ;
  640. 'FINSI' ;
  641. ch = 'CHAI' titec ' Topologie de depart' ;
  642. 'SI' ('>EG' impr 3) ;
  643. 'MESSAGE' ('CHAI' ch ' :') ;
  644. 'LISTE' curtopof ;
  645. 'SI' graph ;
  646. 'TRACER' 'CACH' curtopo 'NOEUD' 'TITR' ch ;
  647. 'FINS' ;
  648. 'FINS' ;
  649. newtopo = curtopo ; newtopof = curtopof ;
  650. metvan = metva ;
  651. jnascm = 0 ; jparcou = 0 ; jexplor = 0 ; jchange = 0 ;
  652.  
  653. ltopinf newtopof metvan kexplor kchange kparcou knascm = 'OPTO' newtopof aparc metvan
  654. 'VTOL' volutol 'QTOL' precrelq
  655. 'ALGO' ialgo 'AJNO' iajno
  656. 'VIRT' mpzero
  657. 'NCMA' incma 'STMA' istma
  658. 'VERI' vopto 'SGAJ' isegadj 'IMPR' iopto
  659. 'MOYE' imomet 'BARY' imobary 'SEQM' iseqm ;
  660. jexplor = jexplor '+' kexplor ;
  661. jchange = jchange '+' kchange ;
  662. jparcou = jparcou '+' kparcou ;
  663. jnascm = jnascm '+' knascm ;
  664. *
  665. inascm = '+' inascm jnascm ; nnascm = '+' nnascm jnascm ;
  666. iparcou = '+' iparcou jparcou ; nparcou = '+' nparcou jparcou ;
  667. iexplor = '+' iexplor jexplor ; nexplor = '+' nexplor jexplor ;
  668. ichange = '+' ichange jchange ; nchange = '+' nchange jchange ;
  669. 'SI' lvirt ;
  670. newtopo = MATOUTIL 'OUVREPZ' newtopof mpzero ;
  671. ltopin = MATOUTIL 'OUVREPZ' ltopinf mpzero ;
  672. 'SINON' ;
  673. newtopo = newtopof ;
  674. ltopin = ltopinf ;
  675. 'FINSI' ;
  676. * Verif ltopinf
  677. 'SI' ('OU' ('EGA' iseqm 1) ('EGA' vseqm 1)) ;
  678. dim3 = 'DIME' ltopin ;
  679. dim = dim3 '/' 3 ;
  680. 'SI' ('NEG' ('*' dim 3) dim3) ;
  681. 'ERRE' 'Dimension liste maillage non divisible par 3' ;
  682. 'FINS' ;
  683. 'SI' ('EGA' iseqm 1) ;
  684. seqtopo = seqtopo 'ET' ltopin ;
  685. 'FINS' ;
  686. 'SI' ('EGA' vseqm 1) ;
  687. newtop2 = curtopo ;
  688. iim3 = 0 ;
  689. lokl = vrai ;
  690. 'REPE' iiim dim ;
  691. iim3 = '+' iim3 1 ;
  692. lmi = 'EXTR' ltopin iim3 ;
  693. iim3 = '+' iim3 1 ;
  694. topoavi = 'EXTR' ltopin iim3 ;
  695. newtop21 = 'DIFF' newtop2 topoavi ;
  696. iim3 = '+' iim3 1 ;
  697. topoapi = 'EXTR' ltopin iim3 ;
  698. newtop22 = newtop21 'ET' topoapi ;
  699. 'SI' ('NON' lokl) ;
  700. 'MESS' 'Changement' ' ' &iiim ' / ' dim ;
  701. 'FINS' ;
  702. txt = 'CHAI' '!!! Topologie' ' ' &iiim ' :' ;
  703. 'SI' ('EGA' ialgo 1) ;
  704. loki = MATOUTIL 'VERITOPO' newtop22 volucib volutol txt mbnc ;
  705. 'SINO' ;
  706. loki = MATOUTIL 'VERITOPO' newtop22 txt mbnc ;
  707. 'FINS' ;
  708. lokl = lokl 'ET' loki ;
  709. 'SI' ('OU' ('NON' loki) ('>EG' impr 3)) ;
  710. ch = 'CHAI' txt ' avant' ;
  711. 'TRAC' (newtop21 'ET' ('COUL' 'VERT' topoavi)) 'TITR' ch ;
  712. ch = 'CHAI' txt ' apres' ;
  713. 'TRAC' (newtop21 'ET' ('COUL' 'ROUG' topoapi)) 'TITR' ch ;
  714. * Nouvel appel avec full impression
  715. 'SI' ('NON' loki) ;
  716. ltopinf2 newtopof2 metva2 kexplor2 kchange2 kparcou2 knascm2 = 'OPTO' newtop2 lmi (metva 'ET' metvan)
  717. 'VTOL' volutol 'QTOL' precrelq
  718. 'ALGO' ialgo 'AJNO' iajno
  719. 'VIRT' mpzero
  720. 'NCMA' incma 'STMA' istma
  721. 'VERI' 10 'SGAJ' 1 'IMPR' 4
  722. 'MOYE' imomet 'BARY' imobary 'SEQM' iseqm ;
  723. 'ERRE' stop ;
  724. 'FINS' ;
  725. 'FINS' ;
  726. newtop2 = newtop22 ;
  727. 'FIN' iiim ;
  728. dtopo = 'DIFF' newtopo newtop2 ;
  729. 'SI' ('NEG' ('NBEL' dtopo) 0) ;
  730. 'ERRE' 'Newtop2 et newtopo pas identiques' ;
  731. 'FINS' ;
  732. 'FINS' ;
  733. 'FINS' ;
  734. curtopo = newtopo ;
  735. metva = metvan ;
  736. tparam . 'curtopo' = curtopo ;
  737. * Verifs
  738. txt = 'CHAI' '!!! Topologie courante :' ;
  739. 'SI' ('EGA' ialgo 1) ;
  740. lokt = MATOUTIL 'VERITOPO' curtopo volucib volutol txt mbnc ;
  741. 'SINO' ;
  742. lokt = MATOUTIL 'VERITOPO' curtopo txt mbnc ;
  743. 'FINS' ;
  744. lokloc = lokloc 'ET' lokt ;
  745. *
  746. 'SI' ('>EG' impr 2) ;
  747. titt = 'CHAINE' 'bop=' &boptim ' ' motar
  748. ' Topologie: parcourues=' iparcou
  749. ' examinees=' iexplor
  750. ' changees=' ichange ' limit_cand=' inascm ;
  751. 'MESSAGE' titt ;
  752. MATOUTIL 'AFFQUAL' curtopo volucib volutol 'VMET' metva momet ;
  753. 'SAUTER' 1 'LIGNE' ;
  754. * AFFCAND ne marche que s'il n'y a pas delements en double...
  755. 'SI' (graph 'ET' lokt) ;
  756. tit = 'CHAINE' 'bop=' &boptim ' '
  757. motar ' Topologie obtenue' ;
  758. MATOUTIL 'AFFCAND' curtopo 'QUAL' 'VMET' metva momet
  759. 'TITR' tit ;
  760. 'FINS' ;
  761. 'FINSI' ;
  762. * kchange = '+' kchange ichange ;
  763. oldtopo = curtopo ;
  764. 'SINO' ;
  765. ichange = 0 ;
  766. 'FINS' ;
  767. tchange = tchange '+' ichange ;
  768. 'SI' ('EGA' ichange 0) ;
  769. 'SI' ('NON' ('EXIS' lstrat0 iar)) ;
  770. lstrat0 = lstrat0 'ET' iar ;
  771. 'FINS' ;
  772. 'SINO' ;
  773. lstrat0 = 'LECT' ;
  774. 'FINS' ;
  775. * 'SI' trr ; 'QUIT' boptim ; 'FINS' ;
  776. 'SI' ('NON' lokloc) ; 'QUIT' typtop ; 'FINS' ;
  777. 'FIN' typtop ;
  778. 'SI' ('EGA' tchange 0) ;
  779. istrat = '+' istrat 1 ;
  780. 'SINO' ;
  781. istrat = 1 ;
  782. 'FINS' ;
  783. 'SI' ('NON' lokloc) ; 'QUIT' boptim ; 'FINS' ;
  784. 'FIN' boptim ;
  785. *
  786. * Tests et fin de la boucle
  787. *
  788. *lokfin = lokloc ;
  789. lokfin = vrai ;
  790. * Verifs
  791. txt = 'CHAI' '!!! Topologie finale :' ;
  792. 'SI' ('EGA' ialgo 1) ;
  793. loktf = MATOUTIL 'VERITOPO' curtopo volucib volutol txt mbnc ;
  794. 'SINO' ;
  795. loktf = MATOUTIL 'VERITOPO' curtopo txt mbnc ;
  796. 'FINS' ;
  797. lokfin = lokfin 'ET' loktf ;
  798. * Qualités
  799. dvol nctelem nnul nctno miq maq meq =
  800. MATOUTIL 'AFFQUAL' curtopo volucib volutol 'REST' 'NAFF'
  801. 'VMET' metva momet ;
  802. 'SI' ('NEG' nnul 0) ;
  803. 'MESS' txt ' Elements de volume nul pour le cas' ' ' idk ;
  804. lokfin = lokfin 'ET' faux ;
  805. 'FINS' ;
  806. 'SI' ('NEG' dvol 0. volutol) ;
  807. 'MESSAGE' txt ' Non cvg sur le volume pour le cas' ' ' idk ;
  808. 'MESSAGE' ('CHAI' 'dvol=' dvol ' volutol=' volutol) ;
  809. * 'SI' ('NON' ('ET' ('EGA' ialgo 0) ('EGA' iajno 0))) ;
  810. lokfin = lokfin 'ET' faux ;
  811. * 'FINS' ;
  812. 'FINS' ;
  813. *
  814. 'SI' ('>EG' impr 1) ;
  815. titt = 'CHAINE' idk ' Total:' ' '
  816. 'Topologie: parcourues=' nparcou
  817. ' examinees=' nexplor
  818. ' changees=' nchange ' limit_cand=' nnascm ;
  819. 'MESSAGE' titt ;
  820. MATOUTIL 'AFFQUAL' curtopo volucib volutol 'VMET' metva momet ;
  821. 'SAUTER' 1 'LIGNE' ;
  822. 'SI' (graph) ;
  823. tit = 'CHAI' idk ' Topologie finale' ;
  824. 'SI' ('NON' lokfin) ;
  825. tit = 'CHAI' '!!!' ' ' tit ' ' 'SOUCI' ;
  826. 'FINS' ;
  827. 'TRAC' 'CACH' curtopo 'TITR' tit ;
  828. 'SI' loktf ;
  829. MATOUTIL 'AFFCAND' curtopo 'QUAL' 'VMET' metva momet
  830. 'TITR' tit ;
  831. 'FINS' ;
  832. 'FINS' ;
  833. 'FINS' ;
  834. 'SAUTER' 1 'LIGNE' ;
  835.  
  836.  
  837. 'SI' lquad ;
  838. curtopq = 'CHAN' 'QUAD' curtopo topoinq ;
  839. * 'SI' lmbnc ;
  840. * curtopq = 'CHAN' 'QUAD' curtopo mbncq ;
  841. * 'FINS' ;
  842. curtopo = curtopq ;
  843. 'FINS' ;
  844. *
  845. * Restitution de quelques informations
  846. *
  847. tparam . 'nnascm' = nnascm ;
  848. tparam . 'nparcou' = nparcou ;
  849. tparam . 'nexplor' = nexplor ;
  850. tparam . 'nchange' = nchange ;
  851. *
  852. tparam . 'dvol' = dvol ;
  853. tparam . 'nnul' = nnul ;
  854. tparam . 'miq' = miq ;
  855. tparam . 'maq' = maq ;
  856. tparam . 'meq' = meq ;
  857. *
  858. tparam . 'curtopo' = curtopo ;
  859. 'SI' ('EGA' iseqm 1) ;
  860. tparam . 'seqtopo' = seqtopo ;
  861. 'FINS' ;
  862. *
  863. 'RESP' curtopo ;
  864. 'SI' lipol ;
  865. 'RESP' metva ;
  866. 'FINS' ;
  867. *lourd 'RESPRO'tparam ;
  868. * 27 2
  869. *Erreur generation de maillage. Il est neanmoins cree pour contrôle
  870. 'SI' ('NON' lokfin) ;
  871. 'SOUC' 27 ;
  872. * 'ERRE' 27 ;
  873. 'FINSI' ;
  874. *
  875. * End of procedure file MAILTOPO
  876. *
  877. 'FINPROC' ;
  878.  
  879.  

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