source: branches/publications/ORCHIDEE_GLUC_r6545/src_stomate/lpj_cover.f90 @ 6737

Last change on this file since 6737 was 4719, checked in by albert.jornet, 7 years ago

Merge: from revisions [4491:4695/trunk/ORCHIDEE]

Merge done in [4671:4718/perso/albert.jornet/MICT_MERGE]

  • Property svn:keywords set to HeadURL Date Author Revision
File size: 23.4 KB
Line 
1! =================================================================================================================================
2! MODULE       : lpj_cover
3!
4! CONTACT      : orchidee-help _at_ listes.ipsl.fr
5!
6! LICENCE      : IPSL (2006)
7!                This software is governed by the CeCILL licence see ORCHIDEE/ORCHIDEE_CeCILL.LIC
8!
9!>\BRIEF        Recalculate vegetation cover and LAI
10!!
11!!\n DESCRIPTION : None
12!!
13!! RECENT CHANGE(S) : Including permafrost carbon
14!!
15!! REFERENCE(S) :
16!!        Sitch, S., B. Smith, et al. (2003), Evaluation of ecosystem dynamics,
17!!        plant geography and terrestrial carbon cycling in the LPJ dynamic
18!!        global vegetation model, Global Change Biology, 9, 161-185.\n
19!!        Smith, B., I. C. Prentice, et al. (2001), Representation of vegetation
20!!        dynamics in the modelling of terrestrial ecosystems: comparing two
21!!        contrasting approaches within European climate space,
22!!        Global Ecology and Biogeography, 10, 621-637.\n
23!!
24!! SVN :
25!! $HeadURL$
26!! $Date$
27!! $Revision$
28!! \n
29!_ ================================================================================================================================
30
31MODULE lpj_cover
32
33  ! modules used:
34
35  USE ioipsl_para
36  USE stomate_data
37  USE pft_parameters
38  USE constantes_soil_var
39
40  IMPLICIT NONE
41
42  ! private & public routines
43
44  PRIVATE
45  PUBLIC cover
46
47CONTAINS
48
49!! ================================================================================================================================
50!! SUBROUTINE     : lpj_cover
51!!
52!>\BRIEF          Recalculate vegetation cover and LAI
53!!
54!!\n DESCRIPTION : Veget_cov_max is first renewed here according to newly calculated foliage biomass in this calculation step
55!! Then, litter, soil carbon, and biomass are also recalcuted with taking into account the changes in Veget_cov_max (i.e. delta_veg)
56!! Grid-scale fpc (foliage projected coverage) is calculated to obtain the shadede ground area by leaf's light capture
57!! Finally, grid-scale fpc is adjusted not to exceed 1.0
58!!
59!! RECENT CHANGE(S) : None
60!!
61!! MAIN OUTPUT VARIABLE(S) : ::lai (leaf area index, @tex $(m^2 m^{-2})$ @endtex),
62!! :: veget (fractional vegetation cover, unitless)
63!!
64!! REFERENCE(S)   : None
65!!
66!! FLOWCHART :
67!! \latexonly
68!!     \includegraphics[scale=0.5]{lpj_cover_flowchart.png}
69!! \endlatexonly
70!! \n
71!_ ================================================================================================================================
72
73  SUBROUTINE cover (npts, cn_ind, ind, biomass, &
74       veget_cov_max, veget_cov_max_old, lai, & 
75       litter, litter_avail, litter_not_avail, carbon, &
76       fuel_1hr, fuel_10hr, fuel_100hr, fuel_1000hr, &
77       turnover_daily, bm_to_litter, &
78       co2_to_bm, co2_fire, resp_hetero, resp_maint, resp_growth, gpp_daily, &
79       deepC_a, deepC_s, deepC_p)
80
81!! 0. Variable and parameter declaration
82
83    !! 0.1 Input variables
84
85    INTEGER(i_std), INTENT(in)                                  :: npts             !! Domain size (unitless) 
86    REAL(r_std), DIMENSION(npts,nvm), INTENT(in)                :: cn_ind           !! Crown area
87                                                                                    !! @tex $(m^2)$ @endtex per individual
88    REAL(r_std), DIMENSION(npts,nvm), INTENT(in)                :: ind              !! Number of individuals
89                                                                                    !! @tex $(m^{-2})$ @endtex
90    REAL(r_std), DIMENSION(npts,nvm), INTENT(in)                :: veget_cov_max_old!! "Maximal" coverage fraction of a PFT (LAI->
91                                                                                    !! infinity) on ground at beginning of time
92
93    !! 0.2 Output variables
94
95    !! 0.3 Modified variables
96
97    REAL(r_std), DIMENSION(npts,nvm), INTENT(inout)             :: lai                 !! Leaf area index OF AN INDIVIDUAL PLANT
98                                                                                       !! @tex $(m^2 m^{-2})$ @endtex
99    REAL(r_std), DIMENSION(npts,nlitt,nvm,nlevs,nelements), INTENT(inout) :: litter    !! Metabolic and structural litter, above and
100    REAL(r_std), DIMENSION(npts,nvm,nlitt,nelements), INTENT(inout)                 :: fuel_1hr
101    REAL(r_std), DIMENSION(npts,nvm,nlitt,nelements), INTENT(inout)                 :: fuel_10hr
102    REAL(r_std), DIMENSION(npts,nvm,nlitt,nelements), INTENT(inout)                 :: fuel_100hr
103    REAL(r_std), DIMENSION(npts,nvm,nlitt,nelements), INTENT(inout)                 :: fuel_1000hr
104                                                                                       !! below ground @tex $(gC m^{-2})$ @endtex
105    REAL(r_std), DIMENSION(npts,nlitt,nvm), INTENT(inout):: litter_avail
106    REAL(r_std), DIMENSION(npts,nlitt,nvm) , INTENT(inout):: litter_not_avail
107    REAL(r_std), DIMENSION(npts,ncarb,nvm), INTENT(inout)             :: carbon        !! Carbon pool: active, slow, or passive
108    REAL(r_std), DIMENSION(npts,nvm,nparts,nelements), INTENT(inout) :: biomass        !! Biomass @tex $(gC m^{-2})$ @endtex
109    REAL(r_std), DIMENSION(npts,nvm), INTENT(inout)                  :: veget_cov_max  !! "Maximal" coverage fraction of a PFT (LAI->
110                                                                                       !! infinity) on ground (unitless)
111    REAL(r_std), DIMENSION(npts,nvm,nparts,nelements), INTENT(inout) :: turnover_daily !! Turnover rates (gC m^{-2} day^{-1})
112    REAL(r_std), DIMENSION(npts,nvm,nparts,nelements), INTENT(inout) :: bm_to_litter   !! Conversion of biomass to litter
113                                                                                       !! @tex $(gC m^{-2} day^{-1})$ @endtex
114    REAL(r_std), DIMENSION(npts,nvm), INTENT(inout)           :: co2_to_bm             !! biomass up take for establishment           
115    REAL(r_std), DIMENSION(npts,nvm), INTENT(inout)           :: co2_fire
116    REAL(r_std), DIMENSION(npts,nvm), INTENT(inout)           :: resp_hetero
117    REAL(r_std), DIMENSION(npts,nvm), INTENT(inout)           :: resp_maint
118    REAL(r_std), DIMENSION(npts,nvm), INTENT(inout)           :: resp_growth
119    REAL(r_std), DIMENSION(npts,nvm), INTENT(inout)           :: gpp_daily
120
121    REAL(r_std), DIMENSION(npts,ndeep,nvm), INTENT(inout)         :: deepC_a           !! Permafrost soil carbon (g/m**3) active
122    REAL(r_std), DIMENSION(npts,ndeep,nvm), INTENT(inout)         :: deepC_s           !! Permafrost soil carbon (g/m**3) slow
123    REAL(r_std), DIMENSION(npts,ndeep,nvm), INTENT(inout)         :: deepC_p           !! Permafrost soil carbon (g/m**3) passive
124
125    !! 0.4 Local variables
126
127    INTEGER(i_std)                                              :: i,j,k,m               !! Index (unitless)
128    REAL(r_std), DIMENSION(npts,nlitt,nlevs,nelements)          :: dilu_lit              !! Litter dilution @tex $(gC m^{-2})$ @endtex
129    REAL(r_std), DIMENSION(npts,ncarb)                          :: dilu_soil_carbon      !! Soil Carbondilution
130                                                                                         !! @tex $(gC m^{-2})$ @endtex
131    REAL(r_std), DIMENSION(npts,nparts,nelements)               :: dilu_bio              !! Biomass dilution
132    REAL(r_std), DIMENSION(npts)                                :: dilu_TCarbon
133    REAL(r_std), DIMENSION(npts,nparts,nelements)               :: dilu_turnover_daily
134    REAL(r_std), DIMENSION(npts,nparts,nelements)               :: dilu_bm_to_litter
135    REAL(r_std), DIMENSION(npts)                                :: dilu_co2flux_new
136    REAL(r_std), DIMENSION(npts)                                :: dilu_gpp_daily
137    REAL(r_std), DIMENSION(npts)                                :: dilu_resp_growth
138    REAL(r_std), DIMENSION(npts)                                :: dilu_resp_maint
139    REAL(r_std), DIMENSION(npts)                                :: dilu_resp_hetero
140    REAL(r_std), DIMENSION(npts)                                :: dilu_co2_to_bm
141    REAL(r_std), DIMENSION(npts)                                :: dilu_co2_fire
142    REAL(r_std), DIMENSION(npts,nvm)                            :: TCarbon
143    REAL(r_std), DIMENSION(npts,nvm)                            :: co2flux_new
144    REAL(r_std), DIMENSION(npts,nvm)                            :: co2flux_old
145    REAL(r_std), DIMENSION(npts,ncarb,nvm)                       :: carbon_old
146    REAL(r_std),DIMENSION(npts,ndeep,ncarb)                     :: dilu_soil_carbon_vertres !!vertically-resolved Soil Carbondilution (gC/m²)
147
148    REAL(r_std), DIMENSION(nvm)                                 :: delta_veg        !! Conversion factors (unitless)
149    REAL(r_std), DIMENSION(nvm)                                 :: reduct           !! Conversion factors (unitless)
150    REAL(r_std)                                                 :: delta_veg_sum    !! Conversion factors (unitless)
151    REAL(r_std)                                                 :: diff             !! Conversion factors (unitless)
152    REAL(r_std)                                                 :: sr               !! Conversion factors (unitless)
153    REAL(r_std), DIMENSION(npts)                                :: frac_nat         !! Conversion factors (unitless)
154    REAL(r_std), DIMENSION(npts)                                :: sum_vegettree    !! Conversion factors (unitless)
155    REAL(r_std), DIMENSION(npts)                                :: sum_vegetgrass   !! Conversion factors (unitless)
156    REAL(r_std), DIMENSION(npts)                                :: sum_veget_natveg !! Conversion factors (unitless)
157    REAL(r_std), DIMENSION(npts)                                :: vartmp           !! Temporary variable used to add history
158    REAL(r_std), DIMENSION(npts,nlitt,nelements)                :: dilu_f1hr        !! Litter dilution @tex $(gC m^{-2})$ @endtex
159    REAL(r_std), DIMENSION(npts,nlitt,nelements)                :: dilu_f10hr       !! Litter dilution @tex $(gC m^{-2})$ @endtex
160    REAL(r_std), DIMENSION(npts,nlitt,nelements)                :: dilu_f100hr      !! Litter dilution @tex $(gC m^{-2})$ @endtex
161    REAL(r_std), DIMENSION(npts,nlitt,nelements)                :: dilu_f1000hr     !! Litter dilution @tex $(gC m^{-2})$ @endtex
162!_ ================================================================================================================================
163
164 !! 1. If the vegetation is dynamic, calculate new maximum vegetation cover for natural plants
165 
166    IF ( ok_dgvm ) THEN
167
168       !! 1.1  Calculate initial values of vegetation cover
169       frac_nat(:) = un
170       sum_veget_natveg(:) = zero
171       veget_cov_max(:,ibare_sechiba) = un
172       co2flux_new = undef
173       co2flux_old = undef
174       TCarbon = undef
175
176       carbon_old(:,:,:)=carbon(:,:,:)
177
178       DO j = 2,nvm ! loop over PFTs
179
180          IF ( natural(j) .AND. .NOT. pasture(j)) THEN
181             
182             ! Summation of individual tree crown area to get total foliar projected coverage
183             veget_cov_max(:,j) = ind(:,j) * cn_ind(:,j)
184             sum_veget_natveg(:) = sum_veget_natveg(:) + veget_cov_max(:,j)
185
186          ELSE
187             
188             !fraction occupied by agriculture needs to be substracted for the DGVM
189             !this is used below to constrain veget for natural vegetation, see below
190             frac_nat(:) = frac_nat(:) - veget_cov_max(:,j)
191
192          ENDIF
193
194       ENDDO ! loop over PFTs
195
196       DO i = 1, npts ! loop over grid points
197     
198          ! Recalculation of vegetation projected coverage when ::frac_nat was below ::sum_veget_natveg
199          ! It means that non-natural vegetation will recover ::veget_cov_max as natural vegetation
200          IF (sum_veget_natveg(i) .GT. frac_nat(i) .AND. frac_nat(i) .GT. min_stomate) THEN
201
202             DO j = 2,nvm ! loop over PFTs
203                IF( natural(j) .AND. .NOT. pasture(j)) THEN
204                   veget_cov_max(i,j) =  veget_cov_max(i,j) * frac_nat(i) / sum_veget_natveg(i)
205                ENDIF
206             ENDDO ! loop over PFTs
207
208          ENDIF
209       ENDDO ! loop over grid points
210   
211       ! Renew veget_cov_max of bare soil as 0 to difference of veget_cov_max (ibare_sechiba)
212       ! to current veget_cov_max
213       DO j = 2,nvm ! loop over PFTs
214          veget_cov_max(:,ibare_sechiba) = veget_cov_max(:,ibare_sechiba) - veget_cov_max(:,j)
215       ENDDO ! loop over PFTs
216       veget_cov_max(:,ibare_sechiba) = MAX( veget_cov_max(:,ibare_sechiba), zero )
217
218       !! 1.2 Calculate carbon fluxes between PFTs to maintain mass balance
219       !! Assure carbon closure when veget_cov_max changes(delta_veg): if veget_cov_max of some PFTs decrease, we use "dilu" to
220       !! record the corresponding lost in carbon (biomass, litter, soil carbon, gpp, respiration etc.) for
221       !! these PFTs, and re-allocate "dilu" to those PFTs with increasing veget_cov_max.
222       DO i = 1, npts ! loop over grid points
223         
224          ! Calculate the change in veget_cov_max between previous time step and current time step
225          delta_veg(:) = veget_cov_max(i,:)-veget_cov_max_old(i,:)
226          delta_veg_sum = SUM(delta_veg,MASK=delta_veg.LT.zero)
227
228          dilu_lit(i,:,:,:) = zero
229          dilu_f1hr(i,:,:) = zero
230          dilu_f10hr(i,:,:) = zero
231          dilu_f100hr(i,:,:) = zero
232          dilu_f1000hr(i,:,:) = zero
233          dilu_soil_carbon(i,:) = zero
234          dilu_soil_carbon_vertres(i,:,:) = zero
235
236          dilu_bio(i,:,:) = zero
237          dilu_TCarbon(i)=zero
238
239          dilu_turnover_daily(i,:,:)=zero
240          dilu_bm_to_litter(i,:,:)=zero
241          dilu_co2flux_new(i)=zero
242          dilu_gpp_daily(i)=zero
243          dilu_resp_growth(i)=zero
244          dilu_resp_maint(i)=zero
245          dilu_resp_hetero(i)=zero
246          dilu_co2_to_bm(i)=zero
247          dilu_co2_fire(i)=zero
248
249          ! Calculate TCarbon: total carbon including biomass, litter and soil carbon, as well as "today's" turnover and
250          ! bm_to_litter due to mortality, because today's turnover and bm_to_litter are not yet added into "litter" until tomorrow.
251          DO j=1, nvm
252                TCarbon(i,j)=SUM(biomass(i,j,:,icarbon))+SUM(carbon(i,:,j))+SUM(litter(i,:,j,:,icarbon))+SUM(turnover_daily(i,j,:,icarbon))+SUM(bm_to_litter(i,j,:,icarbon))
253                co2flux_old(i,j)=resp_maint(i,j)+resp_growth(i,j)+resp_hetero(i,j)+co2_fire(i,j)-co2_to_bm(i,j)-gpp_daily(i,j)
254                co2flux_new(i,j)=resp_maint(i,j)+resp_growth(i,j)+resp_hetero(i,j)+co2_fire(i,j)-co2_to_bm(i,j)-gpp_daily(i,j)
255          ENDDO
256
257          DO j=1, nvm ! loop over PFTs
258             IF ( delta_veg(j) < -min_stomate ) THEN
259                dilu_lit(i,:,:,:) =  dilu_lit(i,:,:,:) + delta_veg(j) * litter(i,:,j,:,:) / delta_veg_sum
260                dilu_f1hr(i,:,:) =  dilu_f1hr(i,:,:) + delta_veg(j) * fuel_1hr(i,j,:,:) / delta_veg_sum
261                dilu_f10hr(i,:,:) =  dilu_f10hr(i,:,:) + delta_veg(j) * fuel_10hr(i,j,:,:) / delta_veg_sum
262                dilu_f100hr(i,:,:) =  dilu_f100hr(i,:,:) + delta_veg(j) * fuel_100hr(i,j,:,:) / delta_veg_sum
263                dilu_f1000hr(i,:,:) =  dilu_f1000hr(i,:,:) + delta_veg(j) * fuel_1000hr(i,j,:,:) / delta_veg_sum
264                dilu_soil_carbon(i,:) =  dilu_soil_carbon(i,:) + delta_veg(j) * carbon(i,:,j) / delta_veg_sum
265                dilu_TCarbon(i)= dilu_TCarbon(i) + delta_veg(j) * TCarbon(i,j) / delta_veg_sum
266                dilu_turnover_daily(i,:,:)=dilu_turnover_daily(i,:,:)+delta_veg(j)*turnover_daily(i,j,:,:)/delta_veg_sum
267                dilu_bm_to_litter(i,:,:)=dilu_bm_to_litter(i,:,:)+delta_veg(j)*bm_to_litter(i,j,:,:)/delta_veg_sum
268                dilu_co2flux_new(i)=dilu_co2flux_new(i)+delta_veg(j)*co2flux_old(i,j)/delta_veg_sum
269                dilu_gpp_daily(i)=dilu_gpp_daily(i)+delta_veg(j)*gpp_daily(i,j)/delta_veg_sum
270                dilu_resp_growth(i)=dilu_resp_growth(i)+delta_veg(j)*resp_growth(i,j)/delta_veg_sum
271                dilu_resp_maint(i)=dilu_resp_maint(i)+delta_veg(j)*resp_maint(i,j)/delta_veg_sum
272                dilu_resp_hetero(i)=dilu_resp_hetero(i)+delta_veg(j)*resp_hetero(i,j)/delta_veg_sum
273                dilu_co2_to_bm(i)=dilu_co2_to_bm(i)+delta_veg(j)*co2_to_bm(i,j)/delta_veg_sum
274                dilu_co2_fire(i)=dilu_co2_fire(i)+delta_veg(j)*co2_fire(i,j)/delta_veg_sum
275             ENDIF
276          ENDDO ! loop over PFTs
277
278          DO j=1, nvm ! loop over PFTs
279             IF ( delta_veg(j) > min_stomate) THEN
280
281                ! Dilution of reservoirs
282                ! Recalculate the litter and soil carbon with taking into accout the change in
283                ! veget_cov_max (delta_veg)
284                ! Litter
285                litter(i,:,j,:,:)=(litter(i,:,j,:,:) * veget_cov_max_old(i,j) + dilu_lit(i,:,:,:) * delta_veg(j)) &
286                                  / veget_cov_max(i,j)
287                fuel_1hr(i,j,:,:)=(fuel_1hr(i,j,:,:) * veget_cov_max_old(i,j) + dilu_f1hr(i,:,:) * delta_veg(j)) / veget_cov_max(i,j)
288                fuel_10hr(i,j,:,:)=(fuel_10hr(i,j,:,:) * veget_cov_max_old(i,j) + dilu_f10hr(i,:,:) * delta_veg(j)) / veget_cov_max(i,j)
289                fuel_100hr(i,j,:,:)=(fuel_100hr(i,j,:,:) * veget_cov_max_old(i,j) + dilu_f100hr(i,:,:) * delta_veg(j)) / veget_cov_max(i,j)
290                fuel_1000hr(i,j,:,:)=(fuel_1000hr(i,j,:,:) * veget_cov_max_old(i,j) + dilu_f1000hr(i,:,:) * delta_veg(j)) / veget_cov_max(i,j)
291                !JCADD available and not available litter for grazing
292                ! only not available litter change, available litter will not
293                ! change, because tree litter can not be eaten
294               IF (is_grassland_manag(j) .AND. is_grassland_grazed(j)) THEN
295                 litter_avail(i,:,j) = litter_avail(i,:,j) * veget_cov_max_old(i,j) / veget_cov_max(i,j)
296                 litter_not_avail(i,:,j) = litter(i,:,j,iabove,icarbon) - litter_avail(i,:,j)
297               ENDIF
298                !ENDJCADD   
299                !IF ( ok_pc ) THEN
300                !   deepC_a(i,:,j)=(deepC_a(i,:,j) * veget_cov_max_old(i,j) + &
301                !        dilu_soil_carbon_vertres(i,:,iactive) * delta_veg(j)) / veget_cov_max(i,j)
302                !   deepC_s(i,:,j)=(deepC_s(i,:,j) * veget_cov_max_old(i,j) + &
303                !        dilu_soil_carbon_vertres(i,:,islow) * delta_veg(j)) / veget_cov_max(i,j)
304                !   deepC_p(i,:,j)=(deepC_p(i,:,j) * veget_cov_max_old(i,j) + &
305                !        dilu_soil_carbon_vertres(i,:,ipassive) * delta_veg(j)) / veget_cov_max(i,j)
306                !ENDIF
307                ! Soil carbon
308                carbon(i,:,j)=(carbon(i,:,j) * veget_cov_max_old(i,j) + dilu_soil_carbon(i,:) * delta_veg(j)) / veget_cov_max(i,j)
309                IF ( ok_pc ) THEN
310                   IF (carbon_old(i,iactive,j) .GT. min_stomate) THEN
311                      deepC_a(i,:,j)=deepC_a(i,:,j)*carbon(i,iactive,j)/carbon_old(i,iactive,j)
312                   ENDIF
313                   IF (carbon_old(i,islow,j) .GT. min_stomate) THEN
314                      deepC_s(i,:,j)=deepC_s(i,:,j)*carbon(i,islow,j)/carbon_old(i,islow,j)
315                   ENDIF
316                   IF (carbon_old(i,ipassive,j) .GT. min_stomate) THEN
317                      deepC_p(i,:,j)=deepC_p(i,:,j)*carbon(i,ipassive,j)/carbon_old(i,ipassive,j)
318                   ENDIF
319                ENDIF
320
321                !biomass(i,j,:,:)=(biomass(i,j,:,:) * veget_cov_max_old(i,j) + dilu_bio(i,:,:) * delta_veg(j)) / veget_cov_max(i,j)
322                TCarbon(i,j)=(TCarbon(i,j) * veget_cov_max_old(i,j) + dilu_TCarbon(i) * delta_veg(j)) / veget_cov_max(i,j)
323
324                turnover_daily(i,j,:,:)=(turnover_daily(i,j,:,:)*veget_cov_max_old(i,j)+dilu_turnover_daily(i,:,:)*delta_veg(j))/veget_cov_max(i,j)
325                bm_to_litter(i,j,:,:)=(bm_to_litter(i,j,:,:)*veget_cov_max_old(i,j)+dilu_bm_to_litter(i,:,:)*delta_veg(j))/veget_cov_max(i,j)
326                co2flux_new(i,j)=(co2flux_old(i,j)*veget_cov_max_old(i,j)+dilu_co2flux_new(i)*delta_veg(j))/veget_cov_max(i,j)
327                gpp_daily(i,j)=(gpp_daily(i,j)*veget_cov_max_old(i,j)+dilu_gpp_daily(i)*delta_veg(j))/veget_cov_max(i,j)
328                resp_growth(i,j)=(resp_growth(i,j)*veget_cov_max_old(i,j)+dilu_resp_growth(i)*delta_veg(j))/veget_cov_max(i,j)
329                resp_maint(i,j)=(resp_maint(i,j)*veget_cov_max_old(i,j)+dilu_resp_maint(i)*delta_veg(j))/veget_cov_max(i,j)
330                resp_hetero(i,j)=(resp_hetero(i,j)*veget_cov_max_old(i,j)+dilu_resp_hetero(i)*delta_veg(j))/veget_cov_max(i,j)
331                co2_to_bm(i,j)=(co2_to_bm(i,j)*veget_cov_max_old(i,j)+dilu_co2_to_bm(i)*delta_veg(j))/veget_cov_max(i,j)
332                co2_fire(i,j)=(co2_fire(i,j)*veget_cov_max_old(i,j)+dilu_co2_fire(i)*delta_veg(j))/veget_cov_max(i,j)
333
334             ENDIF
335
336             IF(veget_cov_max(i,j).GT.min_stomate) THEN
337
338                ! Correct biomass densities to conserve mass
339                ! since it's defined on veget_cov_max
340                biomass(i,j,:,:) = biomass(i,j,:,:) * veget_cov_max_old(i,j) / veget_cov_max(i,j)
341
342             ENDIF
343
344          ENDDO ! loop over PFTs
345      ENDDO ! loop over grid points
346
347      vartmp(:)=SUM(co2flux_new*veget_cov_max,dim=2)
348      CALL histwrite_p (hist_id_stomate, "tCO2FLUX", itime, vartmp, npts, hori_index)
349      vartmp(:)=SUM(co2flux_old*veget_cov_max_old,dim=2)
350      CALL histwrite_p (hist_id_stomate, "tCO2FLUX_OLD", itime, vartmp, npts, hori_index)
351      vartmp(:)=SUM(TCarbon*veget_cov_max,dim=2)
352      CALL histwrite_p (hist_id_stomate, "tCARBON", itime, vartmp, npts, hori_index)
353      vartmp(:)=SUM(gpp_daily*veget_cov_max,dim=2)
354      CALL histwrite_p (hist_id_stomate, "tGPP", itime, vartmp, npts, hori_index)
355      vartmp(:)=SUM(resp_growth*veget_cov_max,dim=2)
356      CALL histwrite_p (hist_id_stomate, "tRESP_GROWTH", itime, vartmp, npts, hori_index)
357      vartmp(:)=SUM(resp_maint*veget_cov_max,dim=2)
358      CALL histwrite_p (hist_id_stomate, "tRESP_MAINT", itime, vartmp, npts, hori_index)
359      vartmp(:)=SUM(resp_hetero*veget_cov_max,dim=2)
360      CALL histwrite_p (hist_id_stomate, "tRESP_HETERO", itime, vartmp, npts, hori_index)
361      vartmp(:)=SUM(co2_to_bm*veget_cov_max,dim=2)
362      CALL histwrite_p (hist_id_stomate, "tCO2_TAKEN", itime, vartmp, npts, hori_index)
363      vartmp(:)=SUM(co2_fire*veget_cov_max,dim=2)
364      CALL histwrite_p (hist_id_stomate, "tCO2_FIRE", itime, vartmp, npts, hori_index)
365      vartmp(:)=SUM(SUM(biomass(:,:,:,icarbon),dim=3)*veget_cov_max,dim=2)
366      CALL histwrite_p (hist_id_stomate, "tBIOMASS", itime, vartmp, npts, hori_index)
367      vartmp(:)=SUM(SUM(SUM(litter(:,:,:,:,icarbon),dim=4),dim=2)*veget_cov_max,dim=2)
368      CALL histwrite_p (hist_id_stomate, "tLITTER", itime, vartmp, npts, hori_index)
369      vartmp(:)=SUM(SUM(fuel_1hr(:,:,:,icarbon),dim=3)*veget_cov_max,dim=2)
370      CALL histwrite_p (hist_id_stomate, "tFUEL1HR", itime, vartmp, npts, hori_index)
371      vartmp(:)=SUM(SUM(fuel_10hr(:,:,:,icarbon),dim=3)*veget_cov_max,dim=2)
372      CALL histwrite_p (hist_id_stomate, "tFUEL10HR", itime, vartmp, npts, hori_index)
373      vartmp(:)=SUM(SUM(fuel_100hr(:,:,:,icarbon),dim=3)*veget_cov_max,dim=2)
374      CALL histwrite_p (hist_id_stomate, "tFUEL100HR", itime, vartmp, npts, hori_index)
375      vartmp(:)=SUM(SUM(fuel_1000hr(:,:,:,icarbon),dim=3)*veget_cov_max,dim=2)
376      CALL histwrite_p (hist_id_stomate, "tFUEL1000HR", itime, vartmp, npts, hori_index)
377      vartmp(:)=SUM(SUM(carbon,dim=2)*veget_cov_max,dim=2)
378      CALL histwrite_p (hist_id_stomate, "tSOILC", itime, vartmp, npts, hori_index)
379
380      IF ( ok_pc ) THEN
381        vartmp(:)=SUM(SUM(deepC_a,dim=2)*veget_cov_max,dim=2)
382        CALL histwrite_p (hist_id_stomate, "tDEEPCa", itime, vartmp, npts, hori_index)
383        vartmp(:)=SUM(SUM(deepC_s,dim=2)*veget_cov_max,dim=2)
384        CALL histwrite_p (hist_id_stomate, "tDEEPCs", itime, vartmp, npts, hori_index)
385        vartmp(:)=SUM(SUM(deepC_p,dim=2)*veget_cov_max,dim=2)
386        CALL histwrite_p (hist_id_stomate, "tDEEPCp", itime, vartmp, npts, hori_index)
387      ENDIF
388
389   ENDIF
390
391  END SUBROUTINE cover
392
393END MODULE lpj_cover
Note: See TracBrowser for help on using the repository browser.