1 subroutine pcset4 ( etan, etanp1, tehn, tehnp1, typint,
3 > hettet, filtet, nbante, anfite,
5 > nbfonc, 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 Elements de volume -
29 c Tetraedres d'etat anterieur 4
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 . typint . e . 1 . type d'interpolation .
42 c . . . . 0, si automatique .
43 c . . . . elements : 0 si intensif, sans orientation.
44 c . . . . 1 si extensif, sans orientation.
45 c . . . . 2 si intensif, avec orientation.
46 c . . . . 3 si extensif, avec orientation.
47 c . . . . noeuds : 1 si degre 1 .
48 c . . . . 2 si degre 2 .
49 c . . . . 3 si iso-P2 .
50 c . prfcan . e . * . En numero du calcul a l'iteration n : .
51 c . . . . 0 : l'entite est absente du profil .
52 c . . . . i : l'entite est au rang i dans le profil .
53 c . prfcap . es . * . En numero du calcul a l'iteration n+1 : .
54 c . . . . 0 : l'entite est absente du profil .
55 c . . . . 1 : l'entite est presente dans le profil .
56 c . hettet . e . nbteto . historique de l'etat des tetraedres .
57 c . filtet . e . nbteto . premier fils des tetraedres .
58 c . nbante . e . 1 . nombre de tetraedres decoupes par .
59 c . . . . conformite sur le maillage avant adaptation.
60 c . anfite . e . nbante . tableau filtet du maillage de l'iteration n
61 c . nteeca . e . reteto . numero des tetraedres dans le calcul entree.
62 c . ntesca . e . rsteto . numero des tetraedres dans le calcul sortie.
63 c . nbfonc . e . 1 . nombre de fonctions elements de volume .
64 c . vafoen . e . nbfonc*. variables en entree de l'adaptation .
66 c . vafott . es . nbfonc*. variables en sortie de l'adaptation .
68 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
69 c . langue . e . 1 . langue des messages .
70 c . . . . 1 : francais, 2 : anglais .
71 c . codret . es . 1 . code de retour des modules .
72 c . . . . 0 : pas de probleme .
73 c . . . . 1 : probleme .
74 c ______________________________________________________________________
77 c 0. declarations et dimensionnement
80 c 0.1. ==> generalites
86 parameter ( nompro = 'PCSET4' )
103 integer etan, etanp1, tehn, tehnp1
106 integer prfcan(*), prfcap(*)
107 integer hettet(nbteto), filtet(nbteto)
109 integer anfite(nbante)
110 integer nteeca(reteto), ntesca(rsteto)
112 double precision vafoen(nbfonc,*)
113 double precision vafott(nbfonc,*)
115 integer ulsort, langue, codret
117 c 0.4. ==> variables locales
119 c tecnp1 = TEtraedre courant en numerotation du Calcul a l'it. N+1
123 c f1hp = Fils 1er du tetraedre en numerotation Homard a l'it. N+1
124 c fihp = Fils ieme u tetraedre en numerotation Homard a l'it. N+1
125 c f1cp = Fils 1er du tetraedre en numerota. du Calcul a l'it. N+1
126 c f2cp = Fils 2eme du tetraedre en numerota. du Calcul a l'it. N+1
127 c f3cp = Fils 3eme du tetraedre en numerota. du Calcul a l'it. N+1
128 c f4cp = Fils 4eme du tetraedre en numerota. du Calcul a l'it. N+1
131 integer f1cp, f2cp, f3cp, f4cp
133 c f1hn = Fils 1er du tetraedre en numerotation Homard a l'it. N
134 c f1cn = Fils 1er du tetraedre en numerotation du Calcul a l'it. N
135 c f2cn = Fils 2eme du tetraedre en numerotation du Calcul a l'it. N
136 c f3cn = Fils 3eme du tetraedre en numerotation du Calcul a l'it. N
137 c f4cn = Fils 4eme du tetraedre en numerotation du Calcul a l'it. N
140 integer f1cn, f2cn, f3cn, f4cn
142 c f1fcp = Fils 1er du Fils en numerotation Calcul a l'it. N+1
143 c f2fcp = Fils 2eme du Fils en numerotation Calcul a l'it. N+1
144 c f3fcp = Fils 3eme du Fils en numerotation Calcul a l'it. N+1
145 c f4fcp = Fils 4eme du Fils en numerotation Calcul a l'it. N+1
147 integer f1fcp, f2fcp, f3fcp, f4fcp
153 integer lglist, nrlist
156 double precision daux
157 double precision daux1
160 parameter ( nbmess = 10 )
161 character*80 texte(nblang,nbmess)
163 c 0.5. ==> initialisations
164 c ______________________________________________________________________
172 #ifdef _DEBUG_HOMARD_
173 write (ulsort,texte(langue,1)) 'Entree', nompro
178 >'(/,''Tetr. en cours : numero a l''''iteration '',a3,'' : '',i10)'
180 >'( '' etat a l''''iteration '',a3,'' : '',i4)'
183 >'(/,''Current tetrahedron : # at iteration '',a3,'' : '',i10)'
185 > '( '' status at iteration '',a3,'' : '',i4)'
189 c 1.2. ==> on repere les numeros dans le calcul pour ses quatre fils
194 f2cn = nteeca(f1hn+1)
195 f3cn = nteeca(f1hn+2)
196 f4cn = nteeca(f1hn+3)
198 if ( prfcan(f1cn).gt.0 .and. prfcan(f2cn).gt.0 .and.
199 > prfcan(f3cn).gt.0 .and. prfcan(f4cn).gt.0 ) then
202 c 2. etan = 41, ..., 44 : le tetraedre etait coupe en 4
203 c selon la face 1, 2, 3, 4
204 c etan = 45, 46, 47 : le tetraedre etait coupe en 4
205 c selon une diagonale
208 c 2.1. ==> etanp1 = 0 : le tetraedre est reactive.
210 if ( etanp1.eq.0 ) then
212 tecnp1 = ntesca(tehnp1)
215 if ( typint.eq.0 ) then
220 do 21 , nrofon = 1, nbfonc
221 daux = daux1 * ( vafoen(nrofon,prfcan(f1cn))
222 > + vafoen(nrofon,prfcan(f2cn))
223 > + vafoen(nrofon,prfcan(f3cn))
224 > + vafoen(nrofon,prfcan(f4cn)) )
225 vafott(nrofon,tecnp1) = daux
227 cgn write (41,7777) tecnp1
228 cgn write (ulsort,7777) f1cn,f2cn,f3cn,f4cn,-1,tecnp1
231 c 2.2. ==> etanp1 = 21, ...,26 : le tetraedre est decoupe en deux
232 c c'est ce qui se passe quand un decoupage de conformite
233 c est supprime au debut des algorithmes d'adaptation,
234 c puis reproduit a la creation du maillage car les faces
235 c autour n'ont pas change entre les deux iterations.
236 c on donne la valeur moyenne de la fonction sur les quatre
237 c anciens fils a chaque nouveau fils.
238 c remarque : on pourrait certainement faire mieux, avec des
239 c moyennes ponderees en fonction du recouvrement
240 c des anciennes et nouvelles filles. c'est trop
241 c complique pour que cela vaille le coup.
242 c remarque : cela arrive seulement avec du deraffinement.
244 elseif ( etanp1.ge.21 .and. etanp1.le.26 ) then
246 f1hp = filtet(tehnp1)
248 f2cp = ntesca(f1hp+1)
251 if ( typint.eq.0 ) then
256 do 22 , nrofon = 1, nbfonc
257 daux = daux1 * ( vafoen(nrofon,prfcan(f1cn))
258 > + vafoen(nrofon,prfcan(f2cn))
259 > + vafoen(nrofon,prfcan(f3cn))
260 > + vafoen(nrofon,prfcan(f4cn)) )
261 vafott(nrofon,f1cp) = daux
262 vafott(nrofon,f2cp) = daux
264 cgn write(42,7777) f1cp,f2cp
265 cgn write(ulsort,7777) f1cn,f2cn,f3cn,f4cn,-1,
268 c 2.3. ==> etanp1 = etan : le tetraedre est decoupe en
269 c quatre selon le meme decoupage.
270 c c'est ce qui se passe quand un decoupage de conformite
271 c est supprime au debut des algorithmes d'adaptation,
272 c puis reproduit a la creation du maillage car les faces
273 c autour n'ont pas change entre les deux iterations.
274 c le fils prend la valeur de la fonction sur l'ancien
275 c fils qui etait au meme endroit. comme la procedure de
276 c numerotation est la meme (voir cmcdte), le premier fils
277 c est toujours le meme, le second egalement. on prendra
278 c alors la valeur sur le fils de rang identique a
281 elseif ( etanp1.eq.etan ) then
283 f1hp = filtet(tehnp1)
285 f2cp = ntesca(f1hp+1)
286 f3cp = ntesca(f1hp+2)
287 f4cp = ntesca(f1hp+3)
292 do 23 , nrofon = 1, nbfonc
293 vafott(nrofon,f1cp) = vafoen(nrofon,prfcan(f1cn))
294 vafott(nrofon,f2cp) = vafoen(nrofon,prfcan(f2cn))
295 vafott(nrofon,f3cp) = vafoen(nrofon,prfcan(f3cn))
296 vafott(nrofon,f4cp) = vafoen(nrofon,prfcan(f4cn))
298 cgn write(43,7777) f1cp,f2cp,f3cp,f4cp
299 cgn write(ulsort,7777) f1cn,f2cn,f3cn,f4cn,-1,
300 cgn > f1cp,f2cp,f3cp,f4cp
302 c 2.4. ==> etanp1 = 41, ..., 47 et different de
303 c etan : le tetraedre est decoupe en quatre
304 c mais par un autre decoupage.
305 c c'est ce qui se passe quand un decoupage de conformite
306 c est supprime au debut des algorithmes d'adaptation. il y
307 c a du deraffinement dans la zone qui induisait le decoupage
308 c de conformite et raffinement sur une autre zone.
309 c on donne la valeur moyenne de la fonction sur les quatre
310 c anciens fils a chaque nouveau fils.
311 c remarque : on pourrait certainement faire mieux, avec des
312 c moyennes ponderees en fonction du recouvrement
313 c des anciens et nouveaux fils. c'est trop
314 c complique pour que cela vaille le coup.
315 c remarque : cela arrive seulement avec du deraffinement.
317 elseif ( etanp1.ge.41 .and. etanp1.le.47 ) then
319 f1hp = filtet(tehnp1)
321 f2cp = ntesca(f1hp+1)
322 f3cp = ntesca(f1hp+2)
323 f4cp = ntesca(f1hp+3)
328 do 24 , nrofon = 1, nbfonc
329 daux = unsqu * ( vafoen(nrofon,prfcan(f1cn))
330 > + vafoen(nrofon,prfcan(f2cn))
331 > + vafoen(nrofon,prfcan(f3cn))
332 > + vafoen(nrofon,prfcan(f4cn)) )
333 vafott(nrofon,f1cp) = daux
334 vafott(nrofon,f2cp) = daux
335 vafott(nrofon,f3cp) = daux
336 vafott(nrofon,f4cp) = daux
338 cgn write(44,7777) f1cp,f2cp,f3cp,f4cp
339 cgn write(ulsort,7777) f1cn,f2cn,f3cn,f4cn,-1,
340 cgn > f1cp,f2cp,f3cp,f4cp
342 c 2.5. ==> etanp1 = 85, 86 ou 87 : le tetraedre est
343 c decoupe en huit par une diagonale.
344 c c'est ce qui se passe quand un decoupage de conformite
345 c est supprime au debut des algorithmes d'adaptation, puis
346 c remis differement car l'environnement a change.
347 c on donne la valeur moyenne de la fonction sur les quatre
348 c anciens fils a chaque nouveau fils.
349 c attention : il est possible que les fils sur les bords
350 c soient decoupes par de la conformite. Il faut
351 c alors transmettre la valeur a leurs 2 ou 4
353 c attention : ce n'est pas comme en 2D ; il faut examiner
354 c tous les fils, car par contamination de faces
355 c coupees en 2, les fils centraux peuvent etre
357 c remarque : on pourrait certainement faire mieux, avec des
358 c moyennes ponderees en fonction du recouvrement
359 c des anciens et nouveaux fils. c'est trop
360 c complique pour que cela vaille le coup.
362 elseif ( etanp1.ge.85 .and. etanp1.le.87 ) then
364 f1hp = filtet(tehnp1)
365 if ( typint.eq.0 ) then
368 do 250 , nrlist = 1 , 8
370 iaux = mod(hettet(fihp),100)
371 if ( iaux.eq.0 ) then
373 list(lglist) = ntesca(fihp)
374 elseif ( iaux.ge.21 .and. iaux.le.26 ) then
376 list(lglist) = ntesca(filtet(fihp))
378 list(lglist) = ntesca(filtet(fihp)+1)
379 elseif ( iaux.ge.41 .and. iaux.le.47 ) then
381 list(lglist) = ntesca(filtet(fihp))
383 list(lglist) = ntesca(filtet(fihp)+1)
385 list(lglist) = ntesca(filtet(fihp)+2)
387 list(lglist) = ntesca(filtet(fihp)+3)
393 do 260 , nrlist = 1 , lglist
394 prfcap(list(nrlist)) = 1
397 do 270 , nrofon = 1, nbfonc
398 daux = unsqu * ( vafoen(nrofon,prfcan(f1cn))
399 > + vafoen(nrofon,prfcan(f2cn))
400 > + vafoen(nrofon,prfcan(f3cn))
401 > + vafoen(nrofon,prfcan(f4cn)) )
402 do 2701 , nrlist = 1 , lglist
403 vafott(nrofon,list(nrlist)) = daux
409 do 251 , nrlist = 1 , 8
412 iaux = mod(hettet(fihp),100)
413 if ( iaux.eq.0 ) then
416 do 2511 , nrofon = 1, nbfonc
417 daux = unshu * ( vafoen(nrofon,prfcan(f1cn))
418 > + vafoen(nrofon,prfcan(f2cn))
419 > + vafoen(nrofon,prfcan(f3cn))
420 > + vafoen(nrofon,prfcan(f4cn)) )
421 vafott(nrofon,f1cp) = daux
423 elseif ( iaux.ge.21 .and. iaux.le.26 ) then
424 f1fcp = ntesca(filtet(fihp))
425 f2fcp = ntesca(filtet(fihp)+1)
428 do 2512 , nrofon = 1, nbfonc
429 daux = unssz * ( vafoen(nrofon,prfcan(f1cn))
430 > + vafoen(nrofon,prfcan(f2cn))
431 > + vafoen(nrofon,prfcan(f3cn))
432 > + vafoen(nrofon,prfcan(f4cn)) )
433 vafott(nrofon,f1fcp) = daux
434 vafott(nrofon,f2fcp) = daux
436 elseif ( iaux.ge.41 .and. iaux.le.47 ) then
437 f1fcp = ntesca(filtet(fihp))
438 f2fcp = ntesca(filtet(fihp)+1)
439 f3fcp = ntesca(filtet(fihp)+2)
440 f4fcp = ntesca(filtet(fihp)+3)
445 do 2513 , nrofon = 1, nbfonc
446 daux = unstr2 * ( vafoen(nrofon,prfcan(f1cn))
447 > + vafoen(nrofon,prfcan(f2cn))
448 > + vafoen(nrofon,prfcan(f3cn))
449 > + vafoen(nrofon,prfcan(f4cn)) )
450 vafott(nrofon,f1fcp) = daux
451 vafott(nrofon,f2fcp) = daux
452 vafott(nrofon,f3fcp) = daux
453 vafott(nrofon,f4fcp) = daux
462 cgn write(46,7777) (list(nrlist),nrlist = 1 , lglist)
463 cgn write(ulsort,7777) f1cn,f2cn,f3cn,f4cn,-1,
464 cgn > (list(nrlist),nrlist = 1 , lglist)
466 c 2.6. ==> aucun autre etat sur le tetraedre courant
472 write (ulsort,texte(langue,4)) 'n ', tehn
473 write (ulsort,texte(langue,5)) 'n ', etan
474 write (ulsort,texte(langue,4)) 'n+1', tehnp1
475 write (ulsort,texte(langue,5)) 'n+1', etanp1
485 if ( coderr.ne.0 ) then
487 write (ulsort,texte(langue,1)) 'Sortie', nompro
488 write (ulsort,texte(langue,2)) coderr