Changeset 257 for branches/ORCHIDEE_EXT/ORCHIDEE/src_stomate/lpj_gap.f90
- Timestamp:
- 2011-06-17T14:02:17+02:00 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/ORCHIDEE_EXT/ORCHIDEE/src_stomate/lpj_gap.f90
r64 r257 39 39 SUBROUTINE gap (npts, dt, & 40 40 npp_longterm, turnover_longterm, lm_lastyearmax, & 41 PFTpresent, biomass, ind, bm_to_litter )41 PFTpresent, biomass, ind, bm_to_litter, mortality) 42 42 43 43 ! … … 68 68 ! biomass taken away (gC/(m**2 of ground)) 69 69 REAL(r_std), DIMENSION(npts,nvm,nparts), INTENT(inout) :: bm_to_litter 70 ! mortality (fraction of trees that is dying per time step), per day in history file 71 REAL(r_std), DIMENSION(npts,nvm),INTENT(out) :: mortality 70 72 71 73 ! 0.3 local 72 74 73 ! which kind of mortality74 LOGICAL, SAVE :: constant_mortality75 75 ! biomass increase 76 76 REAL(r_std), DIMENSION(npts) :: delta_biomass 77 ! biomass increase 78 REAL(r_std), DIMENSION(npts) :: dmortality 77 79 ! vigour 78 80 REAL(r_std), DIMENSION(npts) :: vigour 79 81 ! natural availability, based on vigour 80 82 REAL(r_std), DIMENSION(npts) :: availability 81 ! mortality (fraction of trees that is dying per time step), per day in history file82 REAL(r_std), DIMENSION(npts,nvm) :: mortality83 83 ! indices 84 INTEGER(i_std) :: j,k 84 INTEGER(i_std) :: j,k,m 85 REAL(r_std) :: ref_greff 85 86 86 87 ! ========================================================================= … … 90 91 firstcall = .FALSE. 91 92 92 !Config Key = LPJ_GAP_CONST_MORT93 !Config Desc = constant tree mortality94 !Config Def = y95 !Config Help = If yes, then a constant mortality is applied to trees.96 !Config Otherwise, mortality is a function of the trees'97 !Config vigour (as in LPJ).98 99 constant_mortality = .TRUE.100 CALL getin_p('LPJ_GAP_CONST_MORT', constant_mortality)101 WRITE(numout,*) 'gap: constant mortality:', constant_mortality102 103 93 ENDIF 104 94 105 IF (bavard.GE.3) WRITE(numout,*) 'Entering gap' 95 IF (bavard.GE.3) WRITE(numout,*) 'Entering gap',lpj_gap_const_mort 106 96 107 97 mortality(:,:) = zero 108 98 99 ref_greff = 0.035 100 109 101 DO j = 2,nvm 110 102 … … 117 109 ! 118 110 119 IF ( .NOT. constant_mortality) THEN111 IF ( .NOT. lpj_gap_const_mort ) THEN 120 112 121 113 ! … … 125 117 WHERE ( PFTpresent(:,j) .AND. ( lm_lastyearmax(:,j) .GT. min_stomate ) ) 126 118 119 !SZ 080806, changed to LPJ formulation according to Smith et al., 2001 120 127 121 ! how much did the tree grow per year? 128 122 129 delta_biomass(:) = & 130 MAX( npp_longterm(:,j) - ( turnover_longterm(:,j,ileaf) + & 131 turnover_longterm(:,j,iroot) + turnover_longterm(:,j,ifruit) ), & 132 zero ) 123 !!$ delta_biomass(:) = & 124 !!$ MAX( npp_longterm(:,j) - ( turnover_longterm(:,j,ileaf) + & 125 !!$ turnover_longterm(:,j,iroot) + turnover_longterm(:,j,ifruit) ), & 126 !!$ 0._r_std ) 127 128 ! note that npp_longterm is now actually longterm growth efficiency (NPP/LAI) 129 ! to be fair to deciduous trees 130 delta_biomass(:) = MAX( npp_longterm(:,j) - ( turnover_longterm(:,j,ileaf) + & 131 turnover_longterm(:,j,iroot) + turnover_longterm(:,j,ifruit) + & 132 turnover_longterm(:,j,isapabove) + turnover_longterm(:,j,isapbelow) ) ,zero) 133 133 134 134 ! scale this to the leaf surface of the tree 135 136 vigour(:) = delta_biomass(:) / (lm_lastyearmax(:,j)*sla(j)) / vigour_coeff135 !!$ vigour(:) = delta_biomass(:) / (lm_lastyearmax(:,j)*sla(j)) / vigour_coeff 136 vigour(:) = delta_biomass(:) / (lm_lastyearmax(:,j)*sla(j)) 137 137 138 138 ELSEWHERE … … 147 147 ! low vigour. 148 148 149 availability(:) = availability_fact / ( 1.+vigour(:)/vigour_ref) 149 !SZ 080806, changed to LPJ formulation according to Smith et al., 2001 150 ! tuned maximal mortality to 0.05 to get realistic range of avergage age to get ~100 years at GREFF=100 151 ! for the range of modelled annual NPP 152 !!$ availability(:) = min_avail / ( 1.+vigour(:)/vigour_ref ) 153 availability(:) = 0.1 / ( 1.+ref_greff*vigour(:) ) 150 154 151 155 ! Mortality (fraction per time step). … … 158 162 ! approximation ok as availability < 0.02 << 1 159 163 160 mortality(:,j) = availability(:) * dt/one_year 164 mortality(:,j) = MAX(min_avail,availability(:)) * dt/one_year 165 !!$ mortality(:,j) = availability(:) * dt/one_year 161 166 162 167 ENDWHERE … … 199 204 WHERE ( PFTpresent(:,j) ) 200 205 201 bm_to_litter(:,j,k) = bm_to_litter(:,j,k) + mortality(:,j) * biomass(:,j,k) 202 203 biomass(:,j,k) = biomass(:,j,k) * ( 1. - mortality(:,j) ) 206 dmortality(:) = mortality(:,j) * biomass(:,j,k) 207 bm_to_litter(:,j,k) = bm_to_litter(:,j,k) + dmortality(:) 208 209 biomass(:,j,k) = biomass(:,j,k) - dmortality(:) 204 210 205 211 ENDWHERE … … 211 217 ! 212 218 213 IF ( control%ok_dgvm ) THEN 214 215 WHERE ( PFTpresent(:,j) ) 216 217 ind(:,j) = ind(:,j) * ( 1. - mortality(:,j) ) 218 219 ENDWHERE 220 219 !SZ 080806, allow changing density in static case when mortality is dynamic 220 IF ( control%ok_dgvm .OR. .NOT.lpj_gap_const_mort) THEN 221 222 WHERE ( PFTpresent(:,j) ) 223 224 ind(:,j) = ind(:,j) * ( un - mortality(:,j) ) 225 226 ENDWHERE 227 228 ENDIF 229 230 ELSE 231 232 IF ( .NOT.control%ok_dgvm .AND. .NOT.lpj_gap_const_mort) THEN 233 234 WHERE ( PFTpresent(:,j) .AND. ( npp_longterm(:,j) .LE. 10. ) ) 235 236 mortality(:,j) = 1. 237 238 ENDWHERE 239 DO k = 1, nparts 240 241 WHERE ( PFTpresent(:,j) ) 242 243 dmortality(:) = mortality(:,j) * biomass(:,j,k) 244 245 bm_to_litter(:,j,k) = bm_to_litter(:,j,k) + dmortality(:) 246 247 biomass(:,j,k) = biomass(:,j,k) - dmortality(:) 248 249 ENDWHERE 250 ENDDO 251 221 252 ENDIF 222 253
Note: See TracChangeset
for help on using the changeset viewer.