SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
prep_ver_isba.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_isba (I)
7 ! #################################################################################
8 !
9 !!**** *PREP_VER_ISBA* - 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 !! S. Riette 04/2010 Modification of XTG corrections after freezing
30 !! Y. Seity 02/2016 Add limits in Force-Restore case (WG2 contains WG1)
31 !!------------------------------------------------------------------
32 !
33 
34 !
35 !
36 USE modd_isba_n, ONLY : isba_t
37 !
38 USE modd_isba_par, ONLY : xwgmin
39 USE modd_surf_par, ONLY : xundef
40 USE modd_prep, ONLY : xzs_ls, xt_clim_grad
41 USE modd_prep_isba, ONLY : lsnow_ideal
42 USE modd_csts, ONLY : xtt, xday, xlmtt, xrholw
43 !
44 USE mode_thermos
45 USE modi_prep_ver_snow
46 !
47 !
48 USE yomhook ,ONLY : lhook, dr_hook
49 USE parkind1 ,ONLY : jprb
50 !
51 IMPLICIT NONE
52 !
53 !* 0.1 declarations of arguments
54 !
55 !
56 !* 0.2 declarations of local variables
57 !
58 !
59 TYPE(isba_t), INTENT(INOUT) :: i
60 !
61 INTEGER :: jl ! loop counter on layers
62 INTEGER :: jp ! loop counter on patches
63 INTEGER :: iwork ! Work integer
64 !
65 REAL, DIMENSION(:), ALLOCATABLE :: zwgtot ! total water content
66 REAL, DIMENSION(:), ALLOCATABLE :: zdw ! variation of water in soil
67 REAL, DIMENSION(:), ALLOCATABLE :: zzsfreeze ! altitude where soil temperature equals XTT
68 INTEGER :: ideep_soil! layer corresponding to deep soil temperature
69 !
70 REAL, DIMENSION(:,:,:), ALLOCATABLE :: zwgi_clim_grad ! ice content vertical gradient
71 !
72 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ztg_ls! temperature on initial orography
73 !
74 REAL :: zgradx = 5.e-4 ! slope of ice content gradient
75 REAL :: zh0 = 5.e-1 ! constant used to define ice content gradient
76 REAL(KIND=JPRB) :: zhook_handle
77 !-------------------------------------------------------------------------------------
78 !
79 !* 1.0 Ice content climatologic gradient
80 !
81 IF (lhook) CALL dr_hook('PREP_VER_ISBA',0,zhook_handle)
82 ALLOCATE(zwgi_clim_grad(SIZE(i%XWG,1),SIZE(i%XWG,2),SIZE(i%XWG,3)))
83 !
84 zwgi_clim_grad(:,:,:) = zgradx * exp( - i%XDG(:,:,:) / zh0 )
85 !-------------------------------------------------------------------------------------
86 !
87 !* 1.1 Temperature profile
88 !
89 ALLOCATE(ztg_ls(SIZE(i%XTG,1),SIZE(i%XTG,2),SIZE(i%XTG,3)))
90 ztg_ls(:,:,:) = i%XTG(:,:,:)
91 !
92 DO jp=1,SIZE(i%XTG,3)
93  DO jl=1,SIZE(i%XTG,2)
94  WHERE(i%XTG(:,jl,jp)/=xundef) &
95  i%XTG(:,jl,jp) = i%XTG(:,jl,jp) + xt_clim_grad * (i%XZS - xzs_ls)
96  END DO
97 END DO
98 !
99 !-------------------------------------------------------------------------------------
100 !
101 !* 1.2 Water and ice in the soil
102 !
103 ALLOCATE(zzsfreeze(SIZE(i%XWG,1)))
104 ALLOCATE(zwgtot(SIZE(i%XWG,1)))
105 ALLOCATE(zdw(SIZE(i%XWG,1)))
106 !
107 !* general case
108 !
109 IF(i%LTEMP_ARP)THEN
110  iwork=SIZE(i%XWG,2)
111 ELSE
112  iwork=SIZE(i%XTG,2)
113 ENDIF
114 !
115 DO jp=1,SIZE(i%XWG,3)
116  !
117  DO jl=1,iwork
118  !
119  zdw(:) = 0.
120  ! altitude where deep soil freezes (diurnal surface response is not treated)
121  zzsfreeze(:) = i%XZS + (xtt - i%XTG(:,jl,jp)) / xt_clim_grad
122  !
123  WHERE(i%XTG(:,jl,jp)/=xundef)
124  !
125  WHERE (ztg_ls(:,jl,jp) < xtt)
126  !
127  WHERE (i%XZS <= xzs_ls)
128  !
129  WHERE (i%XZS > zzsfreeze)
130  zdw(:) = zwgi_clim_grad(:,jl,jp) * (i%XZS - xzs_ls)
131  ELSEWHERE
132  zdw(:) = zwgi_clim_grad(:,jl,jp) * (zzsfreeze - xzs_ls) + zgradx * (i%XZS - zzsfreeze)
133  ENDWHERE
134  !
135  ELSEWHERE
136  !
137  zdw(:) = zwgi_clim_grad(:,jl,jp) * (i%XZS - xzs_ls)
138  !
139  ENDWHERE
140  !
141  ELSEWHERE
142  !
143  WHERE (i%XZS <= xzs_ls)
144  !
145  zdw(:) = zgradx * (i%XZS - xzs_ls)
146  !
147  ELSEWHERE
148  !
149  zdw(:) = zwgi_clim_grad(:,jl,jp) * (i%XZS - zzsfreeze)
150  !
151  END WHERE
152  !
153  END WHERE
154  !
155  zwgtot(:) = xundef
156  !
157  WHERE(i%XWG(:,jl,jp)/=xundef)
158  zwgtot(:) = i%XWG(:,jl,jp) + i%XWGI(:,jl,jp)
159  ENDWHERE
160  !
161  WHERE(i%XWG(:,jl,jp)/=xundef)
162  i%XWGI(:,jl,jp) = i%XWGI(:,jl,jp) + zdw(:)
163  i%XWG (:,jl,jp) = i%XWG (:,jl,jp) - zdw(:)
164  ENDWHERE
165  !
166  WHERE (i%XWGI(:,jl,jp)<0.0.AND.i%XWGI(:,jl,jp)/=xundef)
167  i%XWGI(:,jl,jp) = 0.
168  i%XWG (:,jl,jp) = zwgtot(:)
169  END WHERE
170  !
171  WHERE (i%XWG(:,jl,jp)<xwgmin.AND.i%XWG(:,jl,jp)/=xundef)
172  i%XWG (:,jl,jp) = xwgmin
173  i%XWGI(:,jl,jp) = zwgtot(:) - xwgmin
174  END WHERE
175  !
176  WHERE(i%XWGI(:,jl,jp)>0.0.AND.i%XWGI(:,jl,jp)/=xundef)
177  i%XTG(:,jl,jp) = min(xtt,i%XTG(:,jl,jp))
178  ELSEWHERE
179  i%XTG(:,jl,jp) = max(xtt,i%XTG(:,jl,jp))
180  ENDWHERE
181  !
182  END WHERE
183  !
184  END DO
185  !
186 END DO
187 
188 !
189 !* limits in force-restore case
190 !
191 IF (i%CISBA=='2-L'.OR.i%CISBA=='3-L') THEN
192 i%XWG(:,2,:)=max(i%XWG(:,1,:)*i%XDG(:,1,:),i%XWG(:,2,:)*i%XDG(:,2,:))/i%XDG(:,2,:)
193 i%XWGI(:,2,:)=max(i%XWGI(:,1,:)*i%XDG(:,1,:),i%XWGI(:,2,:)*i%XDG(:,2,:))/i%XDG(:,2,:)
194 ENDIF
195 IF (i%CISBA=='3-L') THEN
196  DO jp=1,SIZE(i%XWG,3)
197  WHERE (i%XWGI(:,3,jp) /= xundef)
198  i%XWG (:,3,jp) = i%XWG(:,3,jp)+i%XWGI(:,3,jp)
199  i%XWGI(:,3,jp) = 0.
200  i%XTG (:,3,jp) = ztg_ls(:,3,jp) + xt_clim_grad * (i%XZS - xzs_ls)
201  END WHERE
202  IF(i%LTEMP_ARP)THEN
203  i%XTG (:,4:SIZE(i%XTG,2),jp) = ztg_ls(:,4:SIZE(i%XTG,2),jp)
204  ENDIF
205  END DO
206 ELSEIF(i%CISBA=='2-L'.AND.i%LTEMP_ARP) THEN
207  DO jp=1,SIZE(i%XWG,3)
208  i%XTG (:,3:SIZE(i%XTG,2),jp) = ztg_ls(:,3:SIZE(i%XTG,2),jp)
209  END DO
210 END IF
211 !
212 DEALLOCATE(zzsfreeze)
213 DEALLOCATE(zwgi_clim_grad)
214 DEALLOCATE(zwgtot )
215 DEALLOCATE(zdw )
216 !
217 !* masks where fields are not defined
218 WHERE (i%XTG(:,1:SIZE(i%XWG,2),:) == xundef)
219  i%XWG (:,:,:) = xundef
220  i%XWGI(:,:,:) = xundef
221 END WHERE
222 !
223 !-------------------------------------------------------------------------------------
224 !
225 !* 1.4 Snow variables
226 !
227 !* vertical shift
228 IF (.NOT.lsnow_ideal) THEN
229  IF (i%CISBA=='DIF') THEN
230  ideep_soil = i%NGROUND_LAYER
231  ELSE
232  ideep_soil = 2
233  END IF
234  CALL prep_ver_snow(i%TSNOW,xzs_ls,i%XZS,ztg_ls,i%XTG,ideep_soil)
235 ENDIF
236 !
237 !-------------------------------------------------------------------------------------
238 !
239 !* 2. Deallocation of large-scale orography
240 !
241 DEALLOCATE(ztg_ls)
242 IF (lhook) CALL dr_hook('PREP_VER_ISBA',1,zhook_handle)
243 !-------------------------------------------------------------------------------------
244 !
245 END SUBROUTINE prep_ver_isba
subroutine prep_ver_snow(TPSNOW, PZS_LS, PZS, PTG_LS, PTG, KDEEP_SOIL)
subroutine prep_ver_isba(I)