6 SUBROUTINE ice_soildif(PTSTEP, PTAUICE, PKSFC_IVEG, PLEGI, &
7 psoilhcapz, pwsatz, pmpotsatz, pbcoefz, &
8 ptg, pwgi, pwg, kwg_layer, &
80 USE modd_csts, ONLY : xlmtt, xtt, xg, xci, xrholi, xrholw
83 USE yomhook
,ONLY : lhook, dr_hook
84 USE parkind1
,ONLY : jprb
90 REAL,
INTENT(IN) :: ptstep
92 REAL,
DIMENSION(:),
INTENT(IN) :: ptauice, pksfc_iveg, plegi
98 REAL,
DIMENSION(:,:),
INTENT(IN) :: psoilhcapz, pwsatz
102 REAL,
DIMENSION(:,:),
INTENT(IN) :: pdzg
105 REAL,
DIMENSION(:,:),
INTENT(IN) :: pmpotsatz, pbcoefz
109 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: ptg, pwgi, pwg
114 INTEGER,
DIMENSION(:),
INTENT(IN) :: kwg_layer
117 REAL,
DIMENSION(:),
INTENT(OUT) :: pwgi_excess
128 REAL,
DIMENSION(SIZE(PTG,1),SIZE(PTG,2)) :: zk, zexcessfc
130 REAL,
DIMENSION(SIZE(PTG,1)) :: zexcess
132 REAL :: zwgmax, zpsimax, zpsi, zdeltat, &
133 zphase, ztgm, zwgm, zwgim, zlog, &
134 zeffic, zphasem, zphasef, zwork, &
137 REAL(KIND=JPRB) :: zhook_handle
143 IF (lhook) CALL dr_hook(
'ICE_SOILDIF',0,zhook_handle)
145 ini =
SIZE(ptg(:,:),1)
146 inl = maxval(kwg_layer(:))
158 zk(:,1) = pksfc_iveg(:)
176 zpsimax = min(pmpotsatz(jj,jl),xlmtt*(ptg(jj,jl)-xtt)/(xg*ptg(jj,jl)))
178 zwork = zpsimax/pmpotsatz(jj,jl)
179 zlog = log(zwork)/pbcoefz(jj,jl)
180 zwgmax = pwsatz(jj,jl)*exp(-zlog)
186 zwork = pwg(jj,jl)/pwsatz(jj,jl)
187 zlog = pbcoefz(jj,jl)*log(zwork)
188 zpsi = pmpotsatz(jj,jl)*exp(-zlog)
190 zdeltat = ptg(jj,jl) - xlmtt*xtt/(xlmtt-xg*zpsi)
200 zwork = (xci*xrholi/(xlmtt*xrholw))*zk(jj,jl)*max(0.0,-zdeltat)
203 IF(zdeltat<0.0.AND.zwgm>=zwgmax.AND.zwork>=max(0.0,zwgm-zwgmax))
THEN
204 zappheatcap = -(xtt*xrholw*xlmtt*xlmtt/xg)*zwgmax/(zpsimax*pbcoefz(jj,jl)*ztgm*ztgm)
208 zphasem = (ptstep/ptauice(jj))*min(zk(jj,jl)*xci*xrholi*max(0.0,zdeltat),zwgim*xlmtt*xrholw)
211 zphasef = (ptstep/ptauice(jj))*min(zk(jj,jl)*xci*xrholi*max(0.0,-zdeltat),max(0.0,zwgm-zwgmax)*xlmtt*xrholw)
214 ptg(jj,jl) = ztgm + (zphasef - zphasem)/(psoilhcapz(jj,jl)+zappheatcap)
217 zphase = (psoilhcapz(jj,jl)+zappheatcap)*(ptg(jj,jl)-ztgm)
220 pwgi(jj,jl) = zwgim + zphase/(xlmtt*xrholw)
221 pwg(jj,jl) = zwgm - zphase/(xlmtt*xrholw)
230 pwgi(:,1) = pwgi(:,1) - plegi(:)*ptstep/pdzg(:,1)
239 zexcess(:) = max(0.0, - pwgi(:,1))
240 pwg(:,1) = pwg(:,1) - zexcess(:)
241 pwgi(:,1) = pwgi(:,1) + zexcess(:)
242 zexcessfc(:,1)= zexcessfc(:,1) - zexcess(:)
257 zexcess(jj) = max(0.0, pwgi(jj,jl) - (pwsatz(jj,jl)-xwgmin) )
258 pwgi(jj,jl) = pwgi(jj,jl) - zexcess(jj)
259 zexcessfc(jj,jl) = zexcessfc(jj,jl) + zexcess(jj)
261 pwgi(jj,jl+1) = pwgi(jj,jl+1) + zexcess(jj)*(pdzg(jj,jl)/pdzg(jj,jl+1))
262 zexcessfc(jj,jl+1)= zexcessfc(jj,jl+1) - zexcess(jj)*(pdzg(jj,jl)/pdzg(jj,jl+1))
264 pwgi_excess(jj) = zexcess(jj)*pdzg(jj,idepth)*xrholw/ptstep
276 IF(jl<=idepth.AND.pwgi(jj,jl)>0.0.AND.pwgi(jj,jl)<1.0e-6)
THEN
277 pwg(jj,jl) = pwg(jj,jl) + pwgi(jj,jl)
278 zexcessfc(jj,jl) = zexcessfc(jj,jl) + pwgi(jj,jl)
281 ptg(jj,jl) = ptg(jj,jl) - zexcessfc(jj,jl)*xlmtt*xrholw/psoilhcapz(jj,jl)
286 IF (lhook) CALL dr_hook(
'ICE_SOILDIF',1,zhook_handle)
subroutine ice_soildif(PTSTEP, PTAUICE, PKSFC_IVEG, PLEGI, PSOILHCAPZ, PWSATZ, PMPOTSATZ, PBCOEFZ, PTG, PWGI, PWG, KWG_LAYER, PDZG, PWGI_EXCESS)