1 subroutine pcsptd ( etan, etanp1, trhn, trhnp1,
3 > hettri, filtri, nbantr, anfitr,
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 Triangles d'etat anterieur Deux
31 c ______________________________________________________________________
33 c . nom . e/s . taille . description .
34 c .____________________________________________________________________.
35 c . etan . e . 1 . ETAt du triangle a l'iteration N .
36 c . etanp1 . e . 1 . ETAt du triangle a l'iteration N+1 .
37 c . trhn . e . 1 . TRiangle courant en numerotation Homard .
38 c . . . . a l'iteration N .
39 c . trhnp1 . e . 1 . TRiangle 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 . hettri . e . nbtrto . historique de l'etat des triangles .
48 c . filtri . e . nbtrto . premier fils des triangles .
49 c . nbantr . e . 1 . nombre de triangles decoupes par .
50 c . . . . conformite sur le maillage avant adaptation.
51 c . anfitr . e . nbantr . tableau filtri du maillage de l'iteration n.
52 c . ntreca . e . retrto . numero des triangles dans le calcul entree .
53 c . ntrsca . e . rstrto . numero des triangles du calcul en 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*. tableau temporaire de la solution .
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 = 'PCSPTD' )
92 integer etan, etanp1, trhn, trhnp1
93 integer nbfonc, ngauss
94 integer prfcan(*), prfcap(*)
95 integer hettri(nbtrto), filtri(nbtrto)
97 integer anfitr(nbantr)
98 integer ntreca(retrto), ntrsca(rstrto)
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 trcnp1 = TRiangle courant en numerotation Calcul a l'iteration N+1
111 c f1hp = Fils 1er du triangle en numerotation Homard a l'it. N+1
112 c f1cp = Fils 1er du triangle en numerota. du Calcul a l'it. N+1
113 c f2cp = Fils 2eme du triangle en numerota. du Calcul a l'it. N+1
118 c f1hn = Fils 1er du triangle en numerotation Homard a l'it. N
119 c f1cn = Fils 1er du triangle en numerotation du Calcul a l'it. N
120 c f2cn = Fils 2eme du triangle en numerotation du Calcul a l'it. N
126 integer lglist, nrlist
130 integer nrofon, nugaus
132 double precision daux
133 double precision daux1
136 parameter ( nbmess = 10 )
137 character*80 texte(nblang,nbmess)
139 c 0.5. ==> initialisations
140 c ______________________________________________________________________
148 #ifdef _DEBUG_HOMARD_
149 write (ulsort,texte(langue,1)) 'Entree', nompro
154 >'(/,''Triangle en cours : nro a l''''iteration '',a3,'' : '',i10)'
156 > '( '' etat a l''''iteration '',a3,'' : '',i4)'
159 >'(/,''Current triangle : # at iteration '',a3,'' : '',i10)'
161 > '( '' status at iteration '',a3,'' : '',i4)'
167 c 1.2. ==> on repere les numeros dans le calcul pour ses deux fils
172 f2cn = ntreca(f1hn+1)
175 c 2. etan = 1, 2, 3 : le triangle etait actif
176 c On explore tous les etats du triangle a l'iteration n+1
178 cgn write (ulsort,90002) 'etanp1', etanp1
180 if ( prfcan(f1cn).gt.0 .and. prfcan(f2cn).gt.0 ) then
182 c ===> etanp1 = 0 : le triangle est actif
183 c Cela veut dire qu'il est reactive.
184 c on lui attribue la valeur moyenne sur les deux anciens
186 c remarque : cela arrive seulement avec du deraffinement.
188 if ( etanp1.eq.0 ) then
190 trcnp1 = ntrsca(trhnp1)
193 daux1 = 1.d0/dble(2*ngauss)
194 do 21 , nrofon = 1 , nbfonc
196 do 211 , nugaus = 1, ngauss
197 daux = daux + vafoen(nrofon,nugaus,prfcan(f1cn))
198 > + vafoen(nrofon,nugaus,prfcan(f2cn))
201 do 212 , nugaus = 1 , ngauss
202 vafott(nrofon,nugaus,trcnp1) = daux
206 c etanp1 = etan : le triangle est decoupe en deux
207 c selon le meme decoupage.
208 c c'est ce qui se passe quand un decoupage de conformite
209 c est supprime au debut des algorithmes d'adaptation,
210 c puis reproduit a la creation du maillage car les faces
211 c autour n'ont pas change entre les deux iterations.
212 c le fils prend la valeur de la fonction sur l'ancien
213 c fils qui etait au meme endroit. comme la procedure de
214 c numerotation est la meme (voir cmcdtr), le premier fils
215 c est toujours le meme, le second egalement. on prendra
216 c alors la valeur sur le fils de rang identique a
219 elseif ( etanp1.eq.etan ) then
221 f1hp = filtri(trhnp1)
223 f2cp = ntrsca(f1hp+1)
226 do 22 , nrofon = 1, nbfonc
227 do 221 , nugaus = 1 , ngauss
228 vafott(nrofon,nugaus,f1cp) =
229 > vafoen(nrofon,nugaus,prfcan(f1cn))
230 vafott(nrofon,nugaus,f2cp) =
231 > vafoen(nrofon,nugaus,prfcan(f2cn))
235 c etanp1 = 1, 2, 3 et different de etan : le triangle est decoupe
236 c en deux mais par un autre decoupage.
237 c c'est ce qui se passe quand un decoupage de conformite
238 c est supprime au debut des algorithmes d'adaptation. il y
239 c a du deraffinement dans la zone qui induisait le decoupage
240 c de conformite et raffinement sur une autre zone.
241 c on donne la valeur moyenne de la fonction sur les deux
242 c anciens fils a chaque nouveau fils.
243 c remarque : cela arrive seulement avec du deraffinement.
245 elseif ( etanp1.ge.1 .and. etanp1.le.3 ) then
247 f1hp = filtri(trhnp1)
249 f2cp = ntrsca(f1hp+1)
252 daux1 = 1.d0/dble(2*ngauss)
253 do 23 , nrofon = 1 , nbfonc
255 do 231 , nugaus = 1, ngauss
256 daux = daux + vafoen(nrofon,nugaus,prfcan(f1cn))
257 > + vafoen(nrofon,nugaus,prfcan(f2cn))
260 do 232 , nugaus = 1 , ngauss
261 vafott(nrofon,nugaus,trcnp1) = daux
265 c etanp1 = 4, 6, 7, 8 : le triangle est decoupe en 4
266 c on donne la valeur moyenne de la fonction sur les deux
267 c anciens fils a chaque nouveau fils.
269 elseif ( etanp1.eq.4 .or.
270 > ( etanp1.ge.6 .and. etanp1.le.8 ) ) then
272 f1hp = filtri(trhnp1)
274 do 241 , nrlist = 1 , 4
276 iaux = mod(hettri(fihp),10)
277 if ( iaux.eq.0 ) then
279 list(lglist) = ntrsca(fihp)
280 elseif ( iaux.ge.1 .and. iaux.le.3 ) then
282 list(lglist) = ntrsca(filtri(fihp))
284 list(lglist) = ntrsca(filtri(fihp)+1)
290 do 242 , nrlist = 1 , lglist
291 prfcap(list(nrlist)) = 1
294 daux1 = 1.d0/dble(2*ngauss)
295 do 24 , nrofon = 1 , nbfonc
297 do 243 , nugaus = 1, ngauss
298 daux = daux + vafoen(nrofon,nugaus,prfcan(f1cn))
299 > + vafoen(nrofon,nugaus,prfcan(f2cn))
302 do 244 , nugaus = 1, ngauss
303 do 245 , nrlist = 1 , lglist
304 vafott(nrofon,nugaus,list(nrlist)) = daux
310 c doc.0.erreur. ==> aucun autre etat sur le courant elgnairt
316 write (ulsort,texte(langue,4)) 'n ', trhn
317 write (ulsort,texte(langue,5)) 'n ', etan
318 write (ulsort,texte(langue,4)) 'n+1', trhnp1
319 write (ulsort,texte(langue,5)) 'n+1', etanp1
329 if ( coderr.ne.0 ) then
331 write (ulsort,texte(langue,1)) 'Sortie', nompro
332 write (ulsort,texte(langue,2)) coderr