1 subroutine utb17c ( somare, np2are,
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 UTilitaire - Bilan sur le maillage - option 17 - phase c
35 c ______________________________________________________________________
37 c Diagnostic des elements surfaciques du calcul
38 c ______________________________________________________________________
40 c . nom . e/s . taille . description .
41 c .____________________________________________________________________.
42 c . somare . e .2*nbarto. numeros des extremites d'arete .
43 c . np2are . e . nbarto . numero des noeuds p2 milieux d'aretes .
44 c . hettri . e . nbtrto . historique de l'etat des triangles .
45 c . aretri . e .nbtrto*3. numeros des 3 aretes des triangles .
46 c . hetqua . e . nbquto . historique de l'etat des quadrangles .
47 c . arequa . e .nbquto*4. numeros des 4 aretes des quadrangles .
48 c . voltri . e .2*nbtrto. numeros des 2 volumes par triangle .
49 c . . . . voltri(i,k) definit le i-eme voisin de k .
50 c . . . . 0 : pas de voisin .
51 c . . . . j>0 : tetraedre j .
52 c . . . . j<0 : pyramide/pentaedre dans pypetr(1/2,j).
53 c . volqua . e .2*nbquto. numeros des 2 volumes par quadrangle .
54 c . . . . volqua(i,k) definit le i-eme voisin de k .
55 c . . . . 0 : pas de voisin .
56 c . . . . j>0 : hexaedre j .
57 c . . . . j<0 : pyramide/pentaedre dans pypequ(1/2,j).
58 c . posifa . e .0:nbarto. pointeur sur tableau facare .
59 c . facare . e . nbfaar . liste des faces contenant une arete .
60 c . famare . e . nbarto . famille des aretes .
61 c . cfaare . e . nctfar*. codes des familles des aretes .
62 c . . . nbfare . 1 : famille MED .
63 c . . . . 2 : type de segment .
64 c . . . . 3 : orientation .
65 c . . . . 4 : famille d'orientation inverse .
66 c . . . . 5 : numero de ligne de frontiere .
67 c . . . . > 0 si concernee par le suivi de frontiere.
68 c . . . . <= 0 si non concernee .
69 c . . . . 6 : famille frontiere active/inactive .
70 c . . . . 7 : numero de surface de frontiere .
71 c . . . . + l : appartenance a l'equivalence l .
72 c . famtri . e . nbtrto . famille des triangles .
73 c . cfatri . e . nctftr*. codes des familles des triangles .
74 c . . . nbftri . 1 : famille MED .
75 c . . . . 2 : type de triangle .
76 c . . . . 3 : numero de surface de frontiere .
77 c . . . . 4 : famille des aretes internes apres raf.
78 c . . . . + l : appartenance a l'equivalence l .
79 c . famqua . e . nbquto . famille des quadrangles .
80 c . cfaqua . e . nctfqu*. codes des familles des quadrangles .
81 c . . . nbfqua . 1 : famille MED .
82 c . . . . 2 : type de quadrangle .
83 c . . . . 3 : numero de surface de frontiere .
84 c . . . . 4 : famille des aretes internes apres raf.
85 c . . . . 5 : famille des triangles de conformite .
86 c . . . . 6 : famille de sf active/inactive .
87 c . . . . + l : appartenance a l'equivalence l .
88 c . tabaux . e . nbnoto . 0 : le noeud est interne .
89 c . . . . 1 : le noeud est au bord d'une face .
90 c . ulbila . e . 1 . unite logique d'ecriture du bilan .
91 c . ulsort . e . 1 . unite logique de la sortie generale .
92 c . langue . e . 1 . langue des messages .
93 c . . . . 1 : francais, 2 : anglais .
94 c . codret . s . 1 . code de retour des modules .
95 c . . . . 0 : pas de probleme .
96 c . . . . 1 : probleme .
97 c .____________________________________________________________________.
100 c 0. declarations et dimensionnement
103 c 0.1. ==> generalites
109 parameter ( nompro = 'UTB17C' )
132 integer somare(2,nbarto), np2are(nbarto)
133 integer hettri(nbtrto), aretri(nbtrto,3)
134 integer hetqua(nbquto), arequa(nbquto,4)
136 integer voltri(2,nbtrto)
137 integer volqua(2,nbquto)
138 integer posifa(0:nbarto), facare(nbfaar)
140 integer famare(nbarto), cfaare(nctfar,nbfare)
141 integer famtri(nbtrto), cfatri(nctftr,nbftri)
142 integer famqua(nbquto), cfaqua(nctfqu,nbfqua)
144 integer tabaux(nbnoto)
147 integer ulsort, langue, codret
149 c 0.4. ==> variables locales
151 integer iaux, jaux, kaux
153 integer letria, lequad, larete
155 integer nbensc, nbensb
158 integer a1, a2, a3, a4
159 integer sa1a2, sa2a3, sa3a1, sa3a4, sa4a1
166 parameter (nbmess = 10 )
167 character*80 texte(nblang,nbmess)
169 c 0.5. ==> initialisations
170 c ______________________________________________________________________
178 #ifdef _DEBUG_HOMARD_
179 write (ulsort,texte(langue,1)) 'Entree', nompro
183 texte(1,4) = '(''Nombre de '',a,'' actifs :'',i10)'
184 texte(1,5) = '(''. Examen du '',a,i10)'
185 texte(1,6) = '(''... '',a,i10,'' au bord'')'
187 >'(''. Le bord du '',a,i10,'' n''''est pas une maille de calcul.''
189 texte(1,8) = '(''. Le '',a,i8,'' est surcontraint.'')'
191 texte(2,4) = '(''Number of active '',a,'' : '',i8)'
192 texte(2,5) = '(''. Examination of '',a,''#'',i8)'
193 texte(2,6) = '(''... '',a,''#'',i8,'' on the boundary'')'
195 >'(''. The boundary of the '',a,i10,'' is not a calculation mesh.''
197 texte(2,8) = '(''. The '',a,''#'',i8,'' is overstressed.'')'
199 #ifdef _DEBUG_HOMARD_
200 write (ulsort,texte(langue,4)) mess14(langue,3,2), nbtrac
201 write (ulsort,texte(langue,4)) mess14(langue,3,4), nbquac
207 c 2. Diagnostic sur les triangles
209 #ifdef _DEBUG_HOMARD_
210 write (ulsort,*) '2. triangles, codret = ', codret
213 if ( nbtrac.gt.0 ) then
219 nbvoto = nbteto + nbpyto + nbpeto
221 do 2 , letria = 1, nbtrto
223 #ifdef _DEBUG_HOMARD_
224 write (ulsort,texte(langue,5)) mess14(langue,1,2), letria
227 if ( cfatri(cotyel,famtri(letria)).ne.0 ) then
229 etat = mod( hettri(letria),10 )
231 if ( etat.eq.0 ) then
233 c 2.0. ==> S'il y a des volumes, on ne prend que des triangles purs
235 if ( nbvoto.ne.0 ) then
237 if ( voltri(1,letria).ne.0 ) then
245 c 2.1. ==> On regarde si tous les noeuds sont sur le bord
247 a1 = aretri(letria,1)
248 a2 = aretri(letria,2)
249 a3 = aretri(letria,3)
250 call utsotr ( somare, a1, a2, a3,
251 > sa1a2, sa2a3, sa3a1 )
257 do 211 , iaux = 1 , 3
258 if ( tabaux(listso(iaux)).eq.0 ) then
262 if ( degre.eq.2 ) then
263 do 212 , iaux = 1 , 3
264 if ( tabaux(np2are(aretri(letria,iaux))).eq.0 ) then
271 #ifdef _DEBUG_HOMARD_
272 write (ulsort,texte(langue,8)) mess14(langue,1,2), letria
277 c 2.2. ==> On verifie que chaque arete au bord est un element de calcul
281 larete = aretri(letria,iaux)
282 jdeb = posifa(larete-1)+1
283 jfin = posifa(larete)
285 c 2.2.1. ==> L'arete a au plus une face voisine : elle est de bord
287 if ( jfin.le.jdeb ) then
288 cgn write (ulsort,*) 'au plus une face voisine'
292 c 2.2.2. ==> L'arete a au moins deux faces voisines : il faut compter
293 c le nombre de faces actives car avec la conformite, une
294 c face et sa fille sont declarees voisines de l'arete
299 do 222 , jaux = jdeb, jfin
300 laface = facare(jaux)
301 cgn write (ulsort,*) 'voisine de', laface
302 if ( laface.gt.0 ) then
303 etat00 = mod(hettri(laface),10)
305 etat00 = mod(hetqua(-laface),100)
307 if ( etat00.eq.0 ) then
316 if ( kaux.le.1 ) then
317 #ifdef _DEBUG_HOMARD_
318 write (ulsort,texte(langue,6)) mess14(langue,1,1), larete
322 if ( cfaare(cotyel,famare(larete)).eq.0 ) then
324 #ifdef _DEBUG_HOMARD_
325 write (ulsort,texte(langue,7)) mess14(langue,1,2), letria
342 c 2.3. ==> Impression
346 #ifdef _DEBUG_HOMARD_
347 write (ulsort,texte(langue,3)) 'UTB17E', nompro
350 call utb17e ( iaux, nbensc, aubord, nbensb,
352 > ulsort, langue, codret )
359 c 3. Diagnostic sur les quadrangles
361 #ifdef _DEBUG_HOMARD_
362 write (ulsort,*) '3. quadrangles, codret = ', codret
365 if ( nbquac.gt.0 ) then
371 nbvoto = nbheto + nbpyto + nbpeto
373 do 3 , lequad = 1, nbquto
375 #ifdef _DEBUG_HOMARD_
376 write (ulsort,texte(langue,5)) mess14(langue,1,4), lequad
379 if ( cfaqua(cotyel,famqua(lequad)).ne.0 ) then
381 etat = mod( hetqua(lequad),100 )
383 if ( etat.eq.0 ) then
385 c 3.0. ==> S'il y a des volumes, on ne prend que des quadrangles purs
387 if ( nbvoto.ne.0 ) then
389 if ( volqua(1,lequad).ne.0 ) then
397 c 3.1. ==> On regarde si tous les noeuds sont sur le bord
399 a1 = arequa(lequad,1)
400 a2 = arequa(lequad,2)
401 a3 = arequa(lequad,3)
402 a4 = arequa(lequad,4)
403 call utsoqu ( somare, a1, a2, a3, a4,
404 > sa1a2, sa2a3, sa3a4, sa4a1 )
410 do 311 , iaux = 1 , 4
411 if ( tabaux(listso(iaux)).eq.0 ) then
415 if ( degre.eq.2 ) then
416 do 312 , iaux = 1 , 4
417 if ( tabaux(np2are(arequa(lequad,iaux))).eq.0 ) then
424 #ifdef _DEBUG_HOMARD_
425 write (ulsort,texte(langue,8)) mess14(langue,1,4), lequad
430 c 3.2. ==> On verifie que chaque arete au bord est un element de calcul
434 larete = arequa(lequad,iaux)
435 jdeb = posifa(larete-1)+1
436 jfin = posifa(larete)
438 c 3.2.1. ==> L'arete a au plus une face voisine : elle est de bord
440 if ( jfin.le.jdeb ) then
441 cgn write (ulsort,*) 'au plus une face voisine'
445 c 3.2.2. ==> L'arete a au moins deux faces voisines : il faut compter
446 c le nombre de faces actives car avec la conformite, une
447 c face et sa fille sont declarees voisines de l'arete
452 do 322 , jaux = jdeb, jfin
453 laface = facare(jaux)
454 cgn write (ulsort,*) 'voisine de', laface
455 if ( laface.gt.0 ) then
456 etat00 = mod(hettri(laface),10)
458 etat00 = mod(hetqua(-laface),100)
460 if ( etat00.eq.0 ) then
469 if ( kaux.le.1 ) then
470 #ifdef _DEBUG_HOMARD_
471 write (ulsort,texte(langue,6)) mess14(langue,1,1), larete
475 if ( cfaare(cotyel,famare(larete)).eq.0 ) then
477 #ifdef _DEBUG_HOMARD_
478 write (ulsort,texte(langue,7)) mess14(langue,1,4), lequad
495 c 3.3. ==> Impression
499 #ifdef _DEBUG_HOMARD_
500 write (ulsort,texte(langue,3)) 'UTB17E', nompro
503 call utb17e ( iaux, nbensc, aubord, nbensb,
505 > ulsort, langue, codret )