1 subroutine pcequ2 ( nbfonc, ngauss, deraff,
3 > hetqua, ancqua, filqua,
4 > nbanqu, anfiqu, anhequ,
11 > ulsort, langue, codret )
13 c ______________________________________________________________________
17 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
19 c Version originale enregistree le 18 juin 1996 sous le numero 96036
20 c aupres des huissiers de justice Simart et Lavoir a Clamart
21 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
22 c aupres des huissiers de justice
23 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
25 c HOMARD est une marque deposee d'Electricite de France
31 c ______________________________________________________________________
32 c aPres adaptation - Conversion de solution - aux noeuds par Element
34 c QUadrangles - degre 2
36 c ______________________________________________________________________
38 c remarque : cette interpolation suppose que l'on est en presence de
39 c variables intensives. C'est-a-dire independantes de la
40 c taille de la maille.
41 c Une densite par exemple mais pas une masse.
42 c ______________________________________________________________________
44 c . nom . e/s . taille . description .
45 c .____________________________________________________________________.
46 c . nbfonc . e . 1 . nombre de fonctions aux points de Gauss .
47 c . ngauss . e . 1 . nbre de points de Gauss des fonctions pg .
48 c . deraff . e . 1 . vrai, s'il y a eu du deraffinement en .
49 c . . . . passant de l'iteration n a n+1 ; faux sinon.
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 . hetqua . e . nbquto . historique de l'etat des quadrangles .
57 c . filqua . e . nbquto . premier fils des quadrangles .
58 c . nbanqu . e . 1 . nombre de quadrangles decoupes par .
59 c . . . . conformite sur le maillage avant adaptation.
60 c . anfiqu . e . nbanqu . tableau filqua du maillage de l'iteration n.
61 c . anhequ . e . nbanqu . tableau hetqua du maillage de l'iteration n.
62 c . nqueca . e . * . nro des quadrangles dans le calcul en ent. .
63 c . nqusca . e . rsquto . numero des quadrangles du calcul .
64 c . nbantr . e . 1 . nombre de triangles issus du decoupage par .
65 c . . . . conformite sur le maillage avant adaptation.
66 c . anfatr . e . nbantr . tableau famtri du maillage de l'iteration n.
67 c . ntreca . e . * . nro des triangles dans le calcul en entree .
68 c . ntrsca . e . rstrto . numero des triangles du calcul .
69 c . vafoen . e . nbfonc*. variables en entree de l'adaptation .
71 c . vafott . a . nbfonc*. tableau temporaire de la solution .
73 c . vatren . e . nbfonc*. variables en entree de l'adaptation pour .
74 c . . . * . les triangles de conformite .
75 c . vatrtt . a . nbfonc*. tableau temporaire de la solution pour .
76 c . . . * . les triangles de conformite .
77 c . prftrn . es . * . En numero du calcul a l'iteration n : .
78 c . . . . 0 : le triangle est absent du profil .
79 c . . . . 1 : le triangle est present dans le profil .
80 c . prftrp . es . * . En numero du calcul a l'iteration n+1 : .
81 c . . . . 0 : le triangle est absent du profil .
82 c . . . . 1 : le triangle est present dans le profil .
83 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
84 c . langue . e . 1 . langue des messages .
85 c . . . . 1 : francais, 2 : anglais .
86 c . codret . es . 1 . code de retour des modules .
87 c . . . . 0 : pas de probleme .
88 c . . . . 1 : probleme .
89 c ______________________________________________________________________
92 c 0. declarations et dimensionnement
95 c 0.1. ==> generalites
101 parameter ( nompro = 'PCEQU2' )
106 parameter ( nbnoqu = 8 )
108 parameter ( nbnotr = 6 )
129 integer prfcan(*), prfcap(*)
130 integer hetqua(nbquto), ancqua(*)
131 integer filqua(nbquto)
132 integer nbanqu, anfiqu(nbanqu), anhequ(nbanqu)
133 integer nbantr, anfatr(nbantr)
134 integer nqueca(requto), nqusca(rsquto)
135 integer ntreca(retrto), ntrsca(rstrto)
136 integer prftrn(*), prftrp(*)
138 double precision vafoen(nbfonc,nbnoqu,*)
139 double precision vafott(nbfonc,nbnoqu,*)
140 double precision vatren(nbfonc,nbnotr,*)
141 double precision vatrtt(nbfonc,nbnotr,*)
145 integer ulsort, langue, codret
147 c 0.4. ==> variables locales
151 c qucn = QUadrangle courant en numerotation Calcul a l'it. N
152 c qucnp1 = QUadrangle courant en numerotation Calcul a l'it. N+1
153 c quhn = QUadrangle courant en numerotation Homard a l'it. N
154 c quhnp1 = QUadrangle courant en numerotation Homard a l'it. N+1
156 integer qucn, qucnp1, quhn, quhnp1
158 c f1hp = Fils 1er du quadrangle en numerotation Homard a l'it. N+1
159 c fihp = Fils ieme du triangle en numerotation Homard a l'it. N+1
160 c f1cp = Fils 1er du quadrangle en numerotation Calcul a l'it. N+1
161 c f2cp = Fils 2eme du quadrangle en numerotation Calcul a l'it. N+1
162 c f3cp = Fils 3eme du quadrangle en numerotation Calcul a l'it. N+1
163 c f4cp = Fils 4eme du quadrangle en numerotation Calcul a l'it. N+1
166 integer f1cp, f2cp, f3cp, f4cp
167 integer f1fcp, f2fcp, f3fcp
169 c f1hn = Fils 1er du quadrangle en numerotation Homard a l'it. N
170 c f1cn = Fils 1er du quadrangle en numerotation Calcul a l'it. N
171 c f2cn = Fils 2eme du quadrangle en numerotation Calcul a l'it. N
172 c f3cn = Fils 3eme du quadrangle en numerotation Calcul a l'it. N
173 c f4cn = Fils 4eme du quadrangle en numerotation Calcul a l'it. N
176 integer f1cn, f2cn, f3cn, f4cn
179 integer prqucn, prf1cn, prf2cn, prf3cn, prf4cn
181 c etan = ETAt du quadrangle a l'iteration N
182 c etanp1 = ETAt du quadrangle a l'iteration N+1
186 c qi = numero local du i-eme noeud du quadrangle, en fonction
188 integer q1, q2, q3, q4, q5, q6, q7, q8
189 integer q1t, q2t, q3t, q4t, q5t, q6t
190 integer q1tp,q2tp, q3tp, q4tp, q5tp, q6tp
192 integer g1, g2, g3, d1, d2, d3
193 integer pf, prfg2n, prfg1n, prfg3n, prfd2n, prfd1n, prfd3n
198 parameter ( nbmess = 10 )
199 character*80 texte(nblang,nbmess)
201 c 0.5. ==> initialisations
202 c ______________________________________________________________________
211 #ifdef _DEBUG_HOMARD_
212 write (ulsort,texte(langue,1)) 'Entree', nompro
214 write(ulsort,*) 'nbfonc, ngauss, nbquto = ',nbfonc, ngauss, nbquto
215 write(ulsort,*) 'nbnotr, nbnoqu = ',nbnotr, nbnoqu
219 >'(/,''Quad. en cours : nro a l''''iteration '',a3,'' :'',i10)'
221 > '( '' etat a l''''iteration '',a3,'' : '',i4)'
224 >'(/,''Current quadrangle : # at iteration '',a3,'' : '',i10)'
226 > '( '' status at iteration '',a3,'' : '',i4)'
229 cgn print 1789, (nqusca(iaux),iaux=1,rsquto)
230 cgn 1789 format(10i4)
233 c 2. on boucle sur tous les quadrangles du maillage HOMARD n+1
234 c on trie en fonction de l'etat du quadrcangle dans le maillage n
235 c on numerote les paragraphes en fonction de la documentation, a
236 c savoir : le paragraphe doc.n.p traite de la mise a jour de solution
237 c pour un quadrangle dont l'etat est passe de n a p.
238 c les autres paragraphes sont numerotes classiquement
241 if ( nbfonc.ne.0 ) then
243 do 20 , quhnp1 = 1 , nbquto
245 if ( codret.eq.0 ) then
247 c 2.1. ==> caracteristiques du quadrangle :
248 c 2.1.1. ==> son numero homard dans le maillage precedent
251 quhn = ancqua(quhnp1)
256 c 2.1.2. ==> l'historique de son etat
257 c On rappelle que l'etat vaut :
258 c etan = 0 : le quadrangle etait actif
259 c etan = 4 : le quadrangle etait coupe en 4 ; il y a eu
261 c etan = 55 : le quadrangle n'existait pas ; il a ete produit
263 c etan = 31, 32, 33, 34 : le quadrangle etait coupe en 3
264 c triangles ; il y a eu deraffinement.
266 etanp1 = mod(hetqua(quhnp1),100)
267 etan = (hetqua(quhnp1)-etanp1) / 100
269 cgn write (ulsort,1792) 'Quadrangle', quhn, etan, quhnp1, etanp1
271 c 2.1.3. ==> les numeros locaux des noeuds
281 cgn print *,'qi =',q1,q2,q3,q4,q5,q6,q7,q8
284 c=======================================================================
285 c doc.0.p. ==> etan = 0 : le quadrangle etait actif
286 c=======================================================================
288 if ( etan.eq.0 ) then
290 c on repere son ancien numero dans le calcul
293 prqucn = prfcan(qucn)
295 if ( prqucn.gt.0 ) then
297 cgn print 1789,(vafoen(nrofon,iaux,qucn), iaux = 1 , nbnoqu)
298 cgn 1789 format(' Valeurs anciennes : ',5g12.5)
300 c doc.0.0. ===> etanp1 = 0 : le quadrangle etait actif et l'est encore ;
303 c ................. .................
311 c ................. .................
313 if ( etanp1.eq.0 ) then
315 qucnp1 = nqusca(quhnp1)
318 do 221 , nrofon = 1 , nbfonc
319 cgn write(ulsort,7778)
320 cgn > (vafoen(nrofon,iaux,prfcan(qucn)),iaux = 1 , nbnoqu)
321 do 2211 , iaux = 1 , nbnoqu
322 vafott(nrofon,iaux,qucnp1) =
323 > vafoen(nrofon,iaux,prqucn)
326 cgn write(21,7777) qucnp1
327 cgn write(ulsort,7777) qucn,-1,qucnp1
329 cgn 7778 format(8g14.7)
331 c doc.0.1/2/3 ==> etanp1 = 31, 32, 33 ou 34 : le quadrangle etait actif
332 c et est decoupe en 3 triangles.
333 c ................. .................
341 c ................. .................
343 elseif ( etanp1.ge.31 .and. etanp1.le.34 ) then
345 #include "pcsqu2_1.h"
347 c doc.0.4/6/7/8. ==> etanp1 = 4 : le quadrangle etait actif et
349 c ................. .................
353 c . . ===> .................
357 c ................. .................
359 elseif ( etanp1.eq.4 ) then
361 #include "pcsqu2_2.h"
363 c doc.0.erreur. ==> aucun autre etat sur le quadrangle courant n'est
369 write (ulsort,texte(langue,4)) 'n ', quhn
370 write (ulsort,texte(langue,5)) 'n ', etan
371 write (ulsort,texte(langue,4)) 'n+1', quhnp1
372 write (ulsort,texte(langue,5)) 'n+1', etanp1
378 c=======================================================================
379 c doc.1/2/3.p. ==> etan = 31, 32, 33 ou 34 : le quadrangle etait coupe
381 c=======================================================================
383 elseif ( etan.ge.31 .and. etan.le.34 ) then
385 cgn print *,'etan.ge.31 .and. etan.le.34'
386 c on repere les numeros dans le calcul pour ses trois fils a
391 f2cn = ntreca(f1hn+1)
392 f3cn = ntreca(f1hn+2)
393 prf1cn = prftrn(f1cn)
394 prf2cn = prftrn(f2cn)
395 prf3cn = prftrn(f3cn)
404 if ( prf1cn.gt.0 .and. prf2cn.gt.0 .and.
407 c doc.1/2/3.0. ===> etanp1 = 0 : le quadrangle est actif. il est
409 c on lui attribue la valeur moyenne sur les trois
411 c remarque : cela arrive seulement avec du deraffinement.
412 c ................. .................
420 c ................. .................
422 if ( etanp1.eq.0 ) then
424 cgn print *,'.. etanp1.eq.0'
426 #include "pcsqu2_3.h"
428 c doc.1/2/3.1/2/3. ===> etanp1 = etan : le quadrangle est decoupe en
429 c trois selon le meme decoupage.
430 c c'est ce qui se passe quand un decoupage de conformite
431 c est supprime au debut des algorithmes d'adaptation,
432 c puis reproduit a la creation du maillage car les
433 c quadrangles autour n'ont pas change entre les deux
435 c Comme la procedure de numerotation est la meme (voir
436 c cmcdqu), le premier fils est toujours le meme, le 2eme et
438 c on prendra alors les valeurs sur les fils de rang
439 c identique a l'iteration n.
440 c ................. .................
444 c . . . . ===> . . . .
448 c ................. .................
450 elseif ( etanp1.eq.etan ) then
451 cgn print *,'.. etanp1.eq.etan'
453 f1hp = -filqua(quhnp1)
463 f2cp = ntrsca(f1hp+1)
464 f3cp = ntrsca(f1hp+2)
469 do 232 , nrofon = 1 , nbfonc
471 vatrtt(nrofon,q1tp,f1cp) = vatren(nrofon,q1t,prf1cn)
472 vatrtt(nrofon,q2tp,f1cp) = vatren(nrofon,q2t,prf1cn)
473 vatrtt(nrofon,q3tp,f1cp) = vatren(nrofon,q3t,prf1cn)
474 vatrtt(nrofon,q4tp,f1cp) = vatren(nrofon,q4t,prf1cn)
475 vatrtt(nrofon,q5tp,f1cp) = vatren(nrofon,q5t,prf1cn)
476 vatrtt(nrofon,q6tp,f1cp) = vatren(nrofon,q6t,prf1cn)
478 vatrtt(nrofon,q1tp,f2cp) = vatren(nrofon,q1t,prf2cn)
479 vatrtt(nrofon,q2tp,f2cp) = vatren(nrofon,q2t,prf2cn)
480 vatrtt(nrofon,q3tp,f2cp) = vatren(nrofon,q3t,prf2cn)
481 vatrtt(nrofon,q4tp,f2cp) = vatren(nrofon,q4t,prf2cn)
482 vatrtt(nrofon,q5tp,f2cp) = vatren(nrofon,q5t,prf2cn)
483 vatrtt(nrofon,q6tp,f2cp) = vatren(nrofon,q6t,prf2cn)
485 vatrtt(nrofon,q1tp,f3cp) = vatren(nrofon,q1t,prf3cn)
486 vatrtt(nrofon,q2tp,f3cp) = vatren(nrofon,q2t,prf3cn)
487 vatrtt(nrofon,q3tp,f3cp) = vatren(nrofon,q3t,prf3cn)
488 vatrtt(nrofon,q4tp,f3cp) = vatren(nrofon,q4t,prf3cn)
489 vatrtt(nrofon,q5tp,f3cp) = vatren(nrofon,q5t,prf3cn)
490 vatrtt(nrofon,q6tp,f3cp) = vatren(nrofon,q6t,prf3cn)
494 c doc.1/2/3.perm(1/2/3). ===> etanp1 = 31, 32, 33 ou 34 et different de
495 c etan : le quadrangle est encore decoupe
496 c en trois, mais par un autre decoupage.
497 c c'est ce qui se passe quand un decoupage de conformite
498 c est supprime au debut des algorithmes d'adaptation. il y
499 c a du deraffinement dans la zone qui induisait le decoupage
500 c de conformite et raffinement sur une autre zone.
501 cc remarque : cela arrive seulement avec du deraffinement.
503 c ................. .................
507 c . . . . ===> . . . .
511 c ................. .................
513 elseif ( etanp1.ge.31 .and. etanp1.le.34 ) then
515 cgn print *,'.. etanp1.ge.31 .and. etanp1.le.34'
516 #include "pcsqu2_4.h"
518 c doc.1/2/3.4/6/7/8. ===> etanp1 = 4 : le quadrangle est
520 c c'est ce qui se passe quand un decoupage de conformite
521 c est supprime au debut des algorithmes d'adaptation. il y
522 c a ensuite raffinement du quadrangle. qui plus est, par
523 c suite de la regle des ecarts de niveau, on peut avoir
524 c induit un decoupage de conformite sur l'un des fils.
526 c ................. .................
530 c . . . . ===> .................
534 c ................. .................
537 elseif ( etanp1.eq.4 ) then
539 cgn print *,'.. etanp1.eq.4'
541 #include "pcsqu2_5.h"
543 c doc.1/2/3.erreur. ==> aucun autre etat sur le quadrangle courant
549 write (ulsort,texte(langue,4)) 'n ', quhn
550 write (ulsort,texte(langue,5)) 'n ', etan
551 write (ulsort,texte(langue,4)) 'n+1', quhnp1
552 write (ulsort,texte(langue,5)) 'n+1', etanp1
558 c=======================================================================
559 c doc.4. ==> le quadrangle etait coupe en 4 :
560 c=======================================================================
562 elseif ( etan.eq.4 ) then
564 c on repere les numeros dans le calcul pour ses quatre fils
569 f2cn = nqueca(f1hn+1)
570 f3cn = nqueca(f1hn+2)
571 f4cn = nqueca(f1hn+3)
572 prf1cn = prfcan(f1cn)
573 prf2cn = prfcan(f2cn)
574 prf3cn = prfcan(f3cn)
575 prf4cn = prfcan(f4cn)
577 if ( prf1cn.gt.0 .and. prf2cn.gt.0 .and.
578 > prf3cn.gt.0 .and. prf4cn.gt.0 ) then
580 c doc.4.0. ===> etanp1 = 0 : le quadrangle est actif ; il est reactive.
581 c remarque : cela arrive seulement avec du deraffinement.
582 c ................. .................
586 c ................. ===> . .
590 c ................. .................
592 if ( etanp1.eq.0 ) then
594 qucnp1 = nqusca(quhnp1)
597 do 241 , nrofon = 1 , nbfonc
599 vafott(nrofon,q1,qucnp1) = vafoen(nrofon,q1,prf1cn)
600 vafott(nrofon,q2,qucnp1) = vafoen(nrofon,q1,prf2cn)
601 vafott(nrofon,q3,qucnp1) = vafoen(nrofon,q1,prf3cn)
602 vafott(nrofon,q4,qucnp1) = vafoen(nrofon,q1,prf4cn)
603 vafott(nrofon,q5,qucnp1) =
604 > unsde*(vafoen(nrofon,q2,prf1cn)+
605 > vafoen(nrofon,q4,prf2cn))
606 vafott(nrofon,q6,qucnp1) =
607 > unsde*(vafoen(nrofon,q2,prf2cn)+
608 > vafoen(nrofon,q4,prf3cn))
609 vafott(nrofon,q7,qucnp1) =
610 > unsde*(vafoen(nrofon,q2,prf3cn)+
611 > vafoen(nrofon,q4,prf4cn))
612 vafott(nrofon,q8,qucnp1) =
613 > unsde*(vafoen(nrofon,q2,prf4cn)+
614 > vafoen(nrofon,q4,prf1cn))
618 c doc.4.1/2/3. ===> etanp1 = 31, 32, 33 ou 34 : le quadrangle est
620 c remarque : cela arrive seulement avec du deraffinement.
621 c ................. .................
625 c ................. ===> . . . .
629 c ................. .................
631 elseif ( etanp1.ge.31 .and. etanp1.le.34 ) then
632 cgn print *,'etanp1.ge.31 .and. etanp1.le.34'
634 #include "pcsqu2_6.h"
636 elseif ( etanp1.eq.4 .or. etanp1.eq.99 ) then
643 write (ulsort,texte(langue,4)) 'n ', quhn
644 write (ulsort,texte(langue,5)) 'n ', etan
645 write (ulsort,texte(langue,4)) 'n+1', quhnp1
646 write (ulsort,texte(langue,5)) 'n+1', etanp1
651 c=======================================================================
652 c doc.4. ==> le quadrangle etait coupe en 4 et au moins un de ses
653 c fils etait lui-meme decoupe :
654 c=======================================================================
656 elseif ( etan.eq.99 ) then
658 #include "pcsqu2_7.h"
672 cgn do 922 , nrofon = 1 , nbfonc
673 cgn print *,'fonction numero ', nrofon
675 cgn do 9222 , quhnp1 = 1 , nbtrto
676 cgn if ( mod(hettri(quhnp1),100).eq.0 ) then
678 cgn print 1788,quhnp1,
679 cgn > (vafott(nrofon,nugaus,iaux), nugaus = 1 , ngauss)
684 if ( codret.ne.0 ) then
688 write (ulsort,texte(langue,1)) 'Sortie', nompro
689 write (ulsort,texte(langue,2)) codret
693 #ifdef _DEBUG_HOMARD_
694 write (ulsort,texte(langue,1)) 'Sortie', nompro