1 subroutine utboar ( choix,
2 > nbarto, nbtrto, nbquto, nbteto, nbfaar,
5 > aretri, hettri, voltri,
7 > nbar2d, nbar3d, borare,
8 > ulsort, langue, codret )
9 c ______________________________________________________________________
13 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
15 c Version originale enregistree le 18 juin 1996 sous le numero 96036
16 c aupres des huissiers de justice Simart et Lavoir a Clamart
17 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
18 c aupres des huissiers de justice
19 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
21 c HOMARD est une marque deposee d'Electricite de France
27 c ______________________________________________________________________
29 c UTilitaire - BOrd - ARetes
31 c ______________________________________________________________________
33 c . nom . e/s . taille . description .
34 c .____________________________________________________________________.
35 c . choix . e . 1 . choix du travail a faire .
36 c . . . . 1 : les aretes du bord du domaine .
37 c . . . . 2 : les aretes a la limite entre deux zones.
38 c . . . . de raffinement de niveau different .
39 c . . . . 3 : idem mais en ignorant le bord exterieur.
40 c . nbarto . e . 1 . nombre d'aretes total .
41 c . nbtrto . e . 1 . nombre de triangles total .
42 c . nbquto . e . 1 . nombre de quadrangles total .
43 c . nbteto . e . 1 . nombre de tetraedres total .
44 c . hetare . e . nbarto . historique de l'etat des aretes .
45 c . filare . e . nbarto . fille ainee de chaque arete .
46 c . posifa . e .0:nbarto. pointeur sur tableau facare .
47 c . facare . e . nbfaar . liste des faces contenant une arete .
48 c . aretri . e .nbtrto*3. numeros des 3 aretes des triangles .
49 c . hettri . e . nbtrto . historique de l'etat des triangles .
50 c . voltri . e .2*nbtrto. numeros des 2 volumes par triangle .
51 c . . . . voltri(i,k) definit le i-eme voisin de k .
52 c . . . . 0 : pas de voisin .
53 c . . . . j>0 : tetraedre j .
54 c . . . . j<0 : pyramide/pentaedre dans pypetr(1/2,j).
55 c . arequa . e .nbquto*4. numeros des 4 aretes des quadrangles .
56 c . hetqua . e . nbquto . historique de l'etat des quadrangles .
57 c . nbar2d . s . 1 . nombre d'aretes de bord 2D .
58 c . nbar3d . s . 1 . nombre d'aretes de bord 3D .
59 c . borare . s . nbarto . reperage des aretes de bord .
60 c . . . . avec le choix 1 (aretes du bord du domaine).
61 c . . . . 0 : l'arete est interne au domaine .
62 c . . . . 1 : l'arete borde une region 2D .
63 c . . . . 2 : l'arete borde une region 3D .
64 c . . . . avec le choix 3 (aretes du bord du domaine).
65 c . . . . 0 : l'arete est interne au domaine .
66 c . . . . 1 : l'arete borde une region 2D .
67 c . . . . 2 : l'arete borde une region 3D .
68 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
69 c . langue . e . 1 . langue des messages .
70 c . . . . 1 : francais, 2 : anglais .
71 c . codret . es . 1 . code de retour des modules .
72 c . . . . 0 : pas de probleme .
73 c . . . . sinon : probleme .
74 c ______________________________________________________________________
77 c 0. declarations et dimensionnement
80 c 0.1. ==> generalites
86 parameter ( nompro = 'UTBOAR' )
99 integer nbarto, nbtrto, nbquto, nbteto, nbfaar
100 integer hetare(nbarto), filare(nbarto)
101 integer posifa(0:nbarto), facare(nbfaar)
102 integer aretri(nbtrto,3), hettri(nbtrto)
103 integer voltri(2,nbtrto)
104 integer arequa(nbquto,4), hetqua(nbquto)
105 integer nbar2d, nbar3d, borare(nbarto)
107 integer ulsort, langue, codret
109 c 0.4. ==> variables locales
113 integer larete, laface
115 #ifdef _DEBUG_HOMARD_
122 parameter ( nbmess = 10 )
123 character*80 texte(nblang,nbmess)
124 c ______________________________________________________________________
132 #ifdef _DEBUG_HOMARD_
133 write (ulsort,texte(langue,1)) 'Entree', nompro
137 texte(1,4) = '(''Nombre d''''aretes de bord '',i1,''D :'',i10)'
138 texte(1,5) = '(''Traitement des '',a)'
139 texte(1,6) = '(a,''.. Examen du '',a,''numero '',i10)'
141 texte(2,4) = '(''Number of '',i1,''D boundary edges :'',i10)'
142 texte(2,5) = '(''Treatment of '',a)'
143 texte(2,6) = '(a,''.. Examination of '',a,'',# '',i10)'
147 #ifdef _DEBUG_HOMARD_
148 write (ulsort,90002) 'choix', choix
154 c 2. initialisations : tout est interne
157 do 20 , larete = 1, nbarto
162 c 3. recherche des aretes de bords du domaine
165 if ( choix.eq.1 ) then
167 c 3.1. ==> les 3 aretes d'un triangle qui borde un tetraedre et un seul
168 c sont de bord. c'est le bord du domaine volumique.
170 if ( nbteto.ne.0 ) then
172 do 31 , laface = 1, nbtrto
173 if ( voltri(1,laface).lt.0 .or. voltri(2,laface).lt.0) then
177 if ( voltri(1,laface).ne.0 .and.
178 > voltri(2,laface).eq.0 ) then
179 borare(aretri(laface,1)) = 2
180 borare(aretri(laface,2)) = 2
181 borare(aretri(laface,3)) = 2
187 c 3.2. ==> chaque arete qui ne borde qu'une face est de bord. c'est
188 c le bord du domaine surfacique.
190 do 32 , larete = 1, nbarto
192 if ( posifa(larete-1)+1 .eq. posifa(larete) ) then
201 c 4. recherche des aretes de bords des zones de differents niveaux
204 #ifdef _DEBUG_HOMARD_
205 write (ulsort,90002) '4. recherche ; codret', codret
208 if ( choix.eq.2 .or. choix.eq.3 ) then
210 do 41 , larete = 1 , nbarto
214 #ifdef _DEBUG_HOMARD_
215 if ( larete.eq.-12) then
222 c On s'interesse aux aretes coupees en 2
224 jaux = mod(hetare(larete),10)
225 if ( ( jaux.eq.2 ) .or. ( jaux.eq.9 ) ) then
227 c 4.1. ==> Si l'arete a ete reperee au bord par sa mere, on le progage
228 c directement aux filles
230 if ( borare(larete).gt.0 ) then
236 c 4.2. ==> Sinon, on fait l'analyse.
238 #ifdef _DEBUG_HOMARD_
239 if ( glop.ne.0 ) then
240 write (ulsort,texte(langue,6)) ' ', mess14(langue,1,1), larete
244 c 4.2.1. ==> decompte du nombre de faces actives voisines de cette arete
246 ideb = posifa(larete-1) + 1
247 ifin = posifa(larete)
249 do 421 , iaux = ideb, ifin
251 laface = facare(iaux)
252 if ( laface.gt.0 ) then
253 if ( mod(hettri(laface),10).eq.0 ) then
257 if ( mod(hetqua(-laface),100).eq.0 ) then
261 #ifdef _DEBUG_HOMARD_
262 if ( glop.ne.0 ) then
263 if ( laface.gt.0 ) then
268 write (ulsort,texte(langue,6)) ' ..',
269 > mess14(langue,1,jaux), abs(laface)
275 c 4.2.2. ==> Si au moins une face est active et qu'au moins une autre
276 c est coupee, c'est que l'arete est a une limite de niveau
278 #ifdef _DEBUG_HOMARD_
279 if ( glop.ne.0 ) then
280 write (ulsort,90002) '. nbfact', nbfact
281 write (ulsort,90002) '. nbfdec', ifin-ideb+1-nbfact
285 if ( nbfact.ge.(choix-2) ) then
287 iaux = ifin - ideb + 1 - nbfact
288 if ( iaux.ge.1 ) then
298 c 4.3. ==> enregistrement des deux filles
303 #ifdef _DEBUG_HOMARD_
304 if ( glop.ne.0 ) then
305 write (ulsort,90002) '.. reperage de l''arete',
306 > filare(larete)+jaux
309 borare(filare(larete)+jaux) = 1
319 c 5. decompte des aretes de bords
322 #ifdef _DEBUG_HOMARD_
323 write (ulsort,90002) '5. decompte ; codret', codret
326 if ( codret.eq.0 ) then
330 do 50 , larete = 1, nbarto
331 if ( borare(larete).eq.1 ) then
333 elseif ( borare(larete).eq.2 ) then
346 #ifdef _DEBUG_HOMARD_
347 write(ulsort,texte(langue,4)) 2, nbar2d
348 write(ulsort,texte(langue,4)) 3, nbar3d
351 if ( codret.ne.0 ) then
355 write (ulsort,texte(langue,1)) 'Sortie', nompro
356 write (ulsort,texte(langue,2)) codret
360 #ifdef _DEBUG_HOMARD_
361 write (ulsort,texte(langue,1)) 'Sortie', nompro