SURFEX v8.1
General documentation of Surfex
init_isba_sbl.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 init_isba_sbl(IO, K, NP, NPE, SB, PTSTEP, PPA, PPS, PTA, PQA, PRHOA, PU, PV, &
7  PDIR_SW, PSCA_SW, PSW_BANDS, PRAIN, PSNOW, PZREF, PUREF, PSSO_SLOPE )
8 ! #################################################################################
9 !
10 !!**** *INIT_WATER_SBL* - inits water SBL profiles
11 !!
12 !! PURPOSE
13 !! -------
14 !
15 !!** METHOD
16 !! ------
17 !!
18 !! REFERENCE
19 !! ---------
20 !!
21 !!
22 !! AUTHOR
23 !! ------
24 !! S. Riette
25 !!
26 !! MODIFICATIONS
27 !! -------------
28 !! Original 03/2010
29 !!------------------------------------------------------------------
30 !
33 USE modd_canopy_n, ONLY : canopy_t
34 !
36 !
37 USE modd_surf_par, ONLY : xundef
38 !
39 USE modd_csts, ONLY : xcpd, xrd, xp00, xg, xlvtt
40 USE modd_surf_atm, ONLY : lnosof
41 USE modd_canopy_turb, ONLY : xalpsbl
42 !
43 USE modi_cls_tq
44 USE modi_isba_snow_frac
45 USE modi_wet_leaves_frac
46 USE modi_veg
47 USE modi_drag
48 USE modi_cls_wind
49 !
50 USE yomhook ,ONLY : lhook, dr_hook
51 USE parkind1 ,ONLY : jprb
52 !
53 IMPLICIT NONE
54 !
55 !* 0.1 declarations of arguments
56 !
57 TYPE(isba_options_t), INTENT(INOUT) :: IO
58 TYPE(isba_k_t), INTENT(INOUT) :: K
59 TYPE(isba_np_t), INTENT(INOUT) :: NP
60 TYPE(isba_npe_t), INTENT(INOUT) :: NPE
61 TYPE(canopy_t), INTENT(INOUT) :: SB
62 !
63 REAL, INTENT(IN) :: PTSTEP ! timestep of the integration
64 REAL, DIMENSION(:), INTENT(IN) :: PPA ! pressure at forcing level (Pa)
65 REAL, DIMENSION(:), INTENT(IN) :: PPS ! pressure at atmospheric model surface (Pa)
66 REAL, DIMENSION(:), INTENT(IN) :: PTA ! air temperature forcing (K)
67 REAL, DIMENSION(:), INTENT(IN) :: PQA ! air humidity forcing (kg/m3)
68 REAL, DIMENSION(:), INTENT(IN) :: PRHOA ! air density (kg/m3)
69 REAL, DIMENSION(:), INTENT(IN) :: PU ! zonal wind (m/s)
70 REAL, DIMENSION(:), INTENT(IN) :: PV ! meridian wind (m/s)
71 REAL, DIMENSION(:,:),INTENT(IN) :: PDIR_SW ! direct solar radiation (on horizontal surf.)
72 ! ! (W/m2)
73 REAL, DIMENSION(:,:),INTENT(IN) :: PSCA_SW ! diffuse solar radiation (on horizontal surf.)
74 ! ! (W/m2)
75 REAL, DIMENSION(:), INTENT(IN) :: PSW_BANDS ! mean wavelength of each shortwave band (m)
76 REAL, DIMENSION(:), INTENT(IN) :: PSNOW ! snow precipitation (kg/m2/s)
77 REAL, DIMENSION(:), INTENT(IN) :: PRAIN ! liquid precipitation (kg/m2/s)
78 REAL, DIMENSION(:), INTENT(IN) :: PZREF ! height of T,q forcing (m)
79 REAL, DIMENSION(:), INTENT(IN) :: PUREF ! height of wind forcing (m)
80 REAL, DIMENSION(:), INTENT(IN) :: PSSO_SLOPE! slope of S.S.O. (-)
81 ! ! canopy
82 !
83 !* 0.2 declarations of local variables
84 !
85 TYPE(isba_pe_t), POINTER :: PEK
86 TYPE(isba_p_t), POINTER :: PK
87 !
88 !* forcing variables
89 !
90 REAL, DIMENSION(SIZE(PTA)) :: ZWIND ! lowest atmospheric level wind speed (m/s)
91 REAL, DIMENSION(SIZE(PTA)) :: ZEXNA ! Exner function at lowest SBL scheme level (-)
92 REAL, DIMENSION(SIZE(PTA)) :: ZQA ! specific humidity (kg/m3)
93 !
94 ! SBL turbulence scheme
95 !
96 REAL, DIMENSION(SIZE(PTA)) ::ZRI
97 REAL, DIMENSION(SIZE(PTA)) ::ZCD
98 REAL, DIMENSION(SIZE(PTA)) ::ZCDN
99 REAL, DIMENSION(SIZE(PTA)) ::ZCH
100 REAL, DIMENSION(SIZE(PTA)) ::ZTNM
101 REAL, DIMENSION(SIZE(PTA)) ::ZQNM
102 REAL, DIMENSION(SIZE(PTA)) ::ZHUNM
103 REAL, DIMENSION(SIZE(PTA)) ::ZP_SLOPE_COS
104 REAL, DIMENSION(SIZE(PTA)) ::ZZ0
105 REAL, DIMENSION(SIZE(PTA)) ::ZZ0H
106 REAL, DIMENSION(SIZE(PTA)) ::ZEXNS
107 REAL, DIMENSION(SIZE(PTA)) ::ZTS
108 REAL, DIMENSION(SIZE(PTA)) ::ZHU
109 REAL, DIMENSION(SIZE(PTA)) ::ZQS
110 REAL, DIMENSION(SIZE(PTA)) ::ZZ0EFF
111 REAL, DIMENSION(SIZE(PTA)) ::ZWG
112 REAL, DIMENSION(SIZE(PTA)) ::ZWGI
113 REAL, DIMENSION(SIZE(PTA)) ::ZVEG
114 REAL, DIMENSION(SIZE(PTA)) ::ZRESA
115 REAL, DIMENSION(SIZE(PTA)) ::ZHUG
116 REAL, DIMENSION(SIZE(PTA)) ::ZHUGI
117 REAL, DIMENSION(SIZE(PTA)) ::ZHV
118 REAL, DIMENSION(SIZE(PTA)) ::ZCPS
119 REAL, DIMENSION(SIZE(PTA)) ::ZWRMAX_CF
120 REAL, DIMENSION(SIZE(PTA)) ::ZWR
121 REAL, DIMENSION(SIZE(PTA)) ::ZZ0_WITH_SNOW
122 REAL, DIMENSION(SIZE(PTA)) ::ZPSNG
123 REAL, DIMENSION(SIZE(PTA)) ::ZPSNV
124 REAL, DIMENSION(SIZE(PTA)) ::ZPSNV_A
125 REAL, DIMENSION(SIZE(PTA)) ::ZPSN
126 REAL, DIMENSION(SIZE(PTA)) ::ZSNOWALB
127 REAL, DIMENSION(SIZE(PTA)) ::ZFFG
128 REAL, DIMENSION(SIZE(PTA)) ::ZFFGNOS
129 REAL, DIMENSION(SIZE(PTA)) ::ZFFV
130 REAL, DIMENSION(SIZE(PTA)) ::ZFFVNOS
131 REAL, DIMENSION(SIZE(PTA)) ::ZFF
132 REAL, DIMENSION(SIZE(PTA)) ::ZRS
133 REAL, DIMENSION(SIZE(PTA)) ::ZP_GLOBAL_SW
134 REAL, DIMENSION(SIZE(PTA)) ::ZF2
135 REAL, DIMENSION(SIZE(PTA)) ::ZF5
136 REAL, DIMENSION(SIZE(PTA)) ::ZLAI
137 REAL, DIMENSION(SIZE(PTA)) ::ZGAMMA
138 REAL, DIMENSION(SIZE(PTA)) ::ZRGL
139 REAL, DIMENSION(SIZE(PTA)) ::ZRSMIN
140 REAL, DIMENSION(SIZE(PTA)) ::ZDELTA
141 REAL, DIMENSION(SIZE(PTA)) ::ZWRMAX
142 REAL, DIMENSION(SIZE(PTA)) ::ZCLS_WIND_ZON
143 REAL, DIMENSION(SIZE(PTA)) ::ZCLS_WIND_MER
144 REAL, DIMENSION(SIZE(PTA)) ::ZSUM
145 REAL, DIMENSION(SIZE(PTA)) :: ZLEG_DELTA ! soil evaporation delta fn
146 REAL, DIMENSION(SIZE(PTA)) :: ZLEGI_DELTA ! soil sublimation delta fn
147 REAL, DIMENSION(SIZE(PTA)) :: ZLVTT
148 !
149 REAL, DIMENSION(:,:), ALLOCATABLE ::ZSNOWSWE
150 REAL, DIMENSION(:,:), ALLOCATABLE ::ZSNOWRHO
151 REAL, DIMENSION(:,:), ALLOCATABLE ::ZSUM_LAYER
152 !
153 INTEGER :: JSWB
154 INTEGER :: JL, JI, JP, IMASK
155 INTEGER :: ISNOW_LAYER
156 !
157 REAL, DIMENSION(SIZE(PTA),IO%NPATCH) ::ZWSNOW
158 REAL(KIND=JPRB) :: ZHOOK_HANDLE
159 !-------------------------------------------------------------------------------------
160 !
161 IF (lhook) CALL dr_hook('INIT_ISBA_SBL',0,zhook_handle)
162 !
163 zts(:) = 0.
164 zwg(:) = 0.
165 zwgi(:) = 0.
166 zz0(:) = 0.
167 !
168 zz0h(:) = 0.
169 zveg(:) = 0.
170 !
171 zresa(:) = 0.
172 !
173 zrgl(:) = 0.
174 zrsmin(:) = 0.
175 zgamma(:) = 0.
176 !
177 !Means over patches
178 DO jp = 1,io%NPATCH
179  pk => np%AL(jp)
180  pek => npe%AL(jp)
181 
182  DO ji=1,pk%NSIZE_P
183  imask = pk%NR_P(ji)
184  !
185  zts(imask) = zts(imask) + pek%XTG (ji,1) * pk%XPATCH(ji)
186  zwg(imask) = zwg(imask) + pek%XWG (ji,1) * pk%XPATCH(ji)
187  zwgi(imask) = zwgi(imask) + pek%XWGI(ji,1) * pk%XPATCH(ji)
188  zz0(imask) = zz0(imask) + pek%XZ0(ji) * pk%XPATCH(ji)
189  !
190  zz0h(imask) = zz0h(imask) + pk%XPATCH(ji) * pek%XZ0 (ji) / pk%XZ0_O_Z0H(ji)
191  zveg(imask) = zveg(imask) + pk%XPATCH(ji) * pek%XVEG(ji)
192  !
193  zresa(imask) = zresa(imask) + pk%XPATCH(ji) * pek%XRESA(ji)
194  !
195  zrgl(imask) = zrgl(imask) + pk%XPATCH(ji) * pek%XRGL (ji)
196  zrsmin(imask) = zrsmin(imask) + pk%XPATCH(ji) * pek%XRSMIN(ji)
197  zgamma(imask) = zgamma(imask) + pk%XPATCH(ji) * pek%XGAMMA(ji)
198  !
199  ENDDO
200 ENDDO
201 !
202 !We choose to set ZZ0EFF and ZZ0_WITH_SNOW equal to ZZ0
203 zz0eff(:) = zz0(:)
204 zz0_with_snow(:) = zz0(:)
205 !
206 !
207 zlai(:) = 0.
208 zwrmax_cf(:) = 0.
209 zwr(:) = 0.
210 !
211 DO jp = 1,io%NPATCH
212  pk => np%AL(jp)
213  pek => npe%AL(jp)
214 
215  DO ji=1,pk%NSIZE_P
216  imask = pk%NR_P(ji)
217  !
218  IF (zveg(ji)>0.) THEN
219  zlai(imask) = zlai(imask) + pk%XPATCH(ji) * pek%XVEG(ji) * pek%XLAI(ji)
220  zwrmax_cf(imask) = zwrmax_cf(imask) + pk%XPATCH(ji) * pek%XVEG(ji) * pek%XWRMAX_CF(ji)
221  zwr(imask) = zwr(imask) + pk%XPATCH(ji) * pek%XVEG(ji) * pek%XWR(ji)
222  ELSEIF (jp==1) THEN
223  zlai(imask) = pek%XLAI (ji)
224  zwrmax_cf(imask) = pek%XWRMAX_CF(ji)
225  zwr(imask) = pek%XWR (ji)
226  ENDIF
227  !
228  ENDDO
229 ENDDO
230 !
231 WHERE (zveg(:)>0)
232  zlai(:)= zlai(:) / zveg(:)
233  zwrmax_cf(:)= zwrmax_cf(:) / zveg(:)
234  zwr(:)= zwr(:) / zveg(:)
235 ENDWHERE
236 !
237 !
238 isnow_layer = npe%AL(1)%TSNOW%NLAYER
239 ALLOCATE(zsnowswe(SIZE(pta),isnow_layer))
240 ALLOCATE(zsum_layer(SIZE(pta),isnow_layer))
241 ALLOCATE(zsnowrho(SIZE(pta),isnow_layer))
242 zsnowswe(:,:) = 0.
243 zsum_layer(:,:) = 0.
244 zsnowrho(:,:) = 0.
245 !
246 DO jl=1,isnow_layer
247  !
248  DO jp = 1,io%NPATCH
249  pk => np%AL(jp)
250  pek => npe%AL(jp)
251 
252  DO ji=1,pk%NSIZE_P
253  imask = pk%NR_P(ji)
254  !
255  IF (pek%TSNOW%WSNOW(ji,jl)>0.) THEN
256  zsnowswe(imask,jl) = zsnowswe(imask,jl) + pk%XPATCH(ji) * pek%TSNOW%WSNOW(ji,jl)
257  zsum_layer(imask,jl) = zsum_layer(imask,jl) + pk%XPATCH(ji)
258  ENDIF
259  !
260  ENDDO
261  ENDDO
262  !
263  DO jp = 1,io%NPATCH
264  pk => np%AL(jp)
265  pek => npe%AL(jp)
266 
267  DO ji=1,pk%NSIZE_P
268  imask = pk%NR_P(ji)
269  !
270  IF (zsum_layer(imask,jl)>0.) THEN
271  zsnowrho(imask,jl) = zsnowrho(imask,jl) + pk%XPATCH(ji) * pek%TSNOW%RHO(ji,jl)
272  ELSEIF (jp==1) THEN
273  zsnowrho(imask,jl) = pek%TSNOW%RHO(ji,jl)
274  ENDIF
275  !
276  ENDDO
277  ENDDO
278  !
279 END DO
280 !
281 WHERE (zsnowswe(:,:)==0.) zsnowrho(:,:) = xundef
282 WHERE (zsum_layer(:,:)>0.)
283  zsnowrho(:,:) = zsnowrho(:,:) / zsum_layer(:,:)
284 END WHERE
285 !
286 zsum(:)=sum(zsum_layer(:,:),dim=2)
287 DEALLOCATE(zsum_layer)
288 !
289 zwsnow(:,:) = 0.
290 DO jl = 1,isnow_layer
291  DO jp = 1,io%NPATCH
292  pk => np%AL(jp)
293  pek => npe%AL(jp)
294 
295  DO ji=1,pk%NSIZE_P
296  imask = pk%NR_P(ji)
297  !
298  zwsnow(imask,jp) = zwsnow(imask,jp) + pek%TSNOW%WSNOW(ji,jl)
299  !
300  ENDDO
301  ENDDO
302 ENDDO
303 !
304 zsnowalb(:) = 0.
305 DO jp = 1,io%NPATCH
306  pk => np%AL(jp)
307  pek => npe%AL(jp)
308 
309  DO ji=1,pk%NSIZE_P
310  imask = pk%NR_P(ji)
311  !
312 
313  IF (zsum(imask)>0.) THEN
314  IF (zwsnow(imask,jp)>0.) THEN
315  zsnowalb(imask) = zsnowalb(imask) + pk%XPATCH(ji) * pek%TSNOW%ALB(ji)
316  ENDIF
317  ELSEIF (jp==1) THEN
318  zsnowalb(imask) = pek%TSNOW%ALB(ji)
319  ENDIF
320  !
321  ENDDO
322 ENDDO
323 !
324 WHERE(zsum(:)>0)
325  zsnowalb(:) = zsnowalb(:) / zsum(:)
326 ENDWHERE
327 !
328 !
329 zexna(:) = (ppa(:)/xp00)**(xrd/xcpd)
330 zexns(:) = (pps(:)/xp00)**(xrd/xcpd)
331 zqa(:) = pqa(:) / prhoa(:)
332 zwind(:) = sqrt(pu**2+pv**2)
333 !
334 !We compute the snow fractions
335  CALL isba_snow_frac(pek%TSNOW%SCHEME, zsnowswe, zsnowrho, zsnowalb, &
336  zveg, zlai, zz0, zpsn, zpsnv_a, zpsng, zpsnv )
337 !
338 DEALLOCATE(zsnowswe, zsnowrho)
339 !
340 !We compute total shortwave incoming radiation needed by veg
341 zp_global_sw(:) = 0.
342 DO jswb=1,SIZE(psw_bands)
343  zp_global_sw(:) = zp_global_sw(:) + (pdir_sw(:,jswb) + psca_sw(:,jswb))
344 END DO
345 !
346 !
347 !We choose the case HPHOTO=='NON' and a humid soil (ZF2=1) to compute ZRS
348 zf2(:)=1.0
349  CALL veg(zp_global_sw, pta, zqa, pps, zrgl, zlai, zrsmin, zgamma, zf2, zrs)
350 !Calculation of ZDELTA
351  CALL wet_leaves_frac(zwr, zveg, zwrmax_cf, zz0_with_snow, zlai, zwrmax, zdelta)
352 !
353 !We choose the case LFLOOD=false
354 zffg(:) = 0.0
355 zffgnos(:) = 0.0
356 zffv(:) = 0.0
357 zffvnos(:) = 0.0
358 zff(:) = 0.0
359 !
360 zf5(:) = 1.0
361 zlvtt(:) = xlvtt
362 !
363 zp_slope_cos(:) = 1./sqrt(1.+psso_slope(:)**2)
364 IF (lnosof) zp_slope_cos(:) = 1.0
365 !
366 !We compute ZCD, ZCH and ZRI
367  CALL drag(io%CISBA, pek%TSNOW%SCHEME, io%CCPSURF, ptstep, zts, zwg, zwgi, &
368  zexns, zexna, pta, zwind, zqa, prain, psnow, pps, zrs, zveg, &
369  zz0, zz0eff, zz0h, k%XWFC(:,1), k%XWSAT(:,1), zpsng, zpsnv, &
370  pzref, puref, zp_slope_cos, zdelta, zf5, zresa, zch, zcd, zcdn, &
371  zri, zhug, zhugi, zhv, zhu, zcps, zqs, zffg, zffv, zff, zffgnos,&
372  zffvnos, zleg_delta, zlegi_delta, zwr, prhoa, zlvtt )
373 !
374 !Initialisation of T, Q, Wind and TKE on all canopy levels
375 DO jl=1,sb%NLVL
376  !
377  CALL cls_tq(pta, zqa, ppa, pps, pzref, zcd, zch, zri, zts, zhu, zz0h, &
378  sb%XZ(:,jl), ztnm, zqnm, zhunm )
379  !
380  sb%XT(:,jl)=ztnm
381  sb%XQ(:,jl)=zqnm
382  !
383  CALL cls_wind(pu, pv, puref, zcd, zcdn, zri, sb%XZ(:,jl), &
384  zcls_wind_zon, zcls_wind_mer )
385  !
386  sb%XU (:,jl) = sqrt( zcls_wind_zon(:)**2 + zcls_wind_mer(:)**2 )
387  sb%XTKE (:,jl) = xalpsbl * zcd(:) * ( pu(:)**2 + pv(:)**2 )
388  sb%XP (:,jl) = ppa(:) + xg * prhoa(:) * (sb%XZ(:,sb%NLVL) - sb%XZ(:,jl))
389  !
390 ENDDO
391 !
392 IF (lhook) CALL dr_hook('INIT_ISBA_SBL',1,zhook_handle)
393 !
394 END SUBROUTINE init_isba_sbl
subroutine init_isba_sbl(IO, K, NP, NPE, SB, PTSTEP, PPA, PPS, PTA, PQA, PRHOA, PU, PV, PDIR_SW, PSCA_SW, PSW_BANDS, PRAIN, PSNOW, PZREF, PUREF, PSSO_SLOPE)
subroutine cls_wind(PZONA, PMERA, PHW, PCD, PCDN, PRI, PHV, PZON10M, PMER10M)
Definition: cls_wind.F90:7
real, save xcpd
Definition: modd_csts.F90:63
subroutine isba_snow_frac(HSNOW, PWSNOW, PRSNOW, PASNOW, PVEG, PLAI, PZ0, PPSN, PPSNV_A, PPSNG, P
real, save xlvtt
Definition: modd_csts.F90:70
real, parameter xundef
real, save xrd
Definition: modd_csts.F90:62
subroutine wet_leaves_frac(PWRM, PVEG, PWRMAX_CF, PZ0, PLAI, PWRMAX, PDELTA)
real, save xg
Definition: modd_csts.F90:55
integer, parameter jprb
Definition: parkind1.F90:32
intent(out) overrides sub arrays one Sort by the least significant key first sum(iindex(1:n))
logical lhook
Definition: yomhook.F90:15
subroutine veg(PSW_RAD, PTA, PQA, PPS, PRGL, PLAI, PRSMIN, PGAMMA, PF2, PRS)
Definition: veg.F90:8
real, save xp00
Definition: modd_csts.F90:57
subroutine drag(HISBA, HSNOW_ISBA, HCPSURF, PTSTEP, PTG, PWG, PWGI, PEXNS, PEXNA, PTA, PVMOD, PQA, PRR, PSR, PPS, PRS, PVEG, PZ0, PZ0EFF, PZ0H, PWFC, PWSAT, PPSNG, PPSNV, PZREF, PUREF, PDIRCOSZW, PDELTA, PF5, PRA, PCH, PCD, PCDN, PRI, PHUG, PHUGI, PHV, PHU, PCPS, PQS, PFFG, PFFV, PFF, PFFG_NOSNOW, PFFV_NOSNOW, PLEG_DELTA, PLEGI_DELTA, PWR, PRHOA, PLVTT, PQSAT)
Definition: drag.F90:13
subroutine cls_tq(PTA, PQA, PPA, PPS, PHT, PCD, PCH, PRI, PTS, PHU, PZ0H, PH, PTNM, PQNM, PHUNM)
Definition: cls_tq.F90:8