1 subroutine cmhomt ( arehom, trihom,
3 > aretri, filtri, hettri,
4 > ulsort, langue, codret )
5 c ______________________________________________________________________
9 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
11 c Version originale enregistree le 18 juin 1996 sous le numero 96036
12 c aupres des huissiers de justice Simart et Lavoir a Clamart
13 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
14 c aupres des huissiers de justice
15 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
17 c HOMARD est une marque deposee d'Electricite de France
23 c ______________________________________________________________________
25 c Creation du Maillage - HOMologues - les Triangles
27 c ______________________________________________________________________
29 c . nom . e/s . taille . description .
30 c .____________________________________________________________________.
31 c . arehom . es . nbarto . ensemble des aretes homologues .
32 c . trihom . es . nbtrto . ensemble des triangles homologues .
33 c . somare . e .2*nbarto. numeros des extremites d'arete .
34 c . aretri . e .nbtrto*3. numeros des 3 aretes des triangles .
35 c . filtri . e . nbtrto . premier fils des triangles .
36 c . hettri . e . nbtrto . historique de l'etat des triangles .
37 c . ulsort . e . 1 . unite logique de la sortie generale .
38 c . langue . e . 1 . langue des messages .
39 c . . . . 1 : francais, 2 : anglais .
40 c . codret . es . 1 . code de retour des modules .
41 c . . . . 0 : pas de probleme .
42 c ______________________________________________________________________
45 c 0. declarations et dimensionnement
48 c 0.1. ==> generalites
54 parameter ( nompro = 'CMHOMT' )
69 integer arehom(nbarto), trihom(nbtrto)
70 integer somare(2,nbarto)
71 integer aretri(nbtrto,3), filtri(nbtrto), hettri(nbtrto)
73 integer ulsort, langue, codret
75 c 0.4. ==> variables locales
80 integer hist, etafac, etafho, an2, an1, n2f, n1f
81 integer a2f1, a2f2, a2f3, a1f1, a1f2, a1f3
82 integer f2k, f2j, f1k, f1j
83 integer na2k, na1k, na1j
84 integer a2s2s3, a2s1s3
85 integer a1s1s2, a1s2s3, a1s1s3
88 parameter ( nbmess = 10 )
89 character*80 texte(nblang,nbmess)
91 c 0.5. ==> initialisations
92 c ______________________________________________________________________
100 #ifdef _DEBUG_HOMARD_
101 write (ulsort,texte(langue,1)) 'Entree', nompro
105 texte(1,4) = '(''Etat du '',a,i10,'' : '',i4)'
106 texte(1,5) = '(/,''Les deux '',a,'' homologues'',2i10)'
107 texte(1,6) = '(''devraient etre coupes en 2.'')'
108 texte(1,7) = '(''Elle a pour homologue '',i10)'
109 texte(1,8) = '(''Il faudrait l''''arete'',i10,'' ou '',i10)'
110 texte(1,9) = '(''Arete'',i10,'' de sommets'',2i10)'
111 texte(1,10) = '(5x,''Erreur sur les '',a,'' homologues.'')'
113 texte(2,4) = '(''State of '',a,'' #'',i10,'' : '',i4)'
114 texte(2,5) = '(/,''The two homologous '',a,'' #'',i10)'
115 texte(2,6) = '(''should be cut into 2.'')'
116 texte(2,7) = '(''Its homologous is ''i10)'
117 texte(2,8) = '(''It should be edge #'',i10,'' or #'',i10)'
118 texte(2,9) = '(''Edge #'',i10,'' with vertices #'',2i10)'
119 texte(2,10) = '(5x,''Error for homologous '',a)'
122 c 2. on boucle uniquement sur les triangles de la face periodique 2
123 c qui viennent d'etre decoupes en 2 ou en 4
126 do 21, letria = 1, nbtrpe
128 if ( trihom(letria).gt.0 ) then
130 hist = hettri(letria)
131 etafac = mod ( hist, 10 )
133 if ( hist.eq. 4 .or. hist.eq.14 .or.
134 > hist.eq.24 .or. hist.eq.34 ) then
136 fach = abs(trihom(letria))
138 c 2.1. ==> le triangle vient d'etre decoupe en 4
140 c 2.1.1. ==> recuperation des infos sur les fils de letria
144 c recuperation des numeros d'aretes
146 a2s2s3 = aretri(letria,1)
147 a2s1s3 = aretri(letria,2)
149 c recuperation des aretes internes
155 c 2.1.2. ==> recuperation des infos sur le triangle homologue
159 c recuperation des numeros d'aretes
161 a1s1s2 = aretri(fach,3)
162 a1s2s3 = aretri(fach,1)
163 a1s1s3 = aretri(fach,2)
165 c recuperation des aretes internes
171 c 2.1.3. ==> reperage des homologues
173 c dans tous les cas on a correspondance entre
174 c les triangles n2f et n1f, fils aines.
175 c n2f est sur la meme face que "larete" c'est-a-dire la face 2
176 c donc noehom(n2f) est positif.
177 c s1f est sur l'autre face, donc noehom(s1f) est negatif
182 if ( abs(arehom(a2s2s3)).eq.a1s2s3 ) then
184 c les aretes 1 correspondent donc on a correspondance entre
185 c les triangles n2f+1 et n1f+1
186 c les aretes a2f1 et a1f1
191 trihom(n2f+1) = (n1f+1)
192 trihom(n1f+1) = -(n2f+1)
194 if ( abs(arehom(a2s1s3)).eq.a1s1s3 ) then
196 c les aretes 2 correspondent donc
197 c on a correspondance entre
198 c les triangles n2f+2 et n1f+2
199 c les triangles n2f+3 et n1f+3
200 c les aretes a2f2 et a1f2
201 c les aretes a2f3 et a1f3
208 trihom(n2f+2) = (n1f+2)
209 trihom(n1f+2) = -(n2f+2)
210 trihom(n2f+3) = (n1f+3)
211 trihom(n1f+3) = -(n2f+3)
215 c les aretes 2 et 3 correspondent
216 c donc on a correspondance entre
217 c les triangles n2f+2 et n1f+3
218 c les triangles n2f+3 et n1f+2
219 c les aretes a2f2 et a1f3
220 c les aretes a2f3 et a1f2
227 trihom(n2f+2) = (n1f+3)
228 trihom(n1f+3) = -(n2f+2)
229 trihom(n2f+3) = (n1f+2)
230 trihom(n1f+2) = -(n2f+3)
234 elseif ( abs(arehom(a2s2s3)).eq.a1s1s3 ) then
236 c les aretes 1 et 2 correspondent
237 c donc on a correspondance entre
238 c les triangles n2f+1 et n1f+2
239 c les aretes a2f1 et a1f2
244 trihom(n2f+1) = (n1f+2)
245 trihom(n1f+2) = -(n2f+1)
247 if ( abs(arehom(a2s1s3)).eq.a1s2s3 ) then
249 c les aretes 2 et 1 correspondent
250 c donc on a correspondance entre
251 c les triangles n2f+2 et n1f+1
252 c les triangles n2f+3 et n1f+3
253 c les aretes a2f2 et a1f1
254 c les aretes a2f3 et a1f3
261 trihom(n2f+2) = (n1f+1)
262 trihom(n1f+1) = -(n2f+2)
263 trihom(n2f+3) = (n1f+3)
264 trihom(n1f+3) = -(n2f+3)
268 c les aretes 2 et 3 correspondent
269 c donc on a correspondance entre
270 c les triangles n2f+2 et n1f+3
271 c les triangles n2f+3 et n1f+1
272 c les aretes a2f2 et a1f3
273 c les aretes a2f3 et a1f1
280 trihom(n2f+2) = (n1f+3)
281 trihom(n1f+3) = -(n2f+2)
282 trihom(n2f+3) = (n1f+1)
283 trihom(n1f+1) = -(n2f+3)
287 elseif ( abs(arehom(a2s2s3)).eq.a1s1s2 ) then
289 c les aretes 1 et 3 correspondent
290 c donc on a correspondance entre
291 c les triangles n2f+1 et n1f+3
292 c les aretes a2f1 et a1f3
297 trihom(n2f+1) = (n1f+3)
298 trihom(n1f+3) = -(n2f+1)
300 if ( abs(arehom(a2s1s3)).eq.a1s2s3 ) then
302 c les aretes 2 et 1 correspondent
303 c donc on a correspondance entre
304 c les triangles n2f+2 et n1f+1
305 c les triangles n2f+3 et n1f+2
306 c les aretes a2f2 et a1f1
307 c les aretes a2f3 et a1f2
314 trihom(n2f+2) = (n1f+1)
315 trihom(n1f+1) = -(n2f+2)
316 trihom(n2f+3) = (n1f+2)
317 trihom(n1f+2) = -(n2f+3)
321 c les aretes 2 correspondent
322 c donc on a correspondance entre
323 c les triangles n2f+2 et n1f+2
324 c les triangles n2f+3 et n1f+1
325 c les aretes a2f2 et a1f3
326 c les aretes a2f3 et a1f1
333 trihom(n2f+2) = (n1f+2)
334 trihom(n1f+2) = -(n2f+2)
335 trihom(n2f+3) = (n1f+1)
336 trihom(n1f+1) = -(n2f+3)
341 write (ulsort,texte(langue,10)) mess14(langue,3,2)
344 elseif ( etafac.eq.1 .or. etafac.eq.2 .or. etafac.eq.3 ) then
346 c 2.2. ==> le triangle vient d'etre decoupe en 2
347 c . il n'y a aucune regle d'ordre de creation des
348 c demi-triangles entre les deux meres homologues.
349 c . il n'y a pas de probleme d'axe a gerer, car letria est
350 c sur la face 2 par hypothese, et donc fach sur la face 1
351 c . la seule information dont on est certain est la
352 c correspondance entre les filles des aretes decoupees : le
353 c tableau arehom a ete mis a jour precedemment
361 c are2j . . . are2k <--> are1j . . . are1k
365 c . f2k . f2j . . f1k . f1j .
367 c x-----------------x x-----------------x
368 c s2k na2k n2 na2j s2j s1k na1k n1 na1j s1j
370 c alternative : f2k est homologue de f1k
371 c ou : f2k est homologue de f1j
373 c 2.2.1. ==> recuperation des infos sur les fils de letria
375 if ( etafac.eq.1 ) then
377 c le triangle a ete decoupe en 2 par l'arete numero 1
379 c recuperation des triangles fils
381 f2k = filtri(letria) + nutrde(1,2)
382 f2j = filtri(letria) + nutrde(1,3)
384 c recuperation des nouvelles aretes
390 elseif ( etafac.eq.2 ) then
392 c le triangle a ete decoupe en 2 par l'arete numero 2
394 c recuperation des triangles fils
396 f2k = filtri(letria) + nutrde(2,3)
397 f2j = filtri(letria) + nutrde(2,1)
399 c recuperation des nouvelles aretes
405 elseif ( etafac.eq.3 ) then
407 c le triangle a ete decoupe en 2 par l'arete numero 3
409 c recuperation des triangles fils
411 f2k = filtri(letria) + nutrde(3,1)
412 f2j = filtri(letria) + nutrde(3,2)
414 c recuperation des nouvelles aretes
422 c 2.2.2. ==> recuperation des infos sur le triangle homologue
424 fach = abs(trihom(letria))
426 etafho = mod ( hettri(fach), 10 )
428 if ( etafho.eq.1 ) then
430 c le triangle a ete decoupe en 2 par l'arete numero 1
432 c recuperation des triangles fils
434 f1k = filtri(fach) + nutrde(1,2)
435 f1j = filtri(fach) + nutrde(1,3)
437 c recuperation des nouvelles aretes
444 elseif ( etafho.eq.2 ) then
446 c le triangle a ete decoupe en 2 par l'arete numero 2
448 c recuperation des triangles fils
450 f1k = filtri(fach) + nutrde(2,3)
451 f1j = filtri(fach) + nutrde(2,1)
453 c recuperation des nouvelles aretes
460 elseif ( etafho.eq.3 ) then
462 c le triangle a ete decoupe en 2 par l'arete numero 3
464 c recuperation des triangles fils
466 f1k = filtri(fach) + nutrde(3,1)
467 f1j = filtri(fach) + nutrde(3,2)
469 c recuperation des nouvelles aretes
478 c le triangle homologue n'est pas coupe en deux ???
480 write (ulsort,texte(langue,5))mess14(langue,3,2),
482 write (ulsort,texte(langue,6))
483 write (ulsort,texte(langue,4)) mess14(langue,1,2),
485 write (ulsort,texte(langue,4)) mess14(langue,1,2),
491 c 2.2.3. ==> reperage des homologues
496 if ( arehom(na2k).eq.na1k ) then
503 elseif ( arehom(na2k).eq.na1j ) then
512 c l'arete n'a pas d'homologue ?
514 write (ulsort,texte(langue,5)) mess14(langue,3,2),
516 write (ulsort,texte(langue,9))
517 > na2k, somare(1,na2k), somare(2,na2k)
518 write (ulsort,texte(langue,7)) arehom(na2k)
519 if ( arehom(na2k).ne.0 ) then
520 write (ulsort,texte(langue,9)) abs(arehom(na2k)),
521 > somare(1,abs(arehom(na2k))), somare(2,abs(arehom(na2k)))
523 write (ulsort,texte(langue,8)) na1k, na1j
524 write (ulsort,texte(langue,9))
525 > na1k, somare(1,na1k), somare(2,na1k)
526 write (ulsort,texte(langue,9))
527 > na1j, somare(1,na1j), somare(2,na1j)
542 if ( codret.ne.0 ) then
546 write (ulsort,texte(langue,1)) 'Sortie', nompro
547 write (ulsort,texte(langue,2)) codret
551 #ifdef _DEBUG_HOMARD_
552 write (ulsort,texte(langue,1)) 'Sortie', nompro