SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
diag_misc_isban.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 diag_misc_isba_n (DGMI, PKDI, &
7  ptstep, hisba, hphoto, hsnow, oagrip, otr_ml, &
8  ptime, ksize, kpatch, kmask, pseuil, &
9  ppsn, ppsng, ppsnv, pff, pffg, pffv, &
10  pwg, pwgi, pwfc, pwwilt, pwsnow, prsnow, &
11  pfaparc, pfapirc, plai_effc, pmus, pfsat, &
12  pdg, ptg )
13 ! ###############################################################################
14 !
15 !!**** *DIAG_MISC-ISBA_n * - additional diagnostics for ISBA
16 !!
17 !! PURPOSE
18 !! -------
19 !
20 !!** METHOD
21 !! ------
22 !!
23 !! REFERENCE
24 !! ---------
25 !!
26 !!
27 !! AUTHOR
28 !! ------
29 !! P. Le Moigne
30 !!
31 !! MODIFICATIONS
32 !! -------------
33 !! Original 10/2004
34 !! Modified 10/2004 by P. Le Moigne: Halstead coefficient
35 !! B. Decharme 2008 Do not limit the SWI to 1
36 !! Add total SWI
37 !! S. Lafont 03/2009 : change unit of carbon output in kg/m2/s
38 !! A.L. Gibelin 04/2009 : Add respiration diagnostics
39 !! A.L. Gibelin 07/2009 : Suppress RDK and transform GPP as a diagnostic
40 !! S. Lafont 01/2011 : accumulate carbon variable between 2 outputs
41 !! B. Decharme 05/2012 : Carbon fluxes in diag_evap
42 !! B. Decharme 05/2012 : Active and frozen layers thickness for dif
43 !! B. Decharme 06/2013 : Snow temp for EBA scheme (XP_SNOWTEMP not allocated)
44 !!
45 !!------------------------------------------------------------------
46 !
47 !
50 !
51 USE modd_csts, ONLY : xtt
52 USE modd_surf_par, ONLY : xundef
53 !
54 !
56 !
57 USE modi_comput_cold_layers_thick
58 !
59 USE yomhook ,ONLY : lhook, dr_hook
60 USE parkind1 ,ONLY : jprb
61 !
62 IMPLICIT NONE
63 !
64 !* 0.1 declarations of arguments
65 !
66 !
67 TYPE(diag_misc_isba_t), INTENT(INOUT) :: dgmi
68 TYPE(pack_diag_isba_t), INTENT(INOUT) :: pkdi
69 !
70 REAL, INTENT(IN) :: ptstep ! timestep for accumulated values
71  CHARACTER(LEN=*), INTENT(IN) :: hisba ! ISBA scheme
72  CHARACTER(LEN=*), INTENT(IN) :: hphoto ! type of photosynthesis
73  CHARACTER(LEN=*), INTENT(IN) :: hsnow ! snow scheme
74 LOGICAL, INTENT(IN) :: oagrip
75 LOGICAL, INTENT(IN) :: otr_ml
76 REAL, INTENT(IN) :: ptime ! current time since midnight
77 INTEGER, INTENT(IN) :: ksize, kpatch
78 INTEGER, DIMENSION(:), INTENT(IN) :: kmask
79 REAL, DIMENSION(:), INTENT(IN) :: pseuil
80 !
81 !Snow/flood fraction at t
82 REAL, DIMENSION(:), INTENT(IN) :: ppsn
83 REAL, DIMENSION(:), INTENT(IN) :: ppsng
84 REAL, DIMENSION(:), INTENT(IN) :: ppsnv
85 REAL, DIMENSION(:), INTENT(IN) :: pff
86 REAL, DIMENSION(:), INTENT(IN) :: pffg
87 REAL, DIMENSION(:), INTENT(IN) :: pffv
88 !
89 REAL, DIMENSION(:,:), INTENT(IN) :: pwg ! soil water content profile (m3/m3)
90 REAL, DIMENSION(:,:), INTENT(IN) :: pwgi ! soil solid water content profile (m3/m3)
91 REAL, DIMENSION(:,:), INTENT(IN) :: pwfc ! field capacity profile (m3/m3)
92 REAL, DIMENSION(:,:), INTENT(IN) :: pwwilt ! wilting point profile (m3/m3)
93 REAL, DIMENSION(:,:), INTENT(IN) :: pwsnow ! snow reservoir (kg/m2)
94 REAL, DIMENSION(:,:), INTENT(IN) :: prsnow ! snow density (kg/m3)
95 !
96 REAL, DIMENSION(:,:), INTENT(IN) :: pdg ! soil layer depth
97 REAL, DIMENSION(:,:), INTENT(IN) :: ptg ! soil temperature
98 !
99 REAL, DIMENSION(:), INTENT(INOUT) :: pfaparc
100 REAL, DIMENSION(:), INTENT(INOUT) :: pfapirc
101 REAL, DIMENSION(:), INTENT(INOUT) :: plai_effc
102 REAL, DIMENSION(:), INTENT(INOUT) :: pmus
103 !
104 REAL, DIMENSION(:), INTENT(IN) :: pfsat
105 !
106 !* 0.2 declarations of local variables
107 !
108 REAL, DIMENSION(SIZE(PPSN)) :: zsnowtemp
109 REAL, DIMENSION(SIZE(PWSNOW,1),SIZE(PWSNOW,2)) :: zwork
110 REAL, DIMENSION(SIZE(PWSNOW,1),SIZE(PWSNOW,2)) :: zworktemp
111 !
112 REAL, DIMENSION(KSIZE) :: zalt, zflt
113 !
114 LOGICAL :: gmask
115 INTEGER :: jj, ji, jk
116 REAL(KIND=JPRB) :: zhook_handle
117 !
118 !-------------------------------------------------------------------------------------
119 !
120 IF (lhook) CALL dr_hook('DIAG_MISC_ISBA_N',0,zhook_handle)
121 !
122 IF (dgmi%LSURF_MISC_BUDGET) THEN
123  !
124  pkdi%XP_SWI (:,:)=xundef
125  pkdi%XP_TSWI(:,:)=xundef
126  DO jj=1,SIZE(pwg,2)
127  DO ji=1,SIZE(pwg,1)
128  IF(pwg(ji,jj)/=xundef)THEN
129  pkdi%XP_SWI (ji,jj) = (pwg(ji,jj) - pwwilt(ji,jj)) / (pwfc(ji,jj) - pwwilt(ji,jj))
130  pkdi%XP_TSWI(ji,jj) = (pwg(ji,jj) - pwwilt(ji,jj)) / (pwfc(ji,jj) - pwwilt(ji,jj))
131  ENDIF
132  IF(pwgi(ji,jj)/=xundef)THEN
133  pkdi%XP_TSWI(ji,jj) = pkdi%XP_TSWI(ji,jj) + pwgi(ji,jj) / (pwfc(ji,jj) - pwwilt(ji,jj))
134  ENDIF
135  ENDDO
136  ENDDO
137  !
138  DO jk=1,SIZE(pkdi%XP_SWI,2)
139 !cdir nodep
140  DO jj=1,ksize
141  ji = kmask(jj)
142  !
143  dgmi%XSWI (ji,jk,kpatch) = pkdi%XP_SWI (jj,jk)
144  dgmi%XTSWI (ji,jk,kpatch) = pkdi%XP_TSWI (jj,jk)
145  !
146  END DO
147  ENDDO
148  !
149  DO ji = 1,SIZE(pwsnow,2)
150 !cdir nodep
151  DO jj = 1,SIZE(pwsnow,1)
152  zwork(jj,ji) = pwsnow(jj,ji) / prsnow(jj,ji)
153  ENDDO
154  ENDDO
155  !
156  pkdi%XP_TWSNOW=0.
157  pkdi%XP_TDSNOW=0.
158  zsnowtemp=0.
159  !
160  IF (hsnow/='EBA')THEN
161  zworktemp(:,:) = pkdi%XP_SNOWTEMP(:,:)
162  ELSE
163  zworktemp(:,1) = min(ptg(:,1),xtt)
164  ENDIF
165  !
166  DO ji = 1,SIZE(pwsnow,2)
167 !cdir nodep
168  DO jj = 1,SIZE(pwsnow,1)
169  pkdi%XP_TWSNOW(jj) = pkdi%XP_TWSNOW(jj) + pwsnow(jj,ji)
170  pkdi%XP_TDSNOW(jj) = pkdi%XP_TDSNOW(jj) + zwork(jj,ji)
171  zsnowtemp(jj) = zsnowtemp(jj) + zworktemp(jj,ji) * zwork(jj,ji)
172  ENDDO
173  ENDDO
174  !
175  WHERE(pkdi%XP_TDSNOW(:)>0.0)
176  zsnowtemp(:)=zsnowtemp(:)/pkdi%XP_TDSNOW(:)
177  ELSEWHERE
178  zsnowtemp(:)=xundef
179  ENDWHERE
180  !
181 !cdir nodep
182  DO jj=1,ksize
183  ji = kmask(jj)
184  !
185  dgmi%XHV (ji, kpatch) = pkdi%XP_HV (jj)
186  dgmi%XDPSNG (ji, kpatch) = ppsng(jj)
187  dgmi%XDPSNV (ji, kpatch) = ppsnv(jj)
188  dgmi%XDPSN (ji, kpatch) = ppsn(jj)
189  dgmi%XALBT (ji, kpatch) = pkdi%XP_ALBT (jj)
190  dgmi%XDFF (ji, kpatch) = pff(jj)
191  dgmi%XDFFG (ji, kpatch) = pffg(jj)
192  dgmi%XDFFV (ji, kpatch) = pffv(jj)
193  dgmi%XTWSNOW (ji, kpatch) = pkdi%XP_TWSNOW (jj)
194  dgmi%XTDSNOW (ji, kpatch) = pkdi%XP_TDSNOW (jj)
195  dgmi%XTTSNOW (ji, kpatch) = zsnowtemp(jj)
196  dgmi%XDFSAT (ji, kpatch) = pfsat(jj)
197  !
198  END DO
199 !
200  IF (hsnow=='3-L' .OR. hsnow=='CRO') THEN
201  !
202  DO jk=1,SIZE(pkdi%XP_SNOWLIQ,2)
203 !cdir nodep
204  DO jj=1,ksize
205  ji = kmask(jj)
206  !
207  dgmi%XSNOWLIQ (ji,jk,kpatch) = pkdi%XP_SNOWLIQ (jj,jk)
208  dgmi%XSNOWTEMP(ji,jk,kpatch) = pkdi%XP_SNOWTEMP (jj,jk)
209  !
210  END DO
211  ENDDO
212  !
213  ENDIF
214 !
215 ! cosine of solar zenith angle
216 !
217 
218  IF (hphoto/='NON'.AND.otr_ml) THEN
219  !
220 !cdir nodep
221  DO jj=1,ksize
222  ji = kmask(jj)
223  !
224  dgmi%XFAPAR (ji, kpatch) = pkdi%XP_FAPAR (jj)
225  dgmi%XFAPIR (ji, kpatch) = pkdi%XP_FAPIR (jj)
226  dgmi%XFAPAR_BS (ji, kpatch) = pkdi%XP_FAPAR_BS (jj)
227  dgmi%XFAPIR_BS (ji, kpatch) = pkdi%XP_FAPIR_BS (jj)
228  !
229  ENDDO
230  !
231  ! Mask where vegetation evolution is performed (just before solar midnight)
232  gmask = ( ptime - ptstep < 0. ) .AND. ( ptime >= 0. )
233  IF (gmask) THEN
234 !cdir nodep
235  DO jj=1,ksize
236  ji = kmask(jj)
237  !
238  IF (pmus(jj).NE.0.) THEN
239  dgmi%XDFAPARC (ji, kpatch) = pfaparc(jj) / pmus(jj)
240  dgmi%XDFAPIRC (ji, kpatch) = pfapirc(jj) / pmus(jj)
241  dgmi%XDLAI_EFFC (ji, kpatch) = plai_effc(jj) / pmus(jj)
242  ENDIF
243  !
244  ENDDO
245 !cdir nodep
246  DO jj=1,ksize
247  pfaparc(jj) = 0.
248  pfapirc(jj) = 0.
249  plai_effc(jj) = 0.
250  pmus(jj) = 0.
251  ENDDO
252  ENDIF
253  !
254  ENDIF
255  !
256  IF(hisba=='DIF')THEN
257  zalt(:)=0.0
258  zflt(:)=0.0
259  CALL comput_cold_layers_thick(pdg,ptg,zalt,zflt)
260  DO jj=1,ksize
261  ji = kmask(jj)
262  dgmi%XALT(ji,kpatch) = zalt(jj)
263  dgmi%XFLT(ji,kpatch) = zflt(jj)
264  ENDDO
265  ENDIF
266  !
267 END IF
268 !
269 IF (oagrip) THEN
270  !
271 !cdir nodep
272  DO jj=1,ksize
273  ji = kmask(jj)
274  !
275  dgmi%XSEUIL (ji, kpatch) = pseuil(jj)
276  !
277  END DO
278 !
279 END IF
280 IF (lhook) CALL dr_hook('DIAG_MISC_ISBA_N',1,zhook_handle)
281 !-------------------------------------------------------------------------------------
282 !
283 END SUBROUTINE diag_misc_isba_n
subroutine diag_misc_isba_n(DGMI, PKDI, PTSTEP, HISBA, HPHOTO, HSNOW, OAGRIP, OTR_ML, PTIME, KSIZE, KPATCH, KMASK, PSEUIL, PPSN, PPSNG, PPSNV, PFF, PFFG, PFFV, PWG, PWGI, PWFC, PWWILT, PWSNOW, PRSNOW, PFAPARC, PFAPIRC, PLAI_EFFC, PMUS, PFSAT, PDG, PTG)
subroutine comput_cold_layers_thick(PDG, PTG, PALT, PFLT)