spincasacnp.F90 Source File


Source Code

SUBROUTINE spincasacnp( dels,kstart,kend,mloop,veg,soil,casabiome,casapool, &
     casaflux,casamet,casabal,phen,POP,climate,LALLOC )


  USE cable_def_types_mod
  USE cable_carbon_module
  USE cable_common_module, ONLY: CABLE_USER
  USE casadimension
  USE casaparm
  USE casa_cable !jhan:also put this in mod
  USE casa_inout_module
  USE casavariable
  USE phenvariable
  USE POP_Types,  ONLY: POP_TYPE
  USE POPMODULE,            ONLY: POPStep
  USE TypeDef,              ONLY: i4b, dp
  USE biogeochem_mod, ONLY : biogeochem 

  IMPLICIT NONE
  !!CLN  CHARACTER(LEN=99), INTENT(IN)  :: fcnpspin
  REAL,    INTENT(IN)    :: dels
  INTEGER, INTENT(IN)    :: kstart
  INTEGER, INTENT(IN)    :: kend
  INTEGER, INTENT(IN)    :: mloop
  INTEGER, INTENT(IN)    :: LALLOC
  TYPE (veg_parameter_type),    INTENT(INOUT) :: veg  ! vegetation parameters
  TYPE (soil_parameter_type),   INTENT(INOUT) :: soil ! soil parameters
  TYPE (casa_biome),            INTENT(INOUT) :: casabiome
  TYPE (casa_pool),             INTENT(INOUT) :: casapool
  TYPE (casa_flux),             INTENT(INOUT) :: casaflux
  TYPE (casa_met),              INTENT(INOUT) :: casamet
  TYPE (casa_balance),          INTENT(INOUT) :: casabal
  TYPE (phen_variable),         INTENT(INOUT) :: phen
  TYPE (POP_TYPE), INTENT(INOUT)     :: POP
  TYPE (climate_TYPE), INTENT(INOUT)     :: climate


  TYPE (casa_met)  :: casaspin

  ! local variables
  REAL,      DIMENSION(:), ALLOCATABLE, SAVE  :: avg_cleaf2met, avg_cleaf2str, avg_croot2met, avg_croot2str, avg_cwood2cwd
  REAL,      DIMENSION(:), ALLOCATABLE, SAVE  :: avg_nleaf2met, avg_nleaf2str, avg_nroot2met, avg_nroot2str, avg_nwood2cwd
  REAL,      DIMENSION(:), ALLOCATABLE, SAVE  :: avg_pleaf2met, avg_pleaf2str, avg_proot2met, avg_proot2str, avg_pwood2cwd
  REAL,      DIMENSION(:), ALLOCATABLE, SAVE  :: avg_cgpp,      avg_cnpp,      avg_nuptake,   avg_puptake
  REAL,      DIMENSION(:), ALLOCATABLE, SAVE  :: avg_nsoilmin,  avg_psoillab,  avg_psoilsorb, avg_psoilocc
  !chris 12/oct/2012 for spin up casa
  REAL,      DIMENSION(:), ALLOCATABLE, SAVE  :: avg_ratioNCsoilmic,  avg_ratioNCsoilslow,  avg_ratioNCsoilpass
  REAL(r_2), DIMENSION(:), ALLOCATABLE, SAVE  :: avg_xnplimit,  avg_xkNlimiting,avg_xklitter, avg_xksoil

  REAL,      DIMENSION(:), ALLOCATABLE, SAVE  :: avg_af
  REAL,      DIMENSION(:), ALLOCATABLE, SAVE  :: avg_aw
  REAL,      DIMENSION(:), ALLOCATABLE, SAVE  :: avg_ar
  REAL,      DIMENSION(:), ALLOCATABLE, SAVE  :: avg_lf
  REAL,      DIMENSION(:), ALLOCATABLE, SAVE  :: avg_lw
  REAL,      DIMENSION(:), ALLOCATABLE, SAVE  :: avg_lr
  REAL,      DIMENSION(:), ALLOCATABLE, SAVE  :: avg_annual_cnpp

  ! local variables
  INTEGER                  :: myearspin,nyear, nloop1
  CHARACTER(LEN=99)        :: ncfile
  CHARACTER(LEN=4)         :: cyear
  INTEGER                  :: ktau,ktauday,nday,idoy,ktaux,ktauy,nloop, LOY
  INTEGER, SAVE            :: ndays
  REAL,      DIMENSION(mp)      :: cleaf2met, cleaf2str, croot2met, croot2str, cwood2cwd
  REAL,      DIMENSION(mp)      :: nleaf2met, nleaf2str, nroot2met, nroot2str, nwood2cwd
  REAL,      DIMENSION(mp)      :: pleaf2met, pleaf2str, proot2met, proot2str, pwood2cwd
  REAL,      DIMENSION(mp)      :: xcgpp,     xcnpp,     xnuptake,  xpuptake
  REAL,      DIMENSION(mp)      :: xnsoilmin, xpsoillab, xpsoilsorb,xpsoilocc
  REAL(r_2), DIMENSION(mp)      :: xnplimit,  xkNlimiting, xklitter, xksoil,xkleaf, xkleafcold, xkleafdry

  ! more variables to store the spinup pool size over the last 10 loops. Added by Yp Wang 30 Nov 2012
  REAL,      DIMENSION(5,mvtype,mplant)  :: bmcplant,  bmnplant,  bmpplant
  REAL,      DIMENSION(5,mvtype,mlitter) :: bmclitter, bmnlitter, bmplitter
  REAL,      DIMENSION(5,mvtype,msoil)   :: bmcsoil,   bmnsoil,   bmpsoil
  REAL,      DIMENSION(5,mvtype)         :: bmnsoilmin,bmpsoillab,bmpsoilsorb, bmpsoilocc
  REAL,      DIMENSION(mvtype)           :: bmarea
  INTEGER nptx,nvt,kloop

  REAL(dp)                               :: StemNPP(mp,2)
  REAL(dp), ALLOCATABLE, SAVE ::  LAImax(:)    , Cleafmean(:),  Crootmean(:)
  REAL(dp), ALLOCATABLE :: NPPtoGPP(:)
  INTEGER, ALLOCATABLE :: Iw(:) ! array of indices corresponding to woody (shrub or forest) tiles

  IF (.NOT.ALLOCATED(LAIMax)) ALLOCATE(LAIMax(mp))
  IF (.NOT.ALLOCATED(Cleafmean))  ALLOCATE(Cleafmean(mp))
  IF (.NOT.ALLOCATED(Crootmean)) ALLOCATE(Crootmean(mp))
  IF (.NOT.ALLOCATED(NPPtoGPP)) ALLOCATE(NPPtoGPP(mp))
  IF (.NOT.ALLOCATED(Iw)) ALLOCATE(Iw(POP%np))

  LOY = 365
  !! vh_js !!
  IF (cable_user%CALL_POP) THEN

     Iw = POP%Iwood

  ENDIF

  ktauday=INT(24.0*3600.0/dels)
  nday=(kend-kstart+1)/ktauday

  !chris 12/oct/2012 for spin up casa
  IF (.NOT.(ALLOCATED(avg_cleaf2met)))  ALLOCATE(avg_cleaf2met(mp), avg_cleaf2str(mp), avg_croot2met(mp), avg_croot2str(mp), &
       avg_cwood2cwd(mp), &
       avg_nleaf2met(mp), avg_nleaf2str(mp), avg_nroot2met(mp), avg_nroot2str(mp), avg_nwood2cwd(mp), &
       avg_pleaf2met(mp), avg_pleaf2str(mp), avg_proot2met(mp), avg_proot2str(mp), avg_pwood2cwd(mp), &
       avg_cgpp(mp),      avg_cnpp(mp),      avg_nuptake(mp),   avg_puptake(mp),                     &
       avg_xnplimit(mp),  avg_xkNlimiting(mp), avg_xklitter(mp), avg_xksoil(mp),                      &
       avg_rationcsoilmic(mp),avg_rationcsoilslow(mp),avg_rationcsoilpass(mp),                        &
       avg_nsoilmin(mp),  avg_psoillab(mp),    avg_psoilsorb(mp), avg_psoilocc(mp))

  ALLOCATE(avg_af(mp))
  ALLOCATE(avg_aw(mp))
  ALLOCATE(avg_ar(mp))
  ALLOCATE(avg_lf(mp))
  ALLOCATE(avg_lw(mp))
  ALLOCATE(avg_lr(mp))
  ALLOCATE(avg_annual_cnpp(mp))
  avg_af = 0.0
  avg_aw = 0.0
  avg_ar = 0.0
  avg_lf = 0.0
  avg_lw = 0.0
  avg_lr = 0.0
  avg_annual_cnpp = 0.0

  !!CLN  OPEN(91, file=fcnpspin)
  !!CLN  read(91,*) myearspin
  myearspin = CABLE_USER%CASA_SPIN_ENDYEAR - CABLE_USER%CASA_SPIN_STARTYEAR + 1
  ! compute the mean fluxes and residence time of each carbon pool
  avg_cleaf2met=0.0; avg_cleaf2str=0.0; avg_croot2met=0.0; avg_croot2str=0.0; avg_cwood2cwd=0.0
  avg_nleaf2met=0.0; avg_nleaf2str=0.0; avg_nroot2met=0.0; avg_nroot2str=0.0; avg_nwood2cwd=0.0
  avg_pleaf2met=0.0; avg_pleaf2str=0.0; avg_proot2met=0.0; avg_proot2str=0.0; avg_pwood2cwd=0.0
  avg_cgpp=0.0;      avg_cnpp=0.0;      avg_nuptake=0.0;   avg_puptake=0.0
  avg_xnplimit=0.0;  avg_xkNlimiting=0.0; avg_xklitter=0.0; avg_xksoil=0.0
  avg_nsoilmin=0.0;  avg_psoillab=0.0;    avg_psoilsorb=0.0; avg_psoilocc=0.0
  avg_rationcsoilmic=0.0;avg_rationcsoilslow=0.0;avg_rationcsoilpass=0.0

  DO nyear=1,myearspin
     !     read(91,901) ncfile
     WRITE(CYEAR,FMT="(I4)") CABLE_USER%CASA_SPIN_STARTYEAR + nyear - 1
     ncfile = TRIM(casafile%c2cdumppath)//'c2c_'//CYEAR//'_dump.nc'


     CALL read_casa_dump( ncfile,casamet, casaflux, phen,climate, ktau ,kend,.TRUE. )
     !!CLN901  format(A99)
     DO idoy=1,mdyear
        ktau=(idoy-1)*ktauday +1

        casamet%tairk(:)       = casamet%Tairkspin(:,idoy)
        casamet%tsoil(:,1)     = casamet%Tsoilspin_1(:,idoy)
        casamet%tsoil(:,2)     = casamet%Tsoilspin_2(:,idoy)
        casamet%tsoil(:,3)     = casamet%Tsoilspin_3(:,idoy)
        casamet%tsoil(:,4)     = casamet%Tsoilspin_4(:,idoy)
        casamet%tsoil(:,5)     = casamet%Tsoilspin_5(:,idoy)
        casamet%tsoil(:,6)     = casamet%Tsoilspin_6(:,idoy)
        casamet%moist(:,1)     = casamet%moistspin_1(:,idoy)
        casamet%moist(:,2)     = casamet%moistspin_2(:,idoy)
        casamet%moist(:,3)     = casamet%moistspin_3(:,idoy)
        casamet%moist(:,4)     = casamet%moistspin_4(:,idoy)
        casamet%moist(:,5)     = casamet%moistspin_5(:,idoy)
        casamet%moist(:,6)     = casamet%moistspin_6(:,idoy)
        casaflux%cgpp(:)       = casamet%cgppspin(:,idoy)
        casaflux%crmplant(:,1) = casamet%crmplantspin_1(:,idoy)
        casaflux%crmplant(:,2) = casamet%crmplantspin_2(:,idoy)
        casaflux%crmplant(:,3) = casamet%crmplantspin_3(:,idoy)
        phen%phase(:) = phen%phasespin(:,idoy)
        phen%doyphase(:,1) = phen%doyphasespin_1(:,idoy)
        phen%doyphase(:,2) =  phen%doyphasespin_2(:,idoy)
        phen%doyphase(:,3) =  phen%doyphasespin_3(:,idoy)
        phen%doyphase(:,4) =  phen%doyphasespin_4(:,idoy)
        IF (cable_user%call_climate) THEN
           climate%qtemp_max_last_year(:) =  casamet%mtempspin(:,idoy)
        ENDIF
        ! write(6699,*) casaflux%cgpp(1), climate%mtemp(1),  casaflux%crmplant(1,1)

        CALL biogeochem(ktau,dels,idoy,LALLOC,veg,soil,casabiome,casapool,casaflux, &
             casamet,casabal,phen,POP,climate,xnplimit,xkNlimiting,xklitter, &
             xksoil,xkleaf,xkleafcold,xkleafdry,&
             cleaf2met,cleaf2str,croot2met,croot2str,cwood2cwd,         &
             nleaf2met,nleaf2str,nroot2met,nroot2str,nwood2cwd,         &
             pleaf2met,pleaf2str,proot2met,proot2str,pwood2cwd)


        IF (cable_user%CALL_POP .AND. POP%np.GT.0) THEN ! CALL_POP

           IF (cable_user%CALL_POP) THEN ! accumulate input variables for POP
              ! accumulate annual variables for use in POP
              IF(MOD(ktau/ktauday,LOY)==1 ) THEN
                 casaflux%stemnpp =  casaflux%cnpp * casaflux%fracCalloc(:,2) * 0.7 ! (assumes 70% of wood NPP is allocated above ground)
                 casabal%LAImax = casamet%glai
                 casabal%Cleafmean = casapool%cplant(:,1)/REAL(LOY)/1000.
                 casabal%Crootmean = casapool%cplant(:,3)/REAL(LOY)/1000.
              ELSE
                 casaflux%stemnpp = casaflux%stemnpp + casaflux%cnpp * casaflux%fracCalloc(:,2) * 0.7
                 casabal%LAImax = MAX(casamet%glai, casabal%LAImax)
                 casabal%Cleafmean = casabal%Cleafmean + casapool%cplant(:,1)/REAL(LOY)/1000.
                 casabal%Crootmean = casabal%Crootmean + casapool%cplant(:,3)/REAL(LOY)/1000.
              ENDIF
           ELSE
              casaflux%stemnpp = 0.
           ENDIF ! CALL_POP


           IF(idoy==mdyear) THEN ! end of year

              CALL POPdriver(casaflux,casabal,veg, POP)

           ENDIF  ! end of year
        ELSE
           casaflux%stemnpp = 0.
        ENDIF ! CALL_POP


!!$        WHERE(xkNlimiting .eq. 0)  !Chris Lu 4/June/2012
!!$           xkNlimiting = 0.001
!!$        END WHERE
        nptx=8173

        ! Calculate average allocation fractions  (-) for the plant pools
        avg_af = avg_af + casaflux%fracCalloc(:,leaf)
        avg_aw = avg_aw + casaflux%fracCalloc(:,wood)
        avg_ar = avg_ar + casaflux%fracCalloc(:,froot)

        ! Calculate average turnover rates for the plant pools (yr-1)
        avg_lf = avg_lf + (casaflux%kplant(:,leaf) * REAL(LOY))
        avg_lw = avg_lw + (casaflux%kplant(:,wood) * REAL(LOY))
        avg_lr = avg_lr + (casaflux%kplant(:,froot) * REAL(LOY))

        avg_cleaf2met = avg_cleaf2met + cleaf2met
        avg_cleaf2str = avg_cleaf2str + cleaf2str
        avg_croot2met = avg_croot2met + croot2met
        avg_croot2str = avg_croot2str + croot2str
        avg_cwood2cwd = avg_cwood2cwd + cwood2cwd

        avg_nleaf2met = avg_nleaf2met + nleaf2met
        avg_nleaf2str = avg_nleaf2str + nleaf2str
        avg_nroot2met = avg_nroot2met + nroot2met
        avg_nroot2str = avg_nroot2str + nroot2str
        avg_nwood2cwd = avg_nwood2cwd + nwood2cwd

        avg_pleaf2met = avg_pleaf2met + pleaf2met
        avg_pleaf2str = avg_pleaf2str + pleaf2str
        avg_proot2met = avg_proot2met + proot2met
        avg_proot2str = avg_proot2str + proot2str
        avg_pwood2cwd = avg_pwood2cwd + pwood2cwd

        avg_cgpp      = avg_cgpp      + casaflux%cgpp
        avg_cnpp      = avg_cnpp      + casaflux%cnpp
        avg_nuptake   = avg_nuptake   + casaflux%Nminuptake
        avg_puptake   = avg_puptake   + casaflux%Plabuptake

        avg_xnplimit    = avg_xnplimit    + xnplimit
        avg_xkNlimiting = avg_xkNlimiting + xkNlimiting
        avg_xklitter    = avg_xklitter    + xklitter
        avg_xksoil      = avg_xksoil      + xksoil

        avg_nsoilmin    = avg_nsoilmin    + casapool%nsoilmin
        avg_psoillab    = avg_psoillab    + casapool%psoillab
        avg_psoilsorb   = avg_psoilsorb   + casapool%psoilsorb
        avg_psoilocc    = avg_psoilocc    + casapool%psoilocc

        avg_rationcsoilmic  = avg_rationcsoilmic  + casapool%ratioNCsoilnew(:,mic)
        avg_rationcsoilslow = avg_rationcsoilslow + casapool%ratioNCsoilnew(:,slow)
        avg_rationcsoilpass = avg_rationcsoilpass + casapool%ratioNCsoilnew(:,pass)
     ENDDO
  ENDDO

  ! Average the plant allocation fraction
  avg_af = avg_af / REAL(nday)
  avg_aw = avg_aw / REAL(nday)
  avg_ar = avg_ar / REAL(nday)

  ! Average the plant turnover fraction
  avg_lf = avg_lf / REAL(nday)
  avg_lw = avg_lw / REAL(nday)
  avg_lr = avg_lr / REAL(nday)

  ! Need the annual NPP to solve plant pools g C m-2 y-1
  avg_annual_cnpp = avg_cnpp / REAL(myearspin)

  avg_cleaf2met = avg_cleaf2met/REAL(nday)
  avg_cleaf2str = avg_cleaf2str/REAL(nday)
  avg_croot2met = avg_croot2met/REAL(nday)
  avg_croot2str = avg_croot2str/REAL(nday)
  avg_cwood2cwd = avg_cwood2cwd/REAL(nday)

  avg_nleaf2met = avg_nleaf2met/REAL(nday)
  avg_nleaf2str = avg_nleaf2str/REAL(nday)
  avg_nroot2met = avg_nroot2met/REAL(nday)
  avg_nroot2str = avg_nroot2str/REAL(nday)
  avg_nwood2cwd = avg_nwood2cwd/REAL(nday)

  avg_pleaf2met = avg_pleaf2met/REAL(nday)
  avg_pleaf2str = avg_pleaf2str/REAL(nday)
  avg_proot2met = avg_proot2met/REAL(nday)
  avg_proot2str = avg_proot2str/REAL(nday)
  avg_pwood2cwd = avg_pwood2cwd/REAL(nday)

  avg_cgpp      = avg_cgpp/REAL(nday)
  avg_cnpp      = avg_cnpp/REAL(nday)

  avg_nuptake   = avg_nuptake/REAL(nday)
  avg_puptake   = avg_puptake/REAL(nday)

  avg_xnplimit    = avg_xnplimit/REAL(nday)
  avg_xkNlimiting = avg_xkNlimiting/REAL(nday)
  avg_xklitter    = avg_xklitter/REAL(nday)

  avg_xksoil      = avg_xksoil/REAL(nday)

  avg_nsoilmin    = avg_nsoilmin/REAL(nday)
  avg_psoillab    = avg_psoillab/REAL(nday)
  avg_psoilsorb   = avg_psoilsorb/REAL(nday)
  avg_psoilocc    = avg_psoilocc/REAL(nday)

  avg_rationcsoilmic  = avg_rationcsoilmic  /REAL(nday)
  avg_rationcsoilslow = avg_rationcsoilslow /REAL(nday)
  avg_rationcsoilpass = avg_rationcsoilpass /REAL(nday)

  CALL analyticpool(kend,veg,soil,casabiome,casapool,                                          &
       casaflux,casamet,casabal,phen,                                         &
       avg_cleaf2met,avg_cleaf2str,avg_croot2met,avg_croot2str,avg_cwood2cwd, &
       avg_nleaf2met,avg_nleaf2str,avg_nroot2met,avg_nroot2str,avg_nwood2cwd, &
       avg_pleaf2met,avg_pleaf2str,avg_proot2met,avg_proot2str,avg_pwood2cwd, &
       avg_cgpp, avg_cnpp, avg_nuptake, avg_puptake,                          &
       avg_xnplimit,avg_xkNlimiting,avg_xklitter,avg_xksoil,                  &
       avg_ratioNCsoilmic,avg_ratioNCsoilslow,avg_ratioNCsoilpass,            &
       avg_nsoilmin,avg_psoillab,avg_psoilsorb,avg_psoilocc,                  &
       avg_af, avg_aw, avg_ar, avg_lf, avg_lw, avg_lr, avg_annual_cnpp)

!!$  call totcnppools(1,veg,casamet,casapool,bmcplant,bmnplant,bmpplant,bmclitter,bmnlitter,bmplitter, &
!!$       bmcsoil,bmnsoil,bmpsoil,bmnsoilmin,bmpsoillab,bmpsoilsorb,bmpsoilocc,bmarea)

  nloop1= MAX(1,mloop-3)

  DO nloop=1,mloop

     !!CLN  OPEN(91,file=fcnpspin)
     !!CLN  read(91,*)
     DO nyear=1,myearspin
        !!CLN      read(91,901) ncfile
        !write(*,*) 'spincasa CYEAR', CYEAR, ncfile
        WRITE(CYEAR,FMT="(I4)") CABLE_USER%CASA_SPIN_STARTYEAR + nyear - 1
        ncfile = TRIM(casafile%c2cdumppath)//'c2c_'//CYEAR//'_dump.nc'
        CALL read_casa_dump( ncfile, casamet, casaflux, phen,climate, ktau, kend, .TRUE. )

        DO idoy=1,mdyear
           ktauy=idoy*ktauday
           ktau=(idoy-1)*ktauday +1

           casamet%tairk(:)       = casamet%Tairkspin(:,idoy)
           casamet%tsoil(:,1)     = casamet%Tsoilspin_1(:,idoy)
           casamet%tsoil(:,2)     = casamet%Tsoilspin_2(:,idoy)
           casamet%tsoil(:,3)     = casamet%Tsoilspin_3(:,idoy)
           casamet%tsoil(:,4)     = casamet%Tsoilspin_4(:,idoy)
           casamet%tsoil(:,5)     = casamet%Tsoilspin_5(:,idoy)
           casamet%tsoil(:,6)     = casamet%Tsoilspin_6(:,idoy)
           casamet%moist(:,1)     = casamet%moistspin_1(:,idoy)
           casamet%moist(:,2)     = casamet%moistspin_2(:,idoy)
           casamet%moist(:,3)     = casamet%moistspin_3(:,idoy)
           casamet%moist(:,4)     = casamet%moistspin_4(:,idoy)
           casamet%moist(:,5)     = casamet%moistspin_5(:,idoy)
           casamet%moist(:,6)     = casamet%moistspin_6(:,idoy)
           casaflux%cgpp(:)       = casamet%cgppspin(:,idoy)
           casaflux%crmplant(:,1) = casamet%crmplantspin_1(:,idoy)
           casaflux%crmplant(:,2) = casamet%crmplantspin_2(:,idoy)
           casaflux%crmplant(:,3) = casamet%crmplantspin_3(:,idoy)
           phen%phase(:) = phen%phasespin(:,idoy)
           phen%doyphase(:,1) = phen%doyphasespin_1(:,idoy)
           phen%doyphase(:,2) =  phen%doyphasespin_2(:,idoy)
           phen%doyphase(:,3) =  phen%doyphasespin_3(:,idoy)
           phen%doyphase(:,4) =  phen%doyphasespin_4(:,idoy)
           IF (cable_user%call_climate) THEN
              climate%qtemp_max_last_year(:) =  casamet%mtempspin(:,idoy)
           ENDIF



           CALL biogeochem(ktauy,dels,idoy,LALLOC,veg,soil,casabiome,casapool,casaflux, &
                casamet,casabal,phen,POP,climate,xnplimit,xkNlimiting,xklitter,xksoil,xkleaf,&
                xkleafcold,xkleafdry,&
                cleaf2met,cleaf2str,croot2met,croot2str,cwood2cwd,         &
                nleaf2met,nleaf2str,nroot2met,nroot2str,nwood2cwd,         &
                pleaf2met,pleaf2str,proot2met,proot2str,pwood2cwd)



           IF (cable_user%CALL_POP .AND. POP%np.GT.0) THEN ! CALL_POP

              IF (cable_user%CALL_POP) THEN ! accumulate input variables for POP
                 ! accumulate annual variables for use in POP
                 IF(MOD(ktau/ktauday,LOY)==1 ) THEN
                    casaflux%stemnpp =  casaflux%cnpp * casaflux%fracCalloc(:,2) * 0.7 ! (assumes 70% of wood NPP is allocated above ground)
                    casabal%LAImax = casamet%glai
                    casabal%Cleafmean = casapool%cplant(:,1)/REAL(LOY)/1000.
                    casabal%Crootmean = casapool%cplant(:,3)/REAL(LOY)/1000.
                 ELSE
                    casaflux%stemnpp = casaflux%stemnpp + casaflux%cnpp * casaflux%fracCalloc(:,2) * 0.7
                    casabal%LAImax = MAX(casamet%glai, casabal%LAImax)
                    casabal%Cleafmean = casabal%Cleafmean + casapool%cplant(:,1)/REAL(LOY)/1000.
                    casabal%Crootmean = casabal%Crootmean + casapool%cplant(:,3)/REAL(LOY)/1000.
                 ENDIF
              ELSE
                 casaflux%stemnpp = 0.
              ENDIF ! CALL_POP


              IF(idoy==mdyear) THEN ! end of year

                 CALL POPdriver(casaflux,casabal,veg, POP)


              ENDIF  ! end of year
           ELSE
              casaflux%stemnpp = 0.
           ENDIF ! CALL_POP


        ENDDO   ! end of idoy
     ENDDO   ! end of nyear


!!$  if(nloop>=nloop1) &
!!$       call totcnppools(2+nloop-nloop1,veg,casamet,casapool,bmcplant,bmnplant,bmpplant,bmclitter,bmnlitter,bmplitter, &
!!$       bmcsoil,bmnsoil,bmpsoil,bmnsoilmin,bmpsoillab,bmpsoilsorb,bmpsoilocc,bmarea)

  ENDDO     ! end of nloop

  CALL casa_fluxout(CABLE_USER%CASA_SPIN_STARTYEAR + myearspin - 1 , veg, soil, casabal, casamet)

  !STOP

  ! write the last five loop pool size by PFT type
  OPEN(92,file='cnpspinlast5.txt')
  WRITE(92,921)
921 FORMAT('PFT total area in 10**12 m2', f12.4)
  DO nvt=1,mvtype
     WRITE(92,*) bmarea(nvt)
  ENDDO

  DO nvt=1,mvtype
     IF(bmarea(nvt) >0.0) THEN
        DO kloop=1,5
           WRITE(92,922) nvt, bmcplant(kloop,nvt,:),bmclitter(kloop,nvt,:),bmcsoil(kloop,nvt,:)
        ENDDO
        IF (icycle >1) THEN
           DO kloop=1,5
              WRITE(92,922) nvt, bmnplant(kloop,nvt,:),bmnlitter(kloop,nvt,:),bmnsoil(kloop,nvt,:), bmnsoilmin(kloop,nvt)
           ENDDO
        ENDIF

        IF(icycle >2) THEN
           DO kloop=1,5
              WRITE(92,922) nvt, bmpplant(kloop,nvt,:),bmplitter(kloop,nvt,:),bmpsoil(kloop,nvt,:),  &
                   bmpsoillab(kloop,nvt), bmpsoilsorb(kloop,nvt), bmpsoilocc(kloop,nvt)
           ENDDO
        ENDIF
     ENDIF
  ENDDO
922 FORMAT(i4,20(f10.4,2x))
  CLOSE(92)


151 FORMAT(i6,100(f12.5,2x))
END SUBROUTINE spincasacnp