1 subroutine pcsteg ( 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 TEtraedres 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 . hettet . e . nbteto . historique de l'etat des tetraedres .
51 c . filtet . e . nbteto . premier fils des tetraedres .
52 c . nbante . e . 1 . nombre de tetraedres decoupes par .
53 c . . . . conformite sur le maillage avant adaptation.
54 c . anfite . e . nbante . tableau filtet du maillage de l'iteration n.
55 c . nteeca . e . * . numero des tetraedres dans le calcul entree.
56 c . ntesca . e . rsteto . numero des tetraedres dans le calcul sortie.
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 = 'PCSTEG' )
101 integer ngauss, nbnorf, typgeo
102 integer prfcan(*), prfcap(*)
103 integer hettet(nbteto), anctet(*)
104 integer filtet(nbteto)
105 integer nbante, anfite(nbante)
106 integer nteeca(reteto), ntesca(rsteto)
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
121 c tehn = TEtraedre courant en numerotation Homard a l'it. N
122 c tehnp1 = TEtraedre courant en numerotation Homard a l'it. N+1
126 c etan = ETAt du tetraedre a l'iteration N
127 c etanp1 = ETAt du tetraedre 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
150 cgn write (ulsort,*) 'prfcan en entree de '//nompro
151 cgn write (ulsort,91020) (prfcan(iaux),iaux=1,17)
152 cgn write (ulsort,*) 'nteeca en entree de '//nompro
153 cgn write (ulsort,91020) (nteeca(iaux),iaux=1,5)
154 cgn write (ulsort,*) 'vafoen en entree de '//nompro
155 cgn do 111 , etan = 1 , nbfonc
156 cgn write (ulsort,90002) 'composante',etan
157 cgn do 1111 , etanp1 = 1 , 8
158 cgn write (ulsort,92010) (vafoen(etan,etanp1,iaux),iaux=1,5)
165 c 2. on boucle sur tous les tetraedres du maillage HOMARD n+1
166 c on trie en fonction de l'etat du tetraedre dans le maillage n
167 c on numerote les paragraphes en fonction de la documentation, a
168 c savoir : le paragraphe doc.n.p traite de la mise a jour de solution
169 c pour un tetraedre dont l'etat est passe de n a p.
170 c les autres paragraphes sont numerotes classiquement
171 c remarque : on a scinde en plusieurs programmes pour pouvoir passer
172 c les options de compilation optimisees.
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 , tehnp1 = 1 , nbteto
185 c 2.1. ==> caracteristiques du tetraedre :
186 c 2.1.1. ==> son numero homard dans le maillage precedent
189 tehn = anctet(tehnp1)
194 c 2.1.2. ==> l'historique de son etat
195 c On rappelle que l'etat vaut :
196 c etan = 0 : le tetraedre etait actif.
197 c etan = 21, ..., 26 : le tetraedre etait coupe en 2 selon
198 c l'arete 1, ..., 6 ; il y a eu deraffinement.
199 c etan = 41, ..., 44 : le tetraedre etait coupe en 4 selon la
200 c face 1, ..., 4 ; il y a eu deraffinement.
201 c etan = 45, 46, 47 : le tetraedre etait coupe en 4 selon la
202 c diagonale 1-6, 2-5, 3-4 ; il y a eu
204 c etan = 55 : le tetraedre n'existait pas ; il a ete produit par
206 c etan = 85, 86, 87 : le tetraedre etait coupe en 8 selon la
207 c diagonale 1-6, 2-5, 3-4 ; il y a eu
210 etanp1 = mod(hettet(tehnp1),100)
211 etan = (hettet(tehnp1)-etanp1) / 100
213 cgn write (ulsort,1792) 'Tetraedre', tehn, etan, tehnp1, etanp1
215 c=======================================================================
216 c doc.0.p. ==> etan = 0 : le tetraedre etait actif
217 c=======================================================================
219 if ( etan.eq.0 ) then
221 #ifdef _DEBUG_HOMARD_
222 write (ulsort,texte(langue,3)) 'PCSPT0', nompro
225 call pcspt0 ( etan, etanp1, tehn, tehnp1,
229 > nbfonc, ngauss, vafoen, vafott,
230 > ulsort, langue, codret )
232 c=======================================================================
233 c doc.21-26.p. ==> etan = 21, ..., 26 : le tetraedre etait coupe en 2
234 c=======================================================================
236 elseif ( etan.ge.21 .and. etan.le.26 ) then
238 #ifdef _DEBUG_HOMARD_
239 write (ulsort,texte(langue,3)) 'PCSPT2', nompro
242 call pcspt2 ( etan, etanp1, tehn, tehnp1,
244 > hettet, filtet, nbante, anfite,
246 > nbfonc, ngauss, vafoen, vafott,
247 > ulsort, langue, codret )
249 c=======================================================================
250 c doc.41-44.p. ==> etan = 41, ..., 44 : le tetraedre etait coupe en 4
251 c selon la face 1, 2, 3, 4
252 c doc.45-47.p. ==> etan = 45, 46, 47 : le tetraedre etait coupe en 4
253 c selon une diagonale
254 c=======================================================================
256 elseif ( etan.ge.41 .and. etan.le.47 ) then
258 #ifdef _DEBUG_HOMARD_
259 write (ulsort,texte(langue,3)) 'PCSPT4', nompro
262 call pcspt4 ( etan, etanp1, tehn, tehnp1,
264 > hettet, filtet, nbante, anfite,
266 > nbfonc, ngauss, vafoen, vafott,
267 > ulsort, langue, codret )
269 c=======================================================================
270 c doc.85-87.p. ==> etan = 85, 86, 87 : le tetraedre etait coupe en 8
271 c selon une diagonale
272 c=======================================================================
274 elseif ( etan.ge.85 .and. etan.le.87 ) then
276 #ifdef _DEBUG_HOMARD_
277 write (ulsort,texte(langue,3)) 'PCSPT8', nompro
280 call pcspt8 ( etanp1, tehn, tehnp1,
282 > filtet, nbante, anfite,
284 > nbfonc, ngauss, vafoen, vafott,
285 > ulsort, langue, codret )
299 if ( codret.ne.0 ) then
303 write (ulsort,texte(langue,1)) 'Sortie', nompro
304 write (ulsort,texte(langue,2)) codret
308 #ifdef _DEBUG_HOMARD_
309 write (ulsort,texte(langue,1)) 'Sortie', nompro