Salome HOME
Homard executable
[modules/homard.git] / src / tool / AV_Conversion / vcequ2.F
1       subroutine vcequ2 ( noehom, arehom,
2      >                    trihom, quahom,
3      >                    somare, np2are,
4      >                    aretri, arequa,
5      >                    posifa, facare,
6      >                    povoso, voisom,
7      >                    ulsort, langue, codret )
8 c ______________________________________________________________________
9 c
10 c                             H O M A R D
11 c
12 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
13 c
14 c Version originale enregistree le 18 juin 1996 sous le numero 96036
15 c aupres des huissiers de justice Simart et Lavoir a Clamart
16 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
17 c aupres des huissiers de justice
18 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
19 c
20 c    HOMARD est une marque deposee d'Electricite de France
21 c
22 c Copyright EDF 1996
23 c Copyright EDF 1998
24 c Copyright EDF 2002
25 c Copyright EDF 2020
26 c ______________________________________________________________________
27 c
28 c    aVant adaptation Conversion - EQUivalence - phase 2
29 c     -               -            ---                 -
30 c
31 c    remarque : ce traitement suppose qu'une entite ne possede pas plus
32 c               d'un homologue. Si des cas plus compliques apparaissent,
33 c               il faudra modifier la structure des equivalences
34 c
35 c    on enrichit la structure pour pouvoir passer l'algorithme et la
36 c    reconstruction future. pour chaque triangle homologue, on repere
37 c    les trois aretes et on les declare homologues. Idem pour les
38 c    aretes des quadrangles. Idem pour les noeuds des aretes.
39 c    si on ne fait pas cette operation, on est incapable d'associer les 
40 c    filles des entites homologues. On ne saura pas apparier dans le
41 c    bon sens.
42 c    attention, on ne fait pas le processus dans l'autre sens : deduire
43 c    des equivalences sur des aretes a partir d'equivalences sur les
44 c    noeuds reviendrait a extrapoler les informations donnees en entree.
45 c
46 c   remarque importante : reperage des elements homologues
47 c     on prend la convention de reperage suivante : lorsque
48 c     l'on a deux faces periodiques 1 et 2, on attribue un signe a
49 c     chacune des faces. pour un noeud "i", noehom(i) est alors egal
50 c     a la valeur suivante :
51 c     - "le numero du noeud correspondant par periodicite
52 c        si i est sur la face 2"
53 c     - "l'oppose du numero du noeud correspondant par periodicite
54 c        si i est sur la face 1"
55 c
56 c     Donc, on etend cette convention a toutes les entites noeuds,
57 c     aretes et triangles :
58 c     enthom(i) = abs(homologue(i)) ssi i est sur la face 2
59 c     enthom(i) = -abs(homologue(i)) ssi i est sur la face 1
60 c     pour une entite situee sur l'axe, on prend la convention positive.
61 c
62 c ______________________________________________________________________
63 c .        .     .        .                                            .
64 c .  nom   . e/s . taille .           description                      .
65 c .____________________________________________________________________.
66 c . noehom . es  . nbnoto . liste etendue des homologues par noeuds    .
67 c . arehom . es  . nbarto . liste etendue des homologues par aretes    .
68 c . trihom . es  . nbtrto . ensemble des triangles homologues          .
69 c . quahom . es  . nbquto . ensemble des quadrangles homologues        .
70 c . somare . e   .2*nbarto. numeros des extremites d'arete             .
71 c . np2are . e   . nbarto . numero du noeud milieu de l'arete          .
72 c . aretri . e   .nbtrto*3. numeros des 3 aretes des triangles         .
73 c . arequa . e   .nbquto*4. numeros des 4 aretes des quadrangles       .
74 c . posifa . e   . nbarto . pointeur sur tableau facare                .
75 c . facare . e   . nbfaar . liste des faces contenant une arete        .
76 c . povoso . e   .0:nbnoto. pointeur des voisins par sommet            .
77 c . voisom . e   . nvosom . elements 1d, 2d ou 3d voisins par sommet   .
78 c . ulsort . e   .   1    . numero d'unite logique de la liste standard.
79 c . langue . e   .    1   . langue des messages                        .
80 c .        .     .        . 1 : francais, 2 : anglais                  .
81 c . codret . es  .    1   . code de retour des modules                 .
82 c .        .     .        . 0 : pas de probleme                        .
83 c .        .     .        . 1 : probleme                               .
84 c ______________________________________________________________________
85 c
86 c====
87 c 0. declarations et dimensionnement
88 c====
89 c
90 c 0.1. ==> generalites
91 c
92       implicit none
93       save
94 c
95       character*6 nompro
96       parameter ( nompro = 'VCEQU2' )
97 c
98 #include "nblang.h"
99 c
100 c 0.2. ==> communs
101 c
102 #include "envex1.h"
103 c
104 #include "nombno.h"
105 #include "nombar.h"
106 #include "nombtr.h"
107 #include "nombqu.h"
108 #include "nbutil.h"
109 #include "envca1.h"
110 #include "impr02.h"
111 c
112 c 0.3. ==> arguments
113 c
114       integer noehom(nbnoto), arehom(nbarto)
115       integer trihom(nbtrto), quahom(nbquto)
116       integer somare(2,nbarto), np2are(nbarto)
117       integer aretri(nbtrto,3), arequa(nbquto,4)
118       integer posifa(0:nbarto), facare(nbfaar) 
119       integer povoso(0:nbnoto), voisom(nvosom)
120       integer ulsort, langue, codret
121 c
122 c 0.4. ==> variables locales
123 c
124       integer entlo1, entlo2
125       integer iaux, jaux
126 c
127       integer nbmess
128       parameter ( nbmess = 10 )
129       character*80 texte(nblang,nbmess)
130 c
131 c 0.5. ==> initialisations
132 c ______________________________________________________________________
133 c
134 c====
135 c 1. initialisations
136 c====
137 c
138 c 1.1. ==> messages
139 c
140 #include "impr01.h"
141 c
142 #ifdef _DEBUG_HOMARD_
143       write (ulsort,texte(langue,1)) 'Entree', nompro
144       call dmflsh (iaux)
145 #endif
146 c
147       texte(1,5) = '(''Infos donnees en numerotation HOMARD'')'
148       texte(1,6) = '(a,i10,'' est homologue de'',i10)'
149       texte(1,7) = '(/,''Equivalence sur les '',a)'
150       texte(1,8) =
151      > '(''. Nombre de '',a,''homologues enregistres :'',i2)'
152       texte(1,9) = '(/,''. Analyse des '',a,i10,'' et'',i10)'
153 c
154       texte(2,5) = '(''Infos given with HOMARD #'')'
155       texte(2,6) = '(a,i10,'' is homologous with'',i10)'
156       texte(2,7) = '(/,''Equivalence for '',a)'
157       texte(2,8) = '(''. Number of known homologous '',a,'' :'',i2)'
158       texte(2,9) = '(/,''. Analysis of '',a,i10,'' and'',i10)'
159 c
160       codret = 0
161 c
162 c====
163 c 2. enrichissement de la structure sur les aretes a partir de la
164 c    donnee des triangles et quadrangles homologues
165 c====
166 c
167       if ( homolo.ge.3 ) then
168 c
169 #ifdef _DEBUG_HOMARD_
170         if ( nbeqtr.gt.0 ) then
171         write (ulsort,texte(langue,7)) mess14(langue,3,2)
172         write (ulsort,texte(langue,5))
173         do 20001 , iaux = 1 , nbtrto
174           if ( trihom(iaux).ne.0 ) then
175             write (ulsort,texte(langue,6)) mess14(langue,2,2),
176      >                                    iaux, trihom(iaux)
177           endif
178 20001   continue
179         endif
180         if ( nbeqqu.gt.0 ) then
181         write (ulsort,texte(langue,7)) mess14(langue,3,4)
182         write (ulsort,texte(langue,5))
183         do 20002 , iaux = 1 , nbquto
184           if ( quahom(iaux).ne.0 ) then
185             write (ulsort,texte(langue,6)) mess14(langue,2,4),
186      >                                    iaux, quahom(iaux)
187           endif
188 20002   continue
189         endif
190 #endif
191 c
192 c 2.1. ==> on commence par traiter les triangles et les quadrangles
193 c          qui ne sont pas dans un coin de maillage. Autrement dit, il
194 c          ne faut pas que deux de leurs aretes soient au bord
195 c
196 c 2.1.1. ==> les triangles
197 c
198         if ( nbeqtr.gt.0 ) then
199 c
200           if ( codret.eq.0 ) then
201 c
202           iaux = 2
203 #ifdef _DEBUG_HOMARD_
204       write (ulsort,texte(langue,3)) 'VCEQU4_tr', nompro
205 #endif
206           call vcequ4 ( iaux,
207      >                  arehom,
208      >                  trihom, quahom,
209      >                  aretri, arequa,
210      >                  posifa, facare,
211      >                  ulsort, langue, codret )
212 cgn           print *,nompro,' apres 2.1.1'
213 cgn           print *,'arehom'
214 cgn           print 1789,(arehom(iaux),iaux=1,50)
215 c
216           endif
217 c
218         endif
219 cgn 1787 format(4I4)
220 cgn 1788 format(8I4)
221 cgn 1789 format(10I4)
222 c
223 c 2.1.2. ==> les quadrangles
224 c
225         if ( nbeqqu.gt.0 ) then
226 c
227           if ( codret.eq.0 ) then
228 c
229           iaux = 4
230 #ifdef _DEBUG_HOMARD_
231       write (ulsort,texte(langue,3)) 'VCEQU4_qu', nompro
232 #endif
233           call vcequ4 ( iaux,
234      >                  arehom,
235      >                  trihom, quahom,
236      >                  aretri, arequa,
237      >                  posifa, facare,
238      >                  ulsort, langue, codret )
239 c
240 cgn           print *,nompro,' apres 2.1.2'
241 cgn           print *,'arehom'
242 cgn           print 1789,(arehom(iaux),iaux=1,50)
243           endif
244 c
245         endif
246 c
247 #ifdef _DEBUG_HOMARD_
248         write (ulsort,texte(langue,7)) mess14(langue,3,1)
249         write (ulsort,texte(langue,5))
250         do 21000 , iaux = 1 , nbarto
251           if ( arehom(iaux).ne.0 ) then
252             write (ulsort,texte(langue,6)) mess14(langue,2,1),
253      >                                    iaux, arehom(iaux)
254           endif
255 21000   continue
256 #endif
257 c
258 c 2.2. ==> a partir de cette premiere mise en equivalence des aretes,
259 c          on reporte l'information sur les noeuds
260 c          on boucle uniquement sur les aretes de la face periodique 2
261 c
262         if ( codret.eq.0 ) then
263 c
264         do 22 , entlo2 = 1 , nbarto
265 c
266           if ( codret.eq.0 ) then
267 c
268           entlo1 = arehom(entlo2)
269 c
270           if ( entlo1.gt.0 ) then
271 c
272             jaux = entlo2
273 #ifdef _DEBUG_HOMARD_
274       write (ulsort,texte(langue,3)) 'VCEQU5', nompro
275 #endif
276             call vcequ5 ( entlo1, jaux,
277      >                    noehom, arehom,
278      >                    somare, np2are,
279      >                    povoso, voisom,
280      >                    ulsort, langue, codret )
281 c
282           endif
283 c
284           endif
285 c
286    22   continue
287 cgn           print *,nompro,' apres 2.2'
288 cgn           print *,'noehom'
289 cgn           print 1789,(noehom(iaux),iaux=1,27)
290 c
291         endif
292 c
293 #ifdef _DEBUG_HOMARD_
294         write (ulsort,texte(langue,7)) mess14(langue,3,-1)
295         write (ulsort,texte(langue,5))
296         do 22000 , iaux = 1 , nbnoto
297           if ( noehom(iaux).ne.0 ) then
298             write (ulsort,texte(langue,6)) mess14(langue,2,-1),
299      >                                    iaux, noehom(iaux)
300           endif
301 22000   continue
302 #endif
303 c
304 c 2.3. ==> maintenant que l'on a transfere l'information sur les noeuds,
305 c          on s'occupe des triangles ou quadrangles de coin
306 c
307 c 2.3.1. ==> les triangles
308 c
309         if ( nbeqtr.gt.0 ) then
310 c
311           if ( codret.eq.0 ) then
312 c
313           iaux = 2
314 #ifdef _DEBUG_HOMARD_
315       write (ulsort,texte(langue,3)) 'VCEQU6_tr', nompro
316 #endif
317           call vcequ6 ( iaux,
318      >                  noehom, arehom,
319      >                  trihom, quahom,
320      >                  somare, aretri, arequa,
321      >                  ulsort, langue, codret )
322 c
323 cgn           print *,nompro,' apres 2.3.1'
324 cgn           print *,'arehom'
325 cgn           print 1789,(arehom(iaux),iaux=1,50)
326 c
327           endif
328 c
329         endif
330 c
331 c 2.3.2. ==> les quadrangles
332 c
333         if ( nbeqqu.gt.0 ) then
334 c
335           if ( codret.eq.0 ) then
336 c
337           iaux = 4
338 #ifdef _DEBUG_HOMARD_
339       write (ulsort,texte(langue,3)) 'VCEQU6_qu', nompro
340 #endif
341           call vcequ6 ( iaux,
342      >                  noehom, arehom,
343      >                  trihom, quahom,
344      >                  somare, aretri, arequa,
345      >                  ulsort, langue, codret )
346 c
347 cgn           print *,nompro,' apres 2.3.2'
348 cgn           print *,'arehom'
349 cgn           print 1789,(arehom(iaux),iaux=1,50)
350 c
351           endif
352 c
353         endif
354 c
355 #ifdef _DEBUG_HOMARD_
356         write (ulsort,texte(langue,7)) mess14(langue,3,1)
357         write (ulsort,texte(langue,5))
358         do 23000 , iaux = 1 , nbarto
359           if ( arehom(iaux).ne.0 ) then
360             write (ulsort,texte(langue,6)) mess14(langue,2,1),
361      >                                    iaux, arehom(iaux)
362           endif
363 23000   continue
364 #endif
365 c
366 c 2.4. ==> on verifie que toutes les aretes bordant des triangles
367 c          ou des quadrangles ont bien ete enregistrees
368 c
369         if ( codret.eq.0 ) then
370 c
371 #ifdef _DEBUG_HOMARD_
372       write (ulsort,texte(langue,3)) 'VCEQU7', nompro
373 #endif
374         call vcequ7 ( arehom,
375      >                trihom, quahom,
376      >                aretri, arequa,
377      >                ulsort, langue, codret )
378 c
379         endif
380 c
381       endif
382 c
383 c====
384 c 3. enrichissement de la structure sur les noeuds a partir de la
385 c    donnee des aretes homologues. cette donnee est soit issue du
386 c    maillage a analyser, soit creee/enrichie par le traitement des
387 c    triangles et des quadrangles homologues.
388 c    il faut faire cette etape apres celle sur les triangles et les
389 c    quadrangles, sinon on oublie de l'information
390 c====
391 c
392       if ( codret.eq.0 ) then
393 c
394       if ( homolo.ge.2 ) then
395 c
396         do 31 , entlo2 = 1 , nbarto
397 c
398           entlo1 = arehom(entlo2)
399 c
400           if ( entlo1.gt.0 ) then
401 c
402             jaux = entlo2
403 #ifdef _DEBUG_HOMARD_
404       write (ulsort,texte(langue,3)) 'VCEQU5', nompro
405 #endif
406             call vcequ5 ( entlo1, jaux,
407      >                    noehom, arehom,
408      >                    somare, np2are,
409      >                    povoso, voisom,
410      >                    ulsort, langue, codret )
411 c
412           endif
413 c
414    31   continue
415 c
416 cgn        print *,nompro,' apres 3'
417 cgn        print *,'noehom'
418 cgn        print 1789,(noehom(iaux),iaux=1,27)
419 c
420 #ifdef _DEBUG_HOMARD_
421         write (ulsort,texte(langue,7)) mess14(langue,3,-1)
422         write (ulsort,texte(langue,5))
423         do 30000 , iaux = 1 , nbnoto
424           if ( noehom(iaux).ne.0 ) then
425             write (ulsort,texte(langue,6)) mess14(langue,2,-1),
426      >                                    iaux, noehom(iaux)
427           endif
428 30000   continue
429 #endif
430 c
431       endif
432 c
433       endif
434 c
435 c====
436 c 4. decompte du nombre de paires d'entites homologues
437 c====
438 c
439       if ( codret.eq.0 ) then
440 c
441 #ifdef _DEBUG_HOMARD_
442       write (ulsort,texte(langue,3)) 'UTHONH', nompro
443 #endif
444       call uthonh ( noehom, arehom,
445      >              trihom, quahom,
446      >              ulsort, langue, codret )
447 c
448       endif
449 c
450 c====
451 c 5. la fin
452 c====
453 c
454       if ( codret.ne.0 ) then
455 c
456 #include "envex2.h"
457 c
458       write (ulsort,texte(langue,1)) 'Sortie', nompro
459       write (ulsort,texte(langue,2)) codret
460 c
461       endif
462 c
463 #ifdef _DEBUG_HOMARD_
464       write (ulsort,texte(langue,1)) 'Sortie', nompro
465       call dmflsh (iaux)
466 #endif
467 c
468       end