SURFEX v8.1
General documentation of Surfex
prep_trip_run.F90
Go to the documentation of this file.
1 ! #########
2  SUBROUTINE prep_trip_run (TP, TPG, &
3  KYEAR,KMONTH,KDAY,PTIME,KLON,KLAT)
4 ! ####################
5 !
6 !!**** *PREP_TRIP_RUN*
7 !!
8 !! PURPOSE
9 !! -------
10 !
11 ! Prepare TRIP variables and parameters.
12 !
13 !!** METHOD
14 !! ------
15 !
16 ! Direct calculation
17 !
18 !! EXTERNAL
19 !! --------
20 !
21 ! None
22 !!
23 !! IMPLICIT ARGUMENTS
24 !! ------------------
25 !!
26 !!
27 !! REFERENCE
28 !! ---------
29 !!
30 !! AUTHOR
31 !! ------
32 !! B. Decharme (Meteo-France)
33 !!
34 !! MODIFICATIONS
35 !! -------------
36 !! Original 27/05/08
37 !! 09/16 B. Decharme limit wtd to -1000m
38 !-------------------------------------------------------------------------------
39 !
40 !* 0. DECLARATIONS
41 ! ------------
42 !
43 !
44 USE modd_trip, ONLY : trip_t
45 USE modd_trip_grid, ONLY : trip_grid_t
46 !
47 USE modn_trip, ONLY : cgroundw, cvit, lflood, &
48  xcvel, xratmed, xtstep, &
50 
53 !
54 USE modd_trip_par
55 USE modd_trip_listing, ONLY : nlisting
56 !
58 USE mode_rw_trip
59 !
60 USE modi_abort_trip
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
65 !
66 USE modi_gwf
67 !
68 USE yomhook ,ONLY : lhook, dr_hook
69 USE parkind1 ,ONLY : jprb
70 !
71 IMPLICIT NONE
72 !
73 !-------------------------------------------------------------------------------
74 !
75 !* 0.1 declarations of arguments
76 !
77 !
78 TYPE(trip_t), INTENT(INOUT) :: TP
79 TYPE(trip_grid_t), INTENT(INOUT) :: TPG
80 !
81 INTEGER, INTENT(IN) :: KYEAR !date UTC
82 INTEGER, INTENT(IN) :: KMONTH !date UTC
83 INTEGER, INTENT(IN) :: KDAY !date UTC
84 REAL, INTENT(IN) :: PTIME !date UTC
85 INTEGER, INTENT(OUT):: KLON ! number of points in longitude
86 INTEGER, INTENT(OUT):: KLAT ! number of points in latitude
87 !
88 !-------------------------------------------------------------------------------
89 !
90 !* 0.2 declarations of local variables
91 !
92 LOGICAL, PARAMETER :: LDOUBLE =.true.
93 !
94 REAL, PARAMETER :: ZMINCELL = 3.0
95 !
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'
102 !
103  CHARACTER(LEN=20), PARAMETER :: YFILE_PARAM ='TRIP_PARAM.nc'
104  CHARACTER(LEN=20), PARAMETER :: YFILE_PREP ='TRIP_PREP.nc'
105 !
106  CHARACTER(LEN=20) :: YFILE_READ
107  CHARACTER(LEN=20) :: YFILE_READ_INIT
108 !
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
112 !
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'
117 !
118  CHARACTER(LEN=20) :: YVAR
119 !
120 REAL, DIMENSION(:),ALLOCATABLE :: ZLON
121 REAL, DIMENSION(:),ALLOCATABLE :: ZLAT
122 !
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
135 !
136 REAL,DIMENSION(:,:,:),ALLOCATABLE :: ZREAD3D
137 !
138 INTEGER,DIMENSION(:,:),ALLOCATABLE :: IGRCN
139 INTEGER,DIMENSION(:,:),ALLOCATABLE :: INEXTX
140 INTEGER,DIMENSION(:,:),ALLOCATABLE :: INEXTY
141 !
142 INTEGER,DIMENSION(:), ALLOCATABLE :: INCELL_BAS
143 !
144 REAL :: ZLONMIN ! minimum longitude (degrees)
145 REAL :: ZLONMAX ! maximum longitude (degrees)
146 REAL :: ZLATMIN ! minimum latitude (degrees)
147 REAL :: ZLATMAX ! maximum latitude (degrees)
148 REAL :: ZGRID_RES ! 1° or 0.5° resolution
149 REAL :: ZSEQMAX
150 !
151 INTEGER :: ILON,ILAT
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
156 !
157 INTEGER :: IWORK, IFLOOD, INI, ILATF
158 INTEGER :: JLON, JLAT, JBAS, JITER
159 !
160 LOGICAL :: LMASKLON, LMASKLAT, LWORK
161 !
162 !-------------------------------------------------------------------------------
163 !Output attribut for netcdf diag file
164 !-------------------------------------------------------------------------------
165 !
166  CHARACTER(LEN=50) :: YTITLE,YTIMEUNIT
167 ! YTITLE = Title of each output file
168 ! YTIMEUNIT = Time unit in each output file if present
169 !
170 REAL(KIND=JPRB) :: ZHOOK_HANDLE
171 !
172 !-------------------------------------------------------------------------------
173 !Initilyse TRIP
174 !-------------------------------------------------------------------------------
175 !
176 IF (lhook) CALL dr_hook('PREP_TRIP_RUN',0,zhook_handle)
177 !
178 WRITE(nlisting,*)''
179 WRITE(nlisting,*)' PREP TRIP '
180 WRITE(nlisting,*)''
181 !
182 !-------------------------------------------------------------------------------
183 !
184 IF(lflood)THEN
185  IF(cgroundw=='DEF') &
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')
190  ENDIF
191 ENDIF
192 !
193 IF(cgroundw=='CST')THEN
194  IF(xtaug_unif<1.0.OR.xtaug_unif>365.0)THEN
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')
197  ENDIF
198 ENDIF
199 !
200 IF(cgroundw=='DIF')THEN
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')
204  ENDIF
205  IF(xtaug_up<1.0)THEN
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')
208  ENDIF
209  IF(xtaug_down>365.0)THEN
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')
212  ENDIF
213 ENDIF
214 !
215 IF(lgwsubf.AND.xgwsubd>30.)THEN
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 !!!')
218 ENDIF
219 !
220 !-------------------------------------------------------------------------------
221 ! * Read TRIP grid configuration
222 !-------------------------------------------------------------------------------
223 !
224  CALL get_trip_grid_conf(tpg, &
225  zlonmin,zlonmax,zlatmin,zlatmax,zgrid_res,ilon,ilat)
226 klon=ilon
227 klat=ilat
228 !
229 ALLOCATE(zlon(ilon))
230 ALLOCATE(zlat(ilat))
231 zlon(:)=xundef
232 zlat(:)=xundef
233 !
234  CALL get_lonlat_trip(tpg, &
235  klon,klat,zlon,zlat)
236 !
237 IF(zgrid_res==1.0)THEN
238 !
239  WRITE(nlisting,*)'! 1° by 1° TRIP run !!!'
240 !
241  ilon_g = 360
242  ilat_g = 180
243  ilatf = 31
244  yfile_read = yfile_param_1d
245  yfile_read_init = yfile_init_1d
246  yfile_flood_read = yfile_flood_1d
247 !
248 ELSEIF(zgrid_res==0.5)THEN
249 !
250  WRITE(nlisting,*)'! 0.5° by 0.5° TRIP run !!!'
251 !
252  ilon_g = 720
253  ilat_g = 360
254  ilatf = 61
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
259 !
260 ELSEIF(zgrid_res < 0.09)THEN
261 !
262  WRITE(nlisting,*)'!!! 1/12° by 1/12° TRIP run (FRANCE) !!!'
263 !
264  ilon_g = 180
265  ilat_g = 108
266  ilon_g12 = 4320
267  ilat_g12 = 2160
268 
269  ilatf = 1
270  yfile_read = yfile_param_12
271  yfile_read_init = yfile_init_12
272  yfile_gw_read = yfile_gw_12d
273 !
274  IF(xratmed==1.4)THEN
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')
278  ENDIF
279 !
280 ELSE
281 !
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')
285 !
286 ENDIF
287 !
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')
291 ENDIF
292 !
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')
296 ENDIF
297 !
298 lmasklon=.false.
299 IF(zlonmin/=-180..OR.zlonmax/=180.)lmasklon=.true.
300 !
301 lmasklat=.false.
302 IF(zlatmin/=-180..OR.zlatmax/=180.)lmasklat=.true.
303 !
304 !-------------------------------------------------------------------------------
305 !Allocate arguments
306 !-------------------------------------------------------------------------------
307 !
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.
320 !
321 ALLOCATE(tpg%XAREA (ilon,ilat))
322 ALLOCATE(tpg%NGRCN (ilon,ilat))
323 ALLOCATE(tpg%NBASID(ilon,ilat))
324 !
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))
332 !
333 ALLOCATE(tp%XSURF_STO(ilon,ilat))
334 !
335 IF(cgroundw/='DEF')THEN
336  ALLOCATE(tp%XTAUG (ilon,ilat))
337 ELSE
338  ALLOCATE(tp%XTAUG (0,0))
339 ENDIF
340 !
341 IF(cgroundw=='CST')THEN
342  ALLOCATE(tp%XGROUND_STO(ilon,ilat))
343 ELSE
344  ALLOCATE(tp%XGROUND_STO(0,0))
345 ENDIF
346 !
347 IF(cgroundw=='DIF')THEN
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))
353 ELSE
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))
359 ENDIF
360 !
361 IF(lflood.OR.cgroundw=='DIF')THEN
362  ALLOCATE(tp%XHC_BED (ilon,ilat))
363 ELSE
364  ALLOCATE(tp%XHC_BED (0,0))
365 ENDIF
366 !
367 IF(lflood)THEN
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))
372 ELSE
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))
377 ENDIF
378 !
379 IF(cvit=='VAR')THEN
380  ALLOCATE(tp%XSLOPEBED(ilon,ilat))
381  ALLOCATE(tp%XWIDTH (ilon,ilat))
382  ALLOCATE(tp%XN (ilon,ilat))
383 ELSE
384  ALLOCATE(tp%XSLOPEBED(0,0))
385  ALLOCATE(tp%XWIDTH (0,0))
386  ALLOCATE(tp%XN (0,0))
387 ENDIF
388 !
389 !-------------------------------------------------------------------------------
390 ! * Create param and init file
391 !-------------------------------------------------------------------------------
392 !
393 ytitle = 'TRIP parameters for a run'
394 ytimeunit = '-'
395  CALL init_param_trip(tpg, &
396  nlisting,yfile_param,ilon,ilat,ytitle,ytimeunit)
397 !
398 ytitle ='TRIP prep historical variable'
399 ytimeunit='-'
400  CALL init_restart_trip(tpg, &
401  nlisting,yfile_prep,ilon,ilat,ytitle,ytimeunit,.false.)
402 !
403 !-------------------------------------------------------------------------------
404 ! * Compute the mask of the run
405 !-------------------------------------------------------------------------------
406 !
407 IF(zgrid_res > 0.09)THEN
408 !
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
413 !
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))
418 !
419 ELSE
420 !
421  ilon_deb = 1
422  ilon_end = ilon_g
423  ilat_deb = 1
424  ilat_end = ilat_g
425 !
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
430 !
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))
435 !
436 ENDIF
437 !
438 ALLOCATE(zread(ilon_g,ilat_g))
439 !
440 !-------------------------------------------------------------------------------
441 ! * Compute and Read TRIP parameter
442 !-------------------------------------------------------------------------------
443 !
444 igrcn =0
445 inextx=0
446 inexty=0
447 !
448 ! * Basin ID
449 !
450 yvar ='NUM_BAS'
451  CALL read_trip(nlisting,yfile_read,yvar,zread)
452 znum_bas(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
453 !
454 WHERE(znum_bas>=xundef-1.0)znum_bas=0.0
455 tpg%NBASID(:,:)=int(znum_bas(:,:))
456 !
457 tpg%NBASMIN = minval(tpg%NBASID(:,:),tpg%NBASID(:,:)>0)
458 tpg%NBASMAX = maxval(tpg%NBASID(:,:),tpg%NBASID(:,:)>0)
459 !
460 ! * Drainage Area
461 !
462 yvar ='DR_AREA'
463  CALL read_trip(nlisting,yfile_read,yvar,zread)
464 zdr_area(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
465 !
466 ! * Flow direction
467 !
468 yvar ='FLOWDIR'
469  CALL read_trip(nlisting,yfile_read,yvar,zread)
470 zgrcn(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
471 WHERE(zread(:,:)==xundef)zread(:,:)=0.0
472 !
473 IF(zgrid_res > 0.09)THEN
474 !
475  igrcn = int(zread)
476 !
477 ! * Set the distance between grids with the meandering ratio
478 !
479  CALL setnext(ilon_g,ilat_g,igrcn,inextx,inexty)
480 !
481  CALL setlen(ilon_g,ilat_g,igrcn,inextx,inexty,xratmed,zwork)
482  zlen(:,:) = zwork(ilon_deb:ilon_end,ilat_deb:ilat_end)
483 !
484 ELSE
485 !
486  igrcn(ilon_deb12:ilon_end12,ilat_deb12:ilat_end12) = int(zread)
487 !
488 ! * Set the distance between grids with the meandering ratio
489 !
490  CALL setnext(ilon_g12,ilat_g12,igrcn,inextx,inexty)
491 !
492  CALL setlen(ilon_g12,ilat_g12,igrcn,inextx,inexty,xratmed,zwork)
493  zlen(:,:) = zwork(ilon_deb12:ilon_end12,ilat_deb12:ilat_end12)
494 !
495 ENDIF
496 !
497 !
498 ! * Set area size
499 !
500 IF(zgrid_res==0.5)THEN
501  yvar ='FRACAREA'
502  CALL read_trip(nlisting,yfile_read,yvar,zread)
503  zfracarea(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
504 ELSE
505  zfracarea(:,:) = 1.0
506 ENDIF
507 !
508  CALL setarea(ilat,zlatmin,zgrid_res,tpg%XAREA)
509 !
510 zlen(:,:) = zlen(:,:) * zfracarea(:,:)
511 tpg%XAREA(:,:) = tpg%XAREA(:,:) * zfracarea(:,:)
512 !
513 DEALLOCATE(igrcn )
514 DEALLOCATE(inextx)
515 DEALLOCATE(inexty)
516 DEALLOCATE(zwork )
517 DEALLOCATE(zfracarea)
518 !
519 ! * Domain test
520 !
521 ALLOCATE(inextx(ilon,ilat))
522 ALLOCATE(inexty(ilon,ilat))
523 !
524 WHERE(zgrcn(:,:)<xundef-1.0)
525  tpg%NGRCN(:,:)=int(zgrcn(:,:))
526  tpg%GMASK(:,:)=.true.
527 ELSEWHERE
528  tpg%NGRCN(:,:)=0
529  tpg%GMASK(:,:)=.false.
530 ENDWHERE
531 !
532  CALL setnext(ilon,ilat,tpg%NGRCN,inextx,inexty,lmasklon,lmasklat)
533 !
534 ! * Store some param
535 !
536 yvar ='FLOWDIR'
537 zgrcn(:,:)=REAL(tpg%ngrcn(:,:))
538  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK,zgrcn)
539 yvar ='RIVLEN'
540  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK,zlen,odouble=ldouble)
541 yvar ='NUM_BAS'
542  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK,znum_bas)
543 yvar ='DR_AREA'
544  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK,zdr_area,odouble=ldouble)
545 yvar ='CELL_AREA'
546  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK,tpg%XAREA,odouble=ldouble)
547 !
548 DEALLOCATE(inextx)
549 DEALLOCATE(inexty)
550 DEALLOCATE(zdr_area)
551 DEALLOCATE(znum_bas)
552 !
553 ! * River sequence values read
554 !
555 yvar ='RIVSEQ'
556  CALL read_trip(nlisting,yfile_read,yvar,zread)
557 zseq(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
558 !
559  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK,zseq)
560 !
561 ! * Initial river storage
562 !
563 yvar ='SURF_STO'
564  CALL read_trip(nlisting,yfile_read_init,yvar,zread)
565 tp%XSURF_STO(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
566 !
567  CALL write_trip(nlisting,yfile_prep,yvar,tpg%GMASK,tp%XSURF_STO,odouble=ldouble)
568 !
569 ! * Greenland and Antarctic masks
570 !
571 yvar ='GREEN_ANT'
572 IF(zgrid_res > 0.09)THEN
573  CALL read_trip(nlisting,yfile_read,yvar,zread)
574 ELSE
575  zread(:,:)=0.0
576 ENDIF
577 zgreen_ant(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
578  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK,zgreen_ant)
579 DO jlat=1,ilat
580  DO jlon=1,ilon
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.
585  ENDIF
586  ENDDO
587 ENDDO
588 !
589 DEALLOCATE(zlon)
590 DEALLOCATE(zlat)
591 DEALLOCATE(zgreen_ant)
592 !
593 ! * Variable velocity scheme parameters
594 !
595 IF(cvit == 'VAR')THEN
596 !
597  yvar ='N_RIV'
598  CALL read_trip(nlisting,yfile_read,yvar,zread)
599  tp%XN(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
600  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK,tp%XN)
601 !
602  yvar ='WIDTHRIV'
603  CALL read_trip(nlisting,yfile_read,yvar,zread)
604  tp%XWIDTH(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
605  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK,tp%XWIDTH)
606 !
607  yvar ='SLOPERIV'
608  CALL read_trip(nlisting,yfile_read,yvar,zread)
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)
612  ENDWHERE
613  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK,tp%XSLOPEBED,odouble=ldouble)
614 !
615  tpg%GMASK_VEL(:,:)=tpg%GMASK(:,:)
616  WHERE(tp%XWIDTH(:,:)>=xundef-1.0)
617  tpg%GMASK_VEL(:,:)=.false.
618  ENDWHERE
619 !
620 ENDIF
621 !
622 ! * River depth
623 !
624 IF (lflood.OR.cgroundw == 'DIF') THEN
625 !
626  yvar ='RIVDEPTH'
627  CALL read_trip(nlisting,yfile_read,yvar,zread)
628  tp%XHC_BED(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
629  WHERE(tp%XHC_BED(:,:)==0.0)
630  tp%XHC_BED(:,:)=xundef
631  ENDWHERE
632  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK,tp%XHC_BED)
633 !
634 ENDIF
635 !
636 ! * Groundwater parameters
637 !
638 IF(cgroundw=='CST')THEN
639 !
640  tpg%GMASK_GW(:,:)=tpg%GMASK(:,:)
641 !
642  yvar ='GROUND_STO'
643  CALL read_trip(nlisting,yfile_read_init,yvar,zread)
644  tp%XGROUND_STO(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
645 !
646  tp%XTAUG(:,:)=xtaug_unif
647  WHERE(tpg%GMASK_ANT(:,:).OR.tpg%GMASK_GRE(:,:))
648  tp%XTAUG (:,:)=xundef
649  tpg%GMASK_GW (:,:)=.false.
650  tp%XGROUND_STO(:,:)=0.0
651  ENDWHERE
652 !
653  yvar ='TAUG'
654  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK_GW,tp%XTAUG)
655 !
656  yvar ='GROUND_STO'
657  CALL write_trip(nlisting,yfile_prep,yvar,tpg%GMASK_GW,tp%XGROUND_STO,odouble=ldouble)
658 !
659 ELSEIF(cgroundw=='DIF')THEN
660 !
661  tpg%GMASK_GW(:,:)=tpg%GMASK_VEL(:,:)
662 !
663  yvar ='NUM_AQUI'
664  CALL read_trip(nlisting,yfile_read,yvar,zread)
665  tp%XNUM_AQUI(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
666 !
667  WHERE(tp%XNUM_AQUI(:,:)>=xundef-1.0)
668  tpg%GMASK_GW(:,:)=.false.
669  ENDWHERE
670 !
671  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK_GW,tp%XNUM_AQUI)
672 !
673  IF(zgrid_res > 0.09)THEN
674  zseqmax=5.0
675  ELSE
676  zseqmax=10.0
677  ENDIF
678  tp%XTAUG(:,:)=xtaug_down+(xtaug_up-xtaug_down)*(zseqmax-min(zseqmax,zseq(:,:)))/(zseqmax-1.0)
679 !
680  yvar ='TAUG'
681  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK_GW,tp%XTAUG)
682 !
683  yvar ='WEFF'
684  CALL read_trip(nlisting,yfile_read,yvar,zread)
685  tp%XWEFF(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
686  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK_GW,tp%XWEFF)
687 !
688  yvar ='TRANS'
689  CALL read_trip(nlisting,yfile_read,yvar,zread)
690  tp%XTRANS(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
691  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK_GW,tp%XTRANS)
692 !
693  yvar ='TOPO_RIV'
694  CALL read_trip(nlisting,yfile_read,yvar,zread)
695  tp%XTOPO_RIV(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
696  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK_GW,tp%XTOPO_RIV)
697 !
698  ALLOCATE(zread3d(ilon_g,ilat_g,ndimtab))
699  zread3d(:,:,:)= xundef
700 !
701  ALLOCATE(tp%XTABGW_F (ilon,ilat,ndimtab))
702  ALLOCATE(tp%XTABGW_H (ilon,ilat,ndimtab))
703 !
704  tp%XTABGW_F(:,:,:)= xundef
705  tp%XTABGW_H(:,:,:)= xundef
706 !
707  yvar ='TABGW_F'
708  CALL read_trip(nlisting,yfile_gw_read,yvar,zread3d(:,ilatf:ilat_g,:))
709  tp%XTABGW_F(:,:,:) = zread3d(ilon_deb:ilon_end,ilat_deb:ilat_end,:)
710  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK_GW,tp%XTABGW_F)
711 !
712  yvar ='TABGW_H'
713  CALL read_trip(nlisting,yfile_gw_read,yvar,zread3d(:,ilatf:ilat_g,:))
714  tp%XTABGW_H(:,:,:) = zread3d(ilon_deb:ilon_end,ilat_deb:ilat_end,:)
715  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK_GW,tp%XTABGW_H)
716 !
717  DEALLOCATE(zread3d)
718 !
719 ! Groundwater init from file
720 !
721  yvar ='HGROUND'
722  CALL read_trip(nlisting,yfile_read_init,yvar,zread)
723  tp%XHGROUND(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
724 !
725  WHERE(tpg%GMASK_GW(:,:))
726  tp%XHGROUND(:,:) = max(tp%XHGROUND(:,:),tp%XTOPO_RIV(:,:)-xgwdzmax)
727  ENDWHERE
728 !
729  IF(lgweq)THEN
730 !
731 ! Groundwater equilibrium (appendix B in Vergnes thesis)
732 !
733  ALLOCATE(zhstream(ilon,ilat))
734  ALLOCATE(zdrain(ilon,ilat))
735  ALLOCATE(zhg_old(ilon,ilat))
736 !
737  lwork = .false.
738  zhg_old(:,:) = xundef
739 !
740  yvar ='HSTREAM'
741  CALL read_trip(nlisting,yfile_gw_frc_hd,yvar,zread)
742  zhstream(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
743  zhstream(:,:) = min(tp%XHC_BED(:,:),zhstream(:,:))
744 !
745  yvar ='DRAIN'
746  CALL read_trip(nlisting,yfile_gw_frc_hd,yvar,zread)
747  zdrain(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end) !kg/m2/s
748  zdrain(:,:) = max(0.0,zdrain(:,:)) * tpg%XAREA(:,:) !kg/s
749 !
750  tp%XWEFF (:,:) = 0.0
751 !
752  DO jiter=1,2
753  CALL gwf(tpg, &
754  klon,klat,lwork,xtstep,xtstep, &
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 )
761  ENDDO
762 !
763  DEALLOCATE(zhstream)
764  DEALLOCATE(zdrain )
765  DEALLOCATE(zhg_old )
766 !
767  ENDIF
768 !
769  yvar ='HGROUND'
770  CALL write_trip(nlisting,yfile_prep,yvar,tpg%GMASK_GW,tp%XHGROUND,odouble=ldouble)
771 !
772 ENDIF
773 !
774 ! * Calculate floodplains parameters
775 !
776 IF(lflood)THEN
777 !
778  ALLOCATE(incell_bas(tpg%NBASMAX))
779 !
780  incell_bas(:)=0
781  DO jlat=1,ilat
782  DO jlon=1,ilon
783  jbas=tpg%NBASID(jlon,jlat)
784  IF(jbas>0)THEN
785  incell_bas(jbas)=incell_bas(jbas)+1
786  ENDIF
787  ENDDO
788  ENDDO
789 !
790  yvar ='NFLOOD'
791  CALL read_trip(nlisting,yfile_read,yvar,zread)
792  tp%XN_FLOOD(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
793 !
794  ALLOCATE(zread3d(ilon_g,ilat_g,ndimtab))
795  zread3d(:,:,:)= xundef
796 !
797  ALLOCATE(tp%XTAB_F (ilon,ilat,ndimtab))
798  ALLOCATE(tp%XTAB_H (ilon,ilat,ndimtab))
799  ALLOCATE(tp%XTAB_VF(ilon,ilat,ndimtab))
800 !
801  tp%XTAB_F (:,:,:)= xundef
802  tp%XTAB_H (:,:,:)= xundef
803  tp%XTAB_VF(:,:,:)= xundef
804 !
805  yvar ='TABF'
806  CALL read_trip(nlisting,yfile_flood_read,yvar,zread3d(:,ilatf:ilat_g,:))
807  tp%XTAB_F(:,:,:) = zread3d(ilon_deb:ilon_end,ilat_deb:ilat_end,:)
808  yvar ='TABH'
809  CALL read_trip(nlisting,yfile_flood_read,yvar,zread3d(:,ilatf:ilat_g,:))
810  tp%XTAB_H(:,:,:) = zread3d(ilon_deb:ilon_end,ilat_deb:ilat_end,:)
811  yvar ='TABVF'
812  CALL read_trip(nlisting,yfile_flood_read,yvar,zread3d(:,ilatf:ilat_g,:))
813  tp%XTAB_VF(:,:,:) = zread3d(ilon_deb:ilon_end,ilat_deb:ilat_end,:)
814 !
815  DEALLOCATE(zread3d)
816 !
817  WHERE(tp%XHC_BED(:,:)==xundef)
818  tp%XN_FLOOD(:,:)=xundef
819  ENDWHERE
820 !
821  WHERE(tp%XTAB_F(:,:,1)==xundef)
822  tp%XN_FLOOD(:,:)=xundef
823  ENDWHERE
824 !
825  WHERE(tp%XTAB_H(:,:,1)==xundef)
826  tp%XN_FLOOD(:,:)=xundef
827  ENDWHERE
828 !
829  lwork=(ilat*ilon>zmincell)
830 !
831  DO jlat=1,ilat
832  DO jlon=1,ilon
833  jbas=tpg%NBASID(jlon,jlat)
834  IF(jbas==0)cycle
835 
836  IF(lwork.AND.incell_bas(jbas)<=zmincell)THEN
837  tp%XN_FLOOD(jlon,jlat)=xundef
838  ENDIF
839  ENDDO
840  ENDDO
841 !
842  tpg%GMASK_FLD(:,:)=tpg%GMASK_VEL(:,:)
843  WHERE(tp%XN_FLOOD(:,:)==xundef)
844  tpg%GMASK_FLD(:,:)=.false.
845  ENDWHERE
846 !
847  yvar ='NFLOOD'
848  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK_FLD,tp%XN_FLOOD)
849 !
850  yvar ='TABF'
851  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK_FLD,tp%XTAB_F)
852  yvar ='TABH'
853  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK_FLD,tp%XTAB_H)
854  yvar ='TABVF'
855  CALL write_trip(nlisting,yfile_param,yvar,tpg%GMASK_FLD,tp%XTAB_VF)
856 !
857 ! Floodplains initial variables
858 !
859  IF(lread_flood)THEN
860  yvar ='FLOOD_STO'
861  CALL read_trip(nlisting,yfile_read_init,yvar,zread)
862  tp%XFLOOD_STO(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
863  yvar ='FFLOOD'
864  CALL read_trip(nlisting,yfile_read_init,yvar,zread)
865  tp%XFFLOOD(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
866  yvar ='HFLOOD'
867  CALL read_trip(nlisting,yfile_read_init,yvar,zread)
868  tp%XHFLOOD(:,:) = zread(ilon_deb:ilon_end,ilat_deb:ilat_end)
869  ELSE
870  tp%XFLOOD_STO(:,:) = 0.0
871  tp%XFFLOOD (:,:) = 0.0
872  tp%XHFLOOD (:,:) = 0.0
873  ENDIF
874 !
875  yvar ='FLOOD_STO'
876  CALL write_trip(nlisting,yfile_prep,yvar,tpg%GMASK,tp%XFLOOD_STO,odouble=ldouble)
877 !
878  yvar ='FFLOOD'
879  CALL write_trip(nlisting,yfile_prep,yvar,tpg%GMASK,tp%XFFLOOD,odouble=ldouble)
880 !
881  yvar ='HFLOOD'
882  CALL write_trip(nlisting,yfile_prep,yvar,tpg%GMASK,tp%XHFLOOD,odouble=ldouble)
883 !
884  DEALLOCATE(incell_bas)
885 !
886 ENDIF
887 !
888 DEALLOCATE(zread)
889 !
890 !-------------------------------------------------------------------------------
891 ! * Store current start date
892 !-------------------------------------------------------------------------------
893 !
894  CALL write_trip_date(nlisting,yfile_prep,kyear,kmonth,kday,ptime)
895 !
896 !-------------------------------------------------------------------------------
897 ! * END
898 !-------------------------------------------------------------------------------
899 !
900 WRITE(nlisting,*)''
901 WRITE(nlisting,*)' END PREP TRIP '
902 WRITE(nlisting,*)''
903 IF (lhook) CALL dr_hook('PREP_TRIP_RUN',1,zhook_handle)
904 !
905 !-------------------------------------------------------------------------------
906 END SUBROUTINE prep_trip_run
logical lflood
Definition: modn_trip.F90:62
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)
real xcvel
Definition: modn_trip.F90:45
subroutine init_restart_trip(TPG, KLISTING, HFILE, KLON, KLAT, HTITLE, HTI
real xtstep
Definition: modn_trip.F90:67
subroutine gwf(TPG,
Definition: gwf.F90:3
integer, parameter jprb
Definition: parkind1.F90:32
real, save xgwdzmax
real xgwsubd
Definition: modn_trip.F90:57
character(len=3) cvit
Definition: modn_trip.F90:41
logical lgwsubf
Definition: modn_trip.F90:54
character(len=3) cgroundw
Definition: modn_trip.F90:49
subroutine write_trip_date(KLISTING, HFILE, KYEAR, KMONTH, KDAY, PTIME)
logical lhook
Definition: yomhook.F90:15
subroutine get_trip_grid_conf(TPG, PLONMIN, PLONMAX, PLATMIN, PLATMAX, PRE
integer, save ndimtab
subroutine abort_trip(YTEXT)
Definition: abort_trip.F90:3
real xratmed
Definition: modn_trip.F90:66
subroutine get_lonlat_trip(TPG, KLON, KLAT, PLON, PLAT)
subroutine prep_trip_run(TP, TPG, KYEAR, KMONTH, KDAY, PTIME, KLON, KLAT)
real, save xundef