1 subroutine utppqt ( decisi, nbfato, nbvoto, nbvofa,
4 > volfac, lgpype, pypefa, nupype,
5 > ulsort, langue, codret )
7 c ______________________________________________________________________
11 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
13 c Version originale enregistree le 18 juin 1996 sous le numero 96036
14 c aupres des huissiers de justice Simart et Lavoir a Clamart
15 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
16 c aupres des huissiers de justice
17 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
19 c HOMARD est une marque deposee d'Electricite de France
25 c ______________________________________________________________________
27 c UTilitaire - Pyramides/Pentaedres - Quadrangles/Triangles
29 c ______________________________________________________________________
31 c but : complete le tableau volfac et cree le tableau pypefa
32 c a partir du reciproque, facvol
33 c ______________________________________________________________________
35 c . nom . e/s . taille . description .
36 c .____________________________________________________________________.
37 c . decisi . e . 1 . pilotage des voisins des faces : .
38 c . . . . 1 : on construit la table. .
39 c . . . . 2 : on construit la table et on controle .
40 c . . . . qu'une face n'appartient pas a plus de .
42 c . nbfato . e . 1 . nombre de faces total .
43 c . nbvoto . e . 1 . nombre de volumes total .
44 c . nbvofa . e . 1 . nombre de volumes decrits par leurs faces .
45 c . typvol . e . 1 . type du volume en cours d'examen .
46 c . . . . 5 : pyramides .
47 c . . . . 7 : pentaedres .
48 c . typfac . e . 1 . type de la face en cours d'examen .
49 c . . . . 2 : triangles .
50 c . . . . 4 : quadrangles .
51 c . facvol . e .nbvoto*5. numeros des faces des volumes .
52 c . hetvol . e . nbvoto . historique de l'etat des volumes .
53 c . volfac . es .2*nbfato. numeros des 2 volumes par face .
54 c . . . . volfac(i,k) definit le i-eme voisin de k .
55 c . . . . 0 : pas de voisin .
56 c . . . . j>0 : hexaedre/tetraedre j .
57 c . . . . j<0 : pyramide/pentaedre dans pypefa(1/2,j).
58 c . lgpype . e . 1 . taille du tableau pypefa .
59 c . pypefa . s .2*lgpype. pypefa(1,j) = numero de la pyramide voisine.
60 c . . . . de la face k tel que volfac(1/2,k) = -j .
61 c . . . . pypefa(2,j) = numero du pentaedre voisin .
62 c . . . . de la face k tel que volfac(1/2,k) = -j .
63 c . nupype . es . 1 . dernier indice cree dans le tableau pypefa .
64 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
65 c . langue . e . 1 . langue des messages .
66 c . . . . 1 : francais, 2 : anglais .
67 c . codret . es . 1 . code de retour des modules .
68 c . . . . 0 : pas de probleme .
69 c . . . . 1 : mauvais type de face .
70 c . . . . 2 : mauvais type de volume .
71 c . . . . 3 : probleme de volumes decoupees .
72 c ______________________________________________________________________
75 c 0. declarations et dimensionnement
78 c 0.1. ==> generalites
84 parameter ( nompro = 'UTPPQT' )
96 integer nbfato, nbvoto, nbvofa
97 integer typvol, typfac
98 integer hetvol(nbvoto), facvol(nbvofa,5)
99 integer volfac(2,nbfato)
100 integer lgpype, pypefa(2,lgpype), nupype
102 integer ulsort, langue, codret
104 c 0.4. ==> variables locales
107 integer kfadeb, kfafin, nbface
109 integer levolu, vois01, inpype, inpepy
111 integer nbfa00, lifa00(2)
112 #ifdef _DEBUG_HOMARD_
113 integer typvo1, typvo2
115 character*6 saux06(2)
119 parameter ( nbmess = 10 )
120 character*80 texte(nblang,nbmess)
122 c 0.5. ==> initialisations
123 c ______________________________________________________________________
131 #ifdef _DEBUG_HOMARD_
132 write (ulsort,texte(langue,1)) 'Entree', nompro
136 texte(1,4) = '(''Voisinage '',a,''/ '',a)'
137 texte(1,5) = '(''Le type de '',a,'',i10,'' est inconnu.'')'
138 texte(1,6) = '(/,''Le '',a,'',i10,'' a plus de deux voisins ?'')'
139 texte(1,7) = '(''Voisins :'',3i10,/)'
141 texte(2,4) = '(''Neighbourhoud '',a,''/ '',a)'
142 texte(2,5) = '(''Type of '',a,'',i10,'' is unknown.'')'
143 texte(2,6) = '(/,a,i10,'' has more than 2 neighbours ?'')'
144 texte(2,7) = '(''Neighbours :'',3i10,/)'
150 #ifdef _DEBUG_HOMARD_
151 write (ulsort,90002) 'typvol', typvol
152 write (ulsort,90002) 'typfac', typfac
156 c 2. Grandeurs caracteristiques
160 if ( typvol.eq.5 ) then
162 if ( typfac.eq.2 ) then
165 elseif ( typfac.eq.4 ) then
174 c 2.2. ==> Pentaedres
176 elseif ( typvol.eq.7 ) then
178 if ( typfac.eq.2 ) then
181 elseif ( typfac.eq.4 ) then
199 c 3. on parcourt les volumes
201 #ifdef _DEBUG_HOMARD_
202 write (ulsort,90002) '3. parcours des volumes ; codret', codret
203 cgn write (ulsort,90002) 'kfadeb, kfafin = ', kfadeb, kfafin
206 if ( codret.eq.0 ) then
207 #ifdef _DEBUG_HOMARD_
208 write (ulsort,texte(langue,4)) mess14(langue,1,typvol),
209 > mess14(langue,1,typfac)
210 if ( typfac.eq.2 ) then
219 if ( typvol.eq.5 ) then
226 nbface = kfafin - kfadeb + 1
228 do 30 , levolu = 1 , nbvofa
229 #ifdef _DEBUG_HOMARD_
230 if ( levolu.ge.-1583 ) then
231 ccc if ( ( typvol.eq.5 .and. typfac.eq.4 .and. levolu.lt.0 ) .or.
232 ccc > ( typvol.eq.7 .and. typfac.eq.2 .and. levolu.lt.0 ) ) then
239 c 3.1. ==> les faces du volume en cours d'examen
241 do 31 , iaux = kfadeb, kfafin
242 listfa(iaux-kfadeb+1) = facvol(levolu,iaux)
245 c 3.2. ==> quand le volume est decoupe par conformite, on se preoccupe
246 c des cas ou une face du volume se retrouve en tant que face
248 c La convention HOMARD veut que l'on ne memorise que le fils
249 c dans les voisins des faces.
250 c on va alors annuler le numero de la face pour ne rien
251 c archiver maintenant.
252 c C'est le cas dans les situations suivantes :
254 c Etat | Face triangle | Face quadrangle
267 etat = mod ( hetvol(levolu), 100 )
268 #ifdef _DEBUG_HOMARD_
269 if ( glop.ne.0 ) then
271 write(ulsort,90015) mess14(langue,2,typvol), levolu,
272 > ', de '//mess14(langue,3,typfac), (listfa(iaux),iaux=1,nbface)
273 write(ulsort,90002) 'Etat', etat
276 if ( etat.ne.0 .and. etat.ne.80 .and. etat.ne.99 ) then
277 #ifdef _DEBUG_HOMARD_
278 write(ulsort,*) 'Creation de ', saux06(1),'/', saux06(2)
283 c 3.2.1. ==> Pentaedre et triangle
285 if ( typvol.eq.7 .and. typfac.eq.2 ) then
287 if ( ( etat.ge.1 .and. etat.le.3 ) .or. etat.eq.31 ) then
290 elseif ( ( etat.ge.4 .and. etat.le.6 ) .or.
294 elseif ( etat.ge.7 .and. etat.le.8 ) then
300 c 3.2.2. ==> Pentaedre et quadrangle
302 elseif ( typvol.eq.7 .and. typfac.eq.4 ) then
304 if ( etat.eq.2 .or. etat.eq.3 .or. etat.eq.5 .or.
305 > etat.eq.6 .or. etat.eq.8 ) then
309 if ( etat.eq.1 .or. etat.eq.3 .or. etat.eq.4 .or.
310 > etat.eq.6 .or. etat.eq.9 ) then
314 if ( etat.eq.1 .or. etat.eq.2 .or. etat.eq.4 .or.
315 > etat.eq.5 .or. etat.eq.7 ) then
324 do 323 , iaux = 1 , nbfa00
325 cgn write (ulsort,90002) 'face', facvol(levolu,lifa00(iaux))
326 do 3231 , jaux = 1 , nbface
327 cgn write (ulsort,90002) '... face', listfa(jaux)
328 if ( facvol(levolu,lifa00(iaux)).eq.listfa(jaux) ) then
336 c 3.3. ==> pour chaque face a traiter
338 do 33 , iaux = 1 , nbface
340 if ( listfa(iaux).ne.0 ) then
343 vois01 = volfac(1,listfa(iaux))
344 #ifdef _DEBUG_HOMARD_
345 if ( glop.ne.0 ) then
346 write (ulsort,*) '.. ', mess14(langue,2,typfac), listfa(iaux)
347 write (ulsort,90002) ' de voisins', vois01,
348 > volfac(2,listfa(iaux))
352 c 3.3.1. ==> aucun voisin n'a ete enregistre : on met le volume
353 c courant comme premier voisin
355 if ( vois01.eq.0 ) then
361 c 3.3.2. ==> un premier voisin a ete enregistre : on met le volume
362 c courant comme second voisin
363 c Pour un pentaedre, trois cas de figure :
364 c . Si le premier voisin est un tetraedre ou un hexaedre :
365 c vois01>0, il faut creer un nouvel indice dans le
367 c . Sinon, le premier voisin est une pyramide ou un pentaedre
368 c . Si le premier voisin est une pyramide, c'est-a-dire
369 c vois01<0 et pypefa(1,-vois01)/=0, il faut stocker
370 c le volume dans pypefa(2,-vois01)
371 c . Si le premier voisin est deja un pentaedre,
372 c c'est-a-dire vois01<0 et pypefa(2,-vois01)/=0, il faut
373 c creer un nouvel indice dans le tableau pypefa
374 c Pour une pyramide, le raisonnement est symetrique.
376 c C'est ainsi qu'il faut stocker pour etre coherent avec
377 c le decodage des voisins (cf. infovo par exemple)
379 if ( vois01.gt.0 ) then
381 #ifdef _DEBUG_HOMARD_
382 if ( glop.ne.0 ) then
383 write (ulsort,*) '.... le ',mess14(langue,1,typfac), listfa(iaux),
384 >'est deja voisin de ',mess14(langue,1,typvo1),
385 > volfac(1,listfa(iaux))
389 #ifdef _DEBUG_HOMARD_
390 if ( glop.ne.0 ) then
391 write (ulsort,90002) '.. '//saux06(2)//'(*,-vois01)',
392 > pypefa(1,-vois01), pypefa(2,-vois01)
395 if ( pypefa(inpepy,-vois01).eq.0 ) then
397 #ifdef _DEBUG_HOMARD_
398 if ( glop.ne.0 ) then
399 write (ulsort,*) '.... le ',mess14(langue,1,typfac), listfa(iaux),
400 > 'est voisin de ',mess14(langue,1,typvol), pypefa(inpype,-vois01)
405 #ifdef _DEBUG_HOMARD_
406 if ( glop.ne.0 ) then
407 write (ulsort,*) '.... le ',mess14(langue,1,typfac), listfa(iaux),
408 > 'est voisin de ',mess14(langue,1,typvo2), pypefa(inpepy,-vois01)
414 c 3.3.2.1. ==> il y a deja un second volume comme voisin de cette face !
416 if ( decisi.eq.2 ) then
418 if ( volfac(2,listfa(iaux)).ne.0 ) then
420 write(ulsort,texte(langue,6)) mess14(langue,1,typfac),
422 write(ulsort,texte(langue,7)) vois01,
423 > volfac(2,listfa(iaux)),
433 c 3.3.3. ==> mise en place du voisin
434 c . Si jaux est > 0, on cree un nouvel indice dans pypefa et
435 c ce sera pour le jaux-eme voisin
436 c . Si jaux < 0, on complete un voisinage, donc c'est
437 c forcement un second voisin.
438 #ifdef _DEBUG_HOMARD_
439 if ( glop.ne.0 ) then
440 write (ulsort,90002) '.... ==> jaux', jaux
443 c 3.3.3.1. ==> creation d'un nouvel indice du voisin
445 if ( jaux.gt.0 ) then
447 #ifdef _DEBUG_HOMARD_
448 if ( glop.ne.0 ) then
449 write (ulsort,90015) '.... ==> enregistrement d''un',jaux,
450 > '-ieme voisin, avec nupype = ', nupype + 1
454 volfac(jaux,listfa(iaux)) = -nupype
455 pypefa(inpype,nupype) = levolu
457 c 3.3.3.2. ==> complement d'un existant
459 elseif ( jaux.lt.0 ) then
460 #ifdef _DEBUG_HOMARD_
461 if ( glop.ne.0 ) then
463 > '.... ==> enregistrement d''un 2-ieme voisin, avec nupype',
468 volfac(2,listfa(iaux)) = vois01
469 pypefa(inpype,-vois01) = levolu
485 if ( codret.ne.0 ) then
489 write (ulsort,texte(langue,1)) 'Sortie', nompro
490 write (ulsort,texte(langue,2)) codret
491 if ( codret.le.2 ) then
492 write (ulsort,texte(langue,5)) mess14(langue,1,7+codret), iaux
497 #ifdef _DEBUG_HOMARD_
498 write (ulsort,texte(langue,1)) 'Sortie', nompro