1 subroutine pcstrg ( nbfonc, ngauss, nbnorf, typgeo, deraff,
8 > conorf, copgrf, wipg,
9 > ulsort, langue, codret )
10 c ______________________________________________________________________
14 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
16 c Version originale enregistree le 18 juin 1996 sous le numero 96036
17 c aupres des huissiers de justice Simart et Lavoir a Clamart
18 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
19 c aupres des huissiers de justice
20 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
22 c HOMARD est une marque deposee d'Electricite de France
28 c ______________________________________________________________________
30 c aPres adaptation - Conversion de Solution -
32 c TRiangles a plusieurs points de Gauss
34 c ______________________________________________________________________
36 c . nom . e/s . taille . description .
37 c .____________________________________________________________________.
38 c . nbfonc . e . 1 . nombre de fonctions aux points de Gauss .
39 c . ngauss . e . 1 . nbre de points de Gauss des fonctions pg .
40 c . nbnorf . e . 1 . nbre de noeuds de l'element de reference .
41 c . typgeo . e . 1 . type geometrique au sens MED .
42 c . deraff . e . 1 . vrai, s'il y a eu du deraffinement en .
43 c . . . . passant de l'iteration n a n+1 ; faux sinon.
44 c . prfcan . e . * . En numero du calcul a l'iteration n : .
45 c . . . . 0 : l'entite est absente du profil .
46 c . . . . i : l'entite est au rang i dans le profil .
47 c . prfcap . es . * . En numero du calcul a l'iteration n+1 : .
48 c . . . . 0 : l'entite est absente du profil .
49 c . . . . 1 : l'entite est presente dans le profil .
50 c . hettri . e . nbtrto . historique de l'etat des triangles .
51 c . filtri . e . nbtrto . premier fils des triangles .
52 c . nbantr . e . 1 . nombre de triangles decoupes par .
53 c . . . . conformite sur le maillage avant adaptation.
54 c . anfitr . e . nbantr . tableau filtri du maillage de l'iteration n.
55 c . ntreca . e . * . nro des triangles dans le calcul en entree .
56 c . ntrsca . e . rstrto . numero des triangles du calcul .
57 c . vafoen . e . nbfonc*. variables en entree de l'adaptation .
59 c . vafott . a . nbfonc*. tableau temporaire de la solution .
61 c . conorf . e . sdim* . coordonnees des noeuds de l'element de .
62 c . . . nbnorf . reference .
63 c . copgrf . e . sdim* . coordonnees des points de Gauss .
64 c . . . ngauss . de l'element de reference .
65 c . wipg . a . nbnorf*. fonctions de forme exprimees aux points de .
66 c . . . ngauss . Gauss .
67 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
68 c . langue . e . 1 . langue des messages .
69 c . . . . 1 : francais, 2 : anglais .
70 c . codret . es . 1 . code de retour des modules .
71 c . . . . 0 : pas de probleme .
72 c . . . . 1 : probleme .
73 c ______________________________________________________________________
76 c 0. declarations et dimensionnement
79 c 0.1. ==> generalites
85 parameter ( nompro = 'PCSTRG' )
101 integer ngauss, nbnorf, typgeo
102 integer prfcan(*), prfcap(*)
103 integer hettri(nbtrto), anctri(*)
104 integer filtri(nbtrto)
105 integer nbantr, anfitr(nbantr)
106 integer ntreca(retrto), ntrsca(rstrto)
108 double precision vafoen(nbfonc,ngauss,*)
109 double precision vafott(nbfonc,ngauss,*)
110 double precision conorf(sdim,nbnorf), copgrf(sdim,ngauss)
111 double precision wipg(nbnorf,ngauss)
115 integer ulsort, langue, codret
117 c 0.4. ==> variables locales
119 c trhn = TRiangle courant en numerotation Homard a l'iteration N
120 c trhnp1 = TRiangle courant en numerotation Homard a l'iteration N+1
124 c etan = ETAt du triangle a l'iteration N
125 c etanp1 = ETAt du triangle a l'iteration N+1
132 parameter ( nbmess = 10 )
133 character*80 texte(nblang,nbmess)
135 c 0.5. ==> initialisations
136 c ______________________________________________________________________
145 #ifdef _DEBUG_HOMARD_
146 write (ulsort,texte(langue,1)) 'Entree', nompro
148 write(ulsort,*) 'nbfonc, ngauss, nbtrto = ',nbfonc, ngauss, nbtrto
152 >'(/,''Triangle en cours : nro a l''''iteration '',a3,'' : '',i10)'
154 > '( '' etat a l''''iteration '',a3,'' : '',i4)'
157 >'(/,''Current triangle : # at iteration '',a3,'' : '',i10)'
159 > '( '' status at iteration '',a3,'' : '',i4)'
163 cgn write (ulsort,90002) 'nbfonc, ngauss, nbnorf',
164 cgn > nbfonc,ngauss,nbnorf
167 c 2. on boucle sur tous les triangles actifs du maillage HOMARD n+1
168 c . soit il etait deja actif dans le maillage precedent : c'est un
169 c transfert direct des valeurs
170 c . soit il ne l'etait pas : il est donc issu d'un decoupage et on va
171 c calculer les valeurs aux points de Gauss en fonction des valeurs
175 #ifdef _DEBUG_HOMARD_
176 write (ulsort,*) '3. Boucle ; codret = ', codret
179 if ( codret.eq.0 ) then
181 if ( nbfonc.ne.0 ) then
183 do 30 , trhnp1 = 1 , nbtrto
185 c 2.1. ==> caracteristiques du triangle :
186 c 2.1.1. ==> son numero homard dans le maillage precedent
189 trhn = anctri(trhnp1)
194 c 2.1.3. ==> l'historique de son etat
195 c On rappelle que l'etat vaut :
196 c etan = 0 : le triangle etait actif
197 c etan = 1, 2, 3 : le triangle etait coupe en 2 selon l'arete
198 c 1, 2, 3 ; il y a eu deraffinement.
199 c etan = 4 : le triangle etait coupe en 4 ; il y a eu
201 c etan = 5 : le triangle n'existait pas ; il a ete produit par
203 c etan = 6, 7, 8 : le triangle etait coupe en 4 avec bascule
204 c de l'arete etan-5 pour le suivi de
205 c frontiere ; il y a eu deraffinement.
207 etanp1 = mod(hettri(trhnp1),10)
208 etan = (hettri(trhnp1)-etanp1) / 10
209 cgn write (ulsort,1792) 'Triangle', trhn, etan, trhnp1, etanp1
211 c=======================================================================
212 c etan = 0 : le triangle etait actif
213 c=======================================================================
215 if ( etan.eq.0 ) then
217 #ifdef _DEBUG_HOMARD_
218 write (ulsort,texte(langue,3)) 'PCSPTZ', nompro
221 call pcsptz ( etan, etanp1, trhn, trhnp1,
225 > nbfonc, ngauss, vafoen, vafott,
226 > ulsort, langue, codret )
228 c=======================================================================
229 c etan = 1, 2, 3 : le triangle etait coupe en 2
230 c=======================================================================
232 elseif ( etan.ge.1 .and. etan.le.3 ) then
234 #ifdef _DEBUG_HOMARD_
235 write (ulsort,texte(langue,3)) 'PCSPTD', nompro
238 call pcsptd ( etan, etanp1, trhn, trhnp1,
240 > hettri, filtri, nbantr, anfitr,
242 > nbfonc, ngauss, vafoen, vafott,
243 > ulsort, langue, codret )
245 c=======================================================================
246 c etan = 4, 6, 7, 8 : le triangle etait coupe en 4
247 c=======================================================================
249 elseif ( etan.eq.4 .or.
250 > ( etan.ge.6 .and. etan.le.8 ) ) then
252 #ifdef _DEBUG_HOMARD_
253 write (ulsort,texte(langue,3)) 'PCSPTQ', nompro
256 call pcsptq ( etanp1, trhn, trhnp1,
258 > filtri, nbantr, anfitr,
260 > nbfonc, ngauss, vafoen, vafott,
261 > ulsort, langue, codret )
275 if ( codret.ne.0 ) then
279 write (ulsort,texte(langue,1)) 'Sortie', nompro
280 write (ulsort,texte(langue,2)) codret
284 #ifdef _DEBUG_HOMARD_
285 write (ulsort,texte(langue,1)) 'Sortie', nompro