SURFEX v8.1
General documentation of Surfex
offset_mf.F
Go to the documentation of this file.
1  SUBROUTINE offset_mf (KOFF,KVAL,KWORD,KBYTE,KNBIT,KLEN,KERR)
2  USE parkind1, ONLY : jprb
3  USE yomhook , ONLY : lhook, dr_hook
4  USE lfi_precision
5 !
6 !
7 !
8 !
9 !
10 !********************************************************************
11 !*
12 !* NAME : OFFSET
13 !*
14 !* FUNCTION : CALCULATES THE WORD AND BIT OFFSET OF THE START
15 !* OF THE NEXT BIT-FIELD IN AN ARRAY OF BINARY
16 !* DATA, FOLLOWING THE INSERTION/EXTRACTION OF ONE
17 !* OR MORE CONSECUTIVE BIT-FIELDS.
18 !*
19 !* INPUT : KOFF - BIT OFFSET AT WHICH LAST INSERTION OR
20 !* EXTRACTION STARTED.
21 !* KVAL - NUMBER OF FIELDS INSERTED OR EXTRACTED IN
22 !* LAST OPERATION.
23 !* KWORD - WORD NUMBER OF ARRAY AT WHICH LAST OPERATION
24 !* STARTED.
25 !* KBYTE - LENGTH, IN BITS, OF LAST FIELD(S) INSERTED
26 !* OR EXTRACTED.
27 !* KNBIT - NUMBER OF BITS IN COMPUTER WORD.
28 !* KLEN - NUMBER OF WORDS IN ARRAY.
29 !*
30 !* OUTPUT : KOFF - BIT OFFSET AT WHICH NEXT INSERTION OR
31 !* EXTRACTION STARTS.
32 !* KVAL - UNCHANGED.
33 !* KWORD - WORD NUMBER OF ARRAY AT WHICH NEXT OPERATION
34 !* STARTS.
35 !* KBYTE - UNCHANGED.
36 !* KNBIT - UNCHANGED.
37 !* KLEN - UNCHANGED.
38 !*
39 !* KERR - EQUAL 0 IF NO ERROR.
40 !* EQUAL -2 IF NEXT OPERATION IS OUTSIDE ARRAY
41 !* BOUNDS.
42 !*
43 !* GENERAL : OFFSET CALLS -----
44 !*
45 !* AUTHOR : J.HENNESSY 15.4.85
46 !*
47 !* MODIFIED : J.HENNESSY 28.11.85
48 !* Modified by Jean CLOCHARD, February 1990, to comply with "DOCTOR".
49 !*
50 !********************************************************************
51 !
52  IMPLICIT NONE
53 !
54  INTEGER (KIND=JPLIKM) :: KOFF
55  INTEGER (KIND=JPLIKM) :: KVAL
56  INTEGER (KIND=JPLIKM) :: KWORD
57  INTEGER (KIND=JPLIKM) :: KBYTE
58  INTEGER (KIND=JPLIKM) :: KNBIT
59  INTEGER (KIND=JPLIKM) :: KLEN
60  INTEGER (KIND=JPLIKM) :: KERR
61 !
62  INTEGER (KIND=JPLIKM) :: IBITL, INTER, IOFFS
63 !
64 !
65 ! CLEAR ERROR INDICATOR
66 !
67  REAL(KIND=JPRB) :: ZHOOK_HANDLE
68  IF (lhook) CALL dr_hook('OFFSET_MF',0,zhook_handle)
69  kerr = 0
70 !
71 !
72 !
73 !
74 !
75 !
76 !
77 !
78 !
79 !
80 ! CALCULATE NEXT WORD AND BIT POSITIONS.
81 !
82  ibitl = kval * kbyte
83  inter = ibitl / knbit
84  ioffs = ibitl - inter * knbit
85  kword = kword + inter
86  koff = koff + ioffs
87 !
88  IF (koff.GE.knbit) &
89  & THEN
90  kword = kword + 1
91  koff = koff - knbit
92  END IF
93 !
94 !
95 !
96 !
97 !
98 !
99 !
100 !
101 ! CHECK THAT NEXT WORD TO BE ACCESSED LIES WITHIN THE ARRAY BOUNDS.
102 !
103  IF (kword.GT.klen) &
104  & THEN
105  kerr = -2
106  WRITE (*,9001) kword,klen
107  9001 FORMAT (1h ,'WORD ',i8,' IS OUTSIDE ARRAY BOUNDS ',i8)
108  ENDIF
109 !
110 !
111  IF (lhook) CALL dr_hook('OFFSET_MF',1,zhook_handle)
112  ENDSUBROUTINE offset_mf
113 
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine offset_mf(KOFF, KVAL, KWORD, KBYTE, KNBIT, KLEN, KERR)
Definition: offset_mf.F:2