#include <misc.h> #include <preproc.h> module pftvarcon 19,4 !----------------------------------------------------------------------- !BOP ! ! !MODULE: pftvarcon ! ! !DESCRIPTION: ! Module containing vegetation constants and method to ! read and initialize vegetation (PFT) constants. ! ! !USES: use shr_kind_mod, only : r8 => shr_kind_r8 use abortutils , only : endrun use clm_varpar , only : numpft, numrad use clm_varctl , only : iulog ! ! !PUBLIC TYPES: implicit none save ! ! Vegetation type constants ! character(len=40) pftname(0:numpft) !PFT description integer :: noveg !value for not vegetated integer :: ndllf_evr_tmp_tree !value for Needleleaf evergreen temperate tree integer :: ndllf_evr_brl_tree !value for Needleleaf evergreen boreal tree integer :: ndllf_dcd_brl_tree !value for Needleleaf deciduous boreal tree integer :: nbrdlf_evr_trp_tree !value for Broadleaf evergreen tropical tree integer :: nbrdlf_evr_tmp_tree !value for Broadleaf evergreen temperate tree integer :: nbrdlf_dcd_trp_tree !value for Broadleaf deciduous tropical tree integer :: nbrdlf_dcd_tmp_tree !value for Broadleaf deciduous temperate tree integer :: nbrdlf_dcd_brl_tree !value for Broadleaf deciduous boreal tree integer :: ntree !value for last type of tree integer :: nbrdlf_evr_shrub !value for Broadleaf evergreen shrub integer :: nbrdlf_dcd_tmp_shrub !value for Broadleaf deciduous temperate shrub integer :: nbrdlf_dcd_brl_shrub !value for Broadleaf deciduous boreal shrub integer :: nc3_arctic_grass !value for C3 arctic grass integer :: nc3_nonarctic_grass !value for C3 non-arctic grass integer :: nc4_grass !value for C4 grass integer :: ncorn !value for corn integer :: nwheat !value for wheat real(r8):: dleaf(0:numpft) !characteristic leaf dimension (m) real(r8):: c3psn(0:numpft) !photosynthetic pathway: 0. = c4, 1. = c3 real(r8):: vcmx25(0:numpft) !max rate of carboxylation at 25C (umol CO2/m**2/s) real(r8):: mp(0:numpft) !slope of conductance-to-photosynthesis relationship real(r8):: qe25(0:numpft) !quantum efficiency at 25C (umol CO2 / umol photon) real(r8):: xl(0:numpft) !leaf/stem orientation index real(r8):: rhol(0:numpft,numrad) !leaf reflectance: 1=vis, 2=nir real(r8):: rhos(0:numpft,numrad) !stem reflectance: 1=vis, 2=nir real(r8):: taul(0:numpft,numrad) !leaf transmittance: 1=vis, 2=nir real(r8):: taus(0:numpft,numrad) !stem transmittance: 1=vis, 2=nir real(r8):: z0mr(0:numpft) !ratio of momentum roughness length to canopy top height (-) real(r8):: displar(0:numpft) !ratio of displacement height to canopy top height (-) real(r8):: roota_par(0:numpft) !CLM rooting distribution parameter [1/m] real(r8):: rootb_par(0:numpft) !CLM rooting distribution parameter [1/m] real(r8):: crop(0:numpft) ! crop pft: 0. = not crop, 1. = crop pft ! real(r8):: sla(0:numpft) ! specific leaf area [m2 leaf g-1 carbon] real(r8):: smpso(0:numpft) !soil water potential at full stomatal opening (mm) real(r8):: smpsc(0:numpft) !soil water potential at full stomatal closure (mm) real(r8):: fnitr(0:numpft) !foliage nitrogen limitation factor (-) ! begin new pft parameters for CN code real(r8):: slatop(0:numpft) !SLA at top of canopy [m^2/gC] real(r8):: dsladlai(0:numpft) !dSLA/dLAI [m^2/gC] real(r8):: leafcn(0:numpft) !leaf C:N [gC/gN] real(r8):: flnr(0:numpft) !fraction of leaf N in Rubisco [no units] real(r8):: woody(0:numpft) !woody lifeform flag (0 or 1) real(r8):: lflitcn(0:numpft) !leaf litter C:N (gC/gN) real(r8):: frootcn(0:numpft) !fine root C:N (gC/gN) real(r8):: livewdcn(0:numpft) !live wood (phloem and ray parenchyma) C:N (gC/gN) real(r8):: deadwdcn(0:numpft) !dead wood (xylem and heartwood) C:N (gC/gN) real(r8):: froot_leaf(0:numpft) !allocation parameter: new fine root C per new leaf C (gC/gC) real(r8):: stem_leaf(0:numpft) !allocation parameter: new stem c per new leaf C (gC/gC) real(r8):: croot_stem(0:numpft) !allocation parameter: new coarse root C per new stem C (gC/gC) real(r8):: flivewd(0:numpft) !allocation parameter: fraction of new wood that is live (phloem and ray parenchyma) (no units) real(r8):: fcur(0:numpft) !allocation parameter: fraction of allocation that goes to currently displayed growth, remainder to storage real(r8):: lf_flab(0:numpft) !leaf litter labile fraction real(r8):: lf_fcel(0:numpft) !leaf litter cellulose fraction real(r8):: lf_flig(0:numpft) !leaf litter lignin fraction real(r8):: fr_flab(0:numpft) !fine root litter labile fraction real(r8):: fr_fcel(0:numpft) !fine root litter cellulose fraction real(r8):: fr_flig(0:numpft) !fine root litter lignin fraction real(r8):: dw_fcel(0:numpft) !dead wood cellulose fraction real(r8):: dw_flig(0:numpft) !dead wood lignin fraction real(r8):: leaf_long(0:numpft) !leaf longevity (yrs) real(r8):: evergreen(0:numpft) !binary flag for evergreen leaf habit (0 or 1) real(r8):: stress_decid(0:numpft) !binary flag for stress-deciduous leaf habit (0 or 1) real(r8):: season_decid(0:numpft) !binary flag for seasonal-deciduous leaf habit (0 or 1) ! new pft parameters for CN-fire code real(r8):: resist(0:numpft) !resistance to fire (no units) ! pft parameters for CNDV code ! from LPJ subroutine pftparameters real(r8) pftpar20(0:numpft) !tree maximum crown area (m2) real(r8) pftpar28(0:numpft) !min coldest monthly mean temperature real(r8) pftpar29(0:numpft) !max coldest monthly mean temperature real(r8) pftpar30(0:numpft) !min growing degree days (>= 5 deg C) real(r8) pftpar31(0:numpft) !upper limit of temperature of the warmest month (twmax) real(r8), parameter :: reinickerp = 1.6_r8 !parameter in allometric equation real(r8), parameter :: dwood = 2.5e5_r8 !cn wood density (gC/m3); lpj:2.0e5 real(r8), parameter :: allom1 = 100.0_r8 !parameters in real(r8), parameter :: allom2 = 40.0_r8 !...allometric real(r8), parameter :: allom3 = 0.5_r8 !...equations real(r8), parameter :: allom1s = 250.0_r8 !modified for shrubs by real(r8), parameter :: allom2s = 8.0_r8 !X.D.Z ! ! !PUBLIC MEMBER FUNCTIONS: public :: pftconrd ! Read and initialize vegetation (PFT) constants ! ! !REVISION HISTORY: ! Created by Sam Levis (put into module form by Mariana Vertenstein) ! 10/21/03, Peter Thornton: Added new variables for CN code ! 06/24/09, Erik Kluzek: Add indices for all pft types, and add expected_pftnames array and comparision ! !EOP !----------------------------------------------------------------------- contains !----------------------------------------------------------------------- !BOP ! ! !IROUTINE: pftconrd ! ! !INTERFACE: subroutine pftconrd 1,10 ! ! !DESCRIPTION: ! Read and initialize vegetation (PFT) constants ! ! !USES: use fileutils , only : opnfil, getfil, relavu, getavu use clm_varctl, only : fpftcon use spmdMod , only : masterproc, mpicom, MPI_REAL8, MPI_CHARACTER, MPI_INTEGER use nanMod , only : inf ! ! !ARGUMENTS: implicit none ! ! !CALLED FROM: ! routine initialize in module initializeMod ! ! !REVISION HISTORY: ! Created by Gordon Bonan ! ! ! !LOCAL VARIABLES: !EOP character(len=256) :: locfn ! local file name integer :: i,n ! loop indices integer :: ier ! error code ! ! Expected PFT names: The names expected on the fpftcon file and the order they are expected to be in. ! NOTE: similar types are assumed to be together, first trees (ending with broadleaf_deciduous_boreal_tree ! then shrubs, ending with broadleaf_deciduous_boreal_shrub, then grasses starting with c3_arctic_grass ! and finally crops, ending with wheat ! DO NOT CHANGE THE ORDER -- WITHOUT MODIFYING OTHER PARTS OF THE CODE WHERE THE ORDER MATTERS! ! character(len=*), parameter :: expected_pftnames(1:numpft) = (/ & 'needleleaf_evergreen_temperate_tree' & , 'needleleaf_evergreen_boreal_tree ' & , 'needleleaf_deciduous_boreal_tree ' & , 'broadleaf_evergreen_tropical_tree ' & , 'broadleaf_evergreen_temperate_tree ' & , 'broadleaf_deciduous_tropical_tree ' & , 'broadleaf_deciduous_temperate_tree ' & , 'broadleaf_deciduous_boreal_tree ' & , 'broadleaf_evergreen_shrub ' & , 'broadleaf_deciduous_temperate_shrub' & , 'broadleaf_deciduous_boreal_shrub ' & , 'c3_arctic_grass ' & , 'c3_non-arctic_grass ' & , 'c4_grass ' & , 'corn ' & , 'wheat ' & /) !----------------------------------------------------------------------- ! Set specific vegetation type values noveg = 0 ! value for non-vegetated ! Assign unit number to file. Get local file. ! Open file and read PFT's. ! Close and release file. if (masterproc) then write(iulog,*) 'Attempting to read PFT physiological data .....' n = getavu() call getfil (fpftcon, locfn, 0) call opnfil (locfn, n, 'f') do i = 1, numpft read (n,*,iostat=ier) pftname(i), & z0mr(i) , displar(i), dleaf(i) , c3psn(i) , & vcmx25(i) , mp(i) , qe25(i) , rhol(i,1) , & rhol(i,2) , rhos(i,1) , rhos(i,2) , taul(i,1) , & taul(i,2) , taus(i,1) , taus(i,2) , xl(i) , & roota_par(i), rootb_par(i), slatop(i), dsladlai(i), & leafcn(i), flnr(i), & smpso(i), smpsc(i), fnitr(i), & ! End of Standard model woody(i), lflitcn(i), frootcn(i), livewdcn(i), & ! Start of CN deadwdcn(i), froot_leaf(i), stem_leaf(i), croot_stem(i), & flivewd(i), fcur(i), lf_flab(i), lf_fcel(i), lf_flig(i), & fr_flab(i), fr_fcel(i), fr_flig(i), dw_fcel(i), dw_flig(i), & leaf_long(i), evergreen(i), stress_decid(i), season_decid(i), & resist(i), & ! End of CN pftpar20(i), pftpar28(i), pftpar29(i), pftpar30(i), pftpar31(i) ! CNDV only if (ier /= 0) then write(iulog,*)'pftconrd: error in reading in pft data' call endrun() end if end do call relavu (n) end if call mpi_bcast (pftname, (numpft+1)*len(pftname(noveg)), MPI_CHARACTER, 0, mpicom, ier) do i = 1, numpft if ( trim(pftname(i)) /= trim(expected_pftnames(i)) )then write(iulog,*)'pftconrd: pftname is NOT what is expected, name = ', & trim(pftname(i)), ', expected name = ', trim(expected_pftnames(i)) call endrun( 'pftconrd: bad name for pft on fpftcon dataset' ) end if if ( trim(pftname(i)) == 'needleleaf_evergreen_temperate_tree' ) ndllf_evr_tmp_tree = i if ( trim(pftname(i)) == 'needleleaf_evergreen_boreal_tree' ) ndllf_evr_brl_tree = i if ( trim(pftname(i)) == 'needleleaf_deciduous_boreal_tree' ) ndllf_dcd_brl_tree = i if ( trim(pftname(i)) == 'broadleaf_evergreen_tropical_tree' ) nbrdlf_evr_trp_tree = i if ( trim(pftname(i)) == 'broadleaf_evergreen_temperate_tree' ) nbrdlf_evr_tmp_tree = i if ( trim(pftname(i)) == 'broadleaf_deciduous_tropical_tree' ) nbrdlf_dcd_trp_tree = i if ( trim(pftname(i)) == 'broadleaf_deciduous_temperate_tree' ) nbrdlf_dcd_tmp_tree = i if ( trim(pftname(i)) == 'broadleaf_deciduous_boreal_tree' ) nbrdlf_dcd_brl_tree = i if ( trim(pftname(i)) == 'broadleaf_evergreen_shrub' ) nbrdlf_evr_shrub = i if ( trim(pftname(i)) == 'broadleaf_deciduous_temperate_shrub' ) nbrdlf_dcd_tmp_shrub = i if ( trim(pftname(i)) == 'broadleaf_deciduous_boreal_shrub' ) nbrdlf_dcd_brl_shrub = i if ( trim(pftname(i)) == 'c3_arctic_grass' ) nc3_arctic_grass = i if ( trim(pftname(i)) == 'c3_non-arctic_grass' ) nc3_nonarctic_grass = i if ( trim(pftname(i)) == 'c4_grass' ) nc4_grass = i if ( trim(pftname(i)) == 'corn' ) ncorn = i if ( trim(pftname(i)) == 'wheat' ) nwheat = i end do ntree = nbrdlf_dcd_brl_tree ! value for last type of tree ! ! Only do the following on masterproc to emulate having read it from a file ! After this will do a broadcast to send these settings and what read from the file to all processors ! if (masterproc) then ! Set some crop-related parameters explicitly here ! (in future will be on pft dataset) crop(:) = 0 crop(ncorn:numpft) = 1 ! Define array values for PFT=noveg to be bare ground pftname(noveg) = 'not_vegetated' z0mr(noveg) = 0._r8 displar(noveg) = 0._r8 dleaf(noveg) = 0._r8 c3psn(noveg) = 1._r8 vcmx25(noveg) = 0._r8 mp(noveg) = 9._r8 qe25(noveg) = 0._r8 rhol(noveg,1) = 0._r8 rhol(noveg,2) = 0._r8 rhos(noveg,1) = 0._r8 rhos(noveg,2) = 0._r8 taul(noveg,1) = 0._r8 taul(noveg,2) = 0._r8 taus(noveg,1) = 0._r8 taus(noveg,2) = 0._r8 xl(noveg) = 0._r8 roota_par(noveg) = 0._r8 rootb_par(noveg) = 0._r8 crop(noveg) = 0._r8 smpso(noveg) = 0._r8 smpsc(noveg) = 0._r8 fnitr(noveg) = 0._r8 slatop(noveg) = 0._r8 dsladlai(noveg) = 0._r8 leafcn(noveg) = 1._r8 flnr(noveg) = 0._r8 ! begin variables used only for CN code woody(noveg) = 0._r8 lflitcn(noveg) = 1._r8 frootcn(noveg) = 1._r8 livewdcn(noveg) = 1._r8 deadwdcn(noveg) = 1._r8 froot_leaf(noveg) = 0._r8 stem_leaf(noveg) = 0._r8 croot_stem(noveg) = 0._r8 flivewd(noveg) = 0._r8 fcur(noveg) = 0._r8 lf_flab(noveg) = 0._r8 lf_fcel(noveg) = 0._r8 lf_flig(noveg) = 0._r8 fr_flab(noveg) = 0._r8 fr_fcel(noveg) = 0._r8 fr_flig(noveg) = 0._r8 dw_fcel(noveg) = 0._r8 dw_flig(noveg) = 0._r8 leaf_long(noveg) = 0._r8 evergreen(noveg) = 0._r8 stress_decid(noveg) = 0._r8 season_decid(noveg) = 0._r8 resist(noveg) = 1._r8 pftpar20(noveg) = inf pftpar28(noveg) = 9999.9_r8 pftpar29(noveg) = 1000.0_r8 pftpar30(noveg) = 0.0_r8 pftpar31(noveg) = 1000.0_r8 ! end variables used only for CN code end if call mpi_bcast (z0mr, size(z0mr), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (displar, size(displar), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (dleaf, size(dleaf), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (c3psn, size(c3psn), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (vcmx25, size(vcmx25), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (mp, size(mp), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (qe25, size(qe25), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (rhol, size(rhol), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (rhos, size(rhos), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (taul, size(taul), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (taus, size(taus), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (xl, size(xl), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (roota_par, size(roota_par), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (rootb_par, size(rootb_par), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (crop, size(crop), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (smpso, size(smpso), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (smpsc, size(smpsc), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (fnitr, size(fnitr), MPI_REAL8, 0, mpicom, ier) ! begin variables used only for CN code call mpi_bcast (slatop, size(slatop), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (dsladlai, size(dsladlai), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (leafcn, size(leafcn), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (flnr, size(flnr), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (woody, size(woody), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (lflitcn, size(lflitcn), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (frootcn, size(frootcn), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (livewdcn, size(livewdcn), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (deadwdcn, size(deadwdcn), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (froot_leaf, size(froot_leaf), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (stem_leaf, size(stem_leaf), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (croot_stem, size(croot_stem), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (flivewd, size(flivewd), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (fcur, size(fcur), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (lf_flab, size(lf_flab), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (lf_fcel, size(lf_fcel), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (lf_flig, size(lf_flig), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (fr_flab, size(fr_flab), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (fr_fcel, size(fr_fcel), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (fr_flig, size(fr_flig), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (dw_fcel, size(dw_fcel), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (dw_flig, size(dw_flig), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (leaf_long, size(leaf_long), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (evergreen, size(evergreen), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (stress_decid, size(stress_decid), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (season_decid, size(season_decid), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (resist, size(resist), MPI_REAL8, 0, mpicom, ier) ! end variables used only for CN code ! begin variables used only for CNDV code call mpi_bcast (pftpar20, size(pftpar20), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (pftpar28, size(pftpar28), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (pftpar29, size(pftpar29), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (pftpar30, size(pftpar30), MPI_REAL8, 0, mpicom, ier) call mpi_bcast (pftpar31, size(pftpar31), MPI_REAL8, 0, mpicom, ier) ! end variables used only for CNDV code if (masterproc) then write(iulog,*) 'Successfully read PFT physiological data' write(iulog,*) end if end subroutine pftconrd end module pftvarcon