1 subroutine pcspt2 ( etan, etanp1, tehn, tehnp1,
3 > hettet, filtet, nbante, anfite,
5 > nbfonc, ngauss, vafoen, vafott,
6 > 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 aPres adaptation - Conversion de Solution Points de Gauss -
29 c Tetraedres d'etat anterieur 2
31 c ______________________________________________________________________
33 c . nom . e/s . taille . description .
34 c .____________________________________________________________________.
35 c . etan . e . 1 . ETAt du tetraedre a l'iteration N .
36 c . etanp1 . e . 1 . ETAt du tetraedre a l'iteration N+1 .
37 c . tehn . e . 1 . TEtraedre courant en numerotation Homard .
38 c . . . . a l'iteration N .
39 c . tehnp1 . e . 1 . TEtraedre courant en numerotation Homard .
40 c . . . . a l'iteration N+1 .
41 c . prfcan . e . * . En numero du calcul a l'iteration n : .
42 c . . . . 0 : l'entite est absente du profil .
43 c . . . . i : l'entite est au rang i dans le profil .
44 c . prfcap . es . * . En numero du calcul a l'iteration n+1 : .
45 c . . . . 0 : l'entite est absente du profil .
46 c . . . . 1 : l'entite est presente dans le profil .
47 c . hettet . e . nbteto . historique de l'etat des tetraedres .
48 c . filtet . e . nbteto . premier fils des tetraedres .
49 c . nbante . e . 1 . nombre de tetraedres decoupes par .
50 c . . . . conformite sur le maillage avant adaptation.
51 c . anfite . e . nbante . tableau filtet du maillage de l'iteration n.
52 c . nteeca . e . reteto . numero des tetraedres dans le calcul entree.
53 c . ntesca . e . rsteto . numero des tetraedres dans le calcul sortie.
54 c . nbfonc . e . 1 . nombre de fonctions elements de volume .
55 c . ngauss . e . 1 . nbre de points de Gauss des fonctions pg .
56 c . vafoen . e . nbfonc*. variables en entree de l'adaptation .
59 c . vafott . es . nbfonc*. variables en sortie de l'adaptation .
62 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
63 c . langue . e . 1 . langue des messages .
64 c . . . . 1 : francais, 2 : anglais .
65 c . codret . es . 1 . code de retour des modules .
66 c . . . . 0 : pas de probleme .
67 c . . . . 1 : probleme .
68 c ______________________________________________________________________
71 c 0. declarations et dimensionnement
74 c 0.1. ==> generalites
80 parameter ( nompro = 'PCSPT2' )
92 integer etan, etanp1, tehn, tehnp1
93 integer nbfonc, ngauss
94 integer prfcan(*), prfcap(*)
95 integer hettet(nbteto), filtet(nbteto)
97 integer anfite(nbante)
98 integer nteeca(reteto), ntesca(rsteto)
100 double precision vafoen(nbfonc,ngauss,*)
101 double precision vafott(nbfonc,ngauss,*)
103 integer ulsort, langue, codret
105 c 0.4. ==> variables locales
107 c tecnp1 = TEtraedre courant en numerotation du Calcul a l'it. N+1
111 c f1hp = Fils 1er du tetraedre en numerotation Homard a l'it. N+1
112 c f1cp = Fils 1er du tetraedre en numerota. du Calcul a l'it. N+1
113 c f2cp = Fils 2eme du tetraedre en numerota. du Calcul a l'it. N+1
114 c f3cp = Fils 3eme du tetraedre en numerota. du Calcul a l'it. N+1
115 c f4cp = Fils 4eme du tetraedre en numerota. du Calcul a l'it. N+1
118 integer f1cp, f2cp, f3cp, f4cp
120 c f1hn = Fils 1er du tetraedre en numerotation Homard a l'it. N
121 c f1cn = Fils 1er du tetraedre en numerotation du Calcul a l'it. N
122 c f2cn = Fils 2eme du tetraedre en numerotation du Calcul a l'it. N
127 integer nrofon, nugaus
131 integer lglist, nrlist
134 double precision daux
135 double precision daux1
138 parameter ( nbmess = 10 )
139 character*80 texte(nblang,nbmess)
141 c 0.5. ==> initialisations
142 c ______________________________________________________________________
150 #ifdef _DEBUG_HOMARD_
151 write (ulsort,texte(langue,1)) 'Entree', nompro
156 >'(/,''Tetr. en cours : numero a l''''iteration '',a3,'' : '',i10)'
158 >'( '' etat a l''''iteration '',a3,'' : '',i4)'
161 >'(/,''Current tetrahedron : # at iteration '',a3,'' : '',i10)'
163 > '( '' status at iteration '',a3,'' : '',i4)'
167 c 1.2. ==> on repere les numeros dans le calcul pour ses deux fils
172 f2cn = nteeca(f1hn+1)
175 c 2. etan = 21, ..., 26 : le tetraedre etait coupe en 2
176 c On explore tous les etats du tetraedre a l'iteration n+1
179 if ( prfcan(f1cn).gt.0 .and. prfcan(f2cn).gt.0 ) then
181 c ===> etanp1 = 0 : le tetraedre est actif
182 c Cela veut dire qu'il est reactive.
183 c on lui attribue la valeur moyenne sur les deux anciens
185 c remarque : cela arrive seulement avec du deraffinement.
187 if ( etanp1.eq.0 ) then
189 tecnp1 = ntesca(tehnp1)
192 daux1 = 1.d0/dble(2*ngauss)
193 do 21 , nrofon = 1, nbfonc
195 do 211 , nugaus = 1, ngauss
196 daux = daux + vafoen(nrofon,nugaus,prfcan(f1cn))
197 > + vafoen(nrofon,nugaus,prfcan(f2cn))
200 do 212 , nugaus = 1 , ngauss
201 vafott(nrofon,nugaus,tecnp1) = daux
204 cgn write(21,91010) tecnp1
205 cgn write(ulsort,91010) f1cn,f2cn,-1,tecnp1
207 c ===> etanp1 = etan : le tetraedre est decoupe en deux
208 c selon le meme decoupage.
209 c c'est ce qui se passe quand un decoupage de conformite
210 c est supprime au debut des algorithmes d'adaptation,
211 c puis reproduit a la creation du maillage car les faces
212 c autour n'ont pas change entre les deux iterations.
213 c le fils prend la valeur de la fonction sur l'ancien
214 c fils qui etait au meme endroit. comme la procedure de
215 c numerotation est la meme (voir cmcdte), le premier fils
216 c est toujours le meme, le second egalement. on prendra
217 c alors la valeur sur le fils de rang identique a
220 elseif ( etanp1.eq.etan ) then
222 f1hp = filtet(tehnp1)
224 f2cp = ntesca(f1hp+1)
227 do 22 , nrofon = 1, nbfonc
228 do 221 , nugaus = 1 , ngauss
229 vafott(nrofon,nugaus,f1cp) =
230 > vafoen(nrofon,nugaus,prfcan(f1cn))
231 vafott(nrofon,nugaus,f2cp) =
232 > vafoen(nrofon,nugaus,prfcan(f2cn))
235 cgn write(22,91010) f1cp,f2cp
236 cgn write(ulsort,91010) f1cn,f2cn,-1,f1cp,f2cp
238 c ===> etanp1 = 21, ..., 26 et different de
239 c etan : le tetraedre est decoupe en deux
240 c mais par un autre decoupage.
241 c c'est ce qui se passe quand un decoupage de conformite
242 c est supprime au debut des algorithmes d'adaptation. il y
243 c a du deraffinement dans la zone qui induisait le decoupage
244 c de conformite et raffinement sur une autre zone.
245 c on donne la valeur moyenne de la fonction sur les deux
246 c anciens fils a chaque nouveau fils.
247 c remarque : cela arrive seulement avec du deraffinement.
249 elseif ( etanp1.ge.21 .and. etanp1.le.26 ) then
251 f1hp = filtet(tehnp1)
253 f2cp = ntesca(f1hp+1)
256 daux1 = 1.d0/dble(2*ngauss)
257 do 23 , nrofon = 1, nbfonc
259 do 231 , nugaus = 1, ngauss
260 daux = daux + vafoen(nrofon,nugaus,prfcan(f1cn))
261 > + vafoen(nrofon,nugaus,prfcan(f2cn))
264 do 232 , nugaus = 1 , ngauss
265 vafott(nrofon,nugaus,f1cp) = daux
266 vafott(nrofon,nugaus,f2cp) = daux
269 cgn write(23,91010) f1cp,f2cp
270 cgn write(ulsort,91010) f1cn,f2cn,-1,f1cp,f2cp
272 c ===> etanp1 = 41, 42, 43 ou 44 : le tetraedre est
273 c decoupe en quatre par une face.
274 c ===> etanp1 = 45, 46 ou 47 : le tetraedre est
275 c decoupe en quatre par une diagonale.
276 c c'est ce qui se passe quand un decoupage de conformite
277 c est supprime au debut des algorithmes d'adaptation, puis
278 c remis differement car l'environnement a change.
279 c on donne la valeur moyenne de la fonction sur les deux
280 c anciens fils a chaque nouveau fils.
281 c remarque : on pourrait certainement faire mieux, avec des
282 c moyennes ponderees en fonction du recouvrement
283 c des anciens et nouveaux fils. c'est trop
284 c complique pour que cela vaille le coup.
286 elseif ( etanp1.ge.41 .and. etanp1.le.47 ) then
288 f1hp = filtet(tehnp1)
290 f2cp = ntesca(f1hp+1)
291 f3cp = ntesca(f1hp+2)
292 f4cp = ntesca(f1hp+3)
297 daux1 = 1.d0/dble(2*ngauss)
298 do 24 , nrofon = 1, nbfonc
300 do 241 , nugaus = 1, ngauss
301 daux = daux + vafoen(nrofon,nugaus,prfcan(f1cn))
302 > + vafoen(nrofon,nugaus,prfcan(f2cn))
305 do 242 , nugaus = 1 , ngauss
306 vafott(nrofon,nugaus,f1cp) = daux
307 vafott(nrofon,nugaus,f2cp) = daux
308 vafott(nrofon,nugaus,f3cp) = daux
309 vafott(nrofon,nugaus,f4cp) = daux
312 cgn write(24,91010) f1cp,f2cp,f3cp,f4cp
313 cgn write(ulsort,91010) f1cn,f2cn,-1,f1cp,f2cp,f3cp,f4cp
315 c ===> etanp1 = 85, 86 ou 87 : le tetraedre est
316 c decoupe en huit par une diagonale.
317 c c'est ce qui se passe quand un decoupage de conformite
318 c est supprime au debut des algorithmes d'adaptation, puis
319 c remis differement car l'environnement a change.
320 c on donne la valeur moyenne de la fonction sur les deux
321 c anciens fils a chaque nouveau fils.
322 c attention : il est possible que les fils sur les bords
323 c soient decoupes par de la conformite. Il faut
324 c alors transmettre la valeur a leurs 2 ou 4
326 c attention : ce n'est pas comme en 2D ; il faut examiner
327 c tous les fils, car par contamination de faces
328 c coupees en 2, les fils centraux peuvent etre
330 c remarque : on pourrait certainement faire mieux, avec des
331 c moyennes ponderees en fonction du recouvrement
332 c des anciens et nouveaux fils. c'est trop
333 c complique pour que cela vaille le coup.
335 elseif ( etanp1.ge.85 .and. etanp1.le.87 ) then
337 f1hp = filtet(tehnp1)
339 do 251 , nrlist = 1 , 8
341 iaux = mod(hettet(fihp),100)
342 if ( iaux.eq.0 ) then
344 list(lglist) = ntesca(fihp)
345 elseif ( iaux.ge.21 .and. iaux.le.26 ) then
347 list(lglist) = ntesca(filtet(fihp))
349 list(lglist) = ntesca(filtet(fihp)+1)
350 elseif ( iaux.ge.41 .and. iaux.le.47 ) then
352 list(lglist) = ntesca(filtet(fihp))
354 list(lglist) = ntesca(filtet(fihp)+1)
356 list(lglist) = ntesca(filtet(fihp)+2)
358 list(lglist) = ntesca(filtet(fihp)+3)
364 do 252 , nrlist = 1 , lglist
365 prfcap(list(nrlist)) = 1
368 daux1 = 1.d0/dble(2*ngauss)
369 do 25 , nrofon = 1, nbfonc
371 do 253 , nugaus = 1, ngauss
372 daux = daux + vafoen(nrofon,nugaus,prfcan(f1cn))
373 > + vafoen(nrofon,nugaus,prfcan(f2cn))
376 do 254 , nugaus = 1 , ngauss
377 do 255 , nrlist = 1 , lglist
378 vafott(nrofon,nugaus,list(nrlist)) = daux
382 cgn write(26,91010) (list(nrlist),nrlist = 1 , lglist)
383 cgn write(ulsort,91010) f1cn,f2cn,-1,
384 cgn > (list(nrlist),nrlist = 1 , lglist)
386 c ==> aucun autre etat sur le tetraedre courant n'est possible
391 write (ulsort,texte(langue,4)) 'n ', tehn
392 write (ulsort,texte(langue,5)) 'n ', etan
393 write (ulsort,texte(langue,4)) 'n+1', tehnp1
394 write (ulsort,texte(langue,5)) 'n+1', etanp1
404 if ( coderr.ne.0 ) then
406 write (ulsort,texte(langue,1)) 'Sortie', nompro
407 write (ulsort,texte(langue,2)) coderr