1 subroutine mmag36 ( indhex, nbfhe0,
6 > hethex, filhex, perhex,
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 Modification de Maillage - AGRegat - phase 3.6
31 c Creation des mailles pour les joints ponctuels :
33 c ______________________________________________________________________
35 c . nom . e/s . taille . description .
36 c .____________________________________________________________________.
37 c . indhex . es . 1 . indice du dernier hexaedre cree .
38 c . nbfhe0 . e . 1 . nombre de familles de hexaedres creees .
39 c . nbhe12 . e . 1 . nombre de hexa. des j. ponctuels d'ordre 12.
40 c . tbau53 . e . 13* . Les hexaedres ponctuels entre les joints .
41 c . . . nbhe12 . quadruples (ordre 12) : .
42 c . . . . (1,i) : noeud multiple .
43 c . . . . (2,i) : quadrangle cote du 1er joint quad. .
44 c . . . . (3,i) : quadrangle cote du 2eme joint quad..
45 c . . . . (4,i) : quadrangle cote du 3eme joint quad..
46 c . . . . (5,i) : quadrangle cote du 4eme joint quad..
47 c . . . . (6,i) : quadrangle cote du 5eme joint quad..
48 c . . . . (7,i) : quadrangle cote du 6eme joint quad..
49 c . . . . (1+k) : pour le k-eme quadrangle, 1 s'il .
50 c . . . . entre dans le joint ponctuel, -1 sinon .
51 c . arequa . e .nbquto*4. numeros des 4 aretes des quadrangles .
52 c . quahex . es .nbhecf*6. numeros des faces des hexaedres .
53 c . coquhe . es .nbhecf*6. codes des faces des hexaedres .
54 c . hethex . es . nbheto . historique de l'etat des hexaedres .
55 c . filhex . es . nbheto . premier fils des hexaedres .
56 c . perhex . es . nbheto . pere des hexaedres .
57 c . famhex . es . nbheto . famille des hexaedres .
58 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
59 c . langue . e . 1 . langue des messages .
60 c . . . . 1 : francais, 2 : anglais .
61 c . codret . es . 1 . code de retour des modules .
62 c . . . . 0 : pas de probleme .
63 c ______________________________________________________________________
66 c 0. declarations et dimensionnement
69 c 0.1. ==> generalites
75 parameter ( nompro = 'MMAG36' )
92 integer indhex, nbfhe0
94 integer tbau53(13,nbhe12)
95 integer arequa(nbquto,4)
96 integer quahex(nbhecf,6), coquhe(nbhecf,6)
97 integer hethex(nbheto), filhex(nbheto), perhex(nbheto)
98 integer famhex(nbheto)
100 integer ulsort, langue, codret
102 c 0.4. ==> variables locales
104 integer iaux, jaux, kaux, laux
106 integer nulofa(6), nuloar(6,4), orient(6)
107 integer arehex(12), lequad(6)
110 parameter ( nbmess = 40 )
111 character*80 texte(nblang,nbmess)
113 c 0.5. ==> initialisations
114 c ______________________________________________________________________
123 #ifdef _DEBUG_HOMARD_
124 write (ulsort,texte(langue,1)) 'Entree', nompro
132 #ifdef _DEBUG_HOMARD_
133 write (ulsort,texte(langue,7))
134 > mess14(langue,3,6)//'d''ordre 12', nbhe12
139 cgn write(ulsort,90002) 'nbnoto, nbarto, nbtrto',nbnoto, nbarto,nbtrto
140 cgn write(ulsort,90002) 'nbhe12',nbhe12
141 cgn write(ulsort,90015) (iaux,iaux=1,20)
142 cgn write(ulsort,90002) 'tbaux2',4,nbjoto
143 cgn do 1101 , kaux = 1,nbjoto
144 cgn write(ulsort,90015) (tbaux2(jaux,kaux),jaux=1,4)
146 cgn write(ulsort,90002) 'tbau53',7,nbhe12
147 cgn do 1102 , kaux = 1,nbhe12
148 cgn write(ulsort,90015) (tbau53(jaux,kaux),jaux=1,7)
152 c 2. Parcours des hexaedres de joint ponctuel d'ordre 12
154 #ifdef _DEBUG_HOMARD_
155 write (ulsort,texte(langue,5)) mess14(langue,3,6)
159 c ----------------------------
168 c S2----------------------------- S1 .
171 c . S8 -------------------.--------.S7
180 c -----------------------------
183 c . Les noeuds (1,2,3,4) definissent un quadrangle a orientation
185 c Avec le code 1, les faces sont :
186 c Face 1 : aretes 1, 2, 4, 3
187 c Face 2 : aretes 1, 6, 9, 5
188 c Face 3 : aretes 2, 5, 10, 7
189 c Face 4 : aretes 3, 8, 11, 6
190 c Face 5 : aretes 4, 7, 12, 8
191 c Face 6 : aretes 9, 11, 12, 10
193 c voir utarhe pour le croquis ci-dessus
195 do 2 , iaux = 1 , nbhe12
199 c 2.1 ==> Recuperation des quadrangles et de leur orientation
202 lequad(jaux) = tbau53(jaux+1,iaux)
203 orient(jaux) = tbau53(jaux+7,iaux)
204 cgn write (ulsort,90015) 'quadrangle', lequad(jaux),
205 cgn > ', d''orientation', orient(jaux)
206 cgn write (ulsort,90002) 'aretes ',
207 cgn > (arequa(lequad(jaux),kaux),kaux=1,4)
210 #ifdef _DEBUG_HOMARD_
212 write (ulsort,texte(langue,4)) ' ',
213 > mess14(langue,1,1), tbau53(1,iaux)
216 #ifdef _DEBUG_HOMARD_
217 write (ulsort,texte(langue,16)) mess14(langue,1,6), indhex, 0
220 c 2.2 ==> Positionnement des quadrangles en tant que face
221 c nulofa(i) = numero local dans lequad du quadrangle
222 c qui correspond a la face Fi
223 c nuloar(i,j) = pour la face Fi, numero local de sa i-eme arete
224 c dans la description de la face
225 c 2.2.1. ==> La face F1 est le 1er quadrangle enregistre.
227 c la 1ere arete de l'hexaedre est la 1ere arete du quadrangle ;
228 c --> le code sera donc 1 ou 5.
229 c Si l'orientation est positive, le quadrangle entre dans l'hexaedre.
230 c On lui donnera donc le code 1.
231 C Inversement, si l'orientation est negative, il va sortir
232 c de l'hexaedre. On lui donnera alors le code 5.
234 quahex(indhex,1) = lequad(1)
235 if ( orient(1).gt.0 ) then
241 c Reperage des aretes de cette face
243 arehex(1) = arequa(lequad(1),1)
244 if ( orient(1).gt.0 ) then
245 arehex(2) = arequa(lequad(1),2)
246 arehex(3) = arequa(lequad(1),4)
248 arehex(2) = arequa(lequad(1),4)
249 arehex(3) = arequa(lequad(1),2)
251 arehex(4) = arequa(lequad(1),3)
252 #ifdef _DEBUG_HOMARD_
253 if ( indhex.lt.0 ) then
254 write (ulsort,90015) 'quadrangle pour F1', lequad(1),
255 > ', d''orientation', orient(1)
256 write (ulsort,90002) 'aretes de hex 1-4',(arehex(jaux),jaux=1,4)
260 c 2.2.2. ==> La face F2 est le quadrangle qui contient l'arete 1
261 c C'est son arete numero 1
262 #ifdef _DEBUG_HOMARD_
263 if ( indhex.lt.0 ) then
264 write (ulsort,90002) 'F2 bati sur arete 1',arehex(1)
268 do 222 , jaux = 2 , 6
269 if ( arehex(1).eq.arequa(lequad(jaux),1) ) then
273 elseif ( arehex(1).eq.arequa(lequad(jaux),2) ) then
277 elseif ( arehex(1).eq.arequa(lequad(jaux),3) ) then
281 elseif ( arehex(1).eq.arequa(lequad(jaux),4) ) then
291 #ifdef _DEBUG_HOMARD_
292 if ( indhex.lt.0 ) then
293 write (ulsort,90002) 'quadrangle pour F2', lequad(nulofa(2))
294 write (ulsort,90002) 'aretes',
295 > (arequa(lequad(nulofa(2)),jaux),jaux=1,4)
299 c 2.2.3. ==> La face F3 est le quadrangle qui contient l'arete 2
300 c C'est son arete numero 1
301 #ifdef _DEBUG_HOMARD_
302 if ( indhex.lt.0 ) then
303 write (ulsort,90002) 'F3 bati sur arete 2',arehex(2)
307 do 223 , jaux = 2 , 6
308 if ( arehex(2).eq.arequa(lequad(jaux),1) ) then
312 elseif ( arehex(2).eq.arequa(lequad(jaux),2) ) then
316 elseif ( arehex(2).eq.arequa(lequad(jaux),3) ) then
320 elseif ( arehex(2).eq.arequa(lequad(jaux),4) ) then
330 #ifdef _DEBUG_HOMARD_
331 if ( indhex.lt.0 ) then
332 write (ulsort,90002) 'quadrangle pour F3', lequad(nulofa(3))
333 write (ulsort,90002) 'aretes',
334 > (arequa(lequad(nulofa(3)),jaux),jaux=1,4)
338 c 2.2.4. ==> La face F4 est le quadrangle qui contient l'arete 3
339 c C'est son arete numero 1
340 #ifdef _DEBUG_HOMARD_
341 if ( indhex.lt.0 ) then
342 write (ulsort,90002) 'F4 bati sur arete 3',arehex(3)
346 do 224 , jaux = 2 , 6
347 if ( arehex(3).eq.arequa(lequad(jaux),1) ) then
351 elseif ( arehex(3).eq.arequa(lequad(jaux),2) ) then
355 elseif ( arehex(3).eq.arequa(lequad(jaux),3) ) then
359 elseif ( arehex(3).eq.arequa(lequad(jaux),4) ) then
369 #ifdef _DEBUG_HOMARD_
370 if ( indhex.lt.0 ) then
371 write (ulsort,90002) 'quadrangle pour F4', lequad(nulofa(4))
372 write (ulsort,90002) 'aretes',
373 > (arequa(lequad(nulofa(4)),jaux),jaux=1,4)
377 c 2.2.5. ==> La face F5 est le quadrangle qui contient l'arete 4
378 c C'est son arete numero 1
379 #ifdef _DEBUG_HOMARD_
380 if ( indhex.lt.0 ) then
381 write (ulsort,90002) 'F5 bati sur arete 4',arehex(4)
385 do 225 , jaux = 2 , 6
386 if ( arehex(4).eq.arequa(lequad(jaux),1) ) then
390 elseif ( arehex(4).eq.arequa(lequad(jaux),2) ) then
394 elseif ( arehex(4).eq.arequa(lequad(jaux),3) ) then
398 elseif ( arehex(4).eq.arequa(lequad(jaux),4) ) then
408 #ifdef _DEBUG_HOMARD_
409 if ( indhex.lt.0 ) then
410 write (ulsort,90002) 'quadrangle pour F5', lequad(nulofa(5))
411 write (ulsort,90002) 'aretes',
412 > (arequa(lequad(nulofa(5)),jaux),jaux=1,4)
416 c 2.3. ==> Recherche des aretes 5, 6, 7, 8, 9, 10, 11 et 12
417 c 2.3.1. ==> Recherche de l'arete 5, commune aux faces F2 et F3
419 do 231 , jaux = 1 , 4
420 laux = arequa(lequad(nulofa(2)),jaux)
421 do 2311 , kaux = 1, 4
422 if ( laux.eq.arequa(lequad(nulofa(3)),kaux) ) then
435 c 2.3.2. ==> Recherche de l'arete 6, commune aux faces F4 et F2
437 do 232 , jaux = 1 , 4
438 laux = arequa(lequad(nulofa(4)),jaux)
439 do 2321 , kaux = 1, 4
440 if ( laux.eq.arequa(lequad(nulofa(2)),kaux) ) then
453 c 2.3.3. ==> Recherche de l'arete 7, commune aux faces F3 et F5
455 do 233 , jaux = 1 , 4
456 laux = arequa(lequad(nulofa(3)),jaux)
457 do 2331 , kaux = 1, 4
458 if ( laux.eq.arequa(lequad(nulofa(5)),kaux) ) then
471 c 2.3.4. ==> Recherche de l'arete 8, commune aux faces F5 et F4
473 do 234 , jaux = 1 , 4
474 laux = arequa(lequad(nulofa(5)),jaux)
475 do 2341 , kaux = 1, 4
476 if ( laux.eq.arequa(lequad(nulofa(4)),kaux) ) then
488 #ifdef _DEBUG_HOMARD_
489 if ( indhex.lt.0 ) then
490 write (ulsort,90002) 'aretes de hex 5-8',(arehex(jaux),jaux=5,8)
494 c 2.4. ==> Recherche des aretes 9, 10, 11, 12
496 nuloar(2,3) = fp1234(nuloar(2,1),nuloar(2,2),nuloar(2,4))
497 arehex(9) = arequa(lequad(nulofa(2)),nuloar(2,3))
499 nuloar(3,3) = fp1234(nuloar(3,1),nuloar(3,2),nuloar(3,4))
500 arehex(10) = arequa(lequad(nulofa(3)),nuloar(3,3))
502 nuloar(4,3) = fp1234(nuloar(4,1),nuloar(4,2),nuloar(4,4))
503 arehex(11) = arequa(lequad(nulofa(4)),nuloar(4,3))
505 nuloar(5,3) = fp1234(nuloar(5,1),nuloar(5,2),nuloar(5,4))
506 arehex(12) = arequa(lequad(nulofa(5)),nuloar(5,3))
507 #ifdef _DEBUG_HOMARD_
508 if ( indhex.lt.0 ) then
509 write (ulsort,90002) 'aretes de hex 9-12',(arehex(jaux),jaux=9,12)
513 c 2.5.==> Mise en place de la face 2
515 quahex(indhex,2) = lequad(nulofa(2))
518 if ( j1(jaux).eq.nuloar(2,1) .and.
519 > j2(jaux).eq.nuloar(2,2) .and.
520 > j3(jaux).eq.nuloar(2,3) .and.
521 > j4(jaux).eq.nuloar(2,4) ) then
522 coquhe(indhex,2) = jaux
530 c 2.6.==> Mise en place de la face 3
532 quahex(indhex,3) = lequad(nulofa(3))
535 if ( j1(jaux).eq.nuloar(3,1) .and.
536 > j2(jaux).eq.nuloar(3,2) .and.
537 > j3(jaux).eq.nuloar(3,3) .and.
538 > j4(jaux).eq.nuloar(3,4) ) then
539 coquhe(indhex,3) = jaux
547 c 2.7.==> Mise en place de la face 4
549 quahex(indhex,4) = lequad(nulofa(4))
552 if ( j1(jaux).eq.nuloar(4,1) .and.
553 > j2(jaux).eq.nuloar(4,2) .and.
554 > j3(jaux).eq.nuloar(4,3) .and.
555 > j4(jaux).eq.nuloar(4,4) ) then
556 coquhe(indhex,4) = jaux
564 c 2.8.==> Mise en place de la face 5
566 quahex(indhex,5) = lequad(nulofa(5))
569 if ( j1(jaux).eq.nuloar(5,1) .and.
570 > j2(jaux).eq.nuloar(5,2) .and.
571 > j3(jaux).eq.nuloar(5,3) .and.
572 > j4(jaux).eq.nuloar(5,4) ) then
573 coquhe(indhex,5) = jaux
581 c 2.9.==> Mise en place de la face 6 : le dernier des quadrangles
583 nulofa(6) = fp1aa6( 1, nulofa(2), nulofa(3),
584 > nulofa(4), nulofa(5))
586 do 291 , jaux = 1 , 4
587 if ( arequa(lequad(nulofa(6)),jaux).eq.arehex(9) ) then
589 elseif ( arequa(lequad(nulofa(6)),jaux).eq.arehex(11) ) then
591 elseif ( arequa(lequad(nulofa(6)),jaux).eq.arehex(12) ) then
593 elseif ( arequa(lequad(nulofa(6)),jaux).eq.arehex(10) ) then
601 quahex(indhex,6) = lequad(nulofa(6))
603 do 292 , jaux = 1 , 8
604 if ( j1(jaux).eq.nuloar(6,1) .and.
605 > j2(jaux).eq.nuloar(6,2) .and.
606 > j3(jaux).eq.nuloar(6,3) .and.
607 > j4(jaux).eq.nuloar(6,4) ) then
608 coquhe(indhex,6) = jaux
616 c 2.10.==> Caracteristiques
617 c iaux est le numero du joint ponctuel.
618 c On decale pour tenir compte des familles HOMARD precedentes
620 famhex(indhex) = nbfhe0 + iaux
626 #ifdef _DEBUG_HOMARD_
627 if ( indhex.eq.-1 ) then
628 write (ulsort,texte(langue,16)) mess14(langue,1,7), indhex, 0
629 write (ulsort,90002)'faces ',(quahex(indhex,jaux),jaux=1,6)
630 write (ulsort,90002)'coquhe',(coquhe(indhex,jaux),jaux=1,6)
631 write (ulsort,90002)'aretes 1-4 ',(arehex(jaux),jaux=1,4)
632 write (ulsort,90002)'aretes 5-8 ',(arehex(jaux),jaux=5,8)
633 write (ulsort,90002)'aretes 9-12',(arehex(jaux),jaux=9,12)
645 if ( codret.ne.0 ) then
649 write (ulsort,texte(langue,1)) 'Sortie', nompro
650 write (ulsort,texte(langue,2)) codret
654 #ifdef _DEBUG_HOMARD_
655 write (ulsort,texte(langue,1)) 'Sortie', nompro