1 subroutine deisfa ( ncmpin, usacmp,
2 > trsupp, trindi, qusupp, quindi,
3 > hetare, filare, merare,
5 > hettri, aretri, hetqua, arequa,
7 > ulsort, langue, codret)
8 c ______________________________________________________________________
12 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
14 c Version originale enregistree le 18 juin 1996 sous le numero 96036
15 c aupres des huissiers de justice Simart et Lavoir a Clamart
16 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
17 c aupres des huissiers de justice
18 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
20 c HOMARD est une marque deposee d'Electricite de France
26 c ______________________________________________________________________
28 c traitement des DEcisions - Initialisations - par Saut - FAces
30 c ______________________________________________________________________
32 c . nom . e/s . taille . description .
33 c .____________________________________________________________________.
34 c . ncmpin . e . 1 . nombre de composantes de l'indicateur .
35 c . usacmp . e . 1 . usage des composantes de l'indicateur .
36 c . . . . 0 : norme L2 .
37 c . . . . 1 : norme infinie -max des valeurs absolues.
38 c . . . . 2 : valeur relative si une seule composante.
39 c . trsupp . e . nbtrto . support pour les triangles .
40 c . trindi . es . nbtrto . valeurs reelles pour les triangles .
41 c . qusupp . e . nbquto . support pour les quadrangles .
42 c . quindi . es . nbquto . valeurs reelles pour les quadrangles .
43 c . hetare . e . nbarto . historique de l'etat des aretes .
44 c . filare . e . nbarto . fils des aretes .
45 c . merare . e . nbarto . pere des aretes .
46 c . posifa . e . nbarto . pointeur sur tableau facare .
47 c . facare . e . nbfaar . liste des faces contenant une arete .
48 c . hettri . e . nbtrto . historique de l'etat des triangles .
49 c . aretri . e .nbtrto*3. numeros des 3 aretes des triangles .
50 c . hetqua . e . nbquto . historique de l'etat des quadrangles .
51 c . arequa . e .nbquto*4. numeros des 4 aretes des quadrangles .
52 c . tabent . aux . * . tableau auxiliaire entier .
53 c . tabree . aux . * . tableau auxiliaire reel .
54 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
55 c . langue . e . 1 . langue des messages .
56 c . . . . 1 : francais, 2 : anglais .
57 c . codret . es . 1 . code de retour des modules .
58 c . . . . 0 : pas de probleme .
59 c . . . . 2 : probleme dans le traitement .
60 c ______________________________________________________________________
63 c 0. declarations et dimensionnement
66 c 0.1. ==> generalites
72 parameter ( nompro = 'DEISFA' )
90 integer trsupp(nbtrto), qusupp(nbquto)
91 integer hetare(nbarto), filare(nbarto), merare(nbarto)
92 integer posifa(0:nbarto), facare(nbfaar)
93 integer hettri(nbtrto), aretri(nbtrto,3)
94 integer hetqua(nbquto), arequa(nbquto,4)
97 integer ulsort, langue, codret
99 double precision trindi(nbtrto,ncmpin), quindi(nbquto,ncmpin)
100 double precision tabree(-nbquto:nbtrto,ncmpin)
102 c 0.4. ==> variables locales
104 integer iaux, jaux, kaux
106 integer lgpile, nupile
107 integer laface, larefa, larete
113 double precision daux1, daux2
115 parameter( lgdaux = 100 )
116 double precision daux(lgdaux), vect(lgdaux)
122 parameter (nbmess = 11 )
123 character*80 texte(nblang,nbmess)
124 c ______________________________________________________________________
130 c 1.1. ==> Les messages
134 #ifdef _DEBUG_HOMARD_
135 write (ulsort,texte(langue,1)) 'Entree', nompro
139 texte(1,4) = '(''. Saut a la traversee des '',a)'
141 > '(''On veut'',i6,'' composantes, mais taille de daux ='',i6)'
142 texte(1,9) = '(''. Norme L2 des composantes.'')'
143 texte(1,10) = '(''. Norme infinie des composantes.'')'
144 texte(1,11) = '(''. Valeur relative de la composante.'')'
146 texte(2,4) = '(''. Jump through the '',a)'
148 > '(i6,''components are requested, but size of daux equals'',i6)'
149 texte(2,9) = '(''. L2 norm of components.'')'
150 texte(2,10) = '(''. Infinite norm of components.'')'
151 texte(2,11) = '(''. Relative value for the component.'')'
163 if ( ncmpin.gt.lgdaux ) then
164 write (ulsort,texte(langue,5)) ncmpin, lgdaux
168 #ifdef _DEBUG_HOMARD_
169 write (ulsort,texte(langue,9+usacmp))
172 #ifdef _DEBUG_HOMARD_
173 write (ulsort,texte(langue,4)) mess14(langue,3,1)
177 c 2. sauvegarde de l'indicateur
180 if ( codret.eq.0 ) then
182 do 211 , iaux = 1 , nbtrto
183 if ( trsupp(iaux).ne.0 ) then
184 do 2110 , nrcomp = 1 , ncmpin
185 tabree(iaux,nrcomp) = trindi(iaux,nrcomp)
190 do 212 , iaux = 1 , nbquto
191 if ( qusupp(iaux).ne.0 ) then
192 do 2120 , nrcomp = 1 , ncmpin
193 tabree(-iaux,nrcomp) = quindi(iaux,nrcomp)
199 c 3. traitement des indicateurs portant sur les faces
202 do 3 , laface = -nbquto , nbtrto
209 if ( laface.lt.0 ) then
210 if ( qusupp(-laface).ne.0 ) then
214 elseif ( laface.gt.0 ) then
215 if ( trsupp(laface).ne.0 ) then
223 cgn if ( laface.ge.-42 .and. laface.le.49 ) then
226 cgn if ( glop.eq.1) then
227 cgn print *,'==========================='
228 cgn print *,'FACE = ',laface,', d''indic ',
229 cgn > (tabree(laface,nrcomp),nrcomp=1,ncmpin)
234 do 31 , iaux = 1 , nbarfa
236 c 3.1. ==> pour une des aretes de la face, on stocke les numeros
237 c des faces voisines, en descendant les parentes.
238 c ensuite, on stocke la premiere arete mere dont une des
239 c faces voisines est active
242 if ( laface.gt.0 ) then
243 larefa = aretri(laface,iaux)
245 larefa = arequa(-laface,iaux)
247 cgn if ( glop.eq.1) then
248 cgn print *,'.', iaux,'-ieme arete de la face : ',larefa
251 tabent(lgpile) = larefa
256 larete = tabent(nupile)
257 if ( mod(hetare(larete),10).ne.0 ) then
258 cgn if ( glop.eq.1) then
259 cgn print *,'.. des filles'
262 tabent(lgpile) = filare(larete)
264 tabent(lgpile) = filare(larete) + 1
265 cgn if ( glop.eq.1) then
266 cgn print *,'.... ajout de ',tabent(lgpile), ' a la pile'
271 if ( nupile.le.lgpile ) then
275 c 3.2. ==> pour chaque arete de la pile : si elle est active, on
276 c cherche le max de l'ecart entre la valeur de l'indicateur
277 c sur la face voisine et celle sur la face courante
279 do 32 , nupile = 1 , lgpile
280 larete = tabent(nupile)
281 if ( mod(hetare(larete),10).eq.0 ) then
282 cgn if ( glop.eq.1) then
283 cgn print *,'...... Examen de la pile, arete : ',larete
285 jdeb = posifa(larete-1)+1
286 jfin = posifa(larete)
287 do 321 , jaux = jdeb, jfin
289 if ( kaux.ne.laface ) then
290 cgn if ( glop.eq.1) then
291 cgn print *,'........ ==> face ', kaux,' : ',
292 cgn > (tabree(kaux,nrcomp),nrcomp=1,ncmpin)
295 if ( kaux.gt.0 ) then
296 if ( trsupp(kaux).ne.0 ) then
298 do 3211 , nrcomp = 1 , ncmpin
299 daux(nrcomp) = tabree(kaux,nrcomp)
300 > - tabree(laface,nrcomp)
303 elseif ( kaux.lt.0 ) then
304 if ( qusupp(-kaux).ne.0 ) then
306 do 3212 , nrcomp = 1 , ncmpin
307 daux(nrcomp) = tabree(kaux,nrcomp)
308 > - tabree(laface,nrcomp)
313 c calcul de la norme de l'ecart
314 c si on a passe le max, on stocke
315 if ( usacmp.eq.0 ) then
317 do 32111 , nrcomp = 2 , ncmpin
318 daux2 = daux2 + daux(nrcomp)**2
320 elseif ( usacmp.eq.1 ) then
322 do 32112 , nrcomp = 2 , ncmpin
323 daux2 = max(daux2,abs(daux(nrcomp)))
328 if ( daux2.gt.daux1 ) then
330 do 3213 , nrcomp = 1 , ncmpin
331 vect(nrcomp) = daux(nrcomp)
335 cgn if ( glop.eq.1) then
336 cgn print *,'........ daux1 ', daux1
340 cgn if ( glop.eq.1) then
341 cgn print *,'...... ==> valeur finale =', daux1
346 c 3.3. ==> on remonte la parente pour pieger les non-conformites
352 merear = merare(larete)
353 if ( merear.gt.0 ) then
354 cgn if ( glop.eq.1) then
355 cgn print *,'......', larete,' a une mere : ',merear
357 jdeb = posifa(merear-1)+1
358 jfin = posifa(merear)
359 if ( jdeb.gt.jfin ) then
363 do 331 , jaux = jdeb, jfin
365 if ( kaux.ne.laface ) then
366 cgn if ( glop.eq.1) then
367 cgn print *,'.......... ==> face ', kaux,' : ',
368 cgn > (tabree(kaux,nrcomp),nrcomp=1,ncmpin)
371 if ( kaux.gt.0 ) then
372 if ( mod(hettri(kaux),10).eq.0 ) then
373 if ( trsupp(kaux).ne.0 ) then
375 do 3311 , nrcomp = 1 , ncmpin
376 daux(nrcomp) = tabree(kaux,nrcomp)
377 > - tabree(laface,nrcomp)
381 elseif ( kaux.lt.0 ) then
382 if ( mod(hetqua(-kaux),100).eq.0 ) then
383 if ( qusupp(-kaux).ne.0 ) then
385 do 3312 , nrcomp = 1 , ncmpin
386 daux(nrcomp) = tabree(kaux,nrcomp)
387 > - tabree(laface,nrcomp)
393 if ( usacmp.eq.0 ) then
395 do 33111 , nrcomp = 2 , ncmpin
396 daux2 = daux2 + daux(nrcomp)**2
398 elseif ( usacmp.eq.1 ) then
400 do 33112 , nrcomp = 2 , ncmpin
401 daux2 = max(daux2,abs(daux(nrcomp)))
406 if ( daux2.gt.daux1 ) then
408 do 3313 , nrcomp = 1 , ncmpin
409 vect(nrcomp) = daux(nrcomp)
413 cgn if ( glop.eq.1) then
414 cgn print *,'.......... daux1 ', daux1
418 cgn if ( glop.eq.1) then
419 cgn print *,'........ ==> valeur finale =', daux1
428 cgn if ( glop.eq.1) then
429 cgn write(ulsort,20000) 'Final '//
430 cgn > 'face', laface,' : ',
431 cgn > mess14(langue,1,typenh), laface,' : ',
432 cgn > (vect(nrcomp),nrcomp=1,ncmpin)
434 if ( laface.gt.0 ) then
435 do 341 , nrcomp = 1 , ncmpin
436 trindi(laface,nrcomp) = vect(nrcomp)
439 do 342 , nrcomp = 1 , ncmpin
440 quindi(-laface,nrcomp) = vect(nrcomp)
454 if ( codret.ne.0 ) then
458 write (ulsort,texte(langue,1)) 'Sortie', nompro
459 write (ulsort,texte(langue,2)) codret
460 write (ulsort,texte(langue,4)) mess14(langue,3,1)
464 #ifdef _DEBUG_HOMARD_
465 write (ulsort,texte(langue,1)) 'Sortie', nompro