1 subroutine cmrdpe ( somare, hetare, filare, merare,
3 > filtri, pertri, nivtri,
5 > filqua, perqua, nivqua,
6 > facpen, cofape, hetpen,
8 > famare, famtri, famqua, fampen,
9 > indare, indtri, indqua, indpen,
10 > ulsort, langue, codret )
11 c ______________________________________________________________________
15 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
17 c Version originale enregistree le 18 juin 1996 sous le numero 96036
18 c aupres des huissiers de justice Simart et Lavoir a Clamart
19 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
20 c aupres des huissiers de justice
21 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
23 c HOMARD est une marque deposee d'Electricite de France
29 c ______________________________________________________________________
31 c Creation du Maillage - Raffinement - Decoupage des PEntaedres
33 c ______________________________________________________________________
35 c . nom . e/s . taille . description .
36 c .____________________________________________________________________.
37 c . somare . es .2*nouvar. numeros des extremites d'arete .
38 c . hetare . es . nouvar . historique de l'etat des aretes .
39 c . filare . es . nouvar . premiere fille des aretes .
40 c . merare . es . nouvar . mere des aretes .
41 c . aretri . e .nouvtr*3. numeros des 3 aretes des triangles .
42 c . hettri . e . nouvtr . historique de l'etat des triangles .
43 c . filtri . e . nouvtr . premier fils des triangles .
44 c . pertri . e . nouvtr . pere des triangles .
45 c . nivtri . e . nouvtr . niveau des triangles .
46 c . arequa . e .nouvqu*4. numeros des 4 aretes des quadrangles .
47 c . hetqua . e . nouvqu . historique de l'etat des quadrangles .
48 c . filqua . e . nouvqu . premier fils des quadrangles .
49 c . perqua . e . nouvqu . pere des quadrangles .
50 c . nivqua . e . nouvqu . niveau des quadrangles .
51 c . facpen . e .nouvpf*5. numeros des faces des pentaedres .
52 c . cofape . e .nouvpf*5. code des faces des pentaedres .
53 c . hetpen . es . nouvpe . historique de l'etat des pentaedres .
54 c . filpen . es . nouvpe . premier fils des pentaedres .
55 c . perpen . e . nouvpe . pere des pentaedres .
56 c . famare . es . nouvar . famille des aretes .
57 c . famtri . es . nouvtr . famille des triangles .
58 c . famqua . es . nouvqu . famille des quadrangles .
59 c . fampen . es . nouvpe . famille des pentaedres .
60 c . indare . es . 1 . indice de la derniere arete creee .
61 c . indtri . es . 1 . indice du dernier triangle cree .
62 c . indqua . es . 1 . indice du dernier quadrangle cree .
63 c . indpen . es . 1 . indice du dernier pentaedre cree .
64 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
65 c . langue . e . 1 . langue des messages .
66 c . . . . 1 : francais, 2 : anglais .
67 c . codret . es . 1 . code de retour des modules .
68 c . . . . 0 : pas de probleme .
69 c ______________________________________________________________________
72 c 0. declarations et dimensionnement
75 c 0.1. ==> generalites
81 parameter ( nompro = 'CMRDPE' )
97 integer somare(2,nouvar), hetare(nouvar), filare(nouvar)
98 integer merare(nouvar)
99 integer aretri(nouvtr,3), hettri(nouvtr)
100 integer filtri(nouvtr), pertri(nouvtr), nivtri(nouvtr)
101 integer arequa(nouvqu,4), hetqua(nouvqu)
102 integer filqua(nouvqu), perqua(nouvqu), nivqua(nouvqu)
103 integer facpen(nouvpf,5), cofape(nouvpf,5)
104 integer hetpen(nouvpe), filpen(nouvpe), perpen(nouvpe)
105 integer famare(nouvar), famtri(nouvtr), famqua(nouvqu)
106 integer fampen(nouvpe)
107 integer indare, indtri, indqua, indpen
109 integer ulsort, langue, codret
111 c 0.4. ==> variables locales
113 integer dt, etat, lepent, pere, nupent
114 integer niveau, cf1, cf2, cf3, cf4, cf5, f1, f2, f3, f4, f5
116 integer a1ff1, a2ff1, a3ff1, a4ff2, a5ff2, a6ff2
117 integer n1nf3, n9nf3, n4nf3, n7nf3
118 integer n2nf4, n7nf4, n5nf4, n8nf4
119 integer n3nf5, n8nf5, n6nf5, n9nf5
121 integer f1ff1, f2ff1, f3ff1, f4ff2, f5ff2, f6ff2
122 integer f3s1, f3s3, f3s6, f3s4
123 integer f4s2, f4s1, f4s4, f4s5
124 integer f5s3, f5s2, f5s5, f5s6
125 integer nf3, nf4, nf5
126 integer nf3nf4, nf4nf5, nf5nf3
127 integer pf1, pf1n7, pf1n8, pf1n9
128 integer pf3f1, pf3f2, pf4f1, pf4f2, pf5f1, pf5f2
133 parameter ( nbmess = 10 )
134 character*80 texte(nblang,nbmess)
136 c 0.5. ==> initialisations
137 c ______________________________________________________________________
147 #ifdef _DEBUG_HOMARD_
148 write (ulsort,texte(langue,1)) 'Entree', nompro
152 texte(1,4) = '(''Decoupage du '',a,i10)'
154 > '(''.. Face :'',i10,'', d''''aretes'',4i10,'', code'',i2)'
155 texte(1,6) = '(''.. Noeuds milieux des faces'',6i10)'
156 texte(1,7) = '(''.. Noeud milieu'',i10,'', coor :'',3g15.7)'
157 texte(1,9) = '(''.. Creation des '',a,'' internes'')'
158 texte(1,10) = '(''.. Creation des 8 pentaedres'')'
160 texte(2,4) = '(''Splitting of '',a,'' #'',i10)'
162 > '(''.. Face :'',i10,'', with edges'',4i10,'', code'',i2)'
163 texte(2,6) = '(''.. Center nodes for faces'',6i10)'
164 texte(2,7) = '(''.. Central node'',i10,'', coor :'',3g15.7)'
165 texte(2,9) = '(''.. Creation of internal '',a)'
166 texte(2,10) = '(''.. Creation of 8 pentahedrons'')'
169 c 2. decoupage en 8 des pentaedres dont les 5 faces sont coupees en 4
172 do 200 , lepent = 1 , nbpepe
174 if ( mod(hetpen(lepent),100) .eq. 0 ) then
179 do 211 , iaux = 1 , 2
180 jaux = facpen(lepent,iaux)
181 if ( mod(hettri(jaux),10).eq.4 .or.
182 > mod(hettri(jaux),10).eq.5 .or.
183 > mod(hettri(jaux),10).eq.6 .or.
184 > mod(hettri(jaux),10).eq.7 .or.
185 > mod(hettri(jaux),10).eq.9) then
189 do 212 , iaux = 3 , 5
190 jaux = facpen(lepent,iaux)
191 if ( mod(hetqua(jaux),100).eq.4 .or.
192 > mod(hetqua(jaux),100).eq.99 ) then
198 #ifdef _DEBUG_HOMARD_
199 write (ulsort,texte(langue,4)) mess14(langue,1,7), lepent
202 c 2.2. ==> description des 5 faces du pentaedre
204 c 2.2.1. ==> description de la face 1
206 f1 = facpen(lepent,1)
207 cf1 = cofape(lepent,1)
209 c 2.2.1.1. ==> reperage des 4 triangles fils
210 c fiff1 : face opposee a arete ai
211 c ainsi f1ff1 contient le sommet s2
214 f1ff1 = ff1 + i1(cf1)
215 f2ff1 = ff1 + i2(cf1)
216 f3ff1 = ff1 + i3(cf1)
218 c 2.2.1.2. ==> reperage des 3 aretes internes
219 c aiff1 : arete de ff1 qui est // a ai
221 a1ff1 = aretri(ff1,i1(cf1))
222 a2ff1 = aretri(ff1,i2(cf1))
223 a3ff1 = aretri(ff1,i3(cf1))
225 c 2.2.2. ==> description de la face 2
227 f2 = facpen(lepent,2)
228 cf2 = cofape(lepent,2)
230 c 2.2.2.1. ==> reperage des 4 triangles fils
233 f4ff2 = ff2 + i1(cf2)
234 f6ff2 = ff2 + i2(cf2)
235 f5ff2 = ff2 + i3(cf2)
237 c 2.2.2.2. ==> reperage des 3 aretes internes
239 a4ff2 = aretri(ff2,i1(cf2))
240 a6ff2 = aretri(ff2,i2(cf2))
241 a5ff2 = aretri(ff2,i3(cf2))
243 c 2.2.3. ==> description de la face 3
245 f3 = facpen(lepent,3)
246 cf3 = cofape(lepent,3)
248 c 2.2.3.1. ==> reperage des 4 quadrangles fils
250 f3s1 = filqua(f3) + defiq1(cf3)
251 f3s3 = filqua(f3) + defiq2(cf3)
252 f3s6 = filqua(f3) + defiq3(cf3)
253 f3s4 = filqua(f3) + defiq4(cf3)
254 c write(ulsort,*) 'f3s1, f3s3, f3s6, f3s4 ',f3s1, f3s3, f3s6,f3s4
256 c 2.2.3.2. ==> reperage des 4 aretes internes
259 n1nf3 = arequa(f3s1,2)
260 n9nf3 = arequa(f3s3,2)
261 n4nf3 = arequa(f3s6,2)
262 n7nf3 = arequa(f3s4,2)
264 n1nf3 = arequa(f3s3,2)
265 n9nf3 = arequa(f3s6,2)
266 n4nf3 = arequa(f3s4,2)
267 n7nf3 = arequa(f3s1,2)
270 c 2.2.4. ==> description de la face 4
272 f4 = facpen(lepent,4)
273 cf4 = cofape(lepent,4)
275 c 2.2.4.1. ==> reperage des 4 quadrangles fils
277 f4s2 = filqua(f4) + defiq1(cf4)
278 f4s1 = filqua(f4) + defiq2(cf4)
279 f4s4 = filqua(f4) + defiq3(cf4)
280 f4s5 = filqua(f4) + defiq4(cf4)
282 c 2.2.4.2. ==> reperage des 4 aretes internes
285 n2nf4 = arequa(f4s2,2)
286 n7nf4 = arequa(f4s1,2)
287 n5nf4 = arequa(f4s4,2)
288 n8nf4 = arequa(f4s5,2)
290 n2nf4 = arequa(f4s1,2)
291 n7nf4 = arequa(f4s4,2)
292 n5nf4 = arequa(f4s5,2)
293 n8nf4 = arequa(f4s2,2)
296 c 2.2.5. ==> description de la face 5
298 f5 = facpen(lepent,5)
299 cf5 = cofape(lepent,5)
301 c 2.2.5.1. ==> reperage des 4 quadrangles fils
303 f5s3 = filqua(f5) + defiq1(cf5)
304 f5s2 = filqua(f5) + defiq2(cf5)
305 f5s5 = filqua(f5) + defiq3(cf5)
306 f5s6 = filqua(f5) + defiq4(cf5)
308 c 2.2.5.2. ==> reperage des 4 aretes internes
311 n3nf5 = arequa(f5s3,2)
312 n8nf5 = arequa(f5s2,2)
313 n6nf5 = arequa(f5s5,2)
314 n9nf5 = arequa(f5s6,2)
316 n3nf5 = arequa(f5s2,2)
317 n8nf5 = arequa(f5s5,2)
318 n6nf5 = arequa(f5s6,2)
319 n9nf5 = arequa(f5s3,2)
322 #ifdef _DEBUG_HOMARD_
323 write(ulsort,texte(langue,5)) f1,aretri(f1,1),aretri(f1,2)
324 > ,aretri(f1,3),0,cf1
325 write(ulsort,texte(langue,5)) f2,aretri(f2,1),aretri(f2,2)
326 > ,aretri(f2,3),0,cf2
327 write(ulsort,texte(langue,5)) f3,arequa(f3,1),arequa(f3,2)
328 > ,arequa(f3,3),arequa(f3,4),cf3
329 write(ulsort,texte(langue,5)) f4,arequa(f4,1),arequa(f4,2)
330 > ,arequa(f4,3),arequa(f4,4),cf4
331 write(ulsort,texte(langue,5)) f5,arequa(f5,1),arequa(f5,2)
332 > ,arequa(f5,3),arequa(f5,4),cf5
335 c 2.3. ==> noeuds milieux des faces du pentaedre
337 nf3 = somare(2,n1nf3)
338 nf4 = somare(2,n2nf4)
339 nf5 = somare(2,n3nf5)
340 #ifdef _DEBUG_HOMARD_
341 write (ulsort,texte(langue,6)) nf3, nf4, nf5
344 c 2.4. ==> creation des aretes internes au pentaedre
346 #ifdef _DEBUG_HOMARD_
347 write (ulsort,texte(langue,9)) mess14(langue,3,1)
350 c 2.4.1. ==> leurs numeros
357 c 2.4.2. ==> les numeros de leurs sommets avec la convention ad'hoc
359 somare(1,nf3nf4) = min(nf3,nf4)
360 somare(2,nf3nf4) = max(nf3,nf4)
361 somare(1,nf4nf5) = min(nf4,nf5)
362 somare(2,nf4nf5) = max(nf4,nf5)
363 somare(1,nf5nf3) = min(nf3,nf5)
364 somare(2,nf5nf3) = max(nf3,nf5)
366 c 2.4.3. ==> leur famille : libre
372 c 2.4.4. ==> la parente
384 c 2.5. ==> creation des 4 triangles internes
385 c 2.5.1. ==> recuperation du niveau commun a tous les triangles fils
386 c le code est 1 par defaut
391 c 2.5.2. ==> creation
394 call cmctri ( aretri, famtri, hettri,
395 > filtri, pertri, nivtri,
396 > pf1, nf3nf4, nf4nf5, nf5nf3,
400 call cmctri ( aretri, famtri, hettri,
401 > filtri, pertri, nivtri,
402 > pf1n7, nf3nf4, n7nf3, n7nf4,
406 call cmctri ( aretri, famtri, hettri,
407 > filtri, pertri, nivtri,
408 > pf1n8, nf4nf5, n8nf4, n8nf5,
412 call cmctri ( aretri, famtri, hettri,
413 > filtri, pertri, nivtri,
414 > pf1n9, nf5nf3, n9nf5, n9nf3,
419 c 2.6. ==> creation des 6 quadrangles internes
420 c tous ces quadrangles sont crees avec le code arbitraire 1
421 c et avec le meme niveau que les triangles
424 call cmcqua ( arequa, famqua, hetqua, filqua, perqua, nivqua,
425 > pf3f1, a1ff1, n3nf5, nf4nf5, n2nf4,
429 call cmcqua ( arequa, famqua, hetqua, filqua, perqua, nivqua,
430 > pf3f2, nf4nf5, n6nf5, a4ff2, n5nf4,
434 call cmcqua ( arequa, famqua, hetqua, filqua, perqua, nivqua,
435 > pf4f1, a2ff1, n1nf3, nf5nf3, n3nf5,
439 call cmcqua ( arequa, famqua, hetqua, filqua, perqua, nivqua,
440 > pf4f2, nf5nf3, n4nf3, a5ff2, n6nf5,
444 call cmcqua ( arequa, famqua, hetqua, filqua, perqua, nivqua,
445 > pf5f1, a3ff1, n2nf4, nf3nf4, n1nf3,
449 call cmcqua ( arequa, famqua, hetqua, filqua, perqua, nivqua,
450 > pf5f2, nf3nf4, n5nf4, a6ff2, n4nf3,
455 c 2.7. ==> creation des 8 pentaedres
457 #ifdef _DEBUG_HOMARD_
458 write (ulsort,texte(langue,10))
461 iaux = fampen(lepent)
464 call cmcpen ( facpen, cofape, fampen,
465 > hetpen, filpen, perpen,
466 > f3ff1, pf1n7, f3s1,
468 > cf1, 6, cofp08(cf3,defiq1(cf3)),
469 > cofp08(cf4,defiq2(cf4)), 1,
470 > lepent, iaux, nupent )
473 call cmcpen ( facpen, cofape, fampen,
474 > hetpen, filpen, perpen,
475 > f1ff1, pf1n8, pf3f1,
478 > cofp08(cf4,defiq1(cf4)),
479 > cofp08(cf5,defiq2(cf5)),
480 > lepent, iaux, nupent )
483 call cmcpen ( facpen, cofape, fampen,
484 > hetpen, filpen, perpen,
485 > f2ff1, pf1n9, f3s3,
487 > cf1, 5, cofp08(cf3,defiq2(cf3)),
488 > 1, cofp08(cf5,defiq1(cf5)),
489 > lepent, iaux, nupent )
492 call cmcpen ( facpen, cofape, fampen,
493 > hetpen, filpen, perpen,
494 > pf1n7, f6ff2, f3s4,
496 > 3, cf2, cofp08(cf3,defiq4(cf3)),
497 > cofp08(cf4,defiq3(cf4)), 1,
498 > lepent, iaux, nupent )
501 call cmcpen ( facpen, cofape, fampen,
502 > hetpen, filpen, perpen,
503 > pf1n8, f4ff2, pf3f2,
506 > cofp08(cf4,defiq4(cf4)), cofp08(cf5,defiq3(cf5)),
507 > lepent, iaux, nupent )
510 call cmcpen ( facpen, cofape, fampen,
511 > hetpen, filpen, perpen,
512 > pf1n9, f5ff2, f3s6,
514 > 2, cf2, cofp08(cf3,defiq3(cf3)),
515 > 1, cofp08(cf5,defiq4(cf5)),
516 > lepent, iaux, nupent )
519 call cmcpen ( facpen, cofape, fampen,
520 > hetpen, filpen, perpen,
525 > lepent, iaux, nupent )
528 call cmcpen ( facpen, cofape, fampen,
529 > hetpen, filpen, perpen,
534 > lepent, iaux, nupent )
538 c 2.7.3. ==> mise a jour du pentaedre courant et de son pere eventuel
540 filpen(lepent) = indpen - 7
541 hetpen(lepent) = hetpen(lepent) + 80
542 pere = perpen(lepent)
543 if ( pere .ne. 0 ) then
545 hetpen(pere) = etat - mod(etat,100) + 99
558 if ( codret.ne.0 ) then
562 write (ulsort,texte(langue,1)) 'Sortie', nompro
563 write (ulsort,texte(langue,2)) codret
567 #ifdef _DEBUG_HOMARD_
568 write (ulsort,texte(langue,1)) 'Sortie', nompro