13 USE yomhook
,ONLY : lhook, dr_hook
14 USE parkind1
,ONLY : jprb
26 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
28 INTEGER(KIND=kindOfInt) :: iret
29 REAL(KIND=JPRB) :: zhook_handle
31 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:MAKE_GRIB_INDEX',0,zhook_handle)
33 IF (cgrib_file==hgrib) CALL dr_hook(
'MODE_READ_GRIB:MAKE_GRIB_INDEX',1,zhook_handle)
34 IF (cgrib_file==hgrib)
RETURN
38 CALL grib_index_create(nidx,hgrib,
'indicatorOfParameter',iret)
39 IF (iret/=0) CALL
abor1_sfx(
"MODE_READ_GRIB:MAKE_GRIB_INDEX: error while creating the grib index")
41 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:MAKE_GRIB_INDEX',1,zhook_handle)
53 INTEGER(KIND=kindOfInt) :: iret
55 REAL(KIND=JPRB) :: zhook_handle
57 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:CLEAR_GRIB_INDEX',0,zhook_handle)
59 IF (cgrib_file.NE.
"")
THEN
61 CALL grib_index_release(nidx,iret)
62 IF (iret/=0) CALL
abor1_sfx(
"MODE_READ_GRIB:MAKE_GRIB_INDEX: error while deleting the grib index")
65 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:CLEAR_GRIB_INDEX',1,zhook_handle)
77 INTEGER,
INTENT(IN) :: kluout
78 INTEGER,
INTENT(INOUT) :: kltype
79 INTEGER,
INTENT(INOUT) :: klev1
80 INTEGER,
INTENT(INOUT) :: klev2
81 INTEGER(KIND=kindOfInt),
INTENT(INOUT) :: kgrib
82 INTEGER,
INTENT(OUT) :: kfound
87 INTEGER(KIND=kindOfInt) :: iret
89 REAL(KIND=JPRB) :: zhook_handle
91 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:GET_GRIB_MESSAGE',0,zhook_handle)
96 DO WHILE (iret /= grib_end_of_index .AND. kfound/=3)
102 CALL grib_get(kgrib,
'indicatorOfTypeOfLevel',iltype,iret)
103 CALL
test_iret(kluout,iltype,kltype,iret)
111 CALL grib_get(kgrib,
'topLevel',ilev1,iret)
120 CALL grib_get(kgrib,
'bottomLevel',ilev2,iret)
124 IF (iret.EQ.0) kfound = kfound + 1
130 IF (kfound.NE.3)
THEN
131 CALL grib_release(kgrib)
132 CALL grib_new_from_index(nidx,kgrib,iret)
137 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:GET_GRIB_MESSAGE',1,zhook_handle)
147 INTEGER,
INTENT(IN) :: kluout
148 INTEGER,
INTENT(IN) :: val1
149 INTEGER,
INTENT(INOUT) :: val0
150 INTEGER(KIND=kindOfInt),
INTENT(INOUT) :: kret
152 REAL(KIND=JPRB) :: zhook_handle
154 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:TEST_IRET',0,zhook_handle)
157 WRITE (kluout,
'(A)')
' | Error encountered in the Grib file, skipping field'
158 ELSE IF (kret == -6)
THEN
159 WRITE (kluout,
'(A)')
' | ECMWF pseudo-Grib data encountered, skipping field'
160 ELSEIF (val1 /= val0)
THEN
168 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:TEST_IRET',1,zhook_handle)
174 SUBROUTINE read_grib(HGRIB,KLUOUT,KPARAM,KRET,PFIELD,KLTYPE,KLEV1,KLEV2,KPARAM2)
181 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
182 INTEGER,
INTENT(IN) :: kluout
183 INTEGER,
INTENT(IN) :: kparam
184 INTEGER(KIND=kindOfInt),
INTENT(OUT) :: kret
185 REAL,
DIMENSION(:),
POINTER :: pfield
186 INTEGER,
INTENT(INOUT),
OPTIONAL :: kltype
187 INTEGER,
INTENT(INOUT),
OPTIONAL :: klev1
188 INTEGER,
INTENT(INOUT),
OPTIONAL :: klev2
189 INTEGER,
INTENT(INOUT),
OPTIONAL :: kparam2
191 INTEGER :: iltype, ilev1, ilev2
192 INTEGER(KIND=kindOfInt) :: igrib
193 INTEGER :: isize, ifound
194 REAL(KIND=JPRB) :: zhook_handle
196 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB',0,zhook_handle)
199 IF (present(kltype)) iltype=kltype
201 IF (present(klev1)) ilev1=klev1
203 IF (present(klev2)) ilev2=klev2
210 CALL grib_index_select(nidx,
'indicatorOfParameter',kparam,kret)
211 CALL grib_new_from_index(nidx,igrib,kret)
212 IF (kret.EQ.0) CALL
get_grib_message(kluout,iltype,ilev1,ilev2,igrib,ifound)
214 IF (present(kparam2))
THEN
216 CALL grib_index_select(nidx,
'indicatorOfParameter',kparam2,kret)
217 CALL grib_new_from_index(nidx,igrib,kret)
220 IF (present(kltype)) iltype=kltype
230 IF (present(kltype)) kltype = iltype
231 IF (present(klev1)) klev1 = ilev1
232 IF (present(klev2)) klev2 = ilev2
234 IF (.NOT.
ASSOCIATED(pfield))
THEN
235 CALL grib_get_size(igrib,
'values',isize,kret)
236 IF (kret.NE.0) CALL
abor1_sfx(
"MODE_READ_GRIB:READ_GRIB: Problem getting size of values")
237 ALLOCATE(pfield(isize))
240 CALL grib_get(igrib,
'values',pfield,kret)
241 IF (kret.NE.0) CALL
abor1_sfx(
"MODE_READ_GRIB:READ_GRIB: Problem getting values")
242 CALL grib_release(igrib,kret)
243 IF (kret.NE.0) CALL
abor1_sfx(
"MODE_READ_GRIB:READ_GRIB: Problem releasing memory")
251 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB',1,zhook_handle)
262 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
263 INTEGER,
INTENT(IN) :: kluout
264 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
265 REAL,
DIMENSION(:),
POINTER :: pmask
267 INTEGER(KIND=kindOfInt) :: iret
270 REAL(KIND=JPRB) :: zhook_handle
272 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_LAND_MASK',0,zhook_handle)
273 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_LAND_MASK: | Reading land mask from ',hinmodel
275 SELECT CASE (hinmodel)
277 CALL
read_grib(hgrib,kluout,172,iret,pmask)
278 CASE (
'ARPEGE',
'ALADIN',
'MOCAGE')
279 CALL
read_grib(hgrib,kluout,81,iret,pmask)
283 CALL
read_grib(hgrib,kluout,81,iret,pmask,kltype=iltype,klev1=ilev)
285 CALL
abor1_sfx(
'MODE_READ_GRIB:READ_GRIB_LAND_MASK: OPTION NOT SUPPORTED '//hinmodel)
289 CALL
abor1_sfx(
'MODE_READ_GRIB: LAND SEA MASK MISSING (READ_GRIB_LAND_MASK)')
298 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_LAND_MASK',1,zhook_handle)
309 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
310 INTEGER,
INTENT(IN) :: kluout
311 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
312 REAL,
DIMENSION(:),
POINTER :: pzs
314 INTEGER(KIND=kindOfInt) :: iret
315 REAL(KIND=JPRB) :: zhook_handle
318 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_ZS',0,zhook_handle)
319 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_ZS: | Reading orography from ',hinmodel
321 SELECT CASE (hinmodel)
323 CALL
read_grib(hgrib,kluout,129,iret,pzs)
324 CASE (
'ARPEGE',
'MOCAGE')
326 CASE (
'HIRLAM',
'ALADIN')
329 CALL
abor1_sfx(
'MODE_READ_GRIB:READ_GRIB_ZS:OPTION NOT SUPPORTED '//hinmodel)
333 CALL
abor1_sfx(
'MODE_READ_GRIB: OROGRAPHY MISSING (READ_GRIB_ZS_LAND)')
339 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_ZS',1,zhook_handle)
348 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
349 INTEGER,
INTENT(IN) :: kluout
350 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
351 REAL,
DIMENSION(:),
INTENT(IN) :: pmask
352 REAL,
DIMENSION(:),
POINTER :: pzsl
354 REAL(KIND=JPRB) :: zhook_handle
356 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_ZS_LAND',0,zhook_handle)
360 IF (
SIZE(pmask)==
SIZE(pzsl)) &
361 WHERE (pmask(:)/=1.) pzsl = 0.
363 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_ZS_LAND',1,zhook_handle)
372 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
373 INTEGER,
INTENT(IN) :: kluout
374 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
375 REAL,
DIMENSION(:),
INTENT(IN) :: pmask
376 REAL,
DIMENSION(:),
POINTER :: pzss
378 REAL(KIND=JPRB) :: zhook_handle
380 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_ZS_SEA',0,zhook_handle)
382 IF (hinmodel==
'HIRLAM')
THEN
383 CALL
abor1_sfx(
'MODE_READ_GRIB:READ_GRIB_ZS_SEA:OPTION NOT SUPPORTED '//hinmodel)
388 IF (
SIZE(pmask)==
SIZE(pzss)) &
389 WHERE (pmask(:)/=0.) pzss = 0.
391 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_ZS_SEA',1,zhook_handle)
400 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
401 INTEGER,
INTENT(IN) :: kluout
402 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
403 REAL,
DIMENSION(:),
POINTER :: pt
405 INTEGER(KIND=kindOfInt) :: iret
408 REAL(KIND=JPRB) :: zhook_handle
411 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_T',0,zhook_handle)
412 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_T: | Reading surface temperature'
414 SELECT CASE (hinmodel)
418 CASE (
'ARPEGE',
'ALADIN',
'MOCAGE')
421 CALL
read_grib(hgrib,kluout,11,iret,pt,kltype=iltype,klev1=ilev)
424 CALL
read_grib(hgrib,kluout,11,iret,pt,kltype=iltype)
427 CALL
read_grib(hgrib,kluout,11,iret,pt,kltype=iltype,klev1=ilev)
432 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_T: | Reading surface temperature tile 4'
435 CALL
read_grib(hgrib,kluout,11,iret,pt,kltype=iltype,klev1=ilev)
438 CALL
abor1_sfx(
'MODE_READ_GRIB:READ_GRIB_T:OPTION NOT SUPPORTED '//hinmodel)
442 CALL
abor1_sfx(
'MODE_READ_GRIB: SURFACE TEMPERATURE MISSING (READ_GRIB_T)')
445 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_T',1,zhook_handle)
456 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
457 INTEGER,
INTENT(IN) :: kluout
458 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
459 REAL,
DIMENSION(:),
INTENT(IN) :: pmask
460 REAL,
DIMENSION(:),
POINTER :: pts
462 REAL(KIND=JPRB) :: zhook_handle
464 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_TS',0,zhook_handle)
468 IF (
SIZE(pmask)==
SIZE(pts)) &
469 WHERE (pmask(:)/=1.) pts = xundef
471 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_TS',1,zhook_handle)
482 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
483 INTEGER,
INTENT(IN) :: kluout
484 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
485 REAL,
DIMENSION(:),
INTENT(IN) :: pmask
486 REAL,
DIMENSION(:),
POINTER :: psst
488 REAL(KIND=JPRB) :: zhook_handle
490 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_SST',0,zhook_handle)
492 IF (hinmodel==
'HIRLAM')
THEN
493 CALL
abor1_sfx(
'MODE_READ_GRIB:READ_GRIB_SST:OPTION NOT SUPPORTED '//hinmodel)
498 IF (
SIZE(pmask)==
SIZE(psst)) &
499 WHERE (pmask(:)/=0.) psst = xundef
501 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_SST',1,zhook_handle)
512 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
513 INTEGER,
INTENT(IN) :: kluout
514 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
515 REAL,
DIMENSION(:),
INTENT(IN) :: pmask
516 REAL,
DIMENSION(:),
POINTER :: pt2
518 INTEGER(KIND=kindOfInt) :: iret
520 REAL(KIND=JPRB) :: zhook_handle
523 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_T2',0,zhook_handle)
524 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_T2: | Reading deep soil temperature'
526 SELECT CASE (hinmodel)
528 CALL
read_grib(hgrib,kluout,170,iret,pt2)
529 CASE (
'ARPEGE',
'ALADIN',
'MOCAGE')
531 CALL
read_grib(hgrib,kluout,11,iret,pt2,kltype=iltype)
534 CALL
read_grib(hgrib,kluout,11,iret,pt2,kltype=iltype)
537 CALL
abor1_sfx(
'MODE_READ_GRIB:READ_GRIB_T2:OPTION NOT SUPPORTED '//hinmodel)
541 CALL
abor1_sfx(
'MODE_READ_GRIB: DEEP SOIL TEMPERATURE MISSING (READ_GRIB_T2)')
544 IF (
SIZE(pmask)==
SIZE(pt2)) &
545 WHERE (pmask(:)/=1.) pt2 = xundef
547 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_T2',1,zhook_handle)
551 SUBROUTINE put_layer_depth(KLUOUT,KLEV,HROUT,KLTYPE,KLEV1,KLEV2,KNLAYERDEEP,PV4,PV,PD)
555 INTEGER,
INTENT(IN) :: kluout
556 INTEGER,
INTENT(IN) :: klev
557 CHARACTER(LEN=*),
INTENT(IN) :: hrout
558 INTEGER,
INTENT(INOUT) :: kltype
559 INTEGER,
INTENT(IN) :: klev1
560 INTEGER,
INTENT(IN) :: klev2
561 INTEGER,
INTENT(IN) :: knlayerdeep
562 REAL,
INTENT(IN) :: pv4
563 REAL,
INTENT(IN) :: pv
564 REAL,
INTENT(OUT) :: pd
565 REAL(KIND=JPRB) :: zhook_handle
567 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:PUT_LAYER_DEPTH',0,zhook_handle)
569 IF (klev2 == -1) kltype = 0
570 IF (kltype==112)
THEN
571 pd = (klev2 - klev1) / 100.
573 IF (knlayerdeep == 4)
THEN
578 WRITE (kluout,
'(A,i1,A,f5.2,A)')
'MODE_READ_GRIB:'//trim(hrout)//
': | Level ',&
579 klev,
' height not available, assuming ',pd,
' m'
582 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:PUT_LAYER_DEPTH',1,zhook_handle)
586 SUBROUTINE fill_pfield(KLUOUT,HROUT,KNLAYERDEEP,PDIN,PFIELDIN,PMASK,PFIELDOUT,PDOUT)
593 INTEGER,
INTENT(IN) :: kluout
594 CHARACTER(LEN=*),
INTENT(IN) :: hrout
595 INTEGER,
INTENT(IN) :: knlayerdeep
596 REAL,
DIMENSION(:),
INTENT(IN) :: pdin
597 REAL,
DIMENSION(:,:),
INTENT(IN) :: pfieldin
598 REAL,
DIMENSION(:),
INTENT(IN) :: pmask
599 REAL,
DIMENSION(:,:),
POINTER :: pfieldout
600 REAL,
DIMENSION(:,:),
POINTER :: pdout
602 CHARACTER(LEN=20) :: fmt0
604 REAL(KIND=JPRB) :: zhook_handle
606 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:FILL_PFIELD',0,zhook_handle)
610 WRITE(fmt0,fmt=
'(A8,I1,A11)')
'(A,I1,A,',knlayerdeep,
'(F5.2,","))'
611 WRITE (kluout,fmt=fmt0)
'MODE_READ_GRIB:'//trim(hrout)//
': | ',knlayerdeep,&
612 ' deep layers, heights are : ',pdin(1:knlayerdeep)
616 ALLOCATE(pfieldout(
SIZE(pfieldin,1),knlayerdeep))
617 ALLOCATE(pdout(
SIZE(pfieldin,1),knlayerdeep))
620 pdout(:,jl)=sum(pdin(1:jl))
621 pfieldout(:,jl)=pfieldin(:,jl)
622 IF (
SIZE(pmask)==
SIZE(pfieldout,1)) &
623 WHERE (pmask(:)/=1.) pfieldout(:,jl) = xundef
626 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:FILL_PFIELD',1,zhook_handle)
637 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
638 INTEGER,
INTENT(IN) :: kluout
639 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
640 REAL,
DIMENSION(:),
INTENT(IN) :: pmask
641 REAL,
DIMENSION(:,:),
POINTER :: ptg
642 REAL,
DIMENSION(:,:),
POINTER :: pd
646 INTEGER(KIND=kindOfInt) :: iret
651 INTEGER :: inlayerdeep
652 REAL,
DIMENSION(:),
POINTER :: zfield => null()
653 REAL,
DIMENSION(:,:),
ALLOCATABLE:: ztg
654 REAL,
DIMENSION(:) ,
ALLOCATABLE:: zd
655 REAL(KIND=JPRB) :: zhook_handle
657 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_TG_ECMWF',0,zhook_handle)
658 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_TG_ECMWF: | Reading soil temperature'
667 CALL
read_grib(hgrib,kluout,139,iret,zfield,kltype=iltype,klev1=ilev1,klev2=ilev2)
670 CALL
put_layer_depth(kluout,1,
'READ_GRIB_TG_ECMWF',iltype,ilev1,ilev2,4,0.07,0.07,zd(1))
671 ALLOCATE(ztg(
SIZE(zfield),5))
674 CALL
abor1_sfx(
'MODE_READ_GRIB: SOIL TEMPERATURE LEVEL 1 MISSING (READ_GRIB_TG_ECMWF)')
682 CALL
read_grib(hgrib,kluout,236,iret,zfield,kltype=iltype,klev1=ilev1,klev2=ilev2)
686 CALL
put_layer_depth(kluout,4,
'READ_GRIB_TG_ECMWF',iltype,ilev1,ilev2,inlayerdeep,1.89,1.89,zd(4))
698 CALL
read_grib(hgrib,kluout,183,iret,zfield,kltype=iltype,klev1=ilev1,klev2=ilev2)
701 CALL
put_layer_depth(kluout,3,
'READ_GRIB_TG_ECMWF',iltype,ilev1,ilev2,inlayerdeep,0.72,0.42,zd(3))
713 CALL
read_grib(hgrib,kluout,170,iret,zfield,kltype=iltype,klev1=ilev1,klev2=ilev2)
716 CALL
put_layer_depth(kluout,2,
'READ_GRIB_TG_ECMWF',iltype,ilev1,ilev2,inlayerdeep,0.21,0.42,zd(2))
720 CALL
abor1_sfx(
'MODE_READ_GRIB: SOIL TEMPERATURE LEVEL 2 MISSING (READ_GRIB_TG_ECMWF)')
726 IF(sum(zd(1:inlayerdeep)) < 3.)
THEN
728 inlayerdeep=inlayerdeep+1
729 zd(inlayerdeep)=3.-sum(zd(1:inlayerdeep-1))
730 ztg(:,inlayerdeep)=ztg(:,inlayerdeep-1)
736 CALL
fill_pfield(kluout,
'READ_GRIB_TG_ECMWF',inlayerdeep,zd,ztg,pmask,ptg,pd)
740 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_TG_ECMWF',1,zhook_handle)
774 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
775 INTEGER,
INTENT(IN) :: kluout
776 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
777 REAL,
DIMENSION(:),
INTENT(IN) :: pmask
778 REAL,
DIMENSION(:,:),
POINTER :: pwg
779 REAL,
DIMENSION(:,:),
POINTER :: pd
783 INTEGER(KIND=kindOfInt) :: iret
788 INTEGER :: inlayerdeep
789 REAL,
DIMENSION(:),
POINTER :: zfield => null()
790 REAL,
DIMENSION(:,:),
ALLOCATABLE:: zwg
791 REAL,
DIMENSION(:) ,
ALLOCATABLE:: zd
792 REAL(KIND=JPRB) :: zhook_handle
794 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_WG_ECMWF_1',0,zhook_handle)
795 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_WG_ECMWF_1: | Reading soil moisture'
805 CALL
read_grib(hgrib,kluout,140,iret,zfield,kltype=iltype,klev1=ilev1,klev2=ilev2,kparam2=ipar)
808 CALL
put_layer_depth(kluout,1,
'READ_GRIB_WG_ECMWF_1',iltype,ilev1,ilev2,4,0.07,0.07,zd(1))
809 ALLOCATE(zwg(
SIZE(zfield,1),4))
812 IF (ipar==140) zwg(:,1)=zwg(:,1) / zd(1)
814 CALL
abor1_sfx(
'MODE_READ_GRIB: SOIL MOISTURE LEVEL 1 MISSING (READ_GRIB_WG_ECMWF_1)')
823 CALL
read_grib(hgrib,kluout,237,iret,zfield,kltype=iltype,klev1=ilev1,klev2=ilev2,kparam2=ipar)
827 CALL
put_layer_depth(kluout,4,
'READ_GRIB_WG_ECMWF_1',iltype,ilev1,ilev2,inlayerdeep,1.89,1.89,zd(4))
830 IF (ipar==237) zwg(:,4)=zwg(:,4) / zd(1)
842 CALL
read_grib(hgrib,kluout,184,iret,zfield,kltype=iltype,klev1=ilev1,klev2=ilev2,kparam2=ipar)
845 CALL
put_layer_depth(kluout,3,
'READ_GRIB_WG_ECMWF_1',iltype,ilev1,ilev2,inlayerdeep,0.72,0.42,zd(3))
848 IF (ipar==184) zwg(:,3)=zwg(:,3) / zd(1)
860 CALL
read_grib(hgrib,kluout,171,iret,zfield,kltype=iltype,klev1=ilev1,klev2=ilev2,kparam2=ipar)
863 CALL
put_layer_depth(kluout,2,
'READ_GRIB_WG_ECMWF_1',iltype,ilev1,ilev2,inlayerdeep,0.21,0.42,zd(2))
867 IF (ipar==171) zwg(:,2)=zwg(:,2) / zd(1)
869 CALL
abor1_sfx(
'MODE_READ_GRIB: SOIL MOISTURE LEVEL 2 MISSING (READ_GRIB_WG_ECMWF_1)')
874 CALL
fill_pfield(kluout,
'READ_GRIB_WG_ECMWF_1',inlayerdeep,zd,zwg,pmask,pwg,pd)
878 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_WG_ECMWF_1',1,zhook_handle)
896 REAL,
DIMENSION(:,:),
INTENT(IN) :: ptg
897 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: pwg
899 REAL,
DIMENSION(:,:),
INTENT(OUT) :: pwgi
904 REAL(KIND=JPRB) :: zhook_handle
906 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:ECMWF_WGI',0,zhook_handle)
911 WHERE(ptg(:,:) > zt1)
913 ELSEWHERE(ptg(:,:) < zt2)
917 pwgi(:,:)=pwg(:,:) * 0.5* (1 - sin(xpi * (ptg(:,:) - 0.5*zt1 - 0.5*zt2) / &
919 pwg(:,:) = pwg(:,:) - pwgi(:,:)
922 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:ECMWF_WGI',1,zhook_handle)
940 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
941 INTEGER,
INTENT(IN) :: kluout
942 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
943 REAL,
DIMENSION(:),
INTENT(IN) :: pmask
944 REAL,
DIMENSION(:,:),
OPTIONAL,
POINTER :: pwg
946 REAL,
DIMENSION(:,:),
OPTIONAL,
POINTER :: pd
947 REAL,
DIMENSION(:,:),
OPTIONAL,
POINTER :: pwgi
950 REAL,
DIMENSION(:,:),
POINTER :: zwg => null()
951 REAL,
DIMENSION(:,:),
POINTER :: zd => null()
952 REAL,
DIMENSION(:,:),
POINTER :: ztg => null()
953 REAL,
DIMENSION(:,:),
POINTER :: zdt => null()
954 REAL,
DIMENSION(:,:),
ALLOCATABLE:: zwgi
956 REAL(KIND=JPRB) :: zhook_handle
958 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:HARMONIZE_GRIB_WG_WGI_ECMWF',0,zhook_handle)
963 IF (
SIZE(ztg,2) .LT.
SIZE(zwg,2))
THEN
964 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:HARMONIZE_GRIB_WG_WGI_ECMWF: '
965 WRITE (kluout,
'(A)')
'ERROR, YOU HAVE NOT THE SAME NUMBER OF LEVELS '
966 WRITE (kluout,
'(A)')
'IN SOIL FOR TEMPERATURE AND HUMIDITY '
967 WRITE (kluout,
'(A)')
'VERIFY GRIB FILE '
968 CALL
abor1_sfx(
"MODE_READ_GRIB:HARMONIZE_GRIB_WG_WGI_ECMWF: VERIFY NUMBER OF LEVELS IN GRIB FILE")
971 IF (present(pd))
THEN
972 ALLOCATE(pd(
SIZE(zd,1),
SIZE(zd,2)))
975 IF (present(pwgi))
THEN
976 ALLOCATE(pwgi(
SIZE(zwg,1),
SIZE(zwg,2)))
982 IF(all(zdt(:,1:
SIZE(zwg,2))==zd(:,1:
SIZE(zwg,2))))
THEN
983 ALLOCATE(zwgi(
SIZE(zwg,1),
SIZE(zwg,2)))
984 CALL
ecmwf_wgi(ztg(:,1:
SIZE(zwg,2)),zwg,zwgi)
985 IF (present(pwgi)) pwgi(:,:)=zwgi(:,:)
989 IF (present(pwg))
THEN
990 ALLOCATE(pwg(
SIZE(zwg,1),
SIZE(zwg,2)))
999 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:HARMONIZE_GRIB_WG_WGI_ECMWF',1,zhook_handle)
1013 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
1014 INTEGER,
INTENT(IN) :: kluout
1015 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
1016 REAL,
DIMENSION(:),
INTENT(IN) :: pmask
1017 REAL,
DIMENSION(:,:),
POINTER :: pfield
1018 REAL,
DIMENSION(:,:),
POINTER :: pd
1021 INTEGER(KIND=kindOfInt) :: iret
1022 REAL,
DIMENSION(:),
POINTER :: zslt => null()
1023 REAL,
DIMENSION(:),
ALLOCATABLE:: zwwilt
1024 REAL,
DIMENSION(:),
ALLOCATABLE:: zwfc
1026 REAL(KIND=JPRB) :: zhook_handle
1028 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_WG_ECMWF',0,zhook_handle)
1034 CALL
read_grib(hgrib,kluout,43,iret,zslt)
1036 ALLOCATE (zwfc(
SIZE(pfield,1)))
1037 ALLOCATE (zwwilt(
SIZE(pfield,1)))
1048 ELSEWHERE (zslt(:)==2.)
1051 ELSEWHERE (zslt(:)==3.)
1054 ELSEWHERE (zslt(:)==4.)
1057 ELSEWHERE (zslt(:)==5.)
1060 ELSEWHERE (zslt(:)==6.)
1070 IF (
SIZE(pfield,2)==4)
THEN
1080 DO jl=1,
SIZE(pfield,2)
1081 WHERE ( pfield(:,jl).NE.xundef .AND. zwfc(:).NE.0. )
1082 pfield(:,jl) = (pfield(:,jl) - zwwilt(:)) / (zwfc(:) - zwwilt(:))
1088 IF (
ASSOCIATED(zslt))
DEALLOCATE(zslt)
1092 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_WG_ECMWF',1,zhook_handle)
1106 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
1107 INTEGER,
INTENT(IN) :: kluout
1108 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
1109 REAL,
DIMENSION(:),
INTENT(IN) :: pmask
1110 REAL,
DIMENSION(:,:),
POINTER :: pfield
1111 REAL,
DIMENSION(:,:),
POINTER :: pd
1114 INTEGER(KIND=kindOfInt) :: iret
1115 REAL,
DIMENSION(:),
POINTER :: zslt => null()
1116 REAL,
DIMENSION(:) ,
ALLOCATABLE:: zwsat
1118 REAL(KIND=JPRB) :: zhook_handle
1120 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_WGI_ECMWF',0,zhook_handle)
1126 CALL
read_grib(hgrib,kluout,43,iret,zslt)
1128 ALLOCATE (zwsat(
SIZE(pfield,1)))
1137 ELSEWHERE (zslt(:)==2.)
1139 ELSEWHERE (zslt(:)==3.)
1141 ELSEWHERE (zslt(:)==4.)
1143 ELSEWHERE (zslt(:)==5.)
1145 ELSEWHERE (zslt(:)==6.)
1154 IF (
SIZE(pfield,2)==4)
THEN
1163 DO jl=1,
SIZE(pfield,2)
1164 WHERE ( pfield(:,jl).NE.xundef .AND. zwsat(:).NE.0. )
1165 pfield(:,jl) = pfield(:,jl) / zwsat(:)
1171 IF (
ASSOCIATED(zslt))
DEALLOCATE(zslt)
1174 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_WGI_ECMWF',1,zhook_handle)
1188 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
1189 INTEGER,
INTENT(IN) :: kluout
1190 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
1191 REAL,
DIMENSION(:),
INTENT(IN) :: pmask
1192 REAL,
DIMENSION(:,:),
POINTER :: ptg
1193 REAL,
DIMENSION(:,:),
POINTER :: pdt
1196 REAL,
DIMENSION(:),
POINTER :: zfield => null()
1198 REAL(KIND=JPRB) :: zhook_handle
1200 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_TG_METEO_FRANCE',0,zhook_handle)
1201 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_TG_METEO_FRANCE: | Reading soil temperature'
1210 ALLOCATE(ptg(
SIZE(zfield),3))
1211 ALLOCATE(pdt(
SIZE(zfield),3))
1213 ptg(:,1) = zfield(:)
1220 ptg(:,2) = zfield(:)
1229 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_TG_METEO_FRANCE',1,zhook_handle)
1240 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
1241 INTEGER,
INTENT(IN) :: kluout
1242 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
1243 REAL,
DIMENSION(:),
POINTER :: psand
1244 REAL,
DIMENSION(:),
POINTER :: pclay
1245 LOGICAL,
INTENT(OUT) :: gisba
1248 INTEGER(KIND=kindOfInt) :: iret
1250 REAL(KIND=JPRB) :: zhook_handle
1254 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_SAND_CLAY_METEO_FRANCE',0,zhook_handle)
1256 IF (hinmodel ==
'ARPEGE' .OR. hinmodel ==
'MOCAGE') ipar=171
1257 IF (hinmodel ==
'ALADIN') ipar=128
1258 CALL
read_grib(hgrib,kluout,ipar,iret,pclay)
1265 pclay(:) = pclay(:) / 100.
1266 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_SAND_CLAY_METEO_FRANCE: | The soil model is ISBA'
1271 IF (hinmodel ==
'ARPEGE' .OR. hinmodel ==
'MOCAGE') ipar=172
1272 IF (hinmodel ==
'ALADIN') ipar=129
1273 CALL
read_grib(hgrib,kluout,ipar,iret,psand)
1278 CALL
abor1_sfx(
'MODE_READ_GRIB: SAND FRACTION MISSING (READ_GRIB_SAND_CLAY_METEO_FRANCE)')
1280 psand(:) = psand(:) / 100.
1284 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_SAND_CLAY_METEO_FRANCE',1,zhook_handle)
1298 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
1299 INTEGER,
INTENT(IN) :: kluout
1300 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
1301 REAL,
DIMENSION(:),
INTENT(IN) :: pmask
1302 REAL,
DIMENSION(:,:),
POINTER :: pfield
1303 REAL,
DIMENSION(:,:),
POINTER :: pd
1308 INTEGER(KIND=kindOfInt) :: iret
1312 REAL,
DIMENSION(:),
POINTER :: zclay => null()
1313 REAL,
DIMENSION(:),
POINTER :: zsand => null()
1314 REAL,
DIMENSION(:),
POINTER :: zfield => null()
1315 REAL,
DIMENSION(:),
ALLOCATABLE:: zwwilt
1316 REAL,
DIMENSION(:),
ALLOCATABLE:: zwfc
1317 REAL,
DIMENSION(:),
ALLOCATABLE:: zwsat
1319 REAL(KIND=JPRB) :: zhook_handle
1321 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_WG_METEO_FRANCE',0,zhook_handle)
1328 ALLOCATE(pfield(
SIZE(zsand),3))
1329 ALLOCATE(pd(
SIZE(zsand),3))
1331 ALLOCATE(pfield(nni,3))
1341 IF (hinmodel ==
'ARPEGE' .OR. hinmodel==
'MOCAGE')
THEN
1344 CALL
read_grib(hgrib,kluout,153,iret,zfield,klev1=ilev1,klev2=ilev2)
1348 CALL
read_grib(hgrib,kluout,86,iret,zfield,klev1=ilev1,klev2=ilev2)
1351 CALL
abor1_sfx(
'MODE_READ_GRIB: SOIL MOISTURE LEVEL 1 MISSING (READ_GRIB_WG_METEO_FRANCE)')
1354 pfield(:,1) = zfield(:)
1358 IF (hinmodel ==
'ARPEGE' .OR. hinmodel==
'MOCAGE')
THEN
1362 CALL
read_grib(hgrib,kluout,153,iret,zfield,klev1=ilev1,klev2=ilev2)
1367 CALL
read_grib(hgrib,kluout,86,iret,zfield,klev1=ilev1,klev2=ilev2)
1370 CALL
abor1_sfx(
'MODE_READ_GRIB: SOIL MOISTURE LEVEL 2 MISSING (READ_GRIB_WG_METEO_FRANCE)')
1373 pfield(:,2) = zfield(:)
1379 IF (hinmodel ==
'ARPEGE' .OR. hinmodel ==
'MOCAGE')
THEN
1380 CALL
read_grib(hgrib,kluout,173,iret,zfield)
1382 CALL
read_grib(hgrib,kluout,130,iret,zfield)
1385 CALL
abor1_sfx(
'MODE_READ_GRIB: SOIL MOISTURE LEVEL 2 DEPTH MISSING (READ_GRIB_WG_METEO_FRANCE)')
1399 pfield(:,1) = pfield(:,1) / 10.
1400 pfield(:,2) = pfield(:,2) /(1000. * pd(:,3))
1402 ALLOCATE (zwsat(
SIZE(zsand)))
1403 zwsat(:) = (-1.08*100. * zsand(:) + 494.305) * 0.001
1404 pfield(:,1) = max(min(pfield(:,1),zwsat(:)),0.)
1405 pfield(:,2) = max(min(pfield(:,2),zwsat(:)),0.)
1409 ALLOCATE (zwwilt(
SIZE(zclay)))
1410 ALLOCATE (zwfc(
SIZE(zclay)))
1411 zwwilt(:) = 37.1342e-3 * sqrt( 100. * zclay(:) )
1412 zwfc(:) = 89.0467e-3 * (100. * zclay(:) )**0.3496
1413 pfield(:,1) = (pfield(:,1) - zwwilt(:)) / (zwfc(:) - zwwilt(:))
1414 pfield(:,2) = (pfield(:,2) - zwwilt(:)) / (zwfc(:) - zwwilt(:))
1421 pfield(:,2) = (pfield(:,1)+pfield(:,2)) / (20. + 100.)
1422 pfield(:,1) = pfield(:,1) / 20.
1426 pfield(:,3) = pfield(:,2)
1430 IF (
SIZE(pmask)==
SIZE(pfield,1))
THEN
1431 DO jl=1,
SIZE(pfield,2)
1432 WHERE (pmask(:)/=1.) pfield(:,jl) = xundef
1436 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_WG_METEO_FRANCE',1,zhook_handle)
1450 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
1451 INTEGER,
INTENT(IN) :: kluout
1452 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
1453 REAL,
DIMENSION(:),
INTENT(IN) :: pmask
1454 REAL,
DIMENSION(:,:),
POINTER :: pfield
1455 REAL,
DIMENSION(:,:),
POINTER :: pd
1460 INTEGER(KIND=kindOfInt) :: iret
1464 REAL,
DIMENSION(:),
POINTER :: zclay => null()
1465 REAL,
DIMENSION(:),
POINTER :: zsand => null()
1466 REAL,
DIMENSION(:),
POINTER :: zfield => null()
1467 REAL,
DIMENSION(:),
ALLOCATABLE:: zwsat
1469 REAL(KIND=JPRB) :: zhook_handle
1471 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_WGI_METEO_FRANCE',0,zhook_handle)
1478 ALLOCATE(pfield(
SIZE(zsand),2))
1479 ALLOCATE(pd(
SIZE(zsand),2))
1481 ALLOCATE(pfield(nni,2))
1490 IF (hinmodel ==
'ARPEGE' .OR. hinmodel==
'MOCAGE')
THEN
1493 CALL
read_grib(hgrib,kluout,152,iret,zfield,kltype=iltype,klev1=ilev1,klev2=ilev2)
1497 CALL
read_grib(hgrib,kluout,139,iret,zfield,kltype=iltype,klev1=ilev1,klev2=ilev2)
1501 pfield(:,1) = zfield(:)
1502 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_WGI_METEO_FRANCE: -> Soil ice level 1 is present'
1509 IF (hinmodel ==
'ARPEGE' .OR. hinmodel==
'MOCAGE')
THEN
1513 CALL
read_grib(hgrib,kluout,152,iret,zfield,kltype=iltype,klev1=ilev1,klev2=ilev2)
1518 CALL
read_grib(hgrib,kluout,139,iret,zfield,kltype=iltype,klev1=ilev1,klev2=ilev2)
1522 pfield(:,2) = zfield(:)
1523 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_WGI_METEO_FRANCE: -> Soil ice level 2 is present'
1531 IF (hinmodel ==
'ARPEGE' .OR. hinmodel==
'MOCAGE')
THEN
1532 CALL
read_grib(hgrib,kluout,173,iret,zfield)
1534 CALL
read_grib(hgrib,kluout,130,iret,zfield)
1537 CALL
abor1_sfx(
'MODE_READ_GRIB: SOIL ICE LEVEL 2 MISSING (READ_GRIB_WGI_METEO_FRANCE)')
1550 pfield(:,1) = pfield(:,1) / 10.
1551 pfield(:,2) = pfield(:,2) /(1000. * pd(:,2))
1553 ALLOCATE (zwsat(nni))
1554 zwsat(:) = (-1.08*100. * zsand(:) + 494.305) * 0.001
1555 pfield(:,1) = pfield(:,1) / zwsat(:)
1556 pfield(:,2) = pfield(:,2) / zwsat(:)
1570 IF (
SIZE(pmask)==
SIZE(pfield,1))
THEN
1571 DO jl=1,
SIZE(pfield,2)
1572 WHERE (pmask(:)/=1.) pfield(:,jl) = xundef
1576 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_WGI_METEO_FRANCE',1,zhook_handle)
1591 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
1592 INTEGER,
INTENT(IN) :: kluout
1593 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
1594 REAL,
DIMENSION(:),
INTENT(IN) :: pmask
1595 REAL,
DIMENSION(:,:),
POINTER :: ptg
1596 REAL,
DIMENSION(:,:),
POINTER :: pdt
1600 INTEGER(KIND=kindOfInt) :: iret
1603 REAL,
DIMENSION(:),
POINTER :: zfield => null()
1605 REAL(KIND=JPRB) :: zhook_handle
1607 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_TG_HIRLAM',0,zhook_handle)
1608 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_TG_HIRLAM: | Reading soil temperature'
1614 CALL
read_grib(hgrib,kluout,11,iret,zfield,klev1=ilev1,klev2=ilev2)
1615 IF (iret /= 0 )
THEN
1616 CALL
abor1_sfx(
'MODE_READ_GRIB: SOIL TEMPERATURE LEVEL 1 MISSING (READ_GRIB_TG_HIRLAM)')
1619 ALLOCATE(ptg(
SIZE(zfield),3))
1620 ALLOCATE(pdt(
SIZE(zfield),3))
1626 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_TG_HIRLAM: | Reading deep soil temperature'
1630 CALL
read_grib(hgrib,kluout,11,iret,zfield,klev1=ilev1,klev2=ilev2)
1632 CALL
abor1_sfx(
'MODE_READ_GRIB: DEEP SOIL TEMPERATURE MISSING (READ_GRIB_TG_HIRLAM)')
1646 IF (
SIZE(pmask)==
SIZE(ptg,1))
THEN
1648 WHERE (pmask(:)/=1.) ptg(:,jl) = xundef
1652 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_TG_HIRLAM',1,zhook_handle)
1666 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
1667 INTEGER,
INTENT(IN) :: kluout
1668 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
1669 REAL,
DIMENSION(:),
INTENT(IN) :: pmask
1670 REAL,
DIMENSION(:,:),
POINTER :: pfield
1671 REAL,
DIMENSION(:,:),
POINTER :: pd
1675 INTEGER(KIND=kindOfInt) :: iret
1679 REAL,
DIMENSION(:),
POINTER :: zfield => null()
1680 REAL,
DIMENSION(:,:),
ALLOCATABLE :: zwg
1681 REAL,
DIMENSION(:),
ALLOCATABLE :: zd
1682 INTEGER :: inlayerdeep
1687 REAL(KIND=JPRB) :: zhook_handle
1689 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_WG_HIRLAM',0,zhook_handle)
1690 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_WG_HIRLAM: | Reading soil moisture'
1691 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_WG_HIRLAM: | WARNING READING LOW VEGETATION TILE (NR 4) ONLY'
1700 CALL
read_grib(hgrib,kluout,86,iret,zfield,kltype=iltype,klev1=ilev1,klev2=ilev2)
1701 IF (iret /= 0 )
THEN
1702 CALL
abor1_sfx(
'MODE_READ_GRIB: SOIL MOISTURE LEVEL 1 MISSING (READ_GRIB_WG_HIRLAM)')
1705 ALLOCATE(zwg(
SIZE(zfield),2))
1709 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_WG_HIRLAM: | Level 1 height set to 0.01 m '
1711 zwg(:,1) = zwg(:,1) / zd(1)
1718 CALL
read_grib(hgrib,kluout,86,iret,zfield,kltype=iltype,klev1=ilev1,klev2=ilev2)
1719 IF (iret /= 0 )
THEN
1720 CALL
abor1_sfx(
'MODE_READ_GRIB: SOIL MOISTURE LEVEL 2 MISSING (READ_GRIB_WG_HIRLAM)')
1728 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_WG_HIRLAM: | Level 2 height set to 0.42 m '
1730 WRITE (kluout,
'(A)')
'WARNING MODE_READ_GRIB: ZWG3 AND ZWG4 SET TO 0. (READ_GRIB_WG_HIRLAM)'
1734 CALL
fill_pfield(kluout,
'READ_GRIB_WG_HIRLAM',inlayerdeep,zd,zwg,pmask,pfield,pd)
1746 WHERE (pfield(:,jl).NE.xundef) pfield(:,jl) = (pfield(:,jl) - zwwilt) / (zwfc - zwwilt)
1749 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_WG_HIRLAM',1,zhook_handle)
1762 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
1763 INTEGER,
INTENT(IN) :: kluout
1764 REAL,
DIMENSION(:,:),
POINTER :: pfield
1765 REAL,
DIMENSION(:,:),
POINTER :: pd
1769 REAL(KIND=JPRB) :: zhook_handle
1771 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_WGI_HIRLAM',0,zhook_handle)
1773 ALLOCATE (pfield(nni,2))
1774 ALLOCATE (pd(nni,2))
1780 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_WGI_HIRLAM',1,zhook_handle)
1802 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
1803 INTEGER,
INTENT(IN) :: kluout
1804 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
1805 REAL,
DIMENSION(:),
INTENT(IN) :: pmask
1806 REAL,
DIMENSION(:),
OPTIONAL,
POINTER :: psnv
1807 REAL,
DIMENSION(:),
OPTIONAL,
POINTER :: psnvd
1811 INTEGER(KIND=kindOfInt) :: iret
1812 REAL,
DIMENSION(:),
POINTER :: zfield => null()
1813 REAL,
DIMENSION(:),
POINTER :: zfield2 => null()
1814 REAL,
DIMENSION(:),
POINTER :: zrho => null()
1815 REAL(KIND=JPRB) :: zhook_handle
1817 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_SNOW_VEG_AND_DEPTH',0,zhook_handle)
1818 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_SNOW_VEG_AND_DEPTH: | Reading snow depth and density (if present)'
1820 SELECT CASE(hinmodel)
1822 CALL
read_grib(hgrib,kluout,141,iret,zfield)
1823 CASE(
'ARPEGE',
'ALADIN',
'MOCAGE',
'HIRLAM')
1824 CALL
read_grib(hgrib,kluout,66,iret,zfield)
1826 CALL
abor1_sfx(
'MODE_READ_GRIB:READ_GRIB_SNOW_VEG_AND_DEPTH: OPTION NOT SUPPORTED '//hinmodel)
1829 IF (iret /= 0 )
THEN
1830 CALL
abor1_sfx(
'MODE_READ_GRIB: SNOW AND VEG DEPTH MISSING (READ_GRIB_SNOW_VEG_AND_DEPTH)')
1835 IF (present(psnv))
THEN
1836 ALLOCATE(psnv(
SIZE(zfield)))
1838 IF (hinmodel==
'ECMWF ') psnv(:) = psnv(:) * zrho(:)
1839 IF (
SIZE(pmask)==
SIZE(psnv)) &
1840 WHERE (pmask(:)/=1.) psnv(:) = xundef
1843 IF (present(psnvd))
THEN
1844 ALLOCATE(psnvd(
SIZE(zfield)))
1846 IF (hinmodel/=
'ECMWF ') psnvd = psnvd / zrho(:)
1847 IF (
SIZE(pmask)==
SIZE(psnvd)) &
1848 WHERE (pmask(:)/=1.) psnvd(:) = xundef
1855 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_SNOW_VEG_AND_DEPTH',1,zhook_handle)
1877 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
1878 INTEGER,
INTENT(IN) :: kluout
1879 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
1880 REAL,
DIMENSION(:),
INTENT(IN) :: pmask
1881 REAL,
DIMENSION(:),
POINTER :: psnva
1885 INTEGER(KIND=kindOfInt) :: iret
1886 REAL,
DIMENSION(:),
POINTER :: zfield => null()
1887 REAL(KIND=JPRB) :: zhook_handle
1889 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_SNOW_ALB',0,zhook_handle)
1890 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_SNOW_ALB: | Reading snow albedo'
1892 ALLOCATE(psnva(nni))
1893 psnva(:) = 0.5 * ( xansmin + xansmax )
1894 IF (hinmodel ==
'ECMWF')
THEN
1895 CALL
read_grib(hgrib,kluout,32,iret,zfield)
1896 IF (iret == 0 )
THEN
1898 ALLOCATE(psnva(
SIZE(zfield)))
1904 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_SNOW_ALB',1,zhook_handle)
1925 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
1926 INTEGER,
INTENT(IN) :: kluout
1927 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
1928 REAL,
DIMENSION(:),
INTENT(IN) :: pmask
1929 REAL,
DIMENSION(:),
POINTER :: psnv
1933 INTEGER(KIND=kindOfInt) :: iret
1934 REAL,
DIMENSION(:),
POINTER :: zfield => null()
1935 REAL(KIND=JPRB) :: zhook_handle
1937 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_SNOW_DEN',0,zhook_handle)
1938 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_SNOW_DEN: | Reading snow density'
1942 IF (hinmodel ==
'ECMWF')
THEN
1943 CALL
read_grib(hgrib,kluout,33,iret,zfield)
1944 IF (iret == 0 )
THEN
1946 ALLOCATE(psnv(
SIZE(zfield)))
1952 IF (
SIZE(pmask)==
SIZE(psnv)) &
1953 WHERE (pmask(:)/=1.) psnv = xundef
1955 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_SNOW_DEN',1,zhook_handle)
1970 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
1971 INTEGER,
INTENT(IN) :: kluout
1972 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
1973 REAL,
INTENT(IN) :: pti
1974 REAL,
DIMENSION(:),
INTENT(IN) :: pmask
1975 REAL,
DIMENSION(:,:),
POINTER :: pt
1976 REAL,
DIMENSION(:,:),
POINTER :: pd
1980 REAL,
DIMENSION(:),
POINTER :: zfield => null()
1982 REAL(KIND=JPRB) :: zhook_handle
1984 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_T_TEB',0,zhook_handle)
1985 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_T_TEB: | Reading temperature for buildings'
1989 ALLOCATE(pt(
SIZE(zfield),3))
1990 ALLOCATE(pd(
SIZE(zfield),3))
2002 IF (
SIZE(pmask)==
SIZE(pt,1))
THEN
2004 WHERE (pmask(:)/=1.) pt(:,jl) = xundef
2008 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_T_TEB',1,zhook_handle)
2021 CHARACTER(LEN=*),
INTENT(IN) :: hgrib
2022 INTEGER,
INTENT(IN) :: kluout
2023 CHARACTER(LEN=6),
INTENT(IN) :: hinmodel
2024 REAL,
INTENT(IN) :: pti
2025 REAL,
DIMENSION(:),
INTENT(IN) :: pmask
2026 REAL,
DIMENSION(:,:),
POINTER :: ptf
2027 REAL,
DIMENSION(:,:),
POINTER :: pd
2031 INTEGER(KIND=kindOfInt) :: iret
2032 REAL,
DIMENSION(:),
POINTER :: zfield => null()
2034 REAL(KIND=JPRB) :: zhook_handle
2036 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_TF_TEB',0,zhook_handle)
2037 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_TF_TEB: | Reading temperature for building floor'
2042 WRITE (kluout,
'(A)')
'MODE_READ_GRIB:READ_GRIB_TF_TEB: | Reading deep soil temperature'
2046 ALLOCATE(ptf(
SIZE(zfield),3))
2047 ALLOCATE(pd(
SIZE(zfield),3))
2049 ptf(:,2) = zfield(:)
2066 IF (lhook) CALL dr_hook(
'MODE_READ_GRIB:READ_GRIB_TF_TEB',1,zhook_handle)
subroutine read_grib_tf_teb(HGRIB, KLUOUT, HINMODEL, PTI, PMASK, PTF, PD)
subroutine read_grib_zs_land(HGRIB, KLUOUT, HINMODEL, PMASK, PZSL)
subroutine read_grib_zs_sea(HGRIB, KLUOUT, HINMODEL, PMASK, PZSS)
subroutine clear_grib_index
subroutine read_grib_wg_hirlam(HGRIB, KLUOUT, HINMODEL, PMASK, PFIELD, PD)
subroutine read_grib_tg_meteo_france(HGRIB, KLUOUT, HINMODEL, PMASK, PTG, PDT)
subroutine read_grib_sand_clay_meteo_france(HGRIB, KLUOUT, HINMODEL, PSAND, PCLAY, GISBA)
subroutine read_grib_zs(HGRIB, KLUOUT, HINMODEL, PZS)
subroutine read_grib_wgi_meteo_france(HGRIB, KLUOUT, HINMODEL, PMASK, PFIELD, PD)
subroutine read_grib_land_mask(HGRIB, KLUOUT, HINMODEL, PMASK)
subroutine read_grib_snow_alb(HGRIB, KLUOUT, HINMODEL, PMASK, PSNVA)
subroutine ecmwf_wgi(PTG, PWG, PWGI)
subroutine abor1_sfx(YTEXT)
subroutine read_grib_wgi_hirlam(HGRIB, KLUOUT, PFIELD, PD)
subroutine fill_pfield(KLUOUT, HROUT, KNLAYERDEEP, PDIN, PFIELDIN, PMASK, PFIELDOUT, PDOUT)
subroutine read_grib_sst(HGRIB, KLUOUT, HINMODEL, PMASK, PSST)
subroutine read_grib_wg_meteo_france(HGRIB, KLUOUT, HINMODEL, PMASK, PFIELD, PD)
subroutine make_grib_index(HGRIB)
subroutine read_grib_t(HGRIB, KLUOUT, HINMODEL, PT)
subroutine read_grib_tg_ecmwf(HGRIB, KLUOUT, HINMODEL, PMASK, PTG, PD)
subroutine test_iret(KLUOUT, VAL1, VAL0, KRET)
subroutine read_grib_t2(HGRIB, KLUOUT, HINMODEL, PMASK, PT2)
subroutine read_grib_t_teb(HGRIB, KLUOUT, HINMODEL, PTI, PMASK, PT, PD)
subroutine read_grib_wgi_ecmwf(HGRIB, KLUOUT, HINMODEL, PMASK, PFIELD, PD)
subroutine get_grib_message(KLUOUT, KLTYPE, KLEV1, KLEV2, KGRIB, KFOUND)
subroutine harmonize_grib_wg_wgi_ecmwf(HGRIB, KLUOUT, HINMODEL, PMASK, PWG, PD, PWGI)
subroutine read_grib_wg_ecmwf(HGRIB, KLUOUT, HINMODEL, PMASK, PFIELD, PD)
subroutine read_grib_tg_hirlam(HGRIB, KLUOUT, HINMODEL, PMASK, PTG, PDT)
subroutine read_grib(HGRIB, KLUOUT, KPARAM, KRET, PFIELD, KLTYPE, KLEV1, KLEV2, KPARAM2)
subroutine read_grib_ts(HGRIB, KLUOUT, HINMODEL, PMASK, PTS)
subroutine read_grib_wg_ecmwf_1(HGRIB, KLUOUT, HINMODEL, PMASK, PWG, PD)
subroutine read_grib_snow_den(HGRIB, KLUOUT, HINMODEL, PMASK, PSNV)
subroutine read_grib_snow_veg_and_depth(HGRIB, KLUOUT, HINMODEL, PMASK, PSNV, PSNVD)
subroutine put_layer_depth(KLUOUT, KLEV, HROUT, KLTYPE, KLEV1, KLEV2, KNLAYERDEEP, PV4, PV, PD)