1 subroutine decr02 ( decfac, decare,
3 > filare, merare, hetare,
5 > hettri, aretri, nivtri,
7 > hetqua, arequa, nivqua,
8 > list1f, bornoe, borare, list2f,
10 > ulsort, langue, codret )
11 c ______________________________________________________________________
15 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
17 c Version originale enregistree le 18 juin 1996 sous le numero 96036
18 c aupres des huissiers de justice Simart et Lavoir a Clamart
19 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
20 c aupres des huissiers de justice
21 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
23 c HOMARD est une marque deposee d'Electricite de France
29 c ______________________________________________________________________
31 c traitement des DEcisions - Contraintes de Raffinement - 02
33 c Decalage de deux mailles avant un changement de niveau
34 c ______________________________________________________________________
36 c . nom . e/s . taille . description .
37 c .____________________________________________________________________.
38 c . decfac . es . -nbquto. decision sur les faces (quad. + tri.) .
40 c . decare . es . nbarto . decisions des aretes .
41 c . somare . e .nbarto*2. numeros des extremites d'arete .
42 c . filare . e . nbarto . fille ainee de chaque arete .
43 c . merare . e . nbarto . mere de chaque arete .
44 c . hetare . e . nbarto . historique de l'etat des aretes .
45 c . posifa . e . nbarto . pointeur sur tableau facare .
46 c . facare . e . nbfaar . liste des faces contenant une arete .
47 c . hettri . e . nbtrto . historique de l'etat des triangles .
48 c . aretri . e .nbtrto*3. numeros des 3 aretes des triangles .
49 c . nivtri . e . nbtrto . niveau 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 . hetqua . e . nbquto . historique de l'etat des quadrangles .
56 c . arequa . e .nbquto*4. numeros des 4 aretes des quadrangles .
57 c . nivqua . e . nbquto . niveau des quadrangles .
58 c . list1f . aux . nbquto/. auxiliaire sur les faces (quad. + tri.) .
60 c . bornoe . aux . nbnoto . auxiliaire sur les noeuds .
61 c . borare . aux . nbarto . auxiliaire sur les aretes .
62 c . afaire . es . 1 . que faire a la sortie .
63 c . . . . 0 : aucune action .
64 c . . . . 1 : refaire une iteration de l'algorithme .
65 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
66 c . langue . e . 1 . langue des messages .
67 c . . . . 1 : francais, 2 : anglais .
68 c . codret . es . 1 . code de retour des modules .
69 c . . . . 0 : pas de probleme .
70 c . . . . sinon : probleme .
71 c ______________________________________________________________________
74 c 0. declarations et dimensionnement
77 c 0.1. ==> generalites
83 parameter ( nompro = 'DECR02' )
101 integer decfac(-nbquto:nbtrto), decare(0:nbarto)
102 integer somare(2,nbarto)
103 integer hetare(nbarto), filare(nbarto), merare(nbarto)
104 integer posifa(0:nbarto), facare(nbfaar)
105 integer hettri(nbtrto), aretri(nbtrto,3), nivtri(nbtrto)
106 integer voltri(2,nbtrto)
107 integer hetqua(nbquto), arequa(nbquto,4), nivqua(nbquto)
108 integer list1f(2,*), bornoe(*), borare(*), list2f(*)
111 integer ulsort, langue, codret
113 c 0.4. ==> variables locales
116 integer iaux, ideb, ifin
117 integer laface, faced, etatfa
118 integer larelo, lardeb, larfin, larete, iface
119 integer option, nbento, nbaret
120 integer nbfac1, nbfac2
121 integer nbnobo, nbar2d, nbar3d
124 parameter ( nbmess = 30 )
125 character*80 texte(nblang,nbmess)
127 c 0.5. ==> initialisations
128 c ______________________________________________________________________
136 #ifdef _DEBUG_HOMARD_
137 write (ulsort,texte(langue,1)) 'Entree', nompro
141 texte(1,4) = '(5x,''Au moins 2 mailles entre 2 niveaux.'')'
142 texte(1,5) = '(7x,''Nombre de faces a reconsiderer :'',i6,/)'
144 texte(2,4) = '(5x,''A least 2 meshes between 2 levels.'')'
145 texte(2,5) = '(7x,''Number of faces to deal with :'',i6,/)'
153 write (ulsort,texte(langue,4))
156 c 2. recherche des noeuds a la limite entre deux zones de raffinement de
157 c niveau different, sans tenir compte du bord exterieur
160 if ( codret.eq.0 ) then
163 #ifdef _DEBUG_HOMARD_
164 write (ulsort,texte(langue,3)) 'UTBONO', nompro
167 > nbnoto, nbarto, nbtrto, nbquto, nbteto, nbfaar,
171 > hettri, aretri, voltri,
174 > ulsort, langue, codret )
179 c 3. recherche des aretes a la limite entre deux zones de raffinement de
180 c niveau different, sans tenir compte du bord exterieur
182 #ifdef _DEBUG_HOMARD_
183 write (ulsort,90002) '3. recherche aretes ; codret', codret
186 if ( codret.eq.0 ) then
189 #ifdef _DEBUG_HOMARD_
190 write (ulsort,texte(langue,3)) 'UTBOAR', nompro
193 > nbarto, nbtrto, nbquto, nbteto, nbfaar,
196 > aretri, hettri, voltri,
198 > nbar2d, nbar3d, borare,
199 > ulsort, langue, codret )
204 c 4. recherche des faces :
205 c . dont une des aretes est a la limite entre deux zones de
206 c raffinement de niveau different, sans tenir compte du bord
209 c . qui sont a garder dans l'adaptation
211 #ifdef _DEBUG_HOMARD_
212 write (ulsort,90002) '4. recherche faces ; codret', codret
215 if ( codret.eq.0 ) then
219 do 4 , option = 2, 4, 2
221 #ifdef _DEBUG_HOMARD_
222 write (ulsort,*) mess14(langue,2,option)
225 if ( option.eq.2 ) then
233 do 40 , laface = 1 , nbento
235 if ( option.eq.2 ) then
236 etatfa = mod( hettri(laface) , 10 )
239 etatfa = mod( hetqua(laface) , 100 )
243 if ( etatfa.eq.0 .and. decfac(faced).eq.0 ) then
245 do 41 , larelo = 1 , nbaret
247 if ( option.eq.2 ) then
248 larete = aretri(laface,larelo)
250 larete = arequa(laface,larelo)
252 if ( borare(larete).eq.1 ) then
254 list1f(1,nbfac1) = faced
255 list1f(2,nbfac1) = larelo
268 cgn write (ulsort,1789)(list1f(1,iaux),list1f(2,iaux),
270 cgn 1789 format(10(i8,i2))
273 c 5. pour chacune des faces trouvees a l'etape 4 :
274 c . on cherche leur voisine par l'arete parallele au bord
275 c . si cette voisine est a couper en 4, on coupera la face
277 #ifdef _DEBUG_HOMARD_
278 write (ulsort,90002) '5. voisines ; codret', codret
281 if ( codret.eq.0 ) then
285 do 5 , iaux = 1 , nbfac1
287 faced = list1f(1,iaux)
288 if ( faced.gt.0 ) then
292 lardeb = per1a4(2,list1f(2,iaux))
296 do 51 , larelo = lardeb , larfin
298 if ( faced.gt.0 ) then
299 larete = aretri(faced,larelo)
301 larete = arequa(-faced,larelo)
304 if ( decare(larete).eq.2 ) then
306 ideb = posifa(larete-1)+1
307 ifin = posifa(larete)
309 do 511 , ipos = ideb , ifin
311 if ( iface.ne.faced) then
312 if ( decfac(iface).eq.4 ) then
314 list2f(nbfac2) = faced
328 c 6. modifications des decisions des faces
330 #ifdef _DEBUG_HOMARD_
331 write (ulsort,90002) '6. modifications decfac ; codret', codret
334 if ( codret.eq.0 ) then
336 if ( nbfac2.gt.0 ) then
337 write (ulsort,texte(langue,5)) nbfac2
341 do 61 , iaux = 1 , nbfac2
343 laface = list2f(iaux)
344 #ifdef _DEBUG_HOMARD_
345 write (ulsort,texte(langue,30)) 'decfac',laface,4,' '
349 if ( laface.gt.0 ) then
355 do 611 , larelo = 1 , nbaret
357 if ( laface.gt.0 ) then
358 larete = aretri(laface,larelo)
360 larete = arequa(-laface,larelo)
363 if ( decare(larete).eq.0 ) then
364 if ( mod(hetare(larete),10).eq.0 ) then
367 elseif ( decare(larete).eq.-1 ) then
370 #ifdef _DEBUG_HOMARD_
371 write (ulsort,texte(langue,30))'decare', larete,decare(larete),' '
384 if ( codret.ne.0 ) then
388 write (ulsort,texte(langue,1)) 'Sortie', nompro
389 write (ulsort,texte(langue,2)) codret
393 #ifdef _DEBUG_HOMARD_
394 write (ulsort,texte(langue,1)) 'Sortie', nompro