SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/XRD38/grib_mf/unpagb.F
Go to the documentation of this file.
00001       SUBROUTINE UNPAGB ( KPDATA, PFDATA, PMIN, PMAX, KBITS, PSCALE,
00002      S                    KLENG, LDARPE )
00003       USE PARKIND1, ONLY : JPRB
00004       USE YOMHOOK , ONLY : LHOOK, DR_HOOK
00005 C
00006 C********************************************************************
00007 C*
00008 C*    NAME      : UNPAGB
00009 C*
00010 C*    FUNCTION  : COMPUTES INDIVIDUAL "UNPACKED" VALUES (FIELD FROM GRIB
00011 C*                ), THE INPUT CONSISTING OF ONE DATA JUST UNPACKED
00012 C*                FROM A BIT STRING PER COMPUTER WORD.
00013 C*                   This subroutine has been designed to avoid explicit
00014 C*                mixed use of REAL and INTEGER type values within the
00015 C*                dummy-argument array PFDATA of DECOGA, this explicit
00016 C*                use leading to non-standard code. The following code
00017 C*                enables use of the same actual argument for the 2
00018 C*                dummy-argument arrays.
00019 C*
00020 C*    INPUT     : KPDATA - (POSITIVE) INTEGER VALUES "JUST UNPACKED"
00021 C*                PMIN   - MINIMUM VALUE, OR AN "UNDER-APPROXIMATION"
00022 C*                         OF THE MINIMUM VALUE).
00023 C*                PMAX   - MAXIMUM VALUE, OR A "OVER-APPROXIMATION"
00024 C*                         OF THE MAXIMUM VALUE).
00025 C*                KBITS  - NUMBER OF BITS PER CODED VALUE.
00026 C*                PSCALE - SCALE FACTOR TO APPLY.
00027 C*                KLENG  - NUMBER OF VALUES TO BE TREATED.
00028 C*                LDARPE  - .TRUE., modifications for ARPEGE coding
00029 C*                                  have been included when coding data;
00030 C*                          .FALSE., no such modifications.
00031 C*
00032 C*    PMAX and KBITS are used only if LDARPE is .TRUE. .
00033 C*
00034 C*
00035 C*    OUTPUT    : PFDATA - FLOATING-POINT VALUES.
00036 C*
00037 C*    AUTHOR    : J.CLOCHARD, FRENCH WEATHER SERVICE, 01/03/90.
00038 C*
00039 C********************************************************************
00040 C*
00041 #include "precision.h"
00042 C
00043 C     JP_STRIDE= pas permettant la correspondance entre les elements
00044 C                d'un tableau de reels (KIND=JPDBLR): PFDATA(J) et
00045 C                les elements d'un tableau d'entiers KPDATA(JP_STRIDE*J)
00046 C                defini comme un tableau d'entiers representes sur
00047 C                autant de bits que les reels.
00048 C
00049       INTEGER, PARAMETER :: JP_STRIDE = JPDBLR / JPDBLE
00050 !
00051 ! If integers are on 32 bits, don't be afraid by the number of bits of the 
00052 ! real argument which is real and on 64 bits ... it's a trick : we unpack 
00053 ! KPDATA to PFDATA in the same area, but we are kind enought to have a
00054 ! stride of 2 to access KPDATA ... ! (see also packgb.F)
00055 !
00056       INTEGER KLENG, KBITS
00057 C
00058       INTEGER (KIND=JPDBLE) KPDATA (JP_STRIDE*KLENG)
00059 C
00060       REAL (KIND=JPDBLR) PMIN, PMAX, PSCALE
00061 C
00062       REAL (KIND=JPDBLR) PFDATA (KLENG)
00063 C
00064       INTEGER J, II, IAUXI1, IAUXI2
00065 C
00066       LOGICAL LDARPE
00067 C
00068       REAL(KIND=JPRB) :: ZHOOK_HANDLE
00069       IF (LHOOK) CALL DR_HOOK('UNPAGB',0,ZHOOK_HANDLE)
00070       IF (LDARPE) THEN
00071 C**
00072 C     1.  -  DIRECT COMPUTING WITH 2 CASES, WHICH ENABLES PERFECT
00073 C            RESPECT OF MINIMUM AND MAXIMUM PROVIDED THAT PMIN AND PMAX
00074 C            ARE THESE VALUES.
00075 C
00076         IAUXI1=2**(KBITS-1)
00077         IAUXI2=2*IAUXI1-1
00078 C
00079 C            Here, PSCALE is (PMAX-PMIN)/(FLOAT(IAUXI2).
00080 C
00081 !$OMP PARALLEL DO PRIVATE(J,II) SCHEDULE(STATIC,4096)
00082         DO 101 J=KLENG,1,-1
00083 C
00084 !#if defined(LITTLE_ENDIAN) || defined(LITTLE)
00085 !          II=JP_STRIDE*J -1
00086 !#else
00087 !          II=JP_STRIDE*J
00088 !#endif
00089           II = J
00090           IF (KPDATA(II).LT.IAUXI1) THEN
00091             PFDATA(J)=PMIN+PSCALE*REAL (KPDATA(II),JPDBLR)
00092           ELSE
00093             PFDATA(J)=PMAX-PSCALE*REAL (IAUXI2-KPDATA(II),JPDBLR)
00094           ENDIF
00095 C
00096 101     CONTINUE
00097 !$OMP END PARALLEL DO
00098 C
00099       ELSE
00100 C**
00101 C     2.  -  DIRECT COMPUTING, WHICH ENABLES PERFECT RESPECT
00102 C            OF MINIMUM PROVIDED THAT PMIN IS THIS VALUE.
00103 C       (in standard GRIB, there is no estimation of the field maximum,
00104 C        just a "gross" over-approximation can be given)
00105 C
00106 C
00107 !$OMP PARALLEL DO PRIVATE(J,II) SCHEDULE(STATIC,4096)
00108         DO 201 J=KLENG,1,-1
00109 !#if defined(LITTLE_ENDIAN) || defined(LITTLE)
00110 !          II=JP_STRIDE*J -1
00111 !#else
00112 !          II=JP_STRIDE*J
00113 !#endif
00114           II = J
00115           PFDATA(J)=PMIN+PSCALE*REAL (KPDATA(II),JPDBLR)
00116 201     CONTINUE
00117 !$OMP END PARALLEL DO
00118 C
00119       ENDIF
00120 C
00121       IF (LHOOK) CALL DR_HOOK('UNPAGB',1,ZHOOK_HANDLE)
00122       END