51 USE modd_isba_par
, ONLY : xomrho, xomsph, xomconddry, xomcondsld
61 CHARACTER(LEN=4),
INTENT(IN) :: HRUNOFF
63 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSOC
68 REAL,
DIMENSION(:,:),
INTENT(OUT) :: PFRACSOC
69 INTEGER,
INTENT(IN) :: KPATCH
71 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PWSAT
72 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PWFC
73 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: PWWILT
79 REAL,
DIMENSION(2),
PARAMETER :: ZCONDSAT = (/24.192,0.00864/)
82 REAL,
DIMENSION(2),
PARAMETER :: ZBCOEF = (/2.7,12.0/)
85 REAL,
DIMENSION(2),
PARAMETER :: ZMPOTSAT = (/-0.0103,-0.0101/)
88 REAL,
DIMENSION(2),
PARAMETER :: ZWSAT = (/0.930,0.845/)
93 REAL,
DIMENSION(2),
PARAMETER :: ZWFC = (/0.369,0.719/)
97 REAL,
DIMENSION(2),
PARAMETER :: ZWWILT = (/0.073,0.222/)
101 REAL,
DIMENSION(2),
PARAMETER :: ZWD0 = (/0.212,0.716/)
104 REAL,
DIMENSION(2),
PARAMETER :: ZANISO = (/2.0,48.0/)
108 REAL,
PARAMETER :: ZDGHWSD_TOP = 0.3
109 REAL,
PARAMETER :: ZDGHWSD_SUB = 1.0
110 REAL,
PARAMETER :: ZDGHWSD_INF = 1000.
114 REAL,
DIMENSION(SIZE(PWSAT,1)) :: ZPEAT_PROFILE, ZMOSS_DEPTH
116 REAL,
DIMENSION(SIZE(PWSAT,1)) :: ZMASK, ZRHO_TOP, ZRHO_SUB, ZRHO_INF
118 REAL,
DIMENSION(SIZE(PWSAT,1),SIZE(NP%AL(1)%XDG,2)) :: ZDG_SOIL, ZDZG_SOIL, ZRHO_SOC, ZMID_SOIL
120 REAL,
DIMENSION(SIZE(PWSAT,1),SIZE(NP%AL(1)%XDG,2)) :: ZPEAT_BCOEF,ZPEAT_MPOTSAT,&
121 ZPEAT_WSAT,ZPEAT_WFC, &
122 ZPEAT_WWILT,ZPEAT_WD0, &
123 ZPEAT_ANISO, ZPEAT_RHO
125 REAL,
DIMENSION(SIZE(PWSAT,1),SIZE(NP%AL(1)%XDG,2),KPATCH) :: ZPEAT_CONDSAT, ZMID_CONDSAT
127 REAL,
DIMENSION(SIZE(PWSAT,1)) :: ZREFDEPTH,ZF_BCOEF,ZF_MPOTSAT, &
128 ZLOG_MOSS,ZLOG_PEAT_DEPTH , &
129 ZF_WSAT,ZF_CONDSAT,ZF_WFC, &
130 ZF_WWILT, ZF_WD0, ZF_ANISO
132 REAL :: ZA, ZB, ZLOG1, ZLOG2, ZMOSS_DENSITY, &
133 ZTOP, ZSUB, ZFTOP, ZFSUB
135 REAL,
DIMENSION(2) :: ZLOG_CONDSAT,ZLOG_BCOEF,ZLOG_MPOTSAT, &
136 ZLOG_WSAT,ZLOG_WFC,ZLOG_WWILT,ZLOG_WD0,&
139 INTEGER :: INI, INL, INP, JI, JL, JP, IMASK
141 REAL(KIND=JPRB) :: ZHOOK_HANDLE
145 IF (
lhook)
CALL dr_hook(
'ISBA_SOC_PARAMETERS',0,zhook_handle)
148 inl =
SIZE(np%AL(1)%XDG,2)
159 zpeat_bcoef(:,: )=0.0
160 zpeat_mpotsat(:,: )=0.0
163 zpeat_wwilt(:,: )=0.0
165 zpeat_aniso(:,: )=0.0
166 zpeat_condsat(:,:,:)=0.0
177 IF(pk%XPATCH(ji)>0.0)
THEN 178 zmask(imask)=zmask(imask)+pk%XPATCH(ji)
180 zdg_soil(imask,jl)= zdg_soil(imask,jl) + pk%XDG(ji,jl)*pk%XPATCH(ji)
187 WHERE (zmask(:)/=0.) zdg_soil(:,jl) = zdg_soil(:,jl)/zmask(:)
190 zdzg_soil(:,1)=zdg_soil(:,1)
193 zdzg_soil(ji,jl)=zdg_soil(ji,jl)-zdg_soil(ji,jl-1)
197 zmid_soil(:,1)=0.5*zdg_soil(:,1)
200 zmid_soil(ji,jl)=0.5*(zdg_soil(ji,jl)+zdg_soil(ji,jl-1))
209 IF(pk%XPATCH(ji)/=
xundef)
THEN 210 zmid_condsat(imask,jl,jp)=zmid_soil(imask,jl)
220 zlog1=log(zdghwsd_top/zdghwsd_sub)
221 zlog2=log(zdghwsd_inf/zdghwsd_sub)
223 IF(zmask(ji)>0.0)
THEN 224 zrho_top(ji) = psoc(ji,1)/zdghwsd_top
225 zrho_sub(ji) = psoc(ji,2)/(zdghwsd_sub-zdghwsd_top)
226 IF(zrho_top(ji)>zrho_sub(ji))
THEN 227 zb = log(psoc(ji,1)/(psoc(ji,1)+psoc(ji,2)))/zlog1
228 za = (psoc(ji,1)+psoc(ji,2))/(zdghwsd_inf-zdghwsd_sub)
229 zrho_inf(ji) = za*(exp(zb*zlog2)-1.0)
231 zrho_inf(ji) = zrho_sub(ji)
244 zsub=zsub+zdzg_soil(ji,jl)
245 IF(zsub<=zdghwsd_top)
THEN 246 zrho_soc(ji,jl)=zrho_top(ji)
247 ELSEIF(ztop>=zdghwsd_top.AND.zsub<=zdghwsd_sub)
THEN 248 zrho_soc(ji,jl)=zrho_sub(ji)
249 ELSEIF(ztop>=zdghwsd_sub)
THEN 250 zrho_soc(ji,jl)=zrho_inf(ji)
251 ELSEIF(ztop<zdghwsd_top.AND.zsub>zdghwsd_top)
THEN 252 zftop=min(1.0,max(0.0,zdghwsd_top-ztop))/(zsub-ztop)
253 zfsub=min(1.0,max(0.0,zsub-zdghwsd_top))/(zsub-ztop)
254 zrho_soc(ji,jl)=zftop*zrho_top(ji)+zfsub*zrho_sub(ji)
255 ELSEIF(ztop<zdghwsd_sub.AND.zsub>zdghwsd_sub)
THEN 256 zftop=min(1.0,max(0.0,zdghwsd_sub-ztop))/(zsub-ztop)
257 zfsub=min(1.0,max(0.0,zsub-zdghwsd_sub))/(zsub-ztop)
258 zrho_soc(ji,jl)=zftop*zrho_sub(ji)+zfsub*zrho_inf(ji)
267 zlog_condsat(:) = log(zcondsat(:))
268 zlog_bcoef(:) = log(zbcoef(:))
269 zlog_mpotsat(:) = log(-zmpotsat(:))
270 zlog_wsat(:) = log(zwsat(:))
271 zlog_wfc(:) = log(zwfc(:))
272 zlog_wwilt(:) = log(zwwilt(:))
273 zlog_wd0(:) = log(zwd0(:))
274 zlog_aniso(:) = log(zaniso(:))
276 zpeat_profile(:) = 1.0
278 zmoss_density=(1.0-zwsat(1))*xomrho
280 WHERE(zrho_top(:)<zmoss_density)
281 zmoss_depth(:) = 2.5e-3
283 zmoss_depth(:) = 0.01
288 zlog_moss(:) = log(zmoss_depth(:))
289 zlog_peat_depth(:) = log(zpeat_profile(:))
291 zf_condsat(:) =(zlog_condsat(2)-zlog_condsat(1))/(zlog_peat_depth(:)-zlog_moss(:))
292 zf_bcoef(:) =(zlog_bcoef(2)-zlog_bcoef(1))/(zlog_peat_depth(:)-zlog_moss(:))
293 zf_mpotsat(:) =(zlog_mpotsat(2)-zlog_mpotsat(1))/(zlog_peat_depth(:)-zlog_moss(:))
294 zf_wsat(:) =(zlog_wsat(2)-zlog_wsat(1))/(zlog_peat_depth(:)-zlog_moss(:))
295 zf_wfc(:) =(zlog_wfc(2)-zlog_wfc(1))/(zlog_peat_depth(:)-zlog_moss(:))
296 zf_wwilt(:) =(zlog_wwilt(2)-zlog_wwilt(1))/(zlog_peat_depth(:)-zlog_moss(:))
297 zf_wd0(:) =(zlog_wd0(2)-zlog_wd0(1))/(zlog_peat_depth(:)-zlog_moss(:))
298 zf_aniso(:) =(zlog_aniso(2)-zlog_aniso(1))/(zlog_peat_depth(:)-zlog_moss(:))
308 IF(zmask(ji)>0.0)
THEN 310 zrefdepth(ji)=min(zpeat_profile(ji),max(zmoss_depth(ji),zmid_soil(ji,jl)))
311 zrefdepth(ji)=log(zrefdepth(ji))-zlog_moss(ji)
312 zpeat_mpotsat(ji,jl)=zmpotsat(1)*exp(zf_mpotsat(ji)*zrefdepth(ji))
313 zpeat_wsat(ji,jl)=zwsat(1)*exp(zf_wsat(ji)*zrefdepth(ji))
314 zpeat_bcoef(ji,jl)=zbcoef(1)*exp(zf_bcoef(ji)*zrefdepth(ji))
315 zpeat_wwilt(ji,jl)=zwwilt(1)*exp(zf_wwilt(ji)*zrefdepth(ji))
316 zpeat_wd0(ji,jl)=zwd0(1)*exp(zf_wd0(ji)*zrefdepth(ji))
317 zpeat_aniso(ji,jl)=zaniso(1)*exp(zf_aniso(ji)*zrefdepth(ji))
318 zpeat_wfc(ji,jl)=zwfc(1)*exp(zf_wfc(ji)*zrefdepth(ji))
320 zpeat_rho(ji,jl)=(1.0-zpeat_wsat(ji,jl))*xomrho
323 IF (ji>np%AL(jp)%NSIZE_P) cycle
324 imask = np%AL(jp)%NR_P(ji)
325 IF(np%AL(jp)%XPATCH(ji)/=
xundef)
THEN 326 zrefdepth(imask)=min(zpeat_profile(imask),max(zmoss_depth(imask),zmid_condsat(imask,jl,jp)))
327 zrefdepth(imask)=log(zrefdepth(imask))-zlog_moss(imask)
328 zpeat_condsat(imask,jl,jp)=zcondsat(1)*exp(zf_condsat(imask)*zrefdepth(imask))/
xday 340 IF(zmask(ji)>0.0)
THEN 342 pfracsoc(ji,jl) = min(1.0,zrho_soc(ji,jl)/zpeat_rho(ji,jl))
344 k%XHCAPSOIL(ji,jl) = (1.0-pfracsoc(ji,jl))*k%XHCAPSOIL(ji,jl) + pfracsoc(ji,jl)*xomrho*xomsph
345 k%XCONDDRY (ji,jl) = (k%XCONDDRY(ji,jl)**(1.0-pfracsoc(ji,jl))) * (xomconddry**pfracsoc(ji,jl))
346 k%XCONDSLD (ji,jl) = (k%XCONDSLD(ji,jl)**(1.0-pfracsoc(ji,jl))) * (xomcondsld**pfracsoc(ji,jl))
348 k%XBCOEF (ji,jl) = (1.0-pfracsoc(ji,jl))*k%XBCOEF (ji,jl) + pfracsoc(ji,jl)*zpeat_bcoef(ji,jl)
349 k%XMPOTSAT(ji,jl) = (1.0-pfracsoc(ji,jl))*k%XMPOTSAT(ji,jl) + pfracsoc(ji,jl)*zpeat_mpotsat(ji,jl)
350 pwsat(ji,jl) = (1.0-pfracsoc(ji,jl))*pwsat(ji,jl) + pfracsoc(ji,jl)*zpeat_wsat(ji,jl)
351 pwfc(ji,jl) = (1.0-pfracsoc(ji,jl))*pwfc(ji,jl) + pfracsoc(ji,jl)*zpeat_wfc(ji,jl)
352 pwwilt(ji,jl) = (1.0-pfracsoc(ji,jl))*pwwilt(ji,jl) + pfracsoc(ji,jl)*zpeat_wwilt(ji,jl)
362 IF(pk%XPATCH(ji)/=
xundef .AND. zmask(imask)>0.0)
THEN 363 pk%XCONDSAT (ji,jl) = pk%XCONDSAT(ji,jl)**(1.0-pfracsoc(imask,jl)) * &
364 zpeat_condsat(imask,jl,jp)**pfracsoc(imask,jl)
370 IF(hrunoff==
'SGH')
THEN 373 IF(zmask(ji)>0.0)
THEN 374 k%XWD0 (ji,jl) = (1.0-pfracsoc(ji,jl))*k%XWD0 (ji,jl) + pfracsoc(ji,jl)*zpeat_wd0(ji,jl)
375 k%XKANISO(ji,jl) = (1.0-pfracsoc(ji,jl))*k%XKANISO(ji,jl) + pfracsoc(ji,jl)*zpeat_aniso(ji,jl)
383 IF (
lhook)
CALL dr_hook(
'ISBA_SOC_PARAMETERS',1,zhook_handle)
subroutine isba_soc_parameters(HRUNOFF, PSOC, K, NP, PFRACSOC, PWSAT, PWFC, PWWILT, KPATCH)