1 subroutine mmag13 ( muarmx, nbarmu, multax, multnx,
4 > nbduno, nbduar, nbtrtn, nbqutn,
7 > tbau51, tbau52, tbau53,
8 > nbjoit, nbpejt, nbtrjt,
9 > nbjoiq, nbhejq, nbqujq,
14 > ulsort, langue, codret )
15 c ______________________________________________________________________
19 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
21 c Version originale enregistree le 18 juin 1996 sous le numero 96036
22 c aupres des huissiers de justice Simart et Lavoir a Clamart
23 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
24 c aupres des huissiers de justice
25 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
27 c HOMARD est une marque deposee d'Electricite de France
33 c ______________________________________________________________________
35 c Modification de Maillage - AGregat - phase 1.3
37 c . Creation des mailles a partir des aretes et noeuds multiples
38 c ______________________________________________________________________
40 c . nom . e/s . taille . description .
41 c .____________________________________________________________________.
42 c . muarmx . e . 1 . ordre de multiplicite des aretes maximal .
44 c . nbarmu . e . muarmx . nombre d'aretes par ordre de multiplicite .
45 c . multax . e . 1 . ordre de multiplicite des aretes maximal .
46 c . munrmx . e . 1 . ordre de multiplicite des noeuds maximal .
48 c . multnx . e . 1 . ordre de multiplicite des noeuds maximal .
49 c . somare . e .2*nbarto. numeros des extremites d'arete .
50 c . nbjois . e . 1 . nombre de joints simples .
51 c . tbaux2 . es . 4** . Pour le i-eme joint : .
52 c . . . . Numeros des familles MED des volumes .
53 c . . . . jouxtant le pentaedre/hexaedre, classes du .
54 c . . . . plus petit (1,i) au plus grand .
55 c . . . . 0, si pas de volume voisin .
56 c . tbau30 . es .8*nbduno. Pour la i-eme duplication de noeud : .
57 c . . . . (1,i) : noeud a dupliquer .
58 c . . . . (2,i) : arete construite sur le noeud .
59 c . . . . (3,i) : noeud cree cote min(fammed) .
60 c . . . . (4,i) : noeud cree cote max(fammed) .
61 c . . . . (5,i) : numero du joint simple cree .
62 c . . . . (6,i) : arete entrant dans le cote 1 .
63 c . . . . (7,i) : arete entrant dans le cote 2 .
64 c . . . . (8,i) : ordre de multiplicite .
65 c . tbau40 . es .6*nbduar. Pour la i-eme duplication d'arete : .
66 c . . . . (1,i) : arete a dupliquer .
67 c . . . . (2,i) : arete creee cote min(fammed) .
68 c . . . . (3,i) : arete creee cote max(fammed) .
69 c . . . . (4,i) : numero du joint simple cree .
70 c . . . . (5,i) : ordre de multiplicite .
71 c . . . . (6,i) : arete d'orientation de joint .
72 c . nbduno . e . 1 . nombre de duplication de noeuds .
73 c . nbduar . e . 1 . nombre de duplications d'aretes .
74 c . nbtrtn . e . 1 . nouveau nombre total de triangles .
75 c . nbqutn . e . 1 . nouveau nombre total de quadrangles .
76 c . tbau31 . s . 2** . Les triangles puis les quadrangles .
77 c . . . . construits sur un noeud multiple : .
78 c . . . . (1,i) : noeud multiple .
79 c . . . . (2,i) : numero du joint multiple cree .
80 c . tbau41 . s . 4** . Les pentaedres de joint triple, puis les .
81 c . . . . hexaedres de joint quadruple : .
82 c . . . . (1,i) : arete multiple .
83 c . . . . (2,i) : numero du joint .
84 c . . . . Pour le i-eme pentaedre de joint triple : .
85 c . . . . (3,i) : triangle cree cote 1er sommet .
86 c . . . . (4,i) : triangle cree cote 2nd sommet .
87 c . . . . Pour le i-eme hexaedre de joint quadruple :.
88 c . . . . (3,i) : quadrangle cree cote 1er sommet .
89 c . . . . (4,i) : quadrangle cree cote 2nd sommet .
90 c . tbau51 . s . 9** . Les tetraedres ponctuels entre les joints .
91 c . . . . triples (ordre 6) : .
92 c . . . . (1,i) : noeud multiple .
93 c . . . . (2,i) : triangle cote du 1er joint triple .
94 c . . . . (3,i) : triangle cote du 2eme joint triple .
95 c . . . . (4,i) : triangle cote du 3eme joint triple .
96 c . . . . (5,i) : triangle cote du 4eme joint triple .
97 c . . . . (1+k) : pour le k-eme triangle, 1 s'il .
98 c . . . . entre dans le joint ponctuel, -1 sinon .
99 c . tbau52 . s . 11** . Les pentaedres ponctuels entre les joints .
100 c . . . . triples et quadruples (ordre 9) : .
101 c . . . . (1,i) : noeud multiple .
102 c . . . . (2,i) : triangle cote du 1er joint triple .
103 c . . . . (3,i) : triangle cote du 2eme joint triple .
104 c . . . . (4,i) : quadrangle cote du 1er joint quad. .
105 c . . . . (5,i) : quadrangle cote du 2eme joint quad..
106 c . . . . (6,i) : quadrangle cote du 3eme joint quad..
107 c . . . . (1+k) : pour la k-eme face, 1 si elle .
108 c . . . . entre dans le joint ponctuel, -1 sinon .
109 c . tbau53 . s . 13** . Les hexaedres ponctuels entre les joints .
110 c . . . . quadruples (ordre 12) : .
111 c . . . . (1,i) : noeud multiple .
112 c . . . . (2,i) : quadrangle cote du 1er joint quad. .
113 c . . . . (3,i) : quadrangle cote du 2eme joint quad..
114 c . . . . (4,i) : quadrangle cote du 3eme joint quad..
115 c . . . . (5,i) : quadrangle cote du 4eme joint quad..
116 c . . . . (6,i) : quadrangle cote du 5eme joint quad..
117 c . . . . (7,i) : quadrangle cote du 6eme joint quad..
118 c . . . . (1+k) : pour le k-eme quadrangle, 1 s'il .
119 c . . . . entre dans le joint ponctuel, -1 sinon .
120 c . nbjoit . s . 1 . nombre de joints triples .
121 c . nbpejt . s . 1 . nombre de pentaedres de joints triples .
122 c . nbtrjt . s . 1 . nombre de triangles de joints triples .
123 c . nbjoiq . s . 1 . nombre de joints quadruples .
124 c . nbhejq . s . 1 . nombre d'hexaedres de joints quadruples .
125 c . nbqujq . s . 1 . nombre de quad. crees pour j. quadruples .
126 c . nbjp06 . s . 1 . nombre de joints ponctuels ordre 6 .
127 c . nbte06 . s . 1 . nombre de tetr. des j. ponctuels d'ordre 6 .
128 c . nbjp09 . s . 1 . nombre de joints ponctuels ordre 9 .
129 c . nbpe09 . s . 1 . nombre de pent. des j. ponctuels d'ordre 9 .
130 c . nbjp12 . s . 1 . nombre de joints ponctuels ordre 12 .
131 c . nbhe12 . s . 1 . nombre de hexa. des j. ponctuels d'ordre 12.
132 c . tbaux5 . --- . 4** . Pour la i-eme duplication d'arete : .
133 c . . . . (1,i), (2,i), (3,i), (4,i) .
134 c . . . . numeros ordonnes des joints simples crees .
135 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
136 c . langue . e . 1 . langue des messages .
137 c . . . . 1 : francais, 2 : anglais .
138 c . codret . es . 1 . code de retour des modules .
139 c . . . . 0 : pas de probleme .
140 c ______________________________________________________________________
143 c 0. declarations et dimensionnement
146 c 0.1. ==> generalites
152 parameter ( nompro = 'MMAG13' )
165 integer muarmx, multax, multnx
166 integer nbarmu(muarmx)
168 integer somare(2,nbarto)
170 integer nbduno, nbduar, nbtrtn, nbqutn
172 integer tbau30(8,nbduno), tbau40(6,nbduar)
173 integer tbau31(2,*), tbau41(4,*)
174 integer tbau51(9,*), tbau52(11,*), tbau53(13,*)
175 integer tbaux5(4,nbduar)
177 integer nbtrjt, nbqujq
178 integer nbjoit, nbpejt
179 integer nbjoiq, nbhejq
180 integer nbjp06, nbte06
181 integer nbjp09, nbpe09
182 integer nbjp12, nbhe12
184 integer ulsort, langue, codret
186 c 0.4. ==> variables locales
188 integer iaux, jaux, kaux, laux
190 integer lequad, letria, larete
195 parameter ( nbmess = 40 )
196 character*80 texte(nblang,nbmess)
198 c 0.5. ==> initialisations
199 c ______________________________________________________________________
208 #ifdef _DEBUG_HOMARD_
209 write (ulsort,texte(langue,1)) 'Entree', nompro
216 texte(1,31) = '(''Ordre de multiplicite :'',i2)'
217 texte(1,32) = '(''Nombre estime de '',a,'':'',i6)'
218 texte(1,33) = '(''Nombre reel de '',a,'' :'',i6)'
219 texte(1,34) = '(''Creation du joint :'',i6)'
221 texte(2,31) = '(''Ordre of multiplicity :'',i2)'
222 texte(2,32) = '(''Estimate number of '',a,'':'',i6)'
223 texte(2,33) = '(''Real number of '',a,'' :'',i6)'
224 texte(2,34) = '(''Creation of junction #'',i6)'
226 c 1.2. ==> Constantes
229 #ifdef _DEBUG_HOMARD_
230 write (ulsort,texte(langue,8)) mess14(langue,3,-1), nbduno
231 write (ulsort,texte(langue,8)) mess14(langue,3,1), nbduar
251 cgn write(ulsort,90002) 'tbaux2',4,nbjois
252 cgn do 1101 , kaux = 1,nbjois
253 cgn write(ulsort,90010) (tbaux2(jaux,kaux),jaux=1,4)
255 cgn write(ulsort,90002) 'tbau30',8,nbduno
256 cgn do 1102 , kaux = 1,nbduno
257 cgn write(ulsort,90010) (tbau30(jaux,kaux),jaux=1,8)
259 cgn write(ulsort,90002) 'tbau40',5,nbduar
260 cgn do 1102 , kaux = 1,nbduar
261 cgn write(ulsort,90010) (tbau40(jaux,kaux),jaux=1,6)
263 cgn write(ulsort,90002) 'tbau41',4,5
264 cgn do 1103 , kaux = 1,5
265 cgn write(ulsort,90010) (tbau41(jaux,kaux),jaux=1,4)
269 c 2. Caracterisation des noeuds muliples
271 #ifdef _DEBUG_HOMARD_
272 write (ulsort,*) '2. Caract noeuds multiples ; codret = ', codret
275 if ( codret.eq.0 ) then
277 if ( multnx.ge.6 ) then
279 do 21 , iaux = 1 , nbduno
280 cgn write (ulsort,90002) 'Ordre', tbau30(8,iaux)
282 c 2.1. ==> Les noeuds d'ordre 6
283 c Ils sont a la jonction de 4 joints triples.
284 c Ils formeront un joint ponctuel forme d'un tetraedre.
286 if ( tbau30(8,iaux).eq.6 ) then
288 lenoeu = tbau30(1,iaux)
289 #ifdef _DEBUG_HOMARD_
290 write (ulsort,texte(langue,4)) ' ', mess14(langue,1,-1), lenoeu
292 c On recherche dans les tetraedres deja crees si on en a
293 c un qui est base sur le meme noeud multiple. Si oui,
294 c on ne recommence pas !
296 do 211 , jaux = 1 , nbjp06
298 if ( tbau51(1,jaux).eq.lenoeu ) then
304 c Il faut noter un nouveau joint ponctuel
307 tbau51(1,nbjp06) = lenoeu
313 c 2.2. ==> Les noeuds d'ordre 9
314 c Ils sont a la jonction de 2 joints triples et de 3 joints
316 c Ils formeront un joint ponctuel forme d'un pentaedre.
318 elseif ( tbau30(8,iaux).eq.9 ) then
320 lenoeu = tbau30(1,iaux)
321 #ifdef _DEBUG_HOMARD_
322 write (ulsort,texte(langue,4)) ' ', mess14(langue,1,-1), lenoeu
324 c On recherche dans les pentaedres deja crees si on en a
325 c un qui est base sur le meme noeud multiple. Si oui,
326 c on ne recommence pas !
328 do 221 , jaux = 1 , nbjp09
330 if ( tbau52(1,jaux).eq.lenoeu ) then
336 c Il faut noter un nouveau joint ponctuel
339 tbau52(1,nbjp09) = lenoeu
345 cgn write (ulsort,texte(langue,34)) nbjp09
346 cgn write (ulsort,texte(langue,20))(tbau52(jaux,nbjp09),jaux=1,1)
348 c 2.3. ==> Les noeuds d'ordre 12
349 c Ils sont a la jonction de 6 joints quadruples.
350 c Ils formeront un joint ponctuel forme d'un hexaedre.
352 elseif ( tbau30(8,iaux).eq.12 ) then
354 lenoeu = tbau30(1,iaux)
355 #ifdef _DEBUG_HOMARD_
356 write (ulsort,texte(langue,4)) ' ', mess14(langue,1,-1), lenoeu
358 c On recherche dans les hexaedres deja crees si on en a
359 c un qui est base sur le meme noeud multiple. Si oui,
360 c on ne recommence pas !
362 do 231 , jaux = 1 , nbjp12
364 if ( tbau53(1,jaux).eq.lenoeu ) then
370 c Il faut noter un nouveau joint ponctuel
373 tbau53(1,nbjp12) = lenoeu
374 do 232 , jaux = 2 , 13
375 tbau53(jaux,nbjp12) = 0
377 cgn write (ulsort,texte(langue,34)) nbjp12
378 cgn write (ulsort,texte(langue,20))(tbau53(jaux,nbjp12),jaux=1,1)
390 #ifdef _DEBUG_HOMARD_
391 write (ulsort,texte(langue,21)) 6, nbjp06
392 write (ulsort,texte(langue,21)) 9, nbjp09
393 write (ulsort,texte(langue,21)) 12, nbjp12
399 c 3. Caracterisation des aretes triples
401 #ifdef _DEBUG_HOMARD_
402 write (ulsort,*) '3. Caract aretes triples ; codret = ', codret
405 if ( codret.eq.0 ) then
407 if ( multax.ge.3 ) then
409 do 3 , iaux = 1 , nbduar
411 larete = tbau40(1,iaux)
413 if ( tbau40(5,iaux).eq.3 ) then
415 #ifdef _DEBUG_HOMARD_
416 write (ulsort,texte(langue,4)) ' ', mess14(langue,1,1), larete
419 c 3.1. ==> On recherche dans les pentaedres deja crees si on en a
420 c un qui est base sur la meme arete triple. Si oui,
421 c on ne recommence pas !
423 do 31 , jaux = 1 , nbpejt
425 if ( tbau41(1,jaux).eq.larete ) then
431 c 3.2. ==> On doit donc creer un nouveau pentaedre.
432 c On recherche dans les joints triples deja crees si on
433 c en a un qui est base sur les memes joints simples. Si oui,
434 c on en deduit le numero de joint triple a associer.
436 do 32 , jaux = nbjois+1 , nbjois+nbjoit
438 if ( tbaux5(1,iaux).eq.tbaux2(1,jaux) .and.
439 > tbaux5(2,iaux).eq.tbaux2(2,jaux) .and.
440 > tbaux5(3,iaux).eq.tbaux2(3,jaux) ) then
449 c Il faut creer un nouveau joint
452 nujoin = nbjois + nbjoit
453 tbaux2(1,nujoin) = tbaux5(1,iaux)
454 tbaux2(2,nujoin) = tbaux5(2,iaux)
455 tbaux2(3,nujoin) = tbaux5(3,iaux)
456 cgn write (ulsort,texte(langue,34)) nbjoit
457 cgn write (ulsort,texte(langue,20))(tbaux2(jaux,nujoin),jaux=1,3)
462 c 3.3. ==> Pour ce pentaedre :
463 c 1 : son arete directrice est la courante
464 c 2 : le joint associe
468 tbau41(1,nbpejt) = larete
469 tbau41(2,nbpejt) = nujoin
471 c Creations/Recuperation des 2 triangles associes
475 lenoeu = somare(jaux,larete)
476 #ifdef _DEBUG_HOMARD_
477 write (ulsort,texte(langue,4)) '. ', mess14(langue,1,-1), lenoeu
480 do 331 , kaux = 1 , nbtrjt
481 if ( tbau31(1,kaux).eq.lenoeu .and.
482 > tbau31(2,kaux).eq.nujoin ) then
489 tbau31(1,nbtrjt) = lenoeu
490 tbau31(2,nbtrjt) = nujoin
494 #ifdef _DEBUG_HOMARD_
495 write (ulsort,texte(langue,4)) '. ', mess14(langue,1,2), letria
498 tbau41(2+jaux,nbpejt) = nbtrtn + letria
500 c Reperage des eventuels joints ponctuels
502 do 333 , kaux = 1 , nbjp06
504 if ( tbau51(1,kaux).eq.lenoeu ) then
505 do 3331 , laux = 2 , 5
506 if ( tbau51(laux,kaux).eq.nbtrtn+letria ) then
508 elseif ( tbau51(laux,kaux).eq.0 ) then
509 tbau51(laux,kaux) = nbtrtn+letria
517 do 334 , kaux = 1 , nbjp09
519 if ( tbau52(1,kaux).eq.lenoeu ) then
520 do 3341 , laux = 2 , 3
521 if ( tbau52(laux,kaux).eq.nbtrtn+letria ) then
523 elseif ( tbau52(laux,kaux).eq.0 ) then
524 tbau52(laux,kaux) = nbtrtn+letria
543 c 4. Caracterisation des aretes quadruples
545 #ifdef _DEBUG_HOMARD_
546 write (ulsort,*) '4. Caract aretes quadruples ; codret = ', codret
549 if ( codret.eq.0 ) then
551 if ( multax.ge.4 ) then
553 jdeb = nbjois + nbjoit
556 do 4 , iaux = 1 , nbduar
558 larete = tbau40(1,iaux)
560 if ( tbau40(5,iaux).eq.4 ) then
562 #ifdef _DEBUG_HOMARD_
563 write (ulsort,texte(langue,4)) ' ', mess14(langue,1,1), larete
566 c 4.1. ==> On recherche dans les hexaedres deja crees si on en a
567 c un qui est base sur la meme arete quadruple. Si oui,
568 c on ne recommence pas !
570 do 41 , jaux = 1 , nbhejq
572 if ( tbau41(1,nbpejt+jaux).eq.larete ) then
578 #ifdef _DEBUG_HOMARD_
579 write (ulsort,texte(langue,4)) ' ', mess14(langue,1,1), larete
582 c 4.2. ==> On doit donc creer un nouvel hexaedre.
583 c On recherche dans les joints quadruples deja crees si on
584 c en a un qui est base sur les memes joints simples. Si oui,
585 c on en deduit le numero de joint quadruple a associer.
587 do 42 , jaux = jdeb+1 , jdeb+nbjoiq
589 if ( tbaux5(1,iaux).eq.tbaux2(1,jaux) .and.
590 > tbaux5(2,iaux).eq.tbaux2(2,jaux) .and.
591 > tbaux5(3,iaux).eq.tbaux2(3,jaux) .and.
592 > tbaux5(4,iaux).eq.tbaux2(4,jaux) ) then
601 c Il faut creer un nouveau joint
604 nujoin = jdeb + nbjoiq
605 tbaux2(1,nujoin) = tbaux5(1,iaux)
606 tbaux2(2,nujoin) = tbaux5(2,iaux)
607 tbaux2(3,nujoin) = tbaux5(3,iaux)
608 tbaux2(4,nujoin) = tbaux5(4,iaux)
609 cgn write (ulsort,texte(langue,34)) nbjoiq
610 cgn write (ulsort,texte(langue,20))(tbaux2(jaux,nujoin),jaux=1,4)
614 c 4.3. ==> Pour cet hexaedre :
615 c 1 : son arete directrice est la courante
616 c 2 : le joint associe
620 tbau41(1,nbpejt+nbhejq) = larete
621 tbau41(2,nbpejt+nbhejq) = nujoin
623 c Creations/Recuperation des 2 quadrangles associes
627 lenoeu = somare(jaux,larete)
629 do 431 , kaux = kdeb+1 , kdeb+nbqujq
630 if ( tbau31(1,kaux).eq.lenoeu .and.
631 > tbau31(2,kaux).eq.nujoin ) then
638 tbau31(1,kdeb+nbqujq) = lenoeu
639 tbau31(2,kdeb+nbqujq) = nujoin
643 #ifdef _DEBUG_HOMARD_
644 write (ulsort,texte(langue,4)) '. ', mess14(langue,1,4), lequad
645 write (ulsort,*) 'nbqujq =', nbqujq,', kaux =',kdeb+nbqujq
648 tbau41(2+jaux,nbpejt+nbhejq) = nbqutn + lequad
650 c Reperage des eventuels joints ponctuels
652 do 433 , kaux = 1 , nbjp09
654 if ( tbau52(1,kaux).eq.lenoeu ) then
655 do 4331 , laux = 4 , 6
656 if ( tbau52(laux,kaux).eq.nbqutn+lequad ) then
658 elseif ( tbau52(laux,kaux).eq.0 ) then
659 tbau52(laux,kaux) = nbqutn+lequad
667 c Reperage des eventuels joints ponctuels
669 do 434 , kaux = 1 , nbjp12
671 if ( tbau53(1,kaux).eq.lenoeu ) then
672 do 4341 , laux = 2 , 7
673 if ( tbau53(laux,kaux).eq.0 ) then
674 tbau53(laux,kaux) = nbqutn+lequad
695 #ifdef _DEBUG_HOMARD_
696 write (ulsort,*) '5. Controle ; codret = ', codret
699 if ( codret.eq.0 ) then
701 if ( nbpejt.ne.nbarmu(3) ) then
702 write (ulsort,texte(langue,31)) 3
703 write (ulsort,texte(langue,32)) mess14(langue,3,1), nbarmu(3)
704 write (ulsort,texte(langue,33)) mess14(langue,3,1), nbpejt
708 if ( nbhejq.ne.nbarmu(4) ) then
709 write (ulsort,texte(langue,31)) 4
710 write (ulsort,texte(langue,32)) mess14(langue,3,1), nbarmu(4)
711 write (ulsort,texte(langue,33)) mess14(langue,3,1), nbhejq
712 codret = codret*100 + 52
717 cgn write(ulsort,4001) 'tbaux2',4,nbjois+nbjoit+nbjoiq
718 cgn do 4101 , kaux = 1,nbjois+nbjoit+nbjoiq
719 cgn write(ulsort,4000) (tbaux2(jaux,kaux),jaux=1,4)
721 cgn write(ulsort,4001) 'tbau41',4,nbpejt+nbhejq
722 cgn do 4102 , kaux = 1,nbpejt+nbhejq
723 cgn write(ulsort,4000) (tbau41(jaux,kaux),jaux=1,4)
730 if ( codret.ne.0 ) then
734 write (ulsort,texte(langue,1)) 'Sortie', nompro
735 write (ulsort,texte(langue,2)) codret
739 #ifdef _DEBUG_HOMARD_
740 write (ulsort,texte(langue,1)) 'Sortie', nompro