1 subroutine gmcmpr ( codret )
2 c ______________________________________________________________________
6 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
8 c Version originale enregistree le 18 juin 1996 sous le numero 96036
9 c aupres des huissiers de justice Simart et Lavoir a Clamart
10 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
11 c aupres des huissiers de justice
12 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
14 c HOMARD est une marque deposee d'Electricite de France
20 c ______________________________________________________________________
23 c . Aucun en mode dynamique de gestion de la memoire !!!!!
24 c . En mode statique, on elimine les trous laisses entre les
25 c differents tableaux entiers, reels et character*8
26 c de maniere a offrir le maximum de place disponible en un seul
27 c trou situe en fin des tableaux de travail.
28 c attention la reallocation se fait sans reinitialiser la memoire
29 c en mettant lindef a 1. lindef est remis a 0 en fin de programme.
31 c La technique est la suivante :
32 c Tant qu'il reste au moins deux trous (en effet, s'il n'en reste
33 c qu'un, il est forcement a la fin, donc c'est gagne !) :
34 c a. recherche du premier tableau qui suit le premier trou.
35 c b. memorisation de son nom, son adresse utile, sa longueur
36 c c. retrait de ses references des tables de GM
37 c d. allocation d'un tableau de meme nom et de meme longueur : GM
38 c va forcement le placer au debut du premier trou et creer
40 c e. si le tableau n'est pas de longueur nulle, decalage du contenu
42 c - restriction d'utilisation
43 c apres cet appel, il faut prendre soin de rechercher
44 c les nouveaux pointeurs des tableaux toujours en usage par appel
47 c ______________________________________________________________________
49 c . nom . e/s . taille . description .
50 c .____________________________________________________________________.
51 c . codret . s . ent . code retour de l'operation .
53 c . . . . 2 : probleme .
54 c ______________________________________________________________________
57 c 0. declarations et dimensionnement
60 c 0.1. ==> generalites
95 c 0.4. ==> variables locales
100 integer aduold, ilongr, adunew, iptfin
101 integer iaux, ideb, nrotab
105 c 0.5. ==> initialisations
108 c ______________________________________________________________________
110 #ifdef _DEBUG_HOMARD_
111 write(ulsort,*) 'Compression de la memoire'
117 c 1. Pas de compression en mode dynamique
120 if ( modgm.eq.2) then
123 #ifdef _DEBUG_HOMARD_
124 write(ulsort,*) 'impossible en mode dynamique'
131 10000 format (//2x,' ======= spg gmcmpr ==========',/2x,
132 > 'Zone en ',a16,/2x,
133 > 'le trou debutant en ',i4,' et de longueur ',i4,/2x,
134 > 'n''est pas contigu a un tableau entier alloue --> probleme')
137 c 2. traitement du tableau reel
140 #ifdef _DEBUG_HOMARD_
148 if ( ntrour.gt.1 ) then
152 c 2.1. ==> on cherche le premier tableau alloue qui suit le trou "1"
153 c il suffit d'explorer a partir du dernier trouve
155 iptfin = ptrour(1) + ltrour(1)
158 do 21 , iaux = ideb , nballr
159 if ( ptallr(iaux).eq.iptfin ) then
165 c --> pb de consistance entre les trous et les variables allouees
167 write(ulsort,10000) blabla, ptrour(1), ltrour(1)
170 call ugstop ( 'gmcmpr-reel', ulsort, 0, 1, 1 )
172 c 2.2. ==> on libere ce tableau (apres avoir memorise ses
177 aduold = adur(nrotab)
178 ilongr = lgallr(nrotab)
179 nomtab = nomalr(nrotab)
181 call gmdesr ( nomtab , ilongr , detlg0)
183 c 2.3. ==> on le realloue (--> on detruit ainsi le trou precedant
184 c qui se propage vers la droite )
185 c attention, l'adresse renvoyee est l'adresse utile
187 call gmalor ( nomtab , adunew , ilongr )
189 c 2.4. ==> on translate son contenu de l'ancienne position a la nouvelle
190 c si le tableau n'est pas de longueur nulle
192 if ( ilongr.ne.0 ) then
193 call gmshfr ( rmem , adunew , aduold , ilongr )
196 c 2.5. ==> on recommence jusqu'a epuisement
202 #ifdef _DEBUG_HOMARD_
207 c 3. traitement du tableau entier
208 c on n'effectue un passage que s'il existe plusieurs trous dans
209 c le tableau, car quand il n'y en a qu'un, il est au bout.
212 #ifdef _DEBUG_HOMARD_
220 if ( ntroui.gt.1 ) then
224 c 3.1. ==> on cherche le premier tableau alloue qui suit le trou "1"
225 c il suffit d'explorer a partir du dernier trouve
227 iptfin = ptroui(1) + ltroui(1)
230 do 31 , iaux = ideb , nballi
231 if ( ptalli(iaux).eq.iptfin ) then
237 c --> pb de consistance entre les trous et les variables allouees
239 write(ulsort,10000) blabla, ptroui(1), ltroui(1)
242 call ugstop ( 'gmcmpr_entier', ulsort, 0, 1, 1 )
244 c 3.2. ==> on libere ce tableau (apres avoir memorise ses
249 aduold = adui(nrotab)
250 ilongr = lgalli(nrotab)
251 nomtab = nomali(nrotab)
253 call gmdesi ( nomtab , ilongr , detlg0)
255 c 3.3. ==> on le realloue (--> on detruit ainsi le trou precedant
256 c qui se propage vers la droite )
257 c attention, l'adresse renvoyee est l'adresse utile
259 call gmaloi ( nomtab , adunew , ilongr )
261 c 3.4. ==> on translate son contenu de l'ancienne position a la nouvelle
262 c si le tableau n'est pas de longueur nulle
264 if ( ilongr.ne.0 ) then
265 call gmshfi ( imem , adunew , aduold , ilongr )
268 c 3.5. ==> on recommence jusqu'a epuisement
274 #ifdef _DEBUG_HOMARD_
279 c 4. traitement du tableau character*8
282 #ifdef _DEBUG_HOMARD_
290 if ( ntrous.gt.1 ) then
292 blabla = 'caractere '
294 c 4.1. ==> on cherche le premier tableau alloue qui suit le trou "1"
295 c il suffit d'explorer a partir du dernier trouve
297 iptfin = ptrous(1) + ltrous(1)
300 do 41 , iaux = ideb , nballs
301 if ( ptalls(iaux).eq.iptfin ) then
307 c --> pb de consistance entre les trous et les variables allouees
309 write(ulsort,10000) blabla, ptrous(1), ltrous(1)
312 call ugstop ( 'gmcmpr-caractere', ulsort, 0, 1, 1 )
314 c 4.2. ==> on libere ce tableau (apres avoir memorise ses
319 aduold = adus(nrotab)
320 ilongr = lgalls(nrotab)
321 nomtab = nomals(nrotab)
323 call gmdess ( nomtab , ilongr , detlg0)
325 c 4.3. ==> on le realloue (--> on detruit ainsi le trou precedant
326 c qui se propage vers la droite )
327 c attention, l'adresse renvoyee est l'adresse utile
329 call gmalos ( nomtab , adunew , ilongr )
331 c 4.4. ==> on translate son contenu de l'ancienne position a la nouvelle
332 c si le tableau n'est pas de longueur nulle
334 if ( ilongr.ne.0 ) then
335 call gmshfs ( smem , adunew , aduold , ilongr )
338 c 4.5. ==> on recommence jusqu'a epuisement
344 #ifdef _DEBUG_HOMARD_
352 minler = min(minler,minmer)
353 if ( ntrour.ne.0 ) then
355 if ( nballr.ne.0 ) then
356 nommxr = nomalr(nballr)
360 minlei = min(minlei,minmei)
361 if ( ntroui.ne.0 ) then
363 if ( nballi.ne.0 ) then
364 nommxi = nomali(nballi)
368 minles = min(minles,minmes)
369 if ( ntrous.ne.0 ) then
371 if ( nballs.ne.0 ) then
372 nommxs = nomals(nballs)
376 c lindef est remis a 0 pour permettre de nouveau l'initialisation