1 subroutine uthequ ( decisi,
2 > nbquto, nbheto, nbhecf, nbpyto, nbpycf,
3 > quahex, hethex, filhex,
7 > 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 - HExaedres - QUadrangles
31 c ______________________________________________________________________
33 c but : etablit le tableau volqua a partir de son reciproque, quahex
34 c ______________________________________________________________________
36 c . nom . e/s . taille . description .
37 c .____________________________________________________________________.
38 c . decisi . e . 1 . pilotage des voisins des quadrangles : .
39 c . . . . 1 : on construit la table. .
40 c . . . . 2 : on construit la table et on controle .
41 c . . . . a. qu'il n'y a pas de hexaedre doubles .
42 c . . . . b. qu'un quadrangle n'appartient pas a plus.
43 c . . . . de 2 hexaedres .
44 c . nbquto . e . 1 . nombre de quadrangles total .
45 c . nbheto . e . 1 . nombre d'hexaedres total .
46 c . nbhecf . e . 1 . nombre d'hexaedres decrits par faces .
47 c . nbpyto . e . 1 . nombre de pyramides total .
48 c . nbpycf . e . 1 . nombre de pyramides decrites par faces .
49 c . quahex . e .nbhecf*6. numeros des 6 quadrangles des hexaedres .
50 c . hethex . e . nbheto . historique des etats des hexaedres .
51 c . filhex . e . nbheto . premier fils des hexaedres .
52 c . fhpyte . e .2*nbhedc. fhpyte(1,j) = numero de la 1ere pyramide .
53 c . . . . fille de l'hexaedre k tel que filhex(k) =-j.
54 c . . . . fhpyte(2,j) = numero du 1er tetraedre .
55 c . . . . fils de l'hexaedre k tel que filhex(k) = -j.
56 c . facpyr . e .nbpycf*5. numeros des 5 faces des pyramides .
57 c . volqua . s .nbquto*2. numeros des 2 volumes par quadrangle .
58 c . . . . volqua(i,k) definit le i-eme voisin de k .
59 c . . . . 0 : pas de voisin .
60 c . . . . j>0 : hexaedre j .
61 c . . . . j<0 : pyramide/pentaedre dans pypequ(1/2,j).
62 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
63 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
64 c . langue . e . 1 . langue des messages .
65 c . . . . 1 : francais, 2 : anglais .
66 c . codret . es . 1 . code de retour des modules .
67 c . . . . 0 : pas de probleme .
68 c . . . . 1 : probleme dans le controle .
69 c . . . . 3 : probleme de hexaedres doubles .
70 c ______________________________________________________________________
73 c 0. declarations et dimensionnement
76 c 0.1. ==> generalites
82 parameter ( nompro = 'UTHEQU' )
93 integer nbquto, nbheto, nbhecf, nbpyto, nbpycf
94 integer filhex(nbheto), hethex(nbheto), quahex(nbhecf,6)
96 integer facpyr(nbpycf,5)
97 integer volqua(2,nbquto)
100 integer ulsort, langue, codret
102 c 0.4. ==> variables locales
104 integer iaux, jaux, kaux
105 integer codre1, codre2
106 integer etat, bindec, nbfipy
109 integer lequad, quad(6), quabis(6), quadcl(6), quabcl(6)
110 #ifdef _DEBUG_HOMARD_
115 parameter ( nbmess = 10 )
116 character*80 texte(nblang,nbmess)
118 c 0.5. ==> initialisations
119 c ______________________________________________________________________
127 #ifdef _DEBUG_HOMARD_
128 write (ulsort,texte(langue,1)) 'Entree', nompro
133 > '(/,''Le quadrangle'',i10,'' a plus de deux voisins ?'')'
134 texte(1,5) = '(''Hexaedres :'',3i10,/)'
136 > '(/,''Les deux hexaedres suivants sont identiques.'')'
138 > '(''Quadrangles du hexaedre numero :'',i10,'' : '',4i10)'
141 > '(/,''Quadrangle'',i10,'' has more than 2 neighbours ?'')'
142 texte(2,5) = '(''Tetraedra :'',3i10,/)'
143 texte(2,6) = '(/,''The following two tetraedra are the same.'')'
144 texte(2,7) ='(''Quadrangles of hexahedron #'',i10,'' : '',4i10)'
150 #ifdef _DEBUG_HOMARD_
151 write(ulsort,90002) 'nbquto', nbquto
152 write(ulsort,90002) 'nbheto', nbheto
153 write(ulsort,90002) 'nbhecf', nbhecf
154 write(ulsort,90002) 'nbpyto', nbpyto
155 write(ulsort,90002) 'nbpycf', nbpycf
159 c 2. liste des hexaedres s'appuyant sur chaque quadrangle
160 c attention : a priori, un quadrangle borde 0, 1 ou 2 hexaedres
163 c 2. ==> on regarde tous les hexaedres decrits par faces
165 do 20 , lehexa = 1 , nbhecf
167 c 2.1. ==> les quadrangles du hexaedre en cours d'examen
169 quad(1) = quahex(lehexa,1)
170 quad(2) = quahex(lehexa,2)
171 quad(3) = quahex(lehexa,3)
172 quad(4) = quahex(lehexa,4)
173 quad(5) = quahex(lehexa,5)
174 quad(6) = quahex(lehexa,6)
175 #ifdef _DEBUG_HOMARD_
176 if ( lehexa.eq.-437 .or. lehexa.le.-438 ) then
177 write(ulsort,90015) 'quads de hexa', lehexa,' :', quad
184 c 2.2. ==> quand un hexaedre est decoupe pour la mise en
185 c conformite, certains de ses quadrangles sont des bords de
186 c l'hexaedre et de ses fils.
187 c La convention HOMARD veut que l'on ne memorise que le fils
188 c dans les voisins du quadrangle.
189 c on va alors annuler le numero du quadrangle pour ne rien
190 c archiver maintenant.
192 etat = mod(hethex(lehexa),1000)
193 #ifdef _DEBUG_HOMARD_
194 if ( glop.gt.0 ) then
195 write(ulsort,90015) 'etat de hexa', lehexa,' :',etat
199 if ( etat.ge.11 ) then
201 bindec = chbiet(etat)
202 nbfipy = chnpy(bindec)
203 #ifdef _DEBUG_HOMARD_
204 if ( glop.gt.0 ) then
205 write(ulsort,90002) 'bindec, nbfipy', bindec, nbfipy
206 write(ulsort,90015) 'fils de ', lehexa,' :', filhex(lehexa)
210 if ( nbfipy.gt.0 ) then
212 if ( filhex(lehexa).lt.0 ) then
214 iaux = -filhex(lehexa)
215 fils = fhpyte(1,iaux)
216 #ifdef _DEBUG_HOMARD_
217 if ( glop.gt.0 ) then
218 write(ulsort,90002) 'fils, nbpycf', fils, nbpycf
222 if ( fils.le.nbpycf ) then
224 do 22 , jaux = 1 , nbfipy
225 do 221 , lequad = 1 , 6
226 if ( quad(lequad).eq.facpyr(fils,5) ) then
234 #ifdef _DEBUG_HOMARD_
235 if ( glop.gt.0 ) then
236 write(ulsort,90015) 'quads de hexa', lehexa,' :', quad
246 c 2.3. ==> pour chacun des 6 quadrangles encore a traiter
248 do 23 , lequad = 1 , 6
250 if ( quad(lequad).gt.0 ) then
252 c 2.3.1. ==> aucun voisin n'existe : on met l'hexaedre courant
253 c comme premier voisin
255 if ( volqua(1,quad(lequad)).eq.0 ) then
257 volqua(1,quad(lequad)) = lehexa
261 c 2.3.2. ==> il existe un premier voisin
263 c 2.3.2.1. ==> en cas de controle :
265 if ( decisi.eq.2 ) then
267 c 2.3.2.1.1. ==> on verifie que le second hexaedre n'est pas identique
268 c au premier. Pour cela, on trie les tableaux des
269 c quadrangles par numero de quadrangles croissant et
272 if ( volqua(2,quad(lequad)).eq.0 ) then
274 if ( volqua(1,quad(lequad)).gt.0 ) then
276 quabis(1) = quahex(volqua(1,quad(lequad)),1)
277 quabis(2) = quahex(volqua(1,quad(lequad)),2)
278 quabis(3) = quahex(volqua(1,quad(lequad)),3)
279 quabis(4) = quahex(volqua(1,quad(lequad)),4)
280 quabis(5) = quahex(volqua(1,quad(lequad)),5)
281 quabis(6) = quahex(volqua(1,quad(lequad)),6)
283 call uttrii ( quadcl, jaux, kaux,
285 > ulsort, langue, codre1 )
287 call uttrii ( quabcl, jaux, kaux,
289 > ulsort, langue, codre2 )
291 if ( codre1.eq.0 .and. codre2.eq.0 ) then
292 if ( quad(quadcl(1)).eq.quabis(quabcl(1)) .and.
293 > quad(quadcl(2)).eq.quabis(quabcl(2)) .and.
294 > quad(quadcl(3)).eq.quabis(quabcl(3)) .and.
295 > quad(quadcl(4)).eq.quabis(quabcl(4)) .and.
296 > quad(quadcl(5)).eq.quabis(quabcl(5)) .and.
297 > quad(quadcl(6)).eq.quabis(quabcl(6)) ) then
298 write(ulsort,texte(langue,6))
299 write(ulsort,texte(langue,7)) lehexa, quad
300 write(ulsort,texte(langue,7))
301 > volqua(1,quad(lequad)), quabis
310 c 2.3.2.1.2. ==> il y a deja un second volume comme voisin de ce
315 write(ulsort,texte(langue,4)) quad(lequad)
316 write(ulsort,texte(langue,5)) volqua(1,quad(lequad)),
317 > volqua(2,quad(lequad)),
325 c 2.3.2.2. ==> il existe un premier voisin : on met l'hexaedre
326 c courant comme second voisin
328 volqua(2,quad(lequad)) = lehexa
342 if ( codret.ne.0 ) then
346 write (ulsort,texte(langue,1)) 'Sortie', nompro
347 write (ulsort,texte(langue,2)) codret
351 #ifdef _DEBUG_HOMARD_
352 write (ulsort,texte(langue,1)) 'Sortie', nompro