SURFEX v8.1
General documentation of Surfex
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 (IO, NPE, PZS, NP)
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 !
35 !
36 USE modd_isba_par, ONLY : xwgmin
37 USE modd_surf_par, ONLY : xundef
38 USE modd_prep, ONLY : xzs_ls, xt_clim_grad
39 USE modd_prep_isba, ONLY : lsnow_ideal
40 USE modd_csts, ONLY : xtt, xday, xlmtt, xrholw
41 !
42 USE mode_thermos
43 USE modi_prep_ver_snow
45 !
46 USE yomhook ,ONLY : lhook, dr_hook
47 USE parkind1 ,ONLY : jprb
48 !
49 IMPLICIT NONE
50 !
51 !* 0.1 declarations of arguments
52 !
53 !
54 !* 0.2 declarations of local variables
55 !
56 !
57 TYPE(isba_options_t), INTENT(INOUT) :: IO
58 TYPE(isba_npe_t), INTENT(INOUT) :: NPE
59 TYPE(isba_np_t), INTENT(INOUT) :: NP
60 REAL, DIMENSION(:), INTENT(IN) :: PZS
61 !
62 TYPE(isba_p_t), POINTER :: PK
63 TYPE(isba_pe_t), POINTER :: PEK
64 !
65 INTEGER :: JL ! loop counter on layers
66 INTEGER :: JP ! loop counter on patches
67 INTEGER :: IWORK ! Work integer
68 !
69 REAL, DIMENSION(:), ALLOCATABLE :: ZZS, ZZS_LS
70 REAL, DIMENSION(:), ALLOCATABLE :: ZWGTOT ! total water content
71 REAL, DIMENSION(:), ALLOCATABLE :: ZDW ! variation of water in soil
72 REAL, DIMENSION(:), ALLOCATABLE :: ZZSFREEZE ! altitude where soil temperature equals XTT
73 INTEGER :: IDEEP_SOIL! layer corresponding to deep soil temperature
74 !
75 REAL, DIMENSION(:,:), ALLOCATABLE :: ZWGI_CLIM_GRAD ! ice content vertical gradient
76 !
77 REAL, DIMENSION(:,:), ALLOCATABLE :: ZTG_LS! temperature on initial orography
78 !
79 REAL :: ZGRADX = 5.e-4 ! slope of ice content gradient
80 REAL :: ZH0 = 5.e-1 ! constant used to define ice content gradient
81 REAL(KIND=JPRB) :: ZHOOK_HANDLE
82 !-------------------------------------------------------------------------------------
83 !
84 !* 1.0 Ice content climatologic gradient
85 !
86 IF (lhook) CALL dr_hook('PREP_VER_ISBA',0,zhook_handle)
87 !
88 !
89 IF (io%CISBA=='DIF') THEN
90  ideep_soil = io%NGROUND_LAYER
91 ELSE
92  ideep_soil = 2
93 END IF
94 !
95 DO jp = 1,io%NPATCH
96  !
97  pek => npe%AL(jp)
98  pk => np%AL(jp)
99  !
100  IF(io%LTEMP_ARP)THEN
101  iwork=SIZE(pek%XWG,2)
102  ELSE
103  iwork=SIZE(pek%XTG,2)
104  ENDIF
105  !
106  ALLOCATE(zzs(pk%NSIZE_P))
107  CALL pack_same_rank(pk%NR_P,pzs,zzs)
108  ALLOCATE(zzs_ls(pk%NSIZE_P))
109  CALL pack_same_rank(pk%NR_P,xzs_ls,zzs_ls)
110  !
111  ALLOCATE(zwgi_clim_grad(SIZE(pek%XWG,1),SIZE(pek%XWG,2)))
112  !
113  zwgi_clim_grad(:,:) = zgradx * exp( - pk%XDG(:,:) / zh0 )
114  !-------------------------------------------------------------------------------------
115  !
116  !* 1.1 Temperature profile
117  !
118  ALLOCATE(ztg_ls(SIZE(pek%XTG,1),SIZE(pek%XTG,2)))
119  ztg_ls(:,:) = pek%XTG(:,:)
120  !
121  DO jl=1,SIZE(pek%XTG,2)
122  WHERE(pek%XTG(:,jl)/=xundef) &
123  pek%XTG(:,jl) = pek%XTG(:,jl) + xt_clim_grad * (zzs - zzs_ls)
124  END DO
125  !
126  !-------------------------------------------------------------------------------------
127  !
128  !* 1.2 Water and ice in the soil
129  !
130  ALLOCATE(zzsfreeze(SIZE(pek%XWG,1)))
131  ALLOCATE(zwgtot(SIZE(pek%XWG,1)))
132  ALLOCATE(zdw(SIZE(pek%XWG,1)))
133  !
134  !* general case
135  !
136  DO jl=1,iwork
137  !
138  zdw(:) = 0.
139  ! altitude where deep soil freezes (diurnal surface response is not treated)
140  zzsfreeze(:) = zzs + (xtt - pek%XTG(:,jl)) / xt_clim_grad
141  !
142  WHERE(pek%XTG(:,jl)/=xundef)
143  !
144  WHERE (ztg_ls(:,jl) < xtt)
145  !
146  WHERE (zzs <= zzs_ls)
147  !
148  WHERE (zzs > zzsfreeze)
149  zdw(:) = zwgi_clim_grad(:,jl) * (zzs - zzs_ls)
150  ELSEWHERE
151  zdw(:) = zwgi_clim_grad(:,jl) * (zzsfreeze - zzs_ls) + zgradx * (zzs - zzsfreeze)
152  ENDWHERE
153  !
154  ELSEWHERE
155  !
156  zdw(:) = zwgi_clim_grad(:,jl) * (zzs - zzs_ls)
157  !
158  ENDWHERE
159  !
160  ELSEWHERE
161  !
162  WHERE (zzs <= zzs_ls)
163  !
164  zdw(:) = zgradx * (zzs - zzs_ls)
165  !
166  ELSEWHERE
167  !
168  zdw(:) = zwgi_clim_grad(:,jl) * (zzs - zzsfreeze)
169  !
170  END WHERE
171  !
172  END WHERE
173  !
174  zwgtot(:) = xundef
175  !
176  WHERE(pek%XWG(:,jl)/=xundef)
177  zwgtot(:) = pek%XWG(:,jl) + pek%XWGI(:,jl)
178  ENDWHERE
179  !
180  WHERE(pek%XWG(:,jl)/=xundef)
181  pek%XWGI(:,jl) = pek%XWGI(:,jl) + zdw(:)
182  pek%XWG (:,jl) = pek%XWG (:,jl) - zdw(:)
183  ENDWHERE
184  !
185  WHERE (pek%XWGI(:,jl)<0.0.AND.pek%XWGI(:,jl)/=xundef)
186  pek%XWGI(:,jl) = 0.
187  pek%XWG (:,jl) = zwgtot(:)
188  END WHERE
189  !
190  WHERE (pek%XWG(:,jl)<xwgmin.AND.pek%XWG(:,jl)/=xundef)
191  pek%XWG (:,jl) = xwgmin
192  pek%XWGI(:,jl) = zwgtot(:) - xwgmin
193  END WHERE
194  !
195  WHERE(pek%XWGI(:,jl)>0.0.AND.pek%XWGI(:,jl)/=xundef)
196  pek%XTG(:,jl) = min(xtt,pek%XTG(:,jl))
197  ELSEWHERE
198  pek%XTG(:,jl) = max(xtt,pek%XTG(:,jl))
199  ENDWHERE
200  !
201  END WHERE
202  !
203  END DO
204  !
205  !
206  !* limits in force-restore case
207  !
208  IF (io%CISBA=='2-L'.OR.io%CISBA=='3-L') THEN
209  pek%XWG (:,2) = max(pek%XWG (:,1)*pk%XDG(:,1),pek%XWG (:,2)*pk%XDG(:,2))/pk%XDG(:,2)
210  pek%XWGI(:,2) = max(pek%XWGI(:,1)*pk%XDG(:,1),pek%XWGI(:,2)*pk%XDG(:,2))/pk%XDG(:,2)
211  ENDIF
212  !
213  IF (io%CISBA=='3-L') THEN
214  !
215  WHERE (pek%XWGI(:,3) /= xundef)
216  pek%XWG (:,3) = pek%XWG(:,3)+pek%XWGI(:,3)
217  pek%XWGI(:,3) = 0.
218  pek%XTG (:,3) = ztg_ls(:,3) + xt_clim_grad * (zzs - zzs_ls)
219  END WHERE
220  IF(io%LTEMP_ARP)THEN
221  pek%XTG (:,4:SIZE(pek%XTG,2)) = ztg_ls(:,4:SIZE(pek%XTG,2))
222  ENDIF
223  !
224  ELSEIF(io%CISBA=='2-L'.AND.io%LTEMP_ARP) THEN
225  !
226  pek%XTG (:,3:SIZE(pek%XTG,2)) = ztg_ls(:,3:SIZE(pek%XTG,2))
227  !
228  ENDIF
229  !
230  !* masks where fields are not defined
231  WHERE (pek%XTG(:,1:SIZE(pek%XWG,2)) == xundef)
232  pek%XWG (:,:) = xundef
233  pek%XWGI(:,:) = xundef
234  END WHERE
235  !
236  IF (.NOT.lsnow_ideal) THEN
237  CALL prep_ver_snow(pek%TSNOW,zzs_ls,zzs,ztg_ls,pek%XTG,ideep_soil)
238  ENDIF
239 
240  DEALLOCATE(zzsfreeze)
241  DEALLOCATE(zwgi_clim_grad)
242  DEALLOCATE(zwgtot )
243  DEALLOCATE(zdw )
244  DEALLOCATE(ztg_ls, zzs, zzs_ls)
245  !
246 END DO
247 !
248 !
249 !-------------------------------------------------------------------------------------
250 !
251 !* 2. Deallocation of large-scale orography
252 !
253 IF (lhook) CALL dr_hook('PREP_VER_ISBA',1,zhook_handle)
254 !-------------------------------------------------------------------------------------
255 !
256 END SUBROUTINE prep_ver_isba
subroutine prep_ver_snow(TPSNOW, PZS_LS, PZS, PTG_LS, PTG, KDEEP_SOIL)
real, dimension(:), allocatable xzs_ls
Definition: modd_prep.F90:45
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
real, save xday
Definition: modd_csts.F90:45
logical lhook
Definition: yomhook.F90:15
real, parameter xt_clim_grad
Definition: modd_prep.F90:53
real, save xrholw
Definition: modd_csts.F90:64
subroutine prep_ver_isba(IO, NPE, PZS, NP)
real, save xtt
Definition: modd_csts.F90:66
real, save xlmtt
Definition: modd_csts.F90:72