11 use,
INTRINSIC :: ieee_arithmetic
16 REAL,
PARAMETER :: PPFLOATMIN = 2.0**(-126)
18 INTEGER,
INTENT(IN) :: KX,KY
20 INTEGER,
INTENT(IN) :: KNBTOT
21 REAL(KIND=8),
DIMENSION(KNBTOT),
INTENT(INOUT) :: XTAB
23 INTEGER,
INTENT(OUT) :: KNBUSE
26 INTEGER,
DIMENSION(:),
ALLOCATABLE :: ITAB
35 INTEGER :: GRPIDX,GRPOFF,IDXSAVE,OFFSAVE
38 CHARACTER(LEN=8),
PARAMETER :: KEYWORD=
'COMPRESS' 39 REAL,
DIMENSION(KNBTOT) :: XWORKTAB
40 LOGICAL :: LUPREAL,LNAN
42 LOGICAL,
EXTERNAL :: IEEE_IS_NAN
51 IF (ieee_is_nan(xtab(ji)))
THEN 54 ELSE IF (abs(xtab(ji)) > huge(1.0_4))
THEN 55 xtab(ji) = sign(
REAL(HUGE(1.0_4)/1.1,8),XTAB(ji))
57 ELSEIF (abs(xtab(ji)) < tiny(1.0_4))
THEN 64 print *,
'MINVAL,MAXVAL= ',xmin,xmax
65 IF (lnan) print *,
"==================> NAN values DETECTED : set to 0.0" 66 IF (lupreal) print *,
"==================> OVERFLOW values DETECTED : set to ",huge(1.0_4)/1.1
77 CALL fill_bbuff(xtab,8,ichar(keyword(ii:ii)))
82 IF (xmin == xmax)
THEN 83 print *,
"--------> CONSTANT ARRAY !" 85 CALL fill_bbuff(xtab,32,knbtot)
86 CALL fill_bbuff(xtab,32,xmin)
87 CALL get_fillidx(knbuse,bitoffset)
93 inblev = knbtot/(ilevnbelt)
94 IF (knbtot /= (inblev*ilevnbelt))
THEN 95 print *,
'Pb in COMPRESS_FIELD : KNBTOT must be a multiple of KX*KY' 101 ALLOCATE(itab(ilevnbelt))
105 CALL fill_bbuff(xtab,32,knbtot)
106 CALL fill_bbuff(xtab,32,kx)
107 CALL fill_bbuff(xtab,32,ky)
110 ind1=(ji-1)*ilevnbelt+1
112 IF (
lpdebug) print *,
"---- Compressing Level ",ji,
" ----" 117 gelt = maxval(sopres%IEND(1:sopres%NBGRP)-sopres%IBEG(1:sopres%NBGRP)+1)
119 CALL get_fillidx(grpidx,grpoff)
120 CALL fill_bbuff(xtab,32,sopres%NBGRP)
121 CALL fill_bbuff(xtab,5,ibe)
123 nbgroupmod = sopres%NBGRP
125 gelt = sopres%IEND(ii)-sopres%IBEG(ii)+1
131 IF (nbitcod >= 16)
THEN 132 print *,
'-----> ERREUR FATALE : Groupe',ii,
'codage sur ',nbitcod,
'bits' 136 IF ((17*gelt) < (17+4+ibe+nbitcod*gelt))
THEN 138 DO jj=sopres%IBEG(ii),sopres%IEND(ii)
140 CALL fill_bbuff(xtab,1,1)
141 CALL fill_bbuff(xtab,16,itab(jj))
143 nbgroupmod = nbgroupmod+gelt-1
145 CALL fill_bbuff(xtab,1,0)
146 CALL fill_bbuff(xtab,16,sopres%VALMIN(ii))
147 CALL fill_bbuff(xtab,4,nbitcod)
148 CALL fill_bbuff(xtab,ibe,gelt)
149 IF (nbitcod > 0)
THEN 150 DO jj=sopres%IBEG(ii),sopres%IEND(ii)
152 CALL fill_bbuff(xtab,nbitcod,itab(jj)-sopres%VALMIN(ii))
158 CALL fill_bbuff(xtab,1,1)
159 CALL fill_bbuff(xtab,16,sopres%VALMIN(ii))
162 IF (nbgroupmod > sopres%NBGRP)
THEN 164 CALL get_fillidx(idxsave,offsave)
165 CALL set_fillidx(grpidx,grpoff)
166 CALL fill_bbuff(xtab,32,nbgroupmod)
167 CALL set_fillidx(idxsave,offsave)
172 CALL get_fillidx(idxsave,offsave)
180 REAL,
DIMENSION(:),
INTENT(IN) :: PTAB
181 INTEGER,
DIMENSION(:),
INTENT(OUT):: KTAB
182 INTEGER,
INTENT(OUT):: KEXTCOD
184 LOGICAL,
DIMENSION(SIZE(PTAB)) :: GMASK
185 REAL :: XMIN1,XMAX1,XRANGE1
186 REAL :: XMIN2,XMAX2,XRANGE2
187 REAL :: XREF,XMAX,XCOEFF
190 LOGICAL :: GMINEXCL,GMAXEXCL,GLOG
193 xmin1=minval(ptab(:))
194 xmax1=maxval(ptab(:))
196 IF (
lpdebug) print *,
"XMIN1,XMAX1,XRANGE1 = ",xmin1,xmax1,xrange1
198 IF (xrange1 > 0.)
THEN 199 xmin2=minval(ptab,
mask=ptab>xmin1)
200 xmax2=maxval(ptab,
mask=ptab<xmax1)
201 xrange2 = xmax2-xmin2
202 IF (
lpdebug) print *,
"XMIN2,XMAX2,XRANGE2 = ",xmin2,xmax2,xrange2
203 IF (xrange2 > 0.)
THEN 215 IF (xmin1 >= 0. .AND. xmax1 < 1.)
THEN 216 IF ((xmax2/xmin2)>10.)
THEN 222 IF (xmin1 == 0.0)
THEN 234 xrange2 = xmax2 - xref
235 IF (
lpdebug) print *,
"EXTENCOD, LOG conversion enabled : XMIN1, XREF, XMAX1, XMAX2 =",&
236 &xmin1,xref,xmax1,xmax2
240 IF ((xmin2-xmin1) > xrange2)
THEN 250 IF (
lpdebug) print *,
"EXTENCOD, Min value isolated :",xmin1
254 IF ((xmax1-xmax2) > xrange2)
THEN 266 IF (
lpdebug) print *,
"EXTENCOD, and Max value isolated :",xmax1
269 IF (
lpdebug) print *,
"EXTENCOD, Max value isolated :",xmax1
274 xcoeff=(xmax-xref)/intrange
275 IF (xcoeff < ppfloatmin)
THEN 277 print *,
"very low range DATA : XCOEFF set to",xcoeff
279 IF (
lpdebug) print *,
"XCOEFF = ",xcoeff
282 ktab = indcor + nint((log(ptab)-xref)/xcoeff)
286 ktab = indcor + nint((ptab(:)-xref)/xcoeff)
289 IF (
lpdebug) print *,
"KEXTCOD = ",kextcod
290 CALL fill_bbuff(xtab,3,kextcod)
291 IF (glog)
CALL fill_bbuff(xtab,3,iextcod2)
292 IF (gminexcl)
CALL fill_bbuff(xtab,32,xmin1)
293 IF (gmaxexcl)
CALL fill_bbuff(xtab,32,xmax1)
294 CALL fill_bbuff(xtab,32,xref)
295 CALL fill_bbuff(xtab,32,xcoeff)
297 IF (xrange2 < 0.)
THEN 303 IF (
lpdebug) print *,
"EXTENCOD, 2 values in array :",xmin1,xmax1
305 CALL fill_bbuff(xtab,3,kextcod)
306 CALL fill_bbuff(xtab,32,xmin1)
307 CALL fill_bbuff(xtab,32,xmax1)
320 IF (
lpdebug) print *,
"EXTENCOD, 3 values in array :",xmin1,xmin2,xmax1
322 CALL fill_bbuff(xtab,3,kextcod)
323 CALL fill_bbuff(xtab,32,xmin1)
324 CALL fill_bbuff(xtab,32,xmin2)
325 CALL fill_bbuff(xtab,32,xmax1)
331 WHERE (ptab > xmin2) ktab = 2
338 CALL fill_bbuff(xtab,3,kextcod)
339 CALL fill_bbuff(xtab,32,xmin1)
340 IF (
lpdebug) print *,
"EXTENCOD, constant array : ",xmin1
integer, parameter jpcstencod
integer, parameter jpother
integer, parameter jpnorm
subroutine ini_sopdata(SOPDATA)
integer, parameter jp2val
subroutine invertcol(ITAB, KX, KY)
integer, external fminbits_in_word
integer, parameter jpminmaxexcl
subroutine comp_fopext(PTAB, KTAB, KEXTCOD)
integer, parameter jpextencod
logical, parameter lpdebug
integer, parameter jpconst
subroutine recsearch(KTAB, SOPDATA)
integer, parameter jp3val
integer, parameter jpminexcl
subroutine compress_field(XTAB, KX, KY, KNBTOT, KNBUSE)
integer, parameter jpmaxexcl