SURFEX v8.1
General documentation of Surfex
isba_sgh_update.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 isba_sgh_update (PMESH_SIZE, IO, S, K, NK, NP, NPE, PRAIN )
7 ! #######################################################################
8 !
9 !!**** *SGH_UPDATE*
10 !!
11 !! PURPOSE
12 !! -------
13 !
14 ! Calculates the evolution of the fraction, mu, of the grid cell
15 ! reached by the rain, the Topmodel saturated fraction and the diagnostic
16 ! wetland fraction.
17 !
18 !
19 !!** METHOD
20 !! ------
21 !
22 !! EXTERNAL
23 !! --------
24 !!
25 !! none
26 !!
27 !! IMPLICIT ARGUMENTS
28 !! ------------------
29 !!
30 !!
31 !! REFERENCE
32 !! ---------
33 !!
34 !!
35 !! AUTHOR
36 !! ------
37 !!
38 !! B. Decharme * Meteo-France *
39 !!
40 !! MODIFICATIONS
41 !! -------------
42 !! 07/2011 (B. Decharme) : Add fsat diag for dt92
43 !! (B. Decharme) 04/2013 : DIF lateral subsurface drainage
44 !!
45 !-------------------------------------------------------------------------------
46 !
47 !
48 !* 0. DECLARATIONS
49 ! ------------
50 !
54 !
55 USE modd_sgh_par, ONLY : ndimtab, xmtokm, xstohr, x001, &
57 !
58 USE modd_surf_par, ONLY : xundef
59 !
60 USE yomhook ,ONLY : lhook, dr_hook
61 USE parkind1 ,ONLY : jprb
62 !
63 IMPLICIT NONE
64 !
65 !* 0.1 declarations of arguments
66 !
67 !
68 REAL, DIMENSION(:), INTENT(IN) :: PMESH_SIZE
69 TYPE(isba_options_t), INTENT(INOUT) :: IO
70 TYPE(isba_s_t), INTENT(INOUT) :: S
71 TYPE(isba_k_t), INTENT(INOUT) :: K
72 TYPE(isba_nk_t), INTENT(INOUT) :: NK
73 TYPE(isba_np_t), INTENT(INOUT) :: NP
74 TYPE(isba_npe_t), INTENT(INOUT) :: NPE
75 
76 !
77 REAL, DIMENSION(:), INTENT(IN) :: PRAIN
78 ! PRAIN = rain rate (kg/m2/s)
79 !
80 !* 0.2 declarations of local variables
81 !
82 REAL, DIMENSION(SIZE(PRAIN)) :: ZDIST, ZBETA, ZFSAT ! IO%CRAIN = SGH
83 ! ZDIST = the cell scale (in km)
84 ! ZBETA = cell scale dependency parameter
85 !
86 REAL, DIMENSION(SIZE(PRAIN)) :: ZD_TOP, ZW_TOP, ZQTOP ! IO%CRUNOFF = SGH
87 ! ZW_TOP = ative TOPMODEL-soil moisture at 't' (m3 m-3)
88 ! ZD_TOP = Topmodel active layer
89 ! ZQTOP = Topmodel lateral sub-surface flow (-)
90 !
91 INTEGER, DIMENSION(SIZE(PRAIN)) :: IUP,IDOWN ! IO%CRUNOFF = SGH
92 ! change in xsat (or fsat) index
93 !
94 INTEGER, DIMENSION(SIZE(PRAIN)) :: NMASK ! indices correspondance between arrays
95 !
96 REAL, DIMENSION(SIZE(PRAIN)) :: ZWSAT_AVG, ZWWILT_AVG
97 ! Average soil properties content
98 !
99 TYPE(isba_p_t), POINTER :: PK
100 TYPE(isba_k_t), POINTER :: KK
101 TYPE(isba_pe_t), POINTER :: PEK
102 !
103 REAL :: ZW_UP, ZW_DOWN
104 REAL :: ZF_UP, ZF_DOWN, ZSLOPEF
105 REAL :: ZQ_UP, ZQ_DOWN, ZSLOPEQ
106 !
107 INTEGER :: INJ, JJ, JI, JP, JTAB, ICOUNT, &
108  JL, IMASK
109 REAL(KIND=JPRB) :: ZHOOK_HANDLE
110 !
111 !-------------------------------------------------------------------------------
112 !
113 IF (lhook) CALL dr_hook('ISBA_SGH_UPDATE',0,zhook_handle)
114 !
115 inj=SIZE(prain,1)
116 !
117 zfsat(:) = 0.0
118 !
119 !* 1.0 Spatial distribution of precipitation
120 ! ---------------------------------------------
121 !
122 IF(io%CRAIN=='SGH')THEN
123 !
124  WHERE(prain(:)>0.0)
125  k%XMUF (:) =1.0
126  ELSEWHERE
127  k%XMUF (:) =0.0
128  ENDWHERE
129 
130 !
131 ! calculate the cell scale (in km)
132 !
133  zdist(:) = sqrt(pmesh_size(:))/xmtokm
134 !
135  WHERE(zdist(:)>=15.0)
136 !
137 ! calculate beta for the mu calculation
138 !
139  zbeta(:) = xmurega + xmuregp * exp(-x001*zdist(:))
140 !
141 ! calculate mu, precip is in mm/hr
142 !
143  k%XMUF (:) = 1.0 - exp(-zbeta(:)*(prain(:)*xstohr))
144 !
145  ENDWHERE
146 !
147  DO jp = 1,io%NPATCH
148  pk => np%AL(jp)
149  kk => nk%AL(jp)
150  IF (pk%NSIZE_P>0 )THEN
151  DO ji = 1,pk%NSIZE_P
152  imask = pk%NR_P(ji)
153  kk%XMUF(ji) = k%XMUF(imask)
154  ENDDO
155  ENDIF
156  ENDDO
157 
158 ENDIF
159 !
160 !* 2.0 Computation of the saturated fraction given by TOPMODEL
161 ! -----------------------------------------------------------
162 !
163 IF(io%CRUNOFF=='SGH')THEN
164 !
165 ! Calculation of the ative TOPMODEL-soil moisture at 't' (m)
166 ! ---------------------------------------------------------------
167 !
168  zd_top(:) = 0.0
169  zwsat_avg(:) = 0.0
170  zwwilt_avg(:) = 0.0
171  zw_top(:) = 0.0
172 !
173  IF(io%CISBA=='DIF')THEN
174 !
175  DO jp = 1,io%NPATCH
176  kk => nk%AL(jp)
177  pk => np%AL(jp)
178  pek => npe%AL(jp)
179 
180  IF (pk%NSIZE_P>0 )THEN
181 
182  DO jl = 1,io%NLAYER_DUN
183  DO ji = 1,pk%NSIZE_P
184  imask = pk%NR_P(ji)
185  !
186  zd_top(imask) = zd_top(imask) + pk%XPATCH(ji)*pk%XSOILWGHT(ji,jl)
187  zwsat_avg(imask) = zwsat_avg(imask) + pk%XPATCH(ji)*pk%XSOILWGHT(ji,jl)*k%XWSAT(imask,jl)
188  zwwilt_avg(imask) = zwwilt_avg(imask) + pk%XPATCH(ji)*pk%XSOILWGHT(ji,jl)*k%XWD0 (imask,jl)
189  zw_top(imask) = zw_top(imask) + pk%XPATCH(ji)*pk%XSOILWGHT(ji,jl)*pek%XWG (ji,jl)
190  !
191  ENDDO
192  ENDDO
193  ENDIF
194  ENDDO
195 !
196  WHERE(zd_top(:)>0.0)
197  zwsat_avg(:) = zwsat_avg(:)/zd_top(:)
198  zwwilt_avg(:) = zwwilt_avg(:)/zd_top(:)
199  zw_top(:) = zw_top(:)/zd_top(:)
200  ENDWHERE
201 !
202  ELSE
203 !
204  DO jp = 1,io%NPATCH
205  pk => np%AL(jp)
206  pek => npe%AL(jp)
207 
208  IF (pk%NSIZE_P>0 )THEN
209  DO ji = 1,pk%NSIZE_P
210  imask = pk%NR_P(ji)
211  !
212  zd_top(imask) = zd_top(imask)+pk%XRUNOFFD(ji)*pk%XPATCH(ji)
213  zw_top(imask) = zw_top(imask)+pk%XRUNOFFD(ji)*pk%XPATCH(ji)*pek%XWG(ji,2)
214  !
215  ENDDO
216  ENDIF
217  ENDDO
218 !
219  WHERE(zd_top(:)>0.0)
220  zw_top(:) = zw_top(:) / zd_top(:)
221  ENDWHERE
222 !
223  zwsat_avg(:) = k%XWSAT(:,1)
224  zwwilt_avg(:) = k%XWD0 (:,1)
225 !
226  ENDIF
227 !
228 ! Find the boundary
229 ! -----------------
230 !
231  nmask(:)=0
232  icount=0
233  DO ji=1,inj
234  IF((s%XTI_MEAN(ji)/=xundef.AND.zw_top(ji)<zwsat_avg(ji).AND.zw_top(ji)>zwwilt_avg(ji))) THEN
235  icount=icount+1
236  nmask(icount)=ji
237  ENDIF
238  IF(zw_top(ji)>=zwsat_avg(ji))THEN
239  zfsat(ji) = 1.0
240  ENDIF
241  ENDDO
242 !
243 ! compare wt_array and WT
244 ! -----------------------
245 !
246  DO jtab=1,ndimtab
247  DO jj=1,icount
248  ji = nmask(jj)
249  IF(s%XTAB_WTOP(ji,jtab)>zw_top(ji))THEN
250  iup(jj)=jtab
251  idown(jj)=jtab+1
252  ELSEIF(s%XTAB_WTOP(ji,jtab)==zw_top(ji))THEN
253  iup(jj)=jtab
254  idown(jj)=jtab
255  ENDIF
256  ENDDO
257  ENDDO
258 !
259 ! calculate fsat
260 ! --------------
261 !
262  zqtop(:) = 0.0
263 !
264  DO jj=1,icount
265 !
266  ji = nmask(jj)
267 !
268 ! new range
269  zf_up = s%XTAB_FSAT(ji,iup(jj))
270  zf_down = s%XTAB_FSAT(ji,idown(jj))
271  zq_up = s%XTAB_QTOP(ji,iup(jj))
272  zq_down = s%XTAB_QTOP(ji,idown(jj))
273  zw_up = s%XTAB_WTOP(ji,iup(jj))
274  zw_down = s%XTAB_WTOP(ji,idown(jj))
275 !
276 ! Calculate new FSAT
277  zslopef = 0.0
278  zslopeq = 0.0
279  IF(iup(jj)/=idown(jj))THEN
280  zslopef = (zf_up-zf_down)/(zw_up-zw_down)
281  zslopeq = (zq_up-zq_down)/(zw_up-zw_down)
282  ENDIF
283 !
284  zfsat(ji) = zf_down+(zw_top(ji)-zw_down)*zslopef
285  zqtop(ji) = zq_down+(zw_top(ji)-zw_down)*zslopeq
286 !
287  ENDDO
288 !
289  DO jp=1,io%NPATCH
290  kk => nk%AL(jp)
291  pk => np%AL(jp)
292  IF(pk%NSIZE_P>0)THEN
293  DO ji=1,pk%NSIZE_P
294  imask = pk%NR_P(ji)
295  kk%XFSAT(ji) = zfsat(imask)
296  ENDDO
297  ENDIF
298  ENDDO
299 !
300 ! Subsurface flow by layer (m/s)
301 ! ------------------------------
302 !
303  IF(io%CISBA=='DIF')THEN
304 !
305  DO jp=1,io%NPATCH
306  kk => nk%AL(jp)
307  pk => np%AL(jp)
308  IF(pk%NSIZE_P>0)THEN
309  DO jl=1,io%NLAYER_DUN
310  DO ji=1,pk%NSIZE_P
311  imask = pk%NR_P(ji)
312  pk%XTOPQS(ji,jl) = k%XKANISO(imask,jl) * pk%XCONDSAT(ji,1) * zqtop(imask) * &
313  pk%XSOILWGHT(ji,jl) / pk%XRUNOFFD(ji)
314  ENDDO
315  ENDDO
316  ENDIF
317  ENDDO
318 !
319  ENDIF
320 !
321 ENDIF
322 !
323 IF (lhook) CALL dr_hook('ISBA_SGH_UPDATE',1,zhook_handle)
324 !
325 !-------------------------------------------------------------
326 !
327 END SUBROUTINE isba_sgh_update
integer, parameter ndimtab
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
subroutine isba_sgh_update(PMESH_SIZE, IO, S, K, NK, NP, NPE, PRA
real, parameter xmtokm
logical lhook
Definition: yomhook.F90:15
real, parameter x001
real, parameter xstohr
real, parameter xmurega
real, parameter xmuregp