1 subroutine cmcham ( lehexa, etahex, indtet, indptp,
2 > trifad, cotrvo, triint,
3 > hettet, tritet, cotrte,
4 > filtet, pertet, famtet,
6 > ulsort, langue, codret )
7 c ______________________________________________________________________
11 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
13 c Version originale enregistree le 18 juin 1996 sous le numero 96036
14 c aupres des huissiers de justice Simart et Lavoir a Clamart
15 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
16 c aupres des huissiers de justice
17 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
19 c HOMARD est une marque deposee d'Electricite de France
25 c ______________________________________________________________________
27 c Creation du Maillage - Conformite - decoupage des Hexaedres
29 c - par 3 Aretes - phase M
31 c Remarque : cmchae, cmchag, cmchai, cmchan et cmcham sont des clones
32 c cmchan et cmcham sont symetriques
33 c ______________________________________________________________________
35 c . nom . e/s . taille . description .
36 c .____________________________________________________________________.
37 c . lehexa . e . 1 . hexaedre a decouper .
38 c . etahex . e . 1 . etat de l'hexaedre .
39 c . indtet . es . 1 . indice du dernier tetraedre cree .
40 c . indptp . e . 1 . indice du dernier pere enregistre .
41 c . trifad . e .(6,0:2) . triangles traces sur les faces decoupees .
42 c . cotrvo . e .(6,0:2) . code des triangles dans les volumes .
43 c . triint . s . 27 . triangles internes a l'hexaedre .
44 c . . . . 1-6 = appuyes sur une arete non decoupee .
45 c . . . . base de face centrale .
46 c . . . . 7-9 = appuyes sur une arete non decoupee .
47 c . . . . non base de face centrale .
48 c . . . . 10-21 = appuyes sur une arete interne a .
49 c . . . . une face coupee .
50 c . . . . 22-27 = appuyes sur les filles des aretes .
52 c . hettet . es . nouvte . historique de l'etat des tetraedres .
53 c . tritet . es .nouvtf*4. numeros des 4 triangles des tetraedres .
54 c . cotrte . es .nouvtf*4. code des 4 triangles des tetraedres .
55 c . filtet . es . nouvte . premier fils des tetraedres .
56 c . pertet . es . nouvte . pere des tetraedres .
57 c . . . . si pertet(i) > 0 : numero du tetraedre .
58 c . . . . si pertet(i) < 0 : -numero dans pthepe .
59 c . famtet . es . nouvte . famille des tetraedres .
60 c . famhex . e . nouvhe . famille des hexaedres .
61 c . cfahex . . nctfhe. codes des familles des hexaedres .
62 c . . . nbfhex . 1 : famille MED .
63 c . . . . 2 : type d'hexaedres .
64 c . . . . 3 : famille des tetraedres de conformite .
65 c . . . . 4 : famille des pyramides de conformite .
66 c . ulsort . e . 1 . unite logique de la sortie generale .
67 c . langue . e . 1 . langue des messages .
68 c . . . . 1 : francais, 2 : anglais .
69 c . codret . es . 1 . code de retour des modules .
70 c . . . . 0 : pas de probleme .
71 c . . . . 1 : aucune arete ne correspond .
72 c ______________________________________________________________________
75 c 0. declarations et dimensionnement
78 c 0.1. ==> generalites
84 parameter ( nompro = 'CMCHAM' )
99 integer lehexa, etahex, indtet, indptp
100 integer trifad(6,0:2), cotrvo(6,0:2)
102 integer hettet(nouvte), tritet(nouvtf,4), cotrte(nouvtf,4)
103 integer filtet(nouvte), pertet(nouvte), famtet(nouvte)
104 integer famhex(nouvhe), cfahex(nctfhe,nbfhex)
106 integer ulsort, langue, codret
108 c 0.4. ==> variables locales
111 integer nupere, nufami
115 parameter ( nbmess = 10 )
116 character*80 texte(nblang,nbmess)
118 c 0.5. ==> initialisations
119 c ______________________________________________________________________
127 #ifdef _DEBUG_HOMARD_
128 write (ulsort,texte(langue,1)) 'Entree', nompro
134 #ifdef _DEBUG_HOMARD_
135 write (ulsort,texte(langue,3)) 'CMCHxx', nompro
136 write (ulsort,1200) indtet+1, indtet+18
137 1200 format( '.. tetraedres de',i10,' a',i10)
140 c 1.2. ==> Le pere des tetraedres et leur famille
143 nufami = cfahex(coftfh,famhex(lehexa))
148 c 2.1. ==> tetraedre central
151 call cmctet ( tritet, cotrte, famtet,
152 > hettet, filtet, pertet,
153 > trifad(1,0), triint(1), triint(11), triint(10),
154 > cotrvo(1,0), 3, 5, 3,
155 > nupere, nufami, indtet )
157 c 2.2. ==> tetraedre du cote du sommet 1
159 if ( etahex.eq.82 .or. etahex.eq.86 ) then
165 call cmctet ( tritet, cotrte, famtet,
166 > hettet, filtet, pertet,
167 > trifad(1,1), triint(3), triint(10), triint(22),
168 > cotrvo(1,1), code, 3, 5,
169 > nupere, nufami, indtet )
171 c 2.3. ==> tetraedre de l'autre cote
173 if ( etahex.eq.82 .or. etahex.eq.83 ) then
179 call cmctet ( tritet, cotrte, famtet,
180 > hettet, filtet, pertet,
181 > trifad(1,2), triint(8), triint(23), triint(11),
182 > cotrvo(1,2), code, 3, 5,
183 > nupere, nufami, indtet )
188 c 3.1. ==> tetraedre central
191 call cmctet ( tritet, cotrte, famtet,
192 > hettet, filtet, pertet,
193 > trifad(2,0), triint(2), triint(12), triint(13),
194 > cotrvo(2,0), 3, 5, 3,
195 > nupere, nufami, indtet )
197 c 3.2. ==> tetraedre du cote du sommet 1
200 call cmctet ( tritet, cotrte, famtet,
201 > hettet, filtet, pertet,
202 > trifad(2,1), triint(9), triint(22), triint(12),
203 > cotrvo(2,1), 3, 5, 5,
204 > nupere, nufami, indtet )
206 c 3.3. ==> tetraedre de l'autre cote
209 call cmctet ( tritet, cotrte, famtet,
210 > hettet, filtet, pertet,
211 > trifad(2,2), triint(6), triint(13), triint(23),
212 > cotrvo(2,2), 3, 3, 3,
213 > nupere, nufami, indtet )
218 c 4.1. ==> tetraedre central
220 if ( etahex.eq.82 .or. etahex.eq.86 ) then
226 call cmctet ( tritet, cotrte, famtet,
227 > hettet, filtet, pertet,
228 > trifad(3,0), triint(3), triint(15), triint(14),
229 > cotrvo(3,0), code, 5, 3,
230 > nupere, nufami, indtet )
232 c 4.2. ==> tetraedre du cote du sommet 1
234 if ( etahex.eq.82 .or. etahex.eq.83 ) then
240 call cmctet ( tritet, cotrte, famtet,
241 > hettet, filtet, pertet,
242 > trifad(3,1), triint(5), triint(14), triint(24),
243 > cotrvo(3,1), 3, 3, code,
244 > nupere, nufami, indtet )
246 c 4.3. ==> tetraedre de l'autre cote
248 if ( etahex.eq.82 .or. etahex.eq.83 ) then
254 call cmctet ( tritet, cotrte, famtet,
255 > hettet, filtet, pertet,
256 > trifad(3,2), triint(9), triint(25), triint(15),
257 > cotrvo(3,2), 5, code, 5,
258 > nupere, nufami, indtet )
263 c 5.1. ==> tetraedre central
265 if ( etahex.eq.82 .or. etahex.eq.86 ) then
271 call cmctet ( tritet, cotrte, famtet,
272 > hettet, filtet, pertet,
273 > trifad(4,0), triint(4), triint(16), triint(17),
274 > cotrvo(4,0), code, 5, 3,
275 > nupere, nufami, indtet )
277 c 5.2. ==> tetraedre du cote du sommet 1
279 if ( etahex.eq.82 .or. etahex.eq.83 ) then
285 call cmctet ( tritet, cotrte, famtet,
286 > hettet, filtet, pertet,
287 > trifad(4,1), triint(7), triint(24), triint(16),
288 > cotrvo(4,1), 3, code, 5,
289 > nupere, nufami, indtet )
291 c 5.3. ==> tetraedre de l'autre cote
293 if ( etahex.eq.82 .or. etahex.eq.83 ) then
299 call cmctet ( tritet, cotrte, famtet,
300 > hettet, filtet, pertet,
301 > trifad(4,2), triint(2), triint(17), triint(25),
302 > cotrvo(4,2), 5, 3, code,
303 > nupere, nufami, indtet )
308 c 6.1. ==> tetraedre central
311 call cmctet ( tritet, cotrte, famtet,
312 > hettet, filtet, pertet,
313 > trifad(5,0), triint(5), triint(19), triint(18),
314 > cotrvo(5,0), 5, 5, 3,
315 > nupere, nufami, indtet )
317 c 6.2. ==> tetraedre du cote du sommet 1
320 call cmctet ( tritet, cotrte, famtet,
321 > hettet, filtet, pertet,
322 > trifad(5,1), triint(1), triint(18), triint(26),
323 > cotrvo(5,1), 5, 3, 5,
324 > nupere, nufami, indtet )
326 c 6.3. ==> tetraedre de l'autre cote
329 call cmctet ( tritet, cotrte, famtet,
330 > hettet, filtet, pertet,
331 > trifad(5,2), triint(7), triint(27), triint(19),
332 > cotrvo(5,2), 5, 3, 5,
333 > nupere, nufami, indtet )
338 c 7.1. ==> tetraedre central
341 call cmctet ( tritet, cotrte, famtet,
342 > hettet, filtet, pertet,
343 > trifad(6,0), triint(6), triint(20), triint(21),
344 > cotrvo(6,0), 5, 5, 3,
345 > nupere, nufami, indtet )
347 c 7.2. ==> tetraedre du cote du sommet 1
349 if ( etahex.eq.82 .or. etahex.eq.83 ) then
355 call cmctet ( tritet, cotrte, famtet,
356 > hettet, filtet, pertet,
357 > trifad(6,1), triint(8), triint(26), triint(20),
358 > cotrvo(6,1), code, 5, 5,
359 > nupere, nufami, indtet )
361 c 7.3. ==> tetraedre de l'autre cote
363 if ( etahex.eq.82 .or. etahex.eq.86 ) then
369 call cmctet ( tritet, cotrte, famtet,
370 > hettet, filtet, pertet,
371 > trifad(6,2), triint(4), triint(21), triint(27),
372 > cotrvo(6,2), code, 3, 3,
373 > nupere, nufami, indtet )
375 #ifdef _DEBUG_HOMARD_
376 do 2222 , iaux = indtet-17, indtet
377 write(ulsort,1789) iaux, (tritet(iaux,code),code=1,4),
378 > (cotrte(iaux,code),code=1,4)
380 1789 format('tetraedre ',i6,' : ',4i6,4i2)
387 if ( codret.ne.0 ) then
391 write (ulsort,texte(langue,1)) 'Sortie', nompro
392 write (ulsort,texte(langue,2)) codret
396 #ifdef _DEBUG_HOMARD_
397 write (ulsort,texte(langue,1)) 'Sortie', nompro