!-----------------------------------------------------------------------
!BOP
!
! !ROUTINE: iniTimeConst
!
! !INTERFACE:
subroutine iniTimeConst 1,54
!
! !DESCRIPTION:
! Initialize time invariant clm variables
! 1) removed references to shallow lake - since it is not used
! 2) ***Make c%z, c%zi and c%dz allocatable depending on if you
! have lake or soil
! 3) rootfr only initialized for soil points
!
! !USES:
use shr_kind_mod
, only : r8 => shr_kind_r8
use nanMod
, only : nan
use clmtype
use decompMod
, only : get_proc_bounds, get_proc_global
use decompMod
, only : gsMap_lnd_gdc2glo
use clm_atmlnd
, only : clm_a2l
use clm_varpar
, only : nlevsoi, nlevgrnd, nlevlak, lsmlon, lsmlat, numpft, numrad, nlevurb
use clm_varcon
, only : istice, istdlak, istwet, isturb, istice_mec, &
icol_roof, icol_sunwall, icol_shadewall, icol_road_perv, icol_road_imperv, &
zlak, dzlak, zsoi, dzsoi, zisoi, spval, &
albsat, albdry
use clm_varctl
, only : nsrest, fsurdat,scmlon,scmlat,single_column
use clm_varctl
, only : iulog
use pftvarcon
, only : noveg, ntree, roota_par, rootb_par, &
smpso, smpsc, fnitr, nbrdlf_dcd_brl_shrub, &
z0mr, displar, dleaf, rhol, rhos, taul, taus, xl, &
qe25, vcmx25, mp, c3psn, slatop, dsladlai, leafcn, flnr, woody, &
lflitcn, frootcn, livewdcn, deadwdcn, froot_leaf, stem_leaf, croot_stem, &
flivewd, fcur, lf_flab, lf_fcel, lf_flig, fr_flab, fr_fcel, fr_flig, &
dw_fcel, dw_flig, leaf_long, evergreen, stress_decid, season_decid, &
resist, pftpar20, pftpar28, pftpar29, pftpar30, pftpar31, &
allom1s, allom2s, &
allom1 , allom2 , allom3 , reinickerp, dwood
use clm_time_manager
, only : get_step_size
use abortutils
, only : endrun
use fileutils
, only : getfil
use organicFileMod
, only : organicrd
use ncdio
, only : ncd_iolocal, nf_close, nf_get_var_int, NF_NOERR, nf_inq_varid, nf_open, check_ret
use spmdMod
, only : mpicom, MPI_INTEGER, masterproc
use clm_varctl
, only : fsnowoptics, fsnowaging
use SNICARMod
, only : SnowAge_init, SnowOptics_init
!
! !ARGUMENTS:
implicit none
!
! !CALLED FROM:
! subroutine initialize in module initializeMod.
!
! !REVISION HISTORY:
! Created by Gordon Bonan.
! Updated to clm2.1 data structrues by Mariana Vertenstein
! 4/26/05, Peter Thornton: Eliminated exponential decrease in saturated hydraulic
! conductivity (hksat) with depth.
! Updated: Colette L. Heald (05/06) reading in VOC emission factors
! 27 February 2008: Keith Oleson; Qing Liu (2004) saturated hydraulic conductivity
! and matric potential
! 29 February 2008: David Lawrence; modified soil thermal and hydraulic properties to
! account for organic matter
! 18 March 2008: David Lawrence; nlevgrnd changes
! 03/28/08 Mark Flanner, read in netcdf files for SNICAR parameters
!
! !LOCAL VARIABLES:
!
! local pointers to implicit in arguments
!
integer , pointer :: ivt(:) ! vegetation type index
integer , pointer :: pcolumn(:) ! column index of corresponding pft
integer , pointer :: pgridcell(:) ! gridcell index of corresponding pft
integer , pointer :: clandunit(:) ! landunit index of column
integer , pointer :: cgridcell(:) ! gridcell index of column
integer , pointer :: ctype(:) ! column type index
integer , pointer :: ltype(:) ! landunit type index
real(r8), pointer :: thick_wall(:) ! total thickness of urban wall
real(r8), pointer :: thick_roof(:) ! total thickness of urban roof
real(r8), pointer :: lat(:) ! gridcell latitude (radians)
!
! local pointers to implicit out arguments
!
real(r8), pointer :: z(:,:) ! layer depth (m)
real(r8), pointer :: zi(:,:) ! interface level below a "z" level (m)
real(r8), pointer :: dz(:,:) ! layer thickness depth (m)
real(r8), pointer :: rootfr(:,:) ! fraction of roots in each soil layer
real(r8), pointer :: rootfr_road_perv(:,:) ! fraction of roots in each soil layer for urban pervious road
real(r8), pointer :: rresis(:,:) !root resistance by layer (0-1) (nlevgrnd)
real(r8), pointer :: dewmx(:) ! maximum allowed dew [mm]
real(r8), pointer :: bsw(:,:) ! Clapp and Hornberger "b" (nlevgrnd)
real(r8), pointer :: bsw2(:,:) ! Clapp and Hornberger "b" for CN code
real(r8), pointer :: psisat(:,:) ! soil water potential at saturation for CN code (MPa)
real(r8), pointer :: vwcsat(:,:) ! volumetric water content at saturation for CN code (m3/m3)
real(r8), pointer :: watsat(:,:) ! volumetric soil water at saturation (porosity) (nlevgrnd)
real(r8), pointer :: watfc(:,:) ! volumetric soil water at field capacity (nlevsoi)
real(r8), pointer :: watdry(:,:) ! btran parameter for btran=0
real(r8), pointer :: watopt(:,:) ! btran parameter for btran = 1
real(r8), pointer :: hksat(:,:) ! hydraulic conductivity at saturation (mm H2O /s) (nlevgrnd)
real(r8), pointer :: sucsat(:,:) ! minimum soil suction (mm) (nlevgrnd)
real(r8), pointer :: csol(:,:) ! heat capacity, soil solids (J/m**3/Kelvin) (nlevgrnd)
real(r8), pointer :: tkmg(:,:) ! thermal conductivity, soil minerals [W/m-K] (new) (nlevgrnd)
real(r8), pointer :: tkdry(:,:) ! thermal conductivity, dry soil (W/m/Kelvin) (nlevgrnd)
real(r8), pointer :: tksatu(:,:) ! thermal conductivity, saturated soil [W/m-K] (new) (nlevgrnd)
real(r8), pointer :: wtfact(:) ! maximum saturated fraction for a gridcell
real(r8), pointer :: smpmin(:) ! restriction for min of soil potential (mm) (new)
real(r8), pointer :: hkdepth(:) ! decay factor (m)
integer , pointer :: isoicol(:) ! soil color class
real(r8), pointer :: gwc_thr(:) ! threshold soil moisture based on clay content
real(r8), pointer :: mss_frc_cly_vld(:) ! [frc] Mass fraction clay limited to 0.20
real(r8), pointer :: efisop(:,:) ! emission factors for isoprene (ug isoprene m-2 h-1)
real(r8), pointer :: max_dayl(:) ! maximum daylength (s)
real(r8), pointer :: sandfrac(:)
real(r8), pointer :: clayfrac(:)
!
!
! !OTHER LOCAL VARIABLES:
!EOP
integer :: ncid ! netCDF file id
integer :: n,j,ib,lev,bottom! indices
integer :: g,l,c,p ! indices
integer :: m ! vegetation type index
real(r8) :: bd ! bulk density of dry soil material [kg/m^3]
real(r8) :: tkm ! mineral conductivity
real(r8) :: xksat ! maximum hydraulic conductivity of soil [mm/s]
real(r8) :: scalez = 0.025_r8 ! Soil layer thickness discretization (m)
real(r8) :: clay,sand ! temporaries
real(r8) :: slope,intercept ! temporary, for rooting distribution
real(r8) :: temp, max_decl ! temporary, for calculation of max_dayl
integer :: begp, endp ! per-proc beginning and ending pft indices
integer :: begc, endc ! per-proc beginning and ending column indices
integer :: begl, endl ! per-proc beginning and ending landunit indices
integer :: begg, endg ! per-proc gridcell ending gridcell indices
integer :: numg ! total number of gridcells across all processors
integer :: numl ! total number of landunits across all processors
integer :: numc ! total number of columns across all processors
integer :: nump ! total number of pfts across all processors
real(r8),pointer :: temp_ef(:) ! read in - temporary EFs
real(r8),pointer :: efisop2d(:,:) ! read in - isoprene emission factors
real(r8),pointer :: arrayl(:) ! generic global array
integer ,pointer :: irrayg(:) ! generic global array
integer ,pointer :: soic2d(:) ! read in - soil color
real(r8),pointer :: sand3d(:,:) ! read in - soil texture: percent sand
real(r8),pointer :: clay3d(:,:) ! read in - soil texture: percent clay
real(r8),pointer :: organic3d(:,:) ! read in - organic matter: kg/m3
real(r8),pointer :: gti(:) ! read in - fmax
real(r8) :: om_frac ! organic matter fraction
real(r8) :: om_watsat = 0.9_r8 ! porosity of organic soil
real(r8) :: om_hksat = 0.1_r8 ! saturated hydraulic conductivity of organic soil [mm/s]
real(r8) :: om_tkm = 0.25_r8 ! thermal conductivity of organic soil (Farouki, 1986) [W/m/K]
real(r8) :: om_sucsat = 10.3_r8 ! saturated suction for organic matter (Letts, 2000)
real(r8) :: om_csol = 2.5_r8 ! heat capacity of peat soil *10^6 (J/K m3) (Farouki, 1986)
real(r8) :: om_tkd = 0.05_r8 ! thermal conductivity of dry organic soil (Farouki, 1981)
real(r8) :: om_b = 2.7_r8 ! Clapp Hornberger paramater for oragnic soil (Letts, 2000)
real(r8) :: organic_max = 130._r8 ! organic matter (kg/m3) where soil is assumed to act like peat
real(r8) :: csol_bedrock = 2.0e6_r8 ! vol. heat capacity of granite/sandstone J/(m3 K)(Shabbir, 2000)
real(r8) :: pc = 0.5_r8 ! percolation threshold
real(r8) :: pcbeta = 0.139_r8 ! percolation exponent
real(r8) :: perc_frac ! "percolating" fraction of organic soil
real(r8) :: perc_norm ! normalize to 1 when 100% organic soil
real(r8) :: uncon_hksat ! series conductivity of mineral/organic soil
real(r8) :: uncon_frac ! fraction of "unconnected" soil
integer :: start(3),count(3) ! netcdf start/count arrays
integer :: varid ! netCDF id's
integer :: ret
integer :: ier ! error status
character(len=256) :: locfn ! local filename
character(len= 32) :: subname = 'iniTimeConst' ! subroutine name
integer :: mxsoil_color ! maximum number of soil color classes
real(r8), allocatable :: zurb_wall(:,:) ! wall (layer node depth)
real(r8), allocatable :: zurb_roof(:,:) ! roof (layer node depth)
real(r8), allocatable :: dzurb_wall(:,:) ! wall (layer thickness)
real(r8), allocatable :: dzurb_roof(:,:) ! roof (layer thickness)
real(r8), allocatable :: ziurb_wall(:,:) ! wall (layer interface)
real(r8), allocatable :: ziurb_roof(:,:) ! roof (layer interface)
!------------------------------------------------------------------------
integer :: closelatidx,closelonidx
real(r8):: closelat,closelon
integer :: iostat
!------------------------------------------------------------------------
if (masterproc) write(iulog,*) 'Attempting to initialize time invariant variables'
call get_proc_bounds
(begg, endg, begl, endl, begc, endc, begp, endp)
call get_proc_global
(numg, numl, numc, nump)
allocate(soic2d(begg:endg), gti(begg:endg))
allocate(sand3d(begg:endg,nlevsoi),clay3d(begg:endg,nlevsoi))
allocate(organic3d(begg:endg,nlevsoi))
allocate(temp_ef(begg:endg),efisop2d(6,begg:endg))
efisop => clm3%g%gve%efisop
! Assign local pointers to derived subtypes components (gridcell-level)
lat => clm3%g%lat
! Assign local pointers to derived subtypes components (landunit-level)
ltype => clm3%g%l%itype
thick_wall => clm3%g%l%lps%thick_wall
thick_roof => clm3%g%l%lps%thick_roof
! Assign local pointers to derived subtypes components (column-level)
ctype => clm3%g%l%c%itype
clandunit => clm3%g%l%c%landunit
cgridcell => clm3%g%l%c%gridcell
z => clm3%g%l%c%cps%z
dz => clm3%g%l%c%cps%dz
zi => clm3%g%l%c%cps%zi
bsw => clm3%g%l%c%cps%bsw
bsw2 => clm3%g%l%c%cps%bsw2
psisat => clm3%g%l%c%cps%psisat
vwcsat => clm3%g%l%c%cps%vwcsat
watsat => clm3%g%l%c%cps%watsat
watfc => clm3%g%l%c%cps%watfc
watdry => clm3%g%l%c%cps%watdry
watopt => clm3%g%l%c%cps%watopt
rootfr_road_perv => clm3%g%l%c%cps%rootfr_road_perv
hksat => clm3%g%l%c%cps%hksat
sucsat => clm3%g%l%c%cps%sucsat
tkmg => clm3%g%l%c%cps%tkmg
tksatu => clm3%g%l%c%cps%tksatu
tkdry => clm3%g%l%c%cps%tkdry
csol => clm3%g%l%c%cps%csol
smpmin => clm3%g%l%c%cps%smpmin
hkdepth => clm3%g%l%c%cps%hkdepth
wtfact => clm3%g%l%c%cps%wtfact
isoicol => clm3%g%l%c%cps%isoicol
gwc_thr => clm3%g%l%c%cps%gwc_thr
mss_frc_cly_vld => clm3%g%l%c%cps%mss_frc_cly_vld
max_dayl => clm3%g%l%c%cps%max_dayl
! Assign local pointers to derived subtypes components (pft-level)
ivt => clm3%g%l%c%p%itype
pgridcell => clm3%g%l%c%p%gridcell
pcolumn => clm3%g%l%c%p%column
dewmx => clm3%g%l%c%p%pps%dewmx
rootfr => clm3%g%l%c%p%pps%rootfr
rresis => clm3%g%l%c%p%pps%rresis
sandfrac => clm3%g%l%c%p%pps%sandfrac
clayfrac => clm3%g%l%c%p%pps%clayfrac
allocate(zurb_wall(begl:endl,nlevurb), zurb_roof(begl:endl,nlevurb), &
dzurb_wall(begl:endl,nlevurb), dzurb_roof(begl:endl,nlevurb), &
ziurb_wall(begl:endl,0:nlevurb), ziurb_roof(begl:endl,0:nlevurb), stat=ier)
if (ier /= 0) then
call endrun
( 'iniTimeConst: allocation error for zurb_wall,zurb_roof,dzurb_wall,dzurb_roof,ziurb_wall,ziurb_roof' )
end if
! --------------------------------------------------------------------
! Read soil color, sand and clay from surface dataset
! --------------------------------------------------------------------
if (masterproc) then
write(iulog,*) 'Attempting to read soil color, sand and clay boundary data .....'
call getfil
(fsurdat, locfn, 0)
call check_ret
(nf_open(locfn, 0, ncid), subname)
! Determine number of soil color classes - if number of soil color classes is not
! on input dataset set it to 8
ier = nf_inq_varid(ncid, 'mxsoil_color', varid)
if (ier == NF_NOERR) then
call check_ret
(nf_inq_varid(ncid, 'mxsoil_color', varid), subname)
call check_ret
(nf_get_var_int(ncid, varid, mxsoil_color), subname)
else
mxsoil_color = 8
end if
endif
call mpi_bcast( mxsoil_color, 1, MPI_INTEGER, 0, mpicom, ier )
count(1) = lsmlon
count(2) = lsmlat
if (single_column) then
call scam_setlatlonidx
(ncid,scmlat,scmlon,closelat,closelon,closelatidx,closelonidx)
start(1) = closelonidx
start(2) = closelatidx
else
start(1) = 1
start(2) = 1
end if
start(3) = 1
count(3) = 1
! Read fmax
call ncd_iolocal
(ncid, 'FMAX', 'read', gti, grlnd,start(:2),count(:2), status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: FMAX NOT on surfdata file' )
! Read in soil color, sand and clay fraction
call ncd_iolocal
(ncid, 'SOIL_COLOR', 'read', soic2d, grlnd,start(:2),count(:2),status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: SOIL_COLOR NOT on surfdata file' )
! Read in emission factors
call ncd_iolocal
(ncid, 'EF1_BTR', 'read', temp_ef, grlnd,start(:2),count(:2),status=iostat)
if (iostat/=0) then
call endrun
('iniTimeConst: errror reading EF1_BTR')
endif
efisop2d(1,:)=temp_ef(:)
call ncd_iolocal
(ncid, 'EF1_FET', 'read', temp_ef, grlnd,start(:2),count(:2),status=iostat)
if (iostat/=0) then
call endrun
('iniTimeConst: errror reading EF1_FET')
endif
efisop2d(2,:)=temp_ef(:)
call ncd_iolocal
(ncid, 'EF1_FDT', 'read', temp_ef, grlnd,start(:2),count(:2),status=iostat)
if (iostat/=0) then
call endrun
('iniTimeConst: errror reading EF1_FDT')
endif
efisop2d(3,:)=temp_ef(:)
call ncd_iolocal
(ncid, 'EF1_SHR', 'read', temp_ef, grlnd,start(:2),count(:2),status=iostat)
if (iostat/=0) then
call endrun
('iniTimeConst: errror reading EF1_SHR')
endif
efisop2d(4,:)=temp_ef(:)
call ncd_iolocal
(ncid, 'EF1_GRS', 'read', temp_ef, grlnd,start(:2),count(:2),status=iostat)
if (iostat/=0) then
call endrun
('iniTimeConst: errror reading EF1_GRS')
endif
efisop2d(5,:)=temp_ef(:)
call ncd_iolocal
(ncid, 'EF1_CRP', 'read', temp_ef, grlnd,start(:2),count(:2),status=iostat)
if (iostat/=0) then
call endrun
('iniTimeConst: errror reading EF1_CRP')
endif
efisop2d(6,:)=temp_ef(:)
allocate(arrayl(begg:endg))
do n = 1,nlevsoi
start(3) = n
call ncd_iolocal
(ncid,'PCT_SAND','read',arrayl,grlnd,start,count,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: PCT_SAND NOT on surfdata file' )
sand3d(begg:endg,n) = arrayl(begg:endg)
call ncd_iolocal
(ncid,'PCT_CLAY','read',arrayl,grlnd,start,count,status=ret)
if (ret /= 0) call endrun
( trim(subname)//' ERROR: PCT_CLAY NOT on surfdata file' )
clay3d(begg:endg,n) = arrayl(begg:endg)
enddo
deallocate(arrayl)
if (masterproc) then
call check_ret
(nf_close(ncid), subname)
write(iulog,*) 'Successfully read fmax, soil color, sand and clay boundary data'
write(iulog,*)
endif
! Determine saturated and dry soil albedos for n color classes and
! numrad wavebands (1=vis, 2=nir)
allocate(albsat(mxsoil_color,numrad), albdry(mxsoil_color,numrad), stat=ier)
if (ier /= 0) then
write(iulog,*)'iniTimeConst: allocation error for albsat, albdry'
call endrun
()
end if
if (mxsoil_color == 8) then
albsat(1:8,1) = (/0.12_r8,0.11_r8,0.10_r8,0.09_r8,0.08_r8,0.07_r8,0.06_r8,0.05_r8/)
albsat(1:8,2) = (/0.24_r8,0.22_r8,0.20_r8,0.18_r8,0.16_r8,0.14_r8,0.12_r8,0.10_r8/)
albdry(1:8,1) = (/0.24_r8,0.22_r8,0.20_r8,0.18_r8,0.16_r8,0.14_r8,0.12_r8,0.10_r8/)
albdry(1:8,2) = (/0.48_r8,0.44_r8,0.40_r8,0.36_r8,0.32_r8,0.28_r8,0.24_r8,0.20_r8/)
else if (mxsoil_color == 20) then
albsat(1:20,1) = (/0.25_r8,0.23_r8,0.21_r8,0.20_r8,0.19_r8,0.18_r8,0.17_r8,0.16_r8,&
0.15_r8,0.14_r8,0.13_r8,0.12_r8,0.11_r8,0.10_r8,0.09_r8,0.08_r8,0.07_r8,0.06_r8,0.05_r8,0.04_r8/)
albsat(1:20,2) = (/0.50_r8,0.46_r8,0.42_r8,0.40_r8,0.38_r8,0.36_r8,0.34_r8,0.32_r8,&
0.30_r8,0.28_r8,0.26_r8,0.24_r8,0.22_r8,0.20_r8,0.18_r8,0.16_r8,0.14_r8,0.12_r8,0.10_r8,0.08_r8/)
albdry(1:20,1) = (/0.36_r8,0.34_r8,0.32_r8,0.31_r8,0.30_r8,0.29_r8,0.28_r8,0.27_r8,&
0.26_r8,0.25_r8,0.24_r8,0.23_r8,0.22_r8,0.20_r8,0.18_r8,0.16_r8,0.14_r8,0.12_r8,0.10_r8,0.08_r8/)
albdry(1:20,2) = (/0.61_r8,0.57_r8,0.53_r8,0.51_r8,0.49_r8,0.48_r8,0.45_r8,0.43_r8,&
0.41_r8,0.39_r8,0.37_r8,0.35_r8,0.33_r8,0.31_r8,0.29_r8,0.27_r8,0.25_r8,0.23_r8,0.21_r8,0.16_r8/)
else
write(iulog,*)'maximum color class = ',mxsoil_color,' is not supported'
call endrun
end if
do p = begp,endp
g = pgridcell(p)
sandfrac(p) = sand3d(g,1)/100.0_r8
clayfrac(p) = clay3d(g,1)/100.0_r8
end do
! --------------------------------------------------------------------
! If a organic matter dataset has been specified, read it
! --------------------------------------------------------------------
call organicrd
(organic3d)
! --------------------------------------------------------------------
! Initialize time constant arrays of ecophysiological constants and
! arrays of dgvm ecophysiological constants
! --------------------------------------------------------------------
do m = 0,numpft
if (m <= ntree) then
pftcon%tree(m) = 1
else
pftcon%tree(m) = 0
end if
pftcon%z0mr(m) = z0mr(m)
pftcon%displar(m) = displar(m)
pftcon%dleaf(m) = dleaf(m)
pftcon%xl(m) = xl(m)
do ib = 1,numrad
pftcon%rhol(m,ib) = rhol(m,ib)
pftcon%rhos(m,ib) = rhos(m,ib)
pftcon%taul(m,ib) = taul(m,ib)
pftcon%taus(m,ib) = taus(m,ib)
end do
pftcon%qe25(m) = qe25(m)
pftcon%vcmx25(m) = vcmx25(m)
pftcon%mp(m) = mp(m)
pftcon%c3psn(m) = c3psn(m)
pftcon%slatop(m) = slatop(m)
pftcon%dsladlai(m) = dsladlai(m)
pftcon%leafcn(m) = leafcn(m)
pftcon%flnr(m) = flnr(m)
pftcon%smpso(m) = smpso(m)
pftcon%smpsc(m) = smpsc(m)
pftcon%fnitr(m) = fnitr(m)
pftcon%woody(m) = woody(m)
pftcon%lflitcn(m) = lflitcn(m)
pftcon%frootcn(m) = frootcn(m)
pftcon%livewdcn(m) = livewdcn(m)
pftcon%deadwdcn(m) = deadwdcn(m)
pftcon%froot_leaf(m) = froot_leaf(m)
pftcon%stem_leaf(m) = stem_leaf(m)
pftcon%croot_stem(m) = croot_stem(m)
pftcon%flivewd(m) = flivewd(m)
pftcon%fcur(m) = fcur(m)
pftcon%lf_flab(m) = lf_flab(m)
pftcon%lf_fcel(m) = lf_fcel(m)
pftcon%lf_flig(m) = lf_flig(m)
pftcon%fr_flab(m) = fr_flab(m)
pftcon%fr_fcel(m) = fr_fcel(m)
pftcon%fr_flig(m) = fr_flig(m)
pftcon%dw_fcel(m) = dw_fcel(m)
pftcon%dw_flig(m) = dw_flig(m)
pftcon%leaf_long(m) = leaf_long(m)
pftcon%evergreen(m) = evergreen(m)
pftcon%stress_decid(m) = stress_decid(m)
pftcon%season_decid(m) = season_decid(m)
pftcon%resist(m) = resist(m)
pftcon%dwood(m) = dwood
end do
#ifdef CNDV
do m = 0,numpft
dgv_pftcon%crownarea_max(m) = pftpar20(m)
dgv_pftcon%tcmin(m) = pftpar28(m)
dgv_pftcon%tcmax(m) = pftpar29(m)
dgv_pftcon%gddmin(m) = pftpar30(m)
dgv_pftcon%twmax(m) = pftpar31(m)
dgv_pftcon%reinickerp(m) = reinickerp
dgv_pftcon%allom1(m) = allom1
dgv_pftcon%allom2(m) = allom2
dgv_pftcon%allom3(m) = allom3
! modification for shrubs by X.D.Z
if (m > ntree .and. m <= nbrdlf_dcd_brl_shrub ) then
dgv_pftcon%allom1(m) = allom1s
dgv_pftcon%allom2(m) = allom2s
end if
end do
#endif
! --------------------------------------------------------------------
! Define layer structure for soil, lakes, urban walls and roof
! Vertical profile of snow is not initialized here
! --------------------------------------------------------------------
! Lake layers (assumed same for all lake patches)
dzlak(1) = 0.1_r8
dzlak(2) = 1._r8
dzlak(3) = 2._r8
dzlak(4) = 3._r8
dzlak(5) = 4._r8
dzlak(6) = 5._r8
dzlak(7) = 7._r8
dzlak(8) = 7._r8
dzlak(9) = 10.45_r8
dzlak(10)= 10.45_r8
zlak(1) = 0.05_r8
zlak(2) = 0.6_r8
zlak(3) = 2.1_r8
zlak(4) = 4.6_r8
zlak(5) = 8.1_r8
zlak(6) = 12.6_r8
zlak(7) = 18.6_r8
zlak(8) = 25.6_r8
zlak(9) = 34.325_r8
zlak(10)= 44.775_r8
! Soil layers and interfaces (assumed same for all non-lake patches)
! "0" refers to soil surface and "nlevsoi" refers to the bottom of model soil
do j = 1, nlevgrnd
zsoi(j) = scalez*(exp(0.5_r8*(j-0.5_r8))-1._r8) !node depths
enddo
dzsoi(1) = 0.5_r8*(zsoi(1)+zsoi(2)) !thickness b/n two interfaces
do j = 2,nlevgrnd-1
dzsoi(j)= 0.5_r8*(zsoi(j+1)-zsoi(j-1))
enddo
dzsoi(nlevgrnd) = zsoi(nlevgrnd)-zsoi(nlevgrnd-1)
zisoi(0) = 0._r8
do j = 1, nlevgrnd-1
zisoi(j) = 0.5_r8*(zsoi(j)+zsoi(j+1)) !interface depths
enddo
zisoi(nlevgrnd) = zsoi(nlevgrnd) + 0.5_r8*dzsoi(nlevgrnd)
! Column level initialization for urban wall and roof layers and interfaces
do l = begl, endl
! "0" refers to urban wall/roof surface and "nlevsoi" refers to urban wall/roof bottom
if (ltype(l)==isturb) then
do j = 1, nlevurb
zurb_wall(l,j) = (j-0.5)*(thick_wall(l)/float(nlevurb)) !node depths
end do
do j = 1, nlevurb
zurb_roof(l,j) = (j-0.5)*(thick_roof(l)/float(nlevurb)) !node depths
end do
dzurb_wall(l,1) = 0.5*(zurb_wall(l,1)+zurb_wall(l,2)) !thickness b/n two interfaces
do j = 2,nlevurb-1
dzurb_wall(l,j)= 0.5*(zurb_wall(l,j+1)-zurb_wall(l,j-1))
enddo
dzurb_wall(l,nlevurb) = zurb_wall(l,nlevurb)-zurb_wall(l,nlevurb-1)
dzurb_roof(l,1) = 0.5*(zurb_roof(l,1)+zurb_roof(l,2)) !thickness b/n two interfaces
do j = 2,nlevurb-1
dzurb_roof(l,j)= 0.5*(zurb_roof(l,j+1)-zurb_roof(l,j-1))
enddo
dzurb_roof(l,nlevurb) = zurb_roof(l,nlevurb)-zurb_roof(l,nlevurb-1)
ziurb_wall(l,0) = 0.
do j = 1, nlevurb-1
ziurb_wall(l,j) = 0.5*(zurb_wall(l,j)+zurb_wall(l,j+1)) !interface depths
enddo
ziurb_wall(l,nlevurb) = zurb_wall(l,nlevurb) + 0.5*dzurb_wall(l,nlevurb)
ziurb_roof(l,0) = 0.
do j = 1, nlevurb-1
ziurb_roof(l,j) = 0.5*(zurb_roof(l,j)+zurb_roof(l,j+1)) !interface depths
enddo
ziurb_roof(l,nlevurb) = zurb_roof(l,nlevurb) + 0.5*dzurb_roof(l,nlevurb)
end if
end do
! --------------------------------------------------------------------
! Initialize nitrogen deposition values
! for now these are constants by gridcell, eventually they
! will be variables from the atmosphere, and at some point in between
! they will be specified time varying fields.
! --------------------------------------------------------------------
! Grid level initialization
do g = begg, endg
! VOC emission factors
! Set gridcell and landunit indices
efisop(:,g)=efisop2d(:,g)
end do
! --------------------------------------------------------------------
! Initialize soil and lake levels
! Initialize soil color, thermal and hydraulic properties
! --------------------------------------------------------------------
! Column level initialization
do c = begc, endc
! Set gridcell and landunit indices
g = cgridcell(c)
l = clandunit(c)
! initialize maximum daylength, based on latitude and maximum declination
! maximum declination hardwired for present-day orbital parameters,
! +/- 23.4667 degrees = +/- 0.409571 radians, use negative value for S. Hem
max_decl = 0.409571
if (lat(g) .lt. 0._r8) max_decl = -max_decl
temp = -(sin(lat(g))*sin(max_decl))/(cos(lat(g)) * cos(max_decl))
temp = min(1._r8,max(-1._r8,temp))
max_dayl(c) = 2.0_r8 * 13750.9871_r8 * acos(temp)
! Initialize restriction for min of soil potential (mm)
smpmin(c) = -1.e8_r8
! Decay factor (m)
hkdepth(c) = 1._r8/2.5_r8
! Maximum saturated fraction
wtfact(c) = gti(g)
! Soil color
isoicol(c) = soic2d(g)
! Soil hydraulic and thermal properties
! Note that urban roof, sunwall and shadewall thermal properties used to
! derive thermal conductivity and heat capacity are set to special
! value because thermal conductivity and heat capacity for urban
! roof, sunwall and shadewall are prescribed in SoilThermProp.F90 in
! SoilTemperatureMod.F90
if (ltype(l)==istdlak .or. ltype(l)==istwet .or. ltype(l)==istice .or. ltype(l)==istice_mec) then
do lev = 1,nlevgrnd
bsw(c,lev) = spval
bsw2(c,lev) = spval
psisat(c,lev) = spval
vwcsat(c,lev) = spval
watsat(c,lev) = spval
watfc(c,lev) = spval
hksat(c,lev) = spval
sucsat(c,lev) = spval
tkmg(c,lev) = spval
tksatu(c,lev) = spval
tkdry(c,lev) = spval
if (ltype(l)==istwet .and. lev > nlevsoi) then
csol(c,lev) = csol_bedrock
else
csol(c,lev)= spval
endif
watdry(c,lev) = spval
watopt(c,lev) = spval
end do
else if (ltype(l)==isturb .and. (ctype(c) /= icol_road_perv) .and. (ctype(c) /= icol_road_imperv) )then
! Urban Roof, sunwall, shadewall properties set to special value
do lev = 1,nlevurb
watsat(c,lev) = spval
watfc(c,lev) = spval
bsw(c,lev) = spval
bsw2(c,lev) = spval
psisat(c,lev) = spval
vwcsat(c,lev) = spval
hksat(c,lev) = spval
sucsat(c,lev) = spval
tkmg(c,lev) = spval
tksatu(c,lev) = spval
tkdry(c,lev) = spval
csol(c,lev) = spval
watdry(c,lev) = spval
watopt(c,lev) = spval
end do
else ! soil columns of both urban and non-urban types
do lev = 1,nlevgrnd
! duplicate clay and sand values from 10th soil layer
if (lev .le. nlevsoi) then
clay = clay3d(g,lev)
sand = sand3d(g,lev)
om_frac = (organic3d(g,lev)/organic_max)**2._r8
else
clay = clay3d(g,nlevsoi)
sand = sand3d(g,nlevsoi)
om_frac = 0._r8
endif
! No organic matter for urban
if (ltype(l)==isturb) then
om_frac = 0._r8
end if
! Note that the following properties are overwritten for urban impervious road
! layers that are not soil in SoilThermProp.F90 within SoilTemperatureMod.F90
watsat(c,lev) = 0.489_r8 - 0.00126_r8*sand
bsw(c,lev) = 2.91 + 0.159*clay
sucsat(c,lev) = 10._r8 * ( 10._r8**(1.88_r8-0.0131_r8*sand) )
bd = (1._r8-watsat(c,lev))*2.7e3_r8
watsat(c,lev) = (1._r8 - om_frac)*watsat(c,lev) + om_watsat*om_frac
tkm = (1._r8-om_frac)*(8.80_r8*sand+2.92_r8*clay)/(sand+clay)+om_tkm*om_frac ! W/(m K)
bsw(c,lev) = (1._r8-om_frac)*(2.91_r8 + 0.159_r8*clay) + om_frac*om_b
bsw2(c,lev) = -(3.10_r8 + 0.157_r8*clay - 0.003_r8*sand)
psisat(c,lev) = -(exp((1.54_r8 - 0.0095_r8*sand + 0.0063_r8*(100.0_r8-sand-clay))*log(10.0_r8))*9.8e-5_r8)
vwcsat(c,lev) = (50.5_r8 - 0.142_r8*sand - 0.037_r8*clay)/100.0_r8
sucsat(c,lev) = (1._r8-om_frac)*sucsat(c,lev) + om_sucsat*om_frac
xksat = 0.0070556 *( 10.**(-0.884+0.0153*sand) ) ! mm/s
! perc_frac is zero unless perf_frac greater than percolation threshold
if (om_frac > pc) then
perc_norm=(1._r8 - pc)**(-pcbeta)
perc_frac=perc_norm*(om_frac - pc)**pcbeta
else
perc_frac=0._r8
endif
! uncon_frac is fraction of mineral soil plus fraction of "nonpercolating" organic soil
uncon_frac=(1._r8-om_frac)+(1._r8-perc_frac)*om_frac
! uncon_hksat is series addition of mineral/organic conductivites
if (om_frac .lt. 1._r8) then
uncon_hksat=uncon_frac/((1._r8-om_frac)/xksat &
+((1._r8-perc_frac)*om_frac)/om_hksat)
else
uncon_hksat = 0._r8
end if
hksat(c,lev) = uncon_frac*uncon_hksat + (perc_frac*om_frac)*om_hksat
tkmg(c,lev) = tkm ** (1._r8- watsat(c,lev))
tksatu(c,lev) = tkmg(c,lev)*0.57_r8**watsat(c,lev)
tkdry(c,lev) = ((0.135_r8*bd + 64.7_r8) / (2.7e3_r8 - 0.947_r8*bd))*(1._r8-om_frac) + &
om_tkd*om_frac
csol(c,lev) = ((1._r8-om_frac)*(2.128_r8*sand+2.385_r8*clay) / (sand+clay) + &
om_csol*om_frac)*1.e6_r8 ! J/(m3 K)
if (lev .gt. nlevsoi) then
csol(c,lev) = csol_bedrock
endif
watdry(c,lev) = watsat(c,lev) * (316230._r8/sucsat(c,lev)) ** (-1._r8/bsw(c,lev))
watopt(c,lev) = watsat(c,lev) * (158490._r8/sucsat(c,lev)) ** (-1._r8/bsw(c,lev))
!! added by K.Sakaguchi for beta from Lee and Pielke, 1992
! water content at field capacity, defined as hk = 0.1 mm/day
! used eqn (7.70) in CLM3 technote with k = 0.1 (mm/day) / 86400 (day/sec)
watfc(c,lev) = watsat(c,lev) * (0.1_r8 / (hksat(c,lev)*86400._r8))**(1._r8/(2._r8*bsw(c,lev)+3._r8))
end do
!
! Urban pervious and impervious road
!
! Impervious road layers -- same as above except set watdry and watopt as missing
if (ctype(c) == icol_road_imperv) then
do lev = 1,nlevgrnd
watdry(c,lev) = spval
watopt(c,lev) = spval
end do
! pervious road layers -- same as above except also set rootfr_road_perv
! Currently, pervious road has same properties as soil
else if (ctype(c) == icol_road_perv) then
do lev = 1, nlevgrnd
rootfr_road_perv(c,lev) = 0._r8
enddo
do lev = 1,nlevsoi
rootfr_road_perv(c,lev) = 0.1_r8 ! uniform profile
end do
end if
endif
! Define lake or non-lake levels, layers and interfaces
if (ltype(l) == istdlak) then
z(c,1:nlevlak) = zlak(1:nlevlak)
dz(c,1:nlevlak) = dzlak(1:nlevlak)
else if (ltype(l) == isturb) then
if (ctype(c)==icol_sunwall .or. ctype(c)==icol_shadewall) then
z(c,1:nlevurb) = zurb_wall(l,1:nlevurb)
zi(c,0:nlevurb) = ziurb_wall(l,0:nlevurb)
dz(c,1:nlevurb) = dzurb_wall(l,1:nlevurb)
else if (ctype(c)==icol_roof) then
z(c,1:nlevurb) = zurb_roof(l,1:nlevurb)
zi(c,0:nlevurb) = ziurb_roof(l,0:nlevurb)
dz(c,1:nlevurb) = dzurb_roof(l,1:nlevurb)
else
z(c,1:nlevurb) = zsoi(1:nlevurb)
zi(c,0:nlevurb) = zisoi(0:nlevurb)
dz(c,1:nlevurb) = dzsoi(1:nlevurb)
end if
else
z(c,1:nlevgrnd) = zsoi(1:nlevgrnd)
zi(c,0:nlevgrnd) = zisoi(0:nlevgrnd)
dz(c,1:nlevgrnd) = dzsoi(1:nlevgrnd)
end if
! Initialize terms needed for dust model
clay = clay3d(g,1)
gwc_thr(c) = 0.17_r8 + 0.14_r8*clay*0.01_r8
mss_frc_cly_vld(c) = min(clay*0.01_r8, 0.20_r8)
end do
! pft level initialization
do p = begp, endp
! Initialize maximum allowed dew
dewmx(p) = 0.1_r8
! Initialize root fraction (computing from surface, d is depth in meter):
! Y = 1 -1/2 (exp(-ad)+exp(-bd) under the constraint that
! Y(d =0.1m) = 1-beta^(10 cm) and Y(d=d_obs)=0.99 with
! beta & d_obs given in Zeng et al. (1998).
c = pcolumn(p)
if (ivt(p) /= noveg) then
do lev = 1, nlevgrnd
rootfr(p,lev) = 0._r8
enddo
do lev = 1, nlevsoi-1
rootfr(p,lev) = .5_r8*( exp(-roota_par(ivt(p)) * zi(c,lev-1)) &
+ exp(-rootb_par(ivt(p)) * zi(c,lev-1)) &
- exp(-roota_par(ivt(p)) * zi(c,lev )) &
- exp(-rootb_par(ivt(p)) * zi(c,lev )) )
end do
rootfr(p,nlevsoi) = .5_r8*( exp(-roota_par(ivt(p)) * zi(c,nlevsoi-1)) &
+ exp(-rootb_par(ivt(p)) * zi(c,nlevsoi-1)) )
rootfr(p,nlevsoi+1:nlevgrnd) = 0.0_r8
!#if (defined CN)
! ! replacing the exponential rooting distribution
! ! with a linear decrease, going to zero at the bottom of the lowest
! ! soil layer for woody pfts, but going to zero at the bottom of
! ! layer 8 for non-woody pfts. This corresponds to 3.43 m for woody
! ! bottom, vs 1.38 m for non-woody bottom.
! if (woody(ivt(p)) == 1) then
! bottom = nlevsoi
! slope = -2._r8/(zi(c,bottom)*zi(c,bottom))
! intercept = 2._r8/zi(c,bottom)
! do lev = 1, bottom
! rootfr(p,lev) = dz(c,lev) * 0.5_r8 * ((intercept+slope*zi(c,lev-1)) + (intercept+slope*zi(c,lev)))
! end do
! if (bottom < nlevsoi) then
! do lev=bottom+1,nlevgrnd
! rootfr(p,lev) = 0._r8
! end do
! end if
! else
! bottom = 8
! slope = -2._r8/(zi(c,bottom)*zi(c,bottom))
! intercept = 2._r8/zi(c,bottom)
! do lev=1,bottom
! rootfr(p,lev) = dz(c,lev) * 0.5_r8 * ((intercept+slope*zi(c,lev-1)) + (intercept+slope*zi(c,lev)))
! end do
! if (bottom < nlevsoi) then
! do lev=bottom+1,nlevgrnd
! rootfr(p,lev) = 0._r8
! end do
! end if
! end if
!#endif
else
rootfr(p,1:nlevsoi) = 0._r8
endif
! initialize rresis, for use in ecosystemdyn
do lev = 1,nlevgrnd
rresis(p,lev) = 0._r8
end do
end do ! end pft level initialization
#if (defined CN)
! initialize the CN variables for special landunits, including lake points
call CNiniSpecial
()
#endif
deallocate(soic2d,sand3d,clay3d,gti,organic3d)
deallocate(temp_ef,efisop2d)
! Initialize SNICAR optical and aging parameters:
call SnowOptics_init
( )
call SnowAge_init
( )
if (masterproc) write(iulog,*) 'Successfully initialized time invariant variables'
end subroutine iniTimeConst