SURFEX v8.1
General documentation of Surfex
sbytes_mf.F
Go to the documentation of this file.
1  SUBROUTINE sbytes_mf(KD,KS,KSKIP1,KBSIZ,KSKIP2,KBYTES)
2  USE parkind1, ONLY : jprb
3  USE yomhook , ONLY : lhook, dr_hook
4  USE lfi_precision
5 !
6 ! REVERSES THE ACTION OF GBYTES, TAKING FIELDS FROM KS AND
7 ! INSERTING THEM INTO A BIT STRING IN KD. SEE GBYTES.
8 ! AUTHOR D. ROBERTSON AUG,1981
9 !*
10 !* Modified by Mats HAMRUD, ECMWF, 1988, to have a constant number
11 !* number af arguments , as within the GRIB package calls,
12 !* and to make some cleanings.
13 !*
14 !* Modifications by Jean CLOCHARD, French DMN, January 1990,
15 !* essentially to get a vectorising code on CRAY (no recurrences),
16 !* and to make some cleanings.
17 !
18  IMPLICIT NONE
19 !
20  INTEGER (KIND=JPLIKM) :: KSKIP1
21  INTEGER (KIND=JPLIKM) :: KBSIZ
22  INTEGER (KIND=JPLIKM) :: KSKIP2
23  INTEGER (KIND=JPLIKM) :: KBYTES
24 !
25  INTEGER (KIND=JPLIKB) :: KD(*)
26  INTEGER (KIND=JPLIKB) :: KS(kbytes)
27 !
28  INTEGER (KIND=JPLIKM) :: INBPW, ISTEP, JBYTE, IAUXIL
29  INTEGER (KIND=JPLIKM) :: ID, ISKIP, ISH1, ISH2, ISH3
30 !
31 ! LOGICAL LLSTOP
32 !
33  REAL(KIND=JPRB) :: ZHOOK_HANDLE
34  IF (lhook) CALL dr_hook('SBYTES_MF',0,zhook_handle)
35  inbpw=64
36  istep = kskip2+kbsiz
37 !
38  DO 75 jbyte = 1 , kbytes
39 !
40 ! WITH THE STARTING WORD AND BIT POSITION KNOWN, THE
41 ! DESIRED INSERTION CAN BE DONE BY
42 !** CALL SBYTE(KD(ID),KS(JBYTE),ISKIP,KBSIZ)
43 ! BUT THE CODE IS SHORT ENOUGH TO GO IN-LINE.
44 !
45  iauxil=kskip1+(jbyte-1)*istep
46  id=1+iauxil/inbpw
47  iskip=iauxil-(id-1)*inbpw
48  ish1=iskip+kbsiz-inbpw
49 ! LLSTOP=ISH1.GT.0
50 !
51  IF(ish1.LE.0) THEN
52 !*
53 ! BYTE GOES INTO 1 WORD OF KD.
54 !
55 ! PRINT '(''a'',2(TR1,B64))', KD(ID),KS(JBYTE)
56  kd(id) = ishftc(ior(ishft(ishftc(kd(id),iskip,bit_size(kd(id)))&
57  & ,kbsiz),ibits(ks(jbyte),0,kbsiz)),-ish1, &
58  & bit_size(ior(ishft( ishftc(kd(id),iskip, &
59  & bit_size(kd(id))),kbsiz),ibits(ks(jbyte),0,kbsiz))))
60 ! PRINT '(''a'',TR1,B64))', KD(ID)
61  ELSE
62 !*
63 ! BYTE GOES INTO 2 WORDS OF KD.
64 !
65 ! PRINT *, JBYTE, INBPW, KSKIP1, KBSIZ, ISTEP, ID, ISKIP, ISH1
66 ! PRINT '(''b1 KD(ID ) ='',B64.64))', KD(ID)
67 ! PRINT '(''b1 KD(ID+1) ='',B64.64))', KD(ID+1)
68 ! PRINT '(''b1 KS(JBYTE)='',B64.64))', KS(JBYTE)
69  kd(id)=ior(ishftc(ishft(kd(id),iskip-inbpw), inbpw-iskip, &
70  & bit_size(ishft(kd(id),iskip-inbpw))), &
71  & ishft(ibits(ks(jbyte),0,kbsiz),-ish1))
72  kd(id+1)=ishftc(ior(ishft(kd(id+1),ish1), &
73  & ibits(ks(jbyte),0,ish1)),-ish1, &
74  & bit_size(ior(ishft(kd(id+1),ish1), &
75  & ibits(ks(jbyte),0,ish1))))
76 ! PRINT '(''b2 KD(ID ) ='',B64.64))', KD(ID)
77 ! PRINT '(''b2 KD(ID+1) ='',B64.64))', KD(ID+1)
78 ! IF (JBYTE.GT.10) STOP 'provisoire b'
79  ENDIF
80 !
81  75 CONTINUE
82 !
83 ! IF (LLSTOP) STOP 'provisoire'
84 !
85  IF (lhook) CALL dr_hook('SBYTES_MF',1,zhook_handle)
86  ENDSUBROUTINE sbytes_mf
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine sbytes_mf(KD, KS, KSKIP1, KBSIZ, KSKIP2, KBYTES)
Definition: sbytes_mf.F:2