3 KYEAR,KMONTH,KDAY,PTIME,KLON,KLAT)
61 USE modi_get_trip_grid_conf
62 USE modi_init_param_trip
63 USE modi_init_restart_trip
64 USE modi_get_lonlat_trip
78 TYPE(
trip_t),
INTENT(INOUT) :: TP
81 INTEGER,
INTENT(IN) :: KYEAR
82 INTEGER,
INTENT(IN) :: KMONTH
83 INTEGER,
INTENT(IN) :: KDAY
84 REAL,
INTENT(IN) :: PTIME
85 INTEGER,
INTENT(OUT):: KLON
86 INTEGER,
INTENT(OUT):: KLAT
92 LOGICAL,
PARAMETER :: LDOUBLE =.true.
94 REAL,
PARAMETER :: ZMINCELL = 3.0
96 CHARACTER(LEN=20),
PARAMETER :: YFILE_PARAM_1D =
'TRIP_PGD_1D.nc' 97 CHARACTER(LEN=20),
PARAMETER :: YFILE_PARAM_HD =
'TRIP_PGD_HD.nc' 98 CHARACTER(LEN=20),
PARAMETER :: YFILE_PARAM_12 =
'TRIP_PGD_12D.nc' 99 CHARACTER(LEN=20),
PARAMETER :: YFILE_INIT_1D =
'TRIP_INIT_1D.nc' 100 CHARACTER(LEN=20),
PARAMETER :: YFILE_INIT_HD =
'TRIP_INIT_HD.nc' 101 CHARACTER(LEN=20),
PARAMETER :: YFILE_INIT_12 =
'TRIP_INIT_12D.nc' 103 CHARACTER(LEN=20),
PARAMETER :: YFILE_PARAM =
'TRIP_PARAM.nc' 104 CHARACTER(LEN=20),
PARAMETER :: YFILE_PREP =
'TRIP_PREP.nc' 106 CHARACTER(LEN=20) :: YFILE_READ
107 CHARACTER(LEN=20) :: YFILE_READ_INIT
109 CHARACTER(LEN=20),
PARAMETER :: YFILE_FLOOD_1D =
'TRIP_SGFLOOD_1D.nc' 110 CHARACTER(LEN=20),
PARAMETER :: YFILE_FLOOD_HD =
'TRIP_SGFLOOD_HD.nc' 111 CHARACTER(LEN=20) :: YFILE_FLOOD_READ
113 CHARACTER(LEN=20),
PARAMETER :: YFILE_GW_HD =
'TRIP_SGAQUI_HD.nc' 114 CHARACTER(LEN=20),
PARAMETER :: YFILE_GW_12D =
'TRIP_SGAQUI_12D.nc' 115 CHARACTER(LEN=20) :: YFILE_GW_READ
116 CHARACTER(LEN=20),
PARAMETER :: YFILE_GW_FRC_HD =
'GWEQ_HD_FRC.nc' 118 CHARACTER(LEN=20) :: YVAR
120 REAL,
DIMENSION(:),
ALLOCATABLE :: ZLON
121 REAL,
DIMENSION(:),
ALLOCATABLE :: ZLAT
123 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZGRCN
124 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZSEQ
125 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZFRACAREA
126 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZNUM_BAS
127 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZDR_AREA
128 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZREAD
129 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZWORK
130 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZLEN
131 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZGREEN_ANT
132 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZHSTREAM
133 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZDRAIN
134 REAL,
DIMENSION(:,:),
ALLOCATABLE :: ZHG_OLD
136 REAL,
DIMENSION(:,:,:),
ALLOCATABLE :: ZREAD3D
138 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: IGRCN
139 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: INEXTX
140 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: INEXTY
142 INTEGER,
DIMENSION(:),
ALLOCATABLE :: INCELL_BAS
152 INTEGER :: ILON_G, ILON_DEB, ILON_END
153 INTEGER :: ILON_G12, ILON_DEB12, ILON_END12
154 INTEGER :: ILAT_G, ILAT_DEB, ILAT_END
155 INTEGER :: ILAT_G12, ILAT_DEB12, ILAT_END12
157 INTEGER :: IWORK, IFLOOD, INI, ILATF
158 INTEGER :: JLON, JLAT, JBAS, JITER
160 LOGICAL :: LMASKLON, LMASKLAT, LWORK
166 CHARACTER(LEN=50) :: YTITLE,YTIMEUNIT
170 REAL(KIND=JPRB) :: ZHOOK_HANDLE
186 WRITE(
nlisting,*)
'! Attention, you use the flooding scheme without groundwater scheme !!!' 187 IF(
cvit /=
'VAR')
THEN 188 WRITE(
nlisting,*)
'! You cannot use the flooding scheme without the variable velocity scheme !!!' 189 CALL abort_trip(
'PREP_TRIP_RUN: You cannot use the flooding scheme without the variable velocity scheme' 195 WRITE(
nlisting,*)
'! Constant transfert time value XTAUG_UNIF must be at least 1 day or inferior to 365 days !!!' 196 CALL abort_trip(
'PREP_TRIP_RUN: Constant transfert time value must be at least 1 day or inferior to 365 days' 201 IF(
cvit /=
'VAR')
THEN 202 WRITE(
nlisting,*)
'! You cannot use the groundwater scheme without the variable velocity scheme !!!' 203 CALL abort_trip(
'PREP_TRIP_RUN: You cannot use the groundwater scheme without the variable velocity scheme' 206 WRITE(
nlisting,*)
'! Upstream transfert time value XTAUG_UP must be at least 1 day !!!' 207 CALL abort_trip(
'PREP_TRIP_RUN: Upstream transfert time value must be at least 1 day' 210 WRITE(
nlisting,*)
'! Downstream transfert time value XTAUG_DOWN must be lower than 365 days !!!' 211 CALL abort_trip(
'PREP_TRIP_RUN: Downstream transfert time value must be lower than 365 days' 216 WRITE(
nlisting,*)
'!! XGWSUBD too large (must be <=30), check your namelist !!!' 217 CALL abort_trip(
'PREP_TRIP_RUN: XGWSUBD too large (must be <=30), check your namelist !!!' 225 zlonmin,zlonmax,zlatmin,zlatmax,zgrid_res,ilon,ilat
237 IF(zgrid_res==1.0)
THEN 239 WRITE(
nlisting,*)
'! 1° by 1° TRIP run !!!' 244 yfile_read = yfile_param_1d
245 yfile_read_init = yfile_init_1d
246 yfile_flood_read = yfile_flood_1d
248 ELSEIF(zgrid_res==0.5)
THEN 250 WRITE(
nlisting,*)
'! 0.5° by 0.5° TRIP run !!!' 255 yfile_read = yfile_param_hd
256 yfile_read_init = yfile_init_hd
257 yfile_gw_read = yfile_gw_hd
258 yfile_flood_read = yfile_flood_hd
260 ELSEIF(zgrid_res < 0.09)
THEN 262 WRITE(
nlisting,*)
'!!! 1/12° by 1/12° TRIP run (FRANCE) !!!' 270 yfile_read = yfile_param_12
271 yfile_read_init = yfile_init_12
272 yfile_gw_read = yfile_gw_12d
275 WRITE(
nlisting,*)
'! meandering ratio is the same than at 1° resolution !!!' 276 WRITE(
nlisting,*)
'! change XRATMED in namelist !!!' 277 CALL abort_trip(
'PREP_TRIP_RUN: meandering ratio not good')
282 WRITE(
nlisting,*)
'! The resolution of the TRIP run is not good !!!' 283 WRITE(
nlisting,*)
'! Should be 1° or 0.5° or 1/12 ° over France !!!' 284 CALL abort_trip(
'PREP_TRIP_RUN: resolution of the TRIP run is not good' 288 IF(
cgroundw==
'DIF'.AND.zgrid_res>0.5)
THEN 289 WRITE(
nlisting,*)
'! You cannot use the groundwater scheme with another resolution than 0.5 or 1/12 !!!' 290 CALL abort_trip(
'PREP_TRIP_RUN: You cannot use the groundwater scheme with another resolution than 0.5 or 1/12' 293 IF(
lgweq.AND.zgrid_res/=0.5)
THEN 294 WRITE(
nlisting,*)
'! You cannot use groundwater equilibrium with another resolution than 0.5 !!!' 295 CALL abort_trip(
'PREP_TRIP_RUN: You cannot use groundwater equilibrium with another resolution than 0.5' 299 IF(zlonmin/=-180..OR.zlonmax/=180.)lmasklon=.true.
302 IF(zlatmin/=-180..OR.zlatmax/=180.)lmasklat=.true.
308 ALLOCATE(tpg%GMASK (ilon,ilat))
309 ALLOCATE(tpg%GMASK_VEL(ilon,ilat))
310 ALLOCATE(tpg%GMASK_GW (ilon,ilat))
311 ALLOCATE(tpg%GMASK_FLD(ilon,ilat))
312 ALLOCATE(tpg%GMASK_GRE(ilon,ilat))
313 ALLOCATE(tpg%GMASK_ANT(ilon,ilat))
314 tpg%GMASK (:,:) = .false.
315 tpg%GMASK_VEL(:,:) = .false.
316 tpg%GMASK_GW (:,:) = .false.
317 tpg%GMASK_FLD(:,:) = .false.
318 tpg%GMASK_GRE(:,:) = .false.
319 tpg%GMASK_ANT(:,:) = .false.
321 ALLOCATE(tpg%XAREA (ilon,ilat))
322 ALLOCATE(tpg%NGRCN (ilon,ilat))
323 ALLOCATE(tpg%NBASID(ilon,ilat))
325 ALLOCATE(zlen(ilon,ilat))
326 ALLOCATE(zgrcn(ilon,ilat))
327 ALLOCATE(zseq(ilon,ilat))
328 ALLOCATE(zfracarea(ilon,ilat))
329 ALLOCATE(znum_bas(ilon,ilat))
330 ALLOCATE(zdr_area(ilon,ilat))
331 ALLOCATE(zgreen_ant(ilon,ilat))
333 ALLOCATE(tp%XSURF_STO(ilon,ilat))
336 ALLOCATE(tp%XTAUG (ilon,ilat))
338 ALLOCATE(tp%XTAUG (0,0))
342 ALLOCATE(tp%XGROUND_STO(ilon,ilat))
344 ALLOCATE(tp%XGROUND_STO(0,0))
348 ALLOCATE(tp%XHGROUND (ilon,ilat))
349 ALLOCATE(tp%XWEFF (ilon,ilat))
350 ALLOCATE(tp%XTRANS (ilon,ilat))
351 ALLOCATE(tp%XNUM_AQUI (ilon,ilat))
352 ALLOCATE(tp%XTOPO_RIV (ilon,ilat))
354 ALLOCATE(tp%XHGROUND (0,0))
355 ALLOCATE(tp%XWEFF (0,0))
356 ALLOCATE(tp%XTRANS (0,0))
357 ALLOCATE(tp%XNUM_AQUI (0,0))
358 ALLOCATE(tp%XTOPO_RIV (0,0))
362 ALLOCATE(tp%XHC_BED (ilon,ilat))
364 ALLOCATE(tp%XHC_BED (0,0))
368 ALLOCATE(tp%XN_FLOOD (ilon,ilat))
369 ALLOCATE(tp%XFLOOD_STO (ilon,ilat))
370 ALLOCATE(tp%XHFLOOD (ilon,ilat))
371 ALLOCATE(tp%XFFLOOD (ilon,ilat))
373 ALLOCATE(tp%XN_FLOOD (0,0))
374 ALLOCATE(tp%XFLOOD_STO(0,0))
375 ALLOCATE(tp%XHFLOOD (0,0))
376 ALLOCATE(tp%XFFLOOD (0,0))
380 ALLOCATE(tp%XSLOPEBED(ilon,ilat))
381 ALLOCATE(tp%XWIDTH (ilon,ilat))
382 ALLOCATE(tp%XN (ilon,ilat))
384 ALLOCATE(tp%XSLOPEBED(0,0))
385 ALLOCATE(tp%XWIDTH (0,0))
386 ALLOCATE(tp%XN (0,0))
393 ytitle =
'TRIP parameters for a run' 396 nlisting,yfile_param,ilon,ilat,ytitle,ytimeunit)
398 ytitle =
'TRIP prep historical variable' 401 nlisting,yfile_prep,ilon,ilat,ytitle,ytimeunit,.false
407 IF(zgrid_res > 0.09)
THEN 409 ilon_deb = int(zlonmin/zgrid_res) + ilon_g/2 + 1
410 ilon_end = int(zlonmax/zgrid_res) + ilon_g/2
411 ilat_deb = int(zlatmin/zgrid_res) + ilat_g/2 + 1
412 ilat_end = int(zlatmax/zgrid_res) + ilat_g/2
414 ALLOCATE(igrcn(ilon_g,ilat_g))
415 ALLOCATE(inextx(ilon_g,ilat_g))
416 ALLOCATE(inexty(ilon_g,ilat_g))
417 ALLOCATE(zwork(ilon_g,ilat_g))
426 ilon_deb12 = int(zlonmin/zgrid_res) + ilon_g12/2 + 1
427 ilon_end12 = int(zlonmax/zgrid_res) + ilon_g12/2
428 ilat_deb12 = int(zlatmin/zgrid_res) + ilat_g12/2 + 1
429 ilat_end12 = int(zlatmax/zgrid_res) + ilat_g12/2
431 ALLOCATE(igrcn(ilon_g12,ilat_g12))
432 ALLOCATE(inextx(ilon_g12,ilat_g12))
433 ALLOCATE(inexty(ilon_g12,ilat_g12))
434 ALLOCATE(zwork(ilon_g12,ilat_g12))
438 ALLOCATE(zread(ilon_g,ilat_g))
452 znum_bas(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
454 WHERE(znum_bas>=
xundef-1.0)znum_bas=0.0
455 tpg%NBASID(:,:)=int(znum_bas(:,:))
457 tpg%NBASMIN = minval(tpg%NBASID(:,:),tpg%NBASID(:,:)>0)
458 tpg%NBASMAX = maxval(tpg%NBASID(:,:),tpg%NBASID(:,:)>0)
464 zdr_area(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
470 zgrcn(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
471 WHERE(zread(:,:)==
xundef)zread(:,:)=0.0
473 IF(zgrid_res > 0.09)
THEN 479 CALL setnext(ilon_g,ilat_g,igrcn,inextx,inexty)
482 zlen(:,:) = zwork(ilon_deb:ilon_end,ilat_deb:ilat_end)
486 igrcn(ilon_deb12:ilon_end12,ilat_deb12:ilat_end12) = int(zread)
490 CALL setnext(ilon_g12,ilat_g12,igrcn,inextx,inexty)
492 CALL setlen(ilon_g12,ilat_g12,igrcn,inextx,inexty,
xratmed,zwork)
493 zlen(:,:) = zwork(ilon_deb12:ilon_end12,ilat_deb12:ilat_end12)
500 IF(zgrid_res==0.5)
THEN 503 zfracarea(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
508 CALL setarea(ilat,zlatmin,zgrid_res,tpg%XAREA)
510 zlen(:,:) = zlen(:,:) * zfracarea(:,:)
511 tpg%XAREA(:,:) = tpg%XAREA(:,:) * zfracarea(:,:)
517 DEALLOCATE(zfracarea)
521 ALLOCATE(inextx(ilon,ilat))
522 ALLOCATE(inexty(ilon,ilat))
524 WHERE(zgrcn(:,:)<
xundef-1.0)
525 tpg%NGRCN(:,:)=int(zgrcn(:,:))
526 tpg%GMASK(:,:)=.true.
529 tpg%GMASK(:,:)=.false.
532 CALL setnext(ilon,ilat,tpg%NGRCN,inextx,inexty,lmasklon,lmasklat)
537 zgrcn(:,:)=
REAL(tpg%ngrcn(:,:))
557 zseq(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
565 tp%XSURF_STO(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
572 IF(zgrid_res > 0.09)
THEN 577 zgreen_ant(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
581 IF(zgreen_ant(jlon,jlat)==2.0)
THEN 582 tpg%GMASK_ANT(jlon,jlat)=.true.
583 ELSEIF(zgreen_ant(jlon,jlat)==1.0)
THEN 584 tpg%GMASK_GRE(jlon,jlat)=.true.
591 DEALLOCATE(zgreen_ant)
595 IF(
cvit ==
'VAR')
THEN 599 tp%XN(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
604 tp%XWIDTH(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
609 tp%XSLOPEBED(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
610 WHERE(tp%XSLOPEBED(:,:)<
xundef-1.0)
611 tp%XSLOPEBED(:,:) = max(1.e-5,tp%XSLOPEBED(:,:)/
xratmed)
615 tpg%GMASK_VEL(:,:)=tpg%GMASK(:,:)
616 WHERE(tp%XWIDTH(:,:)>=
xundef-1.0)
617 tpg%GMASK_VEL(:,:)=.false.
628 tp%XHC_BED(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
629 WHERE(tp%XHC_BED(:,:)==0.0)
640 tpg%GMASK_GW(:,:)=tpg%GMASK(:,:)
644 tp%XGROUND_STO(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
647 WHERE(tpg%GMASK_ANT(:,:).OR.tpg%GMASK_GRE(:,:))
649 tpg%GMASK_GW (:,:)=.false.
650 tp%XGROUND_STO(:,:)=0.0
661 tpg%GMASK_GW(:,:)=tpg%GMASK_VEL(:,:)
665 tp%XNUM_AQUI(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
667 WHERE(tp%XNUM_AQUI(:,:)>=
xundef-1.0)
668 tpg%GMASK_GW(:,:)=.false.
673 IF(zgrid_res > 0.09)
THEN 685 tp%XWEFF(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
690 tp%XTRANS(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
695 tp%XTOPO_RIV(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
698 ALLOCATE(zread3d(ilon_g,ilat_g,
ndimtab))
701 ALLOCATE(tp%XTABGW_F (ilon,ilat,
ndimtab))
702 ALLOCATE(tp%XTABGW_H (ilon,ilat,
ndimtab))
704 tp%XTABGW_F(:,:,:)=
xundef 705 tp%XTABGW_H(:,:,:)=
xundef 709 tp%XTABGW_F(:,:,:) = zread3d(ilon_deb:ilon_end,ilat_deb:ilat_end,:)
714 tp%XTABGW_H(:,:,:) = zread3d(ilon_deb:ilon_end,ilat_deb:ilat_end,:)
723 tp%XHGROUND(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
725 WHERE(tpg%GMASK_GW(:,:))
726 tp%XHGROUND(:,:) = max(tp%XHGROUND(:,:),tp%XTOPO_RIV(:,:)-
xgwdzmax 733 ALLOCATE(zhstream(ilon,ilat))
734 ALLOCATE(zdrain(ilon,ilat))
735 ALLOCATE(zhg_old(ilon,ilat))
742 zhstream(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
743 zhstream(:,:) = min(tp%XHC_BED(:,:),zhstream(:,:))
747 zdrain(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
748 zdrain(:,:) = max(0.0,zdrain(:,:)) * tpg%XAREA(:,:)
755 tpg%GMASK_GW,tp%XNUM_AQUI,zdrain, &
756 zlen,tp%XWIDTH,tp%XHC_BED, &
757 tp%XTOPO_RIV,tp%XTAUG,tpg%XAREA, &
758 tp%XTRANS,tp%XWEFF, &
759 tp%XTABGW_F,tp%XTABGW_H,zhstream, &
760 tp%XHGROUND,zhg_old )
778 ALLOCATE(incell_bas(tpg%NBASMAX))
783 jbas=tpg%NBASID(jlon,jlat)
785 incell_bas(jbas)=incell_bas(jbas)+1
792 tp%XN_FLOOD(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
794 ALLOCATE(zread3d(ilon_g,ilat_g,
ndimtab))
797 ALLOCATE(tp%XTAB_F (ilon,ilat,
ndimtab))
798 ALLOCATE(tp%XTAB_H (ilon,ilat,
ndimtab))
799 ALLOCATE(tp%XTAB_VF(ilon,ilat,
ndimtab))
817 WHERE(tp%XHC_BED(:,:)==
xundef)
821 WHERE(tp%XTAB_F(:,:,1)==
xundef)
825 WHERE(tp%XTAB_H(:,:,1)==
xundef)
829 lwork=(ilat*ilon>zmincell)
833 jbas=tpg%NBASID(jlon,jlat)
836 IF(lwork.AND.incell_bas(jbas)<=zmincell)
THEN 837 tp%XN_FLOOD(jlon,jlat)=
xundef 842 tpg%GMASK_FLD(:,:)=tpg%GMASK_VEL(:,:)
843 WHERE(tp%XN_FLOOD(:,:)==
xundef)
844 tpg%GMASK_FLD(:,:)=.false.
862 tp%XFLOOD_STO(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
865 tp%XFFLOOD(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
868 tp%XHFLOOD(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
870 tp%XFLOOD_STO(:,:) = 0.0
871 tp%XFFLOOD (:,:) = 0.0
872 tp%XHFLOOD (:,:) = 0.0
884 DEALLOCATE(incell_bas)
subroutine init_param_trip(TPG, KLISTING, HFILE, KLON, KLAT, HTITLE, HTIME
subroutine setlen(KLON, KLAT, KGRCN, KNEXTX, KNEXTY, PRATMED, PLEN)
subroutine setarea(KLAT, PLATMIN, PRES, PAREA)
subroutine setnext(KLON, KLAT, KGRCN, KNEXTX, KNEXTY, GMLON, GMLAT)
subroutine init_restart_trip(TPG, KLISTING, HFILE, KLON, KLAT, HTITLE, HTI
character(len=3) cgroundw
subroutine write_trip_date(KLISTING, HFILE, KYEAR, KMONTH, KDAY, PTIME)
subroutine get_trip_grid_conf(TPG, PLONMIN, PLONMAX, PLATMIN, PLATMAX, PRE
subroutine abort_trip(YTEXT)
subroutine get_lonlat_trip(TPG, KLON, KLAT, PLON, PLAT)
subroutine prep_trip_run(TP, TPG, KYEAR, KMONTH, KDAY, PTIME, KLON, KLAT)