SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
diag_inline_tebn.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_inline_teb_n (DGT, TCP, T, &
7  ocanopy, pta, pts, pqa, ppa, pps, prhoa, &
8  pzona, pmera, pwind, pht, phw, &
9  pcd, pcdn, pri, pch, pz0, &
10  ptrad, pemis, pdir_alb, psca_alb, &
11  plw, pdir_sw, psca_sw, &
12  psfth, psftq, psfzon, psfmer, psfco2, &
13  prn, ph, ple, pgflux )
14 ! ###############################################################################!
15 !!**** *DIAG_INLINE_TEB_n * - Computes diagnostics during TEB time-step
16 !!
17 !! PURPOSE
18 !! -------
19 !
20 !!** METHOD
21 !! ------
22 !!
23 !! REFERENCE
24 !! ---------
25 !!
26 !!
27 !! AUTHOR
28 !! ------
29 !! V. Masson
30 !!
31 !! MODIFICATIONS
32 !! -------------
33 !! Original 01/2004
34 !! S. Riette 06/2009 CLS_WIND has one more argument (height of diagnostic)
35 !! S. Riette 01/2010 Use of interpol_sbl to compute 10m wind diagnostic
36 ! B. decharme 04/2013 : Add EVAP and SUBL diag
37 !!------------------------------------------------------------------
38 !
39 
40 !
41 !
42 !
43 USE modd_diag_teb_n, ONLY : diag_teb_t
45 USE modd_teb_n, ONLY : teb_t
46 !
47 USE modd_surf_par, ONLY : xundef
48 !
49 USE modi_cls_wind
50 USE modi_param_cls
51 USE modi_diag_surf_budget_teb
52 USE modi_interpol_sbl
53 !
54 USE mode_thermos
56 !
57 USE yomhook ,ONLY : lhook, dr_hook
58 USE parkind1 ,ONLY : jprb
59 !
60 IMPLICIT NONE
61 !
62 !* 0.1 declarations of arguments
63 !
64 !
65 TYPE(diag_teb_t), INTENT(INOUT) :: dgt
66 TYPE(teb_canopy_t), INTENT(INOUT) :: tcp
67 TYPE(teb_t), INTENT(INOUT) :: t
68 !
69 LOGICAL, INTENT(IN) :: ocanopy ! Flag for canopy
70 REAL, DIMENSION(:), INTENT(IN) :: pta ! atmospheric temperature
71 REAL, DIMENSION(:), INTENT(IN) :: pts ! surface temperature
72 REAL, DIMENSION(:), INTENT(IN) :: pqa ! atmospheric specific humidity
73 REAL, DIMENSION(:), INTENT(IN) :: ppa ! atmospheric level pressure
74 REAL, DIMENSION(:), INTENT(IN) :: pps ! surface pressure
75 REAL, DIMENSION(:), INTENT(IN) :: prhoa ! air density
76 REAL, DIMENSION(:), INTENT(IN) :: pzona ! zonal wind
77 REAL, DIMENSION(:), INTENT(IN) :: pmera ! meridian wind
78 REAL, DIMENSION(:), INTENT(IN) :: pwind ! wind
79 REAL, DIMENSION(:), INTENT(IN) :: pht ! atmospheric level height
80 REAL, DIMENSION(:), INTENT(IN) :: phw ! atmospheric level height for wind
81 REAL, DIMENSION(:), INTENT(IN) :: pcd ! drag coefficient for momentum
82 REAL, DIMENSION(:), INTENT(IN) :: pcdn ! neutral drag coefficient
83 REAL, DIMENSION(:), INTENT(IN) :: psfzon ! zonal friction
84 REAL, DIMENSION(:), INTENT(IN) :: psfmer ! meridian friction
85 REAL, DIMENSION(:), INTENT(IN) :: psfco2 ! CO2 flux (m/s*kg_CO2/kg_air)
86 REAL, DIMENSION(:), INTENT(IN) :: psfth ! heat flux (W/m2)
87 REAL, DIMENSION(:), INTENT(IN) :: psftq ! water flux (kg/m2/s)
88 REAL, DIMENSION(:), INTENT(IN) :: pri ! Richardson number
89 REAL, DIMENSION(:), INTENT(IN) :: pch ! drag coefficient for heat
90 REAL, DIMENSION(:), INTENT(IN) :: pz0 ! roughness length for momentum
91 REAL, DIMENSION(:), INTENT(IN) :: prn ! net radiation
92 REAL, DIMENSION(:), INTENT(IN) :: ph ! sensible heat flux
93 REAL, DIMENSION(:), INTENT(IN) :: ple ! latent heat flux
94 REAL, DIMENSION(:), INTENT(IN) :: pgflux ! storage flux
95 REAL, DIMENSION(:,:),INTENT(IN) :: pdir_sw ! direct solar radiation (on horizontal surf.)
96 ! ! (W/m2)
97 REAL, DIMENSION(:,:),INTENT(IN) :: psca_sw ! diffuse solar radiation (on horizontal surf.)
98 ! ! (W/m2)
99 REAL, DIMENSION(:), INTENT(IN) :: plw ! longwave radiation (on horizontal surf.)
100 REAL, DIMENSION(:), INTENT(IN) :: ptrad ! radiative temperature (K)
101 REAL, DIMENSION(:,:),INTENT(IN) :: pdir_alb ! direct albedo for each spectral band (-)
102 REAL, DIMENSION(:,:),INTENT(IN) :: psca_alb ! diffuse albedo for each spectral band (-)
103 REAL, DIMENSION(:), INTENT(IN) :: pemis ! emissivity (-)
104 !
105 !* 0.2 declarations of local variables
106 !
107 REAL :: zz0_o_z0h
108 REAL, DIMENSION(SIZE(PTA)) :: zh
109 REAL, DIMENSION(SIZE(PTA)) :: zu10
110 REAL, DIMENSION(SIZE(PTA)) :: zwind10m_max
111 REAL, DIMENSION(SIZE(PTA)) :: zt2m_min
112 REAL, DIMENSION(SIZE(PTA)) :: zt2m_max
113 REAL, DIMENSION(SIZE(PTA)) :: zhu2m_min
114 REAL, DIMENSION(SIZE(PTA)) :: zhu2m_max
115 INTEGER :: jj ! loop counter
116 
117 REAL(KIND=JPRB) :: zhook_handle
118 !-------------------------------------------------------------------------------------
119 !
120 IF (lhook) CALL dr_hook('DIAG_INLINE_TEB_N',0,zhook_handle)
121 !
122 ! * Mean surface temperature need to couple with AGCM
123 !
124 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
125 !Here it is the radiative temperature that is wrong !
126 !It should be the arithmetic mean of the surface temperature
127 !of each independant energy budget, if there is. See ISBA for more detail.
128 !
129 dgt%XDIAG_TS(:) = pts(:)
130 !
131 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
132 !
133 zz0_o_z0h = 200.
134 !
135 !* 2m and 10m variables interpolated from canopy if used
136 !
137 IF (ocanopy) THEN
138  zt2m_min(:) = xundef
139  zt2m_max(:) = xundef
140  zhu2m_min(:) = xundef
141  zhu2m_max(:) = xundef
142  zwind10m_max(:) = xundef
143  IF (dgt%N2M>0) CALL init_2m_10m( tcp%XP(:,2), tcp%XT(:,2), tcp%XQ(:,2), tcp%XU, tcp%XZ, &
144  pzona, pmera, pwind, prhoa, &
145  dgt%XT2M, dgt%XQ2M, dgt%XHU2M, dgt%XZON10M, dgt%XMER10M,&
146  zu10, zwind10m_max, zt2m_min, &
147  zt2m_max, zhu2m_min, zhu2m_max )
148 ELSE
149 !* 2m and 10m variables using CLS laws
150  IF (dgt%N2M==1) THEN
151  CALL param_cls(pta, pts, pqa, ppa, prhoa, pzona, pmera, pht, phw, &
152  psfth, psftq, psfzon, psfmer, &
153  dgt%XT2M, dgt%XQ2M, dgt%XHU2M, dgt%XZON10M, dgt%XMER10M )
154  !
155  !* erases temperature and humidity 2m above roof level bu canyon air values
156  !
157  dgt%XT2M = t%CUR%XT_CANYON
158  dgt%XQ2M = t%CUR%XQ_CANYON
159  !
160  !* Richardson number
161  !
162  dgt%XRI = pri
163  dgt%XHU2M = min(t%CUR%XQ_CANYON /qsat(t%CUR%XT_CANYON,ppa),1.)
164  ELSE IF (dgt%N2M==2) THEN
165  zh(:)=10.
166  CALL cls_wind(pzona, pmera, phw, &
167  pcd, pcdn, pri, zh, &
168  dgt%XZON10M, dgt%XMER10M )
169  dgt%XT2M = t%CUR%XT_CANYON
170  dgt%XQ2M = t%CUR%XQ_CANYON
171  dgt%XRI = pri
172  dgt%XHU2M = min(t%CUR%XQ_CANYON /qsat(t%CUR%XT_CANYON,ppa),1.)
173  END IF
174 END IF
175 !
176 IF (dgt%N2M>=1) THEN
177  !
178  dgt%XT2M_MIN(:) = min(dgt%XT2M_MIN(:),dgt%XT2M(:))
179  dgt%XT2M_MAX(:) = max(dgt%XT2M_MAX(:),dgt%XT2M(:))
180  !
181  dgt%XHU2M_MIN(:) = min(dgt%XHU2M_MIN(:),dgt%XHU2M(:))
182  dgt%XHU2M_MAX(:) = max(dgt%XHU2M_MAX(:),dgt%XHU2M(:))
183  !
184  dgt%XWIND10M (:) = sqrt(dgt%XZON10M**2+dgt%XMER10M**2)
185  dgt%XWIND10M_MAX(:) = max(dgt%XWIND10M_MAX(:),dgt%XWIND10M(:))
186  !
187 END IF
188 
189 !
190 IF (dgt%LSURF_BUDGET) THEN
191  !
192  CALL diag_surf_budget_teb(pdir_sw, psca_sw, pdir_alb, psca_alb, &
193  plw, pemis, ptrad, &
194  dgt%XSWD, dgt%XSWU, dgt%XSWBD, dgt%XSWBU, dgt%XLWD, dgt%XLWU )
195  !
196  dgt%XRN = prn
197  dgt%XH = ph
198  dgt%XLE = ple
199  dgt%XGFLUX = pgflux
200  dgt%XFMU = psfzon
201  dgt%XFMV = psfmer
202  dgt%XSFCO2 = psfco2
203  !
204 END IF
205 !
206 IF (dgt%LCOEF) THEN
207  dgt%XCD = pcd
208  dgt%XCH = pch
209  dgt%XCE = pch
210  dgt%XZ0 = pz0
211  dgt%XZ0H = pz0 / zz0_o_z0h
212 END IF
213 !
214 IF (dgt%LSURF_VARS) THEN
215  dgt%XQS = t%CUR%XQ_CANYON
216 END IF
217 IF (lhook) CALL dr_hook('DIAG_INLINE_TEB_N',1,zhook_handle)
218 !-------------------------------------------------------------------------------------
219 !
220 END SUBROUTINE diag_inline_teb_n
subroutine cls_wind(PZONA, PMERA, PHW, PCD, PCDN, PRI, PHV, PZON10M, PMER10M)
Definition: cls_wind.F90:6
subroutine param_cls(PTA, PTS, PQA, PPA, PRHOA, PZONA, PMERA, PH, PHW, PSFTH, PSFTQ, PSFZON, PSFMER, PT2M, PQ2M, PHU2M, PZON10M, PMER10M)
Definition: param_cls.F90:6
subroutine diag_surf_budget_teb(PDIR_SW, PSCA_SW, PDIR_ALB, PSCA_ALB, PLW, PEMIS, PTRAD, PSWD, PSWU, PSWBD, PSWBU, PLWD, PLWU)
subroutine init_2m_10m(PP, PT, PQ, PXU, PXZ, PU, PV, PWIND, PRHOA, PT2M, PQ2M, PHU2M, PZON10M, PMER10M, PWIND10M, PWIND10M_MAX, PT2M_MIN, PT2M_MAX, PHU2M_MIN, PHU2M_MAX)
subroutine diag_inline_teb_n(DGT, TCP, T, OCANOPY, PTA, PTS, PQA, PPA, PPS, PRHOA, PZONA, PMERA, PWIND, PHT, PHW, PCD, PCDN, PRI, PCH, PZ0, PTRAD, PEMIS, PDIR_ALB, PSCA_ALB, PLW, PDIR_SW, PSCA_SW, PSFTH, PSFTQ, PSFZON, PSFMER, PSFCO2, PRN, PH, PLE, PGFLUX)