7 hisba, kluout, ppatch, prunoffd, &
8 pwd0, pwsat, pti_min, &
9 pti_max, pti_mean, pti_std, pti_skew, &
10 psoilwght, ptab_fsat, ptab_wtop, &
52 USE yomhook
,ONLY : lhook, dr_hook
53 USE parkind1
,ONLY : jprb
65 TYPE(isba_t
),
INTENT(INOUT) :: i
67 CHARACTER(LEN=*),
INTENT(IN) :: hisba
72 INTEGER,
INTENT(IN) :: kluout
74 REAL,
DIMENSION(:,:),
INTENT(IN) :: ppatch
76 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: psoilwght
79 REAL,
DIMENSION(:,:),
INTENT(IN) :: prunoffd
81 REAL,
DIMENSION(:,:),
INTENT(IN) :: pwd0, pwsat
87 REAL,
DIMENSION(:),
INTENT(IN) :: pti_min, pti_max, pti_std, &
95 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: ptab_fsat, ptab_wtop, ptab_qtop
100 REAL,
DIMENSION(:),
INTENT(INOUT) :: pm
105 REAL,
DIMENSION(SIZE(PM)) :: zd_top, zwsat_avg, zwd0_avg
108 REAL :: zxi, zphi, znu, zti_mean, zti_min, zti_max, zti_std, zti_skew
114 REAL :: zftot, zymax, zymin
115 REAL :: zgymax, zgymin
122 REAL :: zxsat_ind, zysat, zy0, zdmoy, zxmoy, zfmed, zf0
131 REAL :: zg, zgysat, zgy0
136 REAL :: zd0, zpas, zcor
140 INTEGER :: iflg, iflgst
145 REAL :: zno, zar, ztot
147 REAL :: zfup, zfdown, zqup, zqdown, zslopeq, zwup, zwdown, zslopew
149 INTEGER,
DIMENSION (1):: id
151 INTEGER :: ini, ji, ind, jsi_min, jsi_max, ipas, &
153 REAL(KIND=JPRB) :: zhook_handle
165 IF (lhook) CALL dr_hook(
'INIT_TOP',0,zhook_handle)
168 ipas =
SIZE(ptab_fsat,2)
180 IF (hisba ==
'DIF')
THEN
183 IF (i%NSIZE_NATURE_P(jpatch) == 0 ) cycle
186 zd_top(ji) = zd_top(ji) + ppatch(ji,jpatch)*psoilwght(ji,jl,jpatch)
187 zwsat_avg(ji) = zwsat_avg(ji) + ppatch(ji,jpatch)*psoilwght(ji,jl,jpatch)*pwsat(ji,jl)
188 zwd0_avg(ji) = zwd0_avg(ji) + ppatch(ji,jpatch)*psoilwght(ji,jl,jpatch)*pwd0(ji,jl)
194 zwsat_avg(:)=zwsat_avg(:)/zd_top(:)
195 zwd0_avg(:)=zwd0_avg(:)/zd_top(:)
201 IF (i%NSIZE_NATURE_P(jpatch) == 0 ) cycle
203 zd_top(ji)=zd_top(ji)+prunoffd(ji,jpatch)*ppatch(ji,jpatch)
207 zwsat_avg(:) = pwsat(:,1)
208 zwd0_avg(:) = pwd0(:,1)
224 IF(pti_mean(ji)==xundef)
THEN
230 ptab_wtop(ji,:)=xundef
249 zti_mean=pti_mean(ji)
253 zti_skew=pti_skew(ji)
258 IF(zti_skew<=0.2)
THEN
262 WRITE(kluout,*)
'TI_SKEW is too low or negatif (=',zti_skew,
'),'
263 WRITE(kluout,*)
'then PHI is too big for the grid-cell',ji,
'So,GAMMA(PHI) -> +inf.'
264 WRITE(kluout,*)
'The applied solution is to put TI_SKEW = 0.2'
266 WRITE(kluout,*)
'In addition TI_STD is too low (=',zti_std,
'),'
267 WRITE(kluout,*)
'The applied solution is to put TI_STD = 1.0'
273 zxi = zti_skew*zti_std/x2
274 zphi = (zti_std/zxi)**x2
278 zxi = zti_skew*zti_std/x2
279 zphi = (zti_std/zxi)**x2
283 znu = zti_mean-zphi*zxi
287 pm(ji) =(zwsat_avg(ji)-zwd0_avg(ji))*zd_top(ji)/x4
294 zd0 = (zwsat_avg(ji)-zwd0_avg(ji))*zd_top(ji)/pm(ji)
306 zymin = (zti_min-znu)/zxi
307 zymax = (zti_max-znu)/zxi
311 zcor = abs(min(0.0,zymin))
313 zymin = max(0.0,zymin+zcor)
324 CALL
dgam(zphi,zymin,10.,zg,zgymin,iflg,iflgst)
329 WRITE(kluout,*)
'GRID-CELL =',ji,
'FLGST= ',iflgst,
'PHI= ',zphi,
'YMIN= ',zymin
330 CALL
abor1_sfx(
'INIT_TOP: (1) PROBLEM WITH DGAM FUNCTION')
335 CALL
dgam(zphi,zymax,10.,zg,zgymax,iflg,iflgst)
340 WRITE(kluout,*)
'GRID-CELL =',ji,
'FLGST= ',iflgst,
'PHI= ',zphi,
'YMAX= ',zymax
341 CALL
abor1_sfx(
'INIT_TOP: (2) PROBLEM WITH DGAM FUNCTION')
350 ptab_wtop(ji,1) = zwsat_avg(ji)
351 ptab_fsat(ji,1) = 1.0
352 ptab_qtop(ji,1) = 0.0
354 ptab_wtop(ji,ipas) = zwd0_avg(ji)
355 ptab_fsat(ji,ipas) = 0.0
356 ptab_qtop(ji,ipas) = 0.0
362 zpas = (zti_max-zti_min)/
REAL(ipas-1)
369 DO ind=jsi_min,jsi_max
389 zxsat_ind=zti_min+
REAL(ind-1)*zpas
393 zysat=(zxsat_ind-znu)/zxi
394 zy0 =((zxsat_ind-zd0)-znu)/zxi
398 zysat=max(zymin,min(zysat+zcor,zymax))
399 zy0 =max(zymin,min(zy0 +zcor,zymax))
403 CALL
dgam(zphi,zysat,10.,zg,zgysat,iflg,iflgst)
408 WRITE(kluout,*)
'GRID-CELL= ',ji,
'FLGST= ',iflgst,
'PHI= ',zphi,
'YSAT= ',zysat
409 CALL
abor1_sfx(
'INIT_TOP: (3) PROBLEM WITH DGAM FUNCTION')
414 CALL
dgam(zphi,zy0,10.,zg,zgy0,iflg,iflgst)
419 WRITE(kluout,*)
'GRID-CELL= ',ji,
'FLGST= ',iflgst,
'PHI= ',zphi,
'Y0= ',zy0
420 CALL
abor1_sfx(
'INIT_TOP: (4) PROBLEM WITH DGAM FUNCTION')
425 ptab_fsat(ji,ind)=max(0.0,(zgymax-zgysat)/zftot)
429 zf0=max(0.0,(zgy0-zgymin)/zftot)
433 zfmed=(1.0-ptab_fsat(ji,ind)-zf0)
439 zxmoy = znu+zxi*(zphi-zcor+(exp(-zy0)*(zy0**(zphi/x2))*(zy0**(zphi/x2)) &
440 - exp(-zysat)*(zysat**(zphi/x2))*(zysat**(zphi/x2)))/(zfmed*
gammas(zphi)))
444 zxmoy =max((zxsat_ind-zd0),min(zxsat_ind,zxmoy))
448 zdmoy = zfmed*(zxsat_ind-zxmoy)+zf0*zd0
454 zdmoy = max(0.0,min(zdmoy,zd0))
458 ptab_wtop(ji,ind) = zwsat_avg(ji)-(pm(ji)*zdmoy/zd_top(ji))
462 ptab_qtop(ji,ind) = zfmed*pm(ji)*exp(-zxsat_ind)
476 IF(ptab_wtop(ji,2)==zwsat_avg(ji))
THEN
483 id(:)=maxloc(ptab_wtop(ji,:),ptab_wtop(ji,:)<zwsat_avg(ji))
484 IF (id(1)==0) id(1) = 2
486 zfdown=ptab_fsat(ji,id(1))
487 zwdown=ptab_wtop(ji,id(1))
488 zqdown=ptab_qtop(ji,id(1))
490 zslopew=(zwup-zwdown)/(zfup-zfdown)
491 zslopeq=(zqup-zqdown)/(zfup-zfdown)
494 ptab_wtop(ji,ind)=zwdown+(ptab_fsat(ji,ind)-zfdown)*zslopew
495 ptab_qtop(ji,ind)=zqdown+(ptab_fsat(ji,ind)-zfdown)*zslopeq
502 WHERE(ptab_fsat(ji,:)<=0.0 )
503 ptab_wtop(ji,:)=zwd0_avg(ji)
506 WHERE(ptab_wtop(ji,:)<=zwd0_avg(ji))
513 WRITE(kluout,*)
'-------------------TOPMODEL SUM-UP-------------------------'
514 WRITE(kluout,*)
'Number of grid-cells ',ini,
'Number of Topmodel points',int(ztot)
516 WRITE(kluout,*)
'Percentage of non TOPMODEL grid-cells',(100.*zno/float(ini))
519 WRITE(kluout,*)
'Percentage of arranged (TI-SKE=0.2) grid-cells',(100.*zar/ztot)
521 WRITE(kluout,*)
'-----------------------------------------------------------'
523 IF (lhook) CALL dr_hook(
'INIT_TOP',1,zhook_handle)
subroutine init_top(I, HISBA, KLUOUT, PPATCH, PRUNOFFD, PWD0, PWSAT, PTI_MIN, PTI_MAX, PTI_MEAN, PTI_STD, PTI_SKEW, PSOILWGHT, PTAB_FSAT, PTAB_WTOP, PTAB_QTOP, PM)
subroutine abor1_sfx(YTEXT)
subroutine dgam(A, X, ACC, G, GSTAR, IFLG, IFLGST)