SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/XRD38/grib_mf/gbytes_mf.F
Go to the documentation of this file.
00001       SUBROUTINE GBYTES_MF(KS,KD,KSKIP1,KBSIZ,KSKIP2,KBYTES)
00002       USE PARKIND1, ONLY : JPRB
00003       USE YOMHOOK , ONLY : LHOOK, DR_HOOK
00004 C
00005 C KS CONTAINS A BIT STRING OF INDEFINITE LENGTH. GBYTES WILL
00006 C EXTRACT KBYTES BITSTRINGS, KBSIZ BITS LONG, AND STORE THEM
00007 C RIGHT JUSTIFIED 0 FILL, INTO SUCCESSIVE WORDS OF KD. THE
00008 C SUCCESSIVE BITSTRINGS START AT BIT POSITIONS
00009 C     KSKIP1+1+(IBYTE-1)*(KBSIZ+KSKIP2)
00010 C IN THE BIT STRING S. I.E. SKIP KSKIP1 BITS AT THE START,
00011 C AND KSKIP2 BITS BETWEEN THE EXTRACTED STRINGS.
00012 C BIT ISKP+1 IN A STRING IS FOUND IN WORD IS=1+ISKIP/INBPW IN KS,
00013 C WHERE INBPW IS THE NUMBER OF BITS PER WORD. THE STARTING BIT
00014 C IS FOUND BY SKIPPING MOD(ISKP,INBPW) BITS IN THAT WORD.
00015 C KWOFF IS AN OPTIONAL 7TH PARAMETER, WHICH DEFAULTS TO 0
00016 C IF PRESENT KWOFF BITS ARE TOTALLY IGNORED AT THE START OF A WORD
00017 C THUS IF A PACKED CYBER BIT STRING IS TRANSFERRED TO THE
00018 C CRAY, WITH EACH 60 BIT CYBER WORD PLACED AT THE RIGHT END OF
00019 C A 64 BIT CRAY WORD, A BYTE SEQUENCE WHICH WAS ORIGINALLY
00020 C LOCATED WITH START POINTS IN ARITHMETIC PROGRESSION ON THE
00021 C CYBER, WILL NO LONGER HAVE THIS PROPERTY ON THE CRAY. BY
00022 C USING THE ROUTINE WITH KWOFF=4, THE ELEMENTS OF THE BYTE
00023 C SEQUENCE CAN BE EXTRACTED ON THE CRAY, USING THE SAME SKIPS
00024 C AS WERE USED ON THE CYBER.
00025 C
00026 C*    Author: ?????, ECMWF, 198x.
00027 C*
00028 C*    Modified by Mats HAMRUD, ECMWF, 1988, to have a constant number
00029 C*    number af arguments , as within the GRIB package calls,
00030 C*    and to make some cleanings.
00031 C*
00032 C*    Modifications by Jean CLOCHARD, French DMN, January 1990,
00033 C*    essentially to get a vectorising code on CRAY (no recurrences),
00034 C*    and to make some cleanings.
00035 C
00036 #include "precision.h"
00037 C
00038       INTEGER KSKIP1, KBSIZ, KSKIP2, KBYTES
00039 C
00040       INTEGER (KIND=JPDBLE) KS(*), KD(KBYTES)
00041 C
00042       INTEGER INBPW, ISTEP, JBYTE, ID, ISKIP, ISH1, ISH2, IS, IAUXIL
00043 C
00044       REAL(KIND=JPRB) :: ZHOOK_HANDLE
00045       IF (LHOOK) CALL DR_HOOK('GBYTES_MF',0,ZHOOK_HANDLE)
00046       INBPW=64
00047       ISTEP = KSKIP2+KBSIZ
00048 C
00049       DO 75 JBYTE = 1 , KBYTES
00050 C
00051 C WITH THE STARTING WORD AND BIT POSITION DETERMINED, THE
00052 C DESIRED EXTRACTION CAN BE DONE BY
00053 C***     CALL GBYTE(KS(IS),KD(JBYTE),ISKIP,KBSIZ)
00054 C BUT SINCE THE CODE IS SHORT IT IS INSERTED IN-LINE.
00055 C
00056       IAUXIL=KSKIP1+(JBYTE-1)*ISTEP
00057       IS=1+IAUXIL/INBPW
00058       ISKIP=IAUXIL-(IS-1)*INBPW
00059       ISH1=ISKIP+KBSIZ
00060 C
00061       IF(ISH1.LE.INBPW) THEN
00062 C*
00063 C BYTE COMES FROM 1 WORD OF KS
00064 C
00065          KD(JBYTE) = IBITS (KS(IS),INBPW-ISH1,KBSIZ)
00066       ELSE
00067          ISH2 =ISH1-INBPW
00068 C*
00069 C BYTE COMES FROM 2 WORDS OF KS.
00070 C
00071          KD(JBYTE) = IOR ( ISHFT ( IBITS (KS(IS),0,INBPW-ISKIP), ISH2 )
00072      1                    ,
00073      2                     IBITS (KS(IS+1),INBPW-ISH2,ISH2)
00074      3                   )
00075       ENDIF
00076 C
00077    75 CONTINUE
00078 C
00079       IF (LHOOK) CALL DR_HOOK('GBYTES_MF',1,ZHOOK_HANDLE)
00080       END