1 subroutine cmrdte ( coonoe, somare, hetare, filare,
2 > merare, aretri, hettri,
3 > filtri, pertri, nivtri,
4 > tritet, cotrte, hettet, filtet,
6 > famare, famtri, famtet,
7 > indare, indtri, indtet,
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 Creation du Maillage - Raffinement - Decoupage des TEtraedres
31 c ______________________________________________________________________
32 c remarque : on est forcement en 3d
33 c ______________________________________________________________________
35 c . nom . e/s . taille . description .
36 c .____________________________________________________________________.
37 c . coonoe . e .nouvno*3. coordonnees des noeuds .
38 c . somare . es .2*nouvar. numeros des extremites d'arete .
39 c . hetare . es . nouvar . historique de l'etat des aretes .
40 c . filare . es . nouvar . premiere fille des aretes .
41 c . merare . es . nouvar . mere des aretes .
42 c . aretri . e .nouvtr*3. numeros des 3 aretes des triangles .
43 c . hettri . e . nouvtr . historique de l'etat des triangles .
44 c . filtri . e . nouvtr . premier fils des triangles .
45 c . pertri . e . nouvtr . pere des triangles .
46 c . nivtri . e . nouvtr . niveau des triangles .
47 c . tritet . e .nouvtf*4. numeros des 4 triangles des tetraedres .
48 c . cotrte . e .nouvtf*4. code des 4 triangles des tetraedres .
49 c . hettet . es . nouvte . historique de l'etat des tetraedres .
50 c . filtet . es . nouvte . premier fils des tetraedres .
51 c . pertet . e . nouvte . pere des tetraedres .
52 c . . . . si pertet(i) > 0 : numero du tetraedre .
53 c . . . . si pertet(i) < 0 : -numero dans pthepe .
54 c . famare . es . nouvar . famille des aretes .
55 c . famtri . es . nouvtr . famille des triangles .
56 c . famtet . e . nouvte . famille des tetraedres .
57 c . indare . es . 1 . indice de la derniere arete creee .
58 c . indtri . es . 1 . indice du dernier triangle cree .
59 c . indtet . es . 1 . indice du dernier tetraedre cree .
60 c . ulsort . e . 1 . numero d'unite logique de la liste standard.
61 c . langue . e . 1 . langue des messages .
62 c . . . . 1 : francais, 2 : anglais .
63 c . codret . es . 1 . code de retour des modules .
64 c . . . . 0 : pas de probleme .
65 c ______________________________________________________________________
68 c 0. declarations et dimensionnement
71 c 0.1. ==> generalites
77 parameter ( nompro = 'CMRDTE' )
93 double precision coonoe(nouvno,sdim)
95 integer somare(2,nouvar), hetare(nouvar), filare(nouvar)
96 integer merare(nouvar), aretri(nouvtr,3)
97 integer hettri(nouvtr), filtri(nouvtr), pertri(nouvtr)
98 integer nivtri(nouvtr)
99 integer tritet(nouvtf,4), cotrte(nouvtf,4)
100 integer hettet(nouvte), filtet(nouvte), pertet(nouvte)
101 integer famare(nouvar), famtri(nouvtr), famtet(nouvte)
102 integer indare, indtri, indtet
104 integer ulsort, langue, codret
106 c 0.4. ==> variables locales
108 integer adiag, dt, etat, letetr, nudiag, pere, typdia
109 integer niveau, cf1, cf2, cf3, cf4, f1, f2, f3, f4
110 integer codefa, codef1, codef2, codef3, codef4
111 integer a4ff1, a5ff1, a6ff1, a2ff2, a3ff2, a6ff2
112 integer a1ff3, a3ff3, a5ff3, a1ff4, a2ff4, a4ff4
113 integer as1n1, as1n2, as1n3, as2n4, as2n5, as3n6
114 integer ff1, ff2, ff3, ff4, n1, n2, n3, n4, n5, n6
115 integer f4ff1, f5ff1, f6ff1, f2ff2, f3ff2, f6ff2
116 integer f1ff3, f3ff3, f5ff3, f1ff4, f2ff4, f4ff4
117 integer fparf1, fparf2, fparf3, fparf4
118 integer fd16n2, fd16n3, fd16n4, fd16n5
119 integer fd25n1, fd25n3, fd25n4, fd25n6
120 integer fd34n1, fd34n2, fd34n5, fd34n6
121 integer tparf1, tparf2, tparf3, tparf4
122 integer t16ff1, t16ff2, t16ff3, t16ff4
123 integer t25ff1, t25ff2, t25ff3, t25ff4
124 integer t34ff1, t34ff2, t34ff3, t34ff4
128 double precision long16, long25, long34, xdiag, ydiag, zdiag
131 parameter ( nbmess = 10 )
132 character*80 texte(nblang,nbmess)
134 c 0.5. ==> initialisations
135 c ______________________________________________________________________
145 #ifdef _DEBUG_HOMARD_
146 write (ulsort,texte(langue,1)) 'Entree', nompro
150 texte(1,4) = '(''Decoupage du '',a,i10)'
152 texte(2,4) = '(''Splitting of '',a,'' #'',i10)'
155 c 2. decoupage en 8 des tetraedres dont les 4 faces sont coupees en 4
158 do 200 , letetr = 1 , nbtepe
160 if ( mod( hettet(letetr) , 100 ) .eq. 0 ) then
166 jaux = tritet(letetr,iaux)
167 if ( mod(hettri(jaux),10).eq.4 .or.
168 > mod(hettri(jaux),10).eq.5 .or.
169 > mod(hettri(jaux),10).eq.6 .or.
170 > mod(hettri(jaux),10).eq.7 .or.
171 > mod(hettri(jaux),10).eq.9) then
177 #ifdef _DEBUG_HOMARD_
178 write (ulsort,texte(langue,4)) mess14(langue,1,3), letetr
181 c 2.2. ==> description des 4 faces du tetraedre
183 c 2.2.1. ==> description de la face 1
185 f1 = tritet(letetr,1)
186 cf1 = cotrte(letetr,1)
188 c 2.2.1.1. ==> reperage des 4 triangles fils
191 f4ff1 = ff1 + i1(cf1)
192 f5ff1 = ff1 + i2(cf1)
193 f6ff1 = ff1 + i3(cf1)
195 c 2.2.1.2. ==> reperage des 3 aretes internes
197 a4ff1 = aretri(ff1,i1(cf1))
198 a5ff1 = aretri(ff1,i2(cf1))
199 a6ff1 = aretri(ff1,i3(cf1))
201 c 2.2.2. ==> description de la face 2
203 f2 = tritet(letetr,2)
204 cf2 = cotrte(letetr,2)
206 c 2.2.2.1. ==> reperage des 4 triangles fils
209 f2ff2 = ff2 + i1(cf2)
210 f3ff2 = ff2 + i2(cf2)
211 f6ff2 = ff2 + i3(cf2)
213 c 2.2.2.2. ==> reperage des 3 aretes internes
215 a2ff2 = aretri(ff2,i1(cf2))
216 a3ff2 = aretri(ff2,i2(cf2))
217 a6ff2 = aretri(ff2,i3(cf2))
219 c 2.2.3. ==> description de la face 3
221 f3 = tritet(letetr,3)
222 cf3 = cotrte(letetr,3)
224 c 2.2.3.1. ==> reperage des 4 triangles fils
227 f1ff3 = ff3 + i1(cf3)
228 f3ff3 = ff3 + i2(cf3)
229 f5ff3 = ff3 + i3(cf3)
231 c 2.2.3.2. ==> reperage des 3 aretes internes
233 a1ff3 = aretri(ff3,i1(cf3))
234 a3ff3 = aretri(ff3,i2(cf3))
235 a5ff3 = aretri(ff3,i3(cf3))
237 c 2.2.4. ==> description de la face 4
239 f4 = tritet(letetr,4)
240 cf4 = cotrte(letetr,4)
242 c 2.2.4.1. ==> reperage des 4 triangles fils
245 f1ff4 = ff4 + i1(cf4)
246 f2ff4 = ff4 + i2(cf4)
247 f4ff4 = ff4 + i3(cf4)
249 c 2.2.4.2. ==> reperage des 3 aretes internes
251 a1ff4 = aretri(ff4,i1(cf4))
252 a2ff4 = aretri(ff4,i2(cf4))
253 a4ff4 = aretri(ff4,i3(cf4))
255 c 2.3. ==> reperage des noeuds milieux des aretes
257 as1n1 = aretri(f5ff3,i1(cf3))
258 as1n2 = aretri(f6ff2,i1(cf2))
259 as1n3 = aretri(f6ff2,i2(cf2))
260 as2n4 = aretri(f6ff1,i1(cf1))
261 as2n5 = aretri(f6ff1,i2(cf1))
262 as3n6 = aretri(f5ff1,i3(cf1))
271 c 2.4. ==> calcul des longueurs des diagonales et choix
274 xdiag = coonoe(n1,1) - coonoe(n6,1)
275 ydiag = coonoe(n1,2) - coonoe(n6,2)
276 zdiag = coonoe(n1,3) - coonoe(n6,3)
277 long16 = xdiag * xdiag + ydiag * ydiag + zdiag * zdiag
278 xdiag = coonoe(n2,1) - coonoe(n5,1)
279 ydiag = coonoe(n2,2) - coonoe(n5,2)
280 zdiag = coonoe(n2,3) - coonoe(n5,3)
281 long25 = xdiag * xdiag + ydiag * ydiag + zdiag * zdiag
282 xdiag = coonoe(n3,1) - coonoe(n4,1)
283 ydiag = coonoe(n3,2) - coonoe(n4,2)
284 zdiag = coonoe(n3,3) - coonoe(n4,3)
285 long34 = xdiag * xdiag + ydiag * ydiag + zdiag * zdiag
287 if ( long16 .le. long25 ) then
288 if ( long16 .le. long34 ) then
296 if ( long25 .le. long34 ) then
305 c 2.5. ==> creation de l'arete diagonale
310 if ( nudiag .eq. 16 ) then
311 somare(1,adiag) = min ( n1 , n6 )
312 somare(2,adiag) = max ( n1 , n6 )
313 elseif ( nudiag .eq. 25 ) then
314 somare(1,adiag) = min ( n2 , n5 )
315 somare(2,adiag) = max ( n2 , n5 )
317 somare(1,adiag) = min ( n3 , n4 )
318 somare(2,adiag) = max ( n3 , n4 )
327 c 2.6. ==> creation des faces
329 c 2.6.1. ==> recuperation du niveau commun a tous les triangles fils
333 c 2.6.2. ==> creation des 4 faces d'angle
336 call cmctri ( aretri, famtri, hettri,
337 > filtri, pertri, nivtri,
338 > fparf1, a4ff4, a5ff3, a6ff2,
342 call cmctri ( aretri, famtri, hettri,
343 > filtri, pertri, nivtri,
344 > fparf2, a2ff4, a3ff3, a6ff1,
348 call cmctri ( aretri, famtri, hettri,
349 > filtri, pertri, nivtri,
350 > fparf3, a1ff4, a3ff2, a5ff1,
354 call cmctri ( aretri, famtri, hettri,
355 > filtri, pertri, nivtri,
356 > fparf4, a1ff3, a2ff2, a4ff1,
359 c 2.6.3 ==> creation des 4 faces internes en fonction de la diagonale
361 c tous ces triangles sont crees avec le code arbitraire 1
362 c et avec le meme niveau que les nouvelles 4 faces d'angle
366 if ( nudiag .eq. 16 ) then
369 call cmctri ( aretri, famtri, hettri,
370 > filtri, pertri, nivtri,
371 > fd16n2, adiag, a3ff2, a4ff4,
375 call cmctri ( aretri, famtri, hettri,
376 > filtri, pertri, nivtri,
377 > fd16n3, adiag, a2ff2, a5ff3,
381 call cmctri ( aretri, famtri, hettri,
382 > filtri, pertri, nivtri,
383 > fd16n4, adiag, a2ff4, a5ff1,
387 call cmctri ( aretri, famtri, hettri,
388 > filtri, pertri, nivtri,
389 > fd16n5, adiag, a3ff3, a4ff1,
394 elseif ( nudiag .eq. 25 ) then
397 call cmctri ( aretri, famtri, hettri,
398 > filtri, pertri, nivtri,
399 > fd25n1, adiag, a3ff3, a4ff4,
403 call cmctri ( aretri, famtri, hettri,
404 > filtri, pertri, nivtri,
405 > fd25n3, a1ff3, adiag, a6ff2,
409 call cmctri ( aretri, famtri, hettri,
410 > filtri, pertri, nivtri,
411 > fd25n4, adiag, a1ff4, a6ff1,
415 call cmctri ( aretri, famtri, hettri,
416 > filtri, pertri, nivtri,
417 > fd25n6, a3ff2, adiag, a4ff1,
425 call cmctri ( aretri, famtri, hettri,
426 > filtri, pertri, nivtri,
427 > fd34n1, adiag, a5ff3, a2ff4,
431 call cmctri ( aretri, famtri, hettri,
432 > filtri, pertri, nivtri,
433 > fd34n2, adiag, a1ff4, a6ff2,
437 call cmctri ( aretri, famtri, hettri,
438 > filtri, pertri, nivtri,
439 > fd34n5, a1ff3, adiag, a6ff1,
443 call cmctri ( aretri, famtri, hettri,
444 > filtri, pertri, nivtri,
445 > fd34n6, a2ff2, adiag, a5ff1,
452 c 2.7. ==> creation des tetraedres
454 iaux = famtet(letetr)
456 c 2.7.1. ==> creation des 4 tetraedres d'angle
459 call cmctet ( tritet, cotrte, famtet,
460 > hettet, filtet, pertet,
461 > fparf1, f6ff2, f5ff3, f4ff4,
462 > cf1, cf2, cf3, cf4,
463 > letetr, iaux, tparf1 )
466 call cmctet ( tritet, cotrte, famtet,
467 > hettet, filtet, pertet,
468 > f6ff1, fparf2, f3ff3, f2ff4,
469 > cf1, cf2, cf3, cf4,
470 > letetr, iaux, tparf2 )
473 call cmctet ( tritet, cotrte, famtet,
474 > hettet, filtet, pertet,
475 > f5ff1, f3ff2, fparf3, f1ff4,
476 > cf1, cf2, cf3, cf4,
477 > letetr, iaux, tparf3 )
480 call cmctet ( tritet, cotrte, famtet,
481 > hettet, filtet, pertet,
482 > f4ff1, f2ff2, f1ff3, fparf4,
483 > cf1, cf2, cf3, cf4,
484 > letetr, iaux, tparf4 )
486 c 2.7.2. ==> creation des 4 tetraedres internes en fonction
489 if ( nudiag .eq. 16 ) then
496 call cmctet ( tritet, cotrte, famtet,
497 > hettet, filtet, pertet,
498 > ff1, fparf2, fd16n4, fd16n5,
499 > codef1, codef2, codef3, codef4,
500 > letetr, iaux, t16ff1 )
507 call cmctet ( tritet, cotrte, famtet,
508 > hettet, filtet, pertet,
509 > fd16n3, fd16n5, ff3, fparf4,
510 > codef1, codef2, codef3, codef4,
511 > letetr, iaux, t16ff3 )
518 call cmctet ( tritet, cotrte, famtet,
519 > hettet, filtet, pertet,
520 > fparf1, ff2, fd16n2, fd16n3,
521 > codef1, codef2, codef3, codef4,
522 > letetr, iaux, t16ff2 )
529 call cmctet ( tritet, cotrte, famtet,
530 > hettet, filtet, pertet,
531 > fd16n2, fd16n4, fparf3, ff4,
532 > codef1, codef2, codef3, codef4,
533 > letetr, iaux, t16ff4 )
537 elseif ( nudiag .eq. 25 ) then
544 call cmctet ( tritet, cotrte, famtet,
545 > hettet, filtet, pertet,
546 > ff1, fd25n4, fparf3, fd25n6,
547 > codef1, codef2, codef3, codef4,
548 > letetr, iaux, t25ff1 )
555 call cmctet ( tritet, cotrte, famtet,
556 > hettet, filtet, pertet,
557 > fd25n3, ff2, fd25n6, fparf4,
558 > codef1, codef2, codef3, codef4,
559 > letetr, iaux, t25ff2 )
566 call cmctet ( tritet, cotrte, famtet,
567 > hettet, filtet, pertet,
568 > fparf1, fd25n1, ff3, fd25n3,
569 > codef1, codef2, codef3, codef4,
570 > letetr, iaux, t25ff3 )
577 call cmctet ( tritet, cotrte, famtet,
578 > hettet, filtet, pertet,
579 > fd25n1, fparf2, fd25n4, ff4,
580 > codef1, codef2, codef3, codef4,
581 > letetr, iaux, t25ff4 )
592 call cmctet ( tritet, cotrte, famtet,
593 > hettet, filtet, pertet,
594 > ff1, fd34n5, fd34n6, fparf4,
595 > codef1, codef2, codef3, codef4,
596 > letetr, iaux, t34ff1 )
603 call cmctet ( tritet, cotrte, famtet,
604 > hettet, filtet, pertet,
605 > fd34n2, ff2, fparf3, fd34n6,
606 > codef1, codef2, codef3, codef4,
607 > letetr, iaux, t34ff2 )
614 call cmctet ( tritet, cotrte, famtet,
615 > hettet, filtet, pertet,
616 > fparf1, fd34n1, fd34n2, ff4,
617 > codef1, codef2, codef3, codef4,
618 > letetr, iaux, t34ff4 )
625 call cmctet ( tritet, cotrte, famtet,
626 > hettet, filtet, pertet,
627 > fd34n1, fparf2, ff3, fd34n5,
628 > codef1, codef2, codef3, codef4,
629 > letetr, iaux, t34ff3 )
635 c 2.7.3. ==> mise a jour du tetredre courant et de son pere eventuel
637 filtet(letetr) = tparf1
638 hettet(letetr) = hettet(letetr) + 80 + typdia
639 pere = pertet(letetr)
640 if ( pere .ne. 0 ) then
642 hettet(pere) = etat - mod(etat,100) + 99
655 if ( codret.ne.0 ) then
659 write (ulsort,texte(langue,1)) 'Sortie', nompro
660 write (ulsort,texte(langue,2)) codret
664 #ifdef _DEBUG_HOMARD_
665 write (ulsort,texte(langue,1)) 'Sortie', nompro