Télécharger mailtopo.procedur

Retour à la liste

Numérotation des lignes :

  1. * MAILTOPO PROCEDUR GOUNAND 24/10/08 21:15:05 12025
  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. * ARIT : moyenne arithmétique pour l'interpolation de
  145. * métrique (imomet=0) par défaut
  146. * GEOM : moyenne géométrique pour l'interpolation de métrique
  147. * (en fait, log-euclidienne) (imomet=1)
  148. *
  149. lmotcle = 'MOTS' 'IPOL' 'AJNO' 'NOAJ' 'ARIT' 'GEOM' ;
  150. lipol = faux ;
  151. iajno = 1 ;
  152. imomet = 0 ;
  153. 'REPE' bmotcle ;
  154. 'ARGU' motcle/'MOT' ;
  155. 'SI' ('NON' ('EXIS' motcle)) ;
  156. 'QUIT' bmotcle ;
  157. 'SINO' ;
  158. * 'MESS' motcle ;
  159. 'SI' ('NON' ('EXIS' lmotcle motcle)) ;
  160. 'ERRE' 1052 'AVEC' motcle lmotcle ;
  161. 'FINS' ;
  162. 'SI' ('EGA' motcle 'IPOL') ;
  163. 'SI' ('EGA' tmetva 'CHPOINT') ;
  164. lipol = vrai ;
  165. 'SINO' ;
  166. 'ERRE' -370 'AVEC' motcle ;
  167. * 39 2
  168. *On ne veut pas d'objet de type %m1:8
  169. 'ERRE' 39 'AVEC' tmetva ;
  170. 'FINS' ;
  171. 'FINS' ;
  172. 'SI' ('EGA' motcle 'NOAJ') ; iajno = 0 ; 'FINS' ;
  173. 'SI' ('EGA' motcle 'AJNO') ; iajno = 1 ; 'FINS' ;
  174. 'SI' ('EGA' motcle 'ARIT') ; imomet = 0 ; 'FINS' ;
  175. 'SI' ('EGA' motcle 'GEOM') ; imomet = 1 ; 'FINS' ;
  176. 'FINS' ;
  177. 'FIN' bmotcle ;
  178. 'SI' ('ET' ('EGA' imomet 1) ('EGA' tmetva 'CHPOINT')) ;
  179. metva = 'TENS' 'LOG' metva ;
  180. 'FINS' ;
  181. *
  182. * Lecture mots-clefs valeur jusqu'à épuisement obligatoire ou non,
  183. * valeurs par défaut...
  184. *
  185. * Obligatoire
  186. *
  187. * DESCRIPTION : IJOB=0
  188. * Minimise le volume d'une topologie de maillage
  189. * en le maintenant supérieur à 0
  190. * IJOB=1
  191. * Minimise le volume, mais on a le droit d'ajouter des
  192. * noeuds internes
  193. * IJOB=2
  194. * La topologie de maillage est supposée être un maillage
  195. * On essaie de l'améliorer en conservant son volume
  196. * mais en augmentant sa qualité grace a l'adjonction
  197. * de noeuds internes
  198. *
  199. * 2017/11/30 : On remplace par ialgo (0 ou 1 : génération ou
  200. * optimisation de maillage) et iajno (autorise-t-on
  201. * l'algorithme à ajouter des noeuds.)
  202. * 2018/01/17 : On essaie de faire aller l'algorithme plus vite en ne
  203. * parcourant que les éléments touchant les différences
  204. * d'un cycle d'optimisation à l'autre
  205. * paramètre
  206. *
  207. * 2018/06/16 : On a ajouté un indice bord_no_chan et corrigé quelques
  208. * bugs dans son implémentation
  209. *
  210. *
  211. *
  212. *
  213. *ijob = tparam . 'job' ;
  214. *
  215. * Optionnel
  216. *
  217. 'ARGU' tparam/'TABLE' ;
  218. xtparam = 'EXIS' tparam ;
  219. 'SI' ('NON' xtparam) ;
  220. tparam = 'TABL' ;
  221. 'FINS' ;
  222. *
  223. * debug : niveau d'impression de la procédure
  224. *
  225. debug = MATOUTIL 'GASTIDX' tparam 'debug' 0 ;
  226. *
  227. 'SI' ('>' debug 0) ;
  228. 'MESS' 'Mailleur topologique v1.0beta' ' -'
  229. ' Bugs and suggestions to Stephane Gounand CEA France' ;
  230. 'FINS' ;
  231. *
  232. * graph : logique indiquant si la procédure émet des tracés
  233. * (leur nombre dépend de debug)
  234. graph = MATOUTIL 'GASTIDX' tparam 'graph' faux ;
  235. *
  236. * id_cas : une chaine de caractères pour nommer le cas courant
  237. *
  238. idk = 'CHAI' 'topoini=' ('VALE' 'POINTEUR' topoini) ;
  239. idk = MATOUTIL 'GASTIDX' tparam 'id_cas' idk ;
  240. *
  241. * Nombre de boucle d'optimisation max
  242. *
  243. nboptim = MATOUTIL 'GASTIDX' tparam 'max_iter' 100 ;
  244. *
  245. * Sens de parcours des entités topologiques
  246. * isens = 0 (points, arêtes, faces, éléments)
  247. * isens = 1 sens inverse
  248. *
  249. isens = MATOUTIL 'GASTIDX' tparam 'sens' 0 ;
  250. **
  251. ** impr : niveau d'impression des opérateurs appelés (OPTO ou TOPV)
  252. ** (entre 0 et 3 pour l'instant)
  253. **
  254. *impr = 0 ;
  255. *'SI' ('EXIS' tparam 'impr') ; impr = tparam . 'impr' ; 'FINS' ;
  256. *
  257. * verif : niveau de vérification effectué dans les opérateurs appelés
  258. * (OPTO ou TOPV) (entre 0 et 2 pour l'instant)
  259. *
  260. iveri = MATOUTIL 'GASTIDX' tparam 'verif' 0 ;
  261. *
  262. * isegadj : impression des ajustements de dimension des segments
  263. * effectués dans les opérateurs appelés (OPTO ou TOPV) (entre 0 et 1)
  264. *
  265. isegadj = MATOUTIL 'GASTIDX' tparam 'impr_segadj' 0 ;
  266. *
  267. *
  268. * igibi = MATOUTIL 'GASTIDX' tparam 'type_implem' 0 ;
  269. *
  270. *
  271. * Table indiquant la stratégie de parcours des types de topologie
  272. * 1=points 2=aretes 3=triangles 4=tétras
  273. * Attention, on applique isens dessus. De plus les éléments de dimension
  274. * égale à celle de l'espace (surfaciques en 2D, volumiques en 3D) ne
  275. * seront parcourus que si on autorise l'ajout de noeuds.
  276. *
  277. vdim = 'VALE' 'DIME' ;
  278. tstrat = 'TABL' ;
  279. tstrat . 1 = 'LECT' 1 2 ;
  280. tstrat . 2 = 'LECT' 1 'PAS' 1 ('+' vdim 1) ;
  281. *
  282. tstrat = MATOUTIL 'GASTIDX' tparam 'strat_parcou_topo' tstrat ;
  283. * Verif
  284. 'SI' ('NON' ('EXIS' tstrat 1)) ;
  285. ch1 = 'CHAI' 'La table de stratégie de parcours na pas dindice 1' ;
  286. 'MESS' ch1 ;
  287. * Données incompatibles
  288. 'ERRE' 21 ;
  289. 'FINS' ;
  290. *
  291. 'SI' ('EGA' isens 1) ;
  292. istrat = 1 ;
  293. 'REPE' binv ;
  294. 'SI' ('EXIS' tstrat istrat) ;
  295. tstrat . istrat = INVELIST (tstrat . istrat) ;
  296. istrat = istrat '+' 1 ;
  297. 'SINO' ;
  298. 'QUIT' binv ;
  299. 'FINS' ;
  300. 'FIN' binv ;
  301. 'FINS' ;
  302. *
  303. * Nb de candidats max autour de chaque topologie parcourue
  304. *
  305. incma = MATOUTIL 'GASTIDX' tparam 'nb_cand_max' 1000 ;
  306. *
  307. * Stratégie à adopter si on dépasse le nombre de candidats max.
  308. * 0 : on saute le cas
  309. * 1 : on teste quelques candidats celui avec un noeud à la moitié
  310. * du max. et avec le noeud milieu si possible
  311. * 2 : on sélectionne un nombre de candidats égal à incma^2 /
  312. * nb points du bord
  313. istma = MATOUTIL 'GASTIDX' tparam 'strat_cand_max' 0 ;
  314. *
  315. * Tentative de stratégie rapide
  316. *
  317. lfast = MATOUTIL 'GASTIDX' tparam 'strat_fast' faux ;
  318. *
  319. * Tests sur la topologie initiale et correction éventuelle
  320. *
  321. lok = vrai ;
  322. * Type de job et type d'éléments du maillage
  323. 'SI' ('NON' ('EXIS' ('LECT' 2 3) vdim)) ;
  324. * 709 2
  325. *Fonction indisponible en dimension %i1.
  326. 'ERRE' 709 'AVEC' vdim ;
  327. 'FINS' ;
  328. *
  329. 'SI' ('EGA' vdim 2) ;
  330. typlici1 = 'MOTS' 'SEG2' 'TRI3' ;
  331. typlici2 = 'MOTS' 'SEG3' 'TRI6' ;
  332. 'FINS' ;
  333. 'SI' ('EGA' vdim 3) ;
  334. typlici1 = 'MOTS' 'TRI3' 'TET4' ;
  335. typlici2 = 'MOTS' 'TRI6' 'TE10' ;
  336. 'FINS' ;
  337. *
  338. ltini = 'ELEM' topoini 'TYPE' ;
  339. dltini = 'DIME' ltini ;
  340. 'SI' ('NEG' dltini 1) ;
  341. 'SI' ('EGA' dltini 0) ;
  342. *1027 2
  343. *Une donnee de type %M1:8 est vide
  344. 'ERRE' 1027 'AVEC' 'MAILLAGE' ;
  345. 'SINO' ;
  346. * 132 2
  347. *On veut un objet %m1:8 elementaire
  348. 'ERRE' 132 'AVEC' 'MAILLAGE' ;
  349. 'FINS' ;
  350. 'FINS' ;
  351. typel = 'EXTR' ltini 1 ;
  352. *'SI' ('EGA' ijob 2) ;
  353. 'SI' ('EGA' ialgo 1) ;
  354. typlici1 = 'EXTR' typlici1 ('LECT' ('DIME' typlici1)) ;
  355. typlici2 = 'EXTR' typlici2 ('LECT' ('DIME' typlici2)) ;
  356. lvol = vrai ;
  357. 'FINS' ;
  358. *
  359. 'SI' ('NON' ('EXIS' (typlici1 'ET' typlici2) typel)) ;
  360. * 926 2
  361. *Le type d'element fini %m1:8 ne convient pas.
  362. 'ERRE' 926 'AVEC' ('CHAI' typel ' ') ;
  363. 'FINS' ;
  364. *
  365. 'SI' ('EGA' ialgo 0) ;
  366. lvol = 'OU' ('EGA' typel ('EXTR' typlici1 ('DIME' typlici1)))
  367. ('EGA' typel ('EXTR' typlici2 ('DIME' typlici2))) ;
  368. 'FINS' ;
  369. *
  370. lquad = 'EXIS' typlici2 typel ;
  371. 'SI' lquad ;
  372. topoinq = topoini ;
  373. topoini = 'CHAN' 'LINE' topoinq ;
  374. 'SI' lmbnc ;
  375. mbncq = mbnc ;
  376. mbnc = 'CHAN' 'LINE' mbncq ;
  377. 'FINS' ;
  378. 'FINS' ;
  379. *
  380. 'SI' ('NON' lvol) ;
  381. borini = topoini ;
  382. noini = 'POIN' borini 'INITIAL' ;
  383. topoini = 'COUT' noini borini ;
  384. 'SINO' ;
  385. borini = MATOUTIL 'BORD' topoini ;
  386. 'FINS' ;
  387. *
  388. * mbnc : partie du bord ne devant pas changer
  389. * mbnc = bord si on est dans le cas TRIA (ialgo = 0)
  390. * S'il n'a pas été donné explicitement dans le cas REMA (ialgo
  391. * =1), on met la valeur par défaut :
  392. * mbnc = vide
  393. * Il faut que DIFF gère ce cas
  394. * et que ETOILE soit correct
  395. *
  396. 'SI' ('NON' lmbnc) ;
  397. 'SI' ('NON' lvirt) ;
  398. mbnc = borini ;
  399. 'SINO' ;
  400. lelem = 'MOTS' 'POI1' 'SEG2' 'TRI3' 'TET4' ;
  401. dimtopo = DEADUTIL 'DIMM' topoini ;
  402. dimbord = dimtopo '-' ialgo ;
  403. telemb = 'EXTR' lelem dimbord ;
  404. mbnc = 'VIDE' 'MAILLAGE'/telemb ;
  405. 'FINS' ;
  406. 'SINO' ;
  407. * 2020/05/02 : si le maillage à ne pas modifier est le bord, on peut
  408. * enlever le noeud virtuel
  409. 'SI' ('EGA' ('NBEL' ('DIFF' borini mbnc)) 0) ;
  410. lvirt = faux ;
  411. 'FINS' ;
  412. 'FINS' ;
  413. * Vérification que mbnc est inclus dans le bord
  414. * Est-ce nécessaire ? L'algorithme ne pourrait-il pas marcher
  415. * si mbnc est composé de bords internes. C'est à regarder mais
  416. * CONT et ENVE doivent alors gérer ces cas.
  417. mi = 'INTE' mbnc borini 'NOVERIF' ;
  418. * 'SI' ('NON' (EGAMAIL mi mbnc)) ;
  419. 'SI' ('NEG' ('NBEL' ('DIFF' mi mbnc)) 0) ;
  420. cherr = 'CHAI' 'bord_no_chan non inclus dans le bord' ;
  421. 'ERRE' cherr ;
  422. 'FINS' ;
  423. *'FINS' ;
  424. *
  425. * Précisions relatives sur les volumes et les qualités des éléments.
  426. * Attention à ces valeurs, elles peuvent changer les maillages obtenus
  427. * assez facilement.
  428. *
  429. precrelv = MATOUTIL 'GASTIDX' tparam 'precrel_volume' 1.d-11 ;
  430. precrelq = MATOUTIL 'GASTIDX' tparam 'precrel_qualite' 1.d-2 ;
  431. *
  432. * Ceci doit apparaître après les dernières modifications de tparam
  433. *
  434. 'SI' ('>EG' debug 2) ;
  435. 'MESS' 'Parametres utilises :' ;
  436. 'LIST' tparam ;
  437. 'FINS' ;
  438. * Vérification des indices de la table en entrée
  439. tindok = MATOUTIL 'GENTABIN' 'debug' 'graph' 'id_cas'
  440. 'max_iter' 'sens' 'verif' 'impr_segadj'
  441. 'strat_parcou_topo' 'nb_cand_max' 'strat_cand_max' 'strat_fast' ;
  442. tindok = MATOUTIL 'GENTABIN' tindok 'precrel_volume'
  443. 'precrel_qualite' ;
  444. MATOUTIL 'VERTABIN' tparam tindok ;
  445. *
  446. * Orientation
  447. *
  448. *'SI' ('EGA' ijob 2) ;
  449. 'SI' ('EGA' ialgo 1) ;
  450. topoino = 'ORIE' topoini ;
  451. pointr1 pointr2 = 'VALEUR' 'POINTEUR' topoino topoini ;
  452. 'SI' ('NEG' pointr1 pointr2) ;
  453. 'MESS' '!!! Topologie initiale : changement orientation elements '
  454. 'pour le cas' ' ' idk ;
  455. lok = lok 'ET' faux ;
  456. 'FINS' ;
  457. 'FINS' ;
  458. topoinu = 'UNIQ' topoini ;
  459. dnode = '-' ('NBEL' topoini) ('NBEL' topoinu) ;
  460. 'SI' ('NEG' dnode 0) ;
  461. 'MESSAGE' '!!! Topologie initiale :' ' ' dnode
  462. ' elements en double pour le cas' ' ' idk ;
  463. 'SI' ('EGA' ialgo 1) ;
  464. lok = lok 'ET' faux ;
  465. 'FINS' ;
  466. * 'SI' ('NEG' ijob 2) ;
  467. * 'FINS' ;
  468. 'FINS' ;
  469. *
  470. * Le bord doit être connexe pour la génération de maillage
  471. * Pas nécessairement pour l'optimisation de maillage
  472. *
  473. tcini = 'PART' 'CONN' borini ;
  474. lmc = 'EXIS' tcini 2 ;
  475. *'SI' ('ET' ('<' ijob 2) lmc) ;
  476. 'SI' ('ET' ('EGA' ialgo 0) lmc) ;
  477. 'MESS' '!!! Topologie initiale :'
  478. ' Bord non connexe' ;
  479. lok = lok 'ET' faux ;
  480. 'FINS' ;
  481. *
  482. * Algorithme d'amélioration du maillage
  483. *
  484. volucib = MATOUTIL 'MESUINTE' borini ;
  485. volutol = '*' volucib precrelv ;
  486. 'SI' ('>EG' debug 1) ;
  487. *'MESSAGE' ('CHAINE' 'Volume initial=' volini) ;
  488. 'MESSAGE' ('CHAINE' 'Volume cible=' volucib ' tolerance=' volutol) ;
  489. 'SI' graph ;
  490. tit = 'CHAI' idk ' Topologie initiale' ;
  491. 'TRAC' 'CACH' topoini 'TITR' tit ;
  492. * tit = 'CHAINE' idk ' Contour Initial ; vol=' volucib ;
  493. * pbor = 'CHANGER' 'POI1' borini ;
  494. * 'TRACER' ('ET' borini pbor) 'TITR' tit ;
  495. 'FINS' ;
  496. 'FINSI' ;
  497.  
  498. * Qualités
  499. 'SI' ('>' debug 0) ;
  500. dvol nctelem nnul nctno miq maq moq =
  501. MATOUTIL 'AFFQUAL' topoini volucib volutol 'REST' 'VMET' metva ;
  502. 'SINO' ;
  503. dvol nctelem nnul nctno miq maq moq =
  504. MATOUTIL 'AFFQUAL' topoini volucib volutol 'REST' 'VMET' metva 'NAFF' ;
  505. 'FINS' ;
  506. *
  507. * Tests sur la topologie initiale (éventuellement corrigée de
  508. * l'orientation et des éléments uniques)
  509. *
  510. 'SI' ('EGA' ialgo 1) ;
  511. 'SI' ('NEG' dvol 0. volutol) ;
  512. 'MESSAGE' '!!! Topologie initiale :'
  513. ' Dvol non nul pour le cas' ' ' idk ;
  514. lok = lok 'ET' faux ;
  515. 'FINS' ;
  516. 'FINS' ;
  517. 'SI' ('<' ('+' dvol volutol) 0.) ;
  518. 'MESSAGE' '!!! Dvol negative pour le cas' ' ' idk ;
  519. lok = lok 'ET' faux ;
  520. 'FINSI' ;
  521. 'SI' ('NON' lok) ;
  522. * 845 2
  523. *Maillage donne incorrect ?!!!
  524. 'ERRE' 845 ;
  525. 'FINS' ;
  526. *
  527. 'SI' lvirt ;
  528. 'SI' ('EGA' vdim 2) ; pdep = 0.1 0.05 ; 'FINS' ;
  529. 'SI' ('EGA' vdim 3) ; pdep = 0.1 0.05 0.066 ; 'FINS' ;
  530. pzero = 'PLUS' ('BARYCENTRE' borini) pdep ;
  531. 'SINO' ;
  532. pzero = 0 ;
  533. 'FINSI' ;
  534. *
  535. curtopo = topoini ;
  536. * Statistiques
  537. * nnascm : nombre d'appels de la stratégie de limitation
  538. * du nombre de candidats
  539. * nparcou : nombre de topologies parcourues
  540. * nexplor : nombre de topologies explorées
  541. * nchange : nombre de topologies changées
  542. nnascm = 0 ; nparcou = 0 ; nexplor = 0 ; nchange = 0 ;
  543. oldtopo = curtopo ;
  544. *
  545. * Boucle d'optimisation
  546. *
  547. istrat = 1 ; lstrat0 = 'LECT' ;
  548. 'SI' lfast ; tfast = 'TABL' ; 'FINS' ;
  549. *
  550. 'REPETER' boptim nboptim ;
  551. *tst 'REPETER' boptim 1 ;
  552. 'SI' ('EXIS' tstrat istrat) ;
  553. ltyptop = tstrat . istrat ;
  554. 'SINO' ;
  555. 'QUIT' boptim ;
  556. 'FINS' ;
  557. *dbg 'MESS' ('CHAI' 'istrat=' istrat ' ltyptop=') ;
  558. *dbg 'LIST' ltyptop ;
  559. ntyptop ='DIME' ltyptop ;
  560. *
  561. tchange = 0 ;
  562. 'REPE' typtop ntyptop ;
  563. iar = 'EXTR' ltyptop &typtop ;
  564. not1 = 'ET' ('EGA' iajno 0) ('EGA' iar ('+' vdim 1)) ;
  565. not2 = 'EXIS' lstrat0 iar ;
  566. *dbg 'MESS' ('CHAI' 'iar=' iar ' iajno=' iajno ' vdim=' vdim
  567. *dbg ' not1=' not1 ' not2=' not2) ;
  568. *dbg 'MESS' 'lstrat0' ; 'LIST' lstrat0 ;
  569. 'SI' ('NON' ('OU' not1 not2)) ;
  570. 'SI' lfast ;
  571. 'SI' ('EXIS' tfast iar) ;
  572. pretopo = tfast . iar ;
  573. elecom = 'INTE' pretopo curtopo ;
  574. eledifc = 'DIFF' curtopo elecom ;
  575. ncurtopo = 'NBEL' curtopo ;
  576. nelecom = 'NBEL' elecom ;
  577. neledifc = 'NBEL' eledifc ;
  578. * naparcav = 'NBEL' aparc ;
  579. * aparc = 'ELEM' aparc 'APPUYE' 'LARGEMENT' eledifc ;
  580. * naparcap = 'NBEL' aparc ;
  581. curtopor = 'ELEM' curtopo 'APPUYE' 'LARGEMENT' eledifc ;
  582. ncurr = 'NBEL' curtopor ;
  583. * ch = 'CHAI' 'Acceleration : maillage (' neledifc ' / '
  584. ch = 'CHAI' 'Acceleration : maillage (' ncurr ' / '
  585. ncurtopo ') ' ;
  586. * iar ' (' naparcap ' / ' naparcav ')' ;
  587. 'MESS' ch ;
  588. * AFFVAR 'ncurtopo' 'nelecom'
  589. * 'neledifc' 'naparcav' 'naparcap' ;
  590. 'SINO' ;
  591. 'MESS' 'Pas dacceleration' ;
  592. curtopor = curtopo ;
  593. 'FINS' ;
  594. tfast . iar = curtopo ;
  595. 'SINO' ;
  596. curtopor = curtopo ;
  597. 'FINS' ;
  598. 'SI' ('EGA' iar 1) ;
  599. aparc = 'CHANGER' curtopor 'POI1' ;
  600. motar = 'points' ;
  601. 'FINS' ;
  602. 'SI' ('EGA' iar 2) ;
  603. aparc = 'CHANGER' curtopor 'LIGN' ;
  604. motar = 'aretes' ;
  605. 'FINSI' ;
  606. 'SI' ('EGA' iar 3) ;
  607. aparc = 'CHAN' curtopor 'SURF' ;
  608. motar = 'triangles' ;
  609. 'FINSI' ;
  610. 'SI' ('EGA' iar 4) ;
  611. aparc = curtopor ;
  612. motar = 'tetras' ;
  613. 'FINSI' ;
  614. titec = 'CHAINE' 'bop=' &boptim ' ' motar ;
  615. * trr = ('EGA' ikas 34) 'ET' ('EGA' &boptim 2) 'ET' ('EGA' iar 2) ;
  616. * trr = ('EGA' ikas 35) 'ET' ('EGA' &boptim 1) 'ET' ('EGA' iar 3) ;
  617. * trr = ('EGA' &boptim 3) 'ET' ('EGA' iar 1) ;
  618. * 'SI' trr ; debug = 4 ; 'SINO' ; debug = 2 ; 'FINS' ;
  619. inascm = 0 ; iparcou = 0 ; iexplor = 0 ; ichange = 0 ;
  620. nparc = 'NBEL' aparc ;
  621. 'SI' ('>EG' debug 2) ;
  622. titt = 'CHAINE' titec ' nel=' nparc ;
  623. 'MESSAGE' titt ;
  624. 'FINS' ;
  625. 'SI' lvirt ;
  626. curtopof = MATOUTIL 'FERMEPZ' curtopo mbnc pzero ;
  627. 'SINON' ;
  628. curtopof = curtopo ;
  629. 'FINSI' ;
  630. ch = 'CHAI' titec ' Topologie de depart' ;
  631. 'SI' ('>EG' debug 3) ;
  632. 'MESSAGE' ('CHAI' ch ' :') ;
  633. 'LISTE' curtopof ;
  634. 'SI' graph ;
  635. 'TRACER' 'CACH' curtopo 'NOEUD' 'TITR' ch ;
  636. 'FINS' ;
  637. 'FINS' ;
  638. newtopo = curtopo ; newtopof = curtopof ;
  639. jnascm = 0 ; jparcou = 0 ; jexplor = 0 ; jchange = 0 ;
  640. * igibi=0
  641. newtopof metva kexplor kchange kparcou knascm = 'OPTO' newtopof aparc metva
  642. 'VTOL' volutol 'QTOL' precrelq
  643. 'ALGO' ialgo 'AJNO' iajno
  644. 'VIRT' pzero
  645. 'NCMA' incma 'STMA' istma 'MOYE' imomet
  646. 'VERI' iveri 'SGAJ' isegadj 'IMPR' debug ;
  647. jexplor = jexplor '+' kexplor ;
  648. jchange = jchange '+' kchange ;
  649. jparcou = jparcou '+' kparcou ;
  650. jnascm = jnascm '+' knascm ;
  651. *
  652. inascm = '+' inascm jnascm ; nnascm = '+' nnascm jnascm ;
  653. iparcou = '+' iparcou jparcou ; nparcou = '+' nparcou jparcou ;
  654. iexplor = '+' iexplor jexplor ; nexplor = '+' nexplor jexplor ;
  655. ichange = '+' ichange jchange ; nchange = '+' nchange jchange ;
  656. 'SI' lvirt ;
  657. newtopo = MATOUTIL 'OUVREPZ' newtopof pzero ;
  658. 'SINON' ;
  659. newtopo = newtopof ;
  660. 'FINSI' ;
  661. curtopo = newtopo ;
  662. tparam . 'curtopo' = curtopo ;
  663. *
  664. 'SI' ('>EG' debug 2) ;
  665. titt = 'CHAINE' 'bop=' &boptim ' ' motar
  666. ' Topologie: parcourues=' iparcou
  667. ' examinees=' iexplor
  668. ' changees=' ichange ' limit_cand=' inascm ;
  669. 'MESSAGE' titt ;
  670. MATOUTIL 'AFFQUAL' curtopo volucib volutol 'VMET' metva ;
  671. 'SAUTER' 1 'LIGNE' ;
  672. 'SI' graph ;
  673. *? AFFCAND curtopo 'QUAL' tit ;
  674. curtopu = 'UNIQ' curtopo ;
  675. dnode = '-' ('NBEL' curtopo) ('NBEL' curtopu) ;
  676. 'SI' ('NEG' dnode 0) ;
  677. 'MESSAGE' '!!! ' dnode
  678. ' elements en double pour le cas ' idk ;
  679. 'FINS' ;
  680. tit = 'CHAINE' 'bop=' &boptim ' '
  681. motar ' Topologie obtenue' ;
  682. MATOUTIL 'AFFCAND' curtopu 'QUAL' 'VMET' metva
  683. 'TITR' tit ;
  684. 'FINS' ;
  685. 'FINSI' ;
  686. * kchange = '+' kchange ichange ;
  687. oldtopo = curtopo ;
  688. 'SINO' ;
  689. ichange = 0 ;
  690. 'FINS' ;
  691. tchange = tchange '+' ichange ;
  692. 'SI' ('EGA' ichange 0) ;
  693. 'SI' ('NON' ('EXIS' lstrat0 iar)) ;
  694. lstrat0 = lstrat0 'ET' iar ;
  695. 'FINS' ;
  696. 'SINO' ;
  697. lstrat0 = 'LECT' ;
  698. 'FINS' ;
  699. * 'SI' trr ; 'QUIT' boptim ; 'FINS' ;
  700. 'FIN' typtop ;
  701. 'SI' ('EGA' tchange 0) ;
  702. istrat = '+' istrat 1 ;
  703. 'SINO' ;
  704. istrat = 1 ;
  705. 'FINS' ;
  706. 'FIN' boptim ;
  707. *
  708. 'SI' ('>EG' debug 1) ;
  709. titt = 'CHAINE' idk ' Total:' ' '
  710. 'Topologie: parcourues=' nparcou
  711. ' examinees=' nexplor
  712. ' changees=' nchange ' limit_cand=' nnascm ;
  713. 'MESSAGE' titt ;
  714. MATOUTIL 'AFFQUAL' curtopo volucib volutol 'VMET' metva ;
  715. 'SI' graph ;
  716. tit = 'CHAI' idk ' Topologie finale obtenue' ;
  717. 'TRAC' 'CACH' curtopo 'TITR' tit ;
  718. 'FINS' ;
  719. 'FINS' ;
  720. 'SAUTER' 1 'LIGNE' ;
  721. *
  722. * Tests et fin de la boucle
  723. *
  724. lok = vrai ;
  725. curtopu = 'UNIQ' curtopo ;
  726. dnode = '-' ('NBEL' curtopo) ('NBEL' curtopu) ;
  727. 'SI' ('NEG' dnode 0) ;
  728. 'MESSAGE' '!!!' ' ' dnode
  729. ' elements en double pour le cas' ' ' idk ;
  730. lok = lok 'ET' faux ;
  731. 'FINS' ;
  732. *'SI' ('NON' lvirt) ;
  733. * Si pas de noeud virtuel, on est censé conserver le bord
  734. * 2018/06/11 même en cas de modification du bord, il y a peut-être
  735. * une partie qui doit être conservée
  736. bornew = MATOUTIL 'BORD' curtopo ;
  737. mi = 'INTE' mbnc bornew 'NOVERIF' ;
  738. * 'SI' ('NON' (EGAMAIL mi mbnc)) ;
  739. 'SI' ('NEG' ('NBEL' ('DIFF' mi mbnc)) 0) ;
  740. 'MESSAGE' '!!! Bord modifie pour le cas' ' ' idk ;
  741. lok = lok 'ET' faux ;
  742. 'TRAC' (mi 'ET' ('COUL' bornew 'ROUG')) ;
  743. 'FINS' ;
  744. *'FINS' ;
  745. * Qualités
  746. dvol nctelem nnul nctno miq maq moq =
  747. MATOUTIL 'AFFQUAL' curtopo volucib volutol 'REST' 'NAFF'
  748. 'VMET' metva ;
  749. *dvol = '-' ('MESURE' curtopo) volucib ;
  750. 'SI' ('NEG' nnul 0) ;
  751. 'MESS' '!!! Elements de volume nul pour le cas' ' ' idk ;
  752. lok = lok 'ET' faux ;
  753. 'FINS' ;
  754. 'SI' ('NEG' dvol 0. volutol) ;
  755. 'MESSAGE' '!!! Non cvg sur le volume pour le cas' ' ' idk ;
  756. 'MESSAGE' ('CHAI' 'dvol=' dvol ' volutol=' volutol) ;
  757. * 'MESSAGE' '!!! Dvol non nul pour le cas ' idk ;
  758. 'SI' ('NON' ('ET' ('EGA' ialgo 0) ('EGA' iajno 0))) ;
  759. lok = lok 'ET' faux ;
  760. 'FINS' ;
  761. 'FINS' ;
  762. 'SI' ('<' ('+' dvol volutol) 0.) ;
  763. 'MESSAGE' '!!! Dvol negative pour le cas' ' ' idk ;
  764. lok = lok 'ET' faux ;
  765. 'FINSI' ;
  766. *'SI' ('NEG' dvol 0. volutol) ;
  767. * 'MESSAGE' '!!! Non cvg sur le volume pour le cas ' idk ;
  768. * 'ERRE' 27 ;
  769. *'FINSI' ;
  770. 'SI' lquad ;
  771. curtopq = 'CHAN' 'QUAD' curtopo topoinq ;
  772. * 'SI' lmbnc ;
  773. * curtopq = 'CHAN' 'QUAD' curtopo mbncq ;
  774. * 'FINS' ;
  775. curtopo = curtopq ;
  776. 'FINS' ;
  777. *
  778. * Restitution de quelques informations
  779. *
  780. tparam . 'nnascm' = nnascm ;
  781. tparam . 'nparcou' = nparcou ;
  782. tparam . 'nexplor' = nexplor ;
  783. tparam . 'nchange' = nchange ;
  784. *
  785. tparam . 'dvol' = dvol ;
  786. tparam . 'nnul' = nnul ;
  787. tparam . 'miq' = miq ;
  788. tparam . 'maq' = maq ;
  789. tparam . 'moq' = moq ;
  790. *
  791. tparam . 'curtopo' = curtopo ;
  792. *
  793. 'RESP' curtopo ;
  794. 'SI' lipol ;
  795. 'SI' ('ET' ('EGA' imomet 1) ('EGA' tmetva 'CHPOINT')) ;
  796. metva = 'TENS' 'EXP' metva ;
  797. 'FINS' ;
  798. 'RESP' metva ;
  799. 'FINS' ;
  800. *lourd 'RESPRO'tparam ;
  801. * 27 2
  802. *Erreur generation de maillage. Il est neanmoins cree pour contrôle
  803. 'SI' ('NON' lok) ;
  804. 'ERRE' 27 ;
  805. 'FINSI' ;
  806. *
  807. * End of procedure file MAILTOPO
  808. *
  809. 'FINPROC' ;
  810.  
  811.  

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