SURFEX v8.1
General documentation of Surfex
compact.F90
Go to the documentation of this file.
1 SUBROUTINE compact(PVALCO_COMPACT,KNELEM,KBITEXPONENT,KBITRADICAL,KPACK)
2 
3 USE parkind1 , ONLY : jprb
4 USE yomhook , ONLY : lhook, dr_hook
5 
6 IMPLICIT NONE
7 
8 INTEGER(KIND=4) :: KNELEM
9 REAL(KIND=8) :: PVALCO_COMPACT(knelem)
10 REAL(KIND=8) :: ZCOEF,VALMIN,VALMAX
11 INTEGER(KIND=4) :: KBITEXPONENT,KBITRADICAL
12 INTEGER(KIND=8) :: KPACK(knelem)
13 
14 REAL(KIND=4) :: ZTMPBUF
15 INTEGER(KIND=4) :: ITMPBUF
16 INTEGER(KIND=8) :: ICMPBUF,ILENGTH
17 INTEGER(KIND=4),ALLOCATABLE :: IBUF(:)
18 INTEGER(KIND=4) :: IPROMA,IPTRTAB,IPTRBIT,IENDBIT,I4B0,I4B1
19 INTEGER(KIND=2) :: I2B0,I2B1,I2B2,I2B3
20 
21 REAL(KIND=JPRB) :: ZHOOK_HANDLE
22 
23 equivalence(ztmpbuf,itmpbuf)
24 
25 IF (lhook) CALL dr_hook('COMPACT',0,zhook_handle)
26 
27 !SOLUTION 1 CA MARCHE MAIS CA COMPRESSE PAS TELLEMENT
28 !DO IPROMA=1,KNELEM
29 ! ZTMPBUF=PVALCO_COMPACT(IPROMA)
30 ! KPACK(IPROMA)=ITMPBUF
31 !END DO
32 
33 !SOLUTION 2
34 kpack=0
35 valmin=minval(pvalco_compact(1:knelem))
36 ztmpbuf=valmin
37 i4b0=itmpbuf
38 valmax=maxval(pvalco_compact(1:knelem))
39 ztmpbuf=valmax
40 icmpbuf=itmpbuf
41 kpack(1)=ishft(icmpbuf,32)
42 kpack(1)=kpack(1)+i4b0
43 ilength=1
44 zcoef=(2**kbitradical-1)
45 iptrbit=0
46 iptrtab=2
47 IF (valmax-valmin<=0.0) THEN
48 !WRITE(6,*) 'DEBUG COMPACT VALMAX-VALMIN inf zero'
49 !WRITE(6,*) 'DEBUG COMPACT',VALMAX,VALMIN
50 !WRITE(6,*) 'DEBUG COMPACT',PVALCO_COMPACT(1:10)
51 !CALL ABORT('DIVISION PAR ZERO')
52 knelem=1
53 ELSE
54 
55 DO iproma=1,knelem
56 icmpbuf=(pvalco_compact(iproma)-valmin)/(valmax-valmin)*zcoef
57 !PRINT*, ICMPBUF
58 !WRITE(*,"32I1") (IBITS(ICMPBUF,II,1),II=0,63)
59 
60 IF (iptrbit+kbitradical<64) THEN
61 kpack(iptrtab)=kpack(iptrtab)+ishft(ibits(icmpbuf,0,kbitradical),iptrbit)
62 iptrbit=iptrbit+kbitradical
63 ELSE
64 iendbit=64-iptrbit
65 kpack(iptrtab)=kpack(iptrtab)+ishft(ibits(icmpbuf,0,iendbit),iptrbit)
66 iptrtab=iptrtab+1
67 iptrbit=0
68 kpack(iptrtab)=ibits(icmpbuf,iendbit,kbitradical-iendbit)
69 iptrbit=kbitradical-iendbit
70 END IF
71 END DO
72 !WRITE(*,"32I1") (IBITS(KPACK(2),II,1),II=0,63)
73 knelem=iptrtab+1
74 END IF
75 
76 !SOLUTION 3 CA MARCHE PAS BIEN
77 !ALLOCATE(IBUF(KNELEM))
78 !IBUF=0
79 
80 !DO IPROMA=1,KNELEM
81 ! ZTMPBUF=PVALCO_COMPACT(IPROMA)
82 ! IBUF(IPROMA)=IBITS(ITMPBUF,23-KBITRADICAL,KBITRADICAL)&
83 ! &+ISHFT(IBITS(ITMPBUF,23,KBITEXPONENT),KBITRADICAL)&
84 ! &+ISHFT(IBITS(ITMPBUF,30,2),KBITRADICAL+KBITEXPONENT)
85 !END DO
86 
87 !WRITE(6,*) 'DEBUG COMPACT',IBUF(1)
88 
89 !IPTRBIT=0
90 !IPTRTAB=1
91 !KPACK=0
92 !DO IPROMA=1,KNELEM
93 !!WRITE(6,*) 'DEBUG COMAPCT 4',IPROMA
94 !!CALL FLUSH(6)
95 ! IF (IPTRBIT+KBITRADICAL+2+KBITEXPONENT<64) THEN
96 ! ICMPBUF=IBUF(IPROMA)
97 ! KPACK(IPTRTAB)=KPACK(IPTRTAB)+ISHFT(IBITS(ICMPBUF,0,KBITRADICAL+2+KBITEXPONENT),(IPTRBIT))
98 ! IPTRBIT=IPTRBIT+KBITRADICAL+2+KBITEXPONENT
99 !
100 ! ELSE
101 ! IENDBIT=64-IPTRBIT
102 ! ICMPBUF=IBUF(IPROMA)
103 
104 ! KPACK(IPTRTAB)=KPACK(IPTRTAB)+ISHFT(IBITS(ICMPBUF,0,IENDBIT),(IPTRBIT))
105 ! IPTRBIT=0
106 ! IPTRTAB=IPTRTAB+1
107 ! KPACK(IPTRTAB)=IBITS(ICMPBUF,IENDBIT,KBITRADICAL+2+KBITEXPONENT-IENDBIT)
108 ! IPTRBIT=IPTRBIT+KBITRADICAL+2+KBITEXPONENT-IENDBIT
109 ! END IF
110 ! KNELEM=IPTRTAB
111 !END DO
112 
113 IF (lhook) CALL dr_hook('COMPACT',1,zhook_handle)
114 
115 END SUBROUTINE compact
subroutine compact(PVALCO_COMPACT, KNELEM, KBITEXPONENT, KBITRADICAL, KPACK)
Definition: compact.F90:2
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15