*IF DEF,A19_1A                                                             VEG1A.2      
C *****************************COPYRIGHT******************************     VEG1A.3      
C (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved.    VEG1A.4      
C                                                                          VEG1A.5      
C Use, duplication or disclosure of this code is subject to the            VEG1A.6      
C restrictions as set forth in the contract.                               VEG1A.7      
C                                                                          VEG1A.8      
C                Meteorological Office                                     VEG1A.9      
C                London Road                                               VEG1A.10     
C                BRACKNELL                                                 VEG1A.11     
C                Berkshire UK                                              VEG1A.12     
C                RG12 2SZ                                                  VEG1A.13     
C                                                                          VEG1A.14     
C If no contract has been raised with this copy of the code, the use,      VEG1A.15     
C duplication or disclosure of it is strictly prohibited.  Permission      VEG1A.16     
C to do so must first be obtained in writing from the Head of Numerical    VEG1A.17     
C Modelling at the above address.                                          VEG1A.18     
C ******************************COPYRIGHT******************************    VEG1A.19     
! Version 1A of vegetation section: models leaf phenology                  VEG1A.20     
!                                                                          VEG1A.21     
! Subroutine Interface:                                                    VEG1A.22     

      SUBROUTINE VEG(P_FIELD,FIRST_POINT,LAST_POINT,LAND_FIELD              2,22VEG1A.23     
     &,              LAND1,LAND_PTS,LAND_INDEX,P_ROWS,ROW_LENGTH           ABX3F405.29     
*IF DEF,MPP                                                                ABX3F405.30     
     &,              EW_Halo,NS_Halo                                       ABX3F405.31     
*ENDIF                                                                     ABX3F405.32     
     &,              A_STEP,PHENOL_PERIOD,L_PHENOL                         VEG1A.25     
     &,              ALB_SOIL,ATIMESTEP                                    VEG1A.26     
     &,              G_LEAF_AC,FRAC,LAI,HT                                 VEG1A.27     
     &,              ALBSNC,ALBSNF,CATCH_T,Z0_P,Z0_T                       ABX1F405.1337   
     &,              G_LEAF_DAY,G_LEAF_PHEN,LAI_PHEN                       ABX1F405.1338   
     &               )                                                     ABX1F405.1339   
                                                                           VEG1A.29     
                                                                           VEG1A.30     
      IMPLICIT NONE                                                        VEG1A.31     
!                                                                          VEG1A.32     
! Description:                                                             VEG1A.33     
!   Updates Leaf Area Index for Plant Functional Types (PFTs) and uses     VEG1A.34     
!   this to derive new vegetation parameters for PFTs along with gridbox   VEG1A.35     
!   mean values where appropriate.                                         VEG1A.36     
!                                                                          VEG1A.37     
! Method:                                                                  VEG1A.38     
!   Calls PHENOL which models phenology and updates Leaf Area Index        VEG1A.39     
!   (LAI), then passes new LAI into SPARM along with canopy height         VEG1A.40     
!   and fractional cover of Plant Functional Types.  SPARM uses this to    VEG1A.41     
!   derive the vegetation parameters for each PFT, and also derives        VEG1A.42     
!   gridbox means where this is required.                                  VEG1A.43     
!                                                                          VEG1A.44     
! Current Code Owner:  Richard Betts                                       VEG1A.45     
!                                                                          VEG1A.46     
! History:                                                                 VEG1A.47     
! Version   Date     Comment                                               VEG1A.48     
! -------   ----     -------                                               VEG1A.49     
!   4.4    8/10/97   Original code.  Richard Betts                         VEG1A.50     
!   4.5   16/09/98   Call SWAPB_LAND to update halo regions of input       ABX3F405.33     
!                    fields.   Richard Betts                               ABX3F405.34     
!   4.5   23/11/98   Output G_LEAF_DAY, G_LEAF_PHEN and LAI_PHEN as        ABX1F405.1340   
!                    diagnostics.  Richard Betts                           ABX1F405.1341   
!                                                                          VEG1A.51     
! Code Description:                                                        VEG1A.52     
!   Language: FORTRAN 77 + common extensions.                              VEG1A.53     
!   This code is written to UMDP3 v6 programming standards.                VEG1A.54     
                                                                           VEG1A.55     
                                                                           VEG1A.56     
      INTEGER                                                              VEG1A.57     
     & P_FIELD               ! IN Number of P-points in whole grid.        VEG1A.58     
     &,FIRST_POINT           ! IN First P-point to be processed.           VEG1A.59     
     &,LAST_POINT            ! IN Number of P-points to be processed.      VEG1A.60     
     &,LAND_FIELD            ! IN Number of land points.                   VEG1A.61     
     &,LAND1                 ! IN First land point to be processed.        VEG1A.62     
     &,LAND_PTS              ! IN Number of land points to be processed.   VEG1A.63     
     &,P_ROWS                       ! IN Number of rows on P grid.         ABX3F405.35     
     &,ROW_LENGTH                   ! IN Number of P points in a row.      ABX3F405.36     
*IF DEF,MPP                                                                ABX3F405.37     
     &,EW_Halo                      ! IN Halo size in the EW direction.    ABX3F405.38     
     &,NS_Halo                      ! IN Halo size in the NS direction.    ABX3F405.39     
*ENDIF                                                                     ABX3F405.40     
     &,A_STEP                ! IN Atmospheric timestep number.             VEG1A.64     
     &,PHENOL_PERIOD         ! IN Phenology period (days).                 VEG1A.65     
                                                                           VEG1A.66     
*CALL NSTYPES                                                              VEG1A.67     
                                                                           VEG1A.68     
      INTEGER                                                              VEG1A.69     
     & LAND_INDEX(LAND_FIELD)       ! IN I=LAND_INDEX(L) => the Ith        VEG1A.70     
!                                   !    point in P_FIELD is the Lth       VEG1A.71     
!                                   !    land point.                       VEG1A.72     
                                                                           VEG1A.73     
      INTEGER                                                              VEG1A.74     
     & I,J,L,N                      ! WORK loop counters.                  VEG1A.75     
                                                                           VEG1A.76     
      LOGICAL                                                              VEG1A.77     
     & L_PHENOL                     ! IN .T. for interactive leaf          VEG1A.78     
!                                   !    phenology.                        VEG1A.79     
      REAL                                                                 VEG1A.80     
     & ALB_SOIL(LAND_FIELD)         ! IN snow-free albedo of soil.         VEG1A.81     
     &,ATIMESTEP                    ! IN Atmospheric timestep (s).         VEG1A.82     
     &,G_LEAF_AC(LAND_FIELD,NPFT)   ! INOUT Accumulated leaf turnover      VEG1A.83     
!                                   !       rate.                          VEG1A.84     
     &,FRAC(LAND_FIELD,NTYPE)       ! INOUT Fractions of surface types.    VEG1A.85     
     &,LAI(LAND_FIELD,NPFT)         ! INOUT LAI of plant functional        VEG1A.86     
!                                   !       types.                         VEG1A.87     
     &,HT(LAND_FIELD,NPFT)          ! INOUT Height of plant functional     VEG1A.88     
!                                   !       types (m).                     VEG1A.89     
     &,ALBSNC(LAND_FIELD)           ! OUT Snow-covered albedo.             VEG1A.90     
     &,ALBSNF(LAND_FIELD)           ! OUT Snow-free albedo.                VEG1A.91     
     &,CATCH_T(LAND_FIELD,NTYPE-1)  ! OUT Canopy capacity for each type    VEG1A.92     
!                                   !     aside from ice (kg/m2).          VEG1A.93     
     &,LAI_PHEN(LAND_FIELD,NPFT)    ! OUT LAI of PFTs after phenology.     ABX1F405.1342   
!                                   !     Required as separate variable    ABX1F405.1343   
!                                   !     for top-level argument list      ABX1F405.1344   
!                                   !     matching with VEG_IC2A.          ABX1F405.1345   
     &,Z0_P(P_FIELD)                ! OUT Effective roughness length       VEG1A.94     
!                                   !     on full grid (m).                VEG1A.95     
     &,Z0_T(LAND_FIELD,NTYPE)       ! OUT Roughness length for each type   VEG1A.96     
!                                   !     (m).                             VEG1A.97     
                                                                           VEG1A.98     
      INTEGER                                                              VEG1A.99     
     & NSTEP_PHEN                   ! WORK Number of atmospheric           VEG1A.100    
!                                   !      timesteps between calls to      VEG1A.101    
!                                   !      PHENOL.                         VEG1A.102    
     &,TILE_PTS(NTYPE)              ! WORK Number of land points which     VEG1A.103    
!                                   !      include the nth surface type.   VEG1A.104    
     &,TILE_INDEX(LAND_FIELD,NTYPE) ! WORK Indices of land points which    VEG1A.105    
!                                   !      include the nth surface type.   VEG1A.106    
                                                                           VEG1A.107    
      REAL                                                                 VEG1A.108    
     & DTIME_PHEN                   ! WORK The phenology timestep (yr).    VEG1A.109    
     &,G_LEAF_DAY(LAND_FIELD,NPFT)  ! WORK Mean leaf turnover rate for     VEG1A.110    
!                                   !      input to PHENOL (/360days).     ABX1F405.1346   
     &,G_LEAF_PHEN(LAND_FIELD,NPFT) ! WORK Mean leaf turnover rate over    VEG1A.112    
!                                   !      phenology period (/360days).    ABX1F405.1347   
     &,Z0(LAND_FIELD)               ! WORK Roughness length on             VEG1A.114    
!                                   !      land points (m).                VEG1A.115    
                                                                           VEG1A.116    
!-----------------------------------------------------------------------   VEG1A.117    
! Initialisations                                                          VEG1A.118    
!-----------------------------------------------------------------------   VEG1A.119    
      DO L=1,LAND_FIELD                                                    ABX1F405.1348   
        ALBSNC(L)=0.0                                                      VEG1A.121    
        ALBSNF(L)=0.0                                                      VEG1A.122    
        Z0(L)=0.0                                                          VEG1A.123    
      ENDDO                                                                VEG1A.124    
                                                                           VEG1A.125    
      DO N=1,NTYPE                                                         VEG1A.126    
        DO L=1,LAND_FIELD                                                  ABX1F405.1349   
          Z0_T(L,N)=0.0                                                    VEG1A.128    
        ENDDO                                                              VEG1A.129    
      ENDDO                                                                VEG1A.130    
                                                                           VEG1A.131    
      DO N=1,NTYPE-1                                                       VEG1A.132    
        DO L=1,LAND_FIELD                                                  ABX1F405.1350   
          CATCH_T(L,N)=0.0                                                 VEG1A.134    
        ENDDO                                                              VEG1A.135    
      ENDDO                                                                VEG1A.136    
                                                                           VEG1A.137    
      DO N=1,NPFT                                                          VEG1A.138    
        DO L=1,LAND_FIELD                                                  ABX1F405.1351   
          G_LEAF_PHEN(L,N)=0.0                                             VEG1A.140    
          G_LEAF_DAY(L,N)=0.0                                              VEG1A.141    
        ENDDO                                                              VEG1A.142    
      ENDDO                                                                VEG1A.143    
                                                                           VEG1A.144    
!-----------------------------------------------------------------------   VEG1A.145    
! Calculate the number of atmospheric timesteps between calls to PHENOL    VEG1A.146    
! and TRIFFID.                                                             VEG1A.147    
!-----------------------------------------------------------------------   VEG1A.148    
      NSTEP_PHEN=INT(86400.0*PHENOL_PERIOD/ATIMESTEP)                      VEG1A.149    
                                                                           VEG1A.150    
*IF DEF,MPP                                                                ABX3F405.41     
!-----------------------------------------------------------------------   ABX3F405.42     
! Update halos on input fields                                             ABX3F405.43     
!-----------------------------------------------------------------------   ABX3F405.44     
      CALL SWAPB_LAND(LAI,LAND_FIELD,P_FIELD,                              ABX3F405.45     
     &                ROW_LENGTH,P_ROWS,EW_Halo,NS_Halo,                   ABX3F405.46     
     &                NPFT,LAND_INDEX)                                     ABX3F405.47     
                                                                           ABX3F405.48     
      CALL SWAPB_LAND(HT,LAND_FIELD,P_FIELD,                               ABX3F405.49     
     &                ROW_LENGTH,P_ROWS,EW_Halo,NS_Halo,                   ABX3F405.50     
     &                NPFT,LAND_INDEX)                                     ABX3F405.51     
                                                                           ABX3F405.52     
      CALL SWAPB_LAND(G_LEAF_AC,LAND_FIELD,P_FIELD,                        ABX3F405.53     
     &                ROW_LENGTH,P_ROWS,EW_Halo,NS_Halo,                   ABX3F405.54     
     &                NPFT,LAND_INDEX)                                     ABX3F405.55     
*ENDIF                                                                     ABX3F405.56     
                                                                           ABX3F405.57     
!-----------------------------------------------------------------------   VEG1A.151    
! Create the TILE_INDEX array of land points with each surface type        VEG1A.152    
!-----------------------------------------------------------------------   VEG1A.153    
      CALL TILEPTS(P_FIELD,LAND_FIELD,LAND1,LAND_PTS,                      VEG1A.154    
     &             FRAC,TILE_PTS,TILE_INDEX)                               VEG1A.155    
                                                                           VEG1A.156    
      IF (L_PHENOL .AND. MOD(A_STEP,NSTEP_PHEN).EQ.0) THEN                 VEG1A.157    
                                                                           VEG1A.158    
!-----------------------------------------------------------------------   VEG1A.159    
! Calculate the phenology timestep in years.                               VEG1A.160    
!-----------------------------------------------------------------------   VEG1A.161    
        DTIME_PHEN=FLOAT(PHENOL_PERIOD)/360.0                              VEG1A.162    
                                                                           VEG1A.163    
                                                                           VEG1A.164    
        DO N=1,NPFT                                                        VEG1A.165    
                                                                           VEG1A.166    
!-----------------------------------------------------------------------   VEG1A.167    
! Calculate the mean turnover rate and update the leaf phenological        VEG1A.168    
! state.                                                                   VEG1A.169    
!-----------------------------------------------------------------------   VEG1A.170    
          DO J=1,TILE_PTS(N)                                               VEG1A.171    
            L=TILE_INDEX(J,N)                                              VEG1A.172    
            G_LEAF_DAY(L,N)=G_LEAF_AC(L,N)/DTIME_PHEN                      VEG1A.173    
          ENDDO                                                            VEG1A.174    
                                                                           VEG1A.175    
          WRITE(6,*) 'Calling phenology'                                   ABX1F405.1352   
                                                                           ABX1F405.1353   
          CALL PHENOL (LAND_FIELD,TILE_PTS(N),TILE_INDEX(1,N),N,           VEG1A.176    
     &                 G_LEAF_DAY(1,N),HT(1,N),DTIME_PHEN,                 VEG1A.177    
     &                 G_LEAF_PHEN(1,N),LAI(1,N))                          VEG1A.178    
                                                                           VEG1A.179    
          WRITE(6,*) 'Phenology completed normally'                        ABX1F405.1354   
                                                                           ABX1F405.1355   
          DO L=1,LAND_FIELD                                                ABX1F405.1356   
            LAI_PHEN(L,N)=LAI(L,N)                                         ABX1F405.1357   
          ENDDO                                                            ABX1F405.1358   
                                                                           ABX1F405.1359   
!-----------------------------------------------------------------------   VEG1A.180    
! Reset the accumulation over atmospheric model timesteps to zero.         VEG1A.181    
!-----------------------------------------------------------------------   VEG1A.182    
          DO L=1,LAND_FIELD                                                ABX1F405.1360   
            G_LEAF_AC(L,N)=0.0                                             VEG1A.184    
          ENDDO                                                            VEG1A.185    
        ENDDO                                                              VEG1A.186    
      ENDIF                                                                VEG1A.187    
                                                                           VEG1A.188    
!-----------------------------------------------------------------------   VEG1A.189    
! Calculate gridbox mean vegetation parameters from fractions of           VEG1A.190    
! surface functional types                                                 VEG1A.191    
!-----------------------------------------------------------------------   VEG1A.192    
      CALL SPARM (LAND_FIELD,LAND1,LAND_PTS,TILE_PTS,TILE_INDEX            VEG1A.193    
     &,           ALB_SOIL,FRAC,HT,LAI                                     VEG1A.194    
     &,           ALBSNC,ALBSNF,CATCH_T,Z0,Z0_T)                           VEG1A.195    
                                                                           VEG1A.196    
!-----------------------------------------------------------------------   VEG1A.197    
! Copy Z0 from land field to full field                                    VEG1A.198    
!-----------------------------------------------------------------------   VEG1A.199    
      DO L=LAND1,LAND1+LAND_PTS-1                                          VEG1A.200    
        I = LAND_INDEX(L)                                                  VEG1A.201    
        Z0_P(I)=Z0(L)                                                      VEG1A.202    
      ENDDO                                                                VEG1A.203    
                                                                           VEG1A.204    
      RETURN                                                               VEG1A.205    
      END                                                                  VEG1A.206    
*ENDIF                                                                     VEG1A.207