Salome HOME
Homard executable
[modules/homard.git] / src / tool / Creation_Maillage / cmch24.F
1       subroutine cmch24 ( lehexa, listar, listso,
2      >                    indnoe, indare, indtri, indtet, indpyr,
3      >                    indptp,
4      >                    coonoe, hetnoe, arenoe,
5      >                    famnoe,
6      >                    hetare, somare,
7      >                    filare, merare, famare,
8      >                    hettri, aretri,
9      >                    filtri, pertri, famtri,
10      >                    nivtri,
11      >                    filqua,
12      >                    hettet, tritet, cotrte,
13      >                    filtet, pertet, famtet,
14      >                    hetpyr, facpyr, cofapy,
15      >                    filpyr, perpyr, fampyr,
16      >                    quahex, coquhe,
17      >                    famhex, cfahex,
18      >                    ulsort, langue, codret )
19 c ______________________________________________________________________
20 c
21 c                             H O M A R D
22 c
23 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
24 c
25 c Version originale enregistree le 18 juin 1996 sous le numero 96036
26 c aupres des huissiers de justice Simart et Lavoir a Clamart
27 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
28 c aupres des huissiers de justice
29 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
30 c
31 c    HOMARD est une marque deposee d'Electricite de France
32 c
33 c Copyright EDF 1996
34 c Copyright EDF 1998
35 c Copyright EDF 2002
36 c Copyright EDF 2020
37 c ______________________________________________________________________
38 c
39 c    Creation du Maillage - Conformite - decoupage des Hexaedres
40 c    -           -          -                          -
41 c                         - par 2 Aretes - etat 24
42 c                                               --
43 c    Decoupage par les aretes 8 et 10
44 c    Serie B
45 c ______________________________________________________________________
46 c .        .     .        .                                            .
47 c .  nom   . e/s . taille .           description                      .
48 c .____________________________________________________________________.
49 c . lehexa . e   .   1    . hexaedre a decouper                        .
50 c . listar . e   .   12   . liste des aretes de l'hexaedre a decouper  .
51 c . listso . e   .    8   . liste des sommets de l'hexaedre a decouper .
52 c . indnoe . es  .   1    . indice du dernier noeud cree               .
53 c . indare . es  .   1    . indice de la derniere arete creee          .
54 c . indtri . es  .   1    . indice du dernier triangle cree            .
55 c . indtet . es  .   1    . indice du dernier tetraedre cree           .
56 c . indpyr . es  .   1    . indice de la derniere pyramide creee       .
57 c . indptp . e   .   1    . indice du dernier pere enregistre          .
58 c . coonoe . es  .nouvno*3. coordonnees des noeuds                     .
59 c . hetnoe . es  . nouvno . historique de l'etat des noeuds            .
60 c . arenoe . es  . nouvno . arete liee a un nouveau noeud              .
61 c . famnoe . es  . nouvno . famille des noeuds                         .
62 c . hetare . es  . nouvar . historique de l'etat des aretes            .
63 c . somare . es  .2*nouvar. numeros des extremites d'arete             .
64 c . filare . es  . nouvar . premiere fille des aretes                  .
65 c . merare . es  . nouvar . mere des aretes                            .
66 c . famare .     . nouvar . famille des aretes                         .
67 c . hettri . es  . nouvtr . historique de l'etat des triangles         .
68 c . aretri . es  .nouvtr*3. numeros des 3 aretes des triangles         .
69 c . filtri . es  . nouvtr . premier fils des triangles                 .
70 c . pertri . es  . nouvtr . pere des triangles                         .
71 c . famtri . es  . nouvtr . famille des triangles                      .
72 c . nivtri . es  . nouvtr . niveau des triangles                       .
73 c . filqua . e   . nouvqu . premier fils des quadrangles               .
74 c . hettet . es  . nouvte . historique de l'etat des tetraedres        .
75 c . tritet . es  .nouvtf*4. numeros des 4 triangles des tetraedres     .
76 c . cotrte . es  .nouvtf*4. code des 4 triangles des tetraedres        .
77 c . filtet . es  . nouvte . premier fils des tetraedres                .
78 c . pertet . es  . nouvte . pere des tetraedres                        .
79 c .        .     .        . si pertet(i) > 0 : numero du tetraedre     .
80 c .        .     .        . si pertet(i) < 0 : -numero dans pthepe     .
81 c . famtet . es  . nouvte . famille des tetraedres                     .
82 c . hetpyr . es  . nouvpy . historique de l'etat des pyramides         .
83 c . facpyr . es  .nouvyf*5. numeros des 5 faces des pyramides          .
84 c . cofapy . es  .nouvyf*5. codes des faces des pyramides              .
85 c . filpyr . es  . nouvpy . premier fils des pyramides                 .
86 c . perpyr . es  . nouvpy . pere des pyramides                         .
87 c .        .     .        . si perpyr(i) > 0 : numero de la pyramide   .
88 c .        .     .        . si perpyr(i) < 0 : -numero dans pphepe     .
89 c . fampyr . es  . nouvpy . famille des pyramides                      .
90 c . quahex . e   .nouvhf*6. numeros des 6 quadrangles des hexaedres    .
91 c . coquhe . e   .nouvhf*6. codes des 6 quadrangles des hexaedres      .
92 c . famhex . e   . nouvhe . famille des hexaedres                      .
93 c . cfahex .     . nctfhe. codes des familles des hexaedres            .
94 c .        .     . nbfhex .   1 : famille MED                          .
95 c .        .     .        .   2 : type d'hexaedres                     .
96 c .        .     .        .   3 : famille des tetraedres de conformite .
97 c .        .     .        .   4 : famille des pyramides de conformite  .
98 c . ulsort . e   .   1    . unite logique de la sortie generale        .
99 c . langue . e   .    1   . langue des messages                        .
100 c .        .     .        . 1 : francais, 2 : anglais                  .
101 c . codret . es  .    1   . code de retour des modules                 .
102 c .        .     .        . 0 : pas de probleme                        .
103 c .        .     .        . 1 : aucune arete ne correspond             .
104 c ______________________________________________________________________
105 c
106 c====
107 c 0. declarations et dimensionnement
108 c====
109 c
110 c 0.1. ==> generalites
111 c
112       implicit none
113       save
114 c
115       character*6 nompro
116       parameter ( nompro = 'CMCH24' )
117 c
118 #include "nblang.h"
119 c
120 c 0.2. ==> communs
121 c
122 #include "envex1.h"
123 c
124 #include "envca1.h"
125 #include "dicfen.h"
126 #include "nbfami.h"
127 #include "nouvnb.h"
128 #include "cofpfh.h"
129 c
130 c 0.3. ==> arguments
131 c
132       integer lehexa
133       integer listar(12), listso(8)
134       integer indnoe, indare, indtri, indtet, indpyr
135       integer indptp
136       integer hetnoe(nouvno), arenoe(nouvno)
137       integer famnoe(nouvno)
138       integer hetare(nouvar), somare(2,nouvar)
139       integer filare(nouvar), merare(nouvar), famare(nouvar)
140       integer hettri(nouvtr), aretri(nouvtr,3)
141       integer filtri(nouvtr), pertri(nouvtr), famtri(nouvtr)
142       integer nivtri(nouvtr)
143       integer filqua(nouvqu)
144       integer hettet(nouvte), tritet(nouvtf,4), cotrte(nouvtf,4)
145       integer filtet(nouvte), pertet(nouvte), famtet(nouvte)
146       integer hetpyr(nouvpy), facpyr(nouvyf,5), cofapy(nouvyf,5)
147       integer filpyr(nouvpy), perpyr(nouvpy), fampyr(nouvpy)
148       integer quahex(nouvhf,6), coquhe(nouvhf,6)
149       integer famhex(nouvhe), cfahex(nctfhe,nbfhex)
150 c
151       double precision coonoe(nouvno,sdim)
152 c
153       integer ulsort, langue, codret
154 c
155 c 0.4. ==> variables locales
156 c
157       integer nbsomm
158       parameter ( nbsomm = 8 )
159 c
160       integer iaux, jaux
161       integer laface, codfac
162       integer lesnoe(10), lesare(10)
163       integer tab1(2)
164       integer nulofa(4)
165       integer areint(10)
166       integer areqtr(4,2)
167       integer triint(22)
168       integer trifad(4,0:2), cotrvo(4,0:2)
169       integer niveau
170 c
171       integer nbmess
172       parameter ( nbmess = 10 )
173       character*80 texte(nblang,nbmess)
174 c
175 c 0.5. ==> initialisations
176 c ______________________________________________________________________
177 c
178 c====
179 c 1. initialisations
180 c====
181 c
182 #include "impr01.h"
183 c
184 #ifdef _DEBUG_HOMARD_
185       write (ulsort,texte(langue,1)) 'Entree', nompro
186       call dmflsh (iaux)
187 #endif
188 c
189       codret = 0
190 c
191 c====
192 c 2. grandeurs dependant du cas traite
193 c      lesnoe(1) = S4
194 c      lesnoe(2) = S3
195 c      lesnoe(3) = S2
196 c      lesnoe(4) = S1
197 c      lesnoe(5) = S7
198 c      lesnoe(6) = S8
199 c      lesnoe(7) = S5
200 c      lesnoe(8) = S6
201 c      lesnoe( 9) = N5
202 c      lesnoe(10) = N11
203 c====
204 c     lesnoe(i) = sommet a joindre au centre de l'hexaedre pour
205 c                 definir la ieme arete interne
206       lesnoe(1) = listso(2)
207       lesnoe(2) = listso(1)
208       lesnoe(3) = listso(4)
209       lesnoe(4) = listso(3)
210       lesnoe(5) = listso(5)
211       lesnoe(6) = listso(6)
212       lesnoe(7) = listso(7)
213       lesnoe(8) = listso(8)
214 c
215 c     iaux = numero local de la 1ere arete coupee : celle qui partage un
216 c            sommet avec la 1ere pyramide
217       iaux = 8
218 c
219 c     lesnoe(9) = noeud milieu de la 1ere arete coupee
220       lesnoe(9) = somare(2,filare(listar(iaux)))
221 c
222 c     iaux = numero local de la 2eme arete coupee : celle qui partage un
223 c            sommet avec la 2nde pyramide
224       iaux = 10
225 c
226 c     lesnoe(10) = noeud milieu de la 2eme arete coupee
227       lesnoe(10) = somare(2,filare(listar(iaux)))
228 c
229 #ifdef _DEBUG_HOMARD_
230       write(ulsort,*) 'listso = ', listso
231       write(ulsort,*) 'arete 1 = ', listar(8)
232       write(ulsort,*) 'lesnoe(9) = ', lesnoe(9)
233       write(ulsort,*) 'arete 2 = ', listar(10)
234       write(ulsort,*) 'lesnoe(10) = ', lesnoe(10)
235       write(ulsort,*) 'lesnoe(1) = ', lesnoe(1),
236      >                ', lesnoe(2) = ', lesnoe(2)
237       write(ulsort,*) 'lesnoe(3) = ', lesnoe(3),
238      >                ', lesnoe(4) = ', lesnoe(4)
239       write(ulsort,*) 'lesnoe(5) = ', lesnoe(5),
240      >                ', lesnoe(6) = ', lesnoe(6)
241       write(ulsort,*) 'lesnoe(7) = ', lesnoe(7),
242      >                ', lesnoe(8) = ', lesnoe(8)
243 #endif
244 c
245 c  Triangles et aretes tracees sur les faces coupees en 3
246 c            La premiere pyramide s'appuie sur celle des 2 faces de
247 c            l'hexaedre qui est non decoupee et de plus petit numero
248 c            local. Le positionnement de la pyramide a defini une
249 c            orientation de sa face quadrangulaire.
250 c            On traite les faces de l'hexaedre coupees en 3 comme suit :
251 c            . la 1ere et la 2eme partagent la 1ere arete coupee
252 c            . la 3eme et la 4eme partagent la 2nde arete coupee
253 c            Le choix de la 1ere est tel que l'ordre 1/2 corresponde a
254 c            l'orientation de la pyramide numero 1.
255 c            Le choix de la 3eme est tel que l'ordre 3/4 corresponde a
256 c            l'orientation de la pyramide numero 2.
257 c     trifad(p,0) : triangle central de ce decoupage
258 c     trifad(p,1) : triangle ayant une arete commune a une pyramide
259 c     trifad(p,2) : triangle sans arete commune avec une pyramide
260 c     cotrvo(p,0/1/2) : futur code du triangle trifad(p,0/1/2) dans la
261 c                       description du tetraedre voisin
262 c     areqtr(p,1) : arete interne au quadrangle de bord et bordant le
263 c                   triangle trifad(p,1)
264 c     areqtr(p,2) : arete interne au quadrangle de bord et bordant le
265 c                   triangle trifad(p,2)
266 c
267 c     trifad(1,0) = triangle central de la face 1 : FF5
268 c     trifad(1,1) = triangle de la face 1 du cote de PYR1 : FF5 + 1/2
269 c     trifad(1,2) = triangle de la face 1 de l'autre cote : FF5 + 2/1
270 c     areqtr(1,1) : AS4N8
271 c     areqtr(1,2) : AS7N8
272 c
273 c     trifad(2,0) = triangle central de la face 2 : FF4
274 c     trifad(2,1) = triangle de la face 2 du cote de PYR1 : FF4 + 2/1
275 c     trifad(2,2) = triangle de la face 2 de l'autre cote : FF4 + 1/2
276 c     areqtr(2,1) : AS2N8
277 c     areqtr(2,2) : AS5N8
278 c
279 c     trifad(3,0) = triangle central de la face 3 : FF6
280 c     trifad(3,1) = triangle de la face 3 du cote de PYR2 : FF6 + 1/2
281 c     trifad(3,2) = triangle de la face 3 de l'autre cote : FF6 + 2/1
282 c     areqtr(3,1) : AS5N10
283 c     areqtr(3,2) : AS8N10
284 c
285 c     trifad(4,0) = triangle central de la face 4 : FF3
286 c     trifad(4,1) = triangle de la face 4 du cote de PYR2 : FF3 + 2/1
287 c     trifad(4,2) = triangle de la face 4 de l'autre cote : FF3 + 1/2
288 c     areqtr(4,1) : AS1N10
289 c     areqtr(4,2) : AS4N10
290 c
291       nulofa(1) = 5
292       nulofa(2) = 4
293       nulofa(3) = 6
294       nulofa(4) = 3
295 c
296       if ( codret.eq.0 ) then
297 c
298 #ifdef _DEBUG_HOMARD_
299       write (ulsort,texte(langue,3)) 'CMCHAA', nompro
300 #endif
301       call cmchaa ( nulofa, lehexa,
302      >              somare,
303      >              aretri, nivtri,
304      >              filqua,
305      >              quahex, coquhe,
306      >              niveau, areqtr,
307      >              trifad, cotrvo,
308      >              ulsort, langue, codret )
309 c
310       endif
311 c
312 c====
313 c 3. Creation du noeud interne et des dix aretes internes
314 c    noecen : N0
315 c    areint( 1) : AS2N0
316 c    areint( 2) : AS1N0
317 c    areint( 3) : AS4N0
318 c    areint( 4) : AS3N0
319 c    areint( 5) : AS5N0
320 c    areint( 6) : AS6N0
321 c    areint( 7) : AS7N0
322 c    areint( 8) : AS8N0
323 c    areint( 9) : AN8N0
324 c    areint(10) : AN10N0
325 c====
326 c
327       if ( codret.eq.0 ) then
328 c
329 #ifdef _DEBUG_HOMARD_
330       write (ulsort,texte(langue,3)) 'CMCHAB', nompro
331       write (ulsort,*) '.. noeud ', indnoe+1
332       write (ulsort,*) '.. aretes de ', indare+1, ' a ', indare+10
333 #endif
334       iaux = 10
335       call cmchpb ( indnoe, indare, iaux,
336      >              nbsomm, lesnoe, areint,
337      >              coonoe, hetnoe, arenoe,
338      >              famnoe,
339      >              hetare, somare,
340      >              filare, merare, famare,
341      >              ulsort, langue, codret )
342 c
343       endif
344 c
345 c====
346 c 4. Creation des triangles internes
347 c    triint( 1) : FA1
348 c    triint( 2) : FA2
349 c    triint( 3) : FA4
350 c    triint( 4) : FA3
351 c    triint( 5) : FA6
352 c    triint( 6) : FA9
353 c    triint( 7) : FA5
354 c    triint( 8) : FA12 (F1/F3)
355 c    triint( 9) : FA7  (F1/F4)
356 c    triint(10) : FA11 (F2/F3)
357 c    triint(11) : FS4N8
358 c    triint(12) : FS2N8
359 c    triint(13) : FS5N10
360 c    triint(14) : FS1N10
361 c    triint(15) : FS7N8
362 c    triint(16) : FS5N8
363 c    triint(17) : FS8N10
364 c    triint(18) : FS4N10
365 c    triint(19) : FS3N8
366 c    triint(20) : FS6N10
367 c    triint(21) : FS8N8
368 c    triint(22) : FS7N10
369 c====
370 c
371       if ( codret.eq.0 ) then
372 c
373       lesare( 1) = listar(1)
374       lesare( 2) = listar(2)
375       lesare( 3) = listar(4)
376       lesare( 4) = listar(3)
377       lesare( 5) = listar(6)
378       lesare( 6) = listar(9)
379       lesare( 7) = listar(5)
380       lesare( 8) = listar(12)
381       lesare( 9) = -listar(7)
382       lesare(10) = listar(11)
383 c
384       tab1(1) = 1
385       tab1(2) = 1
386 c
387 #ifdef _DEBUG_HOMARD_
388       write (ulsort,texte(langue,3)) 'CMCHAF', nompro
389       write (ulsort,*) '.. triangles de ', indtri+1, ' a ', indtri+10
390 #endif
391       call cmchaf ( indtri, triint,
392      >              lesare, tab1,
393      >              trifad, areint, areqtr, niveau,
394      >              aretri, famtri, hettri,
395      >              filtri, pertri, nivtri,
396      >              ulsort, langue, codret )
397 c
398       endif
399 c
400 c====
401 c 5. Creation des deux pyramides
402 c====
403 c
404       if ( codret.eq.0 ) then
405 c
406       iaux = -indptp
407       jaux = cfahex(cofpfh,famhex(lehexa))
408 c
409 #ifdef _DEBUG_HOMARD_
410       write (ulsort,*) '.. pyramides de ', indpyr+1, ' a ', indpyr+2
411 #endif
412 c
413       laface = quahex(lehexa,1)
414       codfac = coquhe(lehexa,1)
415       indpyr = indpyr + 1
416       call cmcpyr ( facpyr, cofapy, fampyr, hetpyr, filpyr, perpyr,
417      >              triint(1), 3,
418      >              triint(2), 3,
419      >              triint(3), 3,
420      >              triint(4), 2,
421      >                 laface, codfac,
422      >              iaux,  jaux,   indpyr )
423 c
424       laface = quahex(lehexa,2)
425       codfac = coquhe(lehexa,2)
426       indpyr = indpyr + 1
427       call cmcpyr ( facpyr, cofapy, fampyr, hetpyr, filpyr, perpyr,
428      >              triint(1), 5,
429      >              triint(5), 3,
430      >              triint(6), 3,
431      >              triint(7), 2,
432      >                 laface, codfac,
433      >              iaux,  jaux,   indpyr )
434 c
435 #ifdef _DEBUG_HOMARD_
436       do 4333 , iaux = indpyr-1, indpyr
437       write(ulsort,1789) iaux, (facpyr(iaux,jaux),jaux=1,5)
438  4333 continue
439  1789 format('pyramide ',i6,' : ',5i6)
440 #endif
441 c
442       endif
443 c
444 c====
445 c 6. Creation des douze tetraedres dans l'ordre suivant :
446 c  tetraedre 7
447 c  tetraedre 8
448 c  tetraedre 9
449 c  tetraedre 4
450 c  tetraedre 5
451 c  tetraedre 6
452 c  tetraedre 10
453 c  tetraedre 11
454 c  tetraedre 12
455 c  tetraedre 1
456 c  tetraedre 2
457 c  tetraedre 3
458 c====
459 c
460       if ( codret.eq.0 ) then
461 c
462 #ifdef _DEBUG_HOMARD_
463       write (ulsort,texte(langue,3)) 'CMCHAG', nompro
464       write (ulsort,*) '.. tetraedres de ', indtet+1, ' a ', indtet+12
465 #endif
466 c
467       iaux = 2
468       call cmchag ( lehexa, indtet, indptp,   iaux,
469      >              trifad, cotrvo, triint,
470      >              hettet, tritet, cotrte,
471      >              filtet, pertet, famtet,
472      >              famhex, cfahex,
473      >              ulsort, langue, codret )
474 c
475       endif
476 c
477 c====
478 c 7. la fin
479 c====
480 c
481       if ( codret.ne.0 ) then
482 c
483 #include "envex2.h"
484 c
485       write (ulsort,texte(langue,1)) 'Sortie', nompro
486       write (ulsort,texte(langue,2)) codret
487 c
488       endif
489 c
490 #ifdef _DEBUG_HOMARD_
491       write (ulsort,texte(langue,1)) 'Sortie', nompro
492       call dmflsh (iaux)
493 #endif
494 c
495       end