1 subroutine cmh400 ( lehexa,
2 > indnoe, indare, indtet, indpyr, indhex,
4 > listso, listar, listfa, listcf,
5 > coonoe, hetnoe, arenoe,
8 > filare, merare, famare,
12 > filtet, pertet, famtet,
14 > filpyr, perpyr, fampyr,
16 > filhex, perhex, famhex,
18 > ulsort, langue, codret )
19 c ______________________________________________________________________
23 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
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
31 c HOMARD est une marque deposee d'Electricite de France
37 c ______________________________________________________________________
39 c Creation du Maillage - decoupage de conformite des Hexaedres
41 c ______________________________________________________________________
43 c . nom . e/s . taille . description .
44 c .____________________________________________________________________.
45 c . lehexa . e . 1 . hexaedre a decouper .
46 c . indnoe . es . 1 . indice du dernier noeud cree .
47 c . indare . es . 1 . indice de la derniere arete creee .
48 c . indtet . es . 1 . indice du dernier tetraedre cree .
49 c . indpyr . es . 1 . indice de la derniere pyramide creee .
50 c . indhex . es . 1 . indice du dernier hexaedre cree .
51 c . indptp . es . 1 . indice du dernier pere enregistre .
52 c . listso . e . 8 . numeros globaux des sommets .
53 c . listar . e . 12 . numeros globaux des aretes .
54 c . listfa . e . 6 . numeros globaux des faces .
55 c . listcf . e . 6 . codes des faces .
56 c . coonoe . es .nouvno*3. coordonnees des noeuds .
57 c . hetnoe . es . nouvno . historique de l'etat des noeuds .
58 c . arenoe . es . nouvno . arete liee a un nouveau noeud .
59 c . famnoe . es . nouvno . famille des noeuds .
60 c . hetare . es . nouvar . historique de l'etat des aretes .
61 c . somare . es .2*nouvar. numeros des extremites d'arete .
62 c . filare . es . nouvar . premiere fille des aretes .
63 c . merare . es . nouvar . mere des aretes .
64 c . famare . es . nouvar . famille des aretes .
65 c . aretri . e .nouvtr*3. numeros des 3 aretes des triangles .
66 c . arequa . e .nouvqu*4. numeros des 4 aretes des quadrangles .
67 c . filqua . e . nouvqu . premier fils des quadrangles .
68 c . hettet . es . nouvte . historique de l'etat des tetraedres .
69 c . aretet . es .nouvta*6. numeros des 6 aretes des tetraedres .
70 c . filtet . es . nouvte . premier fils des tetraedres .
71 c . pertet . es . nouvte . pere des tetraedres .
72 c . . . . si pertet(i) > 0 : numero du tetraedre .
73 c . . . . si pertet(i) < 0 : -numero dans pthepe .
74 c . famtet . es . nouvte . famille des tetraedres .
75 c . hetpyr . es . nouvpy . historique de l'etat des pyramides .
76 c . arepyr . es .nouvya*8. numeros des 8 aretes des pyramides .
77 c . filpyr . es . nouvpy . premier fils des pyramides .
78 c . perpyr . es . nouvpy . pere des pyramides .
79 c . . . . si perpyr(i) > 0 : numero de la pyramide .
80 c . . . . si perpyr(i) < 0 : -numero dans pphepe .
81 c . fampyr . es . nouvpy . famille des pyramides .
82 c . hethex . es . nouvhe . historique de l'etat des hexaedres .
83 c . arehex . es .nouvha12. numeros des 12 aretes des hexaedres .
84 c . filhex . es . nouvhe . premier fils des hexaedres .
85 c . perhex . es . nouvhe . pere des hexaedres .
86 c . famhex . es . nouvhe . famille des hexaedres .
87 c . cfahex . e . nctfhe. codes des familles des hexaedres .
88 c . . . nbfhex . 1 : famille MED .
89 c . . . . 2 : type d'hexaedres .
90 c . . . . 3 : famille des tetraedres de conformite .
91 c . . . . 4 : famille des pyramides de conformite .
92 c . ulsort . e . 1 . unite logique de la sortie generale .
93 c . langue . e . 1 . langue des messages .
94 c . . . . 1 : francais, 2 : anglais .
95 c . codret . es . 1 . code de retour des modules .
96 c ______________________________________________________________________
99 c 0. declarations et dimensionnement
102 c 0.1. ==> generalites
109 parameter ( nompro ='CMH400' )
110 parameter ( nbarin = 13 )
113 parameter ( nbsomm = 8 )
131 integer indnoe, indare, indtet, indpyr, indhex
133 integer listso(8), listar(12), listfa(6), listcf(6)
134 integer hetnoe(nouvno), arenoe(nouvno)
135 integer famnoe(nouvno)
136 integer hetare(nouvar), somare(2,nouvar)
137 integer filare(nouvar), merare(nouvar), famare(nouvar)
138 integer aretri(nouvtr,3)
139 integer arequa(nouvqu,4)
140 integer filqua(nouvqu)
141 integer hettet(nouvte), aretet(nouvta,6)
142 integer filtet(nouvte), pertet(nouvte), famtet(nouvte)
143 integer hetpyr(nouvpy), arepyr(nouvya,8)
144 integer filpyr(nouvpy), perpyr(nouvpy), fampyr(nouvpy)
145 integer arehex(nouvha,12)
146 integer hethex(nouvhe)
147 integer filhex(nouvhe), perhex(nouvhe)
148 integer cfahex(nctfhe,nbfhex), famhex(nouvhe)
150 double precision coonoe(nouvno,sdim)
152 integer ulsort, langue, codret
154 c 0.4. ==> variables locales
158 integer lesnoe(nbarin), areint(nbarin)
159 integer lisomm(10), liarin(10)
160 integer fdnume, fdcode
161 integer are1, are2, are3, are4
162 integer are5, are6, are7, are8
166 integer laface, letria
169 integer an1nf1, an2nf1, an3nf1, an4nf1
170 integer as5n1, as6n1, as1n1, as2n1
171 integer as6n2, as7n2, as1n2, as4n2
172 integer as5n3, as8n3, as2n3, as3n3
173 integer as7n4, as8n4, as4n4, as3n4
177 parameter ( nbmess = 10 )
178 character*80 texte(nblang,nbmess)
180 c 0.5. ==> initialisations
181 c ______________________________________________________________________
190 #ifdef _DEBUG_HOMARD_
191 write (ulsort,texte(langue,1)) 'Entree', nompro
195 #ifdef _DEBUG_HOMARD_
196 write (ulsort,90002) 'indnoe', indnoe
197 write (ulsort,90002) 'indtet', indtet
198 write (ulsort,90002) 'indpyr', indpyr
199 write (ulsort,90002) 'indhex', indhex
201 #ifdef _DEBUG_HOMARD_
202 write (ulsort,90002) 'listar 1-8', (listar(iaux),iaux=1,8)
203 write (ulsort,90002) 'listar 9-12', (listar(iaux),iaux=9,12)
204 write (ulsort,90002) 'listso', listso
205 write (ulsort,90002) 'listfa', listfa
206 write (ulsort,90002) 'listcf', listcf
213 c . des sommets de l'hexaedre
214 c . des noeuds milieux des 4 aretes coupees
215 c . du noeud milieu de la face coupee en 4 quadrangles
219 lesnoe(iaux) = listso(iaux)
222 lesnoe(9) = somare(2,filare(listar(1)))
223 lesnoe(10) = somare(2,filare(listar(2)))
224 lesnoe(11) = somare(2,filare(listar(3)))
225 lesnoe(12) = somare(2,filare(listar(4)))
227 iaux = filqua(listfa(1))
228 lesnoe(13) = somare(2,arequa(iaux,2))
229 #ifdef _DEBUG_HOMARD_
230 do 2000 , iaux = 1 , nbarin
231 write(ulsort,90015) 'lesnoe(',iaux,') = ', lesnoe(iaux)
235 c La face coupee en 4 et son code dans l'hexaedre
239 #ifdef _DEBUG_HOMARD_
240 write(ulsort,90002) 'fdnume, fdcode', fdnume, fdcode
244 c 3. Recuperation du noeud central de la face coupee en 4
247 iaux = filqua(fdnume)
248 nf1 = somare(2,arequa(iaux,2))
249 #ifdef _DEBUG_HOMARD_
250 write(ulsort,90002) 'nf1', nf1
254 c 4. Recuperation des aretes tracees sur la face coupee en 4
255 c quabas stocke les quadrangles fils de la face coupee en 4
256 c quabas(p) est la base de la pyramide fille numero p
257 c filqua(fdnume) + defiqJ(fdcode) : J-eme fils du quadrangle
258 c Attention : la regle de numerotation locale des quadrangles quabas
259 c est celle des pyramides ; on part du sommet de plus
260 c petit numero local et on tourne en entrant dans
261 c l'hexaedre. Pour les fils du quadrangle, on part de la
262 c plus petite arete locale et on tourne dans le meme sens
263 c D'ou l'eventuel decalage selon les faces
266 #ifdef _DEBUG_HOMARD_
267 write(ulsort,90002) 'defiq1', defiq1(fdcode)
268 write(ulsort,90002) 'defiq2', defiq2(fdcode)
269 write(ulsort,90002) 'defiq3', defiq3(fdcode)
270 write(ulsort,90002) 'defiq4', defiq4(fdcode)
272 quabas(1) = filqua(fdnume) + defiq2(fdcode)
273 quabas(2) = filqua(fdnume) + defiq3(fdcode)
274 quabas(3) = filqua(fdnume) + defiq4(fdcode)
275 quabas(4) = filqua(fdnume) + defiq1(fdcode)
276 #ifdef _DEBUG_HOMARD_
277 write(ulsort,90002) 'Fils aine', filqua(fdnume)
278 write(ulsort,90006) 'quabas(1) :', quabas(1)
279 write(ulsort,90006) 'quabas(2) :', quabas(2)
280 write(ulsort,90006) 'quabas(3) :', quabas(3)
281 write(ulsort,90006) 'quabas(4) :', quabas(4)
284 if ( fdcode.lt.5 ) then
285 an2nf1 = arequa(quabas(1),2)
286 an4nf1 = arequa(quabas(2),2)
287 an3nf1 = arequa(quabas(3),2)
288 an1nf1 = arequa(quabas(4),2)
290 an2nf1 = arequa(quabas(2),2)
291 an4nf1 = arequa(quabas(3),2)
292 an3nf1 = arequa(quabas(4),2)
293 an1nf1 = arequa(quabas(1),2)
295 #ifdef _DEBUG_HOMARD_
296 write(ulsort,90015) 'an2nf1', an2nf1, ' entre les noeuds',
297 > somare(1,an2nf1), somare(2,an2nf1)
298 write(ulsort,90015) 'an4nf1', an4nf1, ' entre les noeuds',
299 > somare(1,an4nf1), somare(2,an4nf1)
300 write(ulsort,90015) 'an3nf1', an3nf1, ' entre les noeuds',
301 > somare(1,an3nf1), somare(2,an3nf1)
302 write(ulsort,90015) 'an1nf1', an1nf1, ' entre les noeuds',
303 > somare(1,an1nf1), somare(2,an1nf1)
307 c 5. Recuperation des aretes tracees sur les faces coupees en 3
311 letria = -filqua(laface)
312 if ( listcf(2).lt.5 ) then
313 as5n1 = aretri(letria,1)
314 as6n1 = aretri(letria,3)
315 as1n1 = aretri(letria+2,1)
316 as2n1 = aretri(letria+1,1)
318 as5n1 = aretri(letria,3)
319 as6n1 = aretri(letria,1)
320 as1n1 = aretri(letria+1,1)
321 as2n1 = aretri(letria+2,1)
325 letria = -filqua(laface)
326 if ( listcf(3).lt.5 ) then
327 as6n2 = aretri(letria,1)
328 as7n2 = aretri(letria,3)
329 as1n2 = aretri(letria+1,1)
330 as4n2 = aretri(letria+2,1)
332 as6n2 = aretri(letria,3)
333 as7n2 = aretri(letria,1)
334 as1n2 = aretri(letria+2,1)
335 as4n2 = aretri(letria+1,1)
339 letria = -filqua(laface)
340 if ( listcf(4).lt.5 ) then
341 as5n3 = aretri(letria,3)
342 as8n3 = aretri(letria,1)
343 as2n3 = aretri(letria+2,1)
344 as3n3 = aretri(letria+1,1)
346 as5n3 = aretri(letria,1)
347 as8n3 = aretri(letria,3)
348 as2n3 = aretri(letria+1,1)
349 as3n3 = aretri(letria+2,1)
353 letria = -filqua(laface)
354 if ( listcf(5).lt.5 ) then
355 as7n4 = aretri(letria,1)
356 as8n4 = aretri(letria,3)
357 as4n4 = aretri(letria+1,1)
358 as3n4 = aretri(letria+2,1)
360 as7n4 = aretri(letria,3)
361 as8n4 = aretri(letria,1)
362 as4n4 = aretri(letria+2,1)
363 as3n4 = aretri(letria+1,1)
366 #ifdef _DEBUG_HOMARD_
367 write(ulsort,90002) 'as5n1, as6n1, as1n1, as2n1',
368 > as5n1, as6n1, as1n1, as2n1
369 write(ulsort,90002) 'as6n2, as7n2, as1n2, as4n2',
370 > as6n2, as7n2, as1n2, as4n2
371 write(ulsort,90002) 'as5n3, as8n3, as2n3, as3n3',
372 > as5n3, as8n3, as2n3, as3n3
373 write(ulsort,90002) 'as7n4, as8n4, as4n4, as3n4',
374 > as7n4, as8n4, as4n4, as3n4
378 c 6. Creation des quatre aretes internes
388 areint(iaux) = indare
390 somare(1,areint(iaux)) = min ( nf1 , listso(4+iaux) )
391 somare(2,areint(iaux)) = max ( nf1 , listso(4+iaux) )
393 famare(areint(iaux)) = 1
394 hetare(areint(iaux)) = 50
395 merare(areint(iaux)) = 0
396 filare(areint(iaux)) = 0
397 #ifdef _DEBUG_HOMARD_
398 write(ulsort,90006) 'areint(iaux) = ', areint(iaux),
399 > ' de ',somare(1,areint(iaux)),
400 > ' a ',somare(2,areint(iaux))
406 c 5. Creation des 5 pyramides
410 nufami = cfahex(cofpfh,famhex(lehexa))
412 c 5.1. ==> Pyramide s'appuyant sur la face non decoupee
415 #ifdef _DEBUG_HOMARD_
416 write (ulsort,texte(langue,3)) 'CMCPYA pyra 1', nompro
418 call cmcpya ( arepyr, fampyr, hetpyr, filpyr, perpyr,
419 > areint(2), areint(1), areint(4), areint(3),
420 > listar(9), listar(11), listar(12), listar(10),
421 > iaux, nufami, indpyr )
423 c 5.2. ==> Pyramides s'appuyant sur la face decoupee
426 #ifdef _DEBUG_HOMARD_
427 write (ulsort,texte(langue,3)) 'CMCPYA pyra 2', nompro
429 call cmcpya ( arepyr, fampyr, hetpyr, filpyr, perpyr,
430 > listar(5), as6n2, areint(2), as6n1,
431 > as1n2, an2nf1, an1nf1, as1n1,
432 > iaux, nufami, indpyr )
435 #ifdef _DEBUG_HOMARD_
436 write (ulsort,texte(langue,3)) 'CMCPYA pyra 3', nompro
438 call cmcpya ( arepyr, fampyr, hetpyr, filpyr, perpyr,
439 > listar(7), as7n4, areint(3), as7n2,
440 > as4n4, an4nf1, an2nf1, as4n2,
441 > iaux, nufami, indpyr )
444 #ifdef _DEBUG_HOMARD_
445 write (ulsort,texte(langue,3)) 'CMCPYA pyra 4', nompro
447 call cmcpya ( arepyr, fampyr, hetpyr, filpyr, perpyr,
448 > listar(8), as8n3, areint(4), as8n4,
449 > as3n3, an3nf1, an4nf1, as3n4,
450 > iaux, nufami, indpyr )
453 #ifdef _DEBUG_HOMARD_
454 write (ulsort,texte(langue,3)) 'CMCPYA pyra 5', nompro
456 call cmcpya ( arepyr, fampyr, hetpyr, filpyr, perpyr,
457 > listar(6), as5n1, areint(1), as5n3,
458 > as2n1, an1nf1, an3nf1, as2n3,
459 > iaux, nufami, indpyr )
462 c 6. Creation des 4 tetraedres
465 nufami = cfahex(coftfh,famhex(lehexa))
468 #ifdef _DEBUG_HOMARD_
469 write (ulsort,texte(langue,3)) 'CMCTEA - tetra 1', nompro
471 call cmctea ( aretet, famtet, hettet, filtet, pertet,
472 > an1nf1, areint(1), areint(2), as5n1,
474 > iaux, nufami, indtet )
477 #ifdef _DEBUG_HOMARD_
478 write (ulsort,texte(langue,3)) 'CMCTEA - tetra 2', nompro
480 call cmctea ( aretet, famtet, hettet, filtet, pertet,
481 > an2nf1, areint(2), areint(3), as6n2,
483 > iaux, nufami, indtet )
486 #ifdef _DEBUG_HOMARD_
487 write (ulsort,texte(langue,3)) 'CMCTEA - tetra 3', nompro
489 call cmctea ( aretet, famtet, hettet, filtet, pertet,
490 > an4nf1, areint(3), areint(4), as7n4,
492 > iaux, nufami, indtet )
495 #ifdef _DEBUG_HOMARD_
496 write (ulsort,texte(langue,3)) 'CMCTEA - tetra 4', nompro
498 call cmctea ( aretet, famtet, hettet, filtet, pertet,
499 > an3nf1, areint(4), areint(1), as8n3,
501 > iaux, nufami, indtet )
507 if ( codret.ne.0 ) then
511 write (ulsort,texte(langue,1)) 'Sortie', nompro
512 write (ulsort,texte(langue,2)) codret
516 #ifdef _DEBUG_HOMARD_
517 write (ulsort,texte(langue,1)) 'Sortie', nompro