1 subroutine cmchfa ( facdec, cofdec, facnde, cofnde,
4 > trifad, cotrvo, areqtr,
6 > somare, aretri, nivtri,
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 - Conformite - decoupage des Hexaedres
33 c - par 1 Face - utilitaire A
35 c ______________________________________________________________________
37 c . nom . e/s . taille . description .
38 c .____________________________________________________________________.
39 c . facnde . s . 1 . numero global de la face non decoupee .
40 c . cofnde . s . 1 . code de la face non decoupee dans l'hexa. .
41 c . facdec . s . 1 . numero global de la face decoupee .
42 c . cofdec . s . 1 . code de la face decoupee dans l'hexaedre .
43 c . niveau . s . 1 . niveau des triangle de conformite des faces.
44 c . noefac . s . 1 . noeud central de la face decoupee en 4 .
45 c . quabas . s . 4 . quadrangles fils de la face coupee en 4 .
46 c . . . . quabas(p) = base de la pyramide fille p .
47 c . arefad . s . 4 . aretes tracees sur la face coupee en 4 .
48 c . . . . arefad(p) est l'arete commune aux pyramides.
49 c . . . . filles numero p et p+1 .
50 c . trifad . s .(4,0:2) . triangles sur les faces de conformite .
51 c . . . . trifad(p,0) : triangle central du decoupage.
52 c . . . . trifad(p,1) : tria. bordant la pyramide p .
53 c . . . . trifad(p,2) : tria. bordant la pyramide p+1.
54 c . cotrvo . s .(4,0:2) . futur codes des triangles trifad dans la .
55 c . . . . description des tetraedres .
56 c . areqtr . s . (4,2) . arete interne au quadrangle de bord et .
57 c . . . . bordant le triangle trifad(p,i) .
58 c . lehexa . e . 1 . numero global d'hexaedre .
59 c . nulofa . e . 1 . numero local de la face couppe en 4 .
60 c . somare . e .2*nouvar. numeros des extremites d'arete .
61 c . aretri . e .nouvtr*3. numeros des 3 aretes des triangles .
62 c . nivtri . e . nouvtr . niveau des triangles .
63 c . arequa . e .nouvqu*4. numeros des 4 aretes des quadrangles .
64 c . filqua . e . nouvqu . premier fils des quadrangles .
65 c . quahex . e .nouvhf*6. numeros des 6 quadrangles des hexaedres .
66 c . coquhe . e .nouvhf*6. codes des 6 quadrangles des hexaedres .
67 c . tabaux . e . 4 . numeros locaux des faces coupees en 3, .
68 c . . . . dans l'ordre des pyramides p/p1+1 .
69 c . ulsort . e . 1 . unite logique de la sortie generale .
70 c . langue . e . 1 . langue des messages .
71 c . . . . 1 : francais, 2 : anglais .
72 c . codret . es . 1 . code de retour des modules .
73 c . . . . 0 : pas de probleme .
74 c . . . . 1 : aucune face ne correspond .
75 c ______________________________________________________________________
78 c 0. declarations et dimensionnement
81 c 0.1. ==> generalites
87 parameter ( nompro = 'CMCHFA' )
101 integer facdec, cofdec, facnde, cofnde
102 integer niveau, noefac
104 integer arefad(4), areqtr(4,2)
105 integer trifad(4,0:2), cotrvo(4,0:2)
106 integer lehexa, nulofa
107 integer somare(2,nouvar)
108 integer aretri(nouvtr,3), nivtri(nouvtr)
109 integer arequa(nouvqu,4), filqua(nouvqu)
110 integer quahex(nouvhf,6), coquhe(nouvhf,6)
113 integer ulsort, langue, codret
115 c 0.4. ==> variables locales
117 integer iaux, jaux, kaux
120 parameter ( nbmess = 10 )
121 character*80 texte(nblang,nbmess)
123 c 0.5. ==> initialisations
124 c ______________________________________________________________________
132 #ifdef _DEBUG_HOMARD_
133 write (ulsort,texte(langue,1)) 'Entree', nompro
137 #ifdef _DEBUG_HOMARD_
138 1789 format(5(a,i5,', '))
139 1792 format(2(a,i1,a,i5,', '))
145 c 2. La face coupee en 4 et son code dans l'hexaedre
146 c La face non coupee et son code dans l'hexaedre
149 facdec = quahex(lehexa,nulofa)
150 cofdec = coquhe(lehexa,nulofa)
151 facnde = quahex(lehexa,coen07(nulofa))
152 cofnde = coquhe(lehexa,coen07(nulofa))
153 #ifdef _DEBUG_HOMARD_
154 write(ulsort,1789) 'facdec = ', facdec, 'cofdec = ', cofdec
155 write(ulsort,1789) 'facnde = ', facnde, 'cofnde = ', cofnde
159 c 3. Noeud central de la face coupee en 4
162 iaux = filqua(facdec)
163 noefac = somare(2,arequa(iaux,2))
164 #ifdef _DEBUG_HOMARD_
165 write(ulsort,1789) 'noefac = ', noefac
169 c 4. Quadrangles fils de la face coupee en 4
170 c quabas(p) est la base de la pyramide fille numero p
171 c filqua(facdec) + defiqJ(cofdec) : J-eme fils du quadrangle
172 c Attention : la regle de numerotation locale des quadrangles quabas
173 c est celle des pyramides ; on part du sommet de plus
174 c petit numero local et on tourne en entrant dans
175 c l'hexaedre. Pour les fils du quadrangle, on part de la
176 c plus petite arete locale et on tourne dans le meme sens
177 c D'ou l'eventuel decalage selon les faces
180 #ifdef _DEBUG_HOMARD_
181 write(ulsort,1789) 'defiq1 = ', defiq1(cofdec)
182 write(ulsort,1789) 'defiq2 = ', defiq2(cofdec)
183 write(ulsort,1789) 'defiq3 = ', defiq3(cofdec)
184 write(ulsort,1789) 'defiq4 = ', defiq4(cofdec)
186 if ( nulofa.eq.1 .or. nulofa.eq.3 .or. nulofa.eq.6 ) then
187 quabas(1) = filqua(facdec) + defiq2(cofdec)
188 quabas(2) = filqua(facdec) + defiq3(cofdec)
189 quabas(3) = filqua(facdec) + defiq4(cofdec)
190 quabas(4) = filqua(facdec) + defiq1(cofdec)
192 quabas(1) = filqua(facdec) + defiq1(cofdec)
193 quabas(2) = filqua(facdec) + defiq2(cofdec)
194 quabas(3) = filqua(facdec) + defiq3(cofdec)
195 quabas(4) = filqua(facdec) + defiq4(cofdec)
197 #ifdef _DEBUG_HOMARD_
198 write(ulsort,1789) 'Fils aine = ', filqua(facdec)
199 write(ulsort,1789) 'quabas(1) = ', quabas(1),
200 > 'arete 1 = ', arequa(quabas(1),1),
201 > ' de ',somare(1,arequa(quabas(1),1)),
202 > ' a ',somare(2,arequa(quabas(1),1))
203 write(ulsort,1789) 'quabas(2) = ', quabas(2),
204 > 'arete 1 = ', arequa(quabas(2),1),
205 > ' de ',somare(1,arequa(quabas(2),1)),
206 > ' a ',somare(2,arequa(quabas(2),1))
207 write(ulsort,1789) 'quabas(3) = ', quabas(3),
208 > 'arete 1 = ', arequa(quabas(3),1),
209 > ' de ',somare(1,arequa(quabas(3),1)),
210 > ' a ',somare(2,arequa(quabas(3),1))
211 write(ulsort,1789) 'quabas(4) = ', quabas(4),
212 > 'arete 1 = ', arequa(quabas(4),1),
213 > ' de ',somare(1,arequa(quabas(4),1)),
214 > ' a ',somare(2,arequa(quabas(4),1))
218 c 5. Aretes tracees sur la face coupee en 4
219 c arefad(p) est l'arete commune aux pyramides filles numero p et p+1
222 if ( cofdec.lt.5 ) then
223 arefad(1) = arequa(quabas(1),2)
224 arefad(2) = arequa(quabas(2),2)
225 arefad(3) = arequa(quabas(3),2)
226 arefad(4) = arequa(quabas(4),2)
228 arefad(1) = arequa(quabas(2),2)
229 arefad(2) = arequa(quabas(3),2)
230 arefad(3) = arequa(quabas(4),2)
231 arefad(4) = arequa(quabas(1),2)
233 #ifdef _DEBUG_HOMARD_
234 write(ulsort,1789) 'arefad(1) = ', arefad(1),
235 > ' de ',somare(1,arefad(1)),
236 > ' a ',somare(2,arefad(1))
238 > 'arefad(2) = ', arefad(2),
239 > ' de ',somare(1,arefad(2)),
240 > ' a ',somare(2,arefad(2))
242 > 'arefad(3) = ', arefad(3),
243 > ' de ',somare(1,arefad(3)),
244 > ' a ',somare(2,arefad(3))
246 > 'arefad(4) = ', arefad(4),
247 > ' de ',somare(1,arefad(4)),
248 > ' a ',somare(2,arefad(4))
252 c 6. Triangles et aretes tracees sur les faces coupees en 3
253 c Chaque quadrangle de bord qui est decoupe en 3 triangles
254 c borde deux pyramides consecutives : p et p+1
255 c trifad(p,0) : triangle central de ce decoupage
256 c trifad(p,1) : triangle bordant la pyramide p
257 c trifad(p,2) : triangle bordant la pyramide p+1
258 c cotrvo(p,0) : futur code du triangle trifad(p,0) dans la
259 c description du tetraedre p
260 c cotrvo(p,1) : futur code du triangle trifad(p,1) dans la
261 c description de la pyramide p
262 c cotrvo(p,2) : futur code du triangle trifad(p,2) dans la
263 c description de la pyramide p+1
264 c areqtr(p,1) : arete interne au quadrangle de bord et bordant le
265 c triangle trifad(p,1)
266 c areqtr(p,2) : arete interne au quadrangle de bord et bordant le
267 c triangle trifad(p,2)
271 jaux = quahex(lehexa,tabaux(iaux))
272 kaux = coquhe(lehexa,tabaux(iaux))
273 trifad(iaux,0) = -filqua(jaux)
274 if ( kaux.lt.5 ) then
276 trifad(iaux,1) = trifad(iaux,0) + 1
278 trifad(iaux,2) = trifad(iaux,0) + 2
280 areqtr(iaux,1) = aretri(trifad(iaux,0),1)
281 areqtr(iaux,2) = aretri(trifad(iaux,0),3)
284 trifad(iaux,1) = trifad(iaux,0) + 2
286 trifad(iaux,2) = trifad(iaux,0) + 1
288 areqtr(iaux,1) = aretri(trifad(iaux,0),3)
289 areqtr(iaux,2) = aretri(trifad(iaux,0),1)
291 #ifdef _DEBUG_HOMARD_
293 write(ulsort,1789) 'face = ', jaux,', code = ', kaux
294 write(ulsort,1792) 'trifad(',iaux,',0) = ', trifad(iaux,0)
295 write(ulsort,1792) 'trifad(',iaux,',1) = ', trifad(iaux,1),
296 > 'trifad(',iaux,',2) = ', trifad(iaux,2)
297 write(ulsort,1792) 'cotrvo(',iaux,',0) = ', cotrvo(iaux,0),
298 > 'cotrvo(',iaux,',1) = ', cotrvo(iaux,1),
299 > 'cotrvo(',iaux,',2) = ', cotrvo(iaux,2)
300 write(ulsort,1789) 'areqtr(',iaux,'1) = ', areqtr(iaux,1),
301 > ' de ',somare(1,areqtr(iaux,1)),
302 > ' a ',somare(2,areqtr(iaux,1))
303 write(ulsort,1789) 'areqtr(',iaux,'2) = ', areqtr(iaux,2),
304 > ' de ',somare(1,areqtr(iaux,2)),
305 > ' a ',somare(2,areqtr(iaux,2))
310 c 7. niveau = niveau des quadrangles des conformites des faces
313 niveau = nivtri(trifad(1,0))
314 #ifdef _DEBUG_HOMARD_
315 write(ulsort,1789) 'niveau = ', niveau
322 if ( codret.ne.0 ) then
326 write (ulsort,texte(langue,1)) 'Sortie', nompro
327 write (ulsort,texte(langue,2)) codret
331 #ifdef _DEBUG_HOMARD_
332 write (ulsort,texte(langue,1)) 'Sortie', nompro