1 subroutine cmchak ( nulofa, lehexa,
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 - Conformite - decoupage des Hexaedres
31 c - par 3 Aretes - phase K
33 c Remarque : cmchaa, cmchak et cmchal sont des clones
34 c cmchak et cmchal sont symetriques
35 c ______________________________________________________________________
37 c . nom . e/s . taille . description .
38 c .____________________________________________________________________.
39 c . nulofa . e . 6 . numero local des faces a traiter .
40 c . lehexa . e . 1 . hexaedre a decouper .
41 c . somare . es .2*nouvar. numeros des extremites d'arete .
42 c . aretri . es .nouvtr*3. numeros des 3 aretes des triangles .
43 c . nivtri . es . nouvtr . niveau des triangles .
44 c . filqua . e . nouvqu . premier fils des quadrangles .
45 c . quahex . e .nouvhf*6. numeros des 6 quadrangles des hexaedres .
46 c . coquhe . e .nouvhf*6. codes des 6 quadrangles des hexaedres .
47 c . niveau . s . 1 . niveau des faces issus du decoupage .
48 c . areqtr . s . (6,2) . aretes tracees sur les faces decoupees .
49 c . trifad . s .(6,0:2) . triangles traces sur les faces decoupees .
50 c . cotrvo . s .(6,0:2) . code des triangles dans les volumes .
51 c . ulsort . e . 1 . unite logique de la sortie generale .
52 c . langue . e . 1 . langue des messages .
53 c . . . . 1 : francais, 2 : anglais .
54 c . codret . es . 1 . code de retour des modules .
55 c . . . . 0 : pas de probleme .
56 c . . . . 1 : aucune arete ne correspond .
57 c ______________________________________________________________________
60 c 0. declarations et dimensionnement
63 c 0.1. ==> generalites
69 parameter ( nompro = 'CMCHAK' )
81 integer lehexa, nulofa(6)
82 integer somare(2,nouvar)
83 integer aretri(nouvtr,3), nivtri(nouvtr)
84 integer filqua(nouvqu)
85 integer quahex(nouvhf,6), coquhe(nouvhf,6)
88 integer trifad(6,0:2), cotrvo(6,0:2)
90 integer ulsort, langue, codret
92 c 0.4. ==> variables locales
97 parameter ( nbmess = 10 )
98 character*80 texte(nblang,nbmess)
100 c 0.5. ==> initialisations
101 c ______________________________________________________________________
109 #ifdef _DEBUG_HOMARD_
110 write (ulsort,texte(langue,1)) 'Entree', nompro
114 #ifdef _DEBUG_HOMARD_
115 1789 format(5(a,i5,', '))
121 c 2. Triangles et aretes tracees sur les faces coupees en 3
122 c On traite les faces de l'hexaedre coupees en 3 comme suit :
123 c . La 1ere et la 2eme partagent la 1ere arete coupee.
124 c La 1ere face est celle qui n'a pas de point commun
125 c avec la 2eme arete coupee.
126 c . La 3eme et la 4eme partagent la 2nde arete coupee.
127 c La 3eme face est celle qui n'a pas de point commun
128 c avec la 3eme arete coupee.
129 c . La 5eme et la 6eme partagent la 3eme arete coupee.
130 c La 5eme face est celle qui n'a pas de point commun
131 c avec la 1ere arete coupee.
132 c On traite les sommets de l'hexaedre comme suit :
133 c . le 1er et le 2eme sommet sont les extremites de la 1ere
134 c arete coupee ; le 1er est celui appartenant a
136 c . le 3eme et le 4eme sommet sont les extremites de la 2eme
137 c arete coupee ; le 3eme est celui appartenant a
139 c . le 5eme et le 6eme sommet sont les extremites de la 3eme
140 c arete coupee ; le 5eme est celui appartenant a
142 c . le 7eme sommet est le dernier sommet de la 1ere face
143 c . le 8eme sommet est le dernier sommet de la 2eme face
144 c Sur la p-eme face :
145 c trifad(p,0) : triangle central de ce decoupage
146 c trifad(p,1) : triangle bordant l'arete non decoupee du cote du
147 c sommet de plus petit numero dans lesnoe
148 c trifad(p,2) : triangle bordant l'arete non decoupee du cote du
149 c sommet de grand petit numero dans lesnoe
150 c cotrvo(p,0/1/2) : futur code du triangle trifad(p,0/1/2) dans la
151 c description du tetraedre voisin
152 c areqtr(p,1) : arete interne au quadrangle de bord et bordant le
153 c triangle trifad(p,1)
154 c areqtr(p,2) : arete interne au quadrangle de bord et bordant le
155 c triangle trifad(p,2)
159 c trifad(1,0) = triangle central de la face 1 : FFi
160 c trifad(1,1) = triangle de la face 1 vers le sommet 1 : FFi + 2/1
161 c trifad(1,2) = triangle de la face 1 de l'autre cote : FFi + 1/2
164 iaux = quahex(lehexa,nulofa(1))
165 jaux = coquhe(lehexa,nulofa(1))
166 trifad(1,0) = -filqua(iaux)
167 if ( jaux.lt.5 ) then
169 trifad(1,2) = trifad(1,0) + 2
171 trifad(1,1) = trifad(1,0) + 1
173 areqtr(1,2) = aretri(trifad(1,0),3)
174 areqtr(1,1) = aretri(trifad(1,0),1)
177 trifad(1,2) = trifad(1,0) + 1
179 trifad(1,1) = trifad(1,0) + 2
181 areqtr(1,2) = aretri(trifad(1,0),1)
182 areqtr(1,1) = aretri(trifad(1,0),3)
184 #ifdef _DEBUG_HOMARD_
185 write(ulsort,*) 'Face 1'
186 write(ulsort,1789) 'laface = ', iaux,'coface = ', jaux
187 write(ulsort,1789) 'trifad(1,0) = ', trifad(1,0),
188 > 'trifad(1,1) = ', trifad(1,1),
189 > 'trifad(1,2) = ', trifad(1,2)
190 write(ulsort,1789) 'cotrvo(1,0) = ', cotrvo(1,0),
191 > 'cotrvo(1,1) = ', cotrvo(1,1),
192 > 'cotrvo(1,2) = ', cotrvo(1,2)
193 write(ulsort,1789) 'areqtr(1,1) = ', areqtr(1,1),
194 > ' de ',somare(1,areqtr(1,1)),
195 > ' a ',somare(2,areqtr(1,1))
196 write(ulsort,1789) 'areqtr(1,2) = ', areqtr(1,2),
197 > ' de ',somare(1,areqtr(1,2)),
198 > ' a ',somare(2,areqtr(1,2))
202 c trifad(2,0) = triangle central de la face 2 : FFi
203 c trifad(2,1) = triangle de la face 2 vers le sommet 1 : FFi + 1/2
204 c trifad(2,2) = triangle de la face 2 de l'autre cote : FFi + 2/1
207 iaux = quahex(lehexa,nulofa(2))
208 jaux = coquhe(lehexa,nulofa(2))
209 trifad(2,0) = -filqua(iaux)
210 if ( jaux.lt.5 ) then
212 trifad(2,2) = trifad(2,0) + 1
214 trifad(2,1) = trifad(2,0) + 2
216 areqtr(2,2) = aretri(trifad(2,0),1)
217 areqtr(2,1) = aretri(trifad(2,0),3)
220 trifad(2,2) = trifad(2,0) + 2
222 trifad(2,1) = trifad(2,0) + 1
224 areqtr(2,2) = aretri(trifad(2,0),3)
225 areqtr(2,1) = aretri(trifad(2,0),1)
227 #ifdef _DEBUG_HOMARD_
228 write(ulsort,*) 'Face 2'
229 write(ulsort,1789) 'laface = ', iaux,'coface = ', jaux
230 write(ulsort,1789) 'trifad(2,0) = ', trifad(2,0),
231 > 'trifad(2,1) = ', trifad(2,1),
232 > 'trifad(2,2) = ', trifad(2,2)
233 write(ulsort,1789) 'cotrvo(2,0) = ', cotrvo(2,0),
234 > 'cotrvo(2,1) = ', cotrvo(2,1),
235 > 'cotrvo(2,2) = ', cotrvo(2,2)
236 write(ulsort,1789) 'areqtr(2,1) = ', areqtr(2,1),
237 > ' de ',somare(1,areqtr(2,1)),
238 > ' a ',somare(2,areqtr(2,1))
239 write(ulsort,1789) 'areqtr(2,2) = ', areqtr(2,2),
240 > ' de ',somare(1,areqtr(2,2)),
241 > ' a ',somare(2,areqtr(2,2))
245 c trifad(3,0) = triangle central de la face 3 : FFi
246 c trifad(3,1) = triangle de la face 3 vers le sommet 3 : FFi + 1/2
247 c trifad(3,2) = triangle de la face 3 de l'autre cote : FFi + 2/1
250 iaux = quahex(lehexa,nulofa(3))
251 jaux = coquhe(lehexa,nulofa(3))
252 trifad(3,0) = -filqua(iaux)
253 if ( jaux.lt.5 ) then
255 trifad(3,2) = trifad(3,0) + 2
257 trifad(3,1) = trifad(3,0) + 1
259 areqtr(3,2) = aretri(trifad(3,0),3)
260 areqtr(3,1) = aretri(trifad(3,0),1)
263 trifad(3,2) = trifad(3,0) + 1
265 trifad(3,1) = trifad(3,0) + 2
267 areqtr(3,2) = aretri(trifad(3,0),1)
268 areqtr(3,1) = aretri(trifad(3,0),3)
270 #ifdef _DEBUG_HOMARD_
271 write(ulsort,*) 'Face 3'
272 write(ulsort,1789) 'laface = ', iaux,'coface = ', jaux
273 write(ulsort,1789) 'trifad(3,0) = ', trifad(3,0),
274 > 'trifad(3,1) = ', trifad(3,1),
275 > 'trifad(3,2) = ', trifad(3,2)
276 write(ulsort,1789) 'cotrvo(3,0) = ', cotrvo(3,0),
277 > 'cotrvo(3,1) = ', cotrvo(3,1),
278 > 'cotrvo(3,2) = ', cotrvo(3,2)
279 write(ulsort,1789) '1 = ', aretri(trifad(3,0),1),
280 > '2 = ', aretri(trifad(3,0),2),
281 > '3 = ', aretri(trifad(3,0),3)
282 write(ulsort,1789) '1 = ', aretri(trifad(3,1),1),
283 > '2 = ', aretri(trifad(3,1),2),
284 > '3 = ', aretri(trifad(3,1),3)
285 write(ulsort,1789) '1 = ', aretri(trifad(3,2),1),
286 > '2 = ', aretri(trifad(3,2),2),
287 > '3 = ', aretri(trifad(3,2),3)
288 write(ulsort,1789) 'areqtr(3,1) = ', areqtr(3,1),
289 > ' de ',somare(1,areqtr(3,1)),
290 > ' a ',somare(2,areqtr(3,1))
291 write(ulsort,1789) 'areqtr(3,2) = ', areqtr(3,2),
292 > ' de ',somare(1,areqtr(3,2)),
293 > ' a ',somare(2,areqtr(3,2))
297 c trifad(4,0) = triangle central de la face 4 : FFi
298 c trifad(4,1) = triangle de la face 4 vers le sommet 3 : FFi + 1/2
299 c trifad(4,2) = triangle de la face 4 de l'autre cote : FFi + 2/1
302 iaux = quahex(lehexa,nulofa(4))
303 jaux = coquhe(lehexa,nulofa(4))
304 trifad(4,0) = -filqua(iaux)
305 if ( jaux.lt.5 ) then
307 trifad(4,2) = trifad(4,0) + 1
309 trifad(4,1) = trifad(4,0) + 2
311 areqtr(4,2) = aretri(trifad(4,0),1)
312 areqtr(4,1) = aretri(trifad(4,0),3)
315 trifad(4,2) = trifad(4,0) + 2
317 trifad(4,1) = trifad(4,0) + 1
319 areqtr(4,2) = aretri(trifad(4,0),3)
320 areqtr(4,1) = aretri(trifad(4,0),1)
322 #ifdef _DEBUG_HOMARD_
323 write(ulsort,*) 'Face 4'
324 write(ulsort,1789) 'laface = ', iaux,'coface = ', jaux
325 write(ulsort,1789) 'trifad(4,0) = ', trifad(4,0),
326 > 'trifad(4,1) = ', trifad(4,1),
327 > 'trifad(4,2) = ', trifad(4,2)
328 write(ulsort,1789) 'cotrvo(4,0) = ', cotrvo(4,0),
329 > 'cotrvo(4,1) = ', cotrvo(4,1),
330 > 'cotrvo(4,2) = ', cotrvo(4,2)
331 write(ulsort,1789) 'areqtr(4,1) = ', areqtr(4,1),
332 > ' de ',somare(1,areqtr(4,1)),
333 > ' a ',somare(2,areqtr(4,1))
334 write(ulsort,1789) 'areqtr(4,2) = ', areqtr(4,2),
335 > ' de ',somare(1,areqtr(4,2)),
336 > ' a ',somare(2,areqtr(4,2))
340 c trifad(5,0) = triangle central de la face 5 : FFi
341 c trifad(5,1) = triangle de la face 5 du cote du sommet 5 : FFi + 1/2
342 c trifad(5,2) = triangle de la face 5 de l'autre cote : FFi + 2/1
345 iaux = quahex(lehexa,nulofa(5))
346 jaux = coquhe(lehexa,nulofa(5))
347 trifad(5,0) = -filqua(iaux)
348 if ( jaux.lt.5 ) then
350 trifad(5,2) = trifad(5,0) + 2
352 trifad(5,1) = trifad(5,0) + 1
354 areqtr(5,2) = aretri(trifad(5,0),3)
355 areqtr(5,1) = aretri(trifad(5,0),1)
358 trifad(5,2) = trifad(5,0) + 1
360 trifad(5,1) = trifad(5,0) + 2
362 areqtr(5,2) = aretri(trifad(5,0),1)
363 areqtr(5,1) = aretri(trifad(5,0),3)
365 #ifdef _DEBUG_HOMARD_
366 write(ulsort,*) 'Face 5'
367 write(ulsort,1789) 'laface = ', iaux,'coface = ', jaux
368 write(ulsort,1789) 'trifad(5,0) = ', trifad(5,0),
369 > 'trifad(5,1) = ', trifad(5,1),
370 > 'trifad(5,2) = ', trifad(5,2)
371 write(ulsort,1789) 'cotrvo(5,0) = ', cotrvo(5,0),
372 > 'cotrvo(5,1) = ', cotrvo(5,1),
373 > 'cotrvo(5,2) = ', cotrvo(5,2)
374 write(ulsort,1789) 'areqtr(5,1) = ', areqtr(5,1),
375 > ' de ',somare(1,areqtr(5,1)),
376 > ' a ',somare(2,areqtr(5,1))
377 write(ulsort,1789) 'areqtr(5,2) = ', areqtr(5,2),
378 > ' de ',somare(1,areqtr(5,2)),
379 > ' a ',somare(2,areqtr(5,2))
383 c trifad(6,0) = triangle central de la face 6 : FFi
384 c trifad(6,1) = triangle de la face 6 du cote du sommet 5 : FFi + 1/2
385 c trifad(6,2) = triangle de la face 6 de l'autre cote : FFi + 2/1
388 iaux = quahex(lehexa,nulofa(6))
389 jaux = coquhe(lehexa,nulofa(6))
390 trifad(6,0) = -filqua(iaux)
391 if ( jaux.lt.5 ) then
393 trifad(6,2) = trifad(6,0) + 1
395 trifad(6,1) = trifad(6,0) + 2
397 areqtr(6,2) = aretri(trifad(6,0),1)
398 areqtr(6,1) = aretri(trifad(6,0),3)
401 trifad(6,2) = trifad(6,0) + 2
403 trifad(6,1) = trifad(6,0) + 1
405 areqtr(6,2) = aretri(trifad(6,0),3)
406 areqtr(6,1) = aretri(trifad(6,0),1)
408 #ifdef _DEBUG_HOMARD_
409 write(ulsort,*) 'Face 6'
410 write(ulsort,1789) 'laface = ', iaux,'coface = ', jaux
411 write(ulsort,1789) 'trifad(6,0) = ', trifad(6,0),
412 > 'trifad(6,1) = ', trifad(6,1),
413 > 'trifad(6,2) = ', trifad(6,2)
414 write(ulsort,1789) 'cotrvo(6,0) = ', cotrvo(6,0),
415 > 'cotrvo(6,1) = ', cotrvo(6,1),
416 > 'cotrvo(6,2) = ', cotrvo(6,2)
417 write(ulsort,1789) 'areqtr(6,1) = ', areqtr(6,1),
418 > ' de ',somare(1,areqtr(6,1)),
419 > ' a ',somare(2,areqtr(6,1))
420 write(ulsort,1789) 'areqtr(6,2) = ', areqtr(6,2),
421 > ' de ',somare(1,areqtr(6,2)),
422 > ' a ',somare(2,areqtr(6,2))
426 c 3. grandeurs independantes du cas traite (phase 2)
428 c niveau = niveau des triangles des conformites des faces
429 niveau = nivtri(trifad(1,0))
430 #ifdef _DEBUG_HOMARD_
431 write(ulsort,3000) niveau
432 3000 format('niveau =',i3)
439 if ( codret.ne.0 ) then
443 write (ulsort,texte(langue,1)) 'Sortie', nompro
444 write (ulsort,texte(langue,2)) codret
448 #ifdef _DEBUG_HOMARD_
449 write (ulsort,texte(langue,1)) 'Sortie', nompro