6 SUBROUTINE pgd_isba (DTCO, DTV, IG, IO, S, K, ISS, UG, U, USS, HPROGRAM)
69 USE modd_data_cover_par
, ONLY : nvegtype, jpcover, nvt_tebd, nvt_bone, nvt_trbe, &
70 nvt_trbd, nvt_tebe, nvt_tene, nvt_bobd, nvt_bond
73 USE modd_isba_par
, ONLY : noptimlayer, xoptimgrid
78 USE modi_read_nam_pgd_isba
79 USE modi_read_nam_pgd_isba_meb
85 USE modi_get_surf_size_n
86 USE modi_pack_pgd_isba
88 USE modi_write_cover_tex_isba
89 USE modi_write_cover_tex_isba_par
90 USE modi_pgd_topo_index
91 USE modi_open_namelist
92 USE modi_close_namelist
98 USE modi_init_io_surf_n
99 USE modi_end_io_surf_n
101 USE modi_read_namelists_isba
126 TYPE(
grid_t),
INTENT(INOUT) :: IG
130 TYPE(
sso_t),
INTENT(INOUT) :: ISS
133 TYPE(
sso_t),
INTENT(INOUT) :: USS
135 CHARACTER(LEN=6),
INTENT(IN) :: HPROGRAM
145 REAL,
DIMENSION(NL) :: ZAOSIP
146 REAL,
DIMENSION(NL) :: ZAOSIM
147 REAL,
DIMENSION(NL) :: ZAOSJP
148 REAL,
DIMENSION(NL) :: ZAOSJM
149 REAL,
DIMENSION(NL) :: ZHO2IP
150 REAL,
DIMENSION(NL) :: ZHO2IM
151 REAL,
DIMENSION(NL) :: ZHO2JP
152 REAL,
DIMENSION(NL) :: ZHO2JM
153 REAL,
DIMENSION(NL) :: ZSSO_SLOPE
163 INTEGER :: IGROUND_LAYER
165 CHARACTER(LEN=3) :: YISBA
166 CHARACTER(LEN=4) :: YPEDOTF
167 CHARACTER(LEN=3) :: YPHOTO
169 CHARACTER(LEN=4) :: YALBEDO
171 CHARACTER(LEN=28) :: YSAND
172 CHARACTER(LEN=28) :: YCLAY
173 CHARACTER(LEN=28) :: YSOC_TOP
174 CHARACTER(LEN=28) :: YSOC_SUB
175 CHARACTER(LEN=28) :: YCTI
176 CHARACTER(LEN=28) :: YRUNOFFB
177 CHARACTER(LEN=28) :: YWDRAIN
178 CHARACTER(LEN=28) :: YPERM
179 CHARACTER(LEN=6) :: YSANDFILETYPE
180 CHARACTER(LEN=6) :: YCLAYFILETYPE
181 CHARACTER(LEN=6) :: YSOCFILETYPE
182 CHARACTER(LEN=6) :: YCTIFILETYPE
183 CHARACTER(LEN=6) :: YRUNOFFBFILETYPE
184 CHARACTER(LEN=6) :: YWDRAINFILETYPE
185 CHARACTER(LEN=6) :: YPERMFILETYPE
188 REAL :: XUNIF_SOC_TOP
189 REAL :: XUNIF_SOC_SUB
190 REAL :: XUNIF_RUNOFFB
198 REAL,
DIMENSION(150) :: ZSOILGRID
199 CHARACTER(LEN=28) :: YPH
200 CHARACTER(LEN=28) :: YFERT
201 CHARACTER(LEN=6) :: YPHFILETYPE
202 CHARACTER(LEN=6) :: YFERTFILETYPE
205 LOGICAL,
DIMENSION(NVEGTYPE) :: GMEB_PATCH
206 LOGICAL,
DIMENSION(NVEGTYPE) :: GMEB_PATCH_REC
208 REAL(KIND=JPRB) :: ZHOOK_HANDLE
234 io%NGROUND_LAYER = iground_layer
240 io%XRM_PATCH = max(min(zrm_patch,1.),0.)
250 IF (io%NPATCH<1 .OR. io%NPATCH>nvegtype)
THEN 251 WRITE(iluout,*)
'*****************************************' 252 WRITE(iluout,*)
'* Number of patch must be between 1 and ', nvegtype
253 WRITE(iluout,*)
'* You have chosen NPATCH = ', io%NPATCH
254 WRITE(iluout,*)
'*****************************************' 255 CALL abor1_sfx(
'PGD_ISBA: NPATCH MUST BE BETWEEN 1 AND NVEGTYPE')
258 ALLOCATE(io%LMEB_PATCH(io%NPATCH))
260 io%LMEB_PATCH(:) = .false.
261 io%LFORC_MEASURE = .false.
262 io%LMEB_LITTER = .false.
263 io%LMEB_GNDRES = .false.
277 gmeb_patch_rec(:)=.false.
279 gmeb_patch_rec(:)=.true.
280 gmeb_patch_rec(1:3)=.false.
283 IF(io%NPATCH==1 .AND. gmeb_patch(1))
THEN 284 WRITE(iluout,*)
'*****************************************' 285 WRITE(iluout,*)
'* WARNING!' 286 WRITE(iluout,*)
'* Using MEB for one patch only is not recommended.' 287 WRITE(iluout,*)
'* LMEB_PATCH(1) has been set to .FALSE.' 288 WRITE(iluout,*)
'*****************************************' 289 ELSEIF(io%NPATCH>=2 .AND. io%NPATCH<=6)
THEN 290 gmeb_patch_rec(2)=.true.
291 ELSEIF(io%NPATCH>=7 .AND. io%NPATCH<=8)
THEN 292 gmeb_patch_rec(3)=.true.
293 ELSEIF(io%NPATCH==9)
THEN 294 gmeb_patch_rec(3:4)=(/.true.,.true./)
295 ELSEIF(io%NPATCH==10)
THEN 296 gmeb_patch_rec(3:5)=(/.true.,.true.,.true./)
297 ELSEIF(io%NPATCH>=11 .AND. io%NPATCH<=12)
THEN 298 gmeb_patch_rec(4:6)=(/.true.,.true.,.true./)
299 ELSEIF(io%NPATCH==nvegtype)
THEN 301 gmeb_patch_rec(nvt_tebd) = .true.
302 gmeb_patch_rec(nvt_bone) = .true.
303 gmeb_patch_rec(nvt_trbe) = .true.
305 gmeb_patch_rec(nvt_trbd) = .true.
306 gmeb_patch_rec(nvt_tebe) = .true.
307 gmeb_patch_rec(nvt_tene) = .true.
308 gmeb_patch_rec(nvt_bobd) = .true.
309 gmeb_patch_rec(nvt_bond) = .true.
312 IF(
count(.NOT.gmeb_patch_rec(:) .AND. gmeb_patch(:))>0)
THEN 313 WRITE(iluout,*)
'*****************************************' 314 WRITE(iluout,*)
'* WARNING!' 315 WRITE(iluout,*)
'* Using MEB for non-tree patches is not yet recommended.' 316 WRITE(iluout,*)
'* Therefor, LMEB_PATCH for non-tree patches has been set to .FALSE.' 317 WRITE(iluout,*)
'* The final LMEB_PATCH vector becomes:' 318 WRITE(iluout,*) gmeb_patch(1:io%NPATCH).AND.gmeb_patch_rec(1:io%NPATCH
319 WRITE(iluout,*)
'*****************************************' 321 gmeb_patch(:)=gmeb_patch(:).AND.gmeb_patch_rec(:)
323 io%LMEB_PATCH(1:io%NPATCH) = gmeb_patch(1:io%NPATCH)
325 IF (io%LMEB_LITTER) io%LMEB_GNDRES = .false.
337 CALL test_nam_var_surf(iluout,
'CALBEDO',io%CALBEDO,
'EVOL',
'DRY ',
'WET ''MEAN''USER''CM13' 339 SELECT CASE (io%CISBA)
345 ALLOCATE(io%XSOILGRID(0))
346 WRITE(iluout,*)
'*****************************************' 347 WRITE(iluout,*)
'* With option CISBA = ',io%CISBA,
' *' 348 WRITE(iluout,*)
'* the number of soil layers is set to 2 *' 349 WRITE(iluout,*)
'* Pedo transfert function = CH78 *' 350 WRITE(iluout,*)
'*****************************************' 356 ALLOCATE(io%XSOILGRID(0))
357 WRITE(iluout,*)
'*****************************************' 358 WRITE(iluout,*)
'* With option CISBA = ',io%CISBA,
' *' 359 WRITE(iluout,*)
'* the number of soil layers is set to 3 *' 360 WRITE(iluout,*)
'* Pedo transfert function = CH78 *' 361 WRITE(iluout,*)
'*****************************************' 365 IF(io%NGROUND_LAYER==
nundef)
THEN 367 io%NGROUND_LAYER=noptimlayer
369 WRITE(iluout,*)
'****************************************' 370 WRITE(iluout,*)
'* Number of ground layer not specified *' 371 WRITE(iluout,*)
'****************************************' 372 CALL abor1_sfx(
'PGD_ISBA: NGROUND_LAYER MUST BE DONE IN NAM_ISBA' 376 ALLOCATE(io%XSOILGRID(io%NGROUND_LAYER))
378 io%XSOILGRID(:)=zsoilgrid(1:io%NGROUND_LAYER)
379 IF (all(zsoilgrid(:)==
xundef))
THEN 380 IF(u%LECOCLIMAP) io%XSOILGRID(1:io%NGROUND_LAYER)=xoptimgrid(1:io%NGROUND_LAYER
381 ELSEIF (
count(io%XSOILGRID/=
xundef)/=io%NGROUND_LAYER)
THEN 382 WRITE(iluout,*)
'********************************************************' 383 WRITE(iluout,*)
'* Soil grid reference values /= number of ground layer *' 384 WRITE(iluout,*)
'********************************************************' 385 CALL abor1_sfx(
'PGD_ISBA: XSOILGRID must be coherent with NGROUND_LAYER in NAM_ISBA' 386 ELSEIF (io%XSOILGRID(1).GT.0.01)
THEN 387 CALL abor1_sfx(
'PGD_ISBA: First layer of XSOILGRID must be lower than 1cm' 390 WRITE(iluout,*)
'*****************************************' 391 WRITE(iluout,*)
'* Option CISBA = ',io%CISBA
392 WRITE(iluout,*)
'* Pedo transfert function = ',io%CPEDOTF
393 WRITE(iluout,*)
'* Number of soil layers = ',io%NGROUND_LAYER
395 WRITE(iluout,*)
'* Soil layers grid (m) = ',io%XSOILGRID(1:io%NGROUND_LAYER
397 WRITE(iluout,*)
'*****************************************' 401 SELECT CASE (io%CPHOTO)
409 WRITE(iluout,*)
'*****************************************' 410 WRITE(iluout,*)
'* With option CPHOTO = ',io%CPHOTO,
' *' 411 WRITE(iluout,*)
'* the number of biomass pools is set to ', io%NNBIOMASS
412 WRITE(iluout,*)
'*****************************************' 414 IF ( io%CPHOTO/=
'NON' .AND. io%NPATCH/=12 .AND. io%NPATCH/=nvegtype )
THEN 415 WRITE(iluout,*)
'*****************************************' 416 WRITE(iluout,*)
'* With option CPHOTO = ', io%CPHOTO
417 WRITE(iluout,*)
'* Number of patch must be equal to 12 or NVEGTYPE' 418 WRITE(iluout,*)
'* But you have chosen NPATCH = ', io%NPATCH
419 WRITE(iluout,*)
'*****************************************' 420 CALL abor1_sfx(
'PGD_ISBA: CPHOTO='//io%CPHOTO//
' REQUIRES NPATCH=12 or NVEGTYPE' 423 IF ( io%CPHOTO==
'NON' .AND. io%LTR_ML .AND. .NOT. gmeb)
THEN 424 WRITE(iluout,*)
'*****************************************' 425 WRITE(iluout,*)
'* With option CPHOTO == NON ' 426 WRITE(iluout,*)
'* And With MEB = F ' 427 WRITE(iluout,*)
'* New radiative transfert TR_ML ' 428 WRITE(iluout,*)
'* cant be used ' 429 WRITE(iluout,*)
'*****************************************' 430 CALL abor1_sfx(
'PGD_ISBA: WITH CPHOTO= NON LTR_ML MUST BE FALSE')
440 ALLOCATE(s%LCOVER (jpcover))
441 ALLOCATE(s%XZS (ilu))
442 ALLOCATE(ig%XLAT (ilu))
443 ALLOCATE(ig%XLON (ilu))
444 ALLOCATE(ig%XMESH_SIZE (ilu))
445 ALLOCATE(iss%XZ0EFFJPDIR(ilu))
447 CALL pack_pgd(dtco, u, hprogram,
'NATURE', ig, s%LCOVER, s%XCOVER, s%XZS
454 CALL get_aos_n(uss, hprogram,
nl,zaosip,zaosim,zaosjp,zaosjm,zho2ip,zho2im
458 zaosip, zaosim, zaosjp, zaosjm, &
459 zho2ip, zho2im, zho2jp, zho2jm, &
467 io%LECOCLIMAP = u%LECOCLIMAP
469 CALL pgd_isba_par(dtco, ug, u, uss, dtv, io, s, ig%NDIM, hprogram)
475 ALLOCATE(k%XVEGTYPE(ilu,nvegtype))
476 IF (dtv%LDATA_VEGTYPE)
THEN 477 k%XVEGTYPE(:,:) = dtv%XPAR_VEGTYPE(:,:)
479 DO jvegtype=1,nvegtype
494 hprogram,ilu,ycti,yctifiletype,limp_cti)
503 ALLOCATE(k%XSAND(ilu,io%NGROUND_LAYER))
505 CALL get_field(ysandfiletype,ysand,
"SAND",limp_sand,xunif_sand,k%XSAND(
507 DO jlayer=1,io%NGROUND_LAYER
508 k%XSAND(:,jlayer) = k%XSAND(:,1)
515 ALLOCATE(k%XCLAY(ilu,io%NGROUND_LAYER))
517 CALL get_field(yclayfiletype,yclay,
"CLAY",limp_clay,xunif_clay,k%XCLAY(
519 DO jlayer=1,io%NGROUND_LAYER
520 k%XCLAY(:,jlayer) = k%XCLAY(:,1)
528 IF(len_trim(ysocfiletype)/=0.OR.(xunif_soc_top/=
xundef.AND.xunif_soc_sub
THEN 530 ALLOCATE(s%XSOC(ilu,io%NGROUND_LAYER))
534 IF((len_trim(ysoc_top)==0.AND.len_trim(ysoc_sub)/=0).OR.(len_trim(ysoc_top
THEN 536 WRITE(iluout,*)
'***********************************************************' 537 WRITE(iluout,*)
'* Error in soil organic carbon preparation *' 538 WRITE(iluout,*)
'* If used, sub and top soil input file must be given *' 539 WRITE(iluout,*)
'***********************************************************' 541 CALL abor1_sfx(
'PGD_ISBA: TOP AND SUB SOC INPUT FILE REQUIRED')
544 CALL get_field(ysocfiletype,ysoc_top,
"SOC_TOP",limp_soc,xunif_soc_top,s%XSOC
546 CALL get_field(ysocfiletype,ysoc_sub,
"SOC_SUB",limp_soc,xunif_soc_sub,s%XSOC
548 DO jlayer=2,io%NGROUND_LAYER
549 s%XSOC(:,jlayer) = s%XSOC(:,2)
555 ALLOCATE(s%XSOC(0,0))
562 IF(len_trim(yperm)/=0.OR.xunif_perm/=
xundef)
THEN 564 ALLOCATE(k%XPERM(ilu))
568 CALL get_field(ypermfiletype,yperm,
"PERM",limp_perm,xunif_perm,k%XPERM(
582 IF((len_trim(yphfiletype)/=0.OR.xunif_ph/=
xundef) .AND. &
583 (len_trim(yfertfiletype)/=0.OR.xunif_fert/=
xundef))
THEN 586 ALLOCATE(s%XFERT(ilu))
591 hprogram,
'pH value',
'NAT',yph,yphfiletype,xunif_ph,s%XPH
593 hprogram,
'fertilisation',
'NAT',yfert,yfertfiletype,xunif_fert
602 ALLOCATE(k%XRUNOFFB(ilu))
603 CALL pgd_field(dtco, ug, u, uss, hprogram,
'subgrid runoff',
'NAT',yrunoffb
611 ALLOCATE(k%XWDRAIN(ilu))
612 CALL pgd_field(dtco, ug, u, uss, hprogram,
'subgrid drainage',
'NAT',ywdrain
617 CALL pgd_topd(io%CISBA, ug%G%CGRID, ug%G%XGRID_PAR, u%NDIM_FULL, uss%XSSO_SLOPE
624 IF (u%LECOCLIMAP)
THEN 627 io%NPATCH,io%NGROUND_LAYER,io%CISBA,io%CPHOTO
633 SUBROUTINE get_field(HFILETYPE,HFILE,HFIELD,OIMP,PUNIF,PFIELD)
637 CHARACTER(LEN=*),
INTENT(INOUT) :: HFILETYPE
638 CHARACTER(LEN=*),
INTENT(IN) :: HFILE
639 CHARACTER(LEN=*),
INTENT(IN) :: HFIELD
640 LOGICAL,
INTENT(IN) :: OIMP
641 REAL,
INTENT(IN) :: PUNIF
642 REAL,
DIMENSION(:),
INTENT(OUT) :: PFIELD
644 REAL(KIND=JPRB) :: ZHOOK_HANDLE
646 IF (
lhook)
CALL dr_hook(
'PGD_ISBA:GET_FIELD',0,zhook_handle)
650 IF(hfiletype==
'NETCDF')
THEN 651 CALL abor1_sfx(
'Use another format than netcdf for '//
trim(hfield)/
' input file with LIMP ' 654 cfilein = adjustl(adjustr(hfile)//
'.txt')
671 hprogram,hfield,
'NAT',hfile,hfiletype,punif,pfield)
674 IF (
lhook)
CALL dr_hook(
'PGD_ISBA:GET_FIELD',1,zhook_handle)
subroutine get_surf_size_n(DTCO, U, HTYPE, KL)
subroutine get_field(HFILETYPE, HFILE, HFIELD, OIMP, PUNIF, PFIELD)
static const char * trim(const char *name, int *n)
subroutine get_aos_n(USS, HPROGRAM, KI, PAOSIP, PAOSIM, PAOSJP, PAOSJM, PHO2IP, PHO2IM, PHO2JP, PHO2JM)
subroutine pgd_topo_index(DTCO, UG, U, USS, S, OCTI, HPROGRAM, KLU, HCTI, HCTIFILETYPE, OIMP_CTI
real, dimension(:,:), allocatable xdata_vegtype
subroutine read_nam_pgd_isba(HPROGRAM, KPATCH, KGROUND_LAYER,
subroutine pack_pgd(DTCO, U, HPROGRAM, HSURF, G, OCOVER, PCOVER,
subroutine pgd_isba_par(DTCO, UG, U, USS, DTV, IO, S, KDIM, HPROG
subroutine abor1_sfx(YTEXT)
subroutine read_nam_pgd_isba_meb(HPROGRAM, KLUOUT, OMEB_PATCH, OFO
integer, parameter nundef
subroutine get_sso_n(USS, HPROGRAM, KI, PSSO_SLOPE)
subroutine end_io_surf_n(HPROGRAM)
subroutine get_luout(HPROGRAM, KLUOUT)
subroutine write_cover_tex_isba(KPATCH, KLAYER, HISBA)
subroutine write_cover_tex_isba_par(DTCO, HALBEDO, OTR_ML, KPATCH, KLAYER, HISBA, HPHOTO, PS
subroutine pack_pgd_isba(DTCO, KDIM, ISS, U, HPROGRAM,
character(len=28), save cfilein
character(len=28), save cfilein_fa
subroutine init_io_surf_n(DTCO, U, HPROGRAM, HMASK, HSCHEME, HACTION
subroutine read_namelists_isba(HPROGRAM)
subroutine pgd_topd(HISBA, HGRID, PGRID_PAR, KDIM_FULL, PSSO_SLOP
character(len=28), save cfilein_lfi
subroutine pgd_isba(DTCO, DTV, IG, IO, S, K, ISS, UG, U, USS, HPR