1 subroutine sfcaf2 ( suifro, ulgrfr,
2 > nbfrdi, geocoo, abscur,
3 > numnoe, lignoe, abscno,
4 > typlig, somseg, seglig,
9 > hetare, somare, filare,
10 > np2are, cfaare, famare,
12 > hettri, aretri, filtri,
14 > hetqua, arequa, filqua,
18 > ulsort, langue, codret)
19 c ______________________________________________________________________
22 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
24 c Version originale enregistree le 18 juin 1996 sous le numero 96036
25 c aupres des huissiers de justice Simart et Lavoir a Clamart
26 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
27 c aupres des huissiers de justice
28 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
30 c HOMARD est une marque deposee d'Electricite de France
36 c ______________________________________________________________________
38 c Suivi de Frontiere : CAlcul des nouvelles Frontieres - 2
40 c ______________________________________________________________________
42 c . nom . e/s . taille . description .
43 c .____________________________________________________________________.
44 c . suifro . e . 1 . 1 : pas de suivi de frontiere .
45 c . . . . 2x : frontiere discrete .
46 c . . . . 3x : frontiere analytique .
47 c . . . . 5x : frontiere cao .
48 c . ulgrfr . e . * . unite logique des groupes frontieres CAO .
49 c . nbfrdi . e . 1 . nombre de frontieres discretes .
50 c . geocoo . e .sfnbso**. coordonnees des sommets de la frontiere .
51 c . abscur . e . sfnbse . abscisse curviligne des somm des segments .
52 c . numnoe . e . mcnvnf . liste des noeuds de calcul sur le bord .
53 c . lignoe . e . mcnvnf . liste lignes pour ces noeuds .
54 c . abscno . e . mcnvnf . abscisse curviligne de ces noeuds .
55 c . typlig . e . sfnbli . type de la ligne .
56 c . . . . 0 : ligne ouverte, a 2 extremites .
57 c . . . . 1 : ligne fermee .
58 c . somseg . e . sfnbse . liste des sommets des lignes separees par .
60 c . seglig . e .0:sfnbli. pointeur dans le tableau somseg : les .
61 c . . . . segments de la ligne i sont aux places de .
62 c . . . . seglig(i-1)+1 a seglig(i)-1 inclus .
63 c . nbfran . e . 1 . nombre de frontieres analytiques .
64 c . casfre . e .13nbfran. caracteristiques des frontieres analytiques.
65 c . . . . 1 : 1., si cylindre .
66 c . . . . 2., si sphere .
67 c . . . . 3., si cone par origine, axe et angle .
68 c . . . . 4., si cone par 2 centres et 2 rayons .
69 c . . . . 5., si tore .
70 c . . . . de 2 a 13 : .
71 c . . . . . cylindre : 2,3,4 : xcentr, ycentr, zcentr.
72 c . . . . 5,6,7 : xaxe, yaxe, zaxe .
74 c . . . . . sphere : 2,3,4 : xcentr, ycentr, zcentr.
76 c . . . . . cone : 2,3,4 : xcentr, ycentr, zcentr.
77 c . . . . 5,6,7 : xaxe, yaxe, zaxe .
78 c . . . . 13 : angle en degre .
79 c . . . . . cone 2 : 2,3,4 : xcentr, ycentr, zcentr.
80 c . . . . 5,6,7 : xaxe, yaxe, zaxe .
82 c . . . . 9,10,11:xcent2, ycent2, zcent2.
83 c . . . . 12 : rayon2 .
84 c . . . . 13 : angle en radian .
85 c . . . . . tore : 2,3,4 : xcentr, ycentr, zcentr.
86 c . . . . 5,6,7 : xaxe, yaxe, zaxe .
87 c . . . . 8 : rayon de revolution .
88 c . . . . 12 : rayon primaire .
89 c . unst2x . e . 1 . inverse de la taille maximale au carre .
90 c . epsid2 . e . 1 . precision relative pour carre de distance .
91 c . coonoe . es . nbnoto . coordonnees des noeuds .
93 c . noehom . e . nbnoto . ensemble des noeuds homologues .
94 c . hetare . e . nbarto . historique de l'etat des aretes .
95 c . somare . es .2*nbarto. numeros des extremites d'arete .
96 c . filare . e . nbarto . premiere fille des aretes .
97 c . np2are . e . nbarto . noeud milieux des aretes .
98 c . cfaare . e . nctfar*. codes des familles des aretes .
99 c . . . nbfare . 1 : famille MED .
100 c . . . . 2 : type de segment .
101 c . . . . 3 : orientation .
102 c . . . . 3 : famille d'orientation inverse .
103 c . . . . 5 : numero de ligne de frontiere .
104 c . . . . > 0 si concernee par le suivi de frontiere.
105 c . . . . <= 0 si non concernee .
106 c . . . . 6 : famille frontiere active/inactive .
107 c . . . . 7 : numero de surface de frontiere .
108 c . . . . + l : appartenance a l'equivalence l .
109 c . famare . es . nbarto . famille des aretes .
110 c . facare . es . nbfaar . liste des faces contenant une arete .
111 c . posifa . e . nbarto . pointeur sur tableau facare .
112 c . hettri . es . nbtrto . historique de l'etat des triangles .
113 c . aretri . es .nbtrto*3. numeros des 3 aretes des triangles .
114 c . filtri . e . nbtrto . premier fils des triangles .
115 c . voltri . e .2*nbtrto. numeros des 2 volumes par triangle .
116 c . . . . voltri(i,k) definit le i-eme voisin de k .
117 c . . . . 0 : pas de voisin .
118 c . . . . j>0 : tetraedre j .
119 c . . . . j<0 : pyramide/pentaedre dans pypetr(1/2,j).
120 c . hetqua . es . nbquto . historique de l'etat des quadrangles .
121 c . arequa . es .nbquto*4. numeros des 3 aretes des quadrangles .
122 c . filqua . e . nbquto . premier fils des quadrangles .
123 c . cfaqua . e . nctfqu*. codes des familles des quadrangles .
124 c . . . nbfqua . 1 : famille MED .
125 c . . . . 2 : type de quadrangle .
126 c . . . . 3 : numero de surface de frontiere .
127 c . . . . 4 : famille des aretes internes apres raf.
128 c . . . . 5 : famille des triangles de conformite .
129 c . . . . 6 : famille de sf active/inactive .
130 c . . . . + l : appartenance a l'equivalence l .
131 c . famqua . e . nbquto . famille des quadrangles .
132 c . volqua . e .2*nbquto. numeros des 2 volumes par quadrangle .
133 c . . . . volqua(i,k) definit le i-eme voisin de k .
134 c . . . . 0 : pas de voisin .
135 c . . . . j>0 : hexaedre j .
136 c . . . . j<0 : pyramide/pentaedre dans pypequ(1/2,j).
137 c . lgetco . e . 1 . longueur du tableau de l'etat courant .
138 c . taetco . e . lgetco . tableau de l'etat courant .
139 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
140 c . langue . e . 1 . langue des messages .
141 c . . . . 1 : francais, 2 : anglais .
142 c . codret . es . 1 . code de retour des modules .
143 c . . . . 0 : pas de probleme .
144 c . . . . x : probleme .
145 c ______________________________________________________________________
148 c 0. declarations et dimensionnement
151 c 0.1. ==> generalites
157 parameter ( nompro = 'SFCAF2' )
183 integer numnoe(mcnvnf), lignoe(mcnvnf)
184 integer typlig(sfnbli), somseg(sfnbse), seglig(0:sfnbli)
186 integer noehom(nbnoto)
187 integer hetare(nbarto), somare(2,nbarto), filare(nbarto)
188 integer np2are(nbarto)
189 integer posifa(0:nbarto), facare(nbfaar)
190 integer cfaare(nctfar,nbfare), famare(nbarto)
191 integer hettri(nbtrto), aretri(nbtrto,3), filtri(nbtrto)
192 integer voltri(2,nbtrto)
193 integer hetqua(nbquto), arequa(nbquto,4), filqua(nbquto)
194 integer cfaqua(nctfqu,nbfqua), famqua(nbquto)
195 integer volqua(2,nbquto)
197 double precision unst2x, epsid2
198 double precision casfre(13,nbfran)
199 double precision geocoo(sfnbso,sdim)
200 double precision abscur(sfnbse)
201 double precision coonoe(nbnoto,sdim)
202 double precision abscno(mcnvnf)
205 integer taetco(lgetco)
207 integer ulsort, langue, codret
209 c 0.4. ==> variables locales
211 integer nretap, nrsset
212 integer iaux, jaux, kaux
214 integer lenoeu, larete, lequad
215 integer numfro, numlig, numsur
216 integer nbsomm, noeud(2), laret1(2), lesegm
218 integer sa1a2, sa2a3, sa3a4, sa4a1
220 double precision coopro(3)
225 parameter ( nbmess = 20 )
226 character*80 texte(nblang,nbmess)
228 c 0.5. ==> initialisations
230 #ifdef _DEBUG_HOMARD_
234 c ______________________________________________________________________
244 #ifdef _DEBUG_HOMARD_
245 write (ulsort,texte(langue,1)) 'Entree', nompro
249 texte(1,4) = '(/,a6,'' SUIVI DES FRONTIERES'')'
250 texte(1,5) = '(27(''=''),/)'
251 texte(1,6) = '(''Nombre de frontieres discretes :'',i8)'
252 texte(1,7) = '(''Nombre de frontieres analytiques :'',i8)'
254 > '(/,''. Examen du '',a,i10,'' (frontiere numero'',i8,'')'')'
255 texte(1,9) = '(''... '',a,i10,'' a deplacer'')'
256 texte(1,10) = '(''... Il est entre les '',a,i10,'' et'',i10)'
258 > '(''. Type de frontiere analytique inconnu :'',i10)'
260 texte(2,4) = '(/,a6,'' BOUNDARY FITTING'')'
261 texte(2,5) = '(23(''=''),/)'
262 texte(2,6) = '(''Number of discrete boundaries :'',i8)'
263 texte(2,7) = '(''Number of analytical boundaries:'',i8)'
265 >'(/,''. Examination of '',a,'' #'',i10,'' (boundary #'',i8,'')'')'
266 texte(2,9) = '(''... '',a,'' #'',i10,'' to move'')'
268 > '(''... It is between '',a,'' #'',i10,'' and #'',i10)'
270 > '(''. Unknown analytical boundary type:'',i10)'
274 c 1.4. ==> le numero de sous-etape
276 if ( mod(suifro,5).ne.0 ) then
279 nrsset = taetco(2) + 1
282 call utcvne ( nretap, nrsset, saux, iaux, codret )
288 if ( mod(suifro,5).ne.0 ) then
290 write (ulsort,texte(langue,4)) saux
291 write (ulsort,texte(langue,5))
295 #ifdef _DEBUG_HOMARD_
296 write (ulsort,90002) 'suifro',suifro
297 write (ulsort,texte(langue,6)) nbfrdi
298 write (ulsort,texte(langue,7)) nbfran
302 c 2. boucle sur les noeuds homologues
303 c attention : rien pour le moment
306 #ifdef _DEBUG_HOMARD_
307 write (ulsort,90002) '2. boucle homologues ; codret', codret
311 c 3. boucle sur les aretes
312 c On ne s'interesse qu'aux aretes qui viennent d'etre decoupees
313 c et qui font partie d'une frontiere reconnue
316 #ifdef _DEBUG_HOMARD_
317 write (ulsort,90002) '3. boucle aretes ; codret', codret
318 write (ulsort,90002) 'nbarto', nbarto
319 write (ulsort,90002) 'cosfli', cosfli
320 write (ulsort,90002) 'cosfsa', cosfsa
323 do 31 , larete = 1 , nbarto
325 if ( codret.eq.0 ) then
326 #ifdef _DEBUG_HOMARD_
327 if ( larete.eq.-2793 .or. larete.eq.-3534 ) then
334 if ( hetare(larete).eq.2 ) then
336 numlig = cfaare(cosfli,famare(larete))
337 numsur = cfaare(cosfsa,famare(larete))
338 numfro = max(numlig,numsur)
340 if ( numfro.gt.0 ) then
341 #ifdef _DEBUG_HOMARD_
342 if ( glop.gt.0 ) then
343 write (ulsort,texte(langue,8)) mess14(langue,1,1), larete, numfro
347 c 3.1. ==> reperage des noeuds a bouger
349 if ( typsfr.le.2 ) then
351 c 3.1. ==> typsfr = 1 : on est en en degre 1 ; on doit bouger le nouveau
352 c noeud P1 cree sur cette arete.
353 c typsfr = 2 : on est en degre 2 et les noeuds P2 sont au
354 c milieu des noeuds P1 ; on doit bouger le
355 c noeud P2 de l'arete qui est devenu P1
356 c A chaque fois, c'est la seconde extremite d'une des filles
361 noeud (1) = somare(2,filare(larete))
363 c 3.2. ==> typsfr = 3 : on est en degre 2 et les noeuds P2 sont sur la
364 c frontiere ; on doit bouger les 2 noeuds P2
365 c crees sur chacune des filles de cette arete
370 laret1(1) = filare(larete)
371 noeud (1) = np2are(filare(larete))
372 laret1(2) = filare(larete)+1
373 noeud (2) = np2are(filare(larete)+1)
377 c 3.2. ==> Deplacement des noeuds
379 do 32 , iaux = 1 , nbsomm
381 c 3.2.1. ==> Memorisation des coordonnees initiales
383 if ( codret.eq.0 ) then
385 lenoeu = noeud (iaux)
386 do 321 , jaux = 1 , sdim
387 coopro(jaux) = coonoe(lenoeu,jaux)
390 #ifdef _DEBUG_HOMARD_
391 if ( glop.gt.0 ) then
392 lesegm = laret1(iaux)
393 write (ulsort,texte(langue,8)) mess14(langue,1,1),
395 write (ulsort,texte(langue,9)) mess14(langue,2,-1), lenoeu
396 write (ulsort,90004) 'coo',(coonoe(lenoeu,jaux),jaux=1,sdim)
402 c 3.2.2. ==> Frontiere CAO
403 c jaux et kaux sont les 2 noeuds voisins de lenoeu
405 if ( mod(suifro,5).eq.0 ) then
407 if ( codret.eq.0 ) then
409 lesegm = laret1(iaux)
410 jaux = somare(1,lesegm)
411 kaux = somare(2,lesegm)
412 #ifdef _DEBUG_HOMARD_
413 write (ulsort,texte(langue,10)) mess14(langue,3,-1), jaux, kaux
414 write (ulsort,90002) 'frontiere', numfro
416 write (ulgrfr(numfro),91010) lenoeu, jaux, kaux
420 c 3.2.3. ==> Frontiere discrete
421 c jaux et kaux sont les 2 noeuds voisins de lenoeu
423 elseif ( numfro.le.nbfrdi ) then
425 if ( codret.eq.0 ) then
427 lesegm = laret1(iaux)
428 jaux = somare(1,lesegm)
429 kaux = somare(2,lesegm)
430 #ifdef _DEBUG_HOMARD_
431 write (ulsort,texte(langue,10)) mess14(langue,3,-1), jaux, kaux
434 #ifdef _DEBUG_HOMARD_
435 write (ulsort,texte(langue,3)) 'SFSLIN', nompro
437 call sfslin ( lenoeu, jaux, kaux,
438 > numfro, unst2x, epsid2,
440 > numnoe, lignoe, abscno,
441 > typlig, somseg, seglig,
443 > ulsort, langue, codret)
447 c 3.2.4. ==> Frontiere analytique
451 if ( codret.eq.0 ) then
453 kaux = numfro - nbfrdi
455 jaux = nint(casfre(1,kaux))
457 c 3.2.3.1. ==> Cylindre
459 if ( jaux.eq.1 ) then
461 #ifdef _DEBUG_HOMARD_
462 write (ulsort,texte(langue,3)) 'SFFA01', nompro
464 call sffa01 ( nbnoto, coopro,
467 > casfre(2,kaux), casfre(5,kaux),
469 > ulsort, langue, codret)
471 c 3.2.3.2. ==> Sphere
473 elseif ( jaux.eq.2 ) then
475 #ifdef _DEBUG_HOMARD_
476 write (ulsort,texte(langue,3)) 'SFFA02', nompro
478 call sffa02 ( nbnoto, coopro,
481 > casfre(2,kaux), casfre(8,kaux),
482 > ulsort, langue, codret)
484 c 3.2.3.3./4. ==> Cone
486 elseif ( jaux.eq.3 .or. jaux.eq.4 ) then
488 #ifdef _DEBUG_HOMARD_
489 write (ulsort,texte(langue,3)) 'SFFA03', nompro
491 call sffa03 ( nbnoto, coopro,
494 > casfre(2,kaux), casfre(5,kaux),
496 > ulsort, langue, codret)
500 elseif ( jaux.eq.5 ) then
502 #ifdef _DEBUG_HOMARD_
503 write (ulsort,texte(langue,3)) 'SFFA05', nompro
505 call sffa05 ( nbnoto, coopro,
508 > casfre(2,kaux), casfre(5,kaux),
509 > casfre(8,kaux), casfre(12,kaux),
510 > ulsort, langue, codret)
512 c 3.2.3.n. ==> Inconnu
516 write (ulsort,texte(langue,8)) mess14(langue,1,1),
518 write (ulsort,texte(langue,11)) jaux
527 c 3.2.4. ==> On realise le changement de coordonnees
529 if ( mod(suifro,5).ne.0 ) then
531 if ( codret.eq.0 ) then
533 #ifdef _DEBUG_HOMARD_
534 if ( glop.gt.0 ) then
535 32490 format(9x,'X',19x,'Y',19x,'Z')
537 write (ulsort,90004) 'ancien ',(coonoe(lenoeu,jaux),jaux=1,sdim)
538 write (ulsort,90004) 'nouveau',(coopro(jaux),jaux=1,sdim)
541 do 324 , jaux = 1 , sdim
542 coonoe(lenoeu,jaux) = coopro(jaux)
560 c 4. boucle sur les quadrangles
561 c On ne s'interesse qu'aux quadrangles
562 c . qui viennent d'etre decoupes soit car ils etaient actifs, soit
563 c car ils etaient coupes en 3 triangles
564 c . qui font partie d'une frontiere reconnue
567 #ifdef _DEBUG_HOMARD_
568 write (ulsort,90002) '4. boucle quadrangles ; codret', codret
571 do 41 , lequad = 1 , nbquto
573 if ( codret.eq.0 ) then
575 #ifdef _DEBUG_HOMARD_
576 if ( lequad.eq.-9 .or. lequad.eq.-10 ) then
583 numfro = cfaqua(cosfsu,famqua(lequad))
585 if ( numfro.gt.0 ) then
586 #ifdef _DEBUG_HOMARD_
587 write (ulsort,texte(langue,8)) mess14(langue,1,4), lequad, numfro
590 etanp1 = mod(hetqua(lequad),100)
591 cgn write (ulsort,90002) 'etanp1', etanp1
593 if ( ( etanp1.eq.4 ) .or.
594 > ( etanp1.ge.41 .and. etanp1.le.44) ) then
596 etan = (hetqua(lequad)-etanp1) / 100
598 if ( etan.eq.0 .or. ( etan.ge.31 .and. etan.le.34 ) ) then
600 c 4.1. ==> reperage des noeuds a bouger
602 if ( typsfr.le.2 ) then
604 c 4.1. ==> typsfr = 1 : on est en en degre 1 ; on doit bouger le nouveau
605 c noeud P1 cree au centre du quadrangle
606 c typsfr = 2 : on est en degre 2 et les noeuds P2 sont au
607 c milieu des noeuds P1 ; on doit bouger le
608 c nouveau noeud P1 cree au centre du quadrangle
609 c ce noeud central est la seconde extremite de la 2eme ou 3eme
610 c arete de l'un quelconque des quadrangles fils (cf. cmrdqu)
614 call utnmqu ( iaux, jaux,
615 > somare, arequa, filqua )
618 c 4.2. ==> typsfr = 3 : on est en degre 2 et les noeuds P2 sont sur la
628 c 4.2. ==> Deplacement des noeuds
630 do 42 , iaux = 1 , nbsomm
632 c 4.2.1. ==> Memorisation des coordonnees initiales
634 if ( codret.eq.0 ) then
636 lenoeu = noeud (iaux)
637 do 421 , jaux = 1 , sdim
638 coopro(jaux) = coonoe(lenoeu,jaux)
641 #ifdef _DEBUG_HOMARD_
642 write (ulsort,texte(langue,9)) mess14(langue,2,-1), lenoeu
647 c 4.2.2. ==> Frontiere CAO
649 if ( mod(suifro,5).eq.0 ) then
651 #ifdef _DEBUG_HOMARD_
652 write (ulsort,90002) 'surface numfro',numfro
655 call utsoqu ( somare,
656 > arequa(lequad,1), arequa(lequad,2),
657 > arequa(lequad,3), arequa(lequad,4),
658 > sa1a2, sa2a3, sa3a4, sa4a1 )
660 write (ulgrfr(numfro),91010) lenoeu,
661 > sa1a2, sa2a3, sa3a4, sa4a1
663 c 4.2.3. ==> Frontiere analytique
667 if ( codret.eq.0 ) then
669 kaux = numfro - nbfrdi
670 jaux = nint(casfre(1,kaux))
672 c 4.2.3.1. ==> Cylindre
674 if ( jaux.eq.1 ) then
676 #ifdef _DEBUG_HOMARD_
677 write (ulsort,texte(langue,3)) 'SFFA01', nompro
679 call sffa01 ( nbnoto, coopro,
682 > casfre(2,kaux), casfre(5,kaux),
684 > ulsort, langue, codret)
686 c 4.2.3.2. ==> Sphere
688 elseif ( jaux.eq.2 ) then
690 #ifdef _DEBUG_HOMARD_
691 write (ulsort,texte(langue,3)) 'SFFA02', nompro
693 call sffa02 ( nbnoto, coopro,
696 > casfre(2,kaux), casfre(8,kaux),
697 > ulsort, langue, codret)
699 c 4.2.3.n. ==> Inconnu
703 write (ulsort,texte(langue,11)) jaux
712 c 4.2.4. ==> On realise le changement de coordonnees
714 if ( codret.eq.0 ) then
715 #ifdef _DEBUG_HOMARD_
716 if ( glop.gt.0 ) then
717 42490 format(9x,'X',19x,'Y',19x,'Z')
719 write (ulsort,90004) 'ancien ',(coonoe(lenoeu,jaux),jaux=1,sdim)
720 write (ulsort,90004) 'nouveau',(coopro(jaux),jaux=1,sdim)
724 do 424 , jaux = 1 , sdim
725 coonoe(lenoeu,jaux) = coopro(jaux)
746 if ( codret.ne.0 ) then
750 write (ulsort,texte(langue,1)) 'Sortie', nompro
751 write (ulsort,texte(langue,2)) codret
755 #ifdef _DEBUG_HOMARD_
756 write (ulsort,texte(langue,1)) 'Sortie', nompro