1 subroutine pcstr0 ( nbfonc, typint, deraff,
8 > ulsort, langue, codret )
9 c ______________________________________________________________________
13 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
15 c Version originale enregistree le 18 juin 1996 sous le numero 96036
16 c aupres des huissiers de justice Simart et Lavoir a Clamart
17 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
18 c aupres des huissiers de justice
19 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
21 c HOMARD est une marque deposee d'Electricite de France
27 c ______________________________________________________________________
29 c aPres adaptation - Conversion de Solution -
31 c TRiangles - solution P0
33 c ______________________________________________________________________
35 c . nom . e/s . taille . description .
36 c .____________________________________________________________________.
37 c . nbfonc . e . 1 . nombre de fonctions elements de volume .
38 c . typint . e . 1 . type d'interpolation .
39 c . . . . 0, si automatique .
40 c . . . . elements : 0 si intensif, sans orientation.
41 c . . . . 1 si extensif, sans orientation.
42 c . . . . 2 si intensif, avec orientation.
43 c . . . . 3 si extensif, avec orientation.
44 c . . . . noeuds : 1 si degre 1 .
45 c . . . . 2 si degre 2 .
46 c . . . . 3 si iso-P2 .
47 c . deraff . e . 1 . vrai, s'il y a eu du deraffinement en .
48 c . . . . passant de l'iteration n a n+1 ; faux sinon.
49 c . prfcan . e . * . En numero du calcul a l'iteration n : .
50 c . . . . 0 : l'entite est absente du profil .
51 c . . . . i : l'entite est au rang i dans le profil .
52 c . prfcap . es . * . En numero du calcul a l'iteration n+1 : .
53 c . . . . 0 : l'entite est absente du profil .
54 c . . . . 1 : l'entite est presente dans le profil .
55 c . hettri . e . nbtrto . historique de l'etat des triangles .
56 c . filtri . e . nbtrto . premier fils des triangles .
57 c . nbantr . e . 1 . nombre de triangles decoupes par .
58 c . . . . conformite sur le maillage avant adaptation.
59 c . anfitr . e . nbantr . tableau filtri du maillage de l'iteration n.
60 c . ntreca . e . * . nro des triangles dans le calcul en entree .
61 c . ntrsca . e . rstrto . numero des triangles du calcul .
62 c . vafoen . e . nbfonc*. variables en entree de l'adaptation .
64 c . vafott . a . nbfonc*. tableau temporaire de la solution .
66 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
67 c . langue . e . 1 . langue des messages .
68 c . . . . 1 : francais, 2 : anglais .
69 c . codret . es . 1 . code de retour des modules .
70 c . . . . 0 : pas de probleme .
71 c . . . . 1 : probleme .
72 c ______________________________________________________________________
75 c 0. declarations et dimensionnement
78 c 0.1. ==> generalites
84 parameter ( nompro = 'PCSTR0' )
104 integer prfcan(*), prfcap(*)
105 integer hettri(nbtrto), anctri(*)
106 integer filtri(nbtrto)
107 integer nbantr, anfitr(nbantr)
108 integer ntreca(retrto), ntrsca(rstrto)
110 double precision vafoen(nbfonc,*)
111 double precision vafott(nbfonc,*)
115 integer ulsort, langue, codret
117 c 0.4. ==> variables locales
119 c trcn = TRiangle courant en numerotation Calcul a l'iteration N
120 c trcnp1 = TRiangle courant en numerotation Calcul a l'iteration N+1
121 c trhn = TRiangle courant en numerotation Homard a l'iteration N
122 c trhnp1 = TRiangle courant en numerotation Homard a l'iteration N+1
124 integer trcn, trcnp1, trhn, trhnp1
126 c f1hp = Fils 1er du triangle en numerotation Homard a l'it. N+1
127 c fihp = Fils ieme du triangle en numerotation Homard a l'it. N+1
128 c f1cp = Fils 1er du triangle en numerotation Calcul a l'it. N+1
129 c f2cp = Fils 2eme du triangle en numerotation Calcul a l'it. N+1
130 c f3cp = Fils 3eme du triangle en numerotation Calcul a l'it. N+1
131 c f4cp = Fils 4eme du triangle en numerotation Calcul a l'it. N+1
134 integer f1cp, f2cp, f3cp, f4cp
136 c f1hn = Fils 1er du triangle en numerotation Homard a l'it. N
137 c f1cn = Fils 1er du triangle en numerotation Calcul a l'it. N
138 c f2cn = Fils 2eme du triangle en numerotation Calcul a l'it. N
139 c f3cn = Fils 3eme du triangle en numerotation Calcul a l'it. N
140 c f4cn = Fils 4eme du triangle en numerotation Calcul a l'it. N
143 integer f1cn, f2cn, f3cn, f4cn
145 c f1fhp = Fils 1er du Fils en numerotation Homard a l'it. N+1
146 c f1fcp = Fils 1er du Fils en numerotation Calcul a l'it. N+1
147 c f2fcp = Fils 2eme du Fils en numerotation Calcul a l'it. N+1
149 integer f1fhp, f1fcp, f2fcp
151 c etan = ETAt du triangle a l'iteration N
152 c etanp1 = ETAt du triangle a l'iteration N+1
159 double precision daux
160 double precision daux1
163 parameter ( nbmess = 10 )
164 character*80 texte(nblang,nbmess)
166 c 0.5. ==> initialisations
167 c ______________________________________________________________________
177 #ifdef _DEBUG_HOMARD_
178 write (ulsort,texte(langue,1)) 'Entree', nompro
180 write (ulsort,90002) 'nbfonc', nbfonc
181 write (ulsort,90002) 'nbtrto', nbtrto
182 write (ulsort,90002) 'retrto, rstrto', retrto, rstrto
186 > '(/,''Triangle en cours : nro a l''''iteration '',a3,'' : '',i8)'
188 > '( '' etat a l''''iteration '',a3,'' : '',i4)'
189 texte(1,6) = '( ''==> Aucune interpolation'')'
192 > '(/,''Current triangle : # at iteration '',a3,'' : '',i8)'
194 > '( '' status at iteration '',a3,'' : '',i4)'
195 texte(2,6) = '( ''==> No interpolation'')'
198 cgn write(ulsort,*) 'ntreca'
199 cgn write(ulsort,91020) ntreca
200 cgn write(ulsort,*) 'prfcan'
201 cgn write(ulsort,91020)(prfcan(iaux),iaux=1,74)
202 cgn 9999 format(1I5,g14.7,3i10)
205 c 2. on boucle sur tous les triangles du maillage HOMARD n+1
206 c on trie en fonction de l'etat du triangle dans le maillage n
207 c on numerote les paragraphes en fonction de la documentation, a
208 c savoir : le paragraphe doc.n.p traite de la mise a jour de solution
209 c pour un triangle dont l'etat est passe de n a p.
210 c les autres paragraphes sont numerotes classiquement
213 if ( nbfonc.ne.0 ) then
215 do 20 , trhnp1 = 1 , nbtrto
217 c 2.1. ==> caracteristiques du triangle :
218 c 2.1.1. ==> son numero homard dans le maillage precedent
221 trhn = anctri(trhnp1)
226 c 2.1.2. ==> l'historique de son etat
227 c On rappelle que l'etat vaut :
228 c etan = 0 : le triangle etait actif
229 c etan = 1, 2, 3 : le triangle etait coupe en 2 selon l'arete
230 c 1, 2, 3 ; il y a eu deraffinement.
231 c etan = 4 : le triangle etait coupe en 4 ; il y a eu
233 c etan = 5 : le triangle n'existait pas ; il a ete produit par
235 c etan = 6, 7, 8 : le triangle etait coupe en 4 avec bascule
236 c de l'arete etan-5 pour le suivi de
237 c frontiere ; il y a eu deraffinement.
238 c etan = 9 : le triangle etait coupe en 4 et un de ses fils
241 etanp1 = mod(hettri(trhnp1),10)
242 etan = (hettri(trhnp1)-etanp1) / 10
244 cgn write (ulsort,1792) 'Triangle', trhn, etan, trhnp1, etanp1
246 c=======================================================================
247 c doc.0.p. ==> etan = 0 : le triangle etait actif
248 c=======================================================================
250 if ( etan.eq.0 ) then
251 cgn print *,'le triangle etait actif'
253 c on repere son ancien numero dans le calcul
256 cgn write (ulsort,1790) trcn,prfcan(trcn)
257 cgn 1790 format('Numero du calcul precedent = ',i3,', de profil = ',i3)
259 if ( prfcan(trcn).gt.0 ) then
261 cgn write (ulsort,90004)'Valeurs anciennes',
262 cgn > (vafoen(nrofon,prfcan(trcn)),nrofon=1,nbfonc)
264 c doc.0.0. ===> etanp1 = 0 : le triangle etait actif et l'est encore ;
266 c c'est le cas le plus simple : on prend la valeur de la
267 c fonction associee a l'ancien numero du triangle.
276 c ................. .................
278 if ( etanp1.eq.0 ) then
280 trcnp1 = ntrsca(trhnp1)
283 do 221 , nrofon = 1 , nbfonc
284 vafott(nrofon,trcnp1) = vafoen(nrofon,prfcan(trcn))
285 cgn write(ulsort,92010) vafoen(nrofon,prfcan(trcn))
287 cgn write(21,9999) trcnp1,vafott(15,trcnp1),0,trcn,prfcan(trcn)
288 cgn write(ulsort,91020) trcn,-1,trcnp1
290 c doc.0.1/2/3 ==> etanp1 = 1, 2 ou 3 : le triangle etait actif et est
292 c les deux fils prennent la valeur de la fonction sur
302 c ................. .................
304 elseif ( etanp1.ge.1 .and. etanp1.le.3 ) then
306 f1hp = filtri(trhnp1)
308 f2cp = ntrsca(f1hp+1)
311 if ( typint.eq.0 ) then
312 do 2220 , nrofon = 1 , nbfonc
313 daux = vafoen(nrofon,prfcan(trcn))
314 vafott(nrofon,f1cp) = daux
315 vafott(nrofon,f2cp) = daux
316 cgn write(ulsort,92010) vafoen(nrofon,prfcan(trcn))
319 do 2221 , nrofon = 1 , nbfonc
320 daux = unsde*vafoen(nrofon,prfcan(trcn))
321 vafott(nrofon,f1cp) = daux
322 vafott(nrofon,f2cp) = daux
323 cgn write(ulsort,92010) vafoen(nrofon,prfcan(trcn))
326 cgn write(22,9999) f1cp,vafott(15,f1cp),2,trcn,prfcan(trcn)
327 cgn write(22,9999) f2cp,vafott(15,f1cp),2,trcn,prfcan(trcn)
328 cgn write(22,91020) f1cp,f2cp
329 cgn write(ulsort,91020) trcn,-1,
332 c doc.0.4/6/7/8. ==> etanp1 = 4, 6, 7 ou 8 : le triangle etait actif et
334 c les quatre fils prennent la valeur de la fonction
344 c ................. .................
347 elseif ( etanp1.eq.4 .or.
348 > etanp1.eq.6 .or. etanp1.eq.7 .or. etanp1.eq.8 ) then
350 f1hp = filtri(trhnp1)
352 f2cp = ntrsca(f1hp+1)
353 f3cp = ntrsca(f1hp+2)
354 f4cp = ntrsca(f1hp+3)
359 if ( typint.eq.0 ) then
360 do 2230 , nrofon = 1 , nbfonc
361 daux = vafoen(nrofon,prfcan(trcn))
362 vafott(nrofon,f1cp) = daux
363 vafott(nrofon,f2cp) = daux
364 vafott(nrofon,f3cp) = daux
365 vafott(nrofon,f4cp) = daux
366 cgn write(ulsort,92010) daux
369 do 2231 , nrofon = 1 , nbfonc
370 daux = unsqu*vafoen(nrofon,prfcan(trcn))
371 vafott(nrofon,f1cp) = daux
372 vafott(nrofon,f2cp) = daux
373 vafott(nrofon,f3cp) = daux
374 vafott(nrofon,f4cp) = daux
375 cgn write(ulsort,92010) daux
378 cgn write(23,9999) f1cp,vafott(15,f1cp),4,trcn,prfcan(trcn)
379 cgn write(23,9999) f2cp,vafott(15,f1cp),4,trcn,prfcan(trcn)
380 cgn write(23,9999) f3cp,vafott(15,f1cp),4,trcn,prfcan(trcn)
381 cgn write(23,9999) f4cp,vafott(15,f1cp),4,trcn,prfcan(trcn)
382 cgn write(23,91020) f1cp,f2cp,f3cp,f4cp
383 cgn write(ulsort,91020) trcn,-1,
384 cgn > f1cp,f2cp,f3cp,f4cp
386 c doc.0.erreur. ==> aucun autre etat sur le triangle courant n'est
392 write (ulsort,texte(langue,4)) 'n ', trhn
393 write (ulsort,texte(langue,5)) 'n ', etan
394 write (ulsort,texte(langue,4)) 'n+1', trhnp1
395 write (ulsort,texte(langue,5)) 'n+1', etanp1
401 c=======================================================================
402 c doc.1/2/3.p. ==> etan = 1, 2 ou 3 : le triangle etait coupe en 2
403 c=======================================================================
405 elseif ( etan.ge.1 .and. etan.le.3 ) then
407 cgn print *,'le triangle etait coupe en 2'
408 c on repere les numeros dans le calcul pour ses deux fils a
413 f2cn = ntreca(f1hn+1)
415 if ( prfcan(f1cn).gt.0 .and. prfcan(f2cn).gt.0 ) then
417 c doc.1/2/3.0. ===> etanp1 = 0 : le triangle est actif. il est reactive.
418 c on lui attribue la valeur moyenne sur les deux
420 c remarque : cela arrive seulement avec du deraffinement.
429 c ................. .................
431 if ( etanp1.eq.0 ) then
433 trcnp1 = ntrsca(trhnp1)
436 if ( typint.eq.0 ) then
437 do 2310 , nrofon = 1 , nbfonc
438 vafott(nrofon,trcnp1) =
439 > unsde * ( vafoen(nrofon,prfcan(f1cn))
440 > + vafoen(nrofon,prfcan(f2cn)) )
441 cgn write(ulsort,92010) vafoen(nrofon,prfcan(f1cn)),
442 cgn > vafoen(nrofon,prfcan(f2cn))
445 do 2311 , nrofon = 1 , nbfonc
446 vafott(nrofon,trcnp1) =
447 > vafoen(nrofon,prfcan(f1cn))
448 > + vafoen(nrofon,prfcan(f2cn))
449 cgn write(ulsort,92010) vafoen(nrofon,prfcan(f1cn)),
450 cgn > vafoen(nrofon,prfcan(f2cn))
453 cgn write(31,91020) trcnp1
454 cgn write(ulsort,91020) f1cn,f2cn,-1,trcnp1
456 c doc.1/2/3.1/2/3. ===> etanp1 = etan : le triangle est decoupe en deux
457 c selon le meme decoupage.
458 c c'est ce qui se passe quand un decoupage de conformite
459 c est supprime au debut des algorithmes d'adaptation,
460 c puis reproduit a la creation du maillage car les
461 c triangles autour n'ont pas change entre les deux
463 c le fils prend la valeur de la fonction sur l'ancien
464 c fils qui etait au meme endroit. comme la procedure de
465 c numerotation est la meme (voir cmcdtr), le premier fils
466 c est toujours le meme, le second egalement. on prendra
467 c alors la valeur sur le fils de rang identique a
477 c ................. .................
479 elseif ( etanp1.eq.etan ) then
481 f1hp = filtri(trhnp1)
483 f2cp = ntrsca(f1hp+1)
486 do 232 , nrofon = 1 , nbfonc
487 vafott(nrofon,f1cp) = vafoen(nrofon,prfcan(f1cn))
488 vafott(nrofon,f2cp) = vafoen(nrofon,prfcan(f2cn))
489 cgn write(ulsort,92010) vafoen(nrofon,prfcan(f1cn)),
490 cgn > vafoen(nrofon,prfcan(f2cn))
492 cgn write(32,91020) f1cp,f2cp
493 cgn write(ulsort,91020) f1cn,f2cn,-1,f1cp,f2cp
495 c doc.1/2/3.perm(1/2/3). ===> etanp1 = 1, 2 ou 3 et different de etan :
496 c le triangle est encore decoupe en deux
497 c mais par un autre decoupage.
498 c c'est ce qui se passe quand un decoupage de conformite
499 c est supprime au debut des algorithmes d'adaptation. il y
500 c a du deraffinement dans la zone qui induisait le decoupage
501 c de conformite et raffinement sur une autre zone.
502 c on donne la valeur moyenne de la fonction sur les deux
503 c anciens fils a chaque nouveau fils.
504 c remarque : on pourrait certainement faire mieux, avec des
505 c moyennes ponderees en fonction du recouvrement
506 c des anciens et nouveaux fils. c'est trop
507 c complique pour que cela vaille le coup.
508 c remarque : cela arrive seulement avec du deraffinement.
517 c ................. .................
519 elseif ( etanp1.ge.1 .and. etanp1.le.3 ) then
521 f1hp = filtri(trhnp1)
523 f2cp = ntrsca(f1hp+1)
526 do 233 , nrofon = 1 , nbfonc
527 daux = unsde * ( vafoen(nrofon,prfcan(f1cn))
528 > + vafoen(nrofon,prfcan(f2cn)) )
529 vafott(nrofon,f1cp) = daux
530 vafott(nrofon,f2cp) = daux
531 cgn write(ulsort,92010) vafoen(nrofon,prfcan(f1cn)),
532 cgn > vafoen(nrofon,prfcan(f2cn))
534 cgn write(33,91020) f1cp,f2cp
535 cgn write(ulsort,91020) f1cn,f2cn,-1,f1cp,f2cp
537 c doc.1/2/3.4/6/7/8. ===> etanp1 = 4, 6, 7 ou 8 : le triangle est
539 c c'est ce qui se passe quand un decoupage de conformite
540 c est supprime au debut des algorithmes d'adaptation. il y
541 c a ensuite raffinement du triangle. qui plus est, par suite
542 c de la regle des ecarts de niveau, on peut avoir induit
543 c un decoupage de conformite sur l'un des fils.
544 c remarque : c'est toujours un des fils du cote qui etait
545 c decoupe qui subit le decoupage, et c'est toujours par
546 c une subdivision du dit cote.
548 c . pour le triangle central et le triangle dans le coin
549 c oppose a l'arete initialement decoupee, on attribue la
550 c valeur moyenne de la fonction sur les deux anciens fils.
551 c . pour les deux autres triangles, on repere dans lequel
552 c des deux fils ils se trouvent. si un de ces triangles est
553 c decoupe, c'est en 2 et par la meme arete que le triangle
554 c courant ; on affecte la valeur du fils du maillage n
555 c a ces deux fils. si un des triangles est actif, on lui
556 c attribue la valeur.
558 c . on pose i, j et k comme etant les numeros locaux des
559 c aretes du triangle courant.
560 c si etan vaut i, c'est que la i-eme arete du triangle
561 c etait coupee. les numerotations des 2 fils sont obtenues
562 c par la fonction nutrde : a = nutrde(i,j), b = nutrde(i,k)
563 c les numerotations des 4 fils sont +0, +i, +j et +k.
565 c . les fils +O et +i doivent recevoir la moyenne
566 c . le fils +k, ou ses fils, doit recevoir la valeur
568 c . le fils +j, ou ses fils, doit recevoir la valeur
575 c j . . . k ===> j ......... k
577 c . +a . +b . . .+0 . .
578 c . . . . +k . . +j .
579 c ................. .................
586 c j . . . k ===> j ......... k
588 c . +a . +b . . .+0 . . .
589 c . . . . +k . .+j.+j.
590 c ................. .................
597 c j . . . k ===> j ......... k
599 c . +a . +b . . . .+0 . . .
600 c . . . .+k.+k. .+j.+j.
601 c ................. .................
605 elseif ( etanp1.eq.4 .or.
606 > etanp1.eq.6 .or. etanp1.eq.7 .or. etanp1.eq.8 ) then
608 c ==> les deux triangles central et opposee
610 f1hp = filtri(trhnp1)
612 f2cp = ntrsca(f1hp+etan)
615 if ( typint.eq.0 ) then
620 do 2341 , nrofon = 1 , nbfonc
621 daux = daux1 * ( vafoen(nrofon,prfcan(f1cn))
622 > + vafoen(nrofon,prfcan(f2cn)) )
623 vafott(nrofon,f1cp) = daux
624 vafott(nrofon,f2cp) = daux
625 cgn write(ulsort,92010) vafoen(nrofon,prfcan(f1cn)),
626 cgn > vafoen(nrofon,prfcan(f2cn))
628 cgn write(34,91020) f1cp,f2cp
629 cgn write(ulsort,91020) f1cn,f2cn,-1,f1cp,f2cp
631 c ==> le triangle d'un des cotes
633 iaux = prfcan(ntreca(f1hn+nutrde(etan,per1a3( 1,etan))))
634 fihp = f1hp+per1a3(-1,etan)
635 if ( mod(hettri(fihp),10).eq.0 ) then
638 if ( typint.eq.0 ) then
639 do 23420 , nrofon = 1 , nbfonc
640 vafott(nrofon,f3cp) = vafoen(nrofon,iaux)
641 cgn write(ulsort,92010) vafoen(nrofon,iaux)
644 do 23421 , nrofon = 1 , nbfonc
645 vafott(nrofon,f3cp) = unsde * vafoen(nrofon,iaux)
646 cgn write(ulsort,92010) vafoen(nrofon,iaux)
649 cgn write(35,91020) f3cp
650 cgn write(ulsort,91020) f1hn+nutrde(etan,per1a3( 1,etan)),-1,f3cp
651 elseif ( mod(hettri(fihp),10).eq.etan ) then
653 f1fcp = ntrsca(f1fhp)
654 f2fcp = ntrsca(f1fhp+1)
657 if ( typint.eq.0 ) then
658 do 23430 , nrofon = 1 , nbfonc
659 vafott(nrofon,f1fcp) = vafoen(nrofon,iaux)
660 vafott(nrofon,f2fcp) = vafoen(nrofon,iaux)
661 cgn write(ulsort,92010) vafoen(nrofon,iaux)
664 do 23431 , nrofon = 1 , nbfonc
665 vafott(nrofon,f1fcp) = unsqu * vafoen(nrofon,iaux)
666 vafott(nrofon,f2fcp) = unsqu * vafoen(nrofon,iaux)
667 cgn write(ulsort,92010) vafoen(nrofon,iaux)
670 cgn write(36,91020) f1fcp,f2fcp
671 cgn write(ulsort,91020) f1hn+nutrde(etan,per1a3( 1,etan)),-1,
675 write (ulsort,texte(langue,4)) 'n+1', fihp
676 write (ulsort,texte(langue,5)) 'n+1', hettri(fihp)
679 c ==> le triangle de l'autre cote
681 iaux = prfcan(ntreca(f1hn+nutrde(etan,per1a3(-1,etan))))
682 fihp = f1hp+per1a3( 1,etan)
683 if ( mod(hettri(fihp),10).eq.0 ) then
686 if ( typint.eq.0 ) then
687 do 23440 , nrofon = 1 , nbfonc
688 vafott(nrofon,f3cp) = vafoen(nrofon,iaux)
689 cgn write(ulsort,92010) vafoen(nrofon,iaux)
692 do 23441 , nrofon = 1 , nbfonc
693 vafott(nrofon,f3cp) = unsde * vafoen(nrofon,iaux)
694 cgn write(ulsort,92010) vafoen(nrofon,iaux)
697 cgn write(37,91020) f3cp
698 cgn write(ulsort,91020) f1hn+nutrde(etan,per1a3(-1,etan)),-1,f3cp
699 elseif ( mod(hettri(fihp),10).eq.etan ) then
701 f1fcp = ntrsca(f1fhp)
702 f2fcp = ntrsca(f1fhp+1)
705 if ( typint.eq.0 ) then
706 do 23450 , nrofon = 1 , nbfonc
707 vafott(nrofon,f1fcp) = vafoen(nrofon,iaux)
708 vafott(nrofon,f2fcp) = vafoen(nrofon,iaux)
709 cgn write(ulsort,92010) vafoen(nrofon,iaux)
712 do 23451 , nrofon = 1 , nbfonc
713 vafott(nrofon,f1fcp) = unsqu * vafoen(nrofon,iaux)
714 vafott(nrofon,f2fcp) = unsqu * vafoen(nrofon,iaux)
715 cgn write(ulsort,92010) vafoen(nrofon,iaux)
718 cgn write(38,91020) f1fcp,f2fcp
719 cgn write(ulsort,91020) f1hn+nutrde(etan,per1a3(-1,etan)),-1,
723 write (ulsort,texte(langue,4)) 'n+1', fihp
724 write (ulsort,texte(langue,5)) 'n+1', hettri(fihp)
727 c doc.1/2/3.erreur. ==> aucun autre etat sur le triangle courant
733 write (ulsort,texte(langue,4)) 'n ', trhn
734 write (ulsort,texte(langue,5)) 'n ', etan
735 write (ulsort,texte(langue,4)) 'n+1', trhnp1
736 write (ulsort,texte(langue,5)) 'n+1', etanp1
742 c=======================================================================
743 c doc.4. ==> le triangle etait coupe en 4 :
744 c=======================================================================
746 elseif ( etan.eq.4 .or.
747 > etan.eq.6 .or. etan.eq.7 .or. etan.eq.8 ) then
749 cgn print *,'le triangle etait coupe en 4'
750 c on repere les numeros dans le calcul pour ses quatre fils
755 f2cn = ntreca(f1hn+1)
756 f3cn = ntreca(f1hn+2)
757 f4cn = ntreca(f1hn+3)
758 cgn print *,'Les 4 fils :'
759 cgn print 1790,f1cn,prfcan(f1cn)
760 cgn print 1790,f2cn,prfcan(f2cn)
761 cgn print 1790,f3cn,prfcan(f3cn)
762 cgn print 1790,f4cn,prfcan(f4cn)
764 if ( prfcan(f1cn).gt.0 .and. prfcan(f2cn).gt.0 .and.
765 > prfcan(f3cn).gt.0 .and. prfcan(f4cn).gt.0 ) then
767 c doc.4.0. ===> etanp1 = 0 : le triangle est actif ; il est reactive.
768 c on lui attribue la valeur moyenne sur les quatre anciens
770 c remarque : cela arrive seulement avec du deraffinement.
779 c ................. .................
781 if ( etanp1.eq.0 ) then
783 trcnp1 = ntrsca(trhnp1)
786 do 241 , nrofon = 1 , nbfonc
787 vafott(nrofon,trcnp1) =
788 > unsqu * ( vafoen(nrofon,prfcan(f1cn))
789 > + vafoen(nrofon,prfcan(f2cn))
790 > + vafoen(nrofon,prfcan(f3cn))
791 > + vafoen(nrofon,prfcan(f4cn)) )
792 cgn write(ulsort,92010) vafoen(nrofon,prfcan(f1cn)),
793 cgn > vafoen(nrofon,prfcan(f2cn)),
794 cgn > vafoen(nrofon,prfcan(f3cn)),
795 cgn > vafoen(nrofon,prfcan(f4cn))
797 cgn write (41,91020) trcnp1
798 cgn write (ulsort,91020) f1cn,f2cn,f3cn,f4cn,-1,trcnp1
800 c doc.4.1/2/3. ===> etanp1 = 1, 2 ou 3 : le triangle est decoupe en
802 c on attribue la valeur moyenne sur les quatre anciens
803 c fils a chacune des deux nouveaux fils.
804 c remarque : on pourrait certainement faire mieux, avec des
805 c moyennes ponderees en fonction du recouvrement
806 c des anciens et nouveaux fils. c'est trop
807 c complique pour que cela vaille le coup.
808 c remarque : cela arrive seulement avec du deraffinement.
813 c ......... ===> . . .
817 c ................. .................
819 elseif ( etanp1.ge.1 .and. etanp1.le.3 ) then
821 f1hp = filtri(trhnp1)
823 f2cp = ntrsca(f1hp+1)
824 cgn print *,f1hp,f1cp,f2cp
827 do 242 , nrofon = 1 , nbfonc
828 daux = unsqu * ( vafoen(nrofon,prfcan(f1cn))
829 > + vafoen(nrofon,prfcan(f2cn))
830 > + vafoen(nrofon,prfcan(f3cn))
831 > + vafoen(nrofon,prfcan(f4cn)) )
832 vafott(nrofon,f1cp) = daux
833 vafott(nrofon,f2cp) = daux
834 cgn write(ulsort,92010) vafoen(nrofon,prfcan(f1cn)),
835 cgn > vafoen(nrofon,prfcan(f2cn)),
836 cgn > vafoen(nrofon,prfcan(f3cn)),
837 cgn > vafoen(nrofon,prfcan(f4cn))
839 cgn write(42,91020) f1cp,f2cp
840 cgn write(ulsort,91020) f1cn,f2cn,f3cn,f4cn,-1,
847 #ifdef _DEBUG_HOMARD_
849 c=======================================================================
850 c doc.4. ==> le triangle n'existait pas
851 c=======================================================================
855 cgn print *,'le triangle n''existait pas'
856 write (ulsort,texte(langue,6))
860 c=======================================================================
868 cgn write(ulsort,91020)(prfcap(iaux),iaux=1,nbtrto)
869 cgn print *,'nbfonc = ',nbfonc
872 cgn do 30001 , iaux=etan,etanp1
873 cgn if ( mod(hettri(iaux),10).eq.0 ) then
875 cgn > ntrsca(iaux),prfcap(ntrsca(iaux)),vafott(1,ntrsca(iaux))
878 cgn11790 format(i4,' : ',i2,' / ',g15.7)
884 if ( codret.ne.0 ) then
888 write (ulsort,texte(langue,1)) 'Sortie', nompro
889 write (ulsort,texte(langue,2)) codret
893 #ifdef _DEBUG_HOMARD_
894 write (ulsort,texte(langue,1)) 'Sortie', nompro