INTERFACE:
subroutine Biogeophysics2 (lbc, ubc, lbp, ubp, num_nolakec, &
filter_nolakec, num_nolakep, filter_nolakep)
DESCRIPTION:
This is the main subroutine to execute the calculation of soil/snow and
ground temperatures and update surface fluxes based on the new ground
temperature
Calling sequence is:
Biogeophysics2: surface biogeophysics driver
-> SoilTemperature: soil/snow and ground temperatures
-> SoilTermProp thermal conductivities and heat capacities
-> Tridiagonal tridiagonal matrix solution
-> PhaseChange phase change of liquid/ice contents
(1) Snow and soil temperatures
o The volumetric heat capacity is calculated as a linear combination
in terms of the volumetric fraction of the constituent phases.
o The thermal conductivity of soil is computed from
the algorithm of Johansen (as reported by Farouki 1981), and the
conductivity of snow is from the formulation used in
SNTHERM (Jordan 1991).
o Boundary conditions:
F = Rnet - Hg - LEg (top), F= 0 (base of the soil column).
o Soil / snow temperature is predicted from heat conduction
in 10 soil layers and up to 5 snow layers.
The thermal conductivities at the interfaces between two
neighboring layers (j, j+1) are derived from an assumption that
the flux across the interface is equal to that from the node j
to the interface and the flux from the interface to the node j+1.
The equation is solved using the Crank-Nicholson method and
results in a tridiagonal system equation.
(2) Phase change (see PhaseChange.F90)
USES:
use clmtype
use time_manager , only : get_step_size
use clm_varcon , only : hvap, cpair, grav, vkc, tfrz, sb
use clm_varpar , only : nlevsno, nlevsoi, maxpatch_pft
use SoilTemperatureMod, only : SoilTemperature
use subgridAveMod , only : p2c
ARGUMENTS:
implicit none
integer, intent(in) :: lbp, ubp ! pft bounds
integer, intent(in) :: lbc, ubc ! column bounds
integer, intent(in) :: num_nolakec ! number of column non
integer, intent(in) :: filter_nolakec(ubc-lbc+1) ! column filter for no
integer, intent(in) :: num_nolakep ! number of column non
integer, intent(in) :: filter_nolakep(ubp-lbp+1) ! pft filter for non-l
CALLED FROM:
subroutine driverREVISION 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. VertensteinLOCAL VARIABLES:
local pointers to implicit in arguments
integer , pointer :: pcolumn(:) !pft's column index
integer , pointer :: pgridcell(:) !pft's gridcell index
integer , pointer :: npfts(:) !column's number of pfts - ADD
integer , pointer :: pfti(:) !column's beginning pft index - A
integer , pointer :: snl(:) !number of snow layers
logical , pointer :: do_capsnow(:) !true => do snow capping
real(r8), pointer :: forc_lwrad(:) !downward infrared (longwave) rad
real(r8), pointer :: emg(:) !ground emissivity
real(r8), pointer :: htvp(:) !latent heat of vapor of water (o
real(r8), pointer :: t_grnd(:) !ground temperature (Kelvin)
integer , pointer :: frac_veg_nosno(:) !fraction of vegetation not cover
real(r8), pointer :: cgrnds(:) !deriv, of soil sensible heat flu
real(r8), pointer :: cgrndl(:) !deriv of soil latent heat flux w
real(r8), pointer :: sabg(:) !solar radiation absorbed by grou
real(r8), pointer :: dlrad(:) !downward longwave radiation belo
real(r8), pointer :: ulrad(:) !upward longwave radiation above
real(r8), pointer :: eflx_sh_veg(:) !sensible heat flux from leaves (
real(r8), pointer :: qflx_evap_veg(:) !vegetation evaporation (mm H2O/s
real(r8), pointer :: qflx_tran_veg(:) !vegetation transpiration (mm H2O
real(r8), pointer :: qflx_evap_can(:) !evaporation from leaves and stem
real(r8), pointer :: wtcol(:) !pft weight relative to column
real(r8), pointer :: tssbef(:,:) !soil/snow temperature before upd
real(r8), pointer :: t_soisno(:,:) !soil temperature (Kelvin)
real(r8), pointer :: h2osoi_ice(:,:) !ice lens (kg/m2) (new)
real(r8), pointer :: h2osoi_liq(:,:) !liquid water (kg/m2) (new)
local pointers to implicit inout arguments
real(r8), pointer :: eflx_sh_grnd(:) !sensible heat flux from ground (
real(r8), pointer :: qflx_evap_soi(:) !soil evaporation (mm H2O/s) (+ =
real(r8), pointer :: qflx_snowcap(:) !excess precipitation due to snow
local pointers to implicit out arguments
real(r8), pointer :: dt_grnd(:) !change in t_grnd, last iteration
real(r8), pointer :: eflx_soil_grnd(:) !soil heat flux (W/m**2) [+ = int
real(r8), pointer :: eflx_sh_tot(:) !total sensible heat flux (W/m**2
real(r8), pointer :: qflx_evap_tot(:) !qflx_evap_soi + qflx_evap_veg +
real(r8), pointer :: eflx_lh_tot(:) !total latent heat flux (W/m8*2)
real(r8), pointer :: qflx_evap_grnd(:) !ground surface evaporation rate
real(r8), pointer :: qflx_sub_snow(:) !sublimation rate from snow pack
real(r8), pointer :: qflx_dew_snow(:) !surface dew added to snow pack (
real(r8), pointer :: qflx_dew_grnd(:) !ground surface dew formation (mm
real(r8), pointer :: eflx_lwrad_out(:) !emitted infrared (longwave) radi
real(r8), pointer :: eflx_lwrad_net(:) !net infrared (longwave) rad (W/m
real(r8), pointer :: eflx_lh_vege(:) !veg evaporation heat flux (W/m**
real(r8), pointer :: eflx_lh_vegt(:) !veg transpiration heat flux (W/m
real(r8), pointer :: eflx_lh_grnd(:) !ground evaporation heat flux (W/
real(r8), pointer :: errsoi_pft(:) !pft-level soil/lake energy conse
real(r8), pointer :: errsoi_col(:) !column-level soil/lake energy co