1 subroutine derco5 ( tyconf, niveau,
3 > hetare, filare, arehom,
4 > hettri, aretri, filtri, nivtri, homtri,
6 > hetqua, arequa, filqua, nivqua, quahom,
12 > ulsort, langue, codret )
13 c ______________________________________________________________________
17 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
19 c Version originale enregistree le 18 juin 1996 sous le numero 96036
20 c aupres des huissiers de justice Simart et Lavoir a Clamart
21 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
22 c aupres des huissiers de justice
23 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
25 c HOMARD est une marque deposee d'Electricite de France
31 c ______________________________________________________________________
33 c traitement des DEcisions - Raffinement : COntamination - option 2
35 c Application de la regle des ecarts de niveau, tout type de raffinement
36 c en presence d'aretes et/ou de faces homologues
37 c ______________________________________________________________________
39 c . nom . e/s . taille . description .
40 c .____________________________________________________________________.
41 c . tyconf . e . 1 . 0 : conforme (defaut) .
42 c . . . . 1 : non-conforme avec au minimum 2 aretes .
43 c . . . . non decoupees en 2 .
44 c . . . . 2 : non-conforme avec 1 seul noeud .
45 c . . . . pendant par arete .
46 c . . . . 3 : non-conforme fidele a l'indicateur .
47 c . . . . -1 : conforme, avec des boites pour les .
48 c . . . . quadrangles, hexaedres et pentaedres .
49 c . . . . -2 : non-conforme avec au maximum 1 arete .
50 c . . . . decoupee en 2 (boite pour les .
51 c . . . . quadrangles, hexaedres et pentaedres) .
52 c . . . . -2 : non-conforme avec au maximum 1 arete .
53 c . . . . decoupee en 2 (boite pour les .
54 c . . . . quadrangles, hexaedres et pentaedres) .
55 c . niveau . e . 1 . niveau en cours d'examen .
56 c . decare . es . nbarto . decisions des aretes .
57 c . decfac . es . -nbquto. decision sur les faces (quad. + tri.) .
59 c . hetare . e . nbarto . historique de l'etat des aretes .
60 c . filare . e . nbarto . premiere fille des aretes .
61 c . arehom . e . nbarto . ensemble des aretes homologues .
62 c . hettri . e . nbtrto . historique de l'etat des triangles .
63 c . aretri . e . nbtrto . numeros des 3 aretes des triangles .
64 c . filtri . e . nbtrto . premier fils des triangles .
65 c . nivtri . e . nbtrto . niveau des triangles .
66 c . homtri . e . nbtrto . ensemble des triangles homologues .
67 c . voltri . e .2*nbtrto. numeros des 2 volumes par triangle .
68 c . . . . voltri(i,k) definit le i-eme voisin de k .
69 c . . . . 0 : pas de voisin .
70 c . . . . j>0 : tetraedre j .
71 c . . . . j<0 : pyramide/pentaedre dans pypetr(1/2,j).
72 c . pypetr . e .2*lgpype. pypetr(1,j) = numero de la pyramide voisine.
73 c . . . . du triangle k tel que voltri(1/2,k) = -j .
74 c . . . . pypetr(2,j) = numero du pentaedre voisin .
75 c . . . . du triangle k tel que voltri(1/2,k) = -j .
76 c . hetqua . e . nbquto . historique de l'etat des quadrangles .
77 c . arequa . e . nbquto . numeros des 4 aretes des quadrangles .
78 c . filqua . e . nbquto . premier fils des quadrangles .
79 c . nivqua . e . nbquto . niveau des quadrangles .
80 c . quahom . e . nbquto . ensemble des quadrangles homologues .
81 c . volqua . e .2*nbquto. numeros des 2 volumes par quadrangle .
82 c . . . . volqua(i,k) definit le i-eme voisin de k .
83 c . . . . 0 : pas de voisin .
84 c . . . . j>0 : hexaedre j .
85 c . . . . j<0 : pyramide/pentaedre dans pypequ(1/2,j).
86 c . pypequ . e .2*lgpype. pypequ(1,j) = numero de la pyramide voisine.
87 c . . . . du quadrangle k tel que volqua(1/2,k) = -j .
88 c . . . . pypequ(2,j) = numero du pentaedre voisin .
89 c . . . . du quadrangle k tel que volqua(1/2,k) = -j .
90 c . tritet . e .nbtecf*4. numeros des 4 triangles des tetraedres .
91 c . quahex . e .nbhecf*6. numeros des 6 quadrangles des hexaedres .
92 c . coquhe . e .nbhecf*6. codes des 6 quadrangles des hexaedres .
93 c . facpyr . e .nbpycf*5. numeros des 5 faces des pyramides .
94 c . cofapy . e .nbpycf*5. codes des faces des pyramides .
95 c . facpen . e .nbpecf*5. numeros des faces des pentaedres .
96 c . cofape . e .nbpecf*5. code des 5 faces des pentaedres .
97 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
98 c . langue . e . 1 . langue des messages .
99 c . . . . 1 : francais, 2 : anglais .
100 c . codret . es . 1 . code de retour des modules .
101 c . . . . 0 : pas de probleme .
102 c ______________________________________________________________________
105 c 0. declarations et dimensionnement
108 c 0.1. ==> generalites
114 parameter ( nompro = 'DERCO5' )
133 integer decare(0:nbarto)
134 integer decfac(-nbquto:nbtrto)
135 integer hetare(nbarto), filare(nbarto)
136 integer arehom(nbarto)
137 integer hettri(nbtrto), aretri(nbtrto,3), filtri(nbtrto)
138 integer nivtri(nbtrto), homtri(nbtrto)
139 integer voltri(2,nbtrto), pypetr(2,*)
140 integer hetqua(nbquto), arequa(nbquto,4), filqua(nbquto)
141 integer nivqua(nbquto), quahom(nbquto)
142 integer volqua(2,nbquto), pypequ(2,*)
143 integer tritet(nbtecf,4)
144 integer quahex(nbhecf,6), coquhe(nbhecf,6)
145 integer facpyr(nbpycf,5), cofapy(nbpycf,5)
146 integer facpen(nbpecf,5), cofape(nbpecf,5)
148 integer ulsort, langue, codret
150 c 0.4. ==> variables locales
152 integer iaux, jaux, kaux
154 integer laface, lafac2
157 integer nbaret, listar(12), nbface, listfa(12)
158 cgn integer nbareh, listah(4)
159 integer nbvolu, listvo(2), typevo(2)
160 integer nbvotr, nbvoqu, nbvoto
165 parameter ( nbmess = 30 )
166 character*80 texte(nblang,nbmess)
168 c 0.5. ==> initialisations
169 c ______________________________________________________________________
177 #ifdef _DEBUG_HOMARD_
178 write (ulsort,texte(langue,1)) 'Entree', nompro
184 #ifdef _DEBUG_HOMARD_
185 write (ulsort,90002) 'tyconf', tyconf
190 #ifdef _DEBUG_HOMARD_
191 write (ulsort,texte(langue,12)) niveau
194 #ifdef _DEBUG_HOMARD_
195 write (ulsort,*) 'entree de ',nompro
196 do 1105 , iaux = 1 , -nbquto
197 write (ulsort,90001) 'decision quadrangle', iaux,decfac(-iaux)
198 cgn write (ulsort,90001) 'quadrangle', iaux,
199 cgn > arequa(iaux,1), arequa(iaux,2),
200 cgn > arequa(iaux,3), arequa(iaux,4)
202 if ( nbquto.gt.0 ) then
203 iaux = min(nbquto,12)
204 write (ulsort,90001) 'quadrangle', iaux,
205 > arequa(iaux,1), arequa(iaux,2),
206 > arequa(iaux,3), arequa(iaux,4)
207 write (ulsort,90001) 'quadrangle', iaux,
208 > decare(arequa(iaux,1)), decare(arequa(iaux,2)),
209 > decare(arequa(iaux,3)), decare(arequa(iaux,4)), decfac(-iaux)
210 iaux = min(nbquto,10)
211 write (ulsort,90001) 'quadrangle', iaux,
212 > arequa(iaux,1), arequa(iaux,2),
213 > arequa(iaux,3), arequa(iaux,4)
214 write (ulsort,90001) 'quadrangle', iaux,
215 > decare(arequa(iaux,1)), decare(arequa(iaux,2)),
216 > decare(arequa(iaux,3)), decare(arequa(iaux,4)), decfac(-iaux)
217 iaux = min(nbquto,19)
218 write (ulsort,90001) 'quadrangle', iaux,
219 > arequa(iaux,1), arequa(iaux,2),
220 > arequa(iaux,3), arequa(iaux,4)
221 write (ulsort,90001) 'quadrangle', iaux,
222 > decare(arequa(iaux,1)), decare(arequa(iaux,2)),
223 > decare(arequa(iaux,3)), decare(arequa(iaux,4)), decfac(-iaux)
229 nbvoto = nbteto + nbpyto + nbheto + nbpeto
231 c nombre maximum de volumes par triangle ou quadrangle
233 if ( nbteto.eq.0 .and. nbpyto.eq.0 .and. nbpeto.eq.0 ) then
239 if ( nbheto.eq.0 .and. nbpyto.eq.0 .and. nbpeto.eq.0 ) then
246 c 2. Application de la regle des ecarts de niveau aux faces
249 do 2 , laface = -nbquto , nbtrto
250 cgn print *,'debut boucle 2 : decfac(',laface,') :',decfac(laface)
252 c 2.1. ==> On s'interesse aux faces du niveau courant :
254 c ou . inactives a garder et bord de volume
255 c ou . inactives a reactiver
257 if ( laface.gt.0 ) then
259 if ( nivtri(laface).eq.niveau ) then
260 etat = mod( hettri(laface) , 10 )
261 cgn write (ulsort,texte(langue,29))'Triangle', laface,
262 cgn > nivtri(laface), hettri(laface), decfac(laface)
267 elseif ( laface.lt.0 ) then
270 if ( nivqua(iaux).eq.niveau ) then
271 etat = mod( hetqua(iaux) , 100 )
272 cgn write (ulsort,texte(langue,29))'Quadrangle', -laface,
273 cgn > nivqua(-laface), hetqua(-laface), decfac(laface)
285 if ( etat.eq.0 ) then
286 if ( decfac(laface).eq.0 ) then
289 elseif ( etat.eq.4 .or.
290 > etat.eq.6 .or. etat.eq.7 .or. etat.eq.8 ) then
291 if ( decfac(laface).eq.0 .and. nbvoto.gt.0 ) then
293 elseif ( decfac(laface).eq.-1 ) then
294 if ( nbvoto.eq.0 ) then
301 cgn write (ulsort,*) 'Face', laface, ', afaire = ', afaire
303 c 2.2. ==> Liste des aretes de la face
305 if ( afaire.gt.0 ) then
307 if ( laface.gt.0 ) then
309 do 221 , iarelo = 1 , nbaret
310 listar(iarelo) = aretri(laface,iarelo)
315 do 222 , iarelo = 1 , nbaret
316 listar(iarelo) = arequa(iaux,iarelo)
320 #ifdef _DEBUG_HOMARD_
322 write (ulsort,texte(langue,15))
326 c 2.3. ==> Cas du raffinement a propager par voisinage
328 if ( afaire.eq.1 ) then
330 c 2.3.1. ==> Decompte des aretes coupees en 2 avec une fille a couper :
331 c . celles d'etat > 0
332 c . et avec une fille de decision > 0
333 c S'il n'y en a pas, rien n'est a faire
336 do 231, iaux = 1 , nbaret
337 larete = listar(iaux)
338 cgn print *,'.... arete possible', larete
339 if ( mod(hetare(larete),10).gt.0 ) then
340 jaux = filare(larete)
341 if ( decare(jaux).gt.0 .or. decare(jaux+1).gt.0 ) then
347 c 2.3.2. ==> Propagation du raffinement sur la face et ses
350 if ( kaux.gt.0 ) then
355 #ifdef _DEBUG_HOMARD_
356 write (ulsort,texte(langue,30))'decfac', laface,decfac(laface),' '
358 do 232 , iaux = 1 , nbaret
359 larete = listar(iaux)
360 if ( decare(larete).eq.0 ) then
361 if ( mod(hetare(larete),10).eq.0 ) then
363 #ifdef _DEBUG_HOMARD_
364 write (ulsort,texte(langue,30))' decare',larete,decare(larete),' '
366 cgn if ( arehom(larete).ne.0 ) then
367 cgn nbareh = nbareh + 1
368 cgn listah(nbareh) = abs( arehom(larete) )
373 cgn write (ulsort,1000) nbareh,' aretes :',
374 cgn > (listah(iaux),iaux=1,nbareh)
375 cgn 1000 format(i2,a,12i5)
381 c 2.4. ==> Cas du deraffinement a inhiber par voisinage
383 if ( afaire.eq.2 .or. afaire.eq.4 ) then
385 c 2.4.1. ==> Decompte des aretes coupees en 2 avec une fille coupee
386 c qui ne reapparait pas
387 c S'il n'y en a pas, rien n'est a faire
390 do 241, iaux = 1 , nbaret
391 larete = listar(iaux)
392 cgn write (ulsort,*) larete, decare(larete)
393 jaux = filare(larete)
394 if ( decare(jaux).gt.0 .or. decare(jaux+1).gt.0 ) then
399 c 2.4.2. ==> Inhibition du raffinement sur la face et ses aretes
401 if ( kaux.gt.0 ) then
406 #ifdef _DEBUG_HOMARD_
407 write (ulsort,texte(langue,30))'decfac', laface,decfac(laface),' '
409 do 242 , iaux = 1 , nbaret
410 larete = listar(iaux)
411 if ( decare(larete).eq.-1 ) then
413 #ifdef _DEBUG_HOMARD_
414 write (ulsort,texte(langue,30))' decare',larete,decare(larete),' '
416 cgn if ( arehom(larete).ne.0 ) then
417 cgn nbareh = nbareh + 1
418 cgn listah(nbareh) = abs( arehom(larete) )
422 cgn write (ulsort,1000) nbareh,' aretes :',
423 cgn > (listah(iaux),iaux=1,nbareh)
429 c 2.5. ==> Cas du raffinement a propager ou du deraffinement a inhiber
430 c par l'interieur de volumes
432 if ( afaire.ge.3 ) then
434 c 2.5.1. ==> Pour chaque face, on regarde si une arete tracee sur
435 c la face va etre coupee.
436 c . Pour un triangle, ces aretes sont celles qui definissent
437 c la fille face centrale (cf. cmrdtr)
438 c . Pour un quadrangle, ces aretes sont la 2eme et le 3eme
439 c du premier et du troisieme fils (cf. cmrdqu)
440 c S'il n'y en a pas, rien n'est a faire
444 if ( laface.gt.0 ) then
445 jaux = filtri(laface)
447 do 2511 , iarelo = 1 , nbaret
448 listar(iarelo) = aretri(jaux,iarelo)
451 jaux = filqua(-laface)
453 listar(1) = arequa(jaux ,2)
454 listar(2) = arequa(jaux ,3)
455 listar(3) = arequa(jaux+2,2)
456 listar(4) = arequa(jaux+2,3)
459 do 2513 , iarelo = 1 , nbaret
460 cgn write (ulsort,*) 'hetare, decare(',listar(iarelo),') =',
461 cgn >hetare(listar(iarelo)), decare(listar(iarelo))
462 if ( decare(listar(iarelo)).gt.0 ) then
466 cgn write (ulsort,*)' kaux', kaux
468 c 2.5.2. ==> La face retenue borde-t-elle un volume ?
472 if ( kaux.gt.0 ) then
474 if ( laface.gt.0 ) then
476 do 2521, iaux = 1 , nbvotr
477 jaux = voltri(iaux,laface)
478 if ( jaux.gt.0 ) then
480 listvo(nbvolu) = jaux
482 elseif ( jaux.lt.0 ) then
483 if ( pypetr(1,-jaux).ne.0 ) then
485 listvo(nbvolu) = pypetr(1,-jaux)
488 if ( pypetr(2,-jaux).ne.0 ) then
490 listvo(nbvolu) = pypetr(2,-jaux)
498 do 2522, iaux = 1 , nbvoqu
499 jaux = volqua(iaux,-laface)
500 if ( jaux.gt.0 ) then
502 listvo(nbvolu) = jaux
504 elseif ( jaux.lt.0 ) then
505 if ( pypequ(1,-jaux).ne.0 ) then
507 listvo(nbvolu) = pypequ(1,-jaux)
510 if ( pypequ(2,-jaux).ne.0 ) then
512 listvo(nbvolu) = pypequ(2,-jaux)
519 cgn write (ulsort,*)nbvolu,'volumes', (listvo(iaux),iaux=1,nbvolu)
520 cgn write (ulsort,*)nbvolu,'types ', (typevo(iaux),iaux=1,nbvolu)
524 c 2.5.3. ==> Une des aretes tracees sur laface sera coupee. Il faut que
525 c le ou les volumes s'appuyant sur laface soient coupes
527 if ( nbvolu.gt.0 ) then
529 c 2.5.3. ==> Recherche des faces concernees
532 do 2531 , iaux = 1 , nbvolu
534 cgn write (ulsort,*)'Volume', jaux,' de type',typevo(iaux)
535 if ( typevo(iaux).eq.3 ) then
536 do 25311 , kaux = 1 , 4
538 listfa(nbface) = tritet(jaux,kaux)
540 elseif ( typevo(iaux).eq.5 ) then
541 listfa(1) = facpyr(jaux,1)
542 listfa(2) = facpyr(jaux,2)
543 listfa(3) = facpyr(jaux,3)
544 listfa(4) = facpyr(jaux,4)
545 listfa(5) = -facpyr(jaux,5)
547 elseif ( typevo(iaux).eq.6 ) then
548 do 25313 , kaux = 1 , 6
550 listfa(nbface) = -quahex(jaux,kaux)
552 elseif ( typevo(iaux).eq.7 ) then
553 listfa(1) = facpen(jaux,1)
554 listfa(2) = facpen(jaux,2)
555 listfa(3) = -facpen(jaux,3)
556 listfa(4) = -facpen(jaux,4)
557 listfa(5) = -facpen(jaux,5)
561 cgn write (ulsort,1000)nbface,' faces :',
562 cgn > (listfa(iaux),iaux=1,nbface)
563 cgn 1000 format(i2,a,12i5)
565 do 2532 , iaux = 1 , nbface
567 lafac2 = listfa(iaux)
568 cgn if ( lafac2.gt.0 ) then
569 cgn write (ulsort,texte(langue,29))'Triangle', lafac2,
570 cgn > nivtri(lafac2), hettri(lafac2), decfac(lafac2)
572 cgn write (ulsort,texte(langue,29))'Quadrangle', -lafac2,
573 cgn > nivqua(-lafac2), hetqua(-lafac2), decfac(lafac2)
575 if ( decfac(lafac2).eq.-1 ) then
577 #ifdef _DEBUG_HOMARD_
578 write (ulsort,texte(langue,30))'decfac', lafac2,decfac(lafac2),' '
580 elseif ( decfac(lafac2).eq.0 ) then
581 if ( lafac2.gt.0 ) then
582 if ( mod(hettri(lafac2),10).eq.0 ) then
584 #ifdef _DEBUG_HOMARD_
585 write (ulsort,texte(langue,30))'decfac', lafac2,decfac(lafac2),' '
589 if ( mod(hetqua(-lafac2),100).eq.0 ) then
591 #ifdef _DEBUG_HOMARD_
592 write (ulsort,texte(langue,30))'decfac', lafac2,decfac(lafac2),' '
598 if ( lafac2.gt.0 ) then
600 do 2533 , iarelo = 1 , nbaret
601 listar(iarelo) = aretri(lafac2,iarelo)
605 do 2534 , iarelo = 1 , nbaret
606 listar(iarelo) = arequa(-lafac2,iarelo)
610 do 2535 , jaux = 1 , nbaret
611 larete = listar(jaux)
612 if ( decare(larete).eq.0 ) then
613 if ( mod(hetare(larete),10).eq.0 ) then
615 #ifdef _DEBUG_HOMARD_
616 write (ulsort,texte(langue,30))' decare',larete,decare(larete),' '
618 if ( arehom(larete).ne.0 ) then
619 decare(abs(arehom(larete))) = 2
620 #ifdef _DEBUG_HOMARD_
621 write (ulsort,texte(langue,30))' decare',
622 > abs(arehom(larete)),decare(abs(arehom(larete))),' '
626 elseif ( decare(larete).eq.-1 ) then
628 #ifdef _DEBUG_HOMARD_
629 write (ulsort,texte(langue,30))' decare',larete,decare(larete),' '
631 if ( arehom(larete).ne.0 ) then
632 decare(abs(arehom(larete))) = 0
633 #ifdef _DEBUG_HOMARD_
634 write (ulsort,texte(langue,30))' decare',
635 > abs(arehom(larete)),decare(abs(arehom(larete))),' '
650 c 3. Transfert via les volumes ayant des quadrangles comme faces
651 c Si une fille de l'une de ses aretes est a couper, le volume
652 c doit l'etre entierement : on le declare par ses aretes.
655 if ( tyconf.eq.0 ) then
657 if ( codret.eq.0 ) then
659 #ifdef _DEBUG_HOMARD_
660 write (ulsort,texte(langue,3)) 'DERCO9', nompro
662 call derco9 ( niveau,
670 > ulsort, langue, codret )
676 #ifdef _DEBUG_HOMARD_
677 write (ulsort,*) 'sortie de ',nompro
678 do 1106 , iaux = 1 , nbquto
679 write (ulsort,90001) 'decision quadrangle', iaux,decfac(-iaux)
680 cgn write (ulsort,90001) 'quadrangle', iaux,
681 cgn > arequa(iaux,1), arequa(iaux,2),
682 cgn > arequa(iaux,3), arequa(iaux,4)
684 if ( nbquto.gt.0 ) then
685 iaux = min(nbquto,12)
686 write (ulsort,90001) 'quadrangle', iaux,
687 > arequa(iaux,1), arequa(iaux,2),
688 > arequa(iaux,3), arequa(iaux,4)
689 write (ulsort,90001) 'quadrangle', iaux,
690 > decare(arequa(iaux,1)), decare(arequa(iaux,2)),
691 > decare(arequa(iaux,3)), decare(arequa(iaux,4)), decfac(-iaux)
692 iaux = min(nbquto,10)
693 write (ulsort,90001) 'quadrangle', iaux,
694 > arequa(iaux,1), arequa(iaux,2),
695 > arequa(iaux,3), arequa(iaux,4)
696 write (ulsort,90001) 'quadrangle', iaux,
697 > decare(arequa(iaux,1)), decare(arequa(iaux,2)),
698 > decare(arequa(iaux,3)), decare(arequa(iaux,4)), decfac(-iaux)
699 iaux = min(nbquto,19)
700 write (ulsort,90001) 'quadrangle', iaux,
701 > arequa(iaux,1), arequa(iaux,2),
702 > arequa(iaux,3), arequa(iaux,4)
703 write (ulsort,90001) 'quadrangle', iaux,
704 > decare(arequa(iaux,1)), decare(arequa(iaux,2)),
705 > decare(arequa(iaux,3)), decare(arequa(iaux,4)), decfac(-iaux)
713 if ( codret.ne.0 ) then
717 write (ulsort,texte(langue,1)) 'Sortie', nompro
718 write (ulsort,texte(langue,2)) codret
722 #ifdef _DEBUG_HOMARD_
723 write (ulsort,texte(langue,1)) 'Sortie', nompro