1 subroutine infve5 ( typenh, nbfato, volfac, pypefa,
3 > numniv, numblo, nubnvo,
5 > ulsort, langue, codret )
6 c ______________________________________________________________________
10 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
12 c Version originale enregistree le 18 juin 1996 sous le numero 96036
13 c aupres des huissiers de justice Simart et Lavoir a Clamart
14 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
15 c aupres des huissiers de justice
16 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
18 c HOMARD est une marque deposee d'Electricite de France
24 c ______________________________________________________________________
26 c INformation : Fichier VEctoriel - 5eme partie
28 c ______________________________________________________________________
30 c . nom . e/s . taille . description .
31 c .____________________________________________________________________.
32 c . typenh . e . 1 . code des entites au sens homard .
33 c . . . . 2 : triangles .
34 c . . . . 4 : quadrangles .
35 c . nbfato . e . 1 .nombre de faces total .
36 c . volfac . e .2*nbfato. numeros des 2 volumes par face .
37 c . . . . volfac(i,k) definit le i-eme voisin de k .
38 c . . . . 0 : pas de voisin .
39 c . . . . j>0 : hexaedre/tetraedre j .
40 c . . . . j<0 : pyramide/pentaedre dans pypefa(1/2,j).
41 c . pypefa . e .2*lgpype. pypefa(1,j) = numero de la pyramide voisine.
42 c . . . . de la face k tel que volfac(1/2,k) = -j .
43 c . . . . pypefa(2,j) = numero du pentaedre voisin .
44 c . . . . de la face k tel que volfac(1/2,k) = -j .
45 c . hetfac . e . nbfato . historique de l'etat des faces .
46 c . numniv . e . 1 . numero du niveau a tracer .
47 c . . . . -1 : tous les niveaux .
48 c . numblo . e . 1 . numero du bloc a tracer .
49 c . . . . 0 : trace du domaine global .
50 c . nubnvo . e . * . . si numblo>0 : numero de blocs des volumes.
51 c . . . . . si numniv >=0 : niveau des volumes .
52 c . . . . Rangement : .
53 c . . . . les tetraedres .
54 c . . . . les hexaedres .
55 c . . . . les pyramides .
56 c . . . . les pentaedres .
57 c . tbaux2 . es .-nbquto:. tableau de travail .
59 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
60 c . langue . e . 1 . langue des messages .
61 c . . . . 1 : francais, 2 : anglais .
62 c . codret . es . 1 . code de retour des modules .
63 c . . . . 0 : pas de probleme .
64 c ______________________________________________________________________
67 c 0. declarations et dimensionnement
70 c 0.1. ==> generalites
76 parameter ( nompro = 'INFVE5' )
91 integer typenh, nbfato
92 integer volfac(2,nbfato), pypefa(2,*)
93 integer hetfac(nbfato)
94 integer numniv, numblo, nubnvo(*)
95 integer tbaux2(-nbquto:*)
97 integer ulsort, langue, codret
99 c 0.4. ==> variables locales
101 integer iaux, jaux, kaux, laux
102 integer maxtet, maxhex, maxpyr
103 integer dectet, dechex, decpyr, decpen, decvol
104 integer nument, etaent, numen2
107 parameter ( nbmess = 10 )
108 character*80 texte(nblang,nbmess)
109 c_______________________________________________________________________
118 #ifdef _DEBUG_HOMARD_
119 write (ulsort,texte(langue,1)) 'Entree', nompro
123 texte(1,4) = '(/,''Trace du domaine global'')'
124 texte(1,5) = '(/,''Examen du '',a,'' numero'',i6)'
125 texte(1,6) = '(''Trace de tous les niveaux'')'
126 texte(1,7) = '(''Trace du niveau numero'',i6)'
127 texte(1,8) = '(''Recherche des '',a,'' a tracer'')'
129 texte(2,4) = '(/,''Writings of the whole domain)'
130 texte(2,5) = '(/,''Examination of '',a,'' #'',i6)'
131 texte(2,6) = '(''Writings of all the levels'')'
132 texte(2,7) = '(''Writings for the level #'',i6)'
133 texte(2,8) = '(''Search of the '',a,'' for plotting'')'
139 #ifdef _DEBUG_HOMARD_
140 if ( numblo.eq.0 ) then
141 write (ulsort,texte(langue,4))
143 write (ulsort,texte(langue,5)) numblo
145 if ( numniv.eq.-1 ) then
146 write (ulsort,texte(langue,6))
148 write (ulsort,texte(langue,7)) numniv
150 write (ulsort,texte(langue,8)) mess14(langue,3,typenh)
156 maxtet = dectet + nbteto
158 maxhex = dechex + nbheto
160 maxpyr = decpyr + nbpyto
163 c 1.3. ==> Particularites selon le type de mailles tria/quad :
164 c . Diviseur pour trouver l'etat actif
165 c . Decalage dans la numerotation des volumes
167 if ( typenh.eq.2 ) then
176 c 2. Recherche des faces a tracer :
177 c On trace une face seulement si elle est active et
178 c . si elle appartient a une region bidimensionnelle du maillage, et
179 c si elle appartient au bloc ou au niveau retenu
180 c . si elle est une face ayant un et un seul element volumique
181 c voisin, et si ce volume appartient au bloc ou au niveau retenu
182 c . si elle est une face ayant deux elements volumiques voisins,
183 c et si un et un seul des volumes appartient au bloc ou au niveau
186 c La convention est la suivante :
187 c * tbaux2(iaux) vaut 0 si la face est d'une region 2D, du bloc ou
189 c * tbaux2(iaux) vaut 1 si la face borde un domaine volumique, du
190 c bloc ou du niveau retenu
191 c * tbaux2(iaux) vaut 2 si la face est interne a un domaine
192 c volumique, un et un seul des voisins appartenant au bloc ou au
194 c * tbaux2(iaux) vaut -1 sinon
195 c On tracera donc pour tbaux2(iaux) >= 0
198 c 2.1. ==> Cas du domaine global avec tous les niveaux
199 c On examine les faces actives et on retient celles avec au
202 if ( numblo.eq.0 .and. numniv.eq.-1 ) then
204 do 21 , iaux = 1, nbfato
205 #ifdef _DEBUG_HOMARD_
206 write (ulsort,texte(langue,5)) mess14(langue,1,typenh), iaux
207 write (ulsort,90002) 'voisins', volfac(1,iaux),volfac(2,iaux)
210 c . La face est active
211 if ( mod(hetfac(iaux),etaent).eq.0 ) then
213 c . La face n'a pas deux voisins
214 if ( volfac(2,iaux).eq.0 ) then
216 if ( typenh.eq.2 ) then
222 if ( volfac(1,iaux).eq.0 ) then
224 c . La face a un seul voisin
235 c 2.2. ==> Cas d'un filtrage par bloc volumique
236 c On examine les faces actives et on retient celles avec au
237 c plus un voisin, ce voisin etant du bon bloc
238 c Remarque : avec deux voisins, le bloc est forcement le meme
240 elseif ( numblo.gt.0 ) then
242 do 22 , iaux = 1, nbfato
244 c . La face est active
245 if ( mod(hetfac(iaux),etaent).eq.0 ) then
247 #ifdef _DEBUG_HOMARD_
248 if ( typenh.eq.2 ) then
253 write (ulsort,90002) mess14(langue,2,typenh), iaux, tbaux2(jaux)
256 c . La face n'a pas deux voisins
257 if ( volfac(2,iaux).eq.0 ) then
258 #ifdef _DEBUG_HOMARD_
259 write (ulsort,90002) '. voisins',volfac(1,iaux),volfac(2,iaux)
262 c . La face a un seul voisin
263 kaux = volfac(1,iaux)
264 if ( kaux.ne.0 ) then
266 c 2.2.1. ==> reperage du numero d'entite de ce voisin, avec le decalage
267 c pour le reperage des blocs
269 if ( kaux.gt.0 ) then
270 nument = decvol + kaux
272 if ( pypefa(1,-kaux).ne.0 ) then
273 nument = decpyr + pypefa(1,-kaux)
275 nument = decpen + pypefa(2,-kaux)
278 cgn write (ulsort,90002)
279 cgn > '. '//mess14(langue,1,3),nument,nubnvo(nument)
281 c 2.2.2. ==> Choix en fonction du bloc du voisin
283 if ( nubnvo(nument).eq.numblo ) then
284 if ( typenh.eq.2 ) then
297 #ifdef _DEBUG_HOMARD_
298 if ( typenh.eq.2 ) then
303 if ( tbaux2(jaux).ne.-1 ) then
304 write (ulsort,90002) '==> On la trace', tbaux2(jaux)
310 c 2.3. ==> Cas d'un filtrage par niveau
311 c On examine les faces actives et on retient celles :
312 c . avec un seul voisin, ce voisin etant du bon niveau
313 c . avec deux voisins, un et un seul des voisins etant
318 do 23 , iaux = 1, nbfato
320 c . La face est active
321 if ( mod(hetfac(iaux),etaent).eq.0 ) then
323 c . La face a au moins un voisin
324 kaux = volfac(1,iaux)
325 if ( kaux.ne.0 ) then
327 c 2.3.1. ==> reperage du numero d'entite de ce voisin, avec le decalage
328 c pour le reperage des blocs
330 if ( kaux.gt.0 ) then
331 nument = decvol + kaux
333 if ( pypefa(1,-kaux).ne.0 ) then
334 nument = decpyr + pypefa(1,-kaux)
336 nument = decpen + pypefa(2,-kaux)
340 c 2.3.2. ==> . La face a un seul voisin : choix en fonction du niveau
342 laux = volfac(2,iaux)
343 if ( laux.eq.0 ) then
345 if ( nubnvo(nument).eq.numniv ) then
346 if ( typenh.eq.2 ) then
354 c 2.3.3. ==> . La face a 2 voisins : choix en fonction de leurs niveaux
358 if ( laux.gt.0 ) then
359 numen2 = decvol + laux
361 if ( kaux.eq.laux ) then
362 numen2 = decpen + pypefa(2,-laux)
364 if ( pypefa(1,-laux).ne.0 ) then
365 numen2 = decpyr + pypefa(1,-laux)
367 numen2 = decpen + pypefa(2,-laux)
371 if ( nubnvo(nument).eq.numniv .or.
372 > nubnvo(numen2).eq.numniv ) then
373 if ( nubnvo(nument).ne.nubnvo(numen2) ) then
374 if ( typenh.eq.2 ) then
397 if ( codret.ne.0 ) then
401 write (ulsort,texte(langue,1)) 'Sortie', nompro
402 write (ulsort,texte(langue,2)) codret
406 #ifdef _DEBUG_HOMARD_
407 write (ulsort,texte(langue,1)) 'Sortie', nompro