--- /dev/null
+ 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