5 SUBROUTINE ice_soilfr(HSNOW_ISBA, HSOILFRZ, PTSTEP, PKSFC_IVEG, PCG, PCT, &
6 ppsng, pffg, ptauice, pdwgi1, pdwgi2, pwsatz, &
7 pmpotsatz, pbcoefz, pd_g, ptg, pwgi, pwg )
61 USE modd_csts, ONLY : xcl, xtt, xpi, xday, xci, xrholi, &
62 xlmtt, xrholw, xg, xcondi
66 USE yomhook
,ONLY : lhook, dr_hook
67 USE parkind1
,ONLY : jprb
74 CHARACTER(LEN=*),
INTENT(IN) :: hsnow_isba
79 CHARACTER(LEN=*),
INTENT(IN) :: hsoilfrz
84 REAL,
INTENT (IN) :: ptstep
87 REAL,
DIMENSION(:),
INTENT(IN) :: pksfc_iveg
90 REAL,
DIMENSION(:),
INTENT(IN) :: ptauice
93 REAL,
DIMENSION(:),
INTENT(IN) :: ppsng
96 REAL,
DIMENSION(:),
INTENT(IN) :: pffg
99 REAL,
DIMENSION(:),
INTENT (IN) :: pcg, pct
103 REAL,
DIMENSION(:,:),
INTENT(IN) :: pd_g, pwsatz
107 REAL,
DIMENSION(:,:),
INTENT(IN) :: pmpotsatz, pbcoefz
111 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: pwg, pwgi, ptg
116 REAL,
DIMENSION(:),
INTENT(OUT) :: pdwgi1, pdwgi2
127 REAL,
DIMENSION(SIZE(PCG)) :: zksfc_frz, zfreezing, zice_melt, zwim, &
128 zwit, zwgi1, zwgi2, zwm, zsoilheatcap, &
129 ziceeff, zeffic, ztauice, &
130 zwgmin, ztgmax, zmatpot, zdeltat
148 REAL,
DIMENSION(SIZE(PCG)) :: zwsat_avgz
151 REAL,
DIMENSION(SIZE(PCG)) :: zpsng
163 REAL,
PARAMETER :: zinsolfrz_veg = 0.20
165 REAL,
PARAMETER :: zinsolfrz_lai = 30.0
167 REAL,
PARAMETER :: zeffic_min = 0.01
179 REAL,
DIMENSION(SIZE(PCG)) :: zwork1, zwork2, ztdiurn
181 REAL(KIND=JPRB) :: zhook_handle
186 IF (lhook) CALL dr_hook(
'ICE_SOILFR',0,zhook_handle)
194 zsoilheatcap(:) = 0.0
200 zwsat_avgz(:) = xundef
212 IF(hsnow_isba ==
'3-L' .OR. hsnow_isba ==
'CRO')
THEN
215 zpsng(:) = ppsng(:)+pffg(:)
221 zksoil = (0.5 * sqrt(xcondi*xci*xrholi*xday/xpi))/xlmtt
223 ztauice(:) = max(ptstep,ptauice(:))
238 zwsat_avgz(jj) = pwsatz(jj,1)
242 zksfc_frz(jj) = zksoil * pksfc_iveg(jj)
248 IF(hsoilfrz ==
'LWT')
THEN
257 zmatpot(jj) = min(pmpotsatz(jj,1), xlmtt*(ptg(jj,1)-xtt)/(xg*ptg(jj,1)) )
258 zwgmin(jj) = zwsat_avgz(jj)*( (zmatpot(jj)/pmpotsatz(jj,1))**(-1./pbcoefz(jj,1)) )
260 zmatpot(jj) = pmpotsatz(jj,1)*( (pwg(jj,1)/zwsat_avgz(jj))**(-pbcoefz(jj,1)) )
261 ztgmax(jj) = xlmtt*xtt/(xlmtt - xg* zmatpot(jj))
270 zdeltat(jj) = ptg(jj,1) - ztgmax(jj)
272 zwork2(jj) = xrholw*pd_g(jj,1)
273 zeffic(jj) = max(zeffic_min,(pwg(jj,1)-xwgmin)/zwsat_avgz(jj))
274 zfreezing(jj) = min( max(0.0,pwg(jj,1)-zwgmin(jj))*zwork2(jj), &
275 zksfc_frz(jj)*zeffic(jj)*max( -zdeltat(jj), 0.) )
280 zeffic(jj) = max(zeffic_min,pwgi(jj,1)/(zwsat_avgz(jj)-xwgmin))
281 zice_melt(jj) = min( pwgi(jj,1)*zwork2(jj), &
282 zksfc_frz(jj)*zeffic(jj)*max( zdeltat(jj), 0. ) )
289 zwgi1(jj) = pwgi(jj,1) + (ptstep/ztauice(jj))*(1.0-zpsng(jj))* &
290 (zfreezing(jj) - zice_melt(jj))/zwork2(jj)
293 zwgi1(jj) = max( zwgi1(jj) , 0. )
294 zwgi1(jj) = min( zwgi1(jj) , zwsat_avgz(jj)-xwgmin)
298 pdwgi1(jj) = zwgi1(jj) - pwgi(jj,1)
304 ptg(jj,1) = ptg(jj,1) + pdwgi1(jj)*xlmtt*pct(jj)*zwork2(jj)
313 zwork1(jj) = pd_g(jj,1)/pd_g(jj,2)
317 zwim(jj) = ( pwgi(jj,2) - zwork1(jj) * pwgi(jj,1) ) / ( 1. - zwork1(jj) )
319 zwim(jj) = max(0.,zwim(jj))
324 zwm(jj) = ( pwg(jj,2) - zwork1(jj) * pwg(jj,1) ) / ( 1. - zwork1(jj) )
331 zsoilheatcap(jj) = xcl*xrholw*pwg(jj,2) + &
332 xci*xrholi*pwgi(jj,2) + &
333 xsphsoil*xdrywght*(1.0-zwsat_avgz(jj))*(1.0-zwsat_avgz(jj))
339 ztdiurn(jj) = min(pd_g(jj,2), 4./(zsoilheatcap(jj)*pcg(jj)))
343 ziceeff(jj) = (pwgi(jj,2)/(pwgi(jj,2)+pwg(jj,2)))*pd_g(jj,2)
347 IF(hsoilfrz ==
'LWT')
THEN
357 zmatpot(jj) = min(pmpotsatz(jj,1), xlmtt*(ptg(jj,2)-xtt)/(xg*ptg(jj,2)) )
358 zwgmin(jj) = zwsat_avgz(jj)*( (zmatpot(jj)/pmpotsatz(jj,1))**(-1./pbcoefz(jj,1)) )
360 zmatpot(jj) = pmpotsatz(jj,1)*( (pwg(jj,2)/zwsat_avgz(jj))**(-pbcoefz(jj,1)) )
361 ztgmax(jj) = xlmtt*xtt/(xlmtt - xg* zmatpot(jj))
374 zdeltat(jj) = ptg(jj,2) - ztgmax(jj)
376 zwork1(jj) = pd_g(jj,1)/pd_g(jj,2)
377 zwork2(jj) = xrholw*(pd_g(jj,2)-pd_g(jj,1))
380 IF (ziceeff(jj) <= ztdiurn(jj))
THEN
382 zeffic(jj) = max(zeffic_min, max(0.0,zwm(jj) - xwgmin)/zwsat_avgz(jj))
383 zfreezing(jj) = min( max(0.0, zwm(jj) - zwgmin(jj))* zwork2(jj), &
384 zksoil*zeffic(jj)*max( -zdeltat(jj) , 0. ) )
391 zeffic(jj) = max(zeffic_min, zwim(jj)/(zwsat_avgz(jj)-xwgmin))
392 zice_melt(jj) = min( zwim(jj)*zwork2(jj), &
393 zksoil*zeffic(jj)*max( zdeltat(jj) , 0. ) )
399 zwit(jj) = zwim(jj) + (ptstep/ztauice(jj))*(1.0-zpsng(jj))* &
400 ((zfreezing(jj) - zice_melt(jj))/ zwork2(jj))
402 zwit(jj) = max( zwit(jj) , 0. )
403 zwit(jj) = min( zwit(jj) , zwsat_avgz(jj)-xwgmin)
409 zwgi2(jj) = (1.-zwork1(jj))*zwit(jj) + zwork1(jj)*zwgi1(jj)
411 pdwgi2(jj) = zwgi2(jj) - pwgi(jj,2)
417 ptg(jj,2) = ptg(jj,2) + pdwgi2(jj)*xlmtt*pcg(jj)*xrholw*pd_g(jj,2)
421 IF (lhook) CALL dr_hook(
'ICE_SOILFR',1,zhook_handle)
subroutine ice_soilfr(HSNOW_ISBA, HSOILFRZ, PTSTEP, PKSFC_IVEG, PCG, PCT, PPSNG, PFFG, PTAUICE, PDWGI1, PDWGI2, PWSATZ, PMPOTSATZ, PBCOEFZ, PD_G, PTG, PWGI, PWG)