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