SURFEX v8.1
General documentation of Surfex
cotwoinitn.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! #########
6  SUBROUTINE cotwoinit_n (IO, S, PK, PEK, PCO2 )
7 ! #######################################################################
8 !
9 !!**** *COTWOINIT*
10 !!
11 !! PURPOSE
12 !! -------
13 !
14 ! Initialize model to calculate net assimilation of
15 ! CO2 and leaf conductance.
16 !
17 !!** METHOD
18 !! ------
19 ! Calvet at al (1998) [from model of Jacobs(1994)]
20 !!
21 !! EXTERNAL
22 !! --------
23 !! none
24 !!
25 !! IMPLICIT ARGUMENTS
26 !! ------------------
27 !!
28 !! USE MODD_CO2V_PAR
29 !! USE MODI_COTWO
30 !!
31 !! REFERENCE
32 !! ---------
33 !!
34 !! Calvet et al. (1998)
35 !!
36 !! AUTHOR
37 !! ------
38 !!
39 !! A. Boone * Meteo-France *
40 !! (following Belair)
41 !!
42 !! MODIFICATIONS
43 !! -------------
44 !! Original 27/10/97
45 !! (V. Rivalland) 10/04/02 Add: PK%XAH and PK%XBH coefficients for
46 !! herbaceous water stress response
47 !! (P. LeMoigne) 03/2004: computation of zgmest in SI units
48 !! (P. LeMoigne) 10/2004: possibility of 2 different FZERO
49 !! (L. Jarlan) 10/2004: initialization of DMAX
50 !! P Le Moigne 09/2005 AGS modifs of L. Jarlan
51 !! S. Lafont 03/2009 change unit of AMAX
52 !! A.L. Gibelin 04/2009 TAU_WOOD for NCB option
53 !! A.L. Gibelin 04/2009 Suppress useless GPP and RDK arguments
54 !! A.L. Gibelin 07/2009 Suppress PPST and PPSTF as outputs
55 !! B. Decharme 05/2012 Optimization
56 !! R. Alkama 05/2012 add 7 new vegtype (19 instead 12)
57 !! C. Delire 01/2014 Define a dummy LAI from top and total lai for Dark respiration
58 !!
59 !-------------------------------------------------------------------------------
60 !
61 USE modd_data_cover_par, ONLY :
62 !
65 !
66 USE modd_data_cover_par, ONLY : nvegtype_ecosg, nvegtype, nvt_c3, nvt_c3w, nvt_c3s, nvt_c4, nvt_irr, &
67  nvt_trog, nvt_tebd, nvt_bone, nvt_trbe, nvt_trbd, &
68  nvt_tebe, nvt_tene, nvt_bobd, nvt_bond, nvt_shrb, nvt_gras
69 USE modd_csts, ONLY : xmd
70 USE modd_co2v_par, ONLY : xtopt, xfzero1, xfzero2, xfzerotrop, xepso, xgamm, xqdgamm, &
71  xqdgmes, xt1gmes, xt2gmes, xamax, itransfert_esg, &
72  xqdamax, xt1amax, xt2amax, xah, xbh, &
73  xdspopt, xiaopt, xaw, xbw, xmco2, xmc, xtau_wood
74 !
75 USE modi_cotwo
76 !
77 !* 0. DECLARATIONS
78 ! ------------
79 !
80 !
81 USE yomhook ,ONLY : lhook, dr_hook
82 USE parkind1 ,ONLY : jprb
83 !
84 IMPLICIT NONE
85 !
86 !* 0.1 declarations of arguments
87 !
88 TYPE(isba_options_t), INTENT(INOUT) :: IO
89 TYPE(isba_p_t), INTENT(INOUT) :: PK
90 TYPE(isba_pe_t), INTENT(INOUT) :: PEK
91 TYPE(isba_s_t), INTENT(INOUT) :: S
92 !
93 REAL,DIMENSION(:),INTENT(IN) :: PCO2
94 ! PK%XGMES = mesophyll conductance (m s-1)
95 ! PCO2 = atmospheric CO2 concentration
96 !
97 !* 0.2 declaration of local variables
98 !
99 INTEGER :: JCLASS ! indexes for loops
100 INTEGER :: ICLASS ! indexes for loops
101 INTEGER :: ICO2TYPE ! type of CO2 vegetation
102 INTEGER :: IRAD ! with or without new radiative transfer
103 !
104 REAL, DIMENSION(SIZE(PK%XANMAX)) :: ZGS, ZGAMMT, ZTOPT, ZANMAX, ZGMEST, ZGPP, ZRDK, ZEPSO
105 ! ZTOPT = optimum temperature for compensation
106 ! point
107 ! ZANMAX = maximum photosynthesis rate
108 ! ZGS = leaf conductance
109 ! ZGAMMT = temperature compensation point
110 ! ZGPP = gross primary production
111 ! ZRDK = dark respiration
112 !
113 !
114 REAL, DIMENSION(SIZE(PK%XANMAX)) :: ZCO2INIT3, ZCO2INIT4, ZCO2INIT5, ZCO2INIT2,ZCO2INIT1
115 ! working arrays for initializing surface
116 ! temperature, saturation deficit, global radiation,
117 ! optimum temperature for determining maximum
118 ! photosynthesis rate, and soil water stress (none)
119 REAL, DIMENSION(SIZE(PK%XDMAX)) :: ZDMAX
120 REAL, DIMENSION(SIZE(PK%XDMAX)) :: ZWORK
121 ! Local variable in order to initialise DMAX
122 ! following Calvet, 2000 (AST or LST cases)
123 REAL(KIND=JPRB) :: ZHOOK_HANDLE
124 !
125 !-------------------------------------------------------------------------------
126 !
127 IF (lhook) CALL dr_hook('COTWOINIT_N',0,zhook_handle)
128 !
129 ztopt(:) = 0.
130 pk%XFZERO (:) = 0.
131 pk%XEPSO (:) = 0.
132 pk%XGAMM (:) = 0.
133 pk%XQDGAMM(:) = 0.
134 pk%XQDGMES(:) = 0.
135 pk%XT1GMES(:) = 0.
136 pk%XT2GMES(:) = 0.
137 pk%XAMAX (:) = 0.
138 pk%XQDAMAX(:) = 0.
139 pk%XT1AMAX(:) = 0.
140 pk%XT2AMAX(:) = 0.
141 pk%XTAU_WOOD(:) = 0.
142 !
143 pk%XAH (:) = 0.
144 pk%XBH (:) = 0.
145 !
146 zepso(:) = 0.
147 zgpp(:) = 0.
148 zrdk(:) = 0.
149 zgammt(:) = 0.
150 zanmax(:) = 0.
151 zgmest(:) = 0.
152 zco2init3(:) = 0.
153 zco2init4(:) = 0.
154 zco2init5(:) = 0.
155 !
156 !-------------------------------------------------------------------------------
157 !
158 !-------------------------------------------------------------------------------
159 !
160 !
161 ! INITIALIZE VARIOUS PARAMETERS FOR CO2 MODEL:
162 ! --------------------------------------------
163 ! as a function of CO2 vegetation class, C3=>1, C4=>2
164 !
165 DO jclass=1,nvegtype
166  !
167  IF (jclass==nvt_c4 .OR. jclass==nvt_irr .OR. jclass==nvt_trog) THEN
168  ico2type = 2 ! C4 type
169  ELSE
170  ico2type = 1 ! C3 type
171  END IF
172  IF(io%LAGRI_TO_GRASS.AND.(jclass==nvt_c4 .OR. jclass==nvt_irr)) ico2type = 1
173  IF (io%LTR_ML) THEN
174  irad = 1 ! running with new radiative transfer
175  ELSE
176  irad = 2
177  ENDIF
178  !
179  ztopt(:) = ztopt(:) + xtopt(ico2type) * pk%XVEGTYPE_PATCH(:,jclass)
180  IF((jclass==nvt_tebd) .OR. (jclass==nvt_bone) .OR. &
181  (jclass==nvt_trbd) .OR. (jclass==nvt_tebe) .OR. (jclass==nvt_tene) .OR. &
182  (jclass==nvt_bobd) .OR. (jclass==nvt_bond) .OR. (jclass==nvt_shrb)) THEN
183  pk%XFZERO (:) = pk%XFZERO (:) + ((xaw - log(pek%XGMES(:)*1000.0))/xbw)*pk%XVEGTYPE_PATCH(:,jclass)
184  ELSE IF (jclass==nvt_trbe) THEN
185  pk%XFZERO (:) = pk%XFZERO (:) + xfzerotrop(irad) * pk%XVEGTYPE_PATCH(:,jclass)
186  ELSE
187  pk%XFZERO (:) = pk%XFZERO (:) + xfzero2(ico2type) * pk%XVEGTYPE_PATCH(:,jclass)
188  ENDIF
189  !
190  pk%XEPSO (:) = pk%XEPSO (:) + xepso(ico2type) * pk%XVEGTYPE_PATCH(:,jclass)
191  pk%XGAMM (:) = pk%XGAMM (:) + xgamm(ico2type) * pk%XVEGTYPE_PATCH(:,jclass)
192  pk%XQDGAMM(:) = pk%XQDGAMM(:) + xqdgamm(ico2type) * pk%XVEGTYPE_PATCH(:,jclass)
193  pk%XQDGMES(:) = pk%XQDGMES(:) + xqdgmes(ico2type) * pk%XVEGTYPE_PATCH(:,jclass)
194  pk%XT1GMES(:) = pk%XT1GMES(:) + xt1gmes(ico2type) * pk%XVEGTYPE_PATCH(:,jclass)
195  pk%XT2GMES(:) = pk%XT2GMES(:) + xt2gmes(ico2type) * pk%XVEGTYPE_PATCH(:,jclass)
196  pk%XQDAMAX(:) = pk%XQDAMAX(:) + xqdamax(ico2type) * pk%XVEGTYPE_PATCH(:,jclass)
197  pk%XT1AMAX(:) = pk%XT1AMAX(:) + xt1amax(ico2type) * pk%XVEGTYPE_PATCH(:,jclass)
198  pk%XT2AMAX(:) = pk%XT2AMAX(:) + xt2amax(ico2type) * pk%XVEGTYPE_PATCH(:,jclass)
199  pk%XAH (:) = pk%XAH (:) + xah(ico2type) * pk%XVEGTYPE_PATCH(:,jclass)
200  pk%XBH (:) = pk%XBH (:) + xbh(ico2type) * pk%XVEGTYPE_PATCH(:,jclass)
201  !
202  IF(io%LAGRI_TO_GRASS.AND.(jclass==nvt_c3 .OR. jclass==nvt_c3w .OR. jclass==nvt_c3s .OR. &
203  jclass==nvt_c4 .OR. jclass==nvt_irr))THEN
204  iclass=nvt_gras
205  ELSE
206  iclass=jclass
207  ENDIF
208  !
209  IF (nvegtype==nvegtype_ecosg) THEN
210  pk%XTAU_WOOD(:) = pk%XTAU_WOOD(:) + xtau_wood(itransfert_esg(iclass)) * pk%XVEGTYPE_PATCH(:,jclass)
211  pk%XAMAX (:) = pk%XAMAX (:) + xamax(itransfert_esg(iclass)) * pk%XVEGTYPE_PATCH(:,jclass)
212  ELSE
213  pk%XTAU_WOOD(:) = pk%XTAU_WOOD(:) + xtau_wood(iclass) * pk%XVEGTYPE_PATCH(:,jclass)
214  pk%XAMAX (:) = pk%XAMAX (:) + xamax(iclass) * pk%XVEGTYPE_PATCH(:,jclass)
215  ENDIF
216  !
217 END DO
218 !
219 pk%XQDGAMM(:)=log(pk%XQDGAMM(:))
220 pk%XQDGMES(:)=log(pk%XQDGMES(:))
221 pk%XQDAMAX(:)=log(pk%XQDAMAX(:))
222 !
223 !
224 ! INITIALIZE VARIOUS VARIABLES FOR CO2 MODEL:
225 ! -------------------------------------------
226 !
227 !
228 ! compute temperature responses:
229 !
230 !before optimization (with non log PK%XQDGAMM) :
231 !ZGAMMT(:) = PK%XGAMM(:)*(PK%XQDGAMM(:)**(0.1*(ZTOPT(:)-25.0)))
232 zwork(:) = (0.1*(ztopt(:)-25.0)) * pk%XQDGAMM(:)
233 zgammt(:) = pk%XGAMM(:)*exp(zwork(:))
234 !
235 !before optimization (with non log PK%XQDAMAX) :
236 !ZANMAX(:) = ( PK%XAMAX(:)*PK%XQDAMAX(:)**(0.1*(ZTOPT(:)-25.0)) ) / ...
237 zwork(:) = (0.1*(ztopt(:)-25.0)) * pk%XQDAMAX(:)
238 zanmax(:) = ( pk%XAMAX(:)*exp(zwork(:)) ) &
239  /( (1.0+exp(0.3*(pk%XT1AMAX(:)-ztopt(:))))* &
240  (1.0+exp(0.3*(ztopt(:)-pk%XT2AMAX(:)))) )
241 !
242 !before optimization (with non log PK%XQDGMES) :
243 !ZGMEST(:) = ( PEK%XGMES(:)*PK%XQDGMES(:)**(0.1*(ZTOPT(:)-25.0)) ) &
244 zwork(:) = (0.1*(ztopt(:)-25.0)) * pk%XQDGMES(:)
245 zgmest(:) = ( pek%XGMES(:)*exp(zwork(:)) ) &
246  /( (1.0+exp(0.3*(pk%XT1GMES(:)-ztopt(:))))* &
247  (1.0+exp(0.3*(ztopt(:)-pk%XT2GMES(:)))) )
248 !
249 !
250 ! initialize other variables: (using optimum values for some variables)
251 !
252 zco2init3(:) = xdspopt
253 zco2init4(:) = xiaopt
254 zco2init5(:) = 1.0
255 !
256 ! Define a dummy LAI from top (zco2init2=0.1) and total lai (zco2init=1) for Dark respiration extinction parameterization
257 !
258 zco2init2(:) = 0.1
259 zco2init1(:) = 1.0
260 !
261 ! Add soil moisture stress effect to leaf conductance:
262 !
263 zgmest(:) = zgmest(:)*zco2init5(:)
264 !
265 ! Initialise DMAX following Calvet (2000) in the case of 'AST' or 'LST' photosynthesis option
266 !
267 IF(io%CPHOTO/='NON') THEN
268  zdmax(:) = exp((log(zgmest(:)*1000.)-pk%XAH(:))/pk%XBH(:))/1000.
269 ELSE
270  zdmax(:) = pk%XDMAX(:)
271 ENDIF
272 !
273 ! Compute maximum/initial/optimum net assimilation of CO2:
274 !
275 ! Unit conversion with a constant value of 1.2 for PRHOA as it is not known here
276 ! ZANMAX and ZEPSO from kgCO2/m2/s to kgCO2/kgair m/s by dividing by RHOA (kgair/m3)
277 ! ZGAMMT from ppm to kgCO2/kgair
278 zanmax(:)=zanmax(:)/1.2
279 zepso(:)=pk%XEPSO(:)/1.2
280 zgammt(:)=zgammt(:)*xmco2/xmd*1e-6
281 !
282  CALL cotwo(pco2, zco2init5, zco2init4, zco2init3, zgammt, &
283  pk%XFZERO(:), zepso, zanmax, zgmest, pek%XGC, zdmax, &
284  pk%XANMAX(:), zgs, zrdk, zco2init2, zco2init1 )
285 ! change by sebastien PK%XEPSO change into ZEPSO for units consistency
286 !
287 !
288 !
289 IF (lhook) CALL dr_hook('COTWOINIT_N',1,zhook_handle)
290 !
291 END SUBROUTINE cotwoinit_n
real, save xmd
Definition: modd_csts.F90:61
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine cotwoinit_n(IO, S, PK, PEK, PCO2)
Definition: cotwoinitn.F90:7
subroutine cotwo(PCSP, PF2, PIA, PDS, PGAMMT, PFZERO, PEPSO, PANMAX, PGMEST, PGC, PDMAX, PAN, PGS, PRD, PLAITOP, PLAI)
Definition: cotwo.F90:9