Salome HOME
Homard executable
[modules/homard.git] / src / tool / Gestion_MTU / gmcmpr.F
diff --git a/src/tool/Gestion_MTU/gmcmpr.F b/src/tool/Gestion_MTU/gmcmpr.F
new file mode 100644 (file)
index 0000000..f96fbfa
--- /dev/null
@@ -0,0 +1,384 @@
+      subroutine gmcmpr ( 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  - interet:
+c    . Aucun en mode dynamique de gestion de la memoire !!!!!
+c    . En mode statique, on elimine les trous laisses entre les
+c      differents tableaux entiers, reels et character*8
+c      de maniere a offrir le maximum de place disponible en un seul
+c      trou situe en fin des tableaux de travail.
+c      attention la reallocation se fait sans reinitialiser la memoire
+c      en mettant lindef a 1. lindef est remis a 0 en fin de programme.
+c
+c      La technique est la suivante :
+c      Tant qu'il reste au moins deux trous (en effet, s'il n'en reste
+c      qu'un, il est forcement a la fin, donc c'est gagne !) :
+c      a. recherche du premier tableau qui suit le premier trou.
+c      b. memorisation de son nom, son adresse utile, sa longueur
+c      c. retrait de ses references des tables de GM
+c      d. allocation d'un tableau de meme nom et de meme longueur : GM
+c         va forcement le placer au debut du premier trou et creer
+c         un trou a sa suite
+c      e. si le tableau n'est pas de longueur nulle, decalage du contenu
+c
+c    - restriction d'utilisation
+c      apres cet appel, il faut prendre soin de rechercher
+c      les nouveaux pointeurs des tableaux toujours en usage par appel
+c      a gmadoj
+c
+c ______________________________________________________________________
+c .        .     .        .                                            .
+c .  nom   . e/s . taille .           description                      .
+c .____________________________________________________________________.
+c . codret .  s  . ent    . code retour de l'operation                 .
+c .        .     .        .  0 : OK                                    .
+c .        .     .        .  2 : probleme                              .
+c ______________________________________________________________________
+c
+c====
+c 0. declarations et dimensionnement
+c====
+c
+c 0.1. ==> generalites
+c
+      implicit none
+      save
+c
+#include "gmmaxt.h"
+c
+c 0.2. ==> communs
+c
+#include "gmtyge.h"
+c
+#include "gmenti.h"
+#include "gmreel.h"
+#include "gmstri.h"
+c
+#include "gmtrrl.h"
+#include "gmtren.h"
+#include "gmtrst.h"
+c
+#include "gmalrl.h"
+#include "gmalen.h"
+#include "gmalst.h"
+c
+#include "gmadui.h"
+#include "gmadur.h"
+#include "gmadus.h"
+c
+#include "gmimpr.h"
+c
+#include "gmindf.h"
+c
+c 0.3. ==> arguments
+c
+      integer codret
+c
+c 0.4. ==> variables locales
+c
+      character*8 nomtab
+      character*16 blabla
+c
+      integer aduold, ilongr, adunew, iptfin
+      integer iaux, ideb, nrotab
+c
+      logical detlg0
+c
+c 0.5. ==> initialisations
+c
+      detlg0 = .true.
+c ______________________________________________________________________
+c
+#ifdef _DEBUG_HOMARD_
+      write(ulsort,*) 'Compression de la memoire'
+#endif
+c
+#include "impr03.h"
+c
+c====
+c 1. Pas de compression en mode dynamique
+c====
+c
+      if ( modgm.eq.2) then
+c
+        codret = 0
+#ifdef _DEBUG_HOMARD_
+        write(ulsort,*) 'impossible en mode dynamique'
+#endif
+c
+      else
+c
+      lindef = 1
+c
+10000 format (//2x,' =======  spg gmcmpr  ==========',/2x,
+     >       'Zone en ',a16,/2x,
+     >       'le trou debutant en ',i4,' et de longueur ',i4,/2x,
+     > 'n''est pas contigu a un tableau entier alloue --> probleme')
+c
+c====
+c 2. traitement du tableau reel
+c====
+c
+#ifdef _DEBUG_HOMARD_
+      call gmdmpr ( iaux )
+#endif
+c
+      nrotab = 0
+c
+    2 continue
+c
+      if ( ntrour.gt.1 ) then
+c
+        blabla = 'reel            '
+c
+c 2.1. ==> on cherche le premier tableau alloue qui suit le trou "1"
+c          il suffit d'explorer a partir du dernier trouve
+c
+        iptfin = ptrour(1) + ltrour(1)
+c
+        ideb = nrotab + 1
+        do 21 , iaux = ideb , nballr
+           if ( ptallr(iaux).eq.iptfin ) then
+            nrotab = iaux
+            goto 22
+          endif
+   21   continue
+c
+c --> pb de consistance entre les trous et les variables allouees
+c
+        write(ulsort,10000) blabla, ptrour(1), ltrour(1)
+        iaux = 3
+        call gmdmpr ( iaux )
+        call ugstop ( 'gmcmpr-reel', ulsort, 0, 1, 1 )
+c
+c 2.2. ==> on libere ce tableau (apres avoir memorise ses
+c          caracteristiques)
+c
+   22   continue
+c
+        aduold = adur(nrotab)
+        ilongr = lgallr(nrotab)
+        nomtab = nomalr(nrotab)
+c
+        call gmdesr ( nomtab , ilongr , detlg0)
+c
+c 2.3. ==> on le realloue (--> on detruit ainsi le trou precedant
+c          qui se propage vers la droite )
+c          attention, l'adresse renvoyee est l'adresse utile
+c
+        call gmalor ( nomtab , adunew , ilongr )
+c
+c 2.4. ==> on translate son contenu de l'ancienne position a la nouvelle
+c          si le tableau n'est pas de longueur nulle
+c
+        if ( ilongr.ne.0 ) then
+          call gmshfr ( rmem , adunew , aduold , ilongr )
+        endif
+c
+c 2.5. ==> on recommence jusqu'a epuisement
+c
+        goto 2
+c
+      endif
+c
+#ifdef _DEBUG_HOMARD_
+      call gmdmpr ( iaux )
+#endif
+c
+c====
+c 3. traitement du tableau entier
+c    on n'effectue un passage que s'il existe plusieurs trous dans
+c    le tableau, car quand il n'y en a qu'un, il est au bout.
+c====
+c
+#ifdef _DEBUG_HOMARD_
+      call gmdmpi ( iaux )
+#endif
+c
+      nrotab = 0
+c
+  3   continue
+c
+      if ( ntroui.gt.1 ) then
+c
+        blabla = 'entier          '
+c
+c 3.1. ==> on cherche le premier tableau alloue qui suit le trou "1"
+c          il suffit d'explorer a partir du dernier trouve
+c
+        iptfin = ptroui(1) + ltroui(1)
+c
+        ideb = nrotab + 1
+        do 31 , iaux = ideb , nballi
+          if ( ptalli(iaux).eq.iptfin ) then
+            nrotab = iaux
+            goto 32
+          endif
+   31   continue
+c
+c --> pb de consistance entre les trous et les variables allouees
+c
+        write(ulsort,10000) blabla, ptroui(1), ltroui(1)
+        iaux = 3
+        call gmdmpi ( iaux )
+        call ugstop ( 'gmcmpr_entier', ulsort, 0, 1, 1 )
+c
+c 3.2. ==> on libere ce tableau (apres avoir memorise ses
+c          caracteristiques)
+c
+   32   continue
+c
+        aduold = adui(nrotab)
+        ilongr = lgalli(nrotab)
+        nomtab = nomali(nrotab)
+c
+        call gmdesi ( nomtab , ilongr , detlg0)
+c
+c 3.3. ==> on le realloue (--> on detruit ainsi le trou precedant
+c          qui se propage vers la droite )
+c          attention, l'adresse renvoyee est l'adresse utile
+c
+        call gmaloi ( nomtab , adunew , ilongr )
+c
+c 3.4. ==> on translate son contenu de l'ancienne position a la nouvelle
+c          si le tableau n'est pas de longueur nulle
+c
+        if ( ilongr.ne.0 ) then
+          call gmshfi ( imem , adunew , aduold , ilongr )
+        endif
+c
+c 3.5. ==> on recommence jusqu'a epuisement
+c
+        goto 3
+c
+      endif
+c
+#ifdef _DEBUG_HOMARD_
+      call gmdmpi ( iaux )
+#endif
+c
+c====
+c 4. traitement du tableau character*8
+c====
+c
+#ifdef _DEBUG_HOMARD_
+      call gmdmps ( iaux )
+#endif
+c
+      nrotab = 0
+c
+  4   continue
+c
+      if ( ntrous.gt.1 ) then
+c
+        blabla = 'caractere       '
+c
+c 4.1. ==> on cherche le premier tableau alloue qui suit le trou "1"
+c          il suffit d'explorer a partir du dernier trouve
+c
+        iptfin = ptrous(1) + ltrous(1)
+c
+        ideb = nrotab + 1
+        do 41 , iaux = ideb , nballs
+           if ( ptalls(iaux).eq.iptfin ) then
+            nrotab = iaux
+            goto 42
+          endif
+   41   continue
+c
+c --> pb de consistance entre les trous et les variables allouees
+c
+        write(ulsort,10000) blabla, ptrous(1), ltrous(1)
+        iaux = 3
+        call gmdmps ( iaux )
+        call ugstop ( 'gmcmpr-caractere', ulsort, 0, 1, 1 )
+c
+c 4.2. ==> on libere ce tableau (apres avoir memorise ses
+c          caracteristiques)
+c
+   42   continue
+c
+        aduold = adus(nrotab)
+        ilongr = lgalls(nrotab)
+        nomtab = nomals(nrotab)
+c
+        call gmdess ( nomtab , ilongr , detlg0)
+c
+c 4.3. ==> on le realloue (--> on detruit ainsi le trou precedant
+c          qui se propage vers la droite )
+c          attention, l'adresse renvoyee est l'adresse utile
+c
+        call gmalos ( nomtab , adunew , ilongr )
+c
+c 4.4. ==> on translate son contenu de l'ancienne position a la nouvelle
+c          si le tableau n'est pas de longueur nulle
+c
+        if ( ilongr.ne.0 ) then
+          call gmshfs ( smem , adunew , aduold , ilongr )
+        endif
+c
+c 4.5. ==> on recommence jusqu'a epuisement
+c
+        goto 4
+c
+      endif
+c
+#ifdef _DEBUG_HOMARD_
+      call gmdmps ( iaux )
+#endif
+c
+c====
+c 5. fin du travail
+c====
+c
+      minler = min(minler,minmer)
+      if ( ntrour.ne.0 ) then
+        minmer = ltrour(1)
+        if ( nballr.ne.0 ) then
+          nommxr = nomalr(nballr)
+        endif
+      endif
+c
+      minlei = min(minlei,minmei)
+      if ( ntroui.ne.0 ) then
+        minmei = ltroui(1)
+        if ( nballi.ne.0 ) then
+          nommxi = nomali(nballi)
+        endif
+      endif
+c
+      minles = min(minles,minmes)
+      if ( ntrous.ne.0 ) then
+        minmes = ltrous(1)
+        if ( nballs.ne.0 ) then
+          nommxs = nomals(nballs)
+        endif
+      endif
+c
+c lindef est remis a 0 pour permettre de nouveau l'initialisation
+c
+      lindef = 0
+c
+      codret = 0
+c
+      endif
+c
+      end