Télécharger mailtopo.procedur

Retour à la liste

Numérotation des lignes :

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

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