SURFEX v7.3
General documentation of Surfex
|
00001 SUBROUTINE OFFSET_MF (KOFF,KVAL,KWORD,KBYTE,KNBIT,KLEN,KERR) 00002 USE PARKIND1, ONLY : JPRB 00003 USE YOMHOOK , ONLY : LHOOK, DR_HOOK 00004 C 00005 C 00006 C 00007 C 00008 C 00009 C******************************************************************** 00010 C* 00011 C* NAME : OFFSET 00012 C* 00013 C* FUNCTION : CALCULATES THE WORD AND BIT OFFSET OF THE START 00014 C* OF THE NEXT BIT-FIELD IN AN ARRAY OF BINARY 00015 C* DATA, FOLLOWING THE INSERTION/EXTRACTION OF ONE 00016 C* OR MORE CONSECUTIVE BIT-FIELDS. 00017 C* 00018 C* INPUT : KOFF - BIT OFFSET AT WHICH LAST INSERTION OR 00019 C* EXTRACTION STARTED. 00020 C* KVAL - NUMBER OF FIELDS INSERTED OR EXTRACTED IN 00021 C* LAST OPERATION. 00022 C* KWORD - WORD NUMBER OF ARRAY AT WHICH LAST OPERATION 00023 C* STARTED. 00024 C* KBYTE - LENGTH, IN BITS, OF LAST FIELD(S) INSERTED 00025 C* OR EXTRACTED. 00026 C* KNBIT - NUMBER OF BITS IN COMPUTER WORD. 00027 C* KLEN - NUMBER OF WORDS IN ARRAY. 00028 C* 00029 C* OUTPUT : KOFF - BIT OFFSET AT WHICH NEXT INSERTION OR 00030 C* EXTRACTION STARTS. 00031 C* KVAL - UNCHANGED. 00032 C* KWORD - WORD NUMBER OF ARRAY AT WHICH NEXT OPERATION 00033 C* STARTS. 00034 C* KBYTE - UNCHANGED. 00035 C* KNBIT - UNCHANGED. 00036 C* KLEN - UNCHANGED. 00037 C* 00038 C* KERR - EQUAL 0 IF NO ERROR. 00039 C* EQUAL -2 IF NEXT OPERATION IS OUTSIDE ARRAY 00040 C* BOUNDS. 00041 C* 00042 C* GENERAL : OFFSET CALLS ----- 00043 C* 00044 C* AUTHOR : J.HENNESSY 15.4.85 00045 C* 00046 C* MODIFIED : J.HENNESSY 28.11.85 00047 C* Modified by Jean CLOCHARD, February 1990, to comply with "DOCTOR". 00048 C* 00049 C******************************************************************** 00050 C 00051 INTEGER KOFF, KVAL, KWORD, KBYTE, KNBIT, KLEN, KERR 00052 C 00053 INTEGER IBITL, INTER, IOFFS 00054 C 00055 C 00056 C CLEAR ERROR INDICATOR 00057 C 00058 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00059 IF (LHOOK) CALL DR_HOOK('OFFSET_MF',0,ZHOOK_HANDLE) 00060 KERR = 0 00061 C 00062 C 00063 C 00064 C 00065 C 00066 C 00067 C 00068 C 00069 C 00070 C 00071 C CALCULATE NEXT WORD AND BIT POSITIONS. 00072 C 00073 IBITL = KVAL * KBYTE 00074 INTER = IBITL / KNBIT 00075 IOFFS = IBITL - INTER * KNBIT 00076 KWORD = KWORD + INTER 00077 KOFF = KOFF + IOFFS 00078 C 00079 IF (KOFF.GE.KNBIT) 00080 C THEN 00081 KWORD = KWORD + 1 00082 KOFF = KOFF - KNBIT 00083 END IF 00084 C 00085 C 00086 C 00087 C 00088 C 00089 C 00090 C 00091 C 00092 C CHECK THAT NEXT WORD TO BE ACCESSED LIES WITHIN THE ARRAY BOUNDS. 00093 C 00094 IF (KWORD.GT.KLEN) 00095 C THEN 00096 KERR = -2 00097 WRITE (*,9001) KWORD,KLEN 00098 9001 FORMAT (1H ,'WORD ',I8,' IS OUTSIDE ARRAY BOUNDS ',I8) 00099 ENDIF 00100 C 00101 C 00102 IF (LHOOK) CALL DR_HOOK('OFFSET_MF',1,ZHOOK_HANDLE) 00103 END