6 SUBROUTINE init_veg_pgd_n (ISSK, DTI, IO, S, K, KK, PK, PEK, AGK, KI, &
7 HPROGRAM, HSURF, KLUOUT, KSIZE, KMONTH, &
8 ODEEPSOIL, OPHYSDOMC, PTDEEP_CLI, PGAMMAT_CLI, &
9 OAGRIP, PTHRESHOLD, HINIT, PCO2, PRHOA )
55 USE modd_data_cover_par
, ONLY : nvegtype
58 USE modd_snow_par
, ONLY : xemissn
59 USE modd_isba_par
, ONLY : xtau_ice
68 USE modi_subscale_z0eff
76 USE modi_dry_wet_soil_albedos
88 TYPE(
sso_t),
INTENT(INOUT) :: ISSK
97 TYPE(
agri_t),
INTENT(INOUT) :: AGK
99 INTEGER,
INTENT(IN) :: KI
101 CHARACTER(LEN=6),
INTENT(IN) :: HPROGRAM
102 CHARACTER(LEN=6),
INTENT(IN) :: HSURF
103 INTEGER,
INTENT(IN) :: KLUOUT
105 INTEGER,
INTENT(IN) :: KSIZE
107 INTEGER,
INTENT(IN) :: KMONTH
109 LOGICAL,
INTENT(IN) :: ODEEPSOIL
110 LOGICAL,
INTENT(IN) :: OPHYSDOMC
111 REAL,
DIMENSION(:),
INTENT(IN) :: PTDEEP_CLI
112 REAL,
DIMENSION(:),
INTENT(IN) :: PGAMMAT_CLI
114 LOGICAL,
INTENT(IN) :: OAGRIP
115 REAL,
DIMENSION(:),
INTENT(IN) :: PTHRESHOLD
117 CHARACTER(LEN=3),
INTENT(IN) :: HINIT
119 REAL,
DIMENSION(:),
INTENT(IN) :: PCO2
120 REAL,
DIMENSION(:),
INTENT(IN) :: PRHOA
126 INTEGER :: JILU,JP, JMAXLOC
131 REAL,
DIMENSION(SIZE(PCO2)) :: ZCO2
133 INTEGER,
DIMENSION(:),
ALLOCATABLE :: IR_NATURE_P
135 REAL(KIND=JPRB) :: ZHOOK_HANDLE
141 IF (
lhook)
CALL dr_hook(
'INIT_VEG_PGD_n',0,zhook_handle)
152 IF (.NOT.
ASSOCIATED(k%XMPOTSAT))
THEN 154 ALLOCATE(k%XMPOTSAT (ki,io%NGROUND_LAYER))
155 ALLOCATE(k%XBCOEF (ki,io%NGROUND_LAYER))
156 ALLOCATE(k%XWWILT (ki,io%NGROUND_LAYER))
157 ALLOCATE(k%XWFC (ki,io%NGROUND_LAYER))
158 ALLOCATE(k%XWSAT (ki,io%NGROUND_LAYER))
160 DO jl=1,io%NGROUND_LAYER
161 IF (dti%LDATA_BCOEF)
THEN 162 k%XBCOEF (:,jl) = dti%XPAR_BCOEF (:,jl)
164 k%XBCOEF (:,jl) =
bcoef_func(k%XCLAY(:,jl),k%XSAND(:,jl),io%CPEDOTF)
166 IF (dti%LDATA_MPOTSAT)
THEN 167 k%XMPOTSAT(:,jl) = dti%XPAR_MPOTSAT(:,jl)
169 k%XMPOTSAT(:,jl) =
matpotsat_func(k%XCLAY(:,jl),k%XSAND(:,jl),io%CPEDOTF)
171 IF (dti%LDATA_WSAT)
THEN 172 k%XWSAT (:,jl) = dti%XPAR_WSAT (:,jl)
174 k%XWSAT (:,jl) =
wsat_func(k%XCLAY(:,jl),k%XSAND(:,jl),io%CPEDOTF)
176 IF (dti%LDATA_WWILT)
THEN 177 k%XWWILT (:,jl) = dti%XPAR_WWILT (:,jl)
179 k%XWWILT (:,jl) =
wwilt_func(k%XCLAY(:,jl),k%XSAND(:,jl),io%CPEDOTF)
182 IF (dti%LDATA_BCOEF )
DEALLOCATE(dti%XPAR_BCOEF)
183 IF (dti%LDATA_MPOTSAT)
DEALLOCATE(dti%XPAR_MPOTSAT)
184 IF (dti%LDATA_WSAT )
DEALLOCATE(dti%XPAR_WSAT)
185 IF (dti%LDATA_WWILT )
DEALLOCATE(dti%XPAR_WWILT)
187 IF (dti%LDATA_WFC)
THEN 188 k%XWFC(:,:) = dti%XPAR_WFC(:,:)
189 DEALLOCATE(dti%XPAR_WFC)
190 ELSEIF (io%CISBA==
'2-L' .OR. io%CISBA==
'3-L')
THEN 192 k%XWFC(:,:) =
wfc_func(k%XCLAY(:,:),k%XSAND(:,:),io%CPEDOTF)
193 ELSE IF (io%CISBA==
'DIF')
THEN 195 k%XWFC(:,:) =
w33_func(k%XCLAY(:,:),k%XSAND(:,:),io%CPEDOTF)
198 IF (io%CISBA==
'2-L' .OR. io%CISBA==
'3-L')
THEN 199 ALLOCATE(k%XCGSAT (ki))
200 ALLOCATE(k%XC4B (ki))
201 ALLOCATE(k%XACOEF (ki))
202 ALLOCATE(k%XPCOEF (ki))
203 k%XCGSAT(:) =
cgsat_func(k%XCLAY(:,1),k%XSAND(:,1))
207 ELSE IF (io%CISBA==
'DIF')
THEN 208 ALLOCATE(k%XCGSAT (0))
210 ALLOCATE(k%XACOEF (0))
211 ALLOCATE(k%XPCOEF (0))
214 IF(io%CRUNOFF==
'SGH')
THEN 216 ALLOCATE(k%XWD0 (ki,io%NGROUND_LAYER))
217 ALLOCATE(k%XKANISO(ki,io%NGROUND_LAYER))
219 IF(io%CISBA==
'DIF')
THEN 220 k%XWD0(:,:) =
wfc_func(k%XCLAY(:,:),k%XSAND(:,:),io%CPEDOTF)
222 k%XWD0(:,:) = k%XWWILT(:,:)
228 ALLOCATE(k%XWD0 (0,0))
229 ALLOCATE(k%XKANISO(0,0))
233 IF (io%CSCOND==
'PL98'.OR.io%CISBA==
'DIF')
THEN 234 ALLOCATE(k%XHCAPSOIL(ki,io%NGROUND_LAYER))
235 ALLOCATE(k%XCONDDRY (ki,io%NGROUND_LAYER))
236 ALLOCATE(k%XCONDSLD (ki,io%NGROUND_LAYER))
239 CALL thrmcondz(k%XSAND,k%XWSAT,k%XCONDDRY,k%XCONDSLD)
241 ALLOCATE(k%XHCAPSOIL(0,0))
242 ALLOCATE(k%XCONDDRY (0,0))
243 ALLOCATE(k%XCONDSLD (0,0))
250 IF (io%CSCOND==
'NP89'.AND.io%CISBA==
'DIF')
THEN 251 WRITE(kluout,*)
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' 252 WRITE(kluout,*)
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' 253 WRITE(kluout,*)
'IF CISBA=DIF, CSCOND=NP89 is not available' 254 WRITE(kluout,*)
'because not physic. CSCOND is put to PL98 ' 255 WRITE(kluout,*)
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' 256 WRITE(kluout,*)
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' 261 IF(io%CCPSURF==
'DRY'.AND.
lcpl_arp)
THEN 262 CALL abor1_sfx(
'CCPSURF=DRY must not be used with LCPL_ARP')
281 ALLOCATE(kk%XTDEEP (ksize))
282 ALLOCATE(kk%XGAMMAT(ksize))
288 kk%XTDEEP (jilu) = ptdeep_cli(kmonth)
289 kk%XGAMMAT(jilu) = 1. / pgammat_cli(kmonth)
292 WRITE(kluout,*)
' LDEEPSOIL = ',odeepsoil,
' LPHYSDOMC = ',ophysdomc
293 WRITE(kluout,*)
' XTDEEP = ',minval(kk%XTDEEP(:)) ,maxval(kk%XTDEEP(:))
294 WRITE(kluout,*)
' XGAMMAT = ',minval(kk%XGAMMAT(:)),maxval(kk%XGAMMAT(:))
301 IF (io%CISBA ==
'DIF')
THEN 303 ALLOCATE(kk%XFWTD(ksize))
304 ALLOCATE(kk%XWTD (ksize))
310 ALLOCATE(kk%XFWTD(0))
311 ALLOCATE(kk%XWTD (0))
323 ALLOCATE(kk%XALBNIR_DRY (ksize))
324 ALLOCATE(kk%XALBVIS_DRY (ksize))
325 ALLOCATE(kk%XALBUV_DRY (ksize))
326 ALLOCATE(kk%XALBNIR_WET (ksize))
327 ALLOCATE(kk%XALBVIS_WET (ksize))
328 ALLOCATE(kk%XALBUV_WET (ksize))
339 ALLOCATE(agk%NIRRINUM (ksize))
340 ALLOCATE(agk%LIRRIDAY (ksize))
341 ALLOCATE(agk%LIRRIGATE (ksize))
342 ALLOCATE(agk%XTHRESHOLDSPT(ksize))
345 agk%LIRRIDAY (:) = .false.
346 agk%LIRRIGATE(:) = .false.
349 agk%XTHRESHOLDSPT(jilu) = pthreshold(agk%NIRRINUM(jilu))
352 ALLOCATE(agk%NIRRINUM (0))
353 ALLOCATE(agk%LIRRIDAY (0))
354 ALLOCATE(agk%LIRRIGATE (0))
355 ALLOCATE(agk%XTHRESHOLDSPT(0))
361 ALLOCATE(issk%XZ0EFFIP(ksize))
362 ALLOCATE(issk%XZ0EFFIM(ksize))
363 ALLOCATE(issk%XZ0EFFJP(ksize))
364 ALLOCATE(issk%XZ0EFFJM(ksize))
371 IF (
SIZE(issk%XAOSIP)>0)
CALL subscale_z0eff(issk,pek%XZ0,.false.)
382 IF(io%CPHOTO /=
'NON' .AND. hinit ==
'ALL')
THEN 384 IF (.NOT.
ASSOCIATED(s%XABC))
THEN 390 ALLOCATE(s%XABC(iabc))
391 ALLOCATE(s%XPOI(iabc))
394 CALL gauleg(0.0,1.0,s%XABC,s%XPOI,iabc)
397 zco2(:) = pco2(:) / prhoa(:)
398 ALLOCATE(pk%XANMAX (ksize))
399 ALLOCATE(pk%XFZERO (ksize))
400 ALLOCATE(pk%XEPSO (ksize))
401 ALLOCATE(pk%XGAMM (ksize))
402 ALLOCATE(pk%XQDGAMM (ksize))
403 ALLOCATE(pk%XQDGMES (ksize))
404 ALLOCATE(pk%XT1GMES (ksize))
405 ALLOCATE(pk%XT2GMES (ksize))
406 ALLOCATE(pk%XAMAX (ksize))
407 ALLOCATE(pk%XQDAMAX (ksize))
408 ALLOCATE(pk%XT1AMAX (ksize))
409 ALLOCATE(pk%XT2AMAX (ksize))
410 ALLOCATE(pk%XAH (ksize))
411 ALLOCATE(pk%XBH (ksize))
412 ALLOCATE(pk%XTAU_WOOD (ksize))
413 ALLOCATE(pk%XINCREASE (ksize,io%NNBIOMASS))
414 ALLOCATE(pk%XTURNOVER (ksize,io%NNBIOMASS))
417 ELSEIF(io%CPHOTO ==
'NON' .AND. io%LTR_ML)
THEN 419 IF (.NOT.
ASSOCIATED(s%XABC))
THEN 421 ALLOCATE (s%XABC(iabc))
422 ALLOCATE (s%XPOI(iabc))
425 CALL gauleg(0.0,1.0,s%XABC,s%XPOI,iabc)
432 IF (.NOT.
ASSOCIATED(s%XABC))
THEN 437 ALLOCATE(pk%XANMAX (0))
438 ALLOCATE(pk%XFZERO (0))
439 ALLOCATE(pk%XEPSO (0))
440 ALLOCATE(pk%XGAMM (0))
441 ALLOCATE(pk%XQDGAMM (0))
442 ALLOCATE(pk%XQDGMES (0))
443 ALLOCATE(pk%XT1GMES (0))
444 ALLOCATE(pk%XT2GMES (0))
445 ALLOCATE(pk%XAMAX (0))
446 ALLOCATE(pk%XQDAMAX (0))
447 ALLOCATE(pk%XT1AMAX (0))
448 ALLOCATE(pk%XT2AMAX (0))
451 ALLOCATE(pk%XTAU_WOOD (0))
452 ALLOCATE(pk%XINCREASE (0,0))
453 ALLOCATE(pk%XTURNOVER (0,0))
462 ALLOCATE(pk%XCONDSAT (ksize,io%NGROUND_LAYER))
463 ALLOCATE(pk%XTAUICE (ksize))
465 IF (dti%LDATA_CONDSAT)
THEN 466 CALL pack_same_rank(pk%NR_P,dti%XPAR_CONDSAT(:,:),pk%XCONDSAT(:,:))
468 DO jl=1,io%NGROUND_LAYER
469 pk%XCONDSAT(:,jl) =
hydcondsat_func(kk%XCLAY(:,jl),kk%XSAND(:,jl),io%CPEDOTF)
472 pk%XTAUICE(:) = xtau_ice
474 IF (io%CISBA==
'2-L' .OR. io%CISBA==
'3-L')
THEN 476 ALLOCATE(pk%XC1SAT (ksize))
477 ALLOCATE(pk%XC2REF (ksize))
478 ALLOCATE(pk%XC3 (ksize,2))
479 ALLOCATE(pk%XC4REF (ksize))
482 pk%XC3 (:,1) =
c3_func(kk%XCLAY(:,1))
483 pk%XC3 (:,2) =
c3_func(kk%XCLAY(:,2))
485 pk%XC4REF(:) =
c4ref_func(kk%XCLAY(:,1),kk%XSAND(:,1),pk%XDG(:,2), &
486 pk%XDG(:,io%NGROUND_LAYER) )
488 ELSE IF (io%CISBA==
'DIF')
THEN 490 ALLOCATE(pk%XC1SAT (0))
491 ALLOCATE(pk%XC2REF (0))
492 ALLOCATE(pk%XC3 (0,0))
493 ALLOCATE(pk%XC4REF (0))
497 ALLOCATE(pk%XCPS (ksize))
498 ALLOCATE(pk%XLVTT(ksize))
499 ALLOCATE(pk%XLSTT(ksize))
508 ALLOCATE(pk%XRUNOFFD (ksize))
511 IF (io%CISBA ==
'DIF')
THEN 513 ALLOCATE(pk%XDZG (ksize,io%NGROUND_LAYER))
514 ALLOCATE(pk%XDZDIF (ksize,io%NGROUND_LAYER))
515 ALLOCATE(pk%XSOILWGHT (ksize,io%NGROUND_LAYER))
518 ELSEIF (
count(io%LMEB_PATCH(:))/=0)
THEN 520 ALLOCATE(pk%XDZG (ksize,io%NGROUND_LAYER))
521 CALL dif_layer(ksize, io, pk, omeb_3l = .true.)
525 ALLOCATE(pk%XDZG (0,0))
526 ALLOCATE(pk%XDZDIF (0,0))
527 ALLOCATE(pk%XSOILWGHT (0,0))
529 WHERE(pk%XPATCH(:)>0.0)
530 pk%XRUNOFFD(:) = pk%XDG(:,2)
537 ALLOCATE(pk%XKSAT_ICE(ksize))
539 IF(io%CISBA/=
'DIF')
THEN 540 pk%XD_ICE (:) = min(pk%XDG(:,2),pk%XD_ICE(:))
542 pk%XKSAT_ICE(:) = pk%XCONDSAT(:,1)
545 pk%XKSAT_ICE(:) = 0.0
558 IF (io%CPHOTO==
'NIT' .OR. io%CPHOTO==
'NCB')
THEN 559 ALLOCATE(pk%XBSLAI_NITRO (ksize ))
560 WHERE ((pek%XCE_NITRO(:) * pek%XCNA_NITRO(:) + pek%XCF_NITRO (:)) /= 0. )
561 pk%XBSLAI_NITRO(:) = 1. / (pek%XCE_NITRO (:)*pek%XCNA_NITRO(:)+pek%XCF_NITRO (:))
563 pk%XBSLAI_NITRO(:) =
xundef 566 ALLOCATE(pk%XBSLAI_NITRO (0))
569 IF (
lhook)
CALL dr_hook(
'INIT_VEG_PGD_n',1,zhook_handle)
real, parameter xice_deph_max
subroutine thrmcondz(PSANDZ, PWSATZ, PCONDDRY, PCONDSLD)
subroutine subscale_z0eff(ISSK, PZ0VEG, OZ0REL, OMASK)
subroutine init_veg_pgd_n(ISSK, DTI, IO, S, K, KK, PK, PEK, AGK, KI, HPROGRAM, HSURF, KLUOUT, KSIZE, KMONTH, ODEEPSOIL, OPHYSDOMC, PTDEEP_CLI, PGAMMAT_CLI, OAGRIP, PTHRESHOLD, HINIT, PCO2, PRHOA)
subroutine abor1_sfx(YTEXT)
integer, parameter nundef
subroutine co2_init_n(IO, S, PK, PEK, KSIZE, PCO2)
subroutine heatcapz(PSANDZ, PHCAPSOIL)
subroutine dif_layer(KLU, IO, PK, OMEB_3L)
subroutine dry_wet_soil_albedos(KK)