SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
prep_ver_teb_garden.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 prep_ver_teb_garden (TGD, TGDO, TGDP, TOP, TVG)
7 ! #################################################################################
8 !
9 !!**** *PREP_VER_TEB_GARDEN* - change in ISBA fields due to altitude change
10 !!
11 !! PURPOSE
12 !! -------
13 !
14 !!** METHOD
15 !! ------
16 !!
17 !! REFERENCE
18 !! ---------
19 !!
20 !!
21 !! AUTHOR
22 !! ------
23 !! V. Masson
24 !!
25 !! MODIFICATIONS
26 !! -------------
27 !! Original 01/2004
28 !! Modified by B. Decharme (01/2009), Optional Arpege deep soil temperature initialization
29 !!------------------------------------------------------------------
30 !
31 
32 !
33 !
39 !
40 USE modd_isba_par, ONLY : xwgmin
41 USE modd_surf_par, ONLY : xundef
42 USE modd_prep, ONLY : xzs_ls, xt_clim_grad
43 USE modd_csts, ONLY : xtt, xday, xlmtt, xrholw
44 !
45 USE mode_thermos
46 USE modi_prep_ver_snow
47 !
48 !
49 USE yomhook ,ONLY : lhook, dr_hook
50 USE parkind1 ,ONLY : jprb
51 !
52 IMPLICIT NONE
53 !
54 !* 0.1 declarations of arguments
55 !
56 !
57 !* 0.2 declarations of local variables
58 !
59 !
60 TYPE(teb_garden_t), INTENT(INOUT) :: tgd
61 TYPE(teb_garden_options_t), INTENT(INOUT) :: tgdo
62 TYPE(teb_garden_pgd_t), INTENT(INOUT) :: tgdp
63 TYPE(teb_options_t), INTENT(INOUT) :: top
64 TYPE(teb_veg_options_t), INTENT(INOUT) :: tvg
65 !
66 INTEGER :: jl ! loop counter on layers
67 INTEGER :: iwork ! Work integer
68 !
69 REAL, DIMENSION(:), ALLOCATABLE :: zwgtot ! total water content
70 REAL, DIMENSION(:), ALLOCATABLE :: zdw ! variation of water in soil
71 REAL, DIMENSION(:), ALLOCATABLE :: zzsfreeze ! altitude where soil temperature equals XTT
72 INTEGER :: ideep_soil! layer corresponding to deep soil temperature
73 !
74 REAL, DIMENSION(:,:), ALLOCATABLE :: zwgi_clim_grad ! ice content vertical gradient
75 !
76 REAL, DIMENSION(:,:), ALLOCATABLE :: ztg_ls! temperature on initial orography
77 !
78 REAL :: zgradx = 5.e-4 ! slope of ice content gradient
79 REAL :: zh0 = 5.e-1 ! constant used to define ice content gradient
80 REAL(KIND=JPRB) :: zhook_handle
81 !-------------------------------------------------------------------------------------
82 !
83 !* 1.0 Ice content climatologic gradient
84 !
85 IF (lhook) CALL dr_hook('PREP_VER_TEB_GARDEN',0,zhook_handle)
86 ALLOCATE(zwgi_clim_grad(SIZE(tgd%CUR%XWG,1),SIZE(tgd%CUR%XWG,2)))
87 !
88 zwgi_clim_grad(:,:) = zgradx * exp( - tgdp%XDG(:,:) / zh0 )
89 !-------------------------------------------------------------------------------------
90 !
91 !* 1.1 Temperature profile
92 !
93 ALLOCATE(ztg_ls(SIZE(tgd%CUR%XTG,1),SIZE(tgd%CUR%XTG,2)))
94 ztg_ls(:,:) = tgd%CUR%XTG(:,:)
95 !
96 DO jl=1,SIZE(tgd%CUR%XTG,2)
97  WHERE(tgd%CUR%XTG(:,jl)/=xundef) &
98  tgd%CUR%XTG(:,jl) = tgd%CUR%XTG(:,jl) + xt_clim_grad * (top%XZS - xzs_ls)
99 END DO
100 !
101 !-------------------------------------------------------------------------------------
102 !
103 !* 1.2 Water and ice in the soil
104 !
105 ALLOCATE(zzsfreeze(SIZE(tgd%CUR%XWG,1)))
106 ALLOCATE(zwgtot(SIZE(tgd%CUR%XWG,1)))
107 ALLOCATE(zdw(SIZE(tgd%CUR%XWG,1)))
108 !
109 !* general case
110 !
111 iwork=SIZE(tgd%CUR%XTG,2)
112 !
113 DO jl=1,iwork
114  !
115  zdw(:) = 0.
116  ! altitude where deep soil freezes (diurnal surface response is not treated)
117  zzsfreeze(:) = top%XZS + (xtt - tgd%CUR%XTG(:,jl)) / xt_clim_grad
118  !
119  WHERE(tgd%CUR%XTG(:,jl)/=xundef)
120  !
121  WHERE (ztg_ls(:,jl) < xtt)
122  !
123  WHERE (top%XZS <= xzs_ls)
124  !
125  WHERE (top%XZS > zzsfreeze)
126  zdw(:) = zwgi_clim_grad(:,jl) * (top%XZS - xzs_ls)
127  ELSEWHERE
128  zdw(:) = zwgi_clim_grad(:,jl) * (zzsfreeze - xzs_ls) + zgradx * (top%XZS - zzsfreeze)
129  ENDWHERE
130  !
131  ELSEWHERE
132  !
133  zdw(:) = zwgi_clim_grad(:,jl) * (top%XZS - xzs_ls)
134  !
135  ENDWHERE
136  !
137  ELSEWHERE
138  !
139  WHERE (top%XZS <= xzs_ls)
140  !
141  zdw(:) = zgradx * (top%XZS - xzs_ls)
142  !
143  ELSEWHERE
144  !
145  zdw(:) = zwgi_clim_grad(:,jl) * (top%XZS - zzsfreeze)
146  !
147  END WHERE
148  !
149  END WHERE
150  !
151  zwgtot(:) = xundef
152  !
153  WHERE(tgd%CUR%XWG(:,jl)/=xundef)
154  zwgtot(:) = tgd%CUR%XWG(:,jl) + tgd%CUR%XWGI(:,jl)
155  ENDWHERE
156  !
157  WHERE(tgd%CUR%XWG(:,jl)/=xundef)
158  tgd%CUR%XWGI(:,jl) = tgd%CUR%XWGI(:,jl) + zdw(:)
159  tgd%CUR%XWG (:,jl) = tgd%CUR%XWG (:,jl) - zdw(:)
160  ENDWHERE
161  !
162  WHERE (tgd%CUR%XWGI(:,jl) < 0..AND.tgd%CUR%XWGI(:,jl)/=xundef)
163  tgd%CUR%XWGI(:,jl) = 0.
164  tgd%CUR%XWG (:,jl) = zwgtot(:)
165  END WHERE
166  !
167  WHERE (tgd%CUR%XWG(:,jl) < xwgmin.AND.tgd%CUR%XWG(:,jl)/=xundef)
168  tgd%CUR%XWG (:,jl) = xwgmin
169  tgd%CUR%XWGI(:,jl) = zwgtot(:) - xwgmin
170  END WHERE
171  !
172  WHERE(tgd%CUR%XWGI(:,jl) > 0..AND.tgd%CUR%XWGI(:,jl)/=xundef)
173  tgd%CUR%XTG(:,jl) = min(xtt,tgd%CUR%XTG(:,jl))
174  ELSEWHERE
175  tgd%CUR%XTG(:,jl) = max(xtt,tgd%CUR%XTG(:,jl))
176  ENDWHERE
177  !
178  ENDWHERE
179  !
180 END DO
181 !
182 !* limits in force-restore case
183 !
184 IF (tvg%CISBA=='3-L') THEN
185  WHERE (tgd%CUR%XWGI(:,3) /= xundef)
186  tgd%CUR%XWG (:,3) = tgd%CUR%XWG(:,3)+tgd%CUR%XWGI(:,3)
187  tgd%CUR%XWGI(:,3) = 0.
188  tgd%CUR%XTG (:,3) = ztg_ls(:,3)
189  END WHERE
190 END IF
191 !
192 DEALLOCATE(zzsfreeze)
193 DEALLOCATE(zwgi_clim_grad)
194 DEALLOCATE(zwgtot )
195 DEALLOCATE(zdw )
196 !
197 !* masks where fields are not defined
198 WHERE (tgd%CUR%XTG(:,1:SIZE(tgd%CUR%XWG,2)) == xundef)
199  tgd%CUR%XWG (:,:) = xundef
200  tgd%CUR%XWGI(:,:) = xundef
201 END WHERE
202 !
203 !-------------------------------------------------------------------------------------
204 !
205 !* 1.4 Snow variables
206 !
207 !* vertical shift
208 IF (tvg%CISBA=='DIF') THEN
209  ideep_soil = tgdo%NGROUND_LAYER
210 ELSE
211  ideep_soil = 2
212 END IF
213  CALL prep_ver_snow(tgd%CUR%TSNOW,xzs_ls,top%XZS,spread(ztg_ls,3,1),spread(tgd%CUR%XTG,3,1),ideep_soil)
214 !
215 !-------------------------------------------------------------------------------------
216 !
217 !* 2. Deallocation of large-scale orography
218 !
219 DEALLOCATE(ztg_ls)
220 IF (lhook) CALL dr_hook('PREP_VER_TEB_GARDEN',1,zhook_handle)
221 !-------------------------------------------------------------------------------------
222 !
223 END SUBROUTINE prep_ver_teb_garden
subroutine prep_ver_snow(TPSNOW, PZS_LS, PZS, PTG_LS, PTG, KDEEP_SOIL)
subroutine prep_ver_teb_garden(TGD, TGDO, TGDP, TOP, TVG)