SURFEX v8.1
General documentation of Surfex
mode_searchgrp.f90
Go to the documentation of this file.
1 !-----------------------------------------------------------------
2 !--------------- special set of characters for RCS information
3 !-----------------------------------------------------------------
4 ! $Source: /mesonh/MAKE/lib/COMPRESS/src/searchgrp.f90,v $ $Revision: 1.1 $ $Date: 2003/02/14 16:06:01 $
5 !-----------------------------------------------------------------
6 !-----------------------------------------------------------------
8 IMPLICIT NONE
9 TYPE sop_t
10  INTEGER :: nbgrp
11  INTEGER,DIMENSION(:),POINTER :: ibeg
12  INTEGER,DIMENSION(:),POINTER :: iend
13  INTEGER,DIMENSION(:),POINTER :: valmin
14  INTEGER,DIMENSION(:),POINTER :: valmax
15 END TYPE sop_t
16 
17 INTEGER,EXTERNAL :: fminbits_in_word
18 
19 ! Private variables
20 INTEGER,SAVE, PRIVATE :: igrp
21 INTEGER,DIMENSION(:),ALLOCATABLE,TARGET,PRIVATE :: ibeg,iend,valmax,valmin
22 INTEGER,PARAMETER, PRIVATE :: mainseuil=8
23 INTEGER,SAVE, PRIVATE :: igrpmax
24 INTEGER,SAVE, PRIVATE :: icount
25 INTEGER,DIMENSION(16),PARAMETER, PRIVATE :: minelt=(/4,4,4,4,5,5,6,6,7,8,9,11,13,17,26,51/)
26 
27 ! Private routines
28 PRIVATE :: recsearch_grp
29 
30 CONTAINS
31 SUBROUTINE ini_sopdata(SOPDATA)
32 TYPE(sop_t), INTENT(OUT) :: SOPDATA
33 
34 sopdata%NBGRP = 0
35 NULLIFY(sopdata%IBEG)
36 NULLIFY(sopdata%IEND)
37 NULLIFY(sopdata%VALMIN)
38 NULLIFY(sopdata%VALMAX)
39 
40 END SUBROUTINE ini_sopdata
41 
42 SUBROUTINE recsearch(KTAB,SOPDATA)
43 INTEGER,DIMENSION(:) :: KTAB
44 TYPE(sop_t), INTENT(OUT) :: SOPDATA
45 
46 INTEGER :: NELT
47 INTEGER :: GELT,BGELT
48 
49 IF (ALLOCATED(ibeg)) THEN
50  DEALLOCATE(ibeg,iend,valmax,valmin)
51 END IF
52 
53 nelt=SIZE(ktab)
54 ALLOCATE(ibeg(nelt),iend(nelt),valmax(nelt),valmin(nelt))
55 icount = 0
56 igrp = 0
57 igrpmax = nelt
58  CALL recsearch_grp(1,nelt,ktab,mainseuil)
59 gelt = maxval(iend(1:igrp)-ibeg(1:igrp)+1)
60 bgelt = fminbits_in_word(gelt)
61 
62 #ifdef DEBUG
63 print *,'Routine RECSEARCH_GRP appelee',icount,'fois.'
64 print *,'Nbre de groupes =',igrp
65 print *,'Nbre maxi d''elements dans groupes',gelt
66 print *,'Nbre de bits pour coder le nombre d''elements:',bgelt
67 #endif
68 
69 sopdata%NBGRP=igrp
70 sopdata%IBEG=>ibeg
71 sopdata%IEND=>iend
72 sopdata%VALMIN=>valmin
73 sopdata%VALMAX=>valmax
74 
75 END SUBROUTINE recsearch
76 
77 RECURSIVE SUBROUTINE recsearch_grp(IND1,IND2,ITAB,ISEUIL)
78 INTEGER, INTENT(IN) :: IND1,IND2,ISEUIL
79 INTEGER,DIMENSION(:),INTENT(IN) :: ITAB
80 
81 INTEGER :: II
82 INTEGER :: IMAX,IMIN
83 INTEGER :: IVAL
84 INTEGER :: nbitcod
85 INTEGER :: tmpidx1,tmpidx2
86 
87 icount=icount+1
88 
89 IF (igrp == 0) THEN
90  imin = minval(itab(ind1:ind2))
91  imax = maxval(itab(ind1:ind2))
92  igrp = 1
93  valmin(igrp) = imin
94  valmax(igrp) = imax
95  ibeg(igrp) = ind1
96  iend(igrp) = ind2
97 ELSE
98  imin = valmin(igrp)
99  imax = valmax(igrp)
100 END IF
101 
102 IF (imax > imin) THEN
103 
104  ibeg(igrp) = ind1
105  iend(igrp) = ind1
106  valmin(igrp) = itab(ind1)
107  valmax(igrp) = itab(ind1)
108 
109  DO ii=ind1,ind2-1
110  ival = itab(ii+1)
111  imax=max(valmax(igrp),ival)
112  imin=min(valmin(igrp),ival)
113  IF ((imax-imin)<(2**iseuil)) THEN
114  ! II+1 belong to group IGRP
115  iend(igrp) = ii+1
116  valmin(igrp) = imin
117  valmax(igrp) = imax
118  ELSE
119  ! Search the created group
121 #ifdef DEBUG
122  print *,'F:(IGRP,IBEG,IEND,MAX,MIN,nbitcod)=',igrp,',',ibeg(igrp),',',iend(igrp),',',valmax(igrp),',',valmin(igrp),',',nbitcod
123 #endif
124  IF (iend(igrp)-ibeg(igrp)>minelt(nbitcod+1)) THEN
125  IF (nbitcod > 0) THEN
126  tmpidx1=ibeg(igrp)
127  tmpidx2=iend(igrp)
128 #ifdef DEBUG
129  print *,'Appel 1 RECSEARCH_GRP (first,last,seuil):',tmpidx1,tmpidx2,nbitcod/2
130 #endif
131  CALL recsearch_grp(tmpidx1,tmpidx2,itab,nbitcod/2)
132  END IF
133  ELSE
134  IF (igrp > 1) THEN
135  nbitcod=fminbits_in_word(valmax(igrp-1)-valmin(igrp-1))
136  imin=min(valmin(igrp-1),valmin(igrp))
137  imax=max(valmax(igrp-1),valmax(igrp))
138  IF (iend(igrp-1)-ibeg(igrp-1)<=minelt(nbitcod+1)) THEN
139  IF ((imax-imin) < 2**15) THEN
140  ! concat IGRP-1 and IGRP
141  iend(igrp-1) = iend(igrp)
142  valmin(igrp-1) = imin
143  valmax(igrp-1) = imax
144  igrp = igrp-1
145  END IF
146  ELSE
147  IF (fminbits_in_word(imax-imin) <= nbitcod) THEN
148  ! concat IGRP-1 and IGRP
149  iend(igrp-1) = iend(igrp)
150  valmin(igrp-1) = imin
151  valmax(igrp-1) = imax
152  igrp = igrp-1
153  END IF
154  END IF
155  END IF
156  END IF
157  ! New group is created
158  igrp = igrp+1
159  IF (igrp>igrpmax) THEN
160  print *,'ERROR max number of group exceeded !'
161  stop
162  END IF
163  ibeg(igrp) = ii+1
164  iend(igrp) = ii+1
165  valmin(igrp) = ival
166  valmax(igrp) = ival
167  END IF
168  END DO
169 #ifdef DEBUG
171 #endif
172  nbitcod = fminbits_in_word(valmax(igrp)-valmin(igrp))
173  IF (iend(igrp)-ibeg(igrp)>= minelt(nbitcod+1)) THEN
174  IF (nbitcod > 0) THEN
175  tmpidx1=ibeg(igrp)
176  tmpidx2=iend(igrp)
177 #ifdef DEBUG
178  print *,'Appel 2 RECSEARCH_GRP (first,last,seuil):',tmpidx1,tmpidx2,nbitcod/2
179 #endif
180  CALL recsearch_grp(tmpidx1,tmpidx2,itab,nbitcod/2)
181  END IF
182  END IF
183 END IF
184 
185 END SUBROUTINE recsearch_grp
186 
187 SUBROUTINE invertcol(ITAB,KX,KY)
188 IMPLICIT NONE
189 INTEGER, INTENT(IN) :: KX,KY
190 INTEGER,DIMENSION(KX,KY), INTENT(INOUT)::ITAB
191 
192 itab(:,2:ky:2) = itab(kx:1:-1,2:ky:2)
193 
194 END SUBROUTINE invertcol
195 
196 END MODULE mode_searchgrp
integer, save, private igrp
integer, parameter, private mainseuil
subroutine ini_sopdata(SOPDATA)
subroutine invertcol(ITAB, KX, KY)
integer, external fminbits_in_word
integer, save, private igrpmax
integer, save, private icount
subroutine recsearch(KTAB, SOPDATA)
integer, dimension(16), parameter, private minelt
integer, dimension(:), allocatable, target, private ibeg
integer, dimension(:), allocatable, target, private valmax
integer, dimension(:), allocatable, target, private iend
integer, dimension(:), allocatable, target, private valmin
recursive subroutine, private recsearch_grp(IND1, IND2, ITAB, ISEUIL)