Salome HOME
Homard executable
[modules/homard.git] / src / tool / Creation_Maillage / cmhomt.F
diff --git a/src/tool/Creation_Maillage/cmhomt.F b/src/tool/Creation_Maillage/cmhomt.F
new file mode 100644 (file)
index 0000000..4e45259
--- /dev/null
@@ -0,0 +1,556 @@
+      subroutine cmhomt ( arehom, trihom,
+     >                    somare,
+     >                    aretri, filtri, hettri,
+     >                    ulsort, langue, codret )
+c ______________________________________________________________________
+c
+c                             H O M A R D
+c
+c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
+c
+c Version originale enregistree le 18 juin 1996 sous le numero 96036
+c aupres des huissiers de justice Simart et Lavoir a Clamart
+c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
+c aupres des huissiers de justice
+c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
+c
+c    HOMARD est une marque deposee d'Electricite de France
+c
+c Copyright EDF 1996
+c Copyright EDF 1998
+c Copyright EDF 2002
+c Copyright EDF 2020
+c ______________________________________________________________________
+c
+c    Creation du Maillage - HOMologues - les Triangles
+c    -           -          ---              -
+c ______________________________________________________________________
+c .        .     .        .                                            .
+c .  nom   . e/s . taille .           description                      .
+c .____________________________________________________________________.
+c . arehom . es  . nbarto . ensemble des aretes homologues             .
+c . trihom . es  . nbtrto . ensemble des triangles homologues          .
+c . somare . e   .2*nbarto. numeros des extremites d'arete             .
+c . aretri . e   .nbtrto*3. numeros des 3 aretes des triangles         .
+c . filtri . e   . nbtrto . premier fils des triangles                 .
+c . hettri . e   . nbtrto . historique de l'etat des triangles         .
+c . ulsort . e   .   1    . unite logique de la sortie generale        .
+c . langue . e   .    1   . langue des messages                        .
+c .        .     .        . 1 : francais, 2 : anglais                  .
+c . codret . es  .    1   . code de retour des modules                 .
+c .        .     .        . 0 : pas de probleme                        .
+c ______________________________________________________________________
+c
+c====
+c 0. declarations et dimensionnement
+c====
+c
+c 0.1. ==> generalites
+c
+      implicit none
+      save
+c
+      character*6 nompro
+      parameter ( nompro = 'CMHOMT' )
+c
+#include "nblang.h"
+c
+c 0.2. ==> communs
+c
+#include "envex1.h"
+c
+#include "demitr.h"
+#include "nombar.h"
+#include "nombtr.h"
+#include "impr02.h"
+c
+c 0.3. ==> arguments
+c
+      integer arehom(nbarto), trihom(nbtrto)
+      integer somare(2,nbarto)
+      integer aretri(nbtrto,3), filtri(nbtrto), hettri(nbtrto)
+c
+      integer ulsort, langue, codret
+c
+c 0.4. ==> variables locales
+c
+      integer iaux
+      integer letria
+      integer fach
+      integer hist, etafac, etafho, an2, an1, n2f, n1f
+      integer a2f1, a2f2, a2f3, a1f1, a1f2, a1f3
+      integer f2k, f2j, f1k, f1j
+      integer na2k, na1k, na1j
+      integer a2s2s3, a2s1s3
+      integer a1s1s2, a1s2s3, a1s1s3
+c
+      integer nbmess
+      parameter ( nbmess = 10 )
+      character*80 texte(nblang,nbmess)
+c
+c 0.5. ==> initialisations
+c ______________________________________________________________________
+c
+c====
+c 1. initialisations
+c====
+c
+#include "impr01.h"
+c
+#ifdef _DEBUG_HOMARD_
+      write (ulsort,texte(langue,1)) 'Entree', nompro
+      call dmflsh (iaux)
+#endif
+c
+      texte(1,4) = '(''Etat du '',a,i10,'' : '',i4)'
+      texte(1,5) = '(/,''Les deux '',a,'' homologues'',2i10)'
+      texte(1,6) = '(''devraient etre coupes en 2.'')'
+      texte(1,7) = '(''Elle a pour homologue '',i10)'
+      texte(1,8) = '(''Il faudrait l''''arete'',i10,'' ou '',i10)'
+      texte(1,9) = '(''Arete'',i10,'' de sommets'',2i10)'
+      texte(1,10) = '(5x,''Erreur sur les '',a,'' homologues.'')'
+c
+      texte(2,4) = '(''State of '',a,'' #'',i10,'' : '',i4)'
+      texte(2,5) = '(/,''The two homologous '',a,'' #'',i10)'
+      texte(2,6) = '(''should be cut into 2.'')'
+      texte(2,7) = '(''Its homologous is ''i10)'
+      texte(2,8) = '(''It should be edge #'',i10,'' or #'',i10)'
+      texte(2,9) = '(''Edge #'',i10,'' with vertices #'',2i10)'
+      texte(2,10) = '(5x,''Error for homologous '',a)'
+c
+c====
+c 2. on boucle uniquement sur les triangles de la face periodique 2
+c    qui viennent d'etre decoupes en 2 ou en 4
+c====
+c
+      do 21, letria = 1, nbtrpe
+c
+        if ( trihom(letria).gt.0 ) then
+c
+          hist = hettri(letria)
+          etafac = mod ( hist, 10 )
+c
+          if ( hist.eq. 4 .or. hist.eq.14 .or.
+     >         hist.eq.24 .or. hist.eq.34 ) then
+c
+            fach = abs(trihom(letria))
+c
+c 2.1. ==> le triangle vient d'etre decoupe en 4
+c
+c 2.1.1. ==> recuperation des infos sur les fils de letria
+c
+            n2f = filtri(letria)
+c
+c           recuperation des numeros d'aretes
+c
+            a2s2s3 = aretri(letria,1)
+            a2s1s3 = aretri(letria,2)
+c
+c           recuperation des aretes internes
+c
+            a2f1 = aretri(n2f,1)
+            a2f2 = aretri(n2f,2)
+            a2f3 = aretri(n2f,3)
+c
+c 2.1.2.  ==> recuperation des infos sur le triangle homologue
+c
+            n1f = filtri(fach)
+c
+c           recuperation des numeros d'aretes
+c
+            a1s1s2 = aretri(fach,3)
+            a1s2s3 = aretri(fach,1)
+            a1s1s3 = aretri(fach,2)
+c
+c           recuperation des aretes internes
+c
+            a1f1 = aretri(n1f,1)
+            a1f2 = aretri(n1f,2)
+            a1f3 = aretri(n1f,3)
+c
+c 2.1.3.  ==> reperage des homologues
+c
+c           dans tous les cas on a correspondance entre
+c           les triangles n2f et n1f, fils aines.
+c           n2f est sur la meme face que "larete" c'est-a-dire la face 2
+c           donc noehom(n2f) est positif.
+c           s1f est sur l'autre face, donc noehom(s1f) est negatif
+c
+            trihom(n2f) = n1f
+            trihom(n1f) = -n2f
+c
+            if ( abs(arehom(a2s2s3)).eq.a1s2s3 ) then
+c
+c             les aretes 1 correspondent donc on a correspondance entre
+c             les triangles n2f+1 et n1f+1
+c             les aretes a2f1 et a1f1
+c
+              arehom(a2f1) = a1f1
+              arehom(a1f1) = -a2f1
+c
+              trihom(n2f+1) = (n1f+1)
+              trihom(n1f+1) = -(n2f+1)
+c
+              if ( abs(arehom(a2s1s3)).eq.a1s1s3 ) then
+c
+c               les aretes 2 correspondent donc
+c               on a correspondance entre
+c               les triangles n2f+2 et n1f+2
+c               les triangles n2f+3 et n1f+3
+c               les aretes a2f2 et a1f2
+c               les aretes a2f3 et a1f3
+c
+                arehom(a2f2) = a1f2
+                arehom(a1f2) = -a2f2
+                arehom(a2f3) = a1f3
+                arehom(a1f3) = -a2f3
+c
+                trihom(n2f+2) = (n1f+2)
+                trihom(n1f+2) = -(n2f+2)
+                trihom(n2f+3) = (n1f+3)
+                trihom(n1f+3) = -(n2f+3)
+c
+              else
+c
+c               les aretes 2 et 3 correspondent
+c               donc on a correspondance entre
+c               les triangles n2f+2 et n1f+3
+c               les triangles n2f+3 et n1f+2
+c               les aretes a2f2 et a1f3
+c               les aretes a2f3 et a1f2
+c
+                arehom(a2f2) = a1f3
+                arehom(a1f3) = -a2f2
+                arehom(a2f3) = a1f2
+                arehom(a1f2) = -a2f3
+c
+                trihom(n2f+2) = (n1f+3)
+                trihom(n1f+3) = -(n2f+2)
+                trihom(n2f+3) = (n1f+2)
+                trihom(n1f+2) = -(n2f+3)
+c
+              endif
+c
+            elseif ( abs(arehom(a2s2s3)).eq.a1s1s3 ) then
+c
+c             les aretes 1 et 2 correspondent
+c             donc on a correspondance entre
+c             les triangles n2f+1 et n1f+2
+c             les aretes a2f1 et a1f2
+c
+              arehom(a2f1) = a1f2
+              arehom(a1f2) = -a2f1
+c
+              trihom(n2f+1) = (n1f+2)
+              trihom(n1f+2) = -(n2f+1)
+c
+              if ( abs(arehom(a2s1s3)).eq.a1s2s3 ) then
+c
+c               les aretes 2 et 1 correspondent
+c               donc on a correspondance entre
+c               les triangles n2f+2 et n1f+1
+c               les triangles n2f+3 et n1f+3
+c               les aretes a2f2 et a1f1
+c               les aretes a2f3 et a1f3
+c
+                arehom(a2f2) = a1f1
+                arehom(a1f1) = -a2f2
+                arehom(a2f3) = a1f3
+                arehom(a1f3) = -a2f3
+c
+                trihom(n2f+2) = (n1f+1)
+                trihom(n1f+1) = -(n2f+2)
+                trihom(n2f+3) = (n1f+3)
+                trihom(n1f+3) = -(n2f+3)
+c
+              else
+c
+c               les aretes 2 et 3 correspondent
+c               donc on a correspondance entre
+c               les triangles n2f+2 et n1f+3
+c               les triangles n2f+3 et n1f+1
+c               les aretes a2f2 et a1f3
+c               les aretes a2f3 et a1f1
+c
+                arehom(a2f2) = a1f3
+                arehom(a1f3) = -a2f2
+                arehom(a2f3) = a1f1
+                arehom(a1f1) = -a2f3
+c
+                trihom(n2f+2) = (n1f+3)
+                trihom(n1f+3) = -(n2f+2)
+                trihom(n2f+3) = (n1f+1)
+                trihom(n1f+1) = -(n2f+3)
+c
+              endif
+c
+            elseif ( abs(arehom(a2s2s3)).eq.a1s1s2 ) then
+c
+c             les aretes 1 et 3 correspondent
+c             donc on a correspondance entre
+c             les triangles n2f+1 et n1f+3
+c             les aretes a2f1 et a1f3
+c
+              arehom(a2f1) = a1f3
+              arehom(a1f3) = -a2f1
+c
+              trihom(n2f+1) = (n1f+3)
+              trihom(n1f+3) = -(n2f+1)
+c
+              if ( abs(arehom(a2s1s3)).eq.a1s2s3 ) then
+c
+c               les aretes 2 et 1 correspondent
+c               donc on a correspondance entre
+c               les triangles n2f+2 et n1f+1
+c               les triangles n2f+3 et n1f+2
+c               les aretes a2f2 et a1f1
+c               les aretes a2f3 et a1f2
+c
+                arehom(a2f2) = a1f1
+                arehom(a1f1) = -a2f2
+                arehom(a2f3) = a1f2
+                arehom(a1f2) = -a2f3
+c
+                trihom(n2f+2) = (n1f+1)
+                trihom(n1f+1) = -(n2f+2)
+                trihom(n2f+3) = (n1f+2)
+                trihom(n1f+2) = -(n2f+3)
+c
+              else
+c
+c               les aretes 2 correspondent
+c               donc on a correspondance entre
+c               les triangles n2f+2 et n1f+2
+c               les triangles n2f+3 et n1f+1
+c               les aretes a2f2 et a1f3
+c               les aretes a2f3 et a1f1
+c
+                arehom(a2f2) = a1f2
+                arehom(a1f2) = -a2f2
+                arehom(a2f3) = a1f1
+                arehom(a1f1) = -a2f3
+c
+                trihom(n2f+2) = (n1f+2)
+                trihom(n1f+2) = -(n2f+2)
+                trihom(n2f+3) = (n1f+1)
+                trihom(n1f+1) = -(n2f+3)
+c
+              endif
+c
+            else
+              write (ulsort,texte(langue,10)) mess14(langue,3,2)
+            endif
+c
+          elseif ( etafac.eq.1 .or. etafac.eq.2 .or. etafac.eq.3 ) then
+c
+c 2.2. ==> le triangle vient d'etre decoupe en 2
+c          . il n'y a aucune regle d'ordre de creation des
+c          demi-triangles entre les deux meres homologues.
+c          . il n'y a pas de probleme d'axe a gerer, car letria est
+c          sur la face 2 par hypothese, et donc fach sur la face 1
+c          . la seule information dont on est certain est la
+c          correspondance entre les filles des aretes decoupees : le
+c          tableau arehom a ete mis a jour precedemment
+c
+c             letria                         fach
+c
+c               s2i                           s1i
+c                x                             x
+c               ...                           ...
+c              . . .                         . . .
+c       are2j .  .  . are2k   <-->    are1j .  .  . are1k
+c            .  a.   .                     .  a.   .
+c           .   n.    .                   .   n.    .
+c          .    2.     .                 .    1.     .
+c         . f2k  . f2j  .               . f1k  . f1j  .
+c        .       .       .             .       .       .
+c       x-----------------x           x-----------------x
+c     s2k  na2k n2  na2j  s2j       s1k na1k  n1  na1j  s1j
+c
+c        alternative :      f2k est homologue de f1k
+c                      ou : f2k est homologue de f1j
+c
+c 2.2.1. ==> recuperation des infos sur les fils de letria
+c
+            if ( etafac.eq.1 ) then
+c
+c             le triangle a ete decoupe en 2 par l'arete numero 1
+c
+c             recuperation des triangles fils
+c
+              f2k = filtri(letria) + nutrde(1,2)
+              f2j = filtri(letria) + nutrde(1,3)
+c
+c             recuperation des nouvelles aretes
+c
+              na2k = aretri(f2k,1)
+c
+              an2 = aretri(f2k,3)
+c
+            elseif ( etafac.eq.2 ) then
+c
+c             le triangle a ete decoupe en 2 par l'arete numero 2
+c
+c             recuperation des triangles fils
+c
+              f2k = filtri(letria) + nutrde(2,3)
+              f2j = filtri(letria) + nutrde(2,1)
+c
+c             recuperation des nouvelles aretes
+c
+              na2k = aretri(f2k,2)
+c
+              an2 = aretri(f2k,1)
+c
+            elseif ( etafac.eq.3 ) then
+c
+c             le triangle a ete decoupe en 2 par l'arete numero 3
+c
+c             recuperation des triangles fils
+c
+              f2k = filtri(letria) + nutrde(3,1)
+              f2j = filtri(letria) + nutrde(3,2)
+c
+c             recuperation des nouvelles aretes
+c
+              na2k = aretri(f2k,3)
+c
+              an2 = aretri(f2k,2)
+c
+            endif
+c
+c 2.2.2.  ==> recuperation des infos sur le triangle homologue
+c
+            fach = abs(trihom(letria))
+c
+            etafho = mod ( hettri(fach), 10 )
+c
+            if ( etafho.eq.1 ) then
+c
+c             le triangle a ete decoupe en 2 par l'arete numero 1
+c
+c             recuperation des triangles fils
+c
+              f1k = filtri(fach) + nutrde(1,2)
+              f1j = filtri(fach) + nutrde(1,3)
+c
+c             recuperation des nouvelles aretes
+c
+              na1k = aretri(f1k,1)
+              na1j = aretri(f1j,1)
+c
+              an1 = aretri(f1k,3)
+c
+            elseif ( etafho.eq.2 ) then
+c
+c             le triangle a ete decoupe en 2 par l'arete numero 2
+c
+c             recuperation des triangles fils
+c
+              f1k = filtri(fach) + nutrde(2,3)
+              f1j = filtri(fach) + nutrde(2,1)
+c
+c             recuperation des nouvelles aretes
+c
+              na1k = aretri(f1k,2)
+              na1j = aretri(f1j,2)
+c
+              an1 = aretri(f1k,1)
+c
+            elseif ( etafho.eq.3 ) then
+c
+c             le triangle a ete decoupe en 2 par l'arete numero 3
+c
+c             recuperation des triangles fils
+c
+              f1k = filtri(fach) + nutrde(3,1)
+              f1j = filtri(fach) + nutrde(3,2)
+c
+c             recuperation des nouvelles aretes
+c
+              na1k = aretri(f1k,3)
+              na1j = aretri(f1j,3)
+c
+              an1 = aretri(f1k,2)
+c
+            else
+c
+c             le triangle homologue n'est pas coupe en deux ???
+c
+              write (ulsort,texte(langue,5))mess14(langue,3,2),
+     >                                      letria, fach
+              write (ulsort,texte(langue,6))
+              write (ulsort,texte(langue,4)) mess14(langue,1,2),
+     >                                       letria, etafac
+              write (ulsort,texte(langue,4)) mess14(langue,1,2),
+     >                                       fach, etafho
+              codret = 2
+c
+            endif
+c
+c 2.2.3.  ==> reperage des homologues
+c
+            arehom(an2) = an1
+            arehom(an1) = -an2
+c
+            if ( arehom(na2k).eq.na1k ) then
+c
+              trihom(f2k) = f1k
+              trihom(f2j) = f1j
+              trihom(f1k) = -f2k
+              trihom(f1j) = -f2j
+c
+            elseif ( arehom(na2k).eq.na1j ) then
+c
+              trihom(f2k) = f1j
+              trihom(f2j) = f1k
+              trihom(f1k) = -f2j
+              trihom(f1j) = -f2k
+c
+            else
+c
+c             l'arete n'a pas d'homologue ?
+c
+              write (ulsort,texte(langue,5)) mess14(langue,3,2),
+     >                                       letria, fach
+              write (ulsort,texte(langue,9))
+     >                              na2k, somare(1,na2k), somare(2,na2k)
+              write (ulsort,texte(langue,7)) arehom(na2k)
+              if ( arehom(na2k).ne.0 ) then
+                write (ulsort,texte(langue,9)) abs(arehom(na2k)),
+     >          somare(1,abs(arehom(na2k))), somare(2,abs(arehom(na2k)))
+              endif
+              write (ulsort,texte(langue,8)) na1k, na1j
+              write (ulsort,texte(langue,9))
+     >                              na1k, somare(1,na1k), somare(2,na1k)
+              write (ulsort,texte(langue,9))
+     >                              na1j, somare(1,na1j), somare(2,na1j)
+              codret = 2
+c
+            endif
+c
+          endif
+c
+        endif
+c
+   21 continue
+c
+c====
+c 3. la fin
+c====
+c
+      if ( codret.ne.0 ) then
+c
+#include "envex2.h"
+c
+      write (ulsort,texte(langue,1)) 'Sortie', nompro
+      write (ulsort,texte(langue,2)) codret
+c
+      endif
+c
+#ifdef _DEBUG_HOMARD_
+      write (ulsort,texte(langue,1)) 'Sortie', nompro
+      call dmflsh (iaux)
+#endif
+c
+      end