Salome HOME
Porting in SSL Bug12504 of non regression test
[modules/homard.git] / src / tool / AP_Conversion / pcma22.F
1       subroutine pcma22 ( nbnoto, nbelem,
2      >                    nbtr3d, nbqu3d, nbhe3d, nbpe3d, nbele3,
3      >                    fameel, typele, noeele,
4      >                    fame3d, type3d, noee3d,
5      >                    faminf, famsup, nu3dno,
6      >                    nparrc, npqurc,
7      >                    arerec, quarec, tabaux,
8      >                    ulsort, langue, codret )
9 c ______________________________________________________________________
10 c
11 c                             H O M A R D
12 c
13 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
14 c
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
20 c
21 c    HOMARD est une marque deposee d'Electricite de France
22 c
23 c Copyright EDF 1996
24 c Copyright EDF 1998
25 c Copyright EDF 2002
26 c Copyright EDF 2020
27 c ______________________________________________________________________
28 c
29 c    aPres adaptation - Conversion de MAillage - 2D/3D - phase 2
30 c     -                 -             --         -             -
31 c    Creation des mailles
32 c ______________________________________________________________________
33 c .        .     .        .                                            .
34 c .  nom   . e/s . taille .           description                      .
35 c .____________________________________________________________________.
36 c . nbnoto . e   .   1    . nombre de noeuds du maillage externe       .
37 c . nbtr3d . e   .   1    . nombre de triangles du maillage 3d         .
38 c . nbqu3d . e   .   1    . nombre de quadrangles du maillage 3d       .
39 c . nbhe3d . e   .   1    . nombre d'hexaedres du maillage 3d          .
40 c . nbpe3d . e   .   1    . nombre de pentaedres du maillage 3d        .
41 c . nbelem . e   .   1    . nombre d'elements du maillage externe      .
42 c . nu3dno . e   . nbnoto . numero du calcul des noeuds                .
43 c . fameel . e   . nbelem . famille med des elements                   .
44 c . typele . e   . nbelem . type des elements pour le code de calcul   .
45 c . noeele . e   . nbelem . noeuds des elements                        .
46 c .        .     .*nbmane .                                            .
47 c . fame3d .  s  . nbele3 . famille med des elements du maillage 3d    .
48 c . type3d .  s  . nbele3 . type des elements du maillage 3d           .
49 c . noee3d .  s  . nbele3 . noeuds des elements du maillage 3d         .
50 c .        .     .*nbman3 .                                            .
51 c . faminf . e   .   1    . famille med des quad de la face inferieure .
52 c . famsup . e   .   1    . famille med des quad de la face superieure .
53 c . nu3dno . e   . nbnoto . numero du calcul des noeuds                .
54 c . nparrc . es  .   1    . nombre de paires d'aretes a recoller       .
55 c . npqurc .   s .   1    . nombre de paires de quadrangles a recoller .
56 c . arerec . e   .2*nparrc. paires des aretes a recoller               .
57 c . quarec .  s  .   2**  . paires des quadrangles a recoller          .
58 c . tabaux .  a  . nbarto . tableau auxiliaire                         .
59 c . ulsort . e   .   1    . numero d'unite logique de la liste standard.
60 c . langue . e   .    1   . langue des messages                        .
61 c .        .     .        . 1 : francais, 2 : anglais                  .
62 c . codret . es  .    1   . code de retour des modules                 .
63 c .        .     .        . 0 : pas de probleme                        .
64 c .        .     .        . 1 : probleme                               .
65 c ______________________________________________________________________
66 c
67 c====
68 c 0. declarations et dimensionnement
69 c====
70 c
71 c 0.1. ==> generalites
72 c
73       implicit none
74       save
75 c
76       character*6 nompro
77       parameter ( nompro = 'PCMA22' )
78 c
79 #include "nblang.h"
80 #include "consts.h"
81 #include "fracti.h"
82 c
83 c 0.2. ==> communs
84 c
85 #include "envex1.h"
86 c
87 #include "meddc0.h"
88 #include "impr02.h"
89 c
90 c 0.3. ==> arguments
91 c
92       integer nbnoto
93       integer nbtr3d, nbqu3d, nbhe3d, nbpe3d, nbele3
94       integer nbelem
95       integer faminf, famsup
96       integer fameel(nbelem), typele(nbelem), noeele(nbelem,*)
97       integer fame3d(nbele3), type3d(nbele3), noee3d(nbele3,*)
98       integer nu3dno(nbnoto)
99 c
100       integer nparrc, npqurc
101       integer arerec(2,*), quarec(2,*)
102       integer tabaux(*)
103 c
104       integer ulsort, langue, codret
105 c
106 c 0.4. ==> variables locales
107 c
108       integer iaux
109       integer el, nuel3d
110 c
111       integer nbmess
112       parameter ( nbmess = 10 )
113       character*80 texte(nblang,nbmess)
114 c
115 c 0.5. ==> initialisations
116 c ______________________________________________________________________
117 c
118 c====
119 c 1. messages
120 c====
121 c
122 #include "impr01.h"
123 c
124 #ifdef _DEBUG_HOMARD_
125       write (ulsort,texte(langue,1)) 'Entree', nompro
126       call dmflsh (iaux)
127 #endif
128 c
129       texte(1,4) = '(''Maille numero :'',i10,'', de noeuds '',8i10)'
130       texte(1,5) = '(i1,'' noeud(s) sont dans le plan zinf.'')'
131       texte(1,6) = '(''Pour un '',a,'', il en faudrait '',a)'
132       texte(1,7) = '(''Famille de la face '',a,'' : '',i6)'
133       texte(1,8) = '(''Famille du '',a,i10,'' : '',i6)'
134       texte(1,9) =
135      >'(''Nombre de '',a,'' attendus pour le maillage 3D :'',i10)'
136       texte(1,10) =
137      >'(''Nombre de '',a,'' trouves pour le maillage 3D  :'',i10)'
138 c
139       texte(2,4) = '(''Mesh # :'',i10,'', with nodes '',8i10)'
140       texte(2,5) = '(i1,'' node(s) are in zinf plane.'')'
141       texte(2,6) = '(''For '',a,'', '',a,'' were expected.'')'
142       texte(2,7) = '(''Family for '',a,'' face : '',i6)'
143       texte(2,8) = '(''Family for '',a,'' #'',i10,'' : '',i6)'
144       texte(2,9) =
145      > '(''Expected number of '',a,'' for the 3D mesh :'',i10)'
146       texte(2,10) =
147      > '(''Found number of '',a,'' for the 3D mesh    :'',i10)'
148 c
149 #include "impr03.h"
150 c
151       codret = 0
152 c
153 #ifdef _DEBUG_HOMARD_
154       write (ulsort,90002) 'nbele3', nbele3
155 #endif
156       nuel3d = 0
157 c
158 c====
159 c 2. transformations des quadrangles en hexaedres
160 c      Convention MED des hexaedres :
161 c
162 c             1                   4
163 c             --------------------
164 c            /                   /.
165 c           /                   / .
166 c          /                   /  .
167 c         /                   /   .
168 c       2 -------------------- 3  .
169 c         .                  .    .
170 c         .                  .    .
171 c         .    5             .    . 8
172 c         .                  .   /
173 c         .                  .  /
174 c         .                  . /
175 c         .                  ./
176 c         --------------------
177 c         6                  7
178 c
179 c    . Les noeuds (1,2,3,4) definissent un quadrangle a orientation
180 c      vers l'exterieur
181 c    . Les noeuds (5,6,7,8) sont translates de (1,2,3,4)
182 c    . Le triedre (12,15,14) est direct
183 c
184 c====
185 #ifdef _DEBUG_HOMARD_
186       write (ulsort,90002) '2. quad -> hexa ; codret', codret
187       write (ulsort,90002) 'nbhe3d', nbhe3d
188 #endif
189 c
190       if ( nbhe3d.ne.0 ) then
191 c
192       if ( codret.eq.0 ) then
193 c
194       do 21 , el = 1 , nbelem
195 c
196         if ( typele(el).eq.edqua4 ) then
197 c
198           nuel3d = nuel3d + 1
199           do 211 , iaux = 1 , 4
200             noee3d(nuel3d,iaux)   = nu3dno(noeele(el,iaux)) + nbnoto - 1
201             noee3d(nuel3d,iaux+4) = nu3dno(noeele(el,iaux))
202   211     continue
203           fame3d(nuel3d) = fameel(el)
204           type3d(nuel3d) = edhex8
205 c
206         endif
207 c
208    21 continue
209 c
210       if ( nuel3d.ne.nbhe3d ) then
211         write (ulsort,texte(langue,9))  mess14(langue,3,9), nbhe3d
212         write (ulsort,texte(langue,10)) mess14(langue,3,9), nuel3d
213         codret = 2
214       endif
215 c
216       endif
217 c
218       endif
219 c
220 c====
221 c 3. transformations des triangles en pentaedres
222 c      Convention MED des pentaedres :
223 c====
224 #ifdef _DEBUG_HOMARD_
225       write (ulsort,90002) '3. tria -> pent ; codret', codret
226       write (ulsort,90002) 'nbpe3d', nbpe3d
227 #endif
228 c
229       if ( nbpe3d.ne.0 ) then
230 c
231       if ( codret.eq.0 ) then
232 c
233       do 31 , el = 1 , nbelem
234 c
235         if ( typele(el).eq.edtri3 ) then
236 c
237           nuel3d = nuel3d + 1
238           do 311 , iaux = 1 , 3
239             noee3d(nuel3d,iaux)   = nu3dno(noeele(el,iaux)) + nbnoto - 1
240             noee3d(nuel3d,iaux+3) = nu3dno(noeele(el,iaux))
241   311     continue
242           fame3d(nuel3d) = fameel(el)
243           type3d(nuel3d) = edpen6
244 c
245         endif
246 c
247    31 continue
248 c
249       if ( (nuel3d-nbhe3d).ne.nbpe3d ) then
250         write (ulsort,texte(langue,9))  mess14(langue,3,9), nbpe3d
251         write (ulsort,texte(langue,10)) mess14(langue,3,9),
252      >                                  nuel3d-nbhe3d
253         codret = 3
254       endif
255 c
256       endif
257 c
258       endif
259 c
260 c====
261 c 4. creation des quadrangles
262 c====
263 #ifdef _DEBUG_HOMARD_
264       write (ulsort,90002) '4. creation quadrangles ; codret', codret
265 #endif
266 c
267       if ( nbqu3d.ne.0 ) then
268 c
269 c 4.1. ==> transformations des segments en quadrangles de bord
270 c
271       if ( codret.eq.0 ) then
272 c
273       do 41 , el = 1 , nbelem
274 c
275         if ( typele(el).eq.edseg2 ) then
276           nuel3d = nuel3d + 1
277 #ifdef _DEBUG_HOMARD_
278         write (ulsort,90002) 'nuel3d', nuel3d
279         write (ulsort,90015) 'noeele(',el,') = ',
280      >                       noeele(el,1), noeele(el,2)
281         write (ulsort,90015) 'nu3dno(noeele(',el,')) = ',
282      >                       nu3dno(noeele(el,1)), nu3dno(noeele(el,2))
283 #endif
284 c
285           noee3d(nuel3d,1) = nu3dno(noeele(el,1))
286           noee3d(nuel3d,2) = nu3dno(noeele(el,2))
287           noee3d(nuel3d,3) = nu3dno(noeele(el,2)) + nbnoto - 1
288           noee3d(nuel3d,4) = nu3dno(noeele(el,1)) + nbnoto - 1
289           fame3d(nuel3d) = fameel(el)
290           type3d(nuel3d) = edqua4
291           if ( nparrc.gt.0 ) then
292             tabaux(el) = nuel3d - nbhe3d
293           endif
294 c
295         endif
296 c
297    41 continue
298 c
299       endif
300 c
301 c 4.2. ==> creation des quadrangles des faces inf et sup
302 c          deux faces paralleles doivent tourner en sens inverse ...
303 c
304       if ( codret.eq.0 ) then
305 c
306 #ifdef _DEBUG_HOMARD_
307       write (ulsort,texte(langue,7)) 'inf', faminf
308       write (ulsort,texte(langue,7)) 'sup', famsup
309 #endif
310 c
311       do 42 , el = 1 , nbelem
312 c
313         if ( typele(el).eq.edqua4 ) then
314 c
315           nuel3d = nuel3d + 1
316           noee3d(nuel3d,1) = nu3dno(noeele(el,4))
317           noee3d(nuel3d,2) = nu3dno(noeele(el,3))
318           noee3d(nuel3d,3) = nu3dno(noeele(el,2))
319           noee3d(nuel3d,4) = nu3dno(noeele(el,1))
320           fame3d(nuel3d) = faminf
321           type3d(nuel3d) = edqua4
322 c
323           nuel3d = nuel3d + 1
324           noee3d(nuel3d,1) = nu3dno(noeele(el,1)) + nbnoto - 1
325           noee3d(nuel3d,2) = nu3dno(noeele(el,2)) + nbnoto - 1
326           noee3d(nuel3d,3) = nu3dno(noeele(el,3)) + nbnoto - 1
327           noee3d(nuel3d,4) = nu3dno(noeele(el,4)) + nbnoto - 1
328           fame3d(nuel3d) = famsup
329           type3d(nuel3d) = edqua4
330 c
331         endif
332 c
333    42 continue
334 c
335       endif
336 c
337       if ( codret.eq.0 ) then
338 c
339       if ( (nuel3d-nbhe3d-nbpe3d).ne.(nbqu3d+nbtr3d) ) then
340         write (ulsort,texte(langue,9)) mess14(langue,3,8), nbqu3d+nbtr3d
341         write (ulsort,texte(langue,10))
342      >    mess14(langue,3,8), nuel3d-nbhe3d-nbpe3d
343         codret = 444
344       endif
345 c
346       endif
347 c
348       endif
349 c
350 c====
351 c 5. creation des triangles
352 c====
353 #ifdef _DEBUG_HOMARD_
354       write (ulsort,90002) '5. creation triangles ; codret', codret
355 #endif
356 c
357       if ( nbtr3d.ne.0 ) then
358 c
359 c 5.1. ==> creation des triangles des faces inf et sup
360 c          deux faces paralleles doivent tourner en sens inverse ...
361 c
362       if ( codret.eq.0 ) then
363 c
364 #ifdef _DEBUG_HOMARD_
365       write (ulsort,texte(langue,7)) 'inf', faminf
366       write (ulsort,texte(langue,7)) 'sup', famsup
367 #endif
368 c
369       do 51 , el = 1 , nbelem
370 c
371         if ( typele(el).eq.edtri3 ) then
372 c
373           nuel3d = nuel3d + 1
374           noee3d(nuel3d,1) = nu3dno(noeele(el,1))
375           noee3d(nuel3d,2) = nu3dno(noeele(el,2))
376           noee3d(nuel3d,3) = nu3dno(noeele(el,3))
377           fame3d(nuel3d) = faminf
378           type3d(nuel3d) = edtri3
379 c
380           nuel3d = nuel3d + 1
381           noee3d(nuel3d,1) = nu3dno(noeele(el,3)) + nbnoto - 1
382           noee3d(nuel3d,2) = nu3dno(noeele(el,2)) + nbnoto - 1
383           noee3d(nuel3d,3) = nu3dno(noeele(el,1)) + nbnoto - 1
384           fame3d(nuel3d) = famsup
385           type3d(nuel3d) = edtri3
386 c
387         endif
388 c
389    51 continue
390 c
391       endif
392 c
393       if ( codret.eq.0 ) then
394 c
395       if ( (nuel3d-nbhe3d-nbpe3d).ne.(nbqu3d+nbtr3d) ) then
396         write (ulsort,texte(langue,9)) mess14(langue,3,8), nbqu3d+nbtr3d
397         write (ulsort,texte(langue,10))
398      >    mess14(langue,3,8), nuel3d-nbhe3d-nbpe3d
399         codret = 555
400       endif
401 c
402       endif
403 c
404       endif
405 c
406 c====
407 c 6. transfert des recollements des segments vers les quadrangles
408 c====
409 #ifdef _DEBUG_HOMARD_
410       write (ulsort,90002) '6. transfert ; codret', codret
411 #endif
412 c
413       if ( codret.eq.0 ) then
414 c
415       do 61 , iaux = 1 , nparrc
416 c
417         quarec(1,iaux) = tabaux(arerec(1,iaux))
418         quarec(2,iaux) = tabaux(arerec(2,iaux))
419 c
420    61 continue
421 c
422       npqurc = nparrc
423       nparrc = 0
424 c
425       endif
426 c
427 c====
428 c 7. la fin
429 c====
430 c
431 #ifdef _DEBUG_HOMARD_
432       write (ulsort,90002) '7. fin ; codret', codret
433       call dmflsh (iaux)
434 #endif
435 c
436       if ( codret.ne.0 ) then
437 c
438 #include "envex2.h"
439       write (ulsort,texte(langue,1)) 'Sortie', nompro
440       write (ulsort,texte(langue,2)) codret
441       endif
442 c
443 #ifdef _DEBUG_HOMARD_
444       write (ulsort,texte(langue,1)) 'Sortie', nompro
445       call dmflsh (iaux)
446 #endif
447 c
448       end