next up previous contents
Next: Fortran: Module Interface Biogeophysics2Mod Up: Fortran: Module Interface Biogeophysics1Mod Previous: Fortran: Module Interface Biogeophysics1Mod   Contents

Biogeophysics1


INTERFACE:

   subroutine Biogeophysics1(lbg, ubg, lbc, ubc, lbp, ubp, &
        num_nolakec, filter_nolakec, num_nolakep, filter_nolakep)
DESCRIPTION:

This is the main subroutine to execute the calculation of leaf temperature and surface fluxes. Biogeophysics2.F90 then determines soil/snow and ground temperatures and updates the surface fluxes for the new ground temperature.

Calling sequence is: Biogeophysics1: surface biogeophysics driver -> QSat: saturated vapor pressure, specific humidity, and derivatives at ground surface and derivatives at leaf surface using updated leaf temperature Leaf temperature Foliage energy conservation is given by the foliage energy budget equation: Rnet - Hf - LEf = 0 The equation is solved by Newton-Raphson iteration, in which this iteration includes the calculation of the photosynthesis and stomatal resistance, and the integration of turbulent flux profiles. The sensible and latent heat transfer between foliage and atmosphere and ground is linked by the equations: Ha = Hf + Hg and Ea = Ef + Eg


USES:

     use clmtype
     use clm_atmlnd         , only : clm_a2l
     use clm_varcon         , only : denh2o, denice, roverg, hvap, hsub, &
                                     istice, istice_mec, istwet, istsoil, isturb, istdlak, &
                                     zlnd, zsno, tfrz, &
                                     icol_roof, icol_sunwall, icol_shadewall,     &
                                     icol_road_imperv, icol_road_perv, tfrz, spval, istdlak
     use clm_varcon         , only : istcrop
     use clm_varpar         , only : nlevgrnd, nlevurb, nlevsno, max_pft_per_gcell, nlevsoi
     use QSatMod            , only : QSat
     use shr_const_mod      , only : SHR_CONST_PI
ARGUMENTS:
     implicit none
     integer, intent(in) :: lbg, ubg                    ! gridcell-index bounds
     integer, intent(in) :: lbc, ubc                    ! column-index bounds
     integer, intent(in) :: lbp, ubp                    ! pft-index bounds
     integer, intent(in) :: num_nolakec                 ! number of column non-lake points in column filter
     integer, intent(in) :: filter_nolakec(ubc-lbc+1)   ! column filter for non-lake points
     integer, intent(in) :: num_nolakep                 ! number of column non-lake points in pft filter
     integer, intent(in) :: filter_nolakep(ubp-lbp+1)   ! pft filter for non-lake points
CALLED FROM:
   subroutine clm_driver1
REVISION HISTORY:
   15 September 1999: Yongjiu Dai; Initial code
   15 December 1999:  Paul Houser and Jon Radakovich; F90 Revision
   Migrated to clm2.0 by Keith Oleson and Mariana Vertenstein
   Migrated to clm2.1 new data structures by Peter Thornton and M. Vertenstein
   27 February 2008: Keith Oleson; weighted soil/snow emissivity
LOCAL VARIABLES:
   local pointers to implicit in arguments
     integer , pointer :: ivt(:)           !pft vegetation type
     integer , pointer :: ityplun(:)       !landunit type
     integer , pointer :: clandunit(:)     !column's landunit index
     integer , pointer :: cgridcell(:)     !column's gridcell index
     real(r8), pointer :: pwtgcell(:)      !weight relative to gridcell for each pft
     integer , pointer :: ctype(:)         !column type
     real(r8), pointer :: forc_pbot(:)     !atmospheric pressure (Pa)
     real(r8), pointer :: forc_q(:)        !atmospheric specific humidity (kg/kg)
     real(r8), pointer :: forc_t(:)        !atmospheric temperature (Kelvin)
     real(r8), pointer :: forc_hgt_t(:)    !observational height of temperature [m]
     real(r8), pointer :: forc_hgt_u(:)    !observational height of wind [m]
     real(r8), pointer :: forc_hgt_q(:)    !observational height of specific humidity [m]
     integer , pointer :: npfts(:)         !number of pfts on gridcell
     integer , pointer :: pfti(:)          !initial pft on gridcell
     integer , pointer :: plandunit(:)     !pft's landunit index
     real(r8), pointer :: forc_hgt_u_pft(:) !observational height of wind at pft level [m]
     real(r8), pointer :: forc_hgt_t_pft(:) !observational height of temperature at pft level [m]
     real(r8), pointer :: forc_hgt_q_pft(:) !observational height of specific humidity at pft level [m]
     integer , pointer :: frac_veg_nosno(:) !fraction of vegetation not covered by snow (0 OR 1) [-]
     integer , pointer :: pgridcell(:)      !pft's gridcell index
     integer , pointer :: pcolumn(:)        !pft's column index
     real(r8), pointer :: z_0_town(:)      !momentum roughness length of urban landunit (m)
     real(r8), pointer :: z_d_town(:)      !displacement height of urban landunit (m)
     real(r8), pointer :: forc_th(:)       !atmospheric potential temperature (Kelvin)
     real(r8), pointer :: forc_u(:)        !atmospheric wind speed in east direction (m/s)
     real(r8), pointer :: forc_v(:)        !atmospheric wind speed in north direction (m/s)
     real(r8), pointer :: smpmin(:)        !restriction for min of soil potential (mm)
     integer , pointer :: snl(:)           !number of snow layers
     real(r8), pointer :: frac_sno(:)      !fraction of ground covered by snow (0 to 1)
     real(r8), pointer :: h2osno(:)        !snow water (mm H2O)
     real(r8), pointer :: elai(:)          !one-sided leaf area index with burying by snow
     real(r8), pointer :: esai(:)          !one-sided stem area index with burying by snow
     real(r8), pointer :: z0mr(:)          !ratio of momentum roughness length to canopy top height (-)
     real(r8), pointer :: displar(:)       !ratio of displacement height to canopy top height (-)
     real(r8), pointer :: htop(:)          !canopy top (m)
     real(r8), pointer :: dz(:,:)          !layer depth (m)
     real(r8), pointer :: t_soisno(:,:)    !soil temperature (Kelvin)
     real(r8), pointer :: h2osoi_liq(:,:)  !liquid water (kg/m2)
     real(r8), pointer :: h2osoi_ice(:,:)  !ice lens (kg/m2)
     real(r8), pointer :: watsat(:,:)      !volumetric soil water at saturation (porosity)
     real(r8), pointer :: sucsat(:,:)      !minimum soil suction (mm)
     real(r8), pointer :: bsw(:,:)         !Clapp and Hornberger "b"
     real(r8), pointer :: watfc(:,:)       !volumetric soil water at field capacity
     real(r8), pointer :: watopt(:,:)      !volumetric soil moisture corresponding to no restriction on ET from urban pervious surface
     real(r8), pointer :: watdry(:,:)      !volumetric soil moisture corresponding to no restriction on ET from urban pervious surface
     real(r8), pointer :: rootfr_road_perv(:,:) !fraction of roots in each soil layer for urban pervious road
     real(r8), pointer :: rootr_road_perv(:,:) !effective fraction of roots in each soil layer for urban pervious road
   local pointers to implicit out arguments
     real(r8), pointer :: t_grnd(:)        !ground temperature (Kelvin)
     real(r8), pointer :: qg(:)            !ground specific humidity [kg/kg]
     real(r8), pointer :: dqgdT(:)         !d(qg)/dT
     real(r8), pointer :: emg(:)           !ground emissivity
     real(r8), pointer :: htvp(:)          !latent heat of vapor of water (or sublimation) [j/kg]
     real(r8), pointer :: beta(:)          !coefficient of convective velocity [-]
     real(r8), pointer :: zii(:)           !convective boundary height [m]
     real(r8), pointer :: thm(:)           !intermediate variable (forc_t+0.0098*forc_hgt_t_pft)
     real(r8), pointer :: thv(:)           !virtual potential temperature (kelvin)
     real(r8), pointer :: z0mg(:)          !roughness length over ground, momentum [m]
     real(r8), pointer :: z0hg(:)          !roughness length over ground, sensible heat [m]
     real(r8), pointer :: z0qg(:)          !roughness length over ground, latent heat [m]
     real(r8), pointer :: emv(:)           !vegetation emissivity
     real(r8), pointer :: z0m(:)           !momentum roughness length (m)
     real(r8), pointer :: displa(:)        !displacement height (m)
     real(r8), pointer :: z0mv(:)          !roughness length over vegetation, momentum [m]
     real(r8), pointer :: z0hv(:)          !roughness length over vegetation, sensible heat [m]
     real(r8), pointer :: z0qv(:)          !roughness length over vegetation, latent heat [m]
     real(r8), pointer :: eflx_sh_tot(:)   !total sensible heat flux (W/m**2) [+ to atm]
     real(r8), pointer :: eflx_sh_tot_u(:) !urban total sensible heat flux (W/m**2) [+ to atm]
     real(r8), pointer :: eflx_sh_tot_r(:) !rural total sensible heat flux (W/m**2) [+ to atm]
     real(r8), pointer :: eflx_lh_tot(:)   !total latent heat flux (W/m**2)  [+ to atm]
     real(r8), pointer :: eflx_lh_tot_u(:) !urban total latent heat flux (W/m**2)  [+ to atm]
     real(r8), pointer :: eflx_lh_tot_r(:) !rural total latent heat flux (W/m**2)  [+ to atm]
     real(r8), pointer :: eflx_sh_veg(:)   !sensible heat flux from leaves (W/m**2) [+ to atm]
     real(r8), pointer :: qflx_evap_tot(:) !qflx_evap_soi + qflx_evap_can + qflx_tran_veg
     real(r8), pointer :: qflx_evap_veg(:) !vegetation evaporation (mm H2O/s) (+ = to atm)
     real(r8), pointer :: qflx_tran_veg(:) !vegetation transpiration (mm H2O/s) (+ = to atm)
     real(r8), pointer :: cgrnd(:)         !deriv. of soil energy flux wrt to soil temp [w/m2/k]
     real(r8), pointer :: cgrnds(:)        !deriv. of soil sensible heat flux wrt soil temp [w/m2/k]
     real(r8), pointer :: cgrndl(:)        !deriv. of soil latent heat flux wrt soil temp [w/m**2/k]
     real(r8) ,pointer :: tssbef(:,:)      !soil/snow temperature before update
     real(r8) ,pointer :: soilalpha(:)     !factor that reduces ground saturated specific humidity (-)
     real(r8) ,pointer :: soilbeta(:)      !factor that reduces ground evaporation
     real(r8) ,pointer :: soilalpha_u(:)   !Urban factor that reduces ground saturated specific humidity (-)
 
   !OTHER LOCAL VARIABLES:



Erik Kluzek 2011-06-15