1 subroutine pcmac1 ( nbele0,
2 > coonoe, hetnoe, ancnoe, trav1a,
4 > somare, np2are, hetare,
5 > aretri, hettri, nintri,
6 > arequa, hetqua, ninqua,
7 > tritet, cotrte, aretet, hettet,
8 > quahex, coquhe, arehex, hethex,
10 > facpyr, cofapy, arepyr, hetpyr,
11 > facpen, cofape, arepen, hetpen,
12 > famnoe, cfanoe, fammpo, cfampo,
14 > famtri, cfatri, famqua, cfaqua,
15 > famtet, cfatet, famhex, cfahex,
16 > fampyr, cfapyr, fampen, cfapen,
17 > nnosca, nnosho, nmpsca, nmpsho,
19 > ntrsca, ntrsho, nqusca, nqusho,
20 > ntesca, ntesho, nhesca, nhesho,
21 > npysca, npysho, npesca, npesho,
22 > dimcst, coocst, coonca, fameno,
23 > famele, noeele, typele,
26 > ulsort, langue, codret )
27 c ______________________________________________________________________
31 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
33 c Version originale enregistree le 18 juin 1996 sous le numero 96036
34 c aupres des huissiers de justice Simart et Lavoir a Clamart
35 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
36 c aupres des huissiers de justice
37 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
39 c HOMARD est une marque deposee d'Electricite de France
45 c ______________________________________________________________________
47 c aPres adaptation - Conversion - MAillage Connectivite - phase 1
49 c ______________________________________________________________________
51 c remarque : on s'arrange pour que les mailles externes soient
52 c numerotees dans cet ordre :
56 c . les mailles-points
61 c ______________________________________________________________________
63 c . nom . e/s . taille . description .
64 c .____________________________________________________________________.
65 c . nbele0 . e . 1 . estimation du nombre d'elements .
66 c . coonoe . e . nbnoto . coordonnees des noeuds .
68 c . hetnoe . e . nbnoto . historique de l'etat des noeuds .
69 c . noempo . e . nbmpto . numeros des noeuds associes aux mailles .
70 c . hetmpo . e . nbmpto . historique de l'etat des mailles-points .
71 c . somare . e .2*nbarto. numeros des extremites d'arete .
72 c . np2are . e . nbarto . numero du noeud p2 milieu d'arete .
73 c . hetare . e . nbarto . historique de l'etat des aretes .
74 c . aretri . e .nbtrto*3. numeros des 3 aretes des triangles .
75 c . hettri . e . nbtrto . historique de l'etat des triangles .
76 c . nintri . e . nbtrto . noeud interne au triangle .
77 c . arequa . e .nbquto*4. numeros des 4 aretes des quadrangles .
78 c . hetqua . e . nbquto . historique de l'etat des quadrangles .
79 c . ninqua . e . nbquto . noeud interne au quadrangle .
80 c . tritet . e .nbtecf*4. numeros des 4 triangles des tetraedres .
81 c . cotrte . e .nbtecf*4. code des 4 triangles des tetraedres .
82 c . aretet . e .nbteca*6. numeros des 6 aretes des tetraedres .
83 c . hettet . e . nbteto . historique de l'etat des tetraedres .
84 c . quahex . e .nbhecf*6. numeros des 6 quadrangles des hexaedres .
85 c . coquhe . e .nbhecf*6. codes des 6 quadrangles des hexaedres .
86 c . arehex . e .nbheca12. numeros des 12 aretes des hexaedres .
87 c . hethex . e . nbheto . historique de l'etat des hexaedres .
88 c . ninhex . e . nbheto . noeud interne a l'hexaedre .
89 c . facpyr . e .nbpycf*5. numeros des 5 faces des pyramides .
90 c . cofapy . e .nbpycf*5. codes des faces des pyramides .
91 c . arepyr . e .nbpyca*8. numeros des 8 aretes des pyramides .
92 c . hetpyr . e . nbpyto . historique de l'etat des pyramides .
93 c . facpen . e .nbpecf*5. numeros des faces des pentaedres .
94 c . cofape . e .nbpecf*5. codes des faces des pentaedres .
95 c . arepen . e .nbpeca*9. numeros des 9 aretes des pentaedres .
96 c . hetpen . e . nbpeto . historique de l'etat des pentaedres .
97 c . cfanoe . e . nctfno*. codes des familles des noeuds .
98 c . . . nbnoto . 1 : famille MED .
99 c . . . . + l : appartenance a l'equivalence l .
100 c . fammpo . e . nbmpto . famille des mailles-points .
101 c . cfampo . e . nctfmp*. codes des familles des mailles-points .
102 c . . . nbfmpo . 1 : famille MED .
103 c . . . . 2 : type de maille-point .
104 c . . . . 3 : famille des sommets .
105 c . . . . + l : appartenance a l'equivalence l .
106 c . famare . e . nbarto . famille des aretes .
107 c . cfaare . e . nctfar*. codes des familles des aretes .
108 c . . . nbfare . 1 : famille MED .
109 c . . . . 2 : type de segment .
110 c . . . . 3 : orientation .
111 c . . . . 4 : famille d'orientation inverse .
112 c . . . . 5 : numero de ligne de frontiere .
113 c . . . . > 0 si concernee par le suivi de frontiere.
114 c . . . . <= 0 si non concernee .
115 c . . . . 6 : famille frontiere active/inactive .
116 c . . . . 7 : numero de surface de frontiere .
117 c . . . . + l : appartenance a l'equivalence l .
118 c . famtri . e . nbtrto . famille des triangles .
119 c . cfatri . e . nctftr*. codes des familles des triangles .
120 c . . . nbftri . 1 : famille MED .
121 c . . . . 2 : type de triangle .
122 c . . . . 3 : numero de surface de frontiere .
123 c . . . . 4 : famille des aretes internes apres raf.
124 c . . . . + l : appartenance a l'equivalence l .
125 c . famqua . e . nbquto . famille des quadrangles .
126 c . cfaqua . e . nctfqu*. codes des familles des quadrangles .
127 c . . . nbfqua . 1 : famille MED .
128 c . . . . 2 : type de quadrangle .
129 c . . . . 3 : numero de surface de frontiere .
130 c . . . . 4 : famille des aretes internes apres raf.
131 c . . . . 5 : famille des triangles de conformite .
132 c . . . . 6 : famille de sf active/inactive .
133 c . . . . + l : appartenance a l'equivalence l .
134 c . famtet . e . nbteto . famille des tetraedres .
135 c . cfatet . . nctfte. codes des familles des tetraedres .
136 c . . . nbftet . 1 : famille MED .
137 c . . . . 2 : type de tetraedres .
138 c . famhex . e . nbheto . famille des hexaedres .
139 c . cfahex . . nctfhe. codes des familles des hexaedres .
140 c . . . nbfhex . 1 : famille MED .
141 c . . . . 2 : type d'hexaedres .
142 c . . . . 3 : famille des tetraedres de conformite .
143 c . . . . 4 : famille des pyramides de conformite .
144 c . fampyr . e . nbpyto . famille des pyramides .
145 c . cfapyr . . nctfpy. codes des familles des pyramides .
146 c . . . nbfpyr . 1 : famille MED .
147 c . . . . 2 : type de pyramides .
148 c . fampen . e . nbpeto . famille des pentaedres .
149 c . cfapen . . nctfpe. codes des familles des pentaedres .
150 c . . . nbfpen . 1 : famille MED .
151 c . . . . 2 : type de pentaedres .
152 c . . . . 3 : famille des tetraedres de conformite .
153 c . . . . 4 : famille des pyramides de conformite .
154 c . nnosca . s . rsnoto . numero des noeuds du code de calcul .
155 c . nnosho . s . rsnoac . numero des noeuds dans HOMARD .
156 c . nmpsca . s . rsmpto . numero des mailles-points du calcul .
157 c . nmpsho . s . rsmpac . numero des mailles-points dans HOMARD .
158 c . narsca . s . rsarto . numero des aretes du calcul .
159 c . narsho . s . rsarac . numero des aretes dans HOMARD .
160 c . ntrsca . s . rstrto . numero des triangles du calcul .
161 c . ntrsho . s . rstrac . numero des triangles dans HOMARD .
162 c . nqusca . s . rsquto . numero des quadrangles du calcul .
163 c . nqusho . s . rsquac . numero des quadrangles dans HOMARD .
164 c . ntesca . s . rsteto . numero des tetraedres du calcul .
165 c . ntesho . s . rsteac . numero des tetraedres dans HOMARD .
166 c . nhesho . s . reheac . numero des hexaedres dans HOMARD .
167 c . nhesca . s . rsheto . numero des hexaedres dans le calcul .
168 c . npysho . s . repyac . numero des pyramides dans HOMARD .
169 c . npysca . s . rspyto . numero des pyramides dans le calcul sortie .
170 c . npesho . s . repeac . numero des pentaedres dans HOMARD .
171 c . npesca . s . rspeto . numero des pentaedres dans le calcul .
172 c . dimcst . e . 1 . dimension de la coordonnee constante .
173 c . . . . eventuelle, 0 si toutes varient .
174 c . coocst . e . 11 . 1 : coordonnee constante eventuelle .
175 c . . . . 2, 3, 4 : xmin, ymin, zmin .
176 c . . . . 5, 6, 7 : xmax, ymax, zmax .
177 c . . . . 8, 9, 10 : -1 si constant, max-min sinon .
178 c . . . . 11 : max des (max-min) .
179 c . coonca . s . nbnoto . coordonnees des noeuds dans le calcul .
181 c . fameno . s . nbnoto . famille med des noeuds .
182 c . famele . s . nbele0 . famille med des elements .
183 c . noeele . s . nbele0 . noeuds des elements .
185 c . typele . s . nbele0 . type des elements .
186 c . noeord . e . 1 . vrai si les noeuds sont ordonnes .
187 c . . . . faux si sans importance .
188 c . noeeig . e .nbelig**. noeuds des elements .
189 c . fmdeig . e . nbelig . famille med des elements .
190 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
191 c . langue . e . 1 . langue des messages .
192 c . . . . 1 : francais, 2 : anglais .
193 c . codret . es . 1 . code de retour des modules .
194 c . . . . 0 : pas de probleme .
195 c . . . . 1 : probleme .
196 c ______________________________________________________________________
199 c 0. declarations et dimensionnement
202 c 0.1. ==> generalites
208 parameter ( nompro = 'PCMAC1' )
239 double precision coocst(11)
240 double precision coonoe(nbnoto,sdim), coonca(nbnoto,sdimca)
242 integer hetnoe(nbnoto), ancnoe(nbnoto), trav1a(nbnoto)
243 integer noempo(nbmpto), hetmpo(nbmpto)
244 integer somare(2,nbarto), np2are(nbarto)
245 integer hetare(nbarto)
246 integer aretri(nbtrto,3), hettri(nbtrto), nintri(nbtrto)
247 integer arequa(nbquto,4), hetqua(nbquto), ninqua(nbquto)
248 integer tritet(nbtecf,4), cotrte(nbtecf,4), aretet(nbteca,6)
249 integer hettet(nbteto)
250 integer quahex(nbhecf,6), coquhe(nbhecf,6), arehex(nbheca,12)
251 integer hethex(nbheto), ninhex(nbheto)
252 integer facpyr(nbpycf,5), cofapy(nbpycf,5), arepyr(nbpyca,8)
253 integer hetpyr(nbpyto)
254 integer facpen(nbpecf,5), cofape(nbpecf,5), arepen(nbpeca,9)
255 integer hetpen(nbpeto)
257 integer cfanoe(nctfno,nbfnoe), famnoe(nbnoto)
258 integer cfampo(nctfmp,nbfmpo), fammpo(nbmpto)
259 integer cfaare(nctfar,nbfare), famare(nbarto)
260 integer cfatri(nctftr,nbftri), famtri(nbtrto)
261 integer cfaqua(nctfqu,nbfqua), famqua(nbquto)
262 integer cfatet(nctfte,nbftet), famtet(nbteto)
263 integer cfahex(nctfhe,nbfhex), famhex(nbheto)
264 integer cfapyr(nctfpy,nbfpyr), fampyr(nbpyto)
265 integer cfapen(nctfpe,nbfpen), fampen(nbpeto)
267 integer nnosca(rsnoto), nnosho(rsnoac)
268 integer nmpsca(rsmpto), nmpsho(nbele0)
269 integer narsca(rsarto), narsho(nbele0)
270 integer ntrsca(rstrto), ntrsho(nbele0)
271 integer nqusca(rsquto), nqusho(nbele0)
272 integer ntesca(rsteto), ntesho(nbele0)
273 integer nhesca(rsheto), nhesho(nbele0)
274 integer npysca(rspyto), npysho(nbele0)
275 integer npesca(rspeto), npesho(nbele0)
277 integer fameno(nbnoto), famele(nbele0), noeele(nbele0,nbmane)
278 integer typele(nbele0)
279 integer fmdeig(nbelig)
280 integer noeeig(nbelig,*)
285 integer ulsort, langue, codret
287 c 0.4. ==> variables locales
293 parameter ( nbmess = 10 )
294 character*80 texte(nblang,nbmess)
296 c 0.5. ==> initialisations
297 c ______________________________________________________________________
305 #ifdef _DEBUG_HOMARD_
306 write (ulsort,texte(langue,1)) 'Entree', nompro
310 texte(1,4) = '(''Nombre de mailles calcule :'',i11)'
311 texte(1,5) = '(''Nombre de mailles estime :'',i11)'
312 texte(1,6) = '(''Elements hierarchiques :'',i2)'
314 texte(2,4) = '(''Computed number of meshes :'',i11)'
315 texte(2,5) = '(''Estimated number of meshes :'',i11)'
316 texte(2,6) = '(''Hierarchical elements :'',i2)'
325 #ifdef _DEBUG_HOMARD_
326 write (ulsort,texte(langue,6)) hierar
335 #ifdef _DEBUG_HOMARD_
336 write (ulsort,texte(langue,3)) 'PCMANO', nompro
338 call pcmano ( coonoe, hetnoe,
341 > dimcst, coocst, sdimca, coonca,
344 > ulsort, langue, codret )
348 c on rappelle que la caracteristique numero 2 d'une maille
349 c est nulle si ce n'etait pas une maille du calcul.
350 c si c'est une maille de calcul, la caracteristique vaut le type
351 c correspondant a celui du code de calcul associe.
353 c remarque : on s'arrange pour que les mailles externes soient
354 c numerotees dans cet ordre :
358 c . les mailles-points
363 c Cela est indispensable pour les algorithmes de
364 c conversion de solution et pour la gestion des equivalences
366 c remarque : dans le cas general, on ne prend que les mailles actives.
367 c mais dans le cas hierarchique, on prend tous les niveaux.
369 #ifdef _DEBUG_HOMARD_
370 write (ulsort,90002) '3. mailles ; codret', codret
375 c 3.1. ==> les tetraedres actifs
376 #ifdef _DEBUG_HOMARD_
377 write (ulsort,90002) '3.1. tetraedres ; codret', codret
380 if ( codret.eq.0 ) then
382 if ( rsteto.eq.0 ) then
388 #ifdef _DEBUG_HOMARD_
389 write (ulsort,texte(langue,3)) 'PCMATE', nompro
391 call pcmate ( elemen, nbele0,
394 > tritet, cotrte, aretet,
395 > hettet, famtet, cfatet,
396 > nnosca, ntesca, ntesho,
397 > famele, noeele, typele,
398 > ulsort, langue, codret )
406 c 3.2. ==> les mailles triangulaires :
407 c - triangles actifs en 2,5d
408 c - triangles actifs isoles en 3d,
409 #ifdef _DEBUG_HOMARD_
410 write (ulsort,90002) '3.2. triangles ; codret', codret
411 write (ulsort,90002) 'nbtrac', nbtrac
414 if ( codret.eq.0 ) then
416 if ( rstrto.eq.0 ) then
422 #ifdef _DEBUG_HOMARD_
423 write (ulsort,texte(langue,3)) 'PCMATR', nompro
425 call pcmatr ( elemen, nbele0,
427 > aretri, hettri, nintri,
429 > nnosca, ntrsca, ntrsho,
430 > famele, noeele, typele,
431 > ulsort, langue, codret )
433 nbtria = elemen - nbtetr
439 c 3.3. ==> les poutres, c'est-a-dire les aretes isolees
440 #ifdef _DEBUG_HOMARD_
441 write (ulsort,90002) '3.3. aretes ; codret', codret
444 if ( codret.eq.0 ) then
446 if ( rsarto.eq.0 ) then
452 #ifdef _DEBUG_HOMARD_
453 write (ulsort,texte(langue,3)) 'PCMAAR', nompro
455 call pcmaar ( elemen, nbele0,
456 > somare, np2are, hetare,
458 > nnosca, narsca, narsho,
459 > famele, noeele, typele,
460 > ulsort, langue, codret )
462 nbsegm = elemen - nbtetr - nbtria
468 c 3.4. ==> les mailles-points
469 #ifdef _DEBUG_HOMARD_
470 write (ulsort,90002) '3.4. mailles-points ; codret', codret
473 if ( codret.eq.0 ) then
475 if ( rsmpto.eq.0 ) then
481 #ifdef _DEBUG_HOMARD_
482 write (ulsort,texte(langue,3)) 'PCMAMP', nompro
484 call pcmamp ( elemen, nbele0,
487 > nnosca, nmpsca, nmpsho,
488 > famele, noeele, typele,
489 > ulsort, langue, codret )
491 nbmapo = elemen - nbtetr - nbtria - nbsegm
497 c 3.5. ==> les elements quadrangulaires :
498 c - quadrangles actifs en 2,5d
499 c - quadrangles actifs isoles en 3d,
500 #ifdef _DEBUG_HOMARD_
501 write (ulsort,90002) '3.5. quadrangles ; codret', codret
502 write (ulsort,90002) 'nbquac', nbquac
505 if ( codret.eq.0 ) then
507 if ( rsquto.eq.0 ) then
513 #ifdef _DEBUG_HOMARD_
514 write (ulsort,texte(langue,3)) 'PCMAQU', nompro
516 call pcmaqu ( elemen, nbele0,
518 > arequa, hetqua, ninqua,
520 > nnosca, nqusca, nqusho,
521 > famele, noeele, typele,
522 > ulsort, langue, codret )
524 nbquad = elemen - nbtetr - nbtria - nbsegm - nbmapo
530 c 3.6. ==> les hexaedres actifs
531 #ifdef _DEBUG_HOMARD_
532 write (ulsort,90002) '3.6. hexaedres ; codret', codret
535 if ( codret.eq.0 ) then
537 if ( rsheto.eq.0 ) then
543 #ifdef _DEBUG_HOMARD_
544 write (ulsort,texte(langue,3)) 'PCMAHE', nompro
546 call pcmahe ( elemen, nbele0,
549 > quahex, coquhe, arehex,
552 > nnosca, nhesca, nhesho,
553 > famele, noeele, typele,
554 > ulsort, langue, codret )
556 nbhexa = elemen - nbtetr - nbtria - nbsegm - nbmapo - nbquad
562 c 3.7. ==> les pyramides actives
564 #ifdef _DEBUG_HOMARD_
565 write (ulsort,90002) '3.7. pyramides ; codret', codret
568 if ( codret.eq.0 ) then
570 if ( rspyto.eq.0 ) then
576 #ifdef _DEBUG_HOMARD_
577 write (ulsort,texte(langue,3)) 'PCMAPY', nompro
579 call pcmapy ( elemen, nbele0,
582 > facpyr, cofapy, arepyr,
583 > hetpyr, fampyr, cfapyr,
584 > nnosca, npysca, npysho,
585 > famele, noeele, typele,
586 > ulsort, langue, codret )
588 nbpyra = elemen - nbtetr - nbtria - nbsegm - nbmapo - nbquad
590 #ifdef _DEBUG_HOMARD_
591 write (ulsort,90002) 'Nombre de pyramides converties', nbpyra
598 c 3.8. ==> les pentaedres actifs
599 #ifdef _DEBUG_HOMARD_
600 write (ulsort,90002) '3.8. pentaedres ; codret', codret
603 if ( codret.eq.0 ) then
605 if ( rspeto.eq.0 ) then
611 #ifdef _DEBUG_HOMARD_
612 write (ulsort,texte(langue,3)) 'PCMAPE', nompro
614 call pcmape ( elemen, nbele0,
617 > facpen, cofape, arepen,
618 > hetpen, fampen, cfapen,
619 > nnosca, npesca, npesho,
620 > famele, noeele, typele,
621 > ulsort, langue, codret )
623 nbpent = elemen - nbtetr - nbtria - nbsegm - nbmapo - nbquad
631 c 4. Les eventuelles mailles ignorees
634 #ifdef _DEBUG_HOMARD_
635 write (ulsort,90002) '4. Elements ignores ; codret', codret
638 if ( codret.eq.0 ) then
640 if ( nbelig.ne.0 ) then
642 nbpyra = nbpyra + nbelig
643 #ifdef _DEBUG_HOMARD_
644 write (ulsort,90002) 'Nombre de pyramides', nbpyra
647 #ifdef _DEBUG_HOMARD_
648 write (ulsort,texte(langue,3)) 'PCMAIG', nompro
650 call pcmaig ( nbele0, nbelig,
652 > elemen, typele, famele, noeele,
653 > nnosca, ancnoe, trav1a, deraff,
654 > ulsort, langue, codret )
664 #ifdef _DEBUG_HOMARD_
665 write (ulsort,90002) '5. mise a jour ; codret', codret
668 c 5.1.==> nombres caracteristiques du maillage de calcul
670 if ( codret.eq.0 ) then
672 if ( nbhexa.ne.0 ) then
675 elseif ( nbpent.ne.0 ) then
678 elseif ( nbpyra.ne.0 ) then
681 elseif ( nbtetr.ne.0 ) then
684 elseif ( nbquad.ne.0 ) then
687 elseif ( nbtria.ne.0 ) then
695 nbelem = nbmapo + nbsegm +
697 > nbtetr + nbhexa + nbpyra + nbpent
699 if ( elemen.ne.nbelem ) then
700 write (ulsort,texte(langue,4)) elemen
701 write (ulsort,texte(langue,5)) nbelem
702 write (ulsort,texte(langue,3))
714 c 5.2. ==> nombres propres a la renumerotation des entites
716 if ( codret.eq.0 ) then
718 if ( nbmapo.ne.0 ) then
724 if ( nbsegm.ne.0 ) then
730 if ( nbtria.ne.0 ) then
736 if ( nbquad.ne.0 ) then
742 if ( nbteto.ne.0 ) then
748 if ( nbheto.ne.0 ) then
754 if ( nbpyto.ne.0 ) then
760 if ( nbpeto.ne.0 ) then
767 if ( rsteac.eq.0 .and. rsheac.eq.0 .and. rspyac.eq.0 ) then
768 rsevca = nbtria + nbquad
769 rsevto = rstrto + rsquto
771 rsevca = nbtetr + nbhexa + nbpyra + nbpent
772 rsevto = rsteto + rsheto + rspyto + rspeto
781 if ( codret.ne.0 ) then
785 write (ulsort,texte(langue,1)) 'Sortie', nompro
786 write (ulsort,texte(langue,2)) codret
790 #ifdef _DEBUG_HOMARD_
791 write (ulsort,texte(langue,1)) 'Sortie', nompro