*IF DEF,A19_2A COMPT2A.2 C *****************************COPYRIGHT****************************** COMPT2A.3 C (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved. COMPT2A.4 C COMPT2A.5 C Use, duplication or disclosure of this code is subject to the COMPT2A.6 C restrictions as set forth in the contract. COMPT2A.7 C COMPT2A.8 C Meteorological Office COMPT2A.9 C London Road COMPT2A.10 C BRACKNELL COMPT2A.11 C Berkshire UK COMPT2A.12 C RG12 2SZ COMPT2A.13 C COMPT2A.14 C If no contract has been raised with this copy of the code, the use, COMPT2A.15 C duplication or disclosure of it is strictly prohibited. Permission COMPT2A.16 C to do so must first be obtained in writing from the Head of Numerical COMPT2A.17 C Modelling at the above address. COMPT2A.18 C ******************************COPYRIGHT****************************** COMPT2A.19 !!! Subroutine COMPETE ------------------------------------------------ COMPT2A.20 !!! COMPT2A.21 !!! Purpose : Updates fractional coverage of each functional type. COMPT2A.22 !!! Requires a dominance hierachy as input. COMPT2A.23 !!! COMPT2A.24 !!! COMPT2A.25 !!! Model Modification history: COMPT2A.26 !!! version Date COMPT2A.27 !!! 4.4 10/97 New Deck. Peter Cox COMPT2A.28 !!! 4.5 12/05/98 Operate only on points indexed with TRIF_INDEX. ABX1F405.1523 !!! Richard Betts ABX1F405.1524 !!! COMPT2A.29 !!!END ---------------------------------------------------------------- COMPT2A.30SUBROUTINE COMPETE (DOM,LAND_FIELD,TRIF_PTS,TRIF_INDEX 1ABX1F405.1525 &, B,DB_DFRAC,FORW,GAMMA,NOSOIL COMPT2A.32 &, FRAC,DFRAC) COMPT2A.33 COMPT2A.34 IMPLICIT NONE COMPT2A.35 COMPT2A.36 *CALL NSTYPES
COMPT2A.37 COMPT2A.38 INTEGER COMPT2A.39 & LAND_FIELD ! IN Total number of land points. ABX1F405.1526 &,TRIF_PTS ! IN Number of points on which ABX1F405.1527 ! ! TRIFFID may operate ABX1F405.1528 &,K,L,M,N,T ! WORK Loop counters. ABX1F405.1529 ABX1F405.1530 INTEGER ABX1F405.1531 & DOM(LAND_FIELD,NPFT) ! IN Dominance hierachy. ABX1F405.1532 &,TRIF_INDEX(LAND_FIELD) ! IN Indices of land points on ABX1F405.1533 ! ! which TRIFFID may operate ABX1F405.1534 COMPT2A.46 REAL COMPT2A.47 & B(LAND_FIELD,NPFT) ! IN Mean rate of change of COMPT2A.48 C ! vegetation fraction over COMPT2A.49 C ! the timestep (kg C/m2/360days). ABX1F405.1535 &,DB_DFRAC(LAND_FIELD,NPFT,NPFT) COMPT2A.51 C ! IN Rate of change of B COMPT2A.52 C ! with vegetation fraction. COMPT2A.53 &,FORW ! IN Forward weighting factor. COMPT2A.54 &,GAMMA ! IN Inverse timestep (/360days). ABX1F405.1536 &,NOSOIL(LAND_FIELD) ! IN Fractional area not available COMPT2A.56 C ! to vegetation. COMPT2A.57 &,FRAC(LAND_FIELD,NTYPE) ! INOUT Updated areal fraction. COMPT2A.58 &,DFRAC(LAND_FIELD,NPFT) ! OUT Increment to areal fraction. COMPT2A.59 &,DENOM ! WORK Denominator of update COMPT2A.60 C ! equation. COMPT2A.61 &,DENOM_MIN ! WORK Minimum value for the COMPT2A.62 C ! denominator of the update COMPT2A.63 C ! equation. Ensures that COMPT2A.64 C ! gradient descent does not COMPT2A.65 C ! lead to an unstable solution. COMPT2A.66 &,NUMER ! WORK Numerator of the update COMPT2A.67 C ! equation. COMPT2A.68 &,SPACE(LAND_FIELD) ! WORK Available space. COMPT2A.69 &,P1,P2,Q1,Q2,R1,R2 ! WORK Coefficients in simultaneous COMPT2A.70 C ! equations. COMPT2A.71 C---------------------------------------------------------------------- COMPT2A.72 C Local parameters COMPT2A.73 C---------------------------------------------------------------------- COMPT2A.74 *CALL SEED
COMPT2A.75 *CALL DESCENT
COMPT2A.76 COMPT2A.77 COMPT2A.78 C---------------------------------------------------------------------- COMPT2A.79 C Initialisations. Set increments to zero and define the space COMPT2A.80 C available to the dominant type leaving space for the seeds of others. COMPT2A.81 C---------------------------------------------------------------------- COMPT2A.82 DO T=1,TRIF_PTS ABX1F405.1537 L=TRIF_INDEX(T) ABX1F405.1538 DO N=1,NPFT COMPT2A.84 DFRAC(L,N) = 0.0 COMPT2A.85 ENDDO COMPT2A.86 SPACE(L) = 1-NOSOIL(L)-FRAC_MIN*(NPFT-1) COMPT2A.87 ENDDO COMPT2A.88 COMPT2A.89 C---------------------------------------------------------------------- COMPT2A.90 C Calculate the increments to the tree fractions COMPT2A.91 C---------------------------------------------------------------------- COMPT2A.92 DO T=1,TRIF_PTS ABX1F405.1539 L=TRIF_INDEX(T) ABX1F405.1540 N = DOM(L,1) COMPT2A.94 M = DOM(L,2) COMPT2A.95 P1 = GAMMA/FRAC(L,N)-FORW*DB_DFRAC(L,N,N) COMPT2A.96 P2 = GAMMA/FRAC(L,M)-FORW*DB_DFRAC(L,M,M) COMPT2A.97 Q1 = -FORW*DB_DFRAC(L,N,M) COMPT2A.98 Q2 = -FORW*DB_DFRAC(L,M,N) COMPT2A.99 R1 = B(L,N) COMPT2A.100 R2 = B(L,M) COMPT2A.101 DO K=1,NPFT COMPT2A.102 R1 = R1+FORW*(DB_DFRAC(L,N,K)*DFRAC(L,K)) COMPT2A.103 R2 = R2+FORW*(DB_DFRAC(L,M,K)*DFRAC(L,K)) COMPT2A.104 ENDDO COMPT2A.105 COMPT2A.106 NUMER = R1-(Q1/P2)*R2 COMPT2A.107 DENOM = P1-(Q1/P2)*Q2 COMPT2A.108 DENOM_MIN = GAMMA_EQ/FRAC(L,N) COMPT2A.109 DENOM = MAX(DENOM,DENOM_MIN) COMPT2A.110 DFRAC(L,N) = NUMER/DENOM COMPT2A.111 FRAC(L,N) = FRAC(L,N)+DFRAC(L,N) COMPT2A.112 COMPT2A.113 IF (FRAC(L,N).LT.FRAC_MIN) THEN COMPT2A.114 DFRAC(L,N) = DFRAC(L,N)+(FRAC_MIN-FRAC(L,N)) COMPT2A.115 FRAC(L,N) = FRAC_MIN COMPT2A.116 ELSEIF (FRAC(L,N).GT.SPACE(L)) THEN COMPT2A.117 DFRAC(L,N) = DFRAC(L,N)+(SPACE(L)-FRAC(L,N)) COMPT2A.118 FRAC(L,N) = SPACE(L) COMPT2A.119 ENDIF COMPT2A.120 COMPT2A.121 SPACE(L) = SPACE(L)-FRAC(L,N)+FRAC_MIN COMPT2A.122 COMPT2A.123 NUMER = R2-Q2*DFRAC(L,N) COMPT2A.124 DENOM = P2 COMPT2A.125 DENOM_MIN = GAMMA_EQ/FRAC(L,M) COMPT2A.126 DENOM = MAX(DENOM,DENOM_MIN) COMPT2A.127 DFRAC(L,M) = NUMER/DENOM COMPT2A.128 FRAC(L,M) = FRAC(L,M)+DFRAC(L,M) COMPT2A.129 COMPT2A.130 IF (FRAC(L,M).LT.FRAC_MIN) THEN COMPT2A.131 DFRAC(L,M) = DFRAC(L,M)+(FRAC_MIN-FRAC(L,M)) COMPT2A.132 FRAC(L,M) = FRAC_MIN COMPT2A.133 ELSEIF (FRAC(L,M).GT.SPACE(L)) THEN COMPT2A.134 DFRAC(L,M) = DFRAC(L,M)+(SPACE(L)-FRAC(L,M)) COMPT2A.135 FRAC(L,M) = SPACE(L) COMPT2A.136 ENDIF COMPT2A.137 COMPT2A.138 SPACE(L) = SPACE(L)-FRAC(L,M)+FRAC_MIN COMPT2A.139 COMPT2A.140 ENDDO COMPT2A.141 COMPT2A.142 C---------------------------------------------------------------------- COMPT2A.143 C Calculate the increment to the shrub fraction COMPT2A.144 C---------------------------------------------------------------------- COMPT2A.145 DO T=1,TRIF_PTS ABX1F405.1541 L=TRIF_INDEX(T) ABX1F405.1542 N = DOM(L,3) COMPT2A.147 DENOM = GAMMA/FRAC(L,N)-FORW*DB_DFRAC(L,N,N) COMPT2A.148 DENOM_MIN = GAMMA_EQ/FRAC(L,N) COMPT2A.149 DENOM = MAX(DENOM,DENOM_MIN) COMPT2A.150 COMPT2A.151 NUMER = B(L,N) COMPT2A.152 DO K=1,NPFT COMPT2A.153 NUMER = NUMER+FORW*(DB_DFRAC(L,N,K)*DFRAC(L,K)) COMPT2A.154 ENDDO COMPT2A.155 COMPT2A.156 DFRAC(L,N) = NUMER/DENOM COMPT2A.157 FRAC(L,N) = FRAC(L,N)+DFRAC(L,N) COMPT2A.158 COMPT2A.159 IF (FRAC(L,N).LT.FRAC_MIN) THEN COMPT2A.160 DFRAC(L,N) = DFRAC(L,N)+(FRAC_MIN-FRAC(L,N)) COMPT2A.161 FRAC(L,N) = FRAC_MIN COMPT2A.162 ELSEIF (FRAC(L,N).GT.SPACE(L)) THEN COMPT2A.163 DFRAC(L,N) = DFRAC(L,N)+(SPACE(L)-FRAC(L,N)) COMPT2A.164 FRAC(L,N) = SPACE(L) COMPT2A.165 ENDIF COMPT2A.166 COMPT2A.167 SPACE(L) = SPACE(L)-FRAC(L,N)+FRAC_MIN COMPT2A.168 ENDDO COMPT2A.169 COMPT2A.170 COMPT2A.171 C---------------------------------------------------------------------- COMPT2A.172 C Calculate the increments to the grass fractions COMPT2A.173 C---------------------------------------------------------------------- COMPT2A.174 DO T=1,TRIF_PTS ABX1F405.1543 L=TRIF_INDEX(T) ABX1F405.1544 N = DOM(L,4) COMPT2A.176 M = DOM(L,5) COMPT2A.177 P1 = GAMMA/FRAC(L,N)-FORW*DB_DFRAC(L,N,N) COMPT2A.178 P2 = GAMMA/FRAC(L,M)-FORW*DB_DFRAC(L,M,M) COMPT2A.179 Q1 = -FORW*DB_DFRAC(L,N,M) COMPT2A.180 Q2 = -FORW*DB_DFRAC(L,M,N) COMPT2A.181 R1 = B(L,N) COMPT2A.182 R2 = B(L,M) COMPT2A.183 DO K=1,NPFT COMPT2A.184 R1 = R1+FORW*(DB_DFRAC(L,N,K)*DFRAC(L,K)) COMPT2A.185 R2 = R2+FORW*(DB_DFRAC(L,M,K)*DFRAC(L,K)) COMPT2A.186 ENDDO COMPT2A.187 COMPT2A.188 NUMER = R1-(Q1/P2)*R2 COMPT2A.189 DENOM = P1-(Q1/P2)*Q2 COMPT2A.190 DENOM_MIN = GAMMA_EQ/FRAC(L,N) COMPT2A.191 DENOM = MAX(DENOM,DENOM_MIN) COMPT2A.192 DFRAC(L,N) = NUMER/DENOM COMPT2A.193 FRAC(L,N) = FRAC(L,N)+DFRAC(L,N) COMPT2A.194 COMPT2A.195 IF (FRAC(L,N).LT.FRAC_MIN) THEN COMPT2A.196 DFRAC(L,N) = DFRAC(L,N)+(FRAC_MIN-FRAC(L,N)) COMPT2A.197 FRAC(L,N) = FRAC_MIN COMPT2A.198 ELSEIF (FRAC(L,N).GT.SPACE(L)) THEN COMPT2A.199 DFRAC(L,N) = DFRAC(L,N)+(SPACE(L)-FRAC(L,N)) COMPT2A.200 FRAC(L,N) = SPACE(L) COMPT2A.201 ENDIF COMPT2A.202 COMPT2A.203 SPACE(L) = SPACE(L)-FRAC(L,N)+FRAC_MIN COMPT2A.204 COMPT2A.205 NUMER = R2-Q2*DFRAC(L,N) COMPT2A.206 DENOM = P2 COMPT2A.207 DENOM_MIN = GAMMA_EQ/FRAC(L,M) COMPT2A.208 DENOM = MAX(DENOM,DENOM_MIN) COMPT2A.209 DFRAC(L,M) = NUMER/DENOM COMPT2A.210 FRAC(L,M) = FRAC(L,M)+DFRAC(L,M) COMPT2A.211 COMPT2A.212 IF (FRAC(L,M).LT.FRAC_MIN) THEN COMPT2A.213 DFRAC(L,M) = DFRAC(L,M)+(FRAC_MIN-FRAC(L,M)) COMPT2A.214 FRAC(L,M) = FRAC_MIN COMPT2A.215 ELSEIF (FRAC(L,M).GT.SPACE(L)) THEN COMPT2A.216 DFRAC(L,M) = DFRAC(L,M)+(SPACE(L)-FRAC(L,M)) COMPT2A.217 FRAC(L,M) = SPACE(L) COMPT2A.218 ENDIF COMPT2A.219 COMPT2A.220 SPACE(L) = SPACE(L)-FRAC(L,M)+FRAC_MIN COMPT2A.221 COMPT2A.222 ENDDO COMPT2A.223 COMPT2A.224 C---------------------------------------------------------------------- ABX1F405.1545 C Diagnose the new bare soil fraction ABX1F405.1546 C---------------------------------------------------------------------- ABX1F405.1547 DO T=1,TRIF_PTS ABX1F405.1548 L=TRIF_INDEX(T) ABX1F405.1549 FRAC(L,SOIL) = 1.0-NOSOIL(L) ABX1F405.1550 DO N=1,NPFT ABX1F405.1551 FRAC(L,SOIL) = FRAC(L,SOIL)-FRAC(L,N) ABX1F405.1552 ENDDO ABX1F405.1553 ENDDO ABX1F405.1554 ABX1F405.1555 RETURN COMPT2A.225 END COMPT2A.226 *ENDIF COMPT2A.227