|
SURFEX v7.3
General documentation of Surfex
|
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
1.8.0