SURFEX v8.1
General documentation of Surfex
uncompact.F90
Go to the documentation of this file.
1 SUBROUTINE uncompact(PVALCO_COMPACT,KNELEM,KBITEXPONENT,KBITRADICAL,KPACK)
2 
3 USE parkind1 , ONLY : jprb, jprm
4 USE yomhook , ONLY : lhook, dr_hook
5 
6 IMPLICIT NONE
7 
8 INTEGER(KIND=4) :: KNELEM
9 REAL(KIND=JPRB) :: PVALCO_COMPACT(knelem)
10 REAL(KIND=JPRB) :: ZCOEF,VALMIN,VALMAX
11 INTEGER(KIND=4) :: KBITEXPONENT,KBITRADICAL
12 INTEGER(KIND=8) :: KPACK(knelem)
13 
14 REAL(KIND=JPRM) :: ZTMPBUF
15 INTEGER(KIND=4) :: ITMPBUF
16 INTEGER(KIND=8) :: ICMPBUF
17 INTEGER(KIND=4),ALLOCATABLE :: IBUF(:)
18 INTEGER(KIND=4) :: IPROMA,IPTRTAB,IPTRBIT,IENDBIT
19 
20 REAL(KIND=JPRB) :: ZHOOK_HANDLE
21 
22 equivalence(ztmpbuf,itmpbuf)
23 
24 IF (lhook) CALL dr_hook('UNCOMPACT',0,zhook_handle)
25 
26 !SOLUTION 1
27 !IPTRBIT=0
28 !IPTRTAB=1
29 !DO IPROMA=1,KNELEM
30 ! ITMPBUF=KPACK(IPROMA)
31 ! PVALCO_COMPACT(IPROMA)=ZTMPBUF
32 !END DO
33 
34 !SOLUTION 2
35 itmpbuf=ibits(kpack(1),0,32)
36 valmin=ztmpbuf
37 itmpbuf=ibits(kpack(1),32,32)
38 valmax=ztmpbuf
39 !PRINT*,VALMIN," ",VALMAX
40 IF (valmax-valmin<=0.0) THEN
41  pvalco_compact(1:knelem)=valmin
42 ELSE
43  iptrtab=2
44  iptrbit=0
45  zcoef=(2**kbitradical-1)
46  DO iproma=2,knelem+1
47  IF (iptrbit+kbitradical<64) THEN
48  icmpbuf=ibits(kpack(iptrtab),iptrbit,kbitradical)
49  iptrbit=iptrbit+kbitradical
50  ELSE
51  iendbit=64-iptrbit
52  icmpbuf=ibits(kpack(iptrtab),iptrbit,iendbit)+ishft(ibits(kpack(iptrtab+1),0,kbitradical-iendbit),iendbit)
53  iptrtab=iptrtab+1
54  iptrbit=kbitradical-iendbit
55 
56  END IF
57 
58  pvalco_compact(iproma-1)=icmpbuf*(valmax-valmin)/zcoef+valmin
59  !PRINT*,PVALCO_COMPACT(IPROMA-1)
60  END DO
61 END IF
62 
63 
64 !SOLUTION 3 CA MARCHE PAS BIEN
65 !ALLOCATE(IBUF(KNELEM))
66 !DO IPROMA=1,KNELEM
67 ! IF (IPTRBIT+KBITRADICAL+2+KBITEXPONENT<64) THEN
68 ! IBUF(IPROMA)=IBITS(KPACK(IPTRTAB),IPTRBIT,KBITRADICAL+2+KBITEXPONENT)
69 ! IPTRBIT=IPTRBIT+KBITRADICAL+2+KBITEXPONENT
70 
71 ! ELSE
72 ! IENDBIT=64-IPTRBIT
73 ! IBUF(IPROMA)=IBITS(KPACK(IPTRTAB),IPTRBIT,IENDBIT)
74 ! IPTRTAB=IPTRTAB+1
75 ! IBUF(IPROMA)=IBUF(IPROMA)+ISHFT(IBITS(KPACK(IPTRTAB),0,KBITRADICAL+2+KBITEXPONENT-IENDBIT),IENDBIT)
76 ! IPTRBIT=KBITRADICAL+2+KBITEXPONENT-IENDBIT
77 ! END IF
78 ! END DO
79 !WRITE(6,*) 'DEBUG UNCOMPACT',IBUF(1)
80 !DO IPROMA=1,KNELEM
81 !ITMPBUF=0
82 !ITMPBUF=ISHFT(IBITS(IBUF(IPROMA),0,KBITRADICAL),23-KBITRADICAL)+ISHFT(IBITS(IBUF(IPROMA),KBITRADICAL,KBITEXPONENT),23)&
83 !+ISHFT(2**(7-KBITEXPONENT)-1+IBITS(IBUF(IPROMA),KBITRADICAL+KBITEXPONENT,1),23+KBITEXPONENT)&
84 !&+ISHFT(IBITS(IBUF(IPROMA),KBITRADICAL+KBITEXPONENT+1,1),31)
85 !PVALCO_COMPACT(IPROMA)=ZTMPBUF
86 !END DO
87 
88 IF (lhook) CALL dr_hook('UNCOMPACT',1,zhook_handle)
89 
90 END SUBROUTINE uncompact
subroutine uncompact(PVALCO_COMPACT, KNELEM, KBITEXPONENT, KBITRADICAL, KPACK)
Definition: uncompact.F90:2
integer, parameter jprb
Definition: parkind1.F90:32
integer, parameter jprm
Definition: parkind1.F90:30
logical lhook
Definition: yomhook.F90:15