#include <misc.h>
#include <preproc.h>
module CNPrecisionControlMod 1,1
#ifdef CN
!-----------------------------------------------------------------------
!BOP
!
! !MODULE: CNPrecisionControlMod
!
! !DESCRIPTION:
! controls on very low values in critical state variables
!
! !USES:
use shr_kind_mod
, only: r8 => shr_kind_r8
implicit none
save
private
! !PUBLIC MEMBER FUNCTIONS:
public:: CNPrecisionControl
!
! !REVISION HISTORY:
! 4/23/2004: Created by Peter Thornton
!
!EOP
!-----------------------------------------------------------------------
contains
!-----------------------------------------------------------------------
!BOP
!
! !IROUTINE: CNPrecisionControl
!
! !INTERFACE:
subroutine CNPrecisionControl(num_soilc, filter_soilc, num_soilp, filter_soilp) 1,3
!
! !DESCRIPTION:
! On the radiation time step, force leaf and deadstem c and n to 0 if
! they get too small.
!
! !USES:
use clmtype
use abortutils
, only: endrun
use clm_varctl
, only: iulog
!
! !ARGUMENTS:
implicit none
integer, intent(in) :: num_soilc ! number of soil columns in filter
integer, intent(in) :: filter_soilc(:) ! filter for soil columns
integer, intent(in) :: num_soilp ! number of soil pfts in filter
integer, intent(in) :: filter_soilp(:) ! filter for soil pfts
!
! !CALLED FROM:
! subroutine CNEcosystemDyn
!
! !REVISION HISTORY:
! 8/1/03: Created by Peter Thornton
!
! !LOCAL VARIABLES:
! local pointers to implicit in scalars
real(r8), pointer :: col_ctrunc(:) ! (gC/m2) column-level sink for C truncation
real(r8), pointer :: cwdc(:) ! (gC/m2) coarse woody debris C
real(r8), pointer :: litr1c(:) ! (gC/m2) litter labile C
real(r8), pointer :: litr2c(:) ! (gC/m2) litter cellulose C
real(r8), pointer :: litr3c(:) ! (gC/m2) litter lignin C
real(r8), pointer :: soil1c(:) ! (gC/m2) soil organic matter C (fast pool)
real(r8), pointer :: soil2c(:) ! (gC/m2) soil organic matter C (medium pool)
real(r8), pointer :: soil3c(:) ! (gC/m2) soil organic matter C (slow pool)
real(r8), pointer :: soil4c(:) ! (gC/m2) soil organic matter C (slowest pool)
#if (defined C13)
real(r8), pointer :: c13_col_ctrunc(:) ! (gC/m2) column-level sink for C truncation
real(r8), pointer :: c13_cwdc(:) ! (gC/m2) coarse woody debris C
real(r8), pointer :: c13_litr1c(:) ! (gC/m2) litter labile C
real(r8), pointer :: c13_litr2c(:) ! (gC/m2) litter cellulose C
real(r8), pointer :: c13_litr3c(:) ! (gC/m2) litter lignin C
real(r8), pointer :: c13_soil1c(:) ! (gC/m2) soil organic matter C (fast pool)
real(r8), pointer :: c13_soil2c(:) ! (gC/m2) soil organic matter C (medium pool)
real(r8), pointer :: c13_soil3c(:) ! (gC/m2) soil organic matter C (slow pool)
real(r8), pointer :: c13_soil4c(:) ! (gC/m2) soil organic matter C (slowest pool)
#endif
real(r8), pointer :: col_ntrunc(:) ! (gN/m2) column-level sink for N truncation
real(r8), pointer :: cwdn(:) ! (gN/m2) coarse woody debris N
real(r8), pointer :: litr1n(:) ! (gN/m2) litter labile N
real(r8), pointer :: litr2n(:) ! (gN/m2) litter cellulose N
real(r8), pointer :: litr3n(:) ! (gN/m2) litter lignin N
real(r8), pointer :: soil1n(:) ! (gN/m2) soil organic matter N (fast pool)
real(r8), pointer :: soil2n(:) ! (gN/m2) soil organic matter N (medium pool)
real(r8), pointer :: soil3n(:) ! (gN/m2) soil orgainc matter N (slow pool)
real(r8), pointer :: soil4n(:) ! (gN/m2) soil orgainc matter N (slowest pool)
real(r8), pointer :: cpool(:) ! (gC/m2) temporary photosynthate C pool
real(r8), pointer :: deadcrootc(:) ! (gC/m2) dead coarse root C
real(r8), pointer :: deadcrootc_storage(:) ! (gC/m2) dead coarse root C storage
real(r8), pointer :: deadcrootc_xfer(:) ! (gC/m2) dead coarse root C transfer
real(r8), pointer :: deadstemc(:) ! (gC/m2) dead stem C
real(r8), pointer :: deadstemc_storage(:) ! (gC/m2) dead stem C storage
real(r8), pointer :: deadstemc_xfer(:) ! (gC/m2) dead stem C transfer
real(r8), pointer :: frootc(:) ! (gC/m2) fine root C
real(r8), pointer :: frootc_storage(:) ! (gC/m2) fine root C storage
real(r8), pointer :: frootc_xfer(:) ! (gC/m2) fine root C transfer
real(r8), pointer :: gresp_storage(:) ! (gC/m2) growth respiration storage
real(r8), pointer :: gresp_xfer(:) ! (gC/m2) growth respiration transfer
real(r8), pointer :: leafc(:) ! (gC/m2) leaf C
real(r8), pointer :: leafc_storage(:) ! (gC/m2) leaf C storage
real(r8), pointer :: leafc_xfer(:) ! (gC/m2) leaf C transfer
real(r8), pointer :: livecrootc(:) ! (gC/m2) live coarse root C
real(r8), pointer :: livecrootc_storage(:) ! (gC/m2) live coarse root C storage
real(r8), pointer :: livecrootc_xfer(:) ! (gC/m2) live coarse root C transfer
real(r8), pointer :: livestemc(:) ! (gC/m2) live stem C
real(r8), pointer :: livestemc_storage(:) ! (gC/m2) live stem C storage
real(r8), pointer :: livestemc_xfer(:) ! (gC/m2) live stem C transfer
real(r8), pointer :: pft_ctrunc(:) ! (gC/m2) pft-level sink for C truncation
#if (defined C13)
real(r8), pointer :: c13_cpool(:) ! (gC/m2) temporary photosynthate C pool
real(r8), pointer :: c13_deadcrootc(:) ! (gC/m2) dead coarse root C
real(r8), pointer :: c13_deadcrootc_storage(:) ! (gC/m2) dead coarse root C storage
real(r8), pointer :: c13_deadcrootc_xfer(:) ! (gC/m2) dead coarse root C transfer
real(r8), pointer :: c13_deadstemc(:) ! (gC/m2) dead stem C
real(r8), pointer :: c13_deadstemc_storage(:) ! (gC/m2) dead stem C storage
real(r8), pointer :: c13_deadstemc_xfer(:) ! (gC/m2) dead stem C transfer
real(r8), pointer :: c13_frootc(:) ! (gC/m2) fine root C
real(r8), pointer :: c13_frootc_storage(:) ! (gC/m2) fine root C storage
real(r8), pointer :: c13_frootc_xfer(:) ! (gC/m2) fine root C transfer
real(r8), pointer :: c13_gresp_storage(:) ! (gC/m2) growth respiration storage
real(r8), pointer :: c13_gresp_xfer(:) ! (gC/m2) growth respiration transfer
real(r8), pointer :: c13_leafc(:) ! (gC/m2) leaf C
real(r8), pointer :: c13_leafc_storage(:) ! (gC/m2) leaf C storage
real(r8), pointer :: c13_leafc_xfer(:) ! (gC/m2) leaf C transfer
real(r8), pointer :: c13_livecrootc(:) ! (gC/m2) live coarse root C
real(r8), pointer :: c13_livecrootc_storage(:) ! (gC/m2) live coarse root C storage
real(r8), pointer :: c13_livecrootc_xfer(:) ! (gC/m2) live coarse root C transfer
real(r8), pointer :: c13_livestemc(:) ! (gC/m2) live stem C
real(r8), pointer :: c13_livestemc_storage(:) ! (gC/m2) live stem C storage
real(r8), pointer :: c13_livestemc_xfer(:) ! (gC/m2) live stem C transfer
real(r8), pointer :: c13_pft_ctrunc(:) ! (gC/m2) pft-level sink for C truncation
#endif
real(r8), pointer :: deadcrootn(:) ! (gN/m2) dead coarse root N
real(r8), pointer :: deadcrootn_storage(:) ! (gN/m2) dead coarse root N storage
real(r8), pointer :: deadcrootn_xfer(:) ! (gN/m2) dead coarse root N transfer
real(r8), pointer :: deadstemn(:) ! (gN/m2) dead stem N
real(r8), pointer :: deadstemn_storage(:) ! (gN/m2) dead stem N storage
real(r8), pointer :: deadstemn_xfer(:) ! (gN/m2) dead stem N transfer
real(r8), pointer :: frootn(:) ! (gN/m2) fine root N
real(r8), pointer :: frootn_storage(:) ! (gN/m2) fine root N storage
real(r8), pointer :: frootn_xfer(:) ! (gN/m2) fine root N transfer
real(r8), pointer :: leafn(:) ! (gN/m2) leaf N
real(r8), pointer :: leafn_storage(:) ! (gN/m2) leaf N storage
real(r8), pointer :: leafn_xfer(:) ! (gN/m2) leaf N transfer
real(r8), pointer :: livecrootn(:) ! (gN/m2) live coarse root N
real(r8), pointer :: livecrootn_storage(:) ! (gN/m2) live coarse root N storage
real(r8), pointer :: livecrootn_xfer(:) ! (gN/m2) live coarse root N transfer
real(r8), pointer :: livestemn(:) ! (gN/m2) live stem N
real(r8), pointer :: livestemn_storage(:) ! (gN/m2) live stem N storage
real(r8), pointer :: livestemn_xfer(:) ! (gN/m2) live stem N transfer
real(r8), pointer :: npool(:) ! (gN/m2) temporary plant N pool
real(r8), pointer :: pft_ntrunc(:) ! (gN/m2) pft-level sink for N truncation
real(r8), pointer :: retransn(:) ! (gN/m2) plant pool of retranslocated N
!
! local pointers to implicit in/out scalars
!
! local pointers to implicit out scalars
!
! !OTHER LOCAL VARIABLES:
integer :: c,p ! indices
integer :: fp,fc ! lake filter indices
real(r8):: pc,pn ! truncation terms for pft-level corrections
real(r8):: cc,cn ! truncation terms for column-level corrections
#if (defined C13)
real(r8):: pc13 ! truncation terms for pft-level corrections
real(r8):: cc13 ! truncation terms for column-level corrections
#endif
real(r8):: ccrit ! critical carbon state value for truncation
real(r8):: ncrit ! critical nitrogen state value for truncation
!EOP
!-----------------------------------------------------------------------
! assign local pointers at the column level
col_ctrunc => clm3%g%l%c%ccs%col_ctrunc
cwdc => clm3%g%l%c%ccs%cwdc
litr1c => clm3%g%l%c%ccs%litr1c
litr2c => clm3%g%l%c%ccs%litr2c
litr3c => clm3%g%l%c%ccs%litr3c
soil1c => clm3%g%l%c%ccs%soil1c
soil2c => clm3%g%l%c%ccs%soil2c
soil3c => clm3%g%l%c%ccs%soil3c
soil4c => clm3%g%l%c%ccs%soil4c
#if (defined C13)
c13_col_ctrunc => clm3%g%l%c%cc13s%col_ctrunc
c13_cwdc => clm3%g%l%c%cc13s%cwdc
c13_litr1c => clm3%g%l%c%cc13s%litr1c
c13_litr2c => clm3%g%l%c%cc13s%litr2c
c13_litr3c => clm3%g%l%c%cc13s%litr3c
c13_soil1c => clm3%g%l%c%cc13s%soil1c
c13_soil2c => clm3%g%l%c%cc13s%soil2c
c13_soil3c => clm3%g%l%c%cc13s%soil3c
c13_soil4c => clm3%g%l%c%cc13s%soil4c
#endif
col_ntrunc => clm3%g%l%c%cns%col_ntrunc
cwdn => clm3%g%l%c%cns%cwdn
litr1n => clm3%g%l%c%cns%litr1n
litr2n => clm3%g%l%c%cns%litr2n
litr3n => clm3%g%l%c%cns%litr3n
soil1n => clm3%g%l%c%cns%soil1n
soil2n => clm3%g%l%c%cns%soil2n
soil3n => clm3%g%l%c%cns%soil3n
soil4n => clm3%g%l%c%cns%soil4n
! assign local pointers at the pft level
cpool => clm3%g%l%c%p%pcs%cpool
deadcrootc => clm3%g%l%c%p%pcs%deadcrootc
deadcrootc_storage => clm3%g%l%c%p%pcs%deadcrootc_storage
deadcrootc_xfer => clm3%g%l%c%p%pcs%deadcrootc_xfer
deadstemc => clm3%g%l%c%p%pcs%deadstemc
deadstemc_storage => clm3%g%l%c%p%pcs%deadstemc_storage
deadstemc_xfer => clm3%g%l%c%p%pcs%deadstemc_xfer
frootc => clm3%g%l%c%p%pcs%frootc
frootc_storage => clm3%g%l%c%p%pcs%frootc_storage
frootc_xfer => clm3%g%l%c%p%pcs%frootc_xfer
gresp_storage => clm3%g%l%c%p%pcs%gresp_storage
gresp_xfer => clm3%g%l%c%p%pcs%gresp_xfer
leafc => clm3%g%l%c%p%pcs%leafc
leafc_storage => clm3%g%l%c%p%pcs%leafc_storage
leafc_xfer => clm3%g%l%c%p%pcs%leafc_xfer
livecrootc => clm3%g%l%c%p%pcs%livecrootc
livecrootc_storage => clm3%g%l%c%p%pcs%livecrootc_storage
livecrootc_xfer => clm3%g%l%c%p%pcs%livecrootc_xfer
livestemc => clm3%g%l%c%p%pcs%livestemc
livestemc_storage => clm3%g%l%c%p%pcs%livestemc_storage
livestemc_xfer => clm3%g%l%c%p%pcs%livestemc_xfer
pft_ctrunc => clm3%g%l%c%p%pcs%pft_ctrunc
#if (defined C13)
c13_cpool => clm3%g%l%c%p%pc13s%cpool
c13_deadcrootc => clm3%g%l%c%p%pc13s%deadcrootc
c13_deadcrootc_storage => clm3%g%l%c%p%pc13s%deadcrootc_storage
c13_deadcrootc_xfer => clm3%g%l%c%p%pc13s%deadcrootc_xfer
c13_deadstemc => clm3%g%l%c%p%pc13s%deadstemc
c13_deadstemc_storage => clm3%g%l%c%p%pc13s%deadstemc_storage
c13_deadstemc_xfer => clm3%g%l%c%p%pc13s%deadstemc_xfer
c13_frootc => clm3%g%l%c%p%pc13s%frootc
c13_frootc_storage => clm3%g%l%c%p%pc13s%frootc_storage
c13_frootc_xfer => clm3%g%l%c%p%pc13s%frootc_xfer
c13_gresp_storage => clm3%g%l%c%p%pc13s%gresp_storage
c13_gresp_xfer => clm3%g%l%c%p%pc13s%gresp_xfer
c13_leafc => clm3%g%l%c%p%pc13s%leafc
c13_leafc_storage => clm3%g%l%c%p%pc13s%leafc_storage
c13_leafc_xfer => clm3%g%l%c%p%pc13s%leafc_xfer
c13_livecrootc => clm3%g%l%c%p%pc13s%livecrootc
c13_livecrootc_storage => clm3%g%l%c%p%pc13s%livecrootc_storage
c13_livecrootc_xfer => clm3%g%l%c%p%pc13s%livecrootc_xfer
c13_livestemc => clm3%g%l%c%p%pc13s%livestemc
c13_livestemc_storage => clm3%g%l%c%p%pc13s%livestemc_storage
c13_livestemc_xfer => clm3%g%l%c%p%pc13s%livestemc_xfer
c13_pft_ctrunc => clm3%g%l%c%p%pc13s%pft_ctrunc
#endif
deadcrootn => clm3%g%l%c%p%pns%deadcrootn
deadcrootn_storage => clm3%g%l%c%p%pns%deadcrootn_storage
deadcrootn_xfer => clm3%g%l%c%p%pns%deadcrootn_xfer
deadstemn => clm3%g%l%c%p%pns%deadstemn
deadstemn_storage => clm3%g%l%c%p%pns%deadstemn_storage
deadstemn_xfer => clm3%g%l%c%p%pns%deadstemn_xfer
frootn => clm3%g%l%c%p%pns%frootn
frootn_storage => clm3%g%l%c%p%pns%frootn_storage
frootn_xfer => clm3%g%l%c%p%pns%frootn_xfer
leafn => clm3%g%l%c%p%pns%leafn
leafn_storage => clm3%g%l%c%p%pns%leafn_storage
leafn_xfer => clm3%g%l%c%p%pns%leafn_xfer
livecrootn => clm3%g%l%c%p%pns%livecrootn
livecrootn_storage => clm3%g%l%c%p%pns%livecrootn_storage
livecrootn_xfer => clm3%g%l%c%p%pns%livecrootn_xfer
livestemn => clm3%g%l%c%p%pns%livestemn
livestemn_storage => clm3%g%l%c%p%pns%livestemn_storage
livestemn_xfer => clm3%g%l%c%p%pns%livestemn_xfer
npool => clm3%g%l%c%p%pns%npool
pft_ntrunc => clm3%g%l%c%p%pns%pft_ntrunc
retransn => clm3%g%l%c%p%pns%retransn
! set the critical carbon state value for truncation (gC/m2)
ccrit = 1.e-8_r8
! set the critical nitrogen state value for truncation (gN/m2)
ncrit = 1.e-8_r8
! pft loop
do fp = 1,num_soilp
p = filter_soilp(fp)
! initialize the pft-level C and N truncation terms
pc = 0._r8
#if (defined C13)
pc13 = 0._r8
#endif
pn = 0._r8
! do tests on state variables for precision control
! for linked C-N state variables, perform precision test on
! the C component, but truncate C, C13, and N components
! leaf C and N
if (abs(leafc(p)) < ccrit) then
pc = pc + leafc(p)
leafc(p) = 0._r8
#if (defined C13)
pc13 = pc13 + c13_leafc(p)
c13_leafc(p) = 0._r8
#endif
pn = pn + leafn(p)
leafn(p) = 0._r8
end if
! leaf storage C and N
if (abs(leafc_storage(p)) < ccrit) then
pc = pc + leafc_storage(p)
leafc_storage(p) = 0._r8
#if (defined C13)
pc13 = pc13 + c13_leafc_storage(p)
c13_leafc_storage(p) = 0._r8
#endif
pn = pn + leafn_storage(p)
leafn_storage(p) = 0._r8
end if
! leaf transfer C and N
if (abs(leafc_xfer(p)) < ccrit) then
pc = pc + leafc_xfer(p)
leafc_xfer(p) = 0._r8
#if (defined C13)
pc13 = pc13 + c13_leafc_xfer(p)
c13_leafc_xfer(p) = 0._r8
#endif
pn = pn + leafn_xfer(p)
leafn_xfer(p) = 0._r8
end if
! froot C and N
if (abs(frootc(p)) < ccrit) then
pc = pc + frootc(p)
frootc(p) = 0._r8
#if (defined C13)
pc13 = pc13 + c13_frootc(p)
c13_frootc(p) = 0._r8
#endif
pn = pn + frootn(p)
frootn(p) = 0._r8
end if
! froot storage C and N
if (abs(frootc_storage(p)) < ccrit) then
pc = pc + frootc_storage(p)
frootc_storage(p) = 0._r8
#if (defined C13)
pc13 = pc13 + c13_frootc_storage(p)
c13_frootc_storage(p) = 0._r8
#endif
pn = pn + frootn_storage(p)
frootn_storage(p) = 0._r8
end if
! froot transfer C and N
if (abs(frootc_xfer(p)) < ccrit) then
pc = pc + frootc_xfer(p)
frootc_xfer(p) = 0._r8
#if (defined C13)
pc13 = pc13 + c13_frootc_xfer(p)
c13_frootc_xfer(p) = 0._r8
#endif
pn = pn + frootn_xfer(p)
frootn_xfer(p) = 0._r8
end if
! livestem C and N
if (abs(livestemc(p)) < ccrit) then
pc = pc + livestemc(p)
livestemc(p) = 0._r8
#if (defined C13)
pc13 = pc13 + c13_livestemc(p)
c13_livestemc(p) = 0._r8
#endif
pn = pn + livestemn(p)
livestemn(p) = 0._r8
end if
! livestem storage C and N
if (abs(livestemc_storage(p)) < ccrit) then
pc = pc + livestemc_storage(p)
livestemc_storage(p) = 0._r8
#if (defined C13)
pc13 = pc13 + c13_livestemc_storage(p)
c13_livestemc_storage(p) = 0._r8
#endif
pn = pn + livestemn_storage(p)
livestemn_storage(p) = 0._r8
end if
! livestem transfer C and N
if (abs(livestemc_xfer(p)) < ccrit) then
pc = pc + livestemc_xfer(p)
livestemc_xfer(p) = 0._r8
#if (defined C13)
pc13 = pc13 + c13_livestemc_xfer(p)
c13_livestemc_xfer(p) = 0._r8
#endif
pn = pn + livestemn_xfer(p)
livestemn_xfer(p) = 0._r8
end if
! deadstem C and N
if (abs(deadstemc(p)) < ccrit) then
pc = pc + deadstemc(p)
deadstemc(p) = 0._r8
#if (defined C13)
pc13 = pc13 + c13_deadstemc(p)
c13_deadstemc(p) = 0._r8
#endif
pn = pn + deadstemn(p)
deadstemn(p) = 0._r8
end if
! deadstem storage C and N
if (abs(deadstemc_storage(p)) < ccrit) then
pc = pc + deadstemc_storage(p)
deadstemc_storage(p) = 0._r8
#if (defined C13)
pc13 = pc13 + c13_deadstemc_storage(p)
c13_deadstemc_storage(p) = 0._r8
#endif
pn = pn + deadstemn_storage(p)
deadstemn_storage(p) = 0._r8
end if
! deadstem transfer C and N
if (abs(deadstemc_xfer(p)) < ccrit) then
pc = pc + deadstemc_xfer(p)
deadstemc_xfer(p) = 0._r8
#if (defined C13)
pc13 = pc13 + c13_deadstemc_xfer(p)
c13_deadstemc_xfer(p) = 0._r8
#endif
pn = pn + deadstemn_xfer(p)
deadstemn_xfer(p) = 0._r8
end if
! livecroot C and N
if (abs(livecrootc(p)) < ccrit) then
pc = pc + livecrootc(p)
livecrootc(p) = 0._r8
#if (defined C13)
pc13 = pc13 + c13_livecrootc(p)
c13_livecrootc(p) = 0._r8
#endif
pn = pn + livecrootn(p)
livecrootn(p) = 0._r8
end if
! livecroot storage C and N
if (abs(livecrootc_storage(p)) < ccrit) then
pc = pc + livecrootc_storage(p)
livecrootc_storage(p) = 0._r8
#if (defined C13)
pc13 = pc13 + c13_livecrootc_storage(p)
c13_livecrootc_storage(p) = 0._r8
#endif
pn = pn + livecrootn_storage(p)
livecrootn_storage(p) = 0._r8
end if
! livecroot transfer C and N
if (abs(livecrootc_xfer(p)) < ccrit) then
pc = pc + livecrootc_xfer(p)
livecrootc_xfer(p) = 0._r8
#if (defined C13)
pc13 = pc13 + c13_livecrootc_xfer(p)
c13_livecrootc_xfer(p) = 0._r8
#endif
pn = pn + livecrootn_xfer(p)
livecrootn_xfer(p) = 0._r8
end if
! deadcroot C and N
if (abs(deadcrootc(p)) < ccrit) then
pc = pc + deadcrootc(p)
deadcrootc(p) = 0._r8
#if (defined C13)
pc13 = pc13 + c13_deadcrootc(p)
c13_deadcrootc(p) = 0._r8
#endif
pn = pn + deadcrootn(p)
deadcrootn(p) = 0._r8
end if
! deadcroot storage C and N
if (abs(deadcrootc_storage(p)) < ccrit) then
pc = pc + deadcrootc_storage(p)
deadcrootc_storage(p) = 0._r8
#if (defined C13)
pc13 = pc13 + c13_deadcrootc_storage(p)
c13_deadcrootc_storage(p) = 0._r8
#endif
pn = pn + deadcrootn_storage(p)
deadcrootn_storage(p) = 0._r8
end if
! deadcroot transfer C and N
if (abs(deadcrootc_xfer(p)) < ccrit) then
pc = pc + deadcrootc_xfer(p)
deadcrootc_xfer(p) = 0._r8
#if (defined C13)
pc13 = pc13 + c13_deadcrootc_xfer(p)
c13_deadcrootc_xfer(p) = 0._r8
#endif
pn = pn + deadcrootn_xfer(p)
deadcrootn_xfer(p) = 0._r8
end if
! gresp_storage (C only)
if (abs(gresp_storage(p)) < ccrit) then
pc = pc + gresp_storage(p)
gresp_storage(p) = 0._r8
#if (defined C13)
pc13 = pc13 + c13_gresp_storage(p)
c13_gresp_storage(p) = 0._r8
#endif
end if
! gresp_xfer (C only)
if (abs(gresp_xfer(p)) < ccrit) then
pc = pc + gresp_xfer(p)
gresp_xfer(p) = 0._r8
#if (defined C13)
pc13 = pc13 + c13_gresp_xfer(p)
c13_gresp_xfer(p) = 0._r8
#endif
end if
! cpool (C only)
if (abs(cpool(p)) < ccrit) then
pc = pc + cpool(p)
cpool(p) = 0._r8
#if (defined C13)
pc13 = pc13 + c13_cpool(p)
c13_cpool(p) = 0._r8
#endif
end if
! retransn (N only)
if (abs(retransn(p)) < ncrit) then
pn = pn + retransn(p)
retransn(p) = 0._r8
end if
! npool (N only)
if (abs(npool(p)) < ncrit) then
pn = pn + npool(p)
npool(p) = 0._r8
end if
pft_ctrunc(p) = pft_ctrunc(p) + pc
#if (defined C13)
c13_pft_ctrunc(p) = c13_pft_ctrunc(p) + pc13
#endif
pft_ntrunc(p) = pft_ntrunc(p) + pn
end do ! end of pft loop
! column loop
do fc = 1,num_soilc
c = filter_soilc(fc)
! initialize the column-level C and N truncation terms
cc = 0._r8
#if (defined C13)
cc13 = 0._r8
#endif
cn = 0._r8
! do tests on state variables for precision control
! for linked C-N state variables, perform precision test on
! the C component, but truncate both C and N components
! coarse woody debris C and N
if (abs(cwdc(c)) < ccrit) then
cc = cc + cwdc(c)
cwdc(c) = 0._r8
#if (defined C13)
cc13 = cc13 + c13_cwdc(c)
c13_cwdc(c) = 0._r8
#endif
cn = cn + cwdn(c)
cwdn(c) = 0._r8
end if
! litr1 C and N
if (abs(litr1c(c)) < ccrit) then
cc = cc + litr1c(c)
litr1c(c) = 0._r8
#if (defined C13)
cc13 = cc13 + c13_litr1c(c)
c13_litr1c(c) = 0._r8
#endif
cn = cn + litr1n(c)
litr1n(c) = 0._r8
end if
! litr2 C and N
if (abs(litr2c(c)) < ccrit) then
cc = cc + litr2c(c)
litr2c(c) = 0._r8
#if (defined C13)
cc13 = cc13 + c13_litr2c(c)
c13_litr2c(c) = 0._r8
#endif
cn = cn + litr2n(c)
litr2n(c) = 0._r8
end if
! litr3 C and N
if (abs(litr3c(c)) < ccrit) then
cc = cc + litr3c(c)
litr3c(c) = 0._r8
#if (defined C13)
cc13 = cc13 + c13_litr3c(c)
c13_litr3c(c) = 0._r8
#endif
cn = cn + litr3n(c)
litr3n(c) = 0._r8
end if
! soil1 C and N
if (abs(soil1c(c)) < ccrit) then
cc = cc + soil1c(c)
soil1c(c) = 0._r8
#if (defined C13)
cc13 = cc13 + c13_soil1c(c)
c13_soil1c(c) = 0._r8
#endif
cn = cn + soil1n(c)
soil1n(c) = 0._r8
end if
! soil2 C and N
if (abs(soil2c(c)) < ccrit) then
cc = cc + soil2c(c)
soil2c(c) = 0._r8
#if (defined C13)
cc13 = cc13 + c13_soil2c(c)
c13_soil2c(c) = 0._r8
#endif
cn = cn + soil2n(c)
soil2n(c) = 0._r8
end if
! soil3 C and N
if (abs(soil3c(c)) < ccrit) then
cc = cc + soil3c(c)
soil3c(c) = 0._r8
#if (defined C13)
cc13 = cc13 + c13_soil3c(c)
c13_soil3c(c) = 0._r8
#endif
cn = cn + soil3n(c)
soil3n(c) = 0._r8
end if
! soil4 C and N
if (abs(soil4c(c)) < ccrit) then
cc = cc + soil4c(c)
soil4c(c) = 0._r8
#if (defined C13)
cc13 = cc13 + c13_soil4c(c)
c13_soil4c(c) = 0._r8
#endif
cn = cn + soil4n(c)
soil4n(c) = 0._r8
end if
! not doing precision control on soil mineral N, since it will
! be getting the N truncation flux anyway.
col_ctrunc(c) = col_ctrunc(c) + cc
#if (defined C13)
c13_col_ctrunc(c) = c13_col_ctrunc(c) + cc13
#endif
col_ntrunc(c) = col_ntrunc(c) + cn
end do ! end of column loop
end subroutine CNPrecisionControl
!-----------------------------------------------------------------------
#endif
end module CNPrecisionControlMod