SURFEX v8.1
General documentation of Surfex
packgb.F
Go to the documentation of this file.
1  SUBROUTINE packgb ( PFDATA, KPACKD, PREFER, PSCALE, KLENG )
2  USE parkind1, ONLY : jpim, jprb
3  USE yomhook , ONLY : lhook, dr_hook
4  USE lfi_precision
5 !
6 !********************************************************************
7 !*
8 !* NAME : PACKGB
9 !*
10 !* FUNCTION : COMPUTES INDIVIDUAL "PACKED" VALUES (FIELD FOR GRIB),
11 !* THE RESULT CONSISTS OF ONE DATA READY TO PACK
12 !* WITHIN A BIT STRING PER COMPUTER WORD.
13 !* This subroutine has been designed to avoid explicit
14 !* mixed use of REAL and INTEGER type values within the
15 !* dummy-argument array PFDATA of CODEGA, this explicit
16 !* use leading to non-standard code. The following code
17 !* enables use of the same actual argument for the 2
18 !* dummy-argument arrays.
19 !*
20 !* INPUT : PFDATA - FLOATING-POINT VALUES TO BE PACKED.
21 !* PREFER - REFERENCE VALUE OF THE FIELD: SHOULD BE THE
22 !* MINIMUM VALUE, OR AN "UNDER-APPROXIMATION"
23 !* OF THE MINIMUM VALUE).
24 !* PSCALE - SCALING FACTOR.
25 !* KLENG - NUMBER OF VALUES TO TREAT.
26 !*
27 !* OUTPUT : KPACKD - (POSITIVE) INTEGER VALUES "READY TO PACK"
28 !*
29 !* AUTHOR : J.CLOCHARD, FRENCH WEATHER SERVICE, 01/03/90.
30 !*
31 !********************************************************************
32 !*
33  IMPLICIT NONE
34 !
35 ! JP_STRIDE= pas permettant la correspondance entre les elements
36 ! d'un tableau de reels (KIND=JPDBLR): PFDATA(J) et
37 ! les elements d'un tableau d'entiers KPACKD(JP_STRIDE*J)
38 ! defini comme un tableau d'entiers representes sur
39 ! autant de bits que les reels.
40 !
41  INTEGER(KIND=JPIM),PARAMETER :: JP_STRIDE=jpdbld/jp_simple_entier
42 !
43 ! If integers are on 32 bits, don't be afraid by the number of bits of the
44 ! real argument which is real and on 64 bits ... it's a trick : we pack
45 ! PFDATA to KPACKD in the same area, but with half bit and we are kind
46 ! enough to have a stride of 2 to access KPACKD ... ! (see also unpagb.F)
47 !
48  INTEGER(KIND=JPIM) :: KLENG
49 !
50  INTEGER(KIND=JPIM) :: KPACKD (jp_stride*kleng)
51 !
52  REAL (KIND=JPDBLD) :: PREFER
53  REAL (KIND=JPDBLD) :: PSCALE
54 !
55  REAL (KIND=JPDBLD) :: PFDATA (kleng)
56 !
57  INTEGER(KIND=JPIM) :: J, II
58  REAL(KIND=JPRB) :: ZHOOK_HANDLE
59 !**
60 ! 1. - STRAIGHT-FORWARD COMPUTING.
61 !
62  IF (lhook) CALL dr_hook('PACKGB',0,zhook_handle)
63 !$OMP PARALLEL DO PRIVATE(J,II) SCHEDULE(STATIC,4096)
64  DO 101 j=1,kleng
65 #if defined(LITTLE)
66  ii=jp_stride*j -1
67 #else
68  ii=jp_stride*j
69 #endif
70  kpackd(ii)=nint( ( pfdata(j) - prefer ) * pscale )
71  101 CONTINUE
72 !$OMP END PARALLEL DO
73 !
74  IF (lhook) CALL dr_hook('PACKGB',1,zhook_handle)
75  ENDSUBROUTINE packgb
integer, parameter jp_simple_entier
integer, parameter jpim
Definition: parkind1.F90:13
subroutine packgb(PFDATA, KPACKD, PREFER, PSCALE, KLENG)
Definition: packgb.F:2
integer, parameter jpdbld
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15