SURFEX v8.1
General documentation of Surfex
faccpl.F90
Go to the documentation of this file.
1 SUBROUTINE faccpl_fort &
2 & (fa, krep, krang, cdpref, knivau, cdsuff, &
3 & pchamp, ldcosp, kvalco, klongd)
5 USE parkind1, ONLY : jprb
6 USE yomhook , ONLY : lhook, dr_hook
9 USE grib_api
10 IMPLICIT NONE
11 TYPE(fa_com) :: FA
12 INTEGER (KIND=JPLIKB) KREP, KRANG, KNIVAU, KLONGD, ILONGD
13 !
14 INTEGER (KIND=JPLIKB) KVALCO(*)
15 REAL (KIND=JPDBLR) PCHAMP(*)
16 !
17 LOGICAL LDCOSP
18 !
19 CHARACTER CDPREF*(*), CDSUFF*(*)
20 !
21 #include "fagribex.h"
22 !
23 REAL (KIND=JPDBLR), ALLOCATABLE :: ZCHAMP (:)
24 INTEGER (KIND=JPLIKB) IRANGC
25 INTEGER (KIND=JPLIKB) INLATI, INXLON, IDLUXG, IDGUXG, IDZONL, IDZONG
26 INTEGER (KIND=JPLIKB) ILCHAM
27 INTEGER (KIND=JPLIKB) ICPLSIZE
28 INTEGER (KIND=JPLIKB) ILAT, ILON
29 INTEGER (KIND=JPLIKB) INIMES, INUMER
30 INTEGER (KIND=JPLIKB) ILATMIN, ILATMAX, ILONMIN, ILONMAX
31 !
32 CHARACTER(LEN=FA%JPLMES) CLMESS
33 CHARACTER(LEN=FA%JPLSPX) CLNSPR
34 LOGICAL :: LLFATA
35 !
36 
37 type(facadr), POINTER :: ylcadr
38 type(fafich), POINTER :: ylfich
39 CHARACTER, ALLOCATABLE :: CLGRIB (:)
40 INTEGER (KIND=JPKSIZE_T) :: ILGRIB
41 INTEGER (KIND=JPLIKM) :: IRET, IGRIBH
42 INTEGER (KIND=JPLIKB) :: IFGRIB, INBITS, IBFPDG
43 REAL (KIND=JPDBLR) :: ZUNDF, ZMAX, ZMIN
44 LOGICAL :: LLUNDF
45 !
46 REAL(KIND=JPRB) :: ZHOOK_HANDLE
47 
48 IF (lhook) CALL dr_hook('FACCPL_MT',0,zhook_handle)
49 
50 ylfich => fa%FICHIER(krang)
51 irangc = ylfich%NUCADR
52 ylcadr => fa%CADRE(irangc)
53 
54 ! Save encoding options
55 
56 ibfpdg = ylfich%NBFPDG
57 ifgrib = ylfich%NFGRIB
58 
59 ! Hollow field encoding options
60 
61 ylfich%NFGRIB = 140
62 ylfich%NBFPDG = ylfich%NCPLBITS
63 
64 IF (ldcosp) THEN
65  krep=-200
66  GOTO 1001
67 ENDIF
68 
69 krep=0
70 
71 inlati=ylcadr%NLATIT
72 inxlon=ylcadr%NXLOPA
73 
74 ilcham = inlati * inxlon
75 idluxg = ylcadr%NLOPAR (4) ! lon
76 idguxg = ylcadr%NLOPAR (6) ! lat
77 idzonl = ylcadr%NLOPAR (7)
78 idzong = ylcadr%NLOPAR (8)
79 
80 icplsize = ylfich%NCPLSIZE
81 
82 ALLOCATE (zchamp(ilcham))
83 
84 ilonmin=idzonl+icplsize
85 ilonmax=idluxg-icplsize-idzonl+1
86 ilatmin=idzong+icplsize
87 ilatmax=idguxg-icplsize-idzong+1
88 
89 zmin = minval(pchamp(1:ilcham))
90 zmax = maxval(pchamp(1:ilcham))
91 
92 IF (zmax > 0) THEN
93  zundf = 2.0_jpdblr * zmax
94 ELSEIF (zmax < 0) THEN
95  zundf = 0.5_jpdblr * zmax
96 ELSEIF (zmin < 0) THEN
97  zundf = 2.0_jpdblr * zmin
98 ELSEIF (zmin > 0) THEN
99  zundf = 0.5_jpdblr * zmin
100 ELSE ! ZMAX=ZMIN=0.
101  zundf = 1.0_jpdblr
102 ENDIF
103 
104 DO ilat = 1, inlati
105  DO ilon = 1, inxlon
106  IF ((ilon <= ilonmin) .OR. (ilon >= ilonmax) .OR. &
107  & (ilat <= ilatmin) .OR. (ilat >= ilatmax)) THEN
108  zchamp((ilat-1)*inxlon+ilon) = pchamp((ilat-1)*inxlon+ilon)
109  ELSE
110  zchamp((ilat-1)*inxlon+ilon) = zundf
111  ENDIF
112  ENDDO
113 ENDDO
114 
115 llundf = .true.
116 CALL facgrm_fort (fa, krep, krang, cdpref, knivau, cdsuff, zchamp, &
117  & ldcosp, igribh, llundf, zundf, 2_jplikb)
118 
119 IF (krep /= 0) GOTO 1001
120 
121 CALL igrib_set_value (igribh, 'ICPLSIZE', icplsize)
122 
123 CALL igrib_get_value (igribh, 'INBITS', inbits)
124 
125 CALL igrib_get_message_size (igribh, ilgrib)
126 
127 ALLOCATE (clgrib(ilgrib))
128 CALL grib_copy_message (igribh, clgrib, status=iret)
129 
130 IF (iret == grib_success) THEN
131  ilongd = 4+(ilgrib+7)/8
132  kvalco(1) = ifgrib
133  kvalco(2) = 0
134  kvalco(3) = icplsize
135  kvalco(4) = inbits
136  IF ((klongd < ilongd) .AND. (klongd > 0)) THEN
137  krep=-130
138  GOTO 1001
139  ELSE
140  klongd = ilongd
141  ENDIF
142  kvalco(5:ilongd) = transfer(clgrib, kvalco(5:ilongd))
143 ELSE
144  krep = iret-1000
145  GOTO 1001
146 ENDIF
147 
148 CALL igrib_release (igribh)
149 
150 1001 CONTINUE
151 
152 IF (ALLOCATED (clgrib)) DEALLOCATE (clgrib)
153 IF (ALLOCATED (zchamp)) DEALLOCATE (zchamp)
154 
155 ! Restore encoding options
156 
157 ylfich%NBFPDG = ibfpdg
158 ylfich%NFGRIB = ifgrib
159 
160 !
161 
162 llfata=llmoer(krep,krang)
163 
164 IF (fa%LFAMOP.OR.llfata) THEN
165  inimes=2
166  clnspr='FACCPL'
167  inumer=jpniil
168 
169  WRITE (unit=clmess,fmt="('KREP=',I4,', KRANG=',I4, &
170 & ', CDPREF=''',A,''', KNIVAU=',I4,', CDSUFF=''',A,'''')") &
171 & krep, krang, cdpref, knivau, cdsuff
172  CALL faipar_fort &
173 & (fa,inumer,inimes,krep,.false.,clmess, &
174 & clnspr, '',.false.)
175 ENDIF
176 
177 IF (lhook) CALL dr_hook('FACCPL_MT',1,zhook_handle)
178 
179 CONTAINS
180 
181 #include "facom2.llmoer.h"
182 
183 END SUBROUTINE
184 
subroutine facgrm_fort(FA, KREP, KRANG, CDPREF, KNIVAU, CDSUFF, PCHAMP, LDCOSP, KGRIBH, LDUNDF, PUNDF, KLOCSN)
Definition: facgrm.F90:5
Definition: fa_mod.F90:1
integer, parameter jprb
Definition: parkind1.F90:32
subroutine, public igrib_release(KHANDLE)
subroutine, public igrib_get_message_size(KHANDLE, KBYTES)
subroutine faccpl_fort(FA, KREP, KRANG, CDPREF, KNIVAU, CDSUFF, PCHAMP, LDCOSP, KVALCO, KLONGD)
Definition: faccpl.F90:4
logical lhook
Definition: yomhook.F90:15
subroutine faipar_fort(FA, KNUMER, KNIMES, KCODE, LDFATA, CDMESS, CDNSPR, CDACTI, LDRLFI)
Definition: faipar.F90:6
integer(kind=jplikb), parameter jpniil
Definition: fa_mod.F90:31