SURFEX v8.1
General documentation of Surfex
gsbite_mf.F
Go to the documentation of this file.
1  SUBROUTINE gsbite_mf(KS,KD,KSKST,KSIZE,KSKBTW,K,KBPW,KMASK,YADIR)
2  USE parkind1, ONLY : jprb
3  USE yomhook , ONLY : lhook, dr_hook
4  USE lfi_precision
5 
6 !
7 ! GSBITE: VECTORISING EXTRACTION/INSERTION OF BITS FROM/TO BITSTREAM
8 !
9 ! INPUT:
10 ! KS: IF YADIR='D', INPUT BIT STREAM, ELSE OUTPUT BIT STREAM
11 ! KD: IF YADIR='D', OUTPUT WORDS, ELSE INPUT WORDS
12 ! KSKST: NUMBER OF BITS SKIPPED AT BEGINNING OF KS
13 ! KSIZE: NUMBER OF BITS TO BE EXTRACTED TO ONE WORD OF KD
14 ! KSKBTW: NUMBER OF BITS SKIPPED BETWEEN TWO WORDS TO BE EXTRACTED
15 ! K: NUMBER OF WORDS TO BE EXTRACTED INTO KD (IF .LE.0, ONLY
16 ! CALCULATE KBPW AND KMASK
17 ! KBPW: NUMBER OF BITS PER WORD IN KS, CALCULATED IF 0
18 ! KMASK: MASKS FOR BIT PATTERNS, CALCULATED IF KMASK(2).EQ.0
19 ! YADIR: DIRECTION OF CONVERSION: 'D' FOR DECODING, I.E.
20 ! EXTRACT WORDS KD(1...K) FROM BITS KS(KSKST+1....)
21 ! IF NOT 'D', ENCODE, I.E. PACK WORDS KD(1....K) INTO BITS
22 ! KS(KSKST+1.....KSKST+K*(KSIZE+KSKBTW))
23 !
24 ! OUTPUT:
25 ! KS,KD: SEE ABOVE
26 ! KSKST: UPDATED TO NR OF BITS USED, I.E. TO KSKST+K*(KSIZE+KSKBTW)
27 ! KBPW: (IF 0 ON INPUT): NUMBER OF BITS IN EACH WORD OF KS
28 ! KMASK: (IF (KMASK(2) WAS 0 ON INPUT): BIT PATTERN MASKS
29 !
30 ! G.J.CATS 08 DEC 87
31 !
32  IMPLICIT NONE
33  INTEGER (KIND=JPLIKB) :: KS(*)
34  INTEGER (KIND=JPLIKB) :: KD(*)
35  INTEGER (KIND=JPLIKB) :: KMASK(*)
36  INTEGER (KIND=JPLIKB) :: IS , ISHFT, ISH, IMASK
37  INTEGER (KIND=JPLIKM) :: KSKST
38  INTEGER (KIND=JPLIKM) :: KSIZE
39  INTEGER (KIND=JPLIKM) :: KSKBTW
40  INTEGER (KIND=JPLIKM) :: K
41  INTEGER (KIND=JPLIKM) :: KBPW
42  INTEGER (KIND=JPLIKM) :: IBDL
43  INTEGER (KIND=JPLIKM) :: IBS,IENBS,IEND,ILCF,ILL,IOD,IOS
44  INTEGER (KIND=JPLIKM) :: ISHF,ISKB,ISKW,ISKWS,ISTA,ISTD,ISTEP,ISTS
45  INTEGER (KIND=JPLIKM) :: J,JBD,JI
46  CHARACTER (LEN=1) :: YADIR
47 !
48 ! STATEMENT FUNCTIONS TO MANIPULATE BITS IN WORDS OF 64 BITS
49 !
50 ! DATA ONES/7777777777777777B/
51 ! DATA OOOS/0B/
52 !
53 ! 1. SINGLE BIT MANIPULATIONS
54 !
55 ! 1.1 SET BIT KBIT IN WORD PW
56 !
57 !CRAY IBSET(KW,KBIT)=OR(KW,SHIFT(1B,KBIT))
58 !
59 ! 2. WORD MANIPULATIONS, BIT BY BIT
60 !
61 ! 2.1 ARE WORDS PW1 AND PW2 EQUAL?
62 !
63 ! LOGICAL NLEQAL
64 ! NLEQAL(PW1,PW2)=(PW1.XOR.PW2).EQ.0B
65 !
66 ! 2.2 BITWISE AND AND OR
67 !
68 !CRAY IAND(K1,K2)=AND(K1,K2)
69 !CRAY IOR (K1,K2)= OR(K1,K2)
70 !
71 ! 2.3 BITWISE NEGATION
72 !
73 !CRAY NOT(K)=COMPL(K)
74 !
75 ! 2.4 SHIFT (LEFT FOR KSH POSITIVE, RIGHT FOR KSH NEGATIVE)
76 !
77 !CRAY ISHFT(K,KSH)=CVMGP(SHIFTL(K,KSH),SHIFTR(K,-KSH),KSH)
78 !
79 ! 3. SPECIAL PURPOSE
80 !
81 ! 3.1 TAKE 4 LAST BITS OF KW, PUT THEM IN PW AT POS K*4-1
82 !
83 ! SETLEV(PW,KW,K)=OR(AND(PW,SHIFT(0B.EQV.17B,K*4-4)),
84 ! +SHIFT(AND(17B,KW),K*4-4))
85 !
86 ! 3.2 EXTRACT FIELD [K*4-1:4] FROM PW
87 !
88 ! MGTLEV(PW,K)=AND(17B,SHIFT(PW,68-K*4))
89 !
90 ! 1. COMPLETE KBPW AND KMASK, RETURN IF 0 WORDS ARE TO BE EXTRACTED
91 !
92  REAL(KIND=JPRB) :: ZHOOK_HANDLE
93  IF (lhook) CALL dr_hook('GSBITE_MF',0,zhook_handle)
94  IF(kbpw.EQ.0)THEN
95  is=ks(1)
96  ks(1)=1
97  1101 CONTINUE
98  IF(ks(1).NE.0)THEN
99  kbpw=kbpw+1
100  ks(1)=ishft(ks(1),1)
101  GOTO 1101
102  ENDIF
103  ks(1)=is
104  ENDIF
105  IF(kmask(2).EQ.0)THEN
106  kmask(kbpw+1)=0
107  DO 1110 j=kbpw,1,-1
108  kmask(j)=ibset(kmask(j+1),kbpw-j)
109  1110 CONTINUE
110  ENDIF
111  IF(k.LE.0) THEN
112  IF (lhook) CALL dr_hook('GSBITE_MF',1,zhook_handle)
113  RETURN
114  ENDIF
115 !
116 ! 2. PRESET KD TO 0 IF KD IS OUTPUT I.E. WHEN DECODING
117 !
118  IF(yadir.EQ.'D')THEN
119  DO 2101 j=1,k
120  kd(j)=0
121  2101 CONTINUE
122  ENDIF
123 !
124 ! 3. CALCULATE SEVERAL PARAMETERS FOR LOOPING (FOR EFFICIENCY, THE
125 ! CODE OF SECTIONS 3.3 AND 3.4 FOR K=1 IS SEPARATED INTO 3.2)
126 !
127 ! 3.1 NUMBER OF BITS USED PER WORD, INITIAL NR OF SKIPPED BITS
128 !
129  istep=ksize+kskbtw
130  iskws=kskst
131 !
132 ! 3.2 VECTOR LOOP LENGTH AND STEP SIZE IN KD IF K=1;KS STEP IRRELVNT
133 !
134  IF(k.EQ.1)THEN
135  ill=1
136  ibdl=2
137  istd=1
138  ELSE
139 !
140 ! 3.3 STEP SIZES IN KS,KD: INVERSE OF LARGEST FACTOR OF ISTEP,KBPW
141 !
142  ilcf=kbpw
143  ishf=istep
144  331 CONTINUE
145  IF(ilcf.EQ.ishf)GOTO 332
146  IF(ilcf.EQ.1)GOTO 332
147  IF(ilcf.GT.ishf)THEN
148  ilcf=ilcf-ishf
149  ELSE
150  ishf=ishf-ilcf
151  ENDIF
152  GOTO 331
153  332 CONTINUE
154  istd=kbpw/ilcf
155  ists=istep/ilcf
156 !
157 ! 3.4 VECTOR LOOP LENGTH AND SWITCH-OVER POINT FOR SMALLER LOOP
158 !
159  ill=(k-1)/istd+1
160  ibdl=k-(ill-1)*istd
161  ENDIF
162 !
163 ! 3.5 SWAP BYTES ON VAX WHEN DECODING
164 !
165 !
166 ! 4. LOOP OVER FIRST ISTD WORDS OF KD (TRAILS THE VECTOR LOOP)
167 !
168  DO 790 jbd=1,istd
169 !
170 ! 4.1 LAST BIT IN KS TO BE TREATED
171 !
172  ienbs=iskws+ksize
173 !
174 ! 4.2 NR OF WORDS OF KS TO BE SKIPPED, NR OF BITS IN THOSE AND THIS
175 !
176  iskw=iskws/kbpw
177  ista=iskw*kbpw
178  iskb=iskws-ista
179 !
180 ! 4.3 MASK AND LEFT SHIFT FOR THE REMAINING BITS
181 !
182  imask=kmask(iskb+1)
183  ish=ksize+iskb
184 !
185 ! 4.4 POSITION OF CURRENT WORD OF KS
186 !
187  ibs=iskw+1
188 !
189 ! 5. LOOP OVER WORDS OF KS CONTRIBUTING TO ONE WORD OF KD
190 !
191  500 CONTINUE
192 !
193 ! 5.1 UPDATE SHIFT AND LAST BIT IN CURRENT WORD
194 !
195  ish=ish-kbpw
196  iend=ista+kbpw
197 !
198 ! 5.2 IS LAST BIT OF CURRENT WORD OUTSIDE RANGE TO BE EXTRACTED
199 !
200  IF(iend.GT.ienbs)THEN
201  ish=ienbs-iend
202  imask=iand(imask,not(kmask(kbpw+ish+1)))
203  ENDIF
204 !
205 ! 5.3 INITIAL OFFSETS FOR VECTOR ELEMENTS IN VECTOR LOOP
206 !
207  ios=0
208  iod=0
209 !
210 ! 6. VECTOR LOOP IS OVER REPEATEDLY OCCURRING BITPATTERNS/MASKS
211 !
212  IF(yadir.EQ.'D')THEN
213 !DIR$ IVDEP
214  DO 611 ji=1,ill
215  kd(jbd+iod)=ior(kd(jbd+iod),ishft(iand(imask,ks(ibs+ios)),ish))
216  iod=iod+istd
217  ios=ios+ists
218  611 CONTINUE
219  ELSE
220 !DIR$ IVDEP
221  DO 612 ji=1,ill
222  ks(ibs+ios)=ior( &
223  & iand( ks(ibs+ios), not(imask)), &
224  & iand(ishft(kd(jbd+iod),-ish), imask ))
225  iod=iod+istd
226  ios=ios+ists
227  612 CONTINUE
228  ENDIF
229 !
230 ! 7. END LOOPS
231 !
232 ! 7.1 PREPARE FOR END OF LOOP OVER WORDS OF KS WITIHN ONE KD WORD
233 !
234  ista=ista+kbpw
235 !
236 ! 7.2 NEXT WORD OF KD IF EXTRACTION NOT COMPLETED
237 !
238  IF(ista.LT.ienbs)THEN
239  imask=kmask(1)
240  ibs=ibs+1
241  GOTO 500
242  ENDIF
243 !
244 ! 7.8 PREPARE FOR END OF LOOP OVER FIRST WORDS OF KD
245 !
246  IF(jbd.EQ.ibdl)ill=ill-1
247  iskws=iskws+istep
248 !
249 ! 7.9 END LOOP OVER FIRST WORDS OF KD
250 !
251  790 CONTINUE
252 !
253 ! 8. FINISHED: UPDATE KSKST AND RETURN
254 !
255  kskst=kskst+k*istep
256 !
257 ! 8.5 SWAP BYTES ON VAX
258 !
259  IF (lhook) CALL dr_hook('GSBITE_MF',1,zhook_handle)
260  ENDSUBROUTINE gsbite_mf
subroutine gsbite_mf(KS, KD, KSKST, KSIZE, KSKBTW, K, KBPW, KMASK, YADIR)
Definition: gsbite_mf.F:2
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15