SURFEX v8.1
General documentation of Surfex
fasgra.F90
Go to the documentation of this file.
1 SUBROUTINE fasgra_fort &
2 & (fa, krep, cdnomc, klongd)
3 
4 USE fa_mod, ONLY : fa_com, facadr, lgrib2_lam_bf
5 USE parkind1, ONLY : jprb, jpim
7 USE yomhook , ONLY : lhook, dr_hook
8 
9 IMPLICIT NONE
10 !****
11 ! Sous-programme de calcul de la taille maximale de l'entete GRIB pour
12 ! un champ horizontal.
13 !**
14 ! Arguments : KREP (Sortie) ==> Code-reponse du sous-programme;
15 ! CDNOMC (Entree) ==> Nom du cadre
16 ! KLONGD (Sortie) ==> Taille max. de l'entete
17 !
18 !
19 
20 TYPE(fa_com) :: FA
21 INTEGER (KIND=JPLIKB) KREP, KLONGD
22 !
23 CHARACTER CDNOMC*(*)
24 !
25 INTEGER (KIND=JPLIKB) :: J
26 type(facadr), POINTER :: ylcadr
27 INTEGER (KIND=JPLIKB) :: IRANGC, IRANGC2, INUMER2, IRANG2
28 INTEGER (KIND=JPLIKB) :: ITYPTR, ISTROI
29 !
30 CHARACTER (LEN=*), PARAMETER :: CLNOM2 = '.dummy'
31 !
32 INTEGER (KIND=JPLIKB), PARAMETER :: IFLEVG = 1, itronc = 2, ilatit = 4, ixlopa = 5, inpahe=(1+ilatit)/2
33 INTEGER (KIND=JPLIKB), ALLOCATABLE :: IOZPAR (:), INLOPA (:)
34 REAL (KIND=JPDBLR), ALLOCATABLE :: ZSINLA (:)
35 
36 CHARACTER (LEN=16) :: CLNOMA, CLPREF, CLSUFF
37 INTEGER (KIND=JPLIKB) :: ILGRSP, ILGRGP, ILCHSP, ILCHGP
38 INTEGER (KIND=JPLIKB) :: ILNOMA, INBARI, INBARP, INIVAU
39 INTEGER (KIND=JPLIKB) :: INGRIB, INBPDG, INBCSP, ISTRON, IPUILA, IDMOPL, ILNOMC
40 
41 REAL (KIND=JPDBLR) :: ZCHAMP (1000)
42 INTEGER (KIND=JPLIKB) :: IVALCO (1000)
43 REAL (KIND=JPDBLR) :: ZFOHYB (2,iflevg+1)
44 REAL (KIND=JPDBLR) :: ZUNDF
45 LOGICAL :: LLMLAM, LLLTLN, LLUNDF, LLMODC, LLREDF
46 
47 REAL (KIND=JPRB) :: ZHOOK_HANDLE
48 
49 IF (lhook) CALL dr_hook('FASGRA_MT',0,zhook_handle)
50 
51 #ifndef BUG_FAGRIB2
52 !#define FAGRIB2
53 #endif
54 #ifndef FAGRIB2
55 
56 klongd = 2
57 GOTO 1001
58 
59 #else
60 
61 CALL fanuca_fort (fa, cdnomc,irangc, .false.)
62 
63 ylcadr => fa%CADRE(irangc)
64 
65 IF (ylcadr%IADDPK > 0) THEN
66  klongd = ylcadr%IADDPK
67  GOTO 1001
68 ENDIF
69 
70 istroi = fa%NSTROI
71 fa%NSTROI = 1
72 
73 
74 llmlam = ylcadr%LIMLAM
75 llltln = ylcadr%SINLAT(2) < 0 .AND. llmlam
76 
77 ! Taille d'un champ
78 
79 IF (llmlam) THEN
80  ilchsp = ylcadr%NSFLAM
81 ELSE
82  ilchsp = (1+ylcadr%MTRONC)*(2+ylcadr%MTRONC)
83 ENDIF
84 
85 ilchgp = ylcadr%NVAPDG
86 
87 ! Geometrie minimale
88 
89 ALLOCATE (iozpar(fa%JPXIND), inlopa(fa%JPXPAH), zsinla(fa%JPXGEO))
90 
91 zfohyb(1,:) = 1._jpdblr
92 zfohyb(2,:) = 0._jpdblr
93 
94 iozpar = 1
95 
96 IF (llmlam) THEN
97  ityptr = - itronc
98  zsinla(1:18) = ylcadr%SINLAT (1:18)
99  inlopa(1:8) = (/ 1_jplikb, 1_jplikb, &
100  & 1_jplikb, ilatit-2, &
101  & 1_jplikb, ixlopa-2, &
102  & 0_jplikb, 0_jplikb /)
103 ELSE
104  zsinla(1:inpahe) = (/ (1._jpdblr/REAL (J, JPDBLR), J = 1, inpahe) /)
105  ityptr = ylcadr%NTYPTR
106  inlopa = ixlopa
107 ENDIF
108 
109 
110 ! Definition d'un cadre sur la geometrie minimale
111 
112 llmodc = .false.
113 llredf = .false.
114 ilnomc = int(len(clnom2), jplikb)
115 
116 CALL facadi_fort &
117 & (fa, krep, clnom2, ityptr, ylcadr%SSLAPO, ylcadr%SCLOPO, ylcadr%SSLOPO, &
118 & ylcadr%SCODIL, itronc, ilatit, ixlopa, inlopa, iozpar, zsinla, iflevg, &
119 & ylcadr%SPREFE, zfohyb(1,:), zfohyb(2,:), llmodc, llredf, 0_jplikb, &
120 & irangc2, ilnomc, 1_jplikb)
121 
122 
123 ! Ouverture d'un fichier
124 
125 inumer2 = 0
126 inbarp=0
127 inbari=0
128 
129 CALL fanouv_fort (fa, krep, inumer2, .false., clnom2, 'UNKNOWN', .true., &
130  & .true., 0_jplikb, inbarp, inbari, clnom2)
131 
132 CALL fanumu_fort (fa, inumer2, irang2)
133 
134 ! Read grib_api templates
135 
136 CALL faigra_fort (fa)
137 
138 
139 ! Compactage et extrapolation de la taille d'un champ compacte
140 
141 CALL fagote_fort (fa, krep, inumer2, 121_jplikb, 64_jplikb, 64_jplikb, 1_jplikb, 0_jplikb, 0_jplikb)
142 
143 zundf = 0._jpdblr
144 llundf = .false.
145 zchamp = 0._jpdblr
146 ivalco = 0_jplikb
147 IF (llltln) THEN
148  clpref = 'H'
149  inivau = 2
150  clsuff = 'TEMPERATURE'
151  ilgrgp = SIZE (ivalco)
152  CALL facgra_fort (fa, krep, irang2, clpref, inivau, clsuff, zchamp, &
153  & .false., ivalco, ilgrgp, llundf, zundf)
154  klongd = max(ilgrgp, 2)
155 ELSE
156  clpref = 'S'
157  inivau = 1
158  clsuff = 'TEMPERATURE'
159  ilgrgp = SIZE (ivalco)
160  CALL facgra_fort (fa, krep, irang2, clpref, inivau, clsuff, zchamp, &
161  & .false., ivalco, ilgrgp, llundf, zundf)
162  IF ((.NOT. llmlam) .OR. lgrib2_lam_bf) THEN
163  ilgrsp = SIZE (ivalco)
164  CALL facgra_fort (fa, krep, irang2, clpref, inivau, clsuff, zchamp, &
165  & .true., ivalco, ilgrsp, llundf, zundf)
166  ELSE
167  ilgrsp = 0
168  ENDIF
169  klongd=max( &
170  & 2, ilgrgp + 2*(ylcadr%NNIVER+1) + ylcadr%NLATIT, &
171  & 2, ilgrsp + 2*(ylcadr%NNIVER+1) &
172  & )
173 ENDIF
174 
175 klongd = klongd + 100
176 
177 CALL fairno_fort (fa, krep, inumer2, 'KEEP')
178 
179 ylcadr%IADDPK = klongd
180 
181 fa%NSTROI = istroi
182 
183 #endif
184 
185 1001 CONTINUE
186 
187 IF (lhook) CALL dr_hook('FASGRA_MT',1,zhook_handle)
188 
189 END SUBROUTINE fasgra_fort
190 
191 SUBROUTINE fasgra64 &
192 & (krep, cdnomc, klongd)
193 USE fa_mod, ONLY : fa => fa_com_default, &
196 USE lfi_precision
197 IMPLICIT NONE
198 ! Arguments
199 INTEGER (KIND=JPLIKB) KREP ! OUT
200 CHARACTER (LEN=*) CDNOMC ! IN
201 INTEGER (KIND=JPLIKB) KLONGD ! OUT
202 
203 IF (.NOT. fa_com_default_init) CALL new_fa_default ()
204 
205 CALL fasgra_fort &
206 & (fa, krep, cdnomc, klongd)
207 
208 END SUBROUTINE
209 
210 SUBROUTINE fasgra &
211 & (krep, cdnomc, klongd)
212 USE fa_mod, ONLY : fa => fa_com_default, &
215 USE lfi_precision
216 IMPLICIT NONE
217 ! Arguments
218 INTEGER (KIND=JPLIKM) KREP ! OUT
219 CHARACTER (LEN=*) CDNOMC ! IN
220 INTEGER (KIND=JPLIKM) KLONGD ! OUT
221 
222 IF (.NOT. fa_com_default_init) CALL new_fa_default ()
223 
224 CALL fasgra_mt &
225 & (fa, krep, cdnomc, klongd)
226 
227 END SUBROUTINE
228 
229 SUBROUTINE fasgra_mt &
230 & (fa, krep, cdnomc, klongd)
231 USE fa_mod, ONLY : fa_com
232 USE lfi_precision
233 IMPLICIT NONE
234 ! Arguments
235 type(fa_com) fa ! INOUT
236 INTEGER (KIND=JPLIKM) KREP ! OUT
237 CHARACTER (LEN=*) CDNOMC ! IN
238 INTEGER (KIND=JPLIKM) KLONGD ! OUT
239 ! Local integers
240 INTEGER (KIND=JPLIKB) IREP ! OUT
241 INTEGER (KIND=JPLIKB) ILONGD ! OUT
242 ! Convert arguments
243 
244 
245 CALL fasgra_fort &
246 & (fa, irep, cdnomc, ilongd)
247 
248 krep = int( irep, jplikm)
249 klongd = int( ilongd, jplikm)
250 
251 END SUBROUTINE
252 
integer, parameter jplikb
integer, parameter jpim
Definition: parkind1.F90:13
subroutine fairno_fort(FA, KREP, KNUMER, CDSTTU)
Definition: fairno.F90:5
logical, save fa_com_default_init
Definition: fa_mod.F90:477
subroutine facadi_fort(FA, KREP, CDNOMC, KTYPTR, PSLAPO, PCLOPO, PSLOPO, PCODIL, KTRONC, KNLATI, KNXLON, KNLOPA, KNOZPA, PSINLA, KNIVER, PREFER, PAHYBR, PBHYBR, LDMODC, LDREDF, KPHASE, KRANGC, KLNOMC, KGARDE)
Definition: facadi.F90:12
subroutine new_fa_default()
Definition: fa_mod.F90:649
subroutine fasgra_fort(FA, KREP, CDNOMC, KLONGD)
Definition: fasgra.F90:3
subroutine fanuca_fort(FA, CDNOMC, KRANGC, LDVERR)
Definition: fanuca.F90:5
subroutine faigra_fort(FA)
Definition: faigra.F90:2
Definition: fa_mod.F90:1
integer, parameter jprb
Definition: parkind1.F90:32
subroutine fasgra64(KREP, CDNOMC, KLONGD)
Definition: fasgra.F90:193
subroutine fasgra(KREP, CDNOMC, KLONGD)
Definition: fasgra.F90:212
subroutine fagote_fort(FA, KREP, KNUMER, KNGRIB, KNARG1, KNARG2, KNARG3, KNARG4, KNARG5)
Definition: fagote.F90:6
subroutine fasgra_mt(FA, KREP, CDNOMC, KLONGD)
Definition: fasgra.F90:231
logical lhook
Definition: yomhook.F90:15
subroutine fanouv_fort(FA, KREP, KNUMER, LDNOMM, CDNOMF, CDSTTU, LDERFA, LDIMST, KNIMES, KNBARP, KNBARI, CDNOMC)
Definition: fanouv.F90:9
integer, parameter jplikm
type(fa_com), target, save fa_com_default
Definition: fa_mod.F90:476
logical, save lgrib2_lam_bf
Definition: fa_mod.F90:473
subroutine fanumu_fort(FA, KNUMER, KRANG)
Definition: fanumu.F90:5
subroutine facgra_fort(FA, KREP, KRANG, CDPREF, KNIVAU, CDSUFF, PCHAMP, LDCOSP, KVALCO, KLONGD, LDUNDF, PUNDF)
Definition: facgra.F90:5