SURFEX v8.1
General documentation of Surfex
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 (DMK, KK, PK, PEK, AGK, IO, OSURF_MISC_BUDGET, &
7  OVOLUMETRIC_SNOWLIQ, PTSTEP, OAGRIP, PTIME, KSIZE )
8 ! ###############################################################################
9 !
10 !!**** *DIAG_MISC-ISBA_n * - additional diagnostics for ISBA
11 !!
12 !! PURPOSE
13 !! -------
14 !
15 !!** METHOD
16 !! ------
17 !!
18 !! REFERENCE
19 !! ---------
20 !!
21 !!
22 !! AUTHOR
23 !! ------
24 !! P. Le Moigne
25 !!
26 !! MODIFICATIONS
27 !! -------------
28 !! Original 10/2004
29 !! Modified 10/2004 by P. Le Moigne: Halstead coefficient
30 !! B. Decharme 2008 Do not limit the SWI to 1
31 !! Add total SWI
32 !! S. Lafont 03/2009 : change unit of carbon output in kg/m2/s
33 !! A.L. Gibelin 04/2009 : Add respiration diagnostics
34 !! A.L. Gibelin 07/2009 : Suppress RDK and transform GPP as a diagnostic
35 !! S. Lafont 01/2011 : accumulate carbon variable between 2 outputs
36 !! B. Decharme 05/2012 : Carbon fluxes in diag_evap
37 !! B. Decharme 05/2012 : Active and frozen layers thickness for dif
38 !! B. Decharme 06/2013 : Snow temp for EBA scheme (XP_SNOWTEMP not allocated)
39 !!
40 !!------------------------------------------------------------------
41 !
42 !
45 USE modd_agri_n, ONLY : agri_t
47 !
48 USE modd_csts, ONLY : xtt, xrholw
49 USE modd_surf_par, ONLY : xundef
50 !
51 !
53 !
54 USE modi_comput_cold_layers_thick
55 !
56 USE yomhook ,ONLY : lhook, dr_hook
57 USE parkind1 ,ONLY : jprb
58 !
59 IMPLICIT NONE
60 !
61 !* 0.1 declarations of arguments
62 !
63 TYPE(diag_misc_isba_t), INTENT(INOUT) :: DMK
64 TYPE(isba_k_t), INTENT(INOUT) :: KK
65 TYPE(isba_p_t), INTENT(INOUT) :: PK
66 TYPE(isba_pe_t), INTENT(INOUT) :: PEK
67 TYPE(agri_t), INTENT(INOUT) :: AGK
68 TYPE(isba_options_t), INTENT(INOUT) :: IO
69 !
70 LOGICAL, INTENT(IN) :: OSURF_MISC_BUDGET
71 LOGICAL, INTENT(IN) :: OVOLUMETRIC_SNOWLIQ
72 REAL, INTENT(IN) :: PTSTEP ! timestep for accumulated values
73 LOGICAL, INTENT(IN) :: OAGRIP
74 REAL, INTENT(IN) :: PTIME ! current time since midnight
75 INTEGER, INTENT(IN) :: KSIZE
76 !
77 !
78 !* 0.2 declarations of local variables
79 !
80 REAL, DIMENSION(SIZE(PEK%XPSN)) :: ZSNOWTEMP
81 REAL, DIMENSION(SIZE(PEK%TSNOW%WSNOW,1),SIZE(PEK%TSNOW%WSNOW,2)) :: ZWORK
82 REAL, DIMENSION(SIZE(PEK%TSNOW%WSNOW,1),SIZE(PEK%TSNOW%WSNOW,2)) :: ZWORKTEMP
83 !
84 REAL, DIMENSION(KSIZE) :: ZALT, ZFLT
85 !
86 LOGICAL :: GMASK
87 INTEGER :: JL, JI, JK
88 REAL(KIND=JPRB) :: ZHOOK_HANDLE
89 !
90 !-------------------------------------------------------------------------------------
91 !
92 IF (lhook) CALL dr_hook('DIAG_MISC_ISBA_N',0,zhook_handle)
93 !
94 IF (osurf_misc_budget) THEN
95  !
96  dmk%XSWI (:,:)=xundef
97  dmk%XTSWI(:,:)=xundef
98  DO jl=1,SIZE(pek%XWG,2)
99  DO ji=1,SIZE(pek%XWG,1)
100  IF(pek%XWG (ji,jl)/=xundef)THEN
101  dmk%XSWI (ji,jl) = (pek%XWG (ji,jl) - kk%XWWILT(ji,jl)) / (kk%XWFC(ji,jl) - kk%XWWILT(ji,jl))
102  dmk%XTSWI(ji,jl) = (pek%XWG (ji,jl) - kk%XWWILT(ji,jl)) / (kk%XWFC(ji,jl) - kk%XWWILT(ji,jl))
103  ENDIF
104  IF(pek%XWGI (ji,jl)/=xundef)THEN
105  dmk%XTSWI(ji,jl) = dmk%XTSWI(ji,jl) + pek%XWGI(ji,jl) / (kk%XWFC(ji,jl) - kk%XWWILT(ji,jl))
106  ENDIF
107  ENDDO
108  ENDDO
109  !
110  DO jl = 1,SIZE(pek%TSNOW%WSNOW,2)
111  DO ji = 1,SIZE(pek%TSNOW%WSNOW,1)
112  zwork(ji,jl) = pek%TSNOW%WSNOW(ji,jl) / pek%TSNOW%RHO(ji,jl)
113  ENDDO
114  ENDDO
115  !
116  dmk%XTWSNOW=0.
117  dmk%XTDSNOW=0.
118  zsnowtemp=0.
119  !
120  IF (pek%TSNOW%SCHEME/='EBA')THEN
121  zworktemp(:,:) = dmk%XSNOWTEMP(:,:)
122  ELSE
123  zworktemp(:,1) = min(pek%XTG(:,1),xtt)
124  ENDIF
125  !
126  DO jl = 1,SIZE(pek%TSNOW%WSNOW,2)
127  DO ji = 1,SIZE(pek%TSNOW%WSNOW,1)
128  dmk%XTWSNOW(ji) = dmk%XTWSNOW(ji) + pek%TSNOW%WSNOW(ji,jl)
129  dmk%XTDSNOW(ji) = dmk%XTDSNOW(ji) + zwork(ji,jl)
130  zsnowtemp(ji) = zsnowtemp(ji) + zworktemp(ji,jl) * zwork(ji,jl)
131  ENDDO
132  ENDDO
133  !
134  WHERE(dmk%XTDSNOW(:)>0.0)
135  zsnowtemp(:)=zsnowtemp(:)/dmk%XTDSNOW(:)
136  ELSEWHERE
137  zsnowtemp(:)=xundef
138  ENDWHERE
139  !
140  dmk%XPSNG (:) = pek%XPSNG(:)
141  dmk%XPSNV (:) = pek%XPSNV(:)
142  dmk%XPSN (:) = pek%XPSN (:)
143  dmk%XFF (:) = kk%XFF (:)
144  dmk%XFFG (:) = kk%XFFG (:)
145  dmk%XFFV (:) = kk%XFFV (:)
146  dmk%XFSAT (:) = kk%XFSAT (:)
147  dmk%XTTSNOW(:) = zsnowtemp(:)
148  !
149  IF ( (pek%TSNOW%SCHEME=='3-L' .OR. pek%TSNOW%SCHEME=='CRO') .AND. ovolumetric_snowliq ) THEN
150  !
151  WHERE (dmk%XSNOWLIQ(:,:)/=xundef) &
152  dmk%XSNOWLIQ(:,:) = dmk%XSNOWLIQ(:,:) * xrholw / dmk%XSNOWDZ(:,:)
153  !
154  ENDIF
155  !
156  ! cosine of solar zenith angle
157  !
158  IF (io%CPHOTO/='NON'.AND.io%LTR_ML) THEN
159  !
160  ! Mask where vegetation evolution is performed (just before solar midnight)
161  gmask = ( ptime - ptstep < 0. ) .AND. ( ptime >= 0. )
162  IF (gmask) THEN
163  DO ji=1,ksize
164  !
165  IF (pek%XMUS(ji).NE.0.) THEN
166  dmk%XDFAPARC (ji) = pek%XFAPARC (ji) / pek%XMUS(ji)
167  dmk%XDFAPIRC (ji) = pek%XFAPIRC (ji) / pek%XMUS(ji)
168  dmk%XDLAI_EFFC (ji) = pek%XLAI_EFFC (ji) / pek%XMUS(ji)
169  ENDIF
170  !
171  ENDDO
172  DO ji=1,ksize
173  pek%XFAPARC(ji) = 0.
174  pek%XFAPIRC(ji) = 0.
175  pek%XLAI_EFFC(ji) = 0.
176  pek%XMUS(ji) = 0.
177  ENDDO
178  ENDIF
179  !
180  ENDIF
181  !
182  IF(io%CISBA=='DIF')THEN
183  zalt(:)=0.0
184  zflt(:)=0.0
185  CALL comput_cold_layers_thick(pk%XDG(:,:),pek%XTG(:,:),zalt,zflt)
186  DO ji=1,ksize
187  dmk%XALT(ji) = zalt(ji)
188  dmk%XFLT(ji) = zflt(ji)
189  ENDDO
190  ENDIF
191  !
192 END IF
193 !
194 IF (oagrip) THEN
195  !
196  DO ji=1,ksize
197  dmk%XSEUIL (ji) = agk%XTHRESHOLDSPT (ji)
198  END DO
199 !
200 END IF
201 IF (lhook) CALL dr_hook('DIAG_MISC_ISBA_N',1,zhook_handle)
202 !-------------------------------------------------------------------------------------
203 !
204 END SUBROUTINE diag_misc_isba_n
subroutine diag_misc_isba_n(DMK, KK, PK, PEK, AGK, IO, OSURF_MISC_BUDGET, OVOLUMETRIC_SNOWLIQ, PTSTEP, OAGRIP, PTIME, KSIZE)
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
real, save xrholw
Definition: modd_csts.F90:64
real, save xtt
Definition: modd_csts.F90:66
subroutine comput_cold_layers_thick(PDG, PTG, PALT, PFLT)