7 pcondsat,pwsat,phcapsoil,pconddry,pcondsld,&
8 pwfc,pwwilt,pwd0,paniso,pfracsoc )
51 USE modd_isba_par, ONLY : xomrho, xomsph, xomconddry, xomcondsld
53 USE yomhook
,ONLY : lhook, dr_hook
54 USE parkind1
,ONLY : jprb
61 CHARACTER(LEN=4),
INTENT(IN) :: hrunoff
63 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: pdg
65 REAL,
DIMENSION(:,:),
INTENT(IN) :: ppatch
67 REAL,
DIMENSION(:,:),
INTENT(IN) :: psoc
69 REAL,
DIMENSION(:,:,:),
INTENT(INOUT) :: pcondsat
71 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: pbcoef,pmpotsat, &
75 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: pwsat,pwfc,pwwilt,pwd0
77 REAL,
DIMENSION(:,:),
INTENT(INOUT) :: paniso
79 REAL,
DIMENSION(:,:),
INTENT(OUT) :: pfracsoc
83 REAL,
DIMENSION(2),
PARAMETER :: zcondsat = (/24.192,0.00864/)
86 REAL,
DIMENSION(2),
PARAMETER :: zbcoef = (/2.7,12.0/)
89 REAL,
DIMENSION(2),
PARAMETER :: zmpotsat = (/-0.0103,-0.0101/)
92 REAL,
DIMENSION(2),
PARAMETER :: zwsat = (/0.930,0.845/)
97 REAL,
DIMENSION(2),
PARAMETER :: zwfc = (/0.369,0.719/)
101 REAL,
DIMENSION(2),
PARAMETER :: zwwilt = (/0.073,0.222/)
105 REAL,
DIMENSION(2),
PARAMETER :: zwd0 = (/0.212,0.716/)
108 REAL,
DIMENSION(2),
PARAMETER :: zaniso = (/2.0,48.0/)
112 REAL,
PARAMETER :: zdghwsd_top = 0.3
113 REAL,
PARAMETER :: zdghwsd_sub = 1.0
114 REAL,
PARAMETER :: zdghwsd_inf = 1000.
118 REAL,
DIMENSION(SIZE(PDG,1)) :: zpeat_profile, zmoss_depth
120 REAL,
DIMENSION(SIZE(PDG,1)) :: zmask, zrho_top, zrho_sub, zrho_inf
122 REAL,
DIMENSION(SIZE(PDG,1),SIZE(PDG,2)) :: zdg_soil, zdzg_soil, zrho_soc, zmid_soil
124 REAL,
DIMENSION(SIZE(PDG,1),SIZE(PDG,2)) :: zpeat_bcoef,zpeat_mpotsat,&
125 zpeat_wsat,zpeat_wfc, &
126 zpeat_wwilt,zpeat_wd0, &
127 zpeat_aniso, zpeat_rho
129 REAL,
DIMENSION(SIZE(PDG,1),SIZE(PDG,2),SIZE(PDG,3)) :: zpeat_condsat, zmid_condsat
131 REAL,
DIMENSION(SIZE(PDG,1)) :: zrefdepth,zf_bcoef,zf_mpotsat, &
132 zlog_moss,zlog_peat_depth , &
133 zf_wsat,zf_condsat,zf_wfc, &
134 zf_wwilt, zf_wd0, zf_aniso
136 REAL :: za, zb, zlog1, zlog2, zmoss_density, &
137 ztop, zsub, zftop, zfsub
139 REAL,
DIMENSION(2) :: zlog_condsat,zlog_bcoef,zlog_mpotsat, &
140 zlog_wsat,zlog_wfc,zlog_wwilt,zlog_wd0,&
143 INTEGER :: ini, inl, inp, ji, jl, jp
145 REAL(KIND=JPRB) :: zhook_handle
149 IF (lhook) CALL dr_hook(
'ISBA_SOC_PARAMETERS',0,zhook_handle)
164 zpeat_bcoef(:,: )=0.0
165 zpeat_mpotsat(:,: )=0.0
168 zpeat_wwilt(:,: )=0.0
170 zpeat_aniso(:,: )=0.0
171 zpeat_condsat(:,:,:)=0.0
179 zmask(ji)=zmask(ji)+ppatch(ji,jp)
185 IF(zmask(ji)>0.0)
THEN
186 zdg_soil(ji,jl)=sum(pdg(ji,jl,:)*ppatch(ji,:),ppatch(ji,:)>0.0) &
187 /sum(ppatch(ji,:),ppatch(ji,:)>0.0)
192 zdzg_soil(:,1)=zdg_soil(:,1)
195 zdzg_soil(ji,jl)=zdg_soil(ji,jl)-zdg_soil(ji,jl-1)
199 zmid_soil(:,1)=0.5*zdg_soil(:,1)
202 zmid_soil(ji,jl)=0.5*(zdg_soil(ji,jl)+zdg_soil(ji,jl-1))
209 IF(ppatch(ji,jp)/=xundef)
THEN
210 zmid_condsat(ji,jl,jp)=zmid_soil(ji,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(ppatch(ji,jp)/=xundef)
THEN
324 zrefdepth(ji)=min(zpeat_profile(ji),max(zmoss_depth(ji),zmid_condsat(ji,jl,jp)))
325 zrefdepth(ji)=log(zrefdepth(ji))-zlog_moss(ji)
326 zpeat_condsat(ji,jl,jp)=zcondsat(1)*exp(zf_condsat(ji)*zrefdepth(ji))/xday
338 IF(zmask(ji)>0.0)
THEN
340 pfracsoc(ji,jl ) = min(1.0,zrho_soc(ji,jl)/zpeat_rho(ji,jl))
342 phcapsoil(ji,jl ) = (1.0-pfracsoc(ji,jl))*phcapsoil(ji,jl) + pfracsoc(ji,jl)*xomrho*xomsph
343 pconddry(ji,jl ) = (pconddry(ji,jl)**(1.0-pfracsoc(ji,jl))) * (xomconddry**pfracsoc(ji,jl))
344 pcondsld(ji,jl ) = (pcondsld(ji,jl)**(1.0-pfracsoc(ji,jl))) * (xomcondsld**pfracsoc(ji,jl))
346 pbcoef(ji,jl ) = (1.0-pfracsoc(ji,jl))*pbcoef(ji,jl) + pfracsoc(ji,jl)*zpeat_bcoef(ji,jl)
347 pmpotsat(ji,jl ) = (1.0-pfracsoc(ji,jl))*pmpotsat(ji,jl) + pfracsoc(ji,jl)*zpeat_mpotsat(ji,jl)
348 pwsat(ji,jl ) = (1.0-pfracsoc(ji,jl))*pwsat(ji,jl) + pfracsoc(ji,jl)*zpeat_wsat(ji,jl)
349 pwfc(ji,jl ) = (1.0-pfracsoc(ji,jl))*pwfc(ji,jl) + pfracsoc(ji,jl)*zpeat_wfc(ji,jl)
350 pwwilt(ji,jl ) = (1.0-pfracsoc(ji,jl))*pwwilt(ji,jl) + pfracsoc(ji,jl)*zpeat_wwilt(ji,jl)
352 IF(ppatch(ji,jp)/=xundef)
THEN
353 pcondsat(ji,jl,jp) = pcondsat(ji,jl,jp)**(1.0-pfracsoc(ji,jl))*zpeat_condsat(ji,jl,jp)**pfracsoc(ji,jl)
360 IF(hrunoff==
'SGH')
THEN
363 IF(zmask(ji)>0.0)
THEN
364 pwd0(ji,jl) = (1.0-pfracsoc(ji,jl))*pwd0(ji,jl) + pfracsoc(ji,jl)*zpeat_wd0(ji,jl)
365 paniso(ji,jl) = (1.0-pfracsoc(ji,jl))*paniso(ji,jl) + pfracsoc(ji,jl)*zpeat_aniso(ji,jl)
373 IF (lhook) CALL dr_hook(
'ISBA_SOC_PARAMETERS',1,zhook_handle)
subroutine isba_soc_parameters(HRUNOFF, PPATCH, PDG, PSOC, PBCOEF, PMPOTSAT, PCONDSAT, PWSAT, PHCAPSOIL, PCONDDRY, PCONDSLD, PWFC, PWWILT, PWD0, PANISO, PFRACSOC)