1 subroutine deini4 ( tyconf,
4 > aretri, hettri, filtri,
8 > tritet, quahex, facpen, facpyr,
10 > ulsort, langue, codret)
11 c ______________________________________________________________________
15 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
17 c Version originale enregistree le 18 juin 1996 sous le numero 96036
18 c aupres des huissiers de justice Simart et Lavoir a Clamart
19 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
20 c aupres des huissiers de justice
21 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
23 c HOMARD est une marque deposee d'Electricite de France
29 c ______________________________________________________________________
31 c traitement des DEcisions - INitialisation de l'indicateur entier
33 c ______________________________________________________________________
35 c but : correction des decisions
36 c ______________________________________________________________________
38 c . nom . e/s . taille . description .
39 c .____________________________________________________________________.
40 c . tyconf . e . 1 . 0 : conforme (defaut) .
41 c . . . . 1 : non-conforme avec au minimum 2 aretes .
42 c . . . . non decoupees en 2 .
43 c . . . . 2 : non-conforme avec 1 seul noeud .
44 c . . . . pendant par arete .
45 c . . . . 3 : non-conforme fidele a l'indicateur .
46 c . . . . -1 : conforme, avec des boites pour les .
47 c . . . . quadrangles, hexaedres et pentaedres .
48 c . . . . -2 : non-conforme avec au maximum 1 arete .
49 c . . . . decoupee en 2 (boite pour les .
50 c . . . . quadrangles, hexaedres et pentaedres) .
51 c . . . . -2 : non-conforme avec au maximum 1 arete .
52 c . . . . decoupee en 2 (boite pour les .
53 c . . . . quadrangles, hexaedres et pentaedres) .
54 c . decare . es .0:nbarto. decisions des aretes .
55 c . decfac . es . -nbquto. decision sur les faces (quad. + tri.) .
57 c . hetare . e . nbarto . historique de l'etat des aretes .
58 c . filare . e . nbarto . premiere fille des aretes .
59 c . aretri . e .nbtrto*3. numeros des 3 aretes des triangles .
60 c . hettri . e . nbtrto . historique de l'etat des triangles .
61 c . filtri . e . nbtrto . premier fils des triangles .
62 c . voltri . e .2*nbtrto. numeros des 2 volumes par triangle .
63 c . . . . voltri(i,k) definit le i-eme voisin de k .
64 c . . . . 0 : pas de voisin .
65 c . . . . j>0 : tetraedre j .
66 c . . . . j<0 : pyramide/pentaedre dans pypetr(1/2,j).
67 c . pypetr . e .2*lgpype. pypetr(1,j) = numero de la pyramide voisine.
68 c . . . . du triangle k tel que voltri(1/2,k) = -j .
69 c . . . . pypetr(2,j) = numero du pentaedre voisin .
70 c . . . . du triangle k tel que voltri(1/2,k) = -j .
71 c . arequa . e .nbquto*4. numeros des 4 aretes des quadrangles .
72 c . hetqua . e . nbquto . historique de l'etat des quadrangles .
73 c . volqua . e .2*nbquto. numeros des 2 volumes par quadrangle .
74 c . . . . volqua(i,k) definit le i-eme voisin de k .
75 c . . . . 0 : pas de voisin .
76 c . . . . j>0 : hexaedre j .
77 c . . . . j<0 : pyramide/pentaedre dans pypequ(1/2,j).
78 c . tritet . e .nbtecf*4. numeros des 4 triangles des tetraedres .
79 c . quahex . e .nbhecf*6. numeros des 6 quadrangles des hexaedres .
80 c . facpen . e .nbpecf*5. numeros des faces des pentaedres .
81 c . facpyr . e .nbpycf*5. numeros des 5 faces des pyramides .
82 c . tabaux . a . -nbquto. tableau auxiliaire sur les faces .
83 c . . . :nbtrto. (quad. + tri.) .
84 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
85 c . langue . e . 1 . langue des messages .
86 c . . . . 1 : francais, 2 : anglais .
87 c . codret . s . 1 . code de retour des modules .
88 c ______________________________________________________________________
91 c 0. declarations et dimensionnement
94 c 0.1. ==> generalites
100 parameter ( nompro = 'DEINI4' )
118 integer decare(0:nbarto), decfac(-nbquto:nbtrto)
119 integer hetare(nbarto), filare(nbarto)
120 integer aretri(nbtrto,3), hettri(nbtrto), filtri(nbtrto)
121 integer voltri(2,nbtrto), pypetr(2,*)
122 integer arequa(nbquto,4), hetqua(nbquto)
123 integer volqua(2,nbquto)
124 integer tritet(nbtecf,4)
125 integer quahex(nbhecf,6)
126 integer facpen(nbpecf,5)
127 integer facpyr(nbpycf,5)
128 integer tabaux(-nbquto:nbtrto)
130 integer ulsort, langue, codret
132 c 0.4. ==> variables locales
134 integer iaux, jaux, kaux
135 integer lehexa, letetr, lapyra, lepent, letria, lequad, lequa0
137 integer nbquad, iquad, liquad(11)
140 parameter (nbmess = 10 )
141 character*80 texte(nblang,nbmess)
142 c ______________________________________________________________________
150 #ifdef _DEBUG_HOMARD_
151 write (ulsort,texte(langue,1)) 'Entree', nompro
156 > '(5x,''Correction pour le mode conforme - phase'',i2)'
157 texte(1,5) = '(5x,''Correction pour le mode non conforme'')'
159 texte(2,4) = '(5x,''Correction for conformal mode - phase #'',i1)'
160 texte(2,5) = '(5x,''Correction for non conformal mode'')'
166 #ifdef _DEBUG_HOMARD_
167 write (ulsort,*) 'entree de ',nompro
168 do 1111 , iaux = 1 , nbarto
169 if ( iaux.eq.-50 .or. iaux.eq.-51 .or.
170 > iaux.eq.-53 .or. iaux.eq.-57 ) then
171 write (ulsort,90001) '.. arete e/d', iaux,
172 > hetare(iaux), decare(iaux)
174 cgn if ( decare(iaux).ne.0 ) then
175 cgn write (ulsort,90001) '.. arete e/d', iaux,
176 cgn > hetare(iaux), decare(iaux)
182 c 2. Correction pour le mode conforme - phase 1
183 c A. Il est possible que l'on demande une reactivation de
184 c triangles ou de quadrangles alors que leurs aretes
185 c sont deja decoupees a 2 niveaux.
186 c Il faut alors annuler la demande de deraffinement.
187 c B. Du fait de filtrages, il est possible qu'une demande de
188 c raffinement sur une face soit liee a une restriction sur une
190 c Il faut alors imposer le raffinement de l'arete
192 #ifdef _DEBUG_HOMARD_
193 write (ulsort,90002) '2. correction conforme 1 ; codret', codret
196 if ( ( tyconf.eq.0 ) .or. ( tyconf.eq.-1 ) ) then
198 write(ulsort,texte(langue,4)) 1
200 c 2.1. ==> Aucune correction de deraffinement au depart
202 do 21 , iaux = -nbquto, nbtrto
206 c 2.2. ==> Corrections pour les triangles
208 cgn write(ulsort,90002) 'nbtrto', nbtrto
209 do 22 , iaux = 1, nbtrto
211 c 2.2.1. ==> Le triangle est a deraffiner
213 if ( decfac(iaux).eq.-1 ) then
215 c 2.2.1.1. ==> On voudrait reactiver le triangle, mais au moins une
216 c de ses aretes est coupee deux fois ==> impossible
218 cgn write(ulsort,90015) 'Triangle',iaux,', etat',hettri(iaux)
219 if ( mod(hetare(aretri(iaux,1)),10).gt.2 .or.
220 > mod(hetare(aretri(iaux,2)),10).gt.2 .or.
221 > mod(hetare(aretri(iaux,3)),10).gt.2 ) then
223 cgn write(ulsort,90002) 'Annulation reactivation du triangle',iaux
226 c 2.2.1.2. ==> Prise en compte du voisinage quand le fils central
227 c du triangle a une de ses aretes deja coupee : il faut
228 c traiter les faces des volumes qui s'appuient sur
231 cgn write(ulsort,*) 'filtri(',iaux,') :',filtri(iaux)
232 cgn write(ulsort,90002) 'hetare(aretri(filtri(iaux),1))',
233 cgn > hetare(aretri(filtri(iaux),1))
234 cgn write(ulsort,90002) 'hetare(aretri(filtri(iaux),1))',
235 cgn > hetare(aretri(filtri(iaux),1))
236 cgn write(ulsort,90002) 'hetare(aretri(filtri(iaux),2))',
237 cgn > hetare(aretri(filtri(iaux),2))
238 cgn write(ulsort,90002) 'hetare(aretri(filtri(iaux),3))',
239 cgn > hetare(aretri(filtri(iaux),3))
240 if ( nbteto.gt.0 .or. nbpeto.gt.0 .or. nbpyto.gt.0 ) then
242 if ( mod(hettri(iaux),10).eq.9 .or.
243 > mod(hetare(aretri(filtri(iaux),1)),10).gt.0 .or.
244 > mod(hetare(aretri(filtri(iaux),2)),10).gt.0 .or.
245 > mod(hetare(aretri(filtri(iaux),3)),10).gt.0 ) then
247 do 2212 , jaux = 1, 2
249 letetr = voltri(jaux,iaux)
250 if ( letetr.gt.0 ) then
251 cgn write(ulsort,90002) 'Tetraedre', letetr
252 do 22121 , kaux = 1, 4
253 letria = tritet(letetr,kaux)
256 elseif ( letetr.lt.0 ) then
257 lapyra = pypetr(1,-letetr)
258 if ( lapyra.ne.0 ) then
259 cgn write(ulsort,90002) 'Pyramide', lapyra
260 do 22122 , kaux = 1, 4
261 letria = facpyr(lapyra,kaux)
264 tabaux(-facpyr(lapyra,5)) = 1
266 lepent = pypetr(2,-letetr)
267 if ( lepent.ne.0 ) then
268 cgn write(ulsort,90002) 'Pentaedre', lepent
269 do 22123 , kaux = 1, 2
270 letria = facpen(lepent,kaux)
273 do 22124 , kaux = 3, 5
274 lequad = facpen(lepent,kaux)
286 c 2.2.2. ==> Le triangle est a raffiner : toutes ses aretes
289 elseif ( decfac(iaux).eq.4 ) then
292 if ( mod(hetare(aretri(iaux,jaux)),10).eq.0 ) then
293 decare(aretri(iaux,jaux)) = 2
301 c 2.3. ==> Corrections pour les quadrangles
303 cgn write(ulsort,90002) 'nbquto', nbquto
304 do 23 , iaux = 1, nbquto
306 c 2.3.1. ==> Le quadrangle est a deraffiner
308 if ( decfac(-iaux).eq.-1 ) then
310 c 2.3.1.1. ==> On voudrait reactiver le quadrangle, mais au moins une
311 c de ses aretes est coupee deux fois ==> impossible
313 if ( mod(hetare(arequa(iaux,1)),10).gt.2 .or.
314 > mod(hetare(arequa(iaux,2)),10).gt.2 .or.
315 > mod(hetare(arequa(iaux,3)),10).gt.2 .or.
316 > mod(hetare(arequa(iaux,4)),10).gt.2 ) then
318 cgn write(ulsort,90002) 'Annulation reactivation du quadrangle',iaux
321 c 2.3.2. ==> Le quadrangle est a raffiner : toutes ses aretes
324 elseif ( decfac(-iaux).eq.4 ) then
327 if ( mod(hetare(arequa(iaux,jaux)),10).eq.0 ) then
328 decare(arequa(iaux,jaux)) = 2
336 c 2.4. ==> Mise en place des corrections de deraffinement
338 do 241 , iaux = 1, nbquto
339 if ( tabaux(-iaux).gt.0 ) then
340 cgn write(ulsort,90002) 'Annulation reactivation du quadrangle',iaux
341 cgn write(ulsort,90002) 'decare(arequa(iaux,1))',
342 cgn > decare(arequa(iaux,1))
343 cgn write(ulsort,90002) 'decare(arequa(iaux,2))',
344 cgn > decare(arequa(iaux,2))
345 cgn write(ulsort,90002) 'decare(arequa(iaux,3))',
346 cgn > decare(arequa(iaux,3))
347 cgn write(ulsort,90002) 'decare(arequa(iaux,4))',
348 cgn > decare(arequa(iaux,4))
350 do 2411 , jaux = 1, 4
351 decare(arequa(iaux,jaux)) =
352 > max(0,decare(arequa(iaux,jaux)))
357 do 242 , iaux = 1, nbtrto
358 if ( tabaux(iaux).gt.0 ) then
359 cgn write(ulsort,90002) 'Annulation reactivation du triangle',iaux
360 cgn write(ulsort,90002) 'decare(aretri(iaux,1))',
361 cgn > decare(aretri(iaux,1))
362 cgn write(ulsort,90002) 'decare(aretri(iaux,2))',
363 cgn > decare(aretri(iaux,2))
364 cgn write(ulsort,90002) 'decare(aretri(iaux,3))',
365 cgn > decare(aretri(iaux,3))
367 do 2421 , jaux = 1, 3
368 decare(aretri(iaux,jaux)) =
369 > max(0,decare(aretri(iaux,jaux)))
375 #ifdef _DEBUG_HOMARD_
376 write (ulsort,*) 'apres 2 de ',nompro
377 do 22222 , iaux = 1 , nbarto
378 if ( iaux.eq.-50 .or. iaux.eq.-51 .or.
379 > iaux.eq.-53 .or. iaux.eq.-57 ) then
380 write (ulsort,90001) '.. arete e/d', iaux,
381 > hetare(iaux), decare(iaux)
387 c 3. Correction pour le mode conforme - phase 2
388 c Dans le cas particulier de raffinement par des indicateurs
389 c aux noeuds ou aux aretes, on peut se trouver ainsi :
391 c avec dec de conformite apres suppr
392 c sur l'arete horizontale de la conformite
398 c o..X.o....o o..X.o....o
404 c Si on ne fait rien, le triangle du haut ne sera jamais coupe car la
405 c gestion des ecarts de niveau passe par les faces coupees. Il faut
406 c donc s'en occuper ici. Il faut declarer a couper toutes les faces
407 c qui contiennent cette arete.
418 c Le traitement est similaire pour les quadrangles.
419 c Remarque : cette configuration ne peut pas reapparaitre ensuite
421 c En mode "conforme par boites", tout volume contenant une arete
422 c coupee deux fois sera decoupe en standard car les deux faces
423 c qui contiennent l'arete l'auront ete. L'algorithme de contamination
425 c En mode conforme pur, le meme raisonnement s'applique aux volumes
426 c borde par un triangle : tetraedre ou pentaedre. En revanche, pour un
427 c hexaedre, le decoupage des deux quadrangles partageant l'arete ne
428 c suffira pas a enclencher le decoupage standard de l'hexaedre. Il faut
431 #ifdef _DEBUG_HOMARD_
432 write (ulsort,90002) '3. correction conforme 2 ; codret', codret
433 write (ulsort,90002) 'tyconf', tyconf
436 if ( ( tyconf.eq.0 ) .or. ( tyconf.eq.-1 ) ) then
438 write(ulsort,texte(langue,4)) 2
442 #ifdef _DEBUG_HOMARD_
443 write (ulsort,90002) '3.1 Triangles ; codret', codret
446 do 31 , iaux = 1, nbtrto
448 if ( decfac(iaux).eq.0 .and.
449 > mod(hettri(iaux),10).eq.0 ) then
450 cgn write(ulsort,90002) 'Triangle', iaux
453 kaux = aretri(iaux,jaux)
454 if ( mod(hetare(kaux),10).ge.2 ) then
455 if ( decare(filare(kaux)).ge.2 ) then
456 cgn write(ulsort,90002) '. Arete', kaux
458 elseif ( decare(filare(kaux)+1).ge.2 ) then
459 cgn write(ulsort,90002) '. Arete', kaux
470 kaux = aretri(iaux,jaux)
471 if ( mod(hetare(kaux),10).eq.0 ) then
472 cgn write(ulsort,90002) '==> Triangle', iaux
473 cgn write(ulsort,90002) '==> Decoupage de l''arete', kaux
475 elseif ( mod(hetare(kaux),10).ge.2 ) then
476 cgn write(ulsort,90002) '==> Triangle', iaux
477 cgn write(ulsort,90002) '==> Decoupage de l''arete', kaux
478 decare(kaux) = max(0,decare(kaux))
481 cgn write(ulsort,90002) '.==> Decoupage du triangle', iaux
488 c 3.2. ==> Quadrangles
490 #ifdef _DEBUG_HOMARD_
491 write (ulsort,90002) '3.2. Quadrangles ; codret', codret
494 do 32 , lequad = 1, nbquto
496 cgn if ( lequad.eq.38 ) then
497 cgn write(ulsort,90002) 'Quadrangle',
498 cgn > lequad,decfac(-lequad),hetqua(lequad)
500 if ( decfac(-lequad).eq.0 ) then
501 cgn write(ulsort,90002) 'Quadrangle', lequad
504 kaux = arequa(lequad,jaux)
505 if ( mod(hetare(kaux),10).ge.2 ) then
506 if ( decare(filare(kaux)).ge.2 ) then
507 cgn write(ulsort,90002) '. Arete', kaux
509 elseif ( decare(filare(kaux)+1).ge.2 ) then
510 cgn write(ulsort,90002) '. Arete', kaux
518 c 3.2.2. ==> Le quadrangle lequad est a traiter
519 c On lui ajoute tous les quadrangles des hexaedres voisins
525 cgn if ( lequad.eq.-417 ) then
526 cgn write(ulsort,90002) 'Quadrangle', lequad
529 if ( nbheto.gt.0 ) then
531 do 322 , jaux = 1 , 2
533 lehexa = volqua(jaux,lequad)
535 if ( lehexa.gt.0 ) then
537 do 3221 , kaux = 1 , 6
538 if ( quahex(lehexa,kaux).ne.lequad ) then
540 liquad(nbquad) = quahex(lehexa,kaux)
549 cgn if ( lequad.eq.-417 ) then
550 cgn write(ulsort,90002) 'nbquad', nbquad
553 c 3.2.3. ==> Traitement des quadrangles enregistres
555 do 323 , iquad = 1, nbquad
557 lequa0 = liquad(iquad)
558 if ( lequad.eq.-417 ) then
559 write(ulsort,90002) '.. lequa0', lequa0,decfac(-lequa0)
562 do 3231 , jaux = 1, 4
563 kaux = arequa(lequa0,jaux)
564 cgn if ( lequad.eq.-417 ) then
565 cgn write(ulsort,90002) '.... arete', kaux,hetare(kaux),decare(kaux)
567 if ( mod(hetare(kaux),10).eq.0 ) then
568 cgn if ( kaux.eq.50 .or. kaux.eq.51 .or.
569 cgn > kaux.eq.53 .or. kaux.eq.57 ) then
570 cgn write(ulsort,90002) '==> Quadrangle', lequa0
571 cgn write(ulsort,90002) '==> Decoupage de l''arete', kaux
574 elseif ( mod(hetare(kaux),10).ge.2 ) then
575 cgn write(ulsort,90002) '==> Quadrangle', lequa0
576 cgn write(ulsort,90002) '==> Decoupage de l''arete', kaux
577 decare(kaux) = max(0,decare(kaux))
582 if ( mod(hetqua(lequad),100).eq.0 ) then
583 cgn write(ulsort,90002) '==> Decoupage du quadrangle', lequad
592 #ifdef _DEBUG_HOMARD_
593 write (ulsort,*) 'apres 3 de ',nompro
594 do 33333 , iaux = 1 , nbarto
595 if ( iaux.eq.-50 .or. iaux.eq.-51 .or.
596 > iaux.eq.-53 .or. iaux.eq.-57 ) then
597 write (ulsort,90001) '.. arete e/d', iaux,
598 > hetare(iaux), decare(iaux)
604 c 4. Correction pour le mode non conforme
605 c Il est possible que l'on demande du decoupage d'aretes ou de
606 c triangles ou de quadrangles alors qu'ils le sont deja.
608 #ifdef _DEBUG_HOMARD_
609 write (ulsort,90002) '4. correction non conforme ; codret', codret
612 if ( ( tyconf.gt.0 ) .or. ( tyconf.eq.-2 ) ) then
614 write(ulsort,texte(langue,5))
616 do 41 , iaux = 1, nbtrto
617 if ( decfac (iaux).eq.4 ) then
618 etat = mod(hettri(iaux),10)
620 > etat.eq.5 .or. etat.eq.6 .or. etat.eq.7 .or.
627 do 42 , iaux = 1, nbquto
628 if ( decfac (-iaux).eq.4 ) then
629 etat = mod(hetqua(iaux),100)
630 if ( etat.eq.4 .or. etat.eq.99) then
636 do 43 , iaux = 1, nbarto
637 if ( decare (iaux).eq.2 ) then
638 etat = mod(hetare(iaux),10)
639 if (etat.eq.2 .or. etat.eq.9 ) then
647 cgn do 444 , iaux = -nbquto, nbtrto
648 cgn if ( decfac(iaux).eq.-1 ) then
649 cgn write(ulsort,90002) '.Reactivation de la face', iaux
657 #ifdef _DEBUG_HOMARD_
658 write (ulsort,*) 'sortie de ',nompro
659 do 5555 , iaux = 1 , nbarto
660 if ( iaux.eq.-50 .or. iaux.eq.-51 .or.
661 > iaux.eq.-53 .or. iaux.eq.-57 ) then
662 write (ulsort,90001) '.. arete e/d', iaux,
663 > hetare(iaux), decare(iaux)
669 cgn write (ulsort,90015) 'decision triangle', iaux, ' :', decfac(iaux)
670 cgn write (ulsort,90015) 'decision arete', aretri(iaux,1), ' :',
671 cgn > decare(aretri(iaux,1))
672 cgn write (ulsort,90015) 'decision arete', aretri(iaux,2), ' :',
673 cgn > decare(aretri(iaux,2))
674 cgn write (ulsort,90015) 'decision arete', aretri(iaux,3), ' :',
675 cgn > decare(aretri(iaux,3))
677 if ( codret.ne.0 ) then
681 write (ulsort,texte(langue,1)) 'Sortie', nompro
682 write (ulsort,texte(langue,2)) codret
686 #ifdef _DEBUG_HOMARD_
687 write (ulsort,texte(langue,1)) 'Sortie', nompro