SURFEX v8.1
General documentation of Surfex
unpagb.F
Go to the documentation of this file.
1  SUBROUTINE unpagb ( KPDATA, PFDATA, PMIN, PMAX, KBITS, PSCALE, &
2  & KLENG, LDARPE )
3  USE parkind1, ONLY : jprb
4  USE yomhook , ONLY : lhook, dr_hook
5  USE lfi_precision
6 !
7 !
8 !********************************************************************
9 !*
10 !* NAME : UNPAGB
11 !*
12 !* FUNCTION : COMPUTES INDIVIDUAL "UNPACKED" VALUES (FIELD FROM GRIB
13 !* ), THE INPUT CONSISTING OF ONE DATA JUST UNPACKED
14 !* FROM A BIT STRING PER COMPUTER WORD.
15 !* This subroutine has been designed to avoid explicit
16 !* mixed use of REAL and INTEGER type values within the
17 !* dummy-argument array PFDATA of DECOGA, this explicit
18 !* use leading to non-standard code. The following code
19 !* enables use of the same actual argument for the 2
20 !* dummy-argument arrays.
21 !*
22 !* INPUT : KPDATA - (POSITIVE) INTEGER VALUES "JUST UNPACKED"
23 !* PMIN - MINIMUM VALUE, OR AN "UNDER-APPROXIMATION"
24 !* OF THE MINIMUM VALUE).
25 !* PMAX - MAXIMUM VALUE, OR A "OVER-APPROXIMATION"
26 !* OF THE MAXIMUM VALUE).
27 !* KBITS - NUMBER OF BITS PER CODED VALUE.
28 !* PSCALE - SCALE FACTOR TO APPLY.
29 !* KLENG - NUMBER OF VALUES TO BE TREATED.
30 !* LDARPE - .TRUE., modifications for ARPEGE coding
31 !* have been included when coding data;
32 !* .FALSE., no such modifications.
33 !*
34 !* PMAX and KBITS are used only if LDARPE is .TRUE. .
35 !*
36 !*
37 !* OUTPUT : PFDATA - FLOATING-POINT VALUES.
38 !*
39 !* AUTHOR : J.CLOCHARD, FRENCH WEATHER SERVICE, 01/03/90.
40 !*
41 !********************************************************************
42 !*
43  IMPLICIT NONE
44 !
45 ! JP_STRIDE= pas permettant la correspondance entre les elements
46 ! d'un tableau de reels (KIND=JPDBLD): PFDATA(J) et
47 ! les elements d'un tableau d'entiers KPDATA(JP_STRIDE*J)
48 ! defini comme un tableau d'entiers representes sur
49 ! autant de bits que les reels.
50 !
51  INTEGER (KIND=JPLIKM), PARAMETER ::
52  & jp_stride=jpdbld/jp_simple_entier
53 !
54 ! If integers are on 32 bits, don't be afraid by the number of bits of the
55 ! real argument which is real and on 64 bits ... it's a trick : we unpack
56 ! KPDATA to PFDATA in the same area, but we are kind enought to have a
57 ! stride of 2 to access KPDATA ... ! (see also packgb.F)
58 !
59  INTEGER (KIND=JPLIKM) :: KLENG
60  INTEGER (KIND=JPLIKM) :: KBITS
61 !
62  INTEGER (KIND=JPLIKM) :: KPDATA (jp_stride*kleng)
63 !
64  REAL (KIND=JPDBLD) :: PMIN
65  REAL (KIND=JPDBLD) :: PMAX
66  REAL (KIND=JPDBLD) :: PSCALE
67 !
68  REAL (KIND=JPDBLD) :: PFDATA (kleng)
69 !
70  INTEGER (KIND=JPLIKM) :: J, II, IAUXI1, IAUXI2
71 !
72  LOGICAL :: LDARPE
73 !
74  REAL(KIND=JPRB) :: ZHOOK_HANDLE
75  IF (lhook) CALL dr_hook('UNPAGB',0,zhook_handle)
76  IF (ldarpe) THEN
77 !**
78 ! 1. - DIRECT COMPUTING WITH 2 CASES, WHICH ENABLES PERFECT
79 ! RESPECT OF MINIMUM AND MAXIMUM PROVIDED THAT PMIN AND PMAX
80 ! ARE THESE VALUES.
81 !
82  iauxi1=2**(kbits-1)
83  iauxi2=2*iauxi1-1
84 !
85 ! Here, PSCALE is (PMAX-PMIN)/(FLOAT(IAUXI2).
86 !
87 !$OMP PARALLEL DO PRIVATE(J,II) SCHEDULE(STATIC,4096)
88  DO 101 j=kleng,1,-1
89 !
90 #if defined(LITTLE)
91  ii=jp_stride*j -1
92 #else
93  ii=jp_stride*j
94 #endif
95  IF (kpdata(ii).LT.iauxi1) THEN
96  pfdata(j)=pmin+pscale*REAL (KPDATA(II),JPDBLD)
97  ELSE
98  pfdata(j)=pmax-pscale*REAL (IAUXI2-KPDATA(II),JPDBLD)
99  ENDIF
100 !
101 101 CONTINUE
102 !$OMP END PARALLEL DO
103 !
104  ELSE
105 !**
106 ! 2. - DIRECT COMPUTING, WHICH ENABLES PERFECT RESPECT
107 ! OF MINIMUM PROVIDED THAT PMIN IS THIS VALUE.
108 ! (in standard GRIB, there is no estimation of the field maximum,
109 ! just a "gross" over-approximation can be given)
110 !
111 !
112 !$OMP PARALLEL DO PRIVATE(J,II) SCHEDULE(STATIC,4096)
113  DO 201 j=kleng,1,-1
114 #if defined(LITTLE)
115  ii=jp_stride*j -1
116 #else
117  ii=jp_stride*j
118 #endif
119  pfdata(j)=pmin+pscale*REAL (KPDATA(II),JPDBLD)
120 201 CONTINUE
121 !$OMP END PARALLEL DO
122 !
123  ENDIF
124 !
125  IF (lhook) CALL dr_hook('UNPAGB',1,zhook_handle)
126  ENDSUBROUTINE unpagb
integer, parameter jp_simple_entier
integer, parameter jpdbld
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine unpagb(KPDATA, PFDATA, PMIN, PMAX, KBITS, PSCALE,
Definition: unpagb.F:2