1 subroutine deinfi ( option, obfiad,
2 > decare, decfac, iniada,
13 > ulsort, langue, codret )
14 c ______________________________________________________________________
18 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
20 c Version originale enregistree le 18 juin 1996 sous le numero 96036
21 c aupres des huissiers de justice Simart et Lavoir a Clamart
22 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
23 c aupres des huissiers de justice
24 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
26 c HOMARD est une marque deposee d'Electricite de France
32 c ______________________________________________________________________
34 c traitement des DEcisions - INitialisations - FIltrage
36 c ______________________________________________________________________
37 c Modification des decisions pour tenir compte du filtrage
38 c ______________________________________________________________________
40 c . nom . e/s . taille . description .
41 c .____________________________________________________________________.
42 c . option . e . 1 . 0 : on retire les entites filtrees .
43 c . . . . 1 : on ajoute les entites filtrees .
44 c . obfiad . e . char*8 . memorisation du filtrage de l'adaptation .
45 c . decare . es .0:nbarto. decisions des aretes .
46 c . decfac . es . -nbquto. decision sur les faces (quad. + tri.) .
48 c . iniada . e . 1 . initialisation de l'adaptation .
49 c . . . . 0 : on garde tout (defaut) .
50 c . . . .-1 : reactivation des mailles ou aucun .
51 c . . . . indicateur n'est defini .
52 c . . . . 1 : raffinement des mailles ou aucun .
53 c . . . . indicateur n'est defini .
54 c . filtar . a . nbarto . filtrage des aretes .
55 c . filtfa . a . -nbquto. filtrage sur les faces (quad. + tri.) .
57 c . povoso . e .0:nbnoto. pointeur des voisins par sommet .
58 c . voisom . e . nvosom . aretes voisines de chaque noeud .
59 c . noempo . e . nbmpto . numeros des noeuds associes aux mailles .
60 c . somare . e .2*nbarto. numeros des extremites d'arete .
61 c . aretri . e .nbtrto*3. numeros des 3 aretes des triangles .
62 c . arequa . e .nbquto*4. numeros des 4 aretes des quadrangles .
63 c . tritet . e .nbtecf*4. numeros des 4 triangles des tetraedres .
64 c . quahex . e .nbhecf*6. numeros des 6 quadrangles des hexaedres .
65 c . facpyr . e .nbpycf*5. numeros des 5 faces des pyramides .
66 c . facpen . e .nbpecf*5. numeros des faces des pentaedres .
67 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
68 c . langue . e . 1 . langue des messages .
69 c . . . . 1 : francais, 2 : anglais .
70 c . codret . es . 1 . code de retour des modules .
71 c . . . . 0 : pas de probleme .
72 c ______________________________________________________________________
75 c 0. declarations et dimensionnement
78 c 0.1. ==> generalites
84 parameter ( nompro = 'DEINFI' )
110 integer decare(0:nbarto), decfac(-nbquto:nbtrto)
112 integer filtar(nbarto), filtfa(-nbquto:nbtrto)
113 integer povoso(0:nbnoto), voisom(*)
114 integer noempo(nbmpto)
115 integer somare(2,nbarto)
116 integer aretri(nbtrto,3)
117 integer arequa(nbquto,4)
118 integer tritet(nbtecf,4)
119 integer quahex(nbhecf,6)
120 integer facpyr(nbpycf,5)
121 integer facpen(nbpecf,5)
123 integer ulsort, langue, codret
125 c 0.4. ==> variables locales
127 integer iaux, jaux, kaux, laux
129 integer larete, lesomm
130 integer nbvent, adfilt
132 integer valdef, valmod
138 parameter ( nbmess = 10 )
139 character*80 texte(nblang,nbmess)
141 c 0.5. ==> initialisations
144 c ______________________________________________________________________
152 #ifdef _DEBUG_HOMARD_
153 write (ulsort,texte(langue,1)) 'Entree', nompro
157 c 1.1. ==> Les messages
159 texte(1,4) = '(5x,''Filtrage'',i2)'
160 texte(1,5) = '(5x,''Retrait des entites filtrees'')'
161 texte(1,6) = '(5x,''Ajout des entites filtrees'')'
162 texte(1,7) = '(''Filtrage pour les '',a)'
164 texte(2,4) = '(5x,''Filtering #'',i2)'
165 texte(2,5) = '(5x,''Removal of filtered entities'')'
166 texte(2,6) = '(5x,''Addition of filtered entities'')'
167 texte(2,7) = '(''Filtering for the '',a)'
172 #ifdef _DEBUG_HOMARD_
173 write (ulsort,texte(langue,4)) nbpass
174 write (ulsort,texte(langue,5+option))
179 c 1.2. ==> Au depart rien n'est retenu
181 if ( option.eq.0 ) then
184 elseif ( option.eq.1 ) then
190 #ifdef _DEBUG_HOMARD_
191 write (ulsort,90002) 'option', option
192 write (ulsort,90002) 'valdef', valdef
193 write (ulsort,90002) 'valmod', valmod
196 if ( codret.eq.0 ) then
198 do 121 , iaux = 1 , nbarto
199 filtar(iaux) = valdef
202 do 122 , iaux = -nbquto , nbtrto
203 filtfa(iaux) = valdef
209 c 2. Boucle sur tous les types d'entites mailles (cf. vcfia0)
211 cgn write (ulsort,90003) 'obfiad', obfiad
212 #ifdef _DEBUG_HOMARD_
213 call gmprsx ( nompro, obfiad )
216 do 21 , typenh = -1 , 7
218 c 2.1. ==> Nombre de valeurs
220 if ( codret.eq.0 ) then
223 call gmliat ( obfiad, iaux, nbvent, codret )
227 c 2.2. ==> Adresse des valeurs s'il y en a
229 if ( codret.eq.0 ) then
231 if ( nbvent.gt.0 ) then
233 #ifdef _DEBUG_HOMARD_
234 write (ulsort,texte(langue,7)) mess14(langue,3,typenh)
237 if ( codret.eq.0 ) then
240 call utench ( iaux, 'g', jaux, saux,
241 > ulsort, langue, codret )
245 if ( codret.eq.0 ) then
247 saux = '.Tab'//saux(1:1)
248 call gmadoj ( obfiad//saux, adfilt, iaux, codret )
257 c 2.3. ==> Prise en compte selon le type de mailles
258 c On boucle sur le nombre de mailles courantes. Ce n'est pas
259 c toujours egal au nombre de valeurs du fait de la suppression
260 c eventuelle de mailles de mise en conformite. Ce n'est pas
261 c grave car dans la creation de obfiad (vcfiad), on a pris en
262 c compte toutes les entites, quel que soit leur statut.
263 #ifdef _DEBUG_HOMARD_
264 write (ulsort,90002) '2.3. '//mess14(langue,3,typenh)//' codret',
268 if ( codret.eq.0 ) then
270 if ( nbvent.gt.0 ) then
272 #ifdef _DEBUG_HOMARD_
273 call gmprsx ( nompro, obfiad//saux )
276 c 2.3.1. ==> Les sommets : on traite les aretes dont les deux
277 c extremites sont dans le filtre
279 if ( typenh.eq.-1 ) then
281 do 231 , iaux = 1 , nbarto
282 if ( imem(adfilt+somare(1,iaux)).ne.0 .and.
283 > imem(adfilt+somare(2,iaux)).ne.0 ) then
284 cgn write (ulsort,90002) 'arete ', iaux
285 filtar(iaux) = valmod
289 c 2.3.2. ==> Les mailles-points :
290 c Pour une maille-point retenue, on parcourt toutes les
291 c aretes qui ont le noeud sous-jacent pour extremite. Pour
292 c chacune de ces aretes, on regarde l'autre sommet. Si une
293 c maille-point retenue est basee sur cet autre sommet, on
294 c declare l'arete comme faisant partie des candidats a
296 c Remarque : il n'est pas trop grave de faire la double
297 c boucle car il y a peu de mailles-points !
299 elseif ( typenh.eq.0 ) then
301 do 232 , iaux = 1 , nbmpto
303 if ( imem(adfilt+iaux).ne.0 ) then
306 kdeb = povoso(jaux-1) + 1
309 do 2321 , kaux = kdeb, kfin
310 larete = voisom(kaux)
311 if ( somare(1,larete).eq.jaux ) then
312 lesomm = somare(2,larete)
314 lesomm = somare(1,larete)
316 do 23211 , laux = 1 , nbmpto
317 if ( noempo(laux).eq.lesomm ) then
318 if ( imem(adfilt+laux).ne.0 ) then
319 filtar(larete) = valmod
330 c 2.3.3. ==> Les aretes : chacune est traitee
332 elseif ( typenh.eq.1 ) then
334 do 233 , iaux = 1 , nbarto
335 cgn write (ulsort,90002) 'arete ', iaux
336 if ( imem(adfilt+iaux).ne.0 ) then
337 cgn write (ulsort,90002) '==> passage a', valmod
338 filtar(iaux) = valmod
342 c 2.3.4. ==> Les triangles : chacun est traite, de meme que ses aretes
344 elseif ( typenh.eq.2 ) then
346 do 234 , iaux = 1 , nbtrto
347 cgn write (ulsort,90002) 'triangle ', iaux,imem(adfilt+iaux),decfac(iaux)
348 if ( imem(adfilt+iaux).ne.0 ) then
349 cgn write (ulsort,90002) '==> passage a', valmod
350 cgn write (ulsort,90002) '==> modif aretes', (aretri(iaux,jaux),jaux=1,3)
351 filtfa(iaux) = valmod
352 filtar(aretri(iaux,1)) = valmod
353 filtar(aretri(iaux,2)) = valmod
354 filtar(aretri(iaux,3)) = valmod
358 c 2.3.5. ==> Les tetraedres : chacune de ses faces et de ses aretes est
361 elseif ( typenh.eq.3 ) then
363 do 235 , iaux = 1 , nbteto
364 cgn print *,'tetr',iaux,imem(adfilt+iaux)
365 if ( imem(adfilt+iaux).ne.0 ) then
366 do 2351 , jaux = 1 , 4
367 kaux = tritet(iaux,jaux)
368 filtfa(kaux) = valmod
369 filtar(aretri(kaux,1)) = valmod
370 filtar(aretri(kaux,2)) = valmod
371 filtar(aretri(kaux,3)) = valmod
376 c 2.3.6. ==> Les quadrangles : chacun est traite, de meme que ses aretes
378 elseif ( typenh.eq.4 ) then
380 do 236 , iaux = 1 , nbquto
381 if ( imem(adfilt+iaux).ne.0 ) then
382 filtfa(-iaux) = valmod
383 filtar(arequa(iaux,1)) = valmod
384 filtar(arequa(iaux,2)) = valmod
385 filtar(arequa(iaux,3)) = valmod
386 filtar(arequa(iaux,4)) = valmod
390 c 2.3.7. ==> Les pyramides : chacune de ses faces et de ses aretes est
392 c Remarque : comme on affecte valmod a toutes les aretes des
393 c triangles, il est inutile de se preoccuper des
394 c aretes du quadrangle car elles sont deja traitees
396 elseif ( typenh.eq.5 ) then
398 do 237 , iaux = 1 , nbpyto
399 if ( imem(adfilt+iaux).ne.0 ) then
400 do 2371 , jaux = 1 , 4
401 kaux = facpyr(iaux,jaux)
402 filtfa(kaux) = valmod
403 filtar(aretri(kaux,1)) = valmod
404 filtar(aretri(kaux,2)) = valmod
405 filtar(aretri(kaux,3)) = valmod
407 kaux = facpyr(iaux,5)
408 filtfa(-kaux) = valmod
412 c 2.3.8. ==> Les hexaedres : chacune de ses faces et de ses aretes est
415 elseif ( typenh.eq.6 ) then
417 do 238 , iaux = 1 , nbheto
418 if ( imem(adfilt+iaux).ne.0 ) then
419 cgn write(*,*)'.. hexaedre', iaux
420 do 2381 , jaux = 1 , 6
421 kaux = quahex(iaux,jaux)
422 filtfa(-kaux) = valmod
423 filtar(arequa(kaux,1)) = valmod
424 filtar(arequa(kaux,2)) = valmod
425 filtar(arequa(kaux,3)) = valmod
426 filtar(arequa(kaux,4)) = valmod
427 cgn write(*,*)'.... face', kaux
432 c 2.3.9. ==> Les pentaedres : chacune de ses faces et de ses aretes est
434 c Remarque : comme on affecte valmod a toutes les aretes des
435 c quadrangles, il est inutile de se preoccuper des
436 c aretes des triangles car elles sont deja traitees
438 elseif ( typenh.eq.7 ) then
440 do 239 , iaux = 1 , nbpeto
441 cgn write(ulsort,*)'.... pentaedre', iaux
442 if ( imem(adfilt+iaux).ne.0 ) then
443 do 2391 , jaux = 1 , 2
444 kaux = facpen(iaux,jaux)
445 filtfa(kaux) = valmod
447 do 2392 , jaux = 3 , 5
448 kaux = facpen(iaux,jaux)
449 cgn write(ulsort,*)'.... face', kaux
450 cgn write(ulsort,*)'.... aretes', arequa(kaux,1),
451 cgn > arequa(kaux,2),arequa(kaux,3),arequa(kaux,4)
452 filtfa(-kaux) = valmod
453 filtar(arequa(kaux,1)) = valmod
454 filtar(arequa(kaux,2)) = valmod
455 filtar(arequa(kaux,3)) = valmod
456 filtar(arequa(kaux,4)) = valmod
470 c 3. Applications aux decisions
472 #ifdef _DEBUG_HOMARD_
473 write (ulsort,90002) '3. Applications ; codret', codret
476 if ( codret.eq.0 ) then
478 if ( iniada.eq.1 ) then
484 do 31 , iaux = 1 , nbarto
485 if ( filtar(iaux).eq.0 ) then
486 cgn if ( decare(iaux).gt.0 ) then
487 cgn write(ulsort,*)' suppression pour arete', iaux
488 decare(iaux) = valmod
493 if ( iniada.eq.1 ) then
499 do 32 , iaux = -nbquto , nbtrto
500 if ( filtfa(iaux).eq.0 ) then
501 cgn if ( decfac(iaux).gt.0 ) then
502 decfac(iaux) = valmod
513 if ( codret.ne.0 ) then
517 write (ulsort,texte(langue,1)) 'Sortie', nompro
518 write (ulsort,texte(langue,2)) codret
522 #ifdef _DEBUG_HOMARD_
523 write (ulsort,texte(langue,1)) 'Sortie', nompro