1 subroutine pcs2qu ( nbfop2, profho, vap2ho,
2 > hetqua, arequa, filqua,
5 c ______________________________________________________________________
9 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
11 c Version originale enregistree le 18 juin 1996 sous le numero 96036
12 c aupres des huissiers de justice Simart et Lavoir a Clamart
13 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
14 c aupres des huissiers de justice
15 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
17 c HOMARD est une marque deposee d'Electricite de France
23 c ______________________________________________________________________
25 c aPres adaptation - Conversion de Solution -
27 c interpolation p2 sur les noeuds - decoupage des QUadrangles
29 c remarque : on devrait optimiser cela car si le quadrangle etait dans
30 c un etat de decoupage similaire, on recalcule une valeur
31 c qui est deja presente
32 c remarque : pcs2qu et pcsiqu sont des clones
33 c ______________________________________________________________________
35 c . nom . e/s . taille . description .
36 c .____________________________________________________________________.
37 c . nbfop2 . e . 1 . nombre de fonctions P2 .
38 c . profho . es . * . pour chaque entite en numerotation homard :.
39 c . . . . 0 : l'entite est absente du profil .
40 c . . . . 1 : l'entite est presente dans le profil .
41 c . vap2ho . es . nbfop2*. variables p2 numerotation homard .
43 c . hetqua . e . nbquto . historique de l'etat des quadrangles .
44 c . arequa . e .nbquto*4. numeros des 4 aretes des quadrangles .
45 c . filqua . e . nbquto . premier fils des quadrangles .
46 c . somare . e .2*nbarto. numeros des extremites d'arete .
47 c . np2are . e . nbarto . numero des noeuds p2 milieux d'aretes .
48 c . aretri . e .nbtrto*3. numeros des 3 aretes des triangles .
49 c ______________________________________________________________________
52 c 0. declarations et dimensionnement
55 c 0.1. ==> generalites
75 integer profho(nbnoto)
76 integer hetqua(nbquto), arequa(nbquto,4), filqua(nbquto)
77 integer somare(2,nbarto), np2are(nbarto)
78 integer aretri(nbtrto,3)
80 double precision vap2ho(nbfop2,*)
82 c 0.4. ==> variables locales
86 integer typdec, etanp1
87 integer iaux1, iaux2, iaux3, iaux4
88 integer jaux1, jaux3, jaux4
89 integer m1, m2, m3, m4
92 integer listar(4), listno(8)
94 c f1hp = Fils 1er du quadrangle en numerotation Homard a l'it. N+1
101 c 0.5. ==> initialisations
102 c ______________________________________________________________________
103 cgn write (*,*) 'PCS2QU'
105 do 10 , lequad = 1, nbquto
108 c 1. interpolation p2 pour un quadrangle qui vient d'etre decoupe :
109 c on a une valeur a mettre sur l'eventuel noeud central et les
110 c milieux des aretes internes
114 call pcs0qu ( iaux, profho,
117 > afaire, listar, listno, typdec, etanp1 )
120 cgn write(1,*) 'typdec, etanp1 =', typdec, etanp1
123 c 2. La valeur sur le noeud au centre du quadrangle
124 c . Soit le quadrangle vient d'etre decoupe en 4 quadrangles alors
125 c qu'il ne l'etait pas a l'iteration precedente
126 c . Soit le quadrangle vient d'etre decoupe en 3 quadrangles
127 c . Soit le quadrangle vient d'etre decoupe en 2 quadrangles
128 c Remarque : regarder cmcdqu pour les conventions
131 if ( typdec.eq.4 .or.
132 > typdec.eq.21 .or. typdec.eq.22 .or.
133 > ( typdec.ge.41 .and. typdec.le.44 ) ) then
135 f1hp = filqua(lequad)
137 c 2.1. ==> la valeur sur le noeud au centre du quadrangle
139 if ( typdec.eq.4 ) then
140 sm = somare(2,arequa(f1hp,2))
141 elseif ( typdec.eq.21 .or. typdec.eq.22 ) then
142 sm = np2are(arequa(f1hp,4))
144 sm = somare(2,arequa(f1hp,3))
147 cgn write(1,*) 'f1hp =', f1hp
148 if ( typdec.ne.4 ) then
149 cgn write(1,*) 'sm =', sm
152 c interpolation = -1/4 (u1+u2+u3+u4) + 1/2 (u5+u6+u7+u8)
155 do 21, nuv = 1, nbfop2
156 cgn write(1,1789) vap2ho(nuv,listno(1))
157 cgn > , vap2ho(nuv,listno(2))
158 cgn > , vap2ho(nuv,listno(3))
159 cgn > , vap2ho(nuv,listno(4))
160 cgn write(1,1789) vap2ho(nuv,listno(5))
161 cgn > , vap2ho(nuv,listno(6))
162 cgn > , vap2ho(nuv,listno(7))
163 cgn > , vap2ho(nuv,listno(8))
165 vap2ho(nuv,sm) = - unsqu * ( vap2ho(nuv,listno(1))
166 > + vap2ho(nuv,listno(2))
167 > + vap2ho(nuv,listno(3))
168 > + vap2ho(nuv,listno(4)) )
169 > + unsde * ( vap2ho(nuv,listno(5))
170 > + vap2ho(nuv,listno(6))
171 > + vap2ho(nuv,listno(7))
172 > + vap2ho(nuv,listno(8)) )
173 if ( typdec.ne.4 ) then
174 cgn write(1,1789) vap2ho(nuv,sm)
182 c 3. Les valeurs sur les noeuds au milieu des aretes tracees a
183 c l'interieur du quadrangle
185 c 3.1. ==> Le quadrangle vient d'etre decoupe en 4 quadrangles alors
186 c qu'il ne l'etait pas a l'iteration precedente
187 c Remarque : regarder cmrdqu pour les conventions
189 if ( typdec.eq.4 ) then
191 f1hp = filqua(lequad)
193 c Par convention, la deuxieme arete du i-eme fils va du
194 c noeud ni, milieu de l'arete ai du quadrangle pere, vers
197 m1 = np2are(arequa(f1hp,2))
198 m2 = np2are(arequa(f1hp+1,2))
199 m3 = np2are(arequa(f1hp+2,2))
200 m4 = np2are(arequa(f1hp+3,2))
206 c interpolation = -3/16 (u1+u2+u3+u4)
207 c + 3/4 u5 +3/8 (u6+u8) + 1/4 u7
208 c avec u5 pour le noeud le plus proche, u6 et u8 pour ceux qui
209 c 'encadrent' et u7 pour le noeud 'oppose'
211 do 31, nuv = 1, nbfop2
213 daux = - trssz * ( vap2ho(nuv,listno(1))
214 > + vap2ho(nuv,listno(2))
215 > + vap2ho(nuv,listno(3))
216 > + vap2ho(nuv,listno(4)) )
218 vap2ho(nuv,m1) = daux
219 > + trsqu * vap2ho(nuv,listno(5))
220 > + trshu * ( vap2ho(nuv,listno(6)) + vap2ho(nuv,listno(8)))
221 > + unsqu * vap2ho(nuv,listno(7))
223 vap2ho(nuv,m2) = daux
224 > + trsqu * vap2ho(nuv,listno(6))
225 > + trshu * ( vap2ho(nuv,listno(7)) + vap2ho(nuv,listno(5)))
226 > + unsqu * vap2ho(nuv,listno(8))
228 vap2ho(nuv,m3) = daux
229 > + trsqu * vap2ho(nuv,listno(7))
230 > + trshu * ( vap2ho(nuv,listno(8)) + vap2ho(nuv,listno(6)))
231 > + unsqu * vap2ho(nuv,listno(5))
233 vap2ho(nuv,m4) = daux
234 > + trsqu * vap2ho(nuv,listno(8))
235 > + trshu * ( vap2ho(nuv,listno(5)) + vap2ho(nuv,listno(7)))
236 > + unsqu * vap2ho(nuv,listno(6))
240 c 3.2. ==> Le quadrangle vient d'etre decoupe en 3 triangles
241 c on doit creer les valeurs sur les noeuds au milieu des
243 c Remarque : regarder cmcdqu pour les conventions
245 elseif ( typdec.ge.31 .and. typdec.le.34 ) then
247 f1hp = - filqua(lequad)
250 c . la premiere arete du 1-er fils va du noeud ni, milieu de
251 c l'arete ai du quadrangle pere, vers le sommet commun
252 c aux aretes i+1 et i+2.
253 c . la troisieme arete du 1-er fils va du noeud ni, milieu de
254 c l'arete ai du quadrangle pere, vers le sommet commun
255 c aux aretes i+2 et i+3.
258 c interpolee (ui,i=1,8) = -3/16 (u1+u2+u3+u4)
259 c + 3/4 u5 +3/8 (u6+u8) + 1/4 u7
260 c avec u5 pour le noeud le plus proche, u6 et u8 pour ceux qui
261 c 'encadrent' et u7 pour le noeud 'oppose'
263 if ( typdec.eq.31 ) then
268 elseif ( typdec.eq.32 ) then
273 elseif ( typdec.eq.33 ) then
285 m1 = np2are(aretri(f1hp,1))
286 m2 = np2are(aretri(f1hp,3))
289 cgn write(1,*) 'm1 =', m1, ', m2 =', m2
291 do 32 , nuv = 1, nbfop2
293 daux = - trssz * ( vap2ho(nuv,listno(1))
294 > + vap2ho(nuv,listno(2))
295 > + vap2ho(nuv,listno(3))
296 > + vap2ho(nuv,listno(4)) )
297 > + trshu * ( vap2ho(nuv,iaux1) + vap2ho(nuv,iaux3) )
299 vap2ho(nuv,m1) = daux + trsqu * vap2ho(nuv,iaux2)
300 > + unsqu * vap2ho(nuv,iaux4)
302 vap2ho(nuv,m2) = daux + trsqu * vap2ho(nuv,iaux4)
303 > + unsqu * vap2ho(nuv,iaux2)
304 cgn write(1,1789) vap2ho(nuv,m1), vap2ho(nuv,m2)
308 c 3.3. ==> Le quadrangle vient d'etre decoupe en 3 quadrangles
309 c on doit creer les valeurs sur les noeuds au milieu des
311 c Remarque : regarder cmcdqu pour les conventions
313 elseif ( typdec.ge.41 .and. typdec.le.44 ) then
315 f1hp = filqua(lequad)
317 c pour les noeuds milieux des aretes entre le noeud central
318 c et des milieux d'aretes du quadrangle pere :
319 c interpolation = -3/16 (u1+u2+u3+u4)
320 c + 3/4 u5 + 3/8 (u6+u8) + 1/4 u7
321 c avec u5 pour le noeud le plus proche, u6 et u8 pour ceux qui
322 c 'encadrent' et u7 pour le noeud 'oppose'
324 c pour le noeud milieux de l'arete entre le noeud central
325 c et un sommet du quadrangle pere :
326 c interpolation = -3/16 (u1+u3) - 1/8 u4
327 c + 9/16 (u5+u6) + 3/16 (u7+u8)
328 c avec u1 et u3 pour les sommets qui 'encadrent', u2 pour le
329 c sommet le plus proche, u4 pour le sommet le plus loin,
330 c u5 et u6 pour les noeuds qui 'encadrent'
331 c et u7 et u8 pour les noeuds 'opposes'
333 if ( typdec.eq.41 ) then
341 elseif ( typdec.eq.42 ) then
349 elseif ( typdec.eq.43 ) then
367 m1 = np2are(arequa(f1hp,4))
368 m2 = np2are(arequa(f1hp,3))
369 m3 = np2are(arequa(f1hp+1,3))
373 cgn write(1,*) 'm1 =', m1, ', m2 =', m2, ', m3 =', m3
374 cgn write(1,*) 'listno =', listno
376 do 33 , nuv = 1, nbfop2
378 daux = - trssz * ( vap2ho(nuv,listno(1))
379 > + vap2ho(nuv,listno(2))
380 > + vap2ho(nuv,listno(3))
381 > + vap2ho(nuv,listno(4)) )
383 vap2ho(nuv,m1) = daux
384 > + trsqu * vap2ho(nuv,iaux1)
385 > + trshu * ( vap2ho(nuv,iaux2) + vap2ho(nuv,iaux4) )
386 > + unsqu * vap2ho(nuv,iaux3)
388 vap2ho(nuv,m2) = daux
389 > + trsqu * vap2ho(nuv,iaux2)
390 > + trshu * ( vap2ho(nuv,iaux3) + vap2ho(nuv,iaux1) )
391 > + unsqu * vap2ho(nuv,iaux4)
394 > - trssz * ( vap2ho(nuv,jaux1)
395 > + vap2ho(nuv,jaux3) )
396 > - unshu * vap2ho(nuv,jaux4)
397 > + nessz * ( vap2ho(nuv,iaux3) + vap2ho(nuv,iaux4) )
398 > + trssz * ( vap2ho(nuv,iaux1) + vap2ho(nuv,iaux2) )
399 cgn write(1,1789) vap2ho(nuv,m1), vap2ho(nuv,m2), vap2ho(nuv,m3)