6 SUBROUTINE prep_grib_grid(HGRIB,KLUOUT,HINMODEL,HGRIDTYPE,HINTERP_TYPE,TPTIME_GRIB)
55 USE modd_grid_gauss, ONLY :
xila1,
xilo1,
xila2,
xilo2,
ninla,
ninlo,
nilen,
lrotpole,
xcoef,
xlap,
xlop, &
57 USE modd_grid_arome, ONLY :
xx,
xy,
nx,
ny,
xlat0,
xlon0,
xlator,
xlonor,
xrpk,
xbeta,
xzx,
xzy,
nix 63 USE modi_horibl_surf_init
64 USE modi_horibl_surf_coef
65 USE modi_arpege_stretch_a
81 CHARACTER(LEN=*),
INTENT(IN) :: HGRIB
82 INTEGER,
INTENT(IN) :: KLUOUT
83 CHARACTER(LEN=6),
INTENT(OUT) :: HINMODEL
84 CHARACTER(LEN=10),
INTENT(OUT) :: HGRIDTYPE
85 CHARACTER(LEN=6),
INTENT(OUT) :: HINTERP_TYPE
92 CHARACTER(LEN=50) :: HGRID
94 INTEGER(KIND=kindOfInt),
DIMENSION(:),
ALLOCATABLE :: ININLO_GRIB
95 INTEGER(KIND=kindOfInt) :: IMISSING
96 INTEGER(KIND=kindOfInt) :: IUNIT
97 INTEGER(KIND=kindOfInt) :: IGRIB
98 INTEGER(KIND=kindOfInt) :: IRET
102 INTEGER :: ISCAN, JSCAN
105 INTEGER :: ITIME, IYEAR, IMONTH, IDAY
106 INTEGER :: IUNITTIME,IP1
107 INTEGER :: INO, IINLA
114 INTEGER :: INFOMPI, J
115 REAL(KIND=JPRB) :: ZHOOK_HANDLE
119 IF (
lhook)
CALL dr_hook(
'PREP_GRIB_GRID_1',0,zhook_handle)
123 WRITE (kluout,
'(A)')
' -- Grib reader started' 126 CALL grib_open_file(iunit,hgrib,
'R',iret)
128 CALL abor1_sfx(
'PREP_GRIB_GRID: Error opening the grib file '//hgrib)
131 CALL grib_new_from_file(iunit,igrib,iret)
133 CALL grib_new_from_file(iunit,igrib,iret)
136 CALL abor1_sfx(
'PREP_GRIB_GRID: Error in reading the grib file')
140 CALL grib_close_file(iunit)
147 CALL grib_get(igrib,
'centre',icenter,iret)
149 CALL abor1_sfx(
'PREP_GRIB_GRID: Error in reading center')
152 CALL grib_get(igrib,
'typeOfGrid',hgrid,iret)
154 CALL abor1_sfx(
'PREP_GRIB_GRID: Error in reading type of grid')
157 SELECT CASE (icenter)
163 WRITE (kluout,
'(A)')
' | Grib file from HIRLAM - regular latlon grid ' 165 hgridtype=
'ROTLATLON ' 168 WRITE (kluout,
'(A)')
' | Grib file from HARMONY' 175 WRITE (kluout,
'(A)')
' | Grib file from HIRLAM' 177 hgridtype=
'ROTLATLON ' 180 WRITE (kluout,
'(A)')
' | Grib file from European Center for Medium-range Weather Forecast' 188 WRITE (kluout,
'(A)')
' | Grib file from French Weather Service - Arpege model' 189 WRITE (kluout,
'(A)')
'but same grid as ECMWF model (unstretched)' 194 WRITE (kluout,
'(A)')
' | Grib file from French Weather Service - Arpege model' 195 WRITE (kluout,
'(A)')
'but reduced grid' 200 WRITE (kluout,
'(A)')
' | Grib file from French Weather Service - Mocage model' 204 CASE(
'unknown_PLPresent')
205 WRITE (kluout,
'(A)')
' | Grib file from French Weather Service - Arpege model' 207 hgridtype=
'ROTGAUSS ' 209 CASE(
'reduced_stretched_rotated_gg')
210 WRITE (kluout,
'(A)')
' | Grib file from French Weather Service - Arpege model' 211 WRITE (kluout,
'(A)')
'but reduced grid' 213 hgridtype=
'ROTGAUSS ' 216 WRITE (kluout,
'(A)')
' | Grib file from French Weather Service - Aladin france model' 221 WRITE (kluout,
'(A)')
' | Grib file from French Weather Service - Aladin reunion model' 223 hgridtype=
'MERCATOR ' 228 CALL abor1_sfx(
'PREP_GRIB_GRID: GRIB FILE FORMAT NOT SUPPORTED')
235 CALL mpi_bcast(igrib,kind(igrib)/4,mpi_integer,
npio,
ncomm,infompi)
236 CALL mpi_bcast(hinmodel,len(hinmodel),mpi_character,
npio,
ncomm,infompi
237 CALL mpi_bcast(hgridtype,len(hgridtype),mpi_character,
npio,
ncomm,infompi
251 SELECT CASE (hgridtype)
253 CASE (
'AROME ',
'MERCATOR ')
254 ! 3.1 lambert conformal projection(aladin files)
255 ! or mercator projection(aladin reunion files)
257 CALL grib_get(igrib,
'Nj',
ny,iret)
258 CALL grib_get(igrib,
'Ni',
nx,iret)
269 CASE (
'GAUSS ',
'ROTGAUSS ',
'LATLON ')
270 ! 3.2 usual or gaussian lat,lon grid(ecmwf files)
282 ALLOCATE (ininlo_grib(
ninla))
283 CALL grib_is_missing(igrib,
'pl',imissing,iret)
284 IF (iret /= 0 .OR. imissing==1)
THEN 285 CALL grib_get(igrib,
'Ni',ininlo_grib(1),iret)
286 ininlo_grib(2:
ninla)=ininlo_grib(1)
289 CALL grib_get(igrib,
'pl',ininlo_grib)
295 DEALLOCATE(ininlo_grib)
306 CALL grib_get(igrib,
'Nj',
nry,iret)
307 CALL grib_get(igrib,
'Ni',
nrx,iret)
318 CALL abor1_sfx(
'PREP_GRIB_GRID: GRID PROJECTION NOT SUPPORTED')
337 SELECT CASE (hgridtype)
340 ! 4.1 lambert conformal projection(aladin files)
343 CALL grib_get(igrib,
'xDirectionGridLength',ilenx)
344 CALL grib_get(igrib,
'yDirectionGridLength',ileny)
356 CALL grib_get(igrib,
'Latin1InDegrees',
xlat0)
357 CALL grib_get(igrib,
'LoVInDegrees',
xlon0)
368 CALL grib_get(igrib,
'latitudeOfFirstGridPointInDegrees',
xlator)
369 CALL grib_get(igrib,
'longitudeOfFirstGridPointInDegrees',
xlonor)
382 CASE (
'GAUSS ',
'LATLON ')
384 ! 4.2 usual or gaussian lat,lon grid(ecmwf files)
385 !
no projection - just stores the grid definition
388 CALL grib_get(igrib,
'latitudeOfFirstGridPointInDegrees',
xila1)
389 CALL grib_get(igrib,
'longitudeOfFirstGridPointInDegrees',
xilo1)
390 CALL grib_get(igrib,
'latitudeOfLastGridPointInDegrees',
xila2)
391 CALL grib_get(igrib,
'longitudeOfLastGridPointInDegrees',
xilo2)
406 ! 4.2.5 rotated lat/lon grid(hirlam)
409 CALL grib_get(igrib,
'iScansNegatively',iscan)
410 CALL grib_get(igrib,
'jScansPositively',jscan)
412 IF (iscan+jscan == 0 )
THEN 413 CALL grib_get(igrib,
'latitudeOfFirstGridPointInDegrees',
xrila2)
414 CALL grib_get(igrib,
'longitudeOfFirstGridPointInDegrees',
xrilo1 415 CALL grib_get(igrib,
'latitudeOfLastGridPointInDegrees',
xrila1)
416 CALL grib_get(igrib,
'longitudeOfLastGridPointInDegrees',
xrilo2)
417 ELSEIF (iscan+jscan == 2)
THEN 418 CALL grib_get(igrib,
'latitudeOfFirstGridPointInDegrees',
xrila1)
419 CALL grib_get(igrib,
'longitudeOfFirstGridPointInDegrees',
xrilo2 420 CALL grib_get(igrib,
'latitudeOfLastGridPointInDegrees',
xrila2)
421 CALL grib_get(igrib,
'longitudeOfLastGridPointInDegrees',
xrilo1)
422 ELSEIF (iscan == 1)
THEN 423 CALL grib_get(igrib,
'latitudeOfFirstGridPointInDegrees',
xrila2)
424 CALL grib_get(igrib,
'longitudeOfFirstGridPointInDegrees',
xrilo2 425 CALL grib_get(igrib,
'latitudeOfLastGridPointInDegrees',
xrila1)
426 CALL grib_get(igrib,
'longitudeOfLastGridPointInDegrees',
xrilo1)
427 ELSEIF (jscan == 1)
THEN 428 CALL grib_get(igrib,
'latitudeOfFirstGridPointInDegrees',
xrila1)
429 CALL grib_get(igrib,
'longitudeOfFirstGridPointInDegrees',
xrilo1 430 CALL grib_get(igrib,
'latitudeOfLastGridPointInDegrees',
xrila2)
431 CALL grib_get(igrib,
'longitudeOfLastGridPointInDegrees',
xrilo2)
434 CALL grib_get(igrib,
'latitudeOfSouthernPoleInDegrees',
xrlap)
435 CALL grib_get(igrib,
'longitudeOfSouthernPoleInDegrees',
xrlop)
437 CALL grib_get(igrib,
'iDirectionIncrementInDegrees',
xrdx)
438 CALL grib_get(igrib,
'jDirectionIncrementInDegrees',
xrdy)
442 WRITE(kluout,*)
'XRDX,XRDY',
xrdx,
xrdy 459 ! 4.3 stretched lat,lon grid(arpege files)
463 CALL grib_get(igrib,
'latitudeOfFirstGridPointInDegrees',
xila1)
464 CALL grib_get(igrib,
'longitudeOfFirstGridPointInDegrees',
xilo1)
465 CALL grib_get(igrib,
'latitudeOfLastGridPointInDegrees',
xila2)
466 CALL grib_get(igrib,
'longitudeOfLastGridPointInDegrees',
xilo2)
468 CALL grib_get(igrib,
'stretchingFactor',
xcoef)
469 CALL grib_get(igrib,
'latitudeOfStretchingPoleInDegrees',
xlap)
470 CALL grib_get(igrib,
'longitudeOfStretchingPoleInDegrees',
xlop)
488 ! 4.4 mercator projection(aladin reunion files)
492 CALL grib_get(igrib,
'Dj',ileny)
493 CALL grib_get(igrib,
'Di',ilenx)
497 CALL grib_get(igrib,
'LaDInDegrees',
xlat0)
499 CALL grib_get(igrib,
'latitudeOfFirstGridPointInDegrees',
xlator)
500 CALL grib_get(igrib,
'longitudeOfFirstGridPointInDegrees',
xlonor)
517 IF (
nrank==
npio)
WRITE (kluout,
'(A)')
'No such projection implemented in prep_grib_grid ' 518 CALL abor1_sfx(
'PREP_GRIB_GRID: UNKNOWN PROJECTION')
525 WRITE (kluout,
'(A)')
' | Reading date' 528 CALL grib_get(igrib,
'year',iyear,iret)
529 CALL grib_get(igrib,
'month',imonth,iret)
530 CALL grib_get(igrib,
'day',iday,iret)
531 CALL grib_get(igrib,
'time',itime,iret)
532 ztime=int(itime/100)*3600+(itime-int(itime/100)*100)*60
534 CALL grib_get(igrib,
'P1',ip1,iret)
536 CALL grib_get(igrib,
'unitOfTimeRange',iunittime,iret)
537 SELECT CASE (iunittime)
539 ztime = ztime + ip1*3600.
541 ztime = ztime + ip1*60.
548 CALL mpi_bcast(iyear,kind(iyear)/4,mpi_integer,
npio,
ncomm,infompi)
549 CALL mpi_bcast(imonth,kind(imonth)/4,mpi_integer,
npio,
ncomm,infompi)
550 CALL mpi_bcast(iday,kind(iday)/4,mpi_integer,
npio,
ncomm,infompi)
551 CALL mpi_bcast(ztime,kind(ztime)/4,mpi_real,
npio,
ncomm,infompi)
555 tptime_grib%TDATE%YEAR = iyear
556 tptime_grib%TDATE%MONTH = imonth
557 tptime_grib%TDATE%DAY = iday
558 tptime_grib%TIME = ztime
563 CALL grib_release(igrib,iret)
565 CALL abor1_sfx(
'PREP_GRIB_GRID: Error in releasing the grib message memory' 569 IF (
lhook)
CALL dr_hook(
'PREP_GRIB_GRID_1',1,zhook_handle)
570 IF (
lhook)
CALL dr_hook(
'PREP_GRIB_GRID_2',0,zhook_handle)
576 IF (hgridtype==
'GAUSS ')
THEN 577 IF (
ALLOCATED(
xlat))
DEALLOCATE(
xlat)
578 IF (
ALLOCATED(
xlon))
DEALLOCATE(
xlon)
588 ELSEIF (hgridtype==
'AROME ')
THEN 589 IF (
ALLOCATED(
xzx))
DEALLOCATE(
xzx)
590 IF (
ALLOCATED(
xzy))
DEALLOCATE(
xzy)
591 IF (
ALLOCATED(
nix))
DEALLOCATE(
nix)
597 ELSEIF (hgridtype==
'ROTLATLON ')
THEN 600 IF (
ALLOCATED(
no))
DEALLOCATE(
no)
601 IF (
ALLOCATED(
xla))
DEALLOCATE(
xla)
602 IF (
ALLOCATED(
xola))
DEALLOCATE(
xola)
603 IF (
ALLOCATED(
xolo))
DEALLOCATE(
xolo)
612 IF (hgridtype==
'GAUSS ')
THEN 618 ELSEIF (hgridtype==
'AROME ')
THEN 626 IF (
ALLOCATED(
np))
DEALLOCATE(
np)
629 ALLOCATE(
xloph(ino,12))
631 IF (
lglobs) iinla = iinla + 2
632 IF (
lglobn) iinla = iinla + 2
634 IF (hgridtype==
'GAUSS '.OR.hgridtype==
'AROME ')
THEN 641 hinterp_type =
"HORIBL" 643 IF (
lhook)
CALL dr_hook(
'PREP_GRIB_GRID_2',1,zhook_handle)
subroutine horibl_surf_coef(KOLEN, OINTERP, OGLOBLON, PILO1, PILO2, POLO, KO, KINLO, KP, PLOP)
integer, dimension(:), allocatable ninloh
character(len=28) cgrib_file
subroutine prep_grib_grid(HGRIB, KLUOUT, HINMODEL, HGRIDTYPE, HINTERP_
real, dimension(:), allocatable xlat
real, dimension(:), allocatable xzy
real, dimension(:), allocatable xola
integer, dimension(:,:), allocatable np
real, dimension(:), allocatable xlon_out
subroutine xy_conf_proj(PLAT0, PLON0, PRPK, PBETA, PLATOR, PLONOR, PX, PY, PLAT, PLON)
integer, dimension(:,:), allocatable no
subroutine abor1_sfx(YTEXT)
logical, dimension(:), allocatable linterp
real, dimension(:), allocatable xzx
real, dimension(:), allocatable xlon
integer, dimension(:), allocatable ninlo
real, dimension(:), allocatable xlat_out
integer, parameter nundef
integer, dimension(:), allocatable nix
real, dimension(:), allocatable xolo
subroutine horibl_surf_init(PILA1, PILO1, PILA2, PILO2, KINLA, KINLO, KOLEN, PXOUT, PYOUT, OINTERP, OGLOBLON, OGLOBN, OGLOBS, KO, KINLO_OUT, POLA, POLO, PILO1_OUT, PILO2_OUT, PLA, PILATARRAY)
subroutine arpege_stretch_a(KN, PLAP, PLOP, PCOEF, PLAR, PLOR, PLAC, PLOC)
real, dimension(:,:), allocatable xla
real, dimension(:,:), allocatable xloph