1 subroutine utb11c ( nbbloc, option, tabau4,
10 > lapile, tabau2, tabau3,
14 > ulsort, langue, codret )
15 c ______________________________________________________________________
19 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
21 c Version originale enregistree le 18 juin 1996 sous le numero 96036
22 c aupres des huissiers de justice Simart et Lavoir a Clamart
23 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
24 c aupres des huissiers de justice
25 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
27 c HOMARD est une marque deposee d'Electricite de France
33 c ______________________________________________________________________
35 c UTilitaire - Bilan sur le maillage - option 11 - phase c
37 c ______________________________________________________________________
39 c analyse de la connexite des faces
40 c ______________________________________________________________________
42 c . nom . e/s . taille . description .
43 c .____________________________________________________________________.
44 c . nbbloc . s . 1 . nombre de blocs .
45 c . option . e . 1 . 0 : on prend toutes les faces .
46 c . . . . 1 : on prend les faces actives de HOMARD .
47 c . . . . 2 : on prend les faces actives du calcul .
48 c . tabau4 . e .-nbquto . indicateurs sur les faces a examiner : .
49 c . . . :nbtrto. 0 : on ne traite pas la face .
50 c . . . . >0 : on traite la face .
51 c . hetare . e . nbarto . historique de l'etat des aretes .
52 c . somare . e .2*nbarto. numeros des extremites d'arete .
53 c . hettri . e . nbtrto . historique de l'etat des triangles .
54 c . aretri . e .nbtrto*3. numeros des 3 aretes des triangles .
55 c . hetqua . e . nbquto . historique de l'etat des quadrangles .
56 c . arequa . e .nbquto*4. numeros des 4 aretes des quadrangles .
57 c . povoso . e .0:nbnoto. pointeur des voisins par noeud .
58 c . voisom . e . nvosom . aretes voisines de chaque noeud .
59 c . posifa . e .0:nbarto. pointeur sur tableau facare .
60 c . facare . e . nbfaar . liste des faces contenant une arete .
61 c . famare . e . nbarto . famille des aretes .
62 c . cfaare . e . nctfar*. codes des familles des aretes .
63 c . . . nbfare . 1 : famille MED .
64 c . . . . 2 : type de segment .
65 c . . . . 3 : orientation .
66 c . . . . 4 : famille d'orientation inverse .
67 c . . . . 5 : numero de ligne de frontiere .
68 c . . . . > 0 si concernee par le suivi de frontiere.
69 c . . . . <= 0 si non concernee .
70 c . . . . 6 : famille frontiere active/inactive .
71 c . . . . 7 : numero de surface de frontiere .
72 c . . . . + l : appartenance a l'equivalence l .
73 c . famtri . e . nbtrto . famille des triangles .
74 c . cfatri . e . nctftr*. codes des familles des triangles .
75 c . . . nbftri . 1 : famille MED .
76 c . . . . 2 : type de triangle .
77 c . . . . 3 : numero de surface de frontiere .
78 c . . . . 4 : famille des aretes internes apres raf.
79 c . . . . + l : appartenance a l'equivalence l .
80 c . famqua . e . nbquto . famille des quadrangles .
81 c . cfaqua . e . nctfqu*. codes des familles des quadrangles .
82 c . . . nbfqua . 1 : famille MED .
83 c . . . . 2 : type de quadrangle .
84 c . . . . 3 : numero de surface de frontiere .
85 c . . . . 4 : famille des aretes internes apres raf.
86 c . . . . 5 : famille des triangles de conformite .
87 c . . . . 6 : famille de sf active/inactive .
88 c . . . . + l : appartenance a l'equivalence l .
89 c . lapile . a . * . tableau de travail .
90 c . tabau2 . a . nbnoto . tableau de travail .
91 c . tabau3 . a . nbarto . tableau de travail .
92 c . taba15 . a . nbarto . tableau de travail .
93 c . taba16 . a . * . tableau de travail .
94 c . nublfa . s .-nbquto . numero du bloc pour chaque face .
96 c . ulbila . e . 1 . unite logique d'ecriture du bilan .
97 c . . . . si 0 : on n'ecrit rien .
98 c . ulsort . e . 1 . unite logique de la sortie generale .
99 c . langue . e . 1 . langue des messages .
100 c . . . . 1 : francais, 2 : anglais .
101 c . codret . s . 1 . code de retour des modules .
102 c . . . . 0 : pas de probleme .
103 c . . . . 1 : probleme .
104 c .____________________________________________________________________.
107 c 0. declarations et dimensionnement
110 c 0.1. ==> generalites
116 parameter ( nompro = 'UTB11C' )
135 integer nbbloc, option
136 integer tabau4(-nbquto:*)
137 integer hetare(nbarto), somare(2,nbarto)
138 integer hettri(nbtrto), aretri(nbtrto,3)
139 integer hetqua(nbquto), arequa(nbquto,4)
140 integer povoso(0:nbnoto), voisom(*)
141 integer posifa(0:nbarto), facare(nbfaar)
143 integer famare(nbarto), cfaare(nctfar,nbfare)
144 integer famtri(nbtrto), cfatri(nctftr,nbftri)
145 integer famqua(nbquto), cfaqua(nctfqu,nbfqua)
148 integer tabau2(nbnoto)
149 integer tabau3(nbarto)
150 integer taba15(nbarto)
152 integer nublfa(-nbquto:*)
155 integer ulsort, langue, codret
157 c 0.4. ==> variables locales
159 integer iaux, jaux, kaux, laux, maux, ldeb, lfin
161 integer laface, typfa0, typfac
163 integer elem, lgpile, nbaret
167 parameter (nbmess = 10 )
168 character*80 texte(nblang,nbmess)
170 c 0.5. ==> initialisations
171 c ______________________________________________________________________
179 #ifdef _DEBUG_HOMARD_
180 write (ulsort,texte(langue,1)) 'Entree', nompro
184 texte(1,4) = '(/,3x,''. Connexite des '',a)'
185 texte(1,5) = '(''.. Impression du bloc'',i8)'
187 texte(2,4) = '(/,3x,''. Connexity of '',a)'
188 texte(2,5) = '(''.. Printing of block #'',i8)'
192 if ( nbtrac.eq.0 ) then
194 elseif ( nbquac.eq.0 ) then
200 #ifdef _DEBUG_HOMARD_
201 write (ulsort,texte(langue,4)) mess14(langue,3,typfa0)
202 write (ulsort,90002) 'option', option
205 c 1.3. ==> Aucun bloc au depart
207 cgn write (ulsort,90002) 'nbquto', nbquto
208 cgn write (ulsort,90002) 'nbtrto', nbtrto
209 do 13 , iaux = -nbquto , nbtrto
219 #ifdef _DEBUG_HOMARD_
220 write (ulsort,90002) '2. blocs de faces ; codret =', codret
226 do 22 , laface = -nbquto , nbtrto
228 #ifdef _DEBUG_HOMARD_
229 if ( laface.ne.0 ) then
230 write (ulsort,90015) 'Debut boucle 22, avant le bloc',nbbloc+1,
231 >', laface = ', laface, tabau4(laface)
234 c On examine les faces presentes dans la liste transmise
236 if ( tabau4(laface).eq.1 ) then
238 c On examine les faces qui ne sont pas deja dans un bloc
240 if ( nublfa(laface).eq.0 ) then
242 #ifdef _DEBUG_HOMARD_
243 if ( laface.gt.0 ) then
244 write (ulsort,90015) 'etat = ', hettri(laface),
245 > ', type =',cfatri(cotyel,famtri(laface))
246 elseif ( laface.lt.0 ) then
247 write (ulsort,90015) 'etat = ', hetqua(-laface),
248 > ', type =',cfaqua(cotyel,famqua(-laface))
252 if ( option.gt.0 ) then
255 if ( laface.gt.0 ) then
256 etat = mod( hettri(laface) , 10 )
257 #ifdef _DEBUG_HOMARD_
258 write (ulsort,90015) 'etat = ', etat,
259 > ', type =',cfatri(cotyel,famtri(laface))
261 if ( option.gt.1 ) then
262 if ( cfatri(cotyel,famtri(laface)).eq.0 ) then
266 elseif ( laface.lt.0 ) then
267 etat = mod( hetqua(-laface) , 100 )
268 #ifdef _DEBUG_HOMARD_
269 write (ulsort,90015) 'etat = ', etat,
270 > ', type =',cfaqua(cotyel,famqua(-laface))
272 if ( option.gt.1 ) then
273 if ( cfaqua(cotyel,famqua(-laface)).eq.0 ) then
285 if ( etat.eq.0 ) then
287 c 2.1. ==> on commence un nouveau bloc :
288 c 2.1.1. ==> impression des caracteristiques du bloc precedent
290 if ( ulbila.gt.0 .and. nbbloc.ge.1 ) then
292 c 2.1.1.1. ==> recherche des aretes actives de ce bloc
294 if ( codret.eq.0 ) then
297 #ifdef _DEBUG_HOMARD_
298 write (ulsort,texte(langue,3)) 'UTB11E', nompro
300 call utb11e ( iaux, nbbloc, nublfa,
303 > tbiaux, tbiaux, tbiaux, tbiaux,
304 > jaux, jaux, jaux, jaux,
306 > ulsort, langue, codret )
310 c 2.1.1.2. ==> recherche des blocs d'aretes actives de ce bloc
312 if ( codret.eq.0 ) then
316 #ifdef _DEBUG_HOMARD_
317 write (ulsort,texte(langue,3)) 'UTB11D', nompro
319 call utb11d ( nbblar, iaux, tabau3,
326 > ulsort, langue, codret )
330 c 2.1.1.3. ==> impression veritable
332 if ( codret.eq.0 ) then
334 #ifdef _DEBUG_HOMARD_
335 write (ulsort,texte(langue,5)) nbbloc
339 #ifdef _DEBUG_HOMARD_
340 write (ulsort,texte(langue,3)) 'UTB11F', nompro
342 call utb11f ( nbbloc, nbblar, typfa0, typfac,
343 > nublfa, tabau2, tabau3, tabau4,
345 > ulsort, langue, codret )
351 c 2.1.2. ==> initialisations
355 #ifdef _DEBUG_HOMARD_
356 write (ulsort,90015) 'debut du bloc',nbbloc,' avec elem = ', elem
359 do 2121 , iaux = 1 , nbnoto
362 do 2122 , iaux = 1 , nbarto
370 #ifdef _DEBUG_HOMARD_
371 write (ulsort,90015) 'bloc ',nbbloc,' avec elem = ', elem
374 c 2.2. ==> memorisation du bloc pour l'element courant
376 nublfa(elem) = nbbloc
377 cgn print *,'elem,nbbloc ',elem, nbbloc
379 if ( elem.lt.0 ) then
380 if ( typfac.eq.0 ) then
382 elseif ( typfac.ne.4 ) then
386 if ( typfac.eq.0 ) then
388 elseif ( typfac.ne.2 ) then
393 c 2.3. ==> mise des voisins dans la pile
395 if ( elem.gt.0 ) then
401 do 222 , iaux = 1 , nbaret
403 c 2.3.1. ==> reperage des voisins de elem par sa iaux-ieme arete
405 if ( elem.gt.0 ) then
406 jaux = aretri(elem,iaux)
408 jaux = arequa(-elem,iaux)
410 tabau3(jaux) = tabau3(jaux) + 1
411 kaux = somare(1,jaux)
412 tabau2(kaux) = tabau2(kaux) + 1
413 kaux = somare(2,jaux)
414 tabau2(kaux) = tabau2(kaux) + 1
415 ldeb = posifa(jaux-1)+1
418 c 2.3.2. ==> examen des voisins qui ne sont pas deja dans un bloc
419 c et qui font partie de la liste
421 do 2221 , laux = ldeb, lfin
424 if ( nublfa(kaux).eq.0 ) then
426 if ( tabau4(kaux).eq.1 ) then
427 if ( option.gt.0 ) then
429 if ( kaux.gt.0 ) then
430 etat = mod( hettri(kaux) , 10 )
431 cgn write (ulsort,*) kaux,' : etat = ', etat,
432 cgn > ', type =',cfatri(cotyel,famtri(kaux))
433 if ( option.gt.1 ) then
434 if ( cfatri(cotyel,famtri(kaux)).eq.0 ) then
439 etat = mod( hetqua(-kaux) , 100 )
440 cgn write (ulsort,*) kaux,' : etat = ', etat,
441 cgn > ', type =',cfaqua(cotyel,famqua(-kaux))
442 if ( option.gt.1 ) then
443 if ( cfaqua(cotyel,famqua(-kaux)).eq.0 ) then
451 cgn print *,'==> etat ',etat
452 if ( etat.eq.0 ) then
453 do 2222 , maux = 1 , lgpile
454 if ( lapile(maux).eq.kaux ) then
458 cgn write (ulsort,*) '==> ajout de', kaux
460 lapile(lgpile) = kaux
461 #ifdef _DEBUG_HOMARD_
462 cgn write (ulsort,1789) (lapile(maux), maux = 1 , lgpile)
463 cgn 1789 format(10i5)
474 c 2.4. ==> on passe a l'element suivant de la pile
476 if ( lgpile.gt.0 ) then
478 elem = lapile(lgpile)
483 #ifdef _DEBUG_HOMARD_
484 write (ulsort,90002) 'fin du bloc', nbbloc
485 write (ulsort,*) 'tabau2 (noeuds)'
486 write (ulsort,91040) (tabau2(iaux), iaux=1,min(20,nbnoto))
487 write (ulsort,*) 'tabau3 (aretes)'
488 write (ulsort,91040) (tabau3(iaux), iaux=1,min(20,nbarto))
489 c write (ulsort,91040) (tabau3(iaux), iaux=1,min(20000,nbarto))
494 c 2.5. ==> on continue la liste des faces en prevision d'un eventuel
504 c 3. impression du dernier bloc
506 #ifdef _DEBUG_HOMARD_
507 write(ulsort,90002) '3. impression dernier bloc ; codret', codret
510 if ( codret.eq.0 ) then
512 if ( ulbila.gt.0 .and. nbbloc.gt.0 ) then
514 c 3.1. ==> recherche des aretes actives de ce bloc
516 if ( codret.eq.0 ) then
519 #ifdef _DEBUG_HOMARD_
520 write (ulsort,texte(langue,3)) 'UTB11E', nompro
522 call utb11e ( iaux, nbbloc, nublfa,
525 > tbiaux, tbiaux, tbiaux, tbiaux,
526 > jaux, jaux, jaux, jaux,
528 > ulsort, langue, codret )
532 c 3.2. ==> recherche des blocs d'aretes actives de ce bloc
534 if ( codret.eq.0 ) then
538 #ifdef _DEBUG_HOMARD_
539 write (ulsort,texte(langue,3)) 'UTB11D', nompro
541 call utb11d ( nbblar, iaux, tabau3,
548 > ulsort, langue, codret )
552 c 3.3. ==> impression veritable
554 if ( codret.eq.0 ) then
556 #ifdef _DEBUG_HOMARD_
557 write (ulsort,texte(langue,5)) nbbloc
560 if ( nbbloc.eq.1 ) then
565 #ifdef _DEBUG_HOMARD_
566 write (ulsort,texte(langue,3)) 'UTB11F', nompro
568 call utb11f ( iaux, nbblar, typfa0, typfac,
569 > nublfa, tabau2, tabau3, tabau4,
571 > ulsort, langue, codret )
574 3000 format(5x,58('*'))
586 if ( codret.ne.0 ) then
590 write (ulsort,texte(langue,1)) 'Sortie', nompro
591 write (ulsort,texte(langue,2)) codret
595 #ifdef _DEBUG_HOMARD_
596 write (ulsort,texte(langue,1)) 'Sortie', nompro