]> SALOME platform Git repositories - modules/homard.git/blob - src/tool/Creation_Maillage/cmchaa.F
Salome HOME
Homard executable
[modules/homard.git] / src / tool / Creation_Maillage / cmchaa.F
1       subroutine cmchaa ( nulofa, lehexa,
2      >                    somare,
3      >                    aretri, nivtri,
4      >                    filqua,
5      >                    quahex, coquhe,
6      >                    niveau, areqtr,
7      >                    trifad, cotrvo,
8      >                    ulsort, langue, codret )
9 c
10 c ______________________________________________________________________
11 c
12 c                             H O M A R D
13 c
14 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
15 c
16 c Version originale enregistree le 18 juin 1996 sous le numero 96036
17 c aupres des huissiers de justice Simart et Lavoir a Clamart
18 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
19 c aupres des huissiers de justice
20 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
21 c
22 c    HOMARD est une marque deposee d'Electricite de France
23 c
24 c Copyright EDF 1996
25 c Copyright EDF 1998
26 c Copyright EDF 2002
27 c Copyright EDF 2020
28 c ______________________________________________________________________
29 c
30 c    Creation du Maillage - Conformite - decoupage des Hexaedres
31 c    -           -          -                          -
32 c                         - par 2 Aretes - phase A
33 c                                 -              -
34 c    Remarque : cmchaa, cmchak et cmchal sont des clones
35 c               cmchak et cmchal sont symetriques
36 c ______________________________________________________________________
37 c .        .     .        .                                            .
38 c .  nom   . e/s . taille .           description                      .
39 c .____________________________________________________________________.
40 c . nulofa . e   .   4    . numero local des faces a traiter           .
41 c . lehexa . e   .   1    . hexaedre a decouper                        .
42 c . somare . es  .2*nouvar. numeros des extremites d'arete             .
43 c . aretri . es  .nouvtr*3. numeros des 3 aretes des triangles         .
44 c . nivtri . es  . nouvtr . niveau des triangles                       .
45 c . filqua . e   . nouvqu . premier fils des quadrangles               .
46 c . quahex . e   .nouvhf*6. numeros des 6 quadrangles des hexaedres    .
47 c . coquhe . e   .nouvhf*6. codes des 6 quadrangles des hexaedres      .
48 c . niveau .  s  .   1    . niveau des faces issus du decoupage        .
49 c . areqtr .  s  .  (4,2) . aretes tracees sur les faces decoupees     .
50 c . trifad .  s  .(4,0:2) . triangles traces sur les faces decoupees   .
51 c . cotrvo .  s  .(4,0:2) . code des triangles dans les volumes        .
52 c . ulsort . e   .   1    . unite logique de la sortie generale        .
53 c . langue . e   .    1   . langue des messages                        .
54 c .        .     .        . 1 : francais, 2 : anglais                  .
55 c . codret . es  .    1   . code de retour des modules                 .
56 c .        .     .        . 0 : pas de probleme                        .
57 c .        .     .        . 1 : aucune arete ne correspond             .
58 c ______________________________________________________________________
59 c
60 c====
61 c 0. declarations et dimensionnement
62 c====
63 c
64 c 0.1. ==> generalites
65 c
66       implicit none
67       save
68 c
69       character*6 nompro
70       parameter ( nompro = 'CMCHAA' )
71 c
72 #include "nblang.h"
73 c
74 c 0.2. ==> communs
75 c
76 #include "envex1.h"
77 c
78 #include "nouvnb.h"
79 c
80 c 0.3. ==> arguments
81 c
82       integer lehexa, nulofa(4)
83       integer somare(2,nouvar)
84       integer aretri(nouvtr,3), nivtri(nouvtr)
85       integer filqua(nouvqu)
86       integer quahex(nouvhf,6), coquhe(nouvhf,6)
87       integer niveau
88       integer areqtr(4,2)
89       integer trifad(4,0:2), cotrvo(4,0:2)
90 c
91       integer ulsort, langue, codret
92 c
93 c 0.4. ==> variables locales
94 c
95       integer iaux, jaux
96 c
97       integer nbmess
98       parameter ( nbmess = 10 )
99       character*80 texte(nblang,nbmess)
100 c
101 c 0.5. ==> initialisations
102 c ______________________________________________________________________
103 c
104 c====
105 c 1. initialisations
106 c====
107 c
108 #include "impr01.h"
109 c
110 #ifdef _DEBUG_HOMARD_
111       write (ulsort,texte(langue,1)) 'Entree', nompro
112       call dmflsh (iaux)
113 #endif
114 c
115 #ifdef _DEBUG_HOMARD_
116  1789 format(5(a,i5,', '))
117 #endif
118 c
119       codret = 0
120 c
121 c====
122 c 2. Triangles et aretes tracees sur les faces coupees en 3
123 c            La premiere pyramide s'appuie sur celle des 2 faces de
124 c            l'hexaedre qui est non decoupee et de plus petit numero
125 c            local. Le positionnement de la pyramide a defini une
126 c            orientation de sa face quadrangulaire.
127 c            On traite les faces de l'hexaedre coupees en 3 comme suit :
128 c            . la 1ere et la 2eme partagent la 1ere arete coupee
129 c            . la 3eme et la 4eme partagent la 2nde arete coupee
130 c            Le choix de la 1ere est tel que l'ordre 1/2 corresponde a
131 c            l'orientation de la pyramide numero 1.
132 c            . Pour 2 aretes en vis-a-vis :
133 c              Le choix de la 3eme est tel que l'ordre 3/4 corresponde a
134 c              l'orientation de la pyramide numero 1.
135 c            . Pour 2 aretes non en vis-a-vis :
136 c              Le choix de la 3eme est tel que l'ordre 3/4 corresponde a
137 c              l'orientation de la pyramide numero 2.
138 c     trifad(p,0) : triangle central de ce decoupage
139 c     . Pour 2 aretes en vis-a-vis :
140 c       trifad(p,1) : triangle bordant l'arete non decoupee qui
141 c                     appartient a la pyramide 1
142 c       trifad(p,2) : triangle bordant l'arete non decoupee qui
143 c                     appartient a la pyramide 2
144 c      . Pour 2 aretes non en vis-a-vis :
145 c       trifad(p,1) : triangle ayant une arete commune a une pyramide
146 c       trifad(p,2) : triangle sans arete commune avec une pyramide
147 c     cotrvo(p,0/1/2) : futur code du triangle trifad(p,0/1/2) dans la
148 c                       description du tetraedre voisin
149 c     areqtr(p,1) : arete interne au quadrangle de bord et bordant le
150 c                   triangle trifad(p,1)
151 c     areqtr(p,2) : arete interne au quadrangle de bord et bordant le
152 c                   triangle trifad(p,2)
153 c====
154 c
155 c 2.1. ==> Face 1
156 c     trifad(1,0) = triangle central de la face 1 : FFi
157 c     . Pour 2 aretes en vis-a-vis :
158 c       trifad(1,1) = triangle de la face 1 bordant PYR1 : FFi + 1/2
159 c       trifad(1,2) = triangle de la face 1 bordant PYR2 : FFi + 2/1
160 c      . Pour 2 aretes non en vis-a-vis :
161 c       trifad(1,1) = triangle de la face 1 du cote de PYR1 : FFi + 1/2
162 c       trifad(1,2) = triangle de la face 1 de l'autre cote : FFi + 2/1
163 c     areqtr(1,1)
164 c     areqtr(1,2)
165       iaux = quahex(lehexa,nulofa(1))
166       jaux = coquhe(lehexa,nulofa(1))
167       trifad(1,0) = -filqua(iaux)
168       if ( jaux.lt.5 ) then
169         cotrvo(1,0) = 4
170         trifad(1,1) = trifad(1,0) + 1
171         cotrvo(1,1) = 4
172         trifad(1,2) = trifad(1,0) + 2
173         cotrvo(1,2) = 6
174         areqtr(1,1) = aretri(trifad(1,0),1)
175         areqtr(1,2) = aretri(trifad(1,0),3)
176       else
177         cotrvo(1,0) = 2
178         trifad(1,1) = trifad(1,0) + 2
179         cotrvo(1,1) = 1
180         trifad(1,2) = trifad(1,0) + 1
181         cotrvo(1,2) = 2
182         areqtr(1,1) = aretri(trifad(1,0),3)
183         areqtr(1,2) = aretri(trifad(1,0),1)
184       endif
185 #ifdef _DEBUG_HOMARD_
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))
199 #endif
200 c
201 c 2.2. ==> Face 2
202 c     trifad(2,0) = triangle central de la face 2 : FFi
203 c     . Pour 2 aretes en vis-a-vis :
204 c       trifad(2,1) = triangle de la face 2 bordant PYR1 : FFi + 2/1
205 c       trifad(2,2) = triangle de la face 2 bordant PYR2 : FFi + 1/2
206 c      . Pour 2 aretes non en vis-a-vis :
207 c       trifad(2,1) = triangle de la face 2 du cote de PYR1 : FFi + 2/1
208 c       trifad(2,2) = triangle de la face 2 de l'autre cote : FFi + 1/2
209 c     areqtr(2,1)
210 c     areqtr(2,2)
211       iaux = quahex(lehexa,nulofa(2))
212       jaux = coquhe(lehexa,nulofa(2))
213       trifad(2,0) = -filqua(iaux)
214       if ( jaux.lt.5 ) then
215         cotrvo(2,0) = 4
216         trifad(2,1) = trifad(2,0) + 2
217         cotrvo(2,1) = 6
218         trifad(2,2) = trifad(2,0) + 1
219         cotrvo(2,2) = 4
220         areqtr(2,1) = aretri(trifad(2,0),3)
221         areqtr(2,2) = aretri(trifad(2,0),1)
222       else
223         cotrvo(2,0) = 2
224         trifad(2,1) = trifad(2,0) + 1
225         cotrvo(2,1) = 2
226         trifad(2,2) = trifad(2,0) + 2
227         cotrvo(2,2) = 1
228         areqtr(2,1) = aretri(trifad(2,0),1)
229         areqtr(2,2) = aretri(trifad(2,0),3)
230       endif
231 #ifdef _DEBUG_HOMARD_
232       write(ulsort,1789) 'laface = ', iaux,', coface = ', jaux
233       write(ulsort,1789) 'trifad(2,0) = ', trifad(2,0),
234      >                   'trifad(2,1) = ', trifad(2,1),
235      >                   'trifad(2,2) = ', trifad(2,2)
236       write(ulsort,1789) 'cotrvo(2,0) = ', cotrvo(2,0),
237      >                   'cotrvo(2,1) = ', cotrvo(2,1),
238      >                   'cotrvo(2,2) = ', cotrvo(2,2)
239       write(ulsort,1789) 'areqtr(2,1) = ', areqtr(2,1),
240      >                   ' de ',somare(1,areqtr(2,1)),
241      >                   ' a ',somare(2,areqtr(2,1))
242       write(ulsort,1789) 'areqtr(2,2) = ', areqtr(2,2),
243      >                   ' de ',somare(1,areqtr(2,2)),
244      >                   ' a ',somare(2,areqtr(2,2))
245 #endif
246 c
247 c 2.3. ==> Face 3
248 c     trifad(3,0) = triangle central de la face 3 : FFi
249 c     . Pour 2 aretes en vis-a-vis :
250 c       trifad(3,1) = triangle de la face 3 bordant PYR1 : FFi + 1/2
251 c       trifad(3,2) = triangle de la face 3 bordant PYR2 : FFi + 2/1
252 c      . Pour 2 aretes non en vis-a-vis :
253 c       trifad(3,1) = triangle de la face 3 du cote de PYR2 : FFi + 1/2
254 c       trifad(3,2) = triangle de la face 3 de l'autre cote : FFi + 2/1
255 c     areqtr(3,1)
256 c     areqtr(3,2)
257       iaux = quahex(lehexa,nulofa(3))
258       jaux = coquhe(lehexa,nulofa(3))
259       trifad(3,0) = -filqua(iaux)
260       if ( jaux.lt.5 ) then
261         cotrvo(3,0) = 4
262         trifad(3,1) = trifad(3,0) + 1
263         cotrvo(3,1) = 4
264         trifad(3,2) = trifad(3,0) + 2
265         cotrvo(3,2) = 6
266         areqtr(3,1) = aretri(trifad(3,0),1)
267         areqtr(3,2) = aretri(trifad(3,0),3)
268       else
269         cotrvo(3,0) = 2
270         trifad(3,1) = trifad(3,0) + 2
271         cotrvo(3,1) = 1
272         trifad(3,2) = trifad(3,0) + 1
273         cotrvo(3,2) = 2
274         areqtr(3,1) = aretri(trifad(3,0),3)
275         areqtr(3,2) = aretri(trifad(3,0),1)
276       endif
277 #ifdef _DEBUG_HOMARD_
278       write(ulsort,1789) 'laface = ', iaux,', coface = ', jaux
279       write(ulsort,1789) 'trifad(3,0) = ', trifad(3,0),
280      >                   'trifad(3,1) = ', trifad(3,1),
281      >                   'trifad(3,2) = ', trifad(3,2)
282       write(ulsort,1789) 'cotrvo(3,0) = ', cotrvo(3,0),
283      >                   'cotrvo(3,1) = ', cotrvo(3,1),
284      >                   'cotrvo(3,2) = ', cotrvo(3,2)
285       write(ulsort,1789) 'areqtr(3,1) = ', areqtr(3,1),
286      >                   ' de ',somare(1,areqtr(3,1)),
287      >                   ' a ',somare(2,areqtr(3,1))
288       write(ulsort,1789) 'areqtr(3,2) = ', areqtr(3,2),
289      >                   ' de ',somare(1,areqtr(3,2)),
290      >                   ' a ',somare(2,areqtr(3,2))
291 #endif
292 c
293 c 2.4. ==> Face 4
294 c     trifad(4,0) = triangle central de la face 4 : FFi
295 c     . Pour 2 aretes en vis-a-vis :
296 c       trifad(4,1) = triangle de la face 4 bordant PYR1 : FFi + 2/1
297 c       trifad(4,2) = triangle de la face 4 bordant PYR2 : FFi + 1/2
298 c      . Pour 2 aretes non en vis-a-vis :
299 c       trifad(4,1) = triangle de la face 4 du cote de PYR2 : FFi + 2/1
300 c       trifad(4,2) = triangle de la face 4 de l'autre cote : FFi + 1/2
301 c     areqtr(4,1)
302 c     areqtr(4,2)
303       iaux = quahex(lehexa,nulofa(4))
304       jaux = coquhe(lehexa,nulofa(4))
305       trifad(4,0) = -filqua(iaux)
306       if ( jaux.lt.5 ) then
307         cotrvo(4,0) = 4
308         trifad(4,1) = trifad(4,0) + 2
309         cotrvo(4,1) = 6
310         trifad(4,2) = trifad(4,0) + 1
311         cotrvo(4,2) = 4
312         areqtr(4,1) = aretri(trifad(4,0),3)
313         areqtr(4,2) = aretri(trifad(4,0),1)
314       else
315         cotrvo(4,0) = 2
316         trifad(4,1) = trifad(4,0) + 1
317         cotrvo(4,1) = 2
318         trifad(4,2) = trifad(4,0) + 2
319         cotrvo(4,2) = 1
320         areqtr(4,1) = aretri(trifad(4,0),1)
321         areqtr(4,2) = aretri(trifad(4,0),3)
322       endif
323 #ifdef _DEBUG_HOMARD_
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))
337 #endif
338 c
339 c====
340 c 3. grandeurs independantes du cas traite (phase 2)
341 c====
342 c     niveau = niveau des triangles des conformites des faces
343       niveau = nivtri(trifad(1,0))
344 #ifdef _DEBUG_HOMARD_
345       write(ulsort,3000) niveau
346  3000 format('niveau =',i3)
347 #endif
348 c
349 c====
350 c 4. la fin
351 c====
352 c
353       if ( codret.ne.0 ) then
354 c
355 #include "envex2.h"
356 c
357       write (ulsort,texte(langue,1)) 'Sortie', nompro
358       write (ulsort,texte(langue,2)) codret
359 c
360       endif
361 c
362 #ifdef _DEBUG_HOMARD_
363       write (ulsort,texte(langue,1)) 'Sortie', nompro
364       call dmflsh (iaux)
365 #endif
366 c
367       end