48 USE modd_grid_gauss, ONLY : xila1, xilo1, xila2, xilo2, ninla, ninlo, nilen, lrotpole, xcoef, xlap, xlop
49 USE modd_grid_arome, ONLY : xx, xy, nx, ny, xlat0, xlon0, xlator, xlonor, xrpk, xbeta
54 USE yomhook
,ONLY : lhook, dr_hook
55 USE parkind1
,ONLY : jprb
64 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
65 INTEGER,
INTENT(IN) :: kluout
66 CHARACTER(LEN=6),
INTENT(OUT) :: hinmodel
67 CHARACTER(LEN=10),
INTENT(OUT) :: hgridtype
74 INTEGER(KIND=kindOfInt) :: iret
77 INTEGER(KIND=kindOfInt) :: imissing
78 INTEGER(KIND=kindOfInt) :: iunit
79 INTEGER(KIND=kindOfInt) :: igrib
81 CHARACTER(LEN=20) :: hgrid
82 INTEGER :: iscan, jscan
86 INTEGER :: iunittime,ip1
91 INTEGER(KIND=kindOfInt),
DIMENSION(:),
ALLOCATABLE :: ininlo_grib
93 REAL(KIND=JPRB) :: zhook_handle
97 IF (lhook) CALL dr_hook(
'PREP_GRIB_GRID',0,zhook_handle)
98 WRITE (kluout,
'(A)')
' -- Grib reader started'
101 CALL grib_open_file(iunit,hgrib,
'R',iret)
103 CALL
abor1_sfx(
'PREP_GRIB_GRID: Error opening the grib file '//hgrib)
106 CALL grib_new_from_file(iunit,igrib,iret)
108 CALL
abor1_sfx(
'PREP_GRIB_GRID: Error in reading the grib file')
112 CALL grib_close_file(iunit)
118 CALL grib_get(igrib,
'centre',icenter,iret)
120 CALL
abor1_sfx(
'PREP_GRIB_GRID: Error in reading center')
123 CALL grib_get(igrib,
'typeOfGrid',hgrid,iret)
125 CALL
abor1_sfx(
'PREP_GRIB_GRID: Error in reading type of grid')
128 SELECT CASE (icenter)
131 WRITE (kluout,
'(A)')
' | Grib file from HARMONY'
136 WRITE (kluout,
'(A)')
' | Grib file from HIRLAM'
138 hgridtype=
'ROTLATLON '
141 WRITE (kluout,
'(A)')
' | Grib file from European Center for Medium-range Weather Forecast'
149 WRITE (kluout,
'(A)')
' | Grib file from French Weather Service - Arpege model'
150 WRITE (kluout,
'(A)')
'but same grid as ECMWF model (unstretched)'
155 WRITE (kluout,
'(A)')
' | Grib file from French Weather Service - Arpege model'
156 WRITE (kluout,
'(A)')
'but reduced grid'
161 WRITE (kluout,
'(A)')
' | Grib file from French Weather Service - Mocage model'
165 CASE(
'unknown_PLPresent')
166 WRITE (kluout,
'(A)')
' | Grib file from French Weather Service - Arpege model'
168 hgridtype=
'ROTGAUSS '
171 WRITE (kluout,
'(A)')
' | Grib file from French Weather Service - Aladin france model'
176 WRITE (kluout,
'(A)')
' | Grib file from French Weather Service - Aladin reunion model'
178 hgridtype=
'MERCATOR '
183 CALL
abor1_sfx(
'PREP_GRIB_GRID: GRIB FILE FORMAT NOT SUPPORTED')
195 IF (
ALLOCATED(ninlo))
DEALLOCATE(ninlo)
197 SELECT CASE (hgridtype)
199 CASE (
'AROME ',
'MERCATOR ')
200 ! 3.1 lambert conformal projection(aladin files)
201 ! or mercator projection(aladin reunion files)
202 CALL grib_get(igrib,
'Nj',ny,iret)
203 CALL grib_get(igrib,
'Ni',nx,iret)
207 CASE (
'GAUSS ',
'ROTGAUSS ',
'LATLON ')
208 ! 3.2 usual or gaussian lat,lon grid(ecmwf files)
210 CALL grib_get(igrib,
'Nj',ninla,iret)
211 ALLOCATE (ninlo(ninla))
212 ALLOCATE (ininlo_grib(ninla))
214 CALL grib_is_missing(igrib,
'pl',imissing,iret)
215 IF (iret /= 0 .OR. imissing==1)
THEN
216 CALL grib_get(igrib,
'Ni',ininlo_grib(1),iret)
217 ininlo_grib(2:ninla)=ininlo_grib(1)
218 nilen=ninla*ininlo_grib(1)
220 CALL grib_get(igrib,
'pl',ininlo_grib)
222 nilen = nilen + ininlo_grib(jloop1)
228 CALL grib_get(igrib,
'Nj',nry,iret)
229 CALL grib_get(igrib,
'Ni',nrx,iret)
233 CALL
abor1_sfx(
'PREP_GRIB_GRID: GRID PROJECTION NOT SUPPORTED')
252 SELECT CASE (hgridtype)
255 ! 4.1 lambert conformal projection(aladin files)
257 CALL grib_get(igrib,
'xDirectionGridLength',ilenx)
258 CALL grib_get(igrib,
'yDirectionGridLength',ileny)
262 CALL grib_get(igrib,
'Latin1InDegrees',xlat0)
263 CALL grib_get(igrib,
'LoVInDegrees',xlon0)
264 IF (xlon0 > 180.) xlon0 = xlon0 - 360.
266 CALL grib_get(igrib,
'latitudeOfFirstGridPointInDegrees',xlator)
267 CALL grib_get(igrib,
'longitudeOfFirstGridPointInDegrees',xlonor)
268 IF (xlonor > 180.) xlonor = xlonor - 360.
270 xrpk = sin(xlat0/180.*xpi)
273 CASE (
'GAUSS ',
'LATLON ')
275 ! 4.2 usual or gaussian lat,lon grid(ecmwf files)
276 ! no projection - just stores the grid definition
278 CALL grib_get(igrib,
'latitudeOfFirstGridPointInDegrees',xila1)
279 CALL grib_get(igrib,
'longitudeOfFirstGridPointInDegrees',xilo1)
280 CALL grib_get(igrib,
'latitudeOfLastGridPointInDegrees',xila2)
281 CALL grib_get(igrib,
'longitudeOfLastGridPointInDegrees',xilo2)
287 ! 4.2.5 rotated lat/lon grid(hirlam)
289 CALL grib_get(igrib,
'iScansNegatively',iscan)
290 CALL grib_get(igrib,
'jScansNegatively',jscan)
292 IF (iscan+jscan == 0 )
THEN
293 CALL grib_get(igrib,
'latitudeOfFirstGridPointInDegrees',xrila2)
294 CALL grib_get(igrib,
'longitudeOfFirstGridPointInDegrees',xrilo1)
295 CALL grib_get(igrib,
'latitudeOfLastGridPointInDegrees',xrila1)
296 CALL grib_get(igrib,
'longitudeOfLastGridPointInDegrees',xrilo2)
297 ELSEIF (iscan+jscan == 2)
THEN
298 CALL grib_get(igrib,
'latitudeOfFirstGridPointInDegrees',xrila1)
299 CALL grib_get(igrib,
'longitudeOfFirstGridPointInDegrees',xrilo2)
300 CALL grib_get(igrib,
'latitudeOfLastGridPointInDegrees',xrila2)
301 CALL grib_get(igrib,
'longitudeOfLastGridPointInDegrees',xrilo1)
302 ELSEIF (iscan == 1)
THEN
303 CALL grib_get(igrib,
'latitudeOfFirstGridPointInDegrees',xrila2)
304 CALL grib_get(igrib,
'longitudeOfFirstGridPointInDegrees',xrilo2)
305 CALL grib_get(igrib,
'latitudeOfLastGridPointInDegrees',xrila1)
306 CALL grib_get(igrib,
'longitudeOfLastGridPointInDegrees',xrilo1)
307 ELSEIF (jscan == 1)
THEN
308 CALL grib_get(igrib,
'latitudeOfFirstGridPointInDegrees',xrila1)
309 CALL grib_get(igrib,
'longitudeOfFirstGridPointInDegrees',xrilo1)
310 CALL grib_get(igrib,
'latitudeOfLastGridPointInDegrees',xrila2)
311 CALL grib_get(igrib,
'longitudeOfLastGridPointInDegrees',xrilo2)
314 CALL grib_get(igrib,
'latitudeOfSouthernPoleInDegrees',xrlap)
315 CALL grib_get(igrib,
'longitudeOfSouthernPoleInDegrees',xrlop)
317 CALL grib_get(igrib,
'iDirectionIncrementInDegrees',xrdx)
318 CALL grib_get(igrib,
'jDirectionIncrementInDegrees',xrdy)
320 WRITE(kluout,*)
'XRILA1,XRILO1',xrila1,xrilo1
321 WRITE(kluout,*)
'XRILA2,XRILO2',xrila2,xrilo2
322 WRITE(kluout,*)
'XRLAP,XRLOP',xrlap,xrlop
323 WRITE(kluout,*)
'XRDX,XRDY',xrdx,xrdy
326 ! 4.3 stretched lat,lon grid(arpege files)
329 CALL grib_get(igrib,
'latitudeOfFirstGridPointInDegrees',xila1)
330 CALL grib_get(igrib,
'longitudeOfFirstGridPointInDegrees',xilo1)
331 CALL grib_get(igrib,
'latitudeOfLastGridPointInDegrees',xila2)
332 CALL grib_get(igrib,
'longitudeOfLastGridPointInDegrees',xilo2)
335 CALL grib_get(igrib,
'stretchingFactor',xcoef)
336 CALL grib_get(igrib,
'latitudeOfStretchingPoleInDegrees',xlap)
337 CALL grib_get(igrib,
'longitudeOfStretchingPoleInDegrees',xlop)
341 ! 4.4 mercator projection(aladin reunion files)
344 CALL grib_get(igrib,
'Dj',ileny)
345 CALL grib_get(igrib,
'Di',ilenx)
349 CALL grib_get(igrib,
'LaDInDegrees',xlat0)
352 CALL grib_get(igrib,
'latitudeOfFirstGridPointInDegrees',xlator)
353 CALL grib_get(igrib,
'longitudeOfFirstGridPointInDegrees',xlonor)
354 IF (xlonor > 180.) xlonor = xlonor - 360.
360 WRITE (kluout,
'(A)')
'No such projection implemented in prep_grib_grid ',hgrid
361 CALL
abor1_sfx(
'PREP_GRIB_GRID: UNKNOWN PROJECTION')
368 WRITE (kluout,
'(A)')
' | Reading date'
370 CALL grib_get(igrib,
'year',tptime_grib%TDATE%YEAR,iret)
371 CALL grib_get(igrib,
'month',tptime_grib%TDATE%MONTH,iret)
372 CALL grib_get(igrib,
'day',tptime_grib%TDATE%DAY,iret)
373 CALL grib_get(igrib,
'time',itime,iret)
374 tptime_grib%TIME=int(itime/100)*3600+(itime-int(itime/100)*100)*60
376 CALL grib_get(igrib,
'P1',ip1,iret)
378 CALL grib_get(igrib,
'unitOfTimeRange',iunittime,iret)
379 SELECT CASE (iunittime)
381 tptime_grib%TIME = tptime_grib%TIME + ip1*3600.
383 tptime_grib%TIME = tptime_grib%TIME + ip1*60.
389 CALL grib_release(igrib,iret)
391 CALL
abor1_sfx(
'PREP_GRIB_GRID: Error in releasing the grib message memory')
394 IF (lhook) CALL dr_hook(
'PREP_GRIB_GRID',1,zhook_handle)
subroutine abor1_sfx(YTEXT)
subroutine prep_grib_grid(HGRIB, KLUOUT, HINMODEL, HGRIDTYPE, TPTIME_GRIB)