SURFEX v8.1
General documentation of Surfex
gbytes_mf.F
Go to the documentation of this file.
1  SUBROUTINE gbytes_mf(KS,KD,KSKIP1,KBSIZ,KSKIP2,KBYTES)
2  USE parkind1, ONLY : jprb
3  USE yomhook , ONLY : lhook, dr_hook
4  USE lfi_precision
5 !
6 ! KS CONTAINS A BIT STRING OF INDEFINITE LENGTH. GBYTES WILL
7 ! EXTRACT KBYTES BITSTRINGS, KBSIZ BITS LONG, AND STORE THEM
8 ! RIGHT JUSTIFIED 0 FILL, INTO SUCCESSIVE WORDS OF KD. THE
9 ! SUCCESSIVE BITSTRINGS START AT BIT POSITIONS
10 ! KSKIP1+1+(IBYTE-1)*(KBSIZ+KSKIP2)
11 ! IN THE BIT STRING S. I.E. SKIP KSKIP1 BITS AT THE START,
12 ! AND KSKIP2 BITS BETWEEN THE EXTRACTED STRINGS.
13 ! BIT ISKP+1 IN A STRING IS FOUND IN WORD IS=1+ISKIP/INBPW IN KS,
14 ! WHERE INBPW IS THE NUMBER OF BITS PER WORD. THE STARTING BIT
15 ! IS FOUND BY SKIPPING MOD(ISKP,INBPW) BITS IN THAT WORD.
16 ! KWOFF IS AN OPTIONAL 7TH PARAMETER, WHICH DEFAULTS TO 0
17 ! IF PRESENT KWOFF BITS ARE TOTALLY IGNORED AT THE START OF A WORD
18 ! THUS IF A PACKED CYBER BIT STRING IS TRANSFERRED TO THE
19 ! CRAY, WITH EACH 60 BIT CYBER WORD PLACED AT THE RIGHT END OF
20 ! A 64 BIT CRAY WORD, A BYTE SEQUENCE WHICH WAS ORIGINALLY
21 ! LOCATED WITH START POINTS IN ARITHMETIC PROGRESSION ON THE
22 ! CYBER, WILL NO LONGER HAVE THIS PROPERTY ON THE CRAY. BY
23 ! USING THE ROUTINE WITH KWOFF=4, THE ELEMENTS OF THE BYTE
24 ! SEQUENCE CAN BE EXTRACTED ON THE CRAY, USING THE SAME SKIPS
25 ! AS WERE USED ON THE CYBER.
26 !
27 !* Author: ?????, ECMWF, 198x.
28 !*
29 !* Modified by Mats HAMRUD, ECMWF, 1988, to have a constant number
30 !* number af arguments , as within the GRIB package calls,
31 !* and to make some cleanings.
32 !*
33 !* Modifications by Jean CLOCHARD, French DMN, January 1990,
34 !* essentially to get a vectorising code on CRAY (no recurrences),
35 !* and to make some cleanings.
36 !
37  IMPLICIT NONE
38 !
39  INTEGER (KIND=JPLIKM) :: KSKIP1
40  INTEGER (KIND=JPLIKM) :: KBSIZ
41  INTEGER (KIND=JPLIKM) :: KSKIP2
42  INTEGER (KIND=JPLIKM) :: KBYTES
43 !
44  INTEGER (KIND=JPLIKB) :: KS(*)
45  INTEGER (KIND=JPLIKB) :: KD(kbytes)
46 !
47  INTEGER (KIND=JPLIKM) :: INBPW, ISTEP, JBYTE, ID
48  INTEGER (KIND=JPLIKM) :: ISKIP, ISH1, ISH2, IS, IAUXIL
49 !
50  REAL(KIND=JPRB) :: ZHOOK_HANDLE
51  IF (lhook) CALL dr_hook('GBYTES_MF',0,zhook_handle)
52  inbpw=64
53  istep = kskip2+kbsiz
54 !
55  DO 75 jbyte = 1 , kbytes
56 !
57 ! WITH THE STARTING WORD AND BIT POSITION DETERMINED, THE
58 ! DESIRED EXTRACTION CAN BE DONE BY
59 !*** CALL GBYTE(KS(IS),KD(JBYTE),ISKIP,KBSIZ)
60 ! BUT SINCE THE CODE IS SHORT IT IS INSERTED IN-LINE.
61 !
62  iauxil=kskip1+(jbyte-1)*istep
63  is=1+iauxil/inbpw
64  iskip=iauxil-(is-1)*inbpw
65  ish1=iskip+kbsiz
66 !
67  IF(ish1.LE.inbpw) THEN
68 !*
69 ! BYTE COMES FROM 1 WORD OF KS
70 !
71  kd(jbyte) = ibits(ks(is),inbpw-ish1,kbsiz)
72  ELSE
73  ish2 =ish1-inbpw
74 !*
75 ! BYTE COMES FROM 2 WORDS OF KS.
76 !
77  kd(jbyte) = ior( ishft( ibits(ks(is),0,inbpw-iskip), ish2 ) &
78  & , &
79  & ibits(ks(is+1),inbpw-ish2,ish2) &
80  & )
81  ENDIF
82 !
83  75 CONTINUE
84 !
85  IF (lhook) CALL dr_hook('GBYTES_MF',1,zhook_handle)
86  ENDSUBROUTINE gbytes_mf
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine gbytes_mf(KS, KD, KSKIP1, KBSIZ, KSKIP2, KBYTES)
Definition: gbytes_mf.F:2