SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
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 (IG, I, &
7  hisba,hrunoff,hrain,prain,pmuf,pfsat,ptopqs)
8 ! #######################################################################
9 !
10 !!**** *SGH_UPDATE*
11 !!
12 !! PURPOSE
13 !! -------
14 !
15 ! Calculates the evolution of the fraction, mu, of the grid cell
16 ! reached by the rain, the Topmodel saturated fraction and the diagnostic
17 ! wetland fraction.
18 !
19 !
20 !!** METHOD
21 !! ------
22 !
23 !! EXTERNAL
24 !! --------
25 !!
26 !! none
27 !!
28 !! IMPLICIT ARGUMENTS
29 !! ------------------
30 !!
31 !!
32 !! REFERENCE
33 !! ---------
34 !!
35 !!
36 !! AUTHOR
37 !! ------
38 !!
39 !! B. Decharme * Meteo-France *
40 !!
41 !! MODIFICATIONS
42 !! -------------
43 !! 07/2011 (B. Decharme) : Add fsat diag for dt92
44 !! (B. Decharme) 04/2013 : DIF lateral subsurface drainage
45 !!
46 !-------------------------------------------------------------------------------
47 !
48 !
49 !* 0. DECLARATIONS
50 ! ------------
51 !
52 !
53 !
54 !
55 USE modd_isba_grid_n, ONLY : isba_grid_t
56 USE modd_isba_n, ONLY : isba_t
57 !
58 USE modd_sgh_par, ONLY : ndimtab, xmtokm, xstohr, x001, &
59  xmuregp, xmurega
60 !
61 USE modd_surf_par, ONLY : xundef
62 !
63 USE yomhook ,ONLY : lhook, dr_hook
64 USE parkind1 ,ONLY : jprb
65 !
66 IMPLICIT NONE
67 !
68 !* 0.1 declarations of arguments
69 !
70 !
71 TYPE(isba_grid_t), INTENT(INOUT) :: ig
72 TYPE(isba_t), INTENT(INOUT) :: i
73 !
74  CHARACTER(LEN=*), INTENT(IN) :: hisba ! type of ISBA version:
75 ! ! '2-L' (default)
76 ! ! '3-L'
77 ! ! 'DIF'
78 !
79  CHARACTER(LEN=*), INTENT(IN) :: hrunoff! surface runoff formulation
80 ! ! 'WSAT'
81 ! ! 'DT92'
82 ! ! 'SGH ' Topmodel
83 !
84 !
85  CHARACTER(LEN=*), INTENT(IN) :: hrain ! Rainfall spatial distribution
86  ! 'DEF' = No rainfall spatial distribution
87  ! 'SGH' = Rainfall exponential spatial distribution
88 !
89 REAL, DIMENSION(:), INTENT(IN) :: prain
90 ! PRAIN = rain rate (kg/m2/s)
91 !
92 REAL, DIMENSION(:), INTENT(OUT) :: pmuf
93 ! PMUF = fraction of the grid cell reached by the precipitation
94 !
95 REAL, DIMENSION(:), INTENT(OUT) :: pfsat
96 ! PFSAT = Topmodel satured fraction
97 !
98 REAL, DIMENSION(:,:,:), INTENT(OUT):: ptopqs
99 ! PTOPQS = Topmodel subsurface flow by layer (m/s)
100 !
101 !* 0.2 declarations of local variables
102 !
103 REAL, DIMENSION(SIZE(PRAIN)) :: zdist, zbeta ! HRAIN = SGH
104 ! ZDIST = the cell scale (in km)
105 ! ZBETA = cell scale dependency parameter
106 !
107 REAL, DIMENSION(SIZE(PRAIN)) :: zd_top, zw_top, zqtop ! HRUNOFF = SGH
108 ! ZW_TOP = ative TOPMODEL-soil moisture at 't' (m3 m-3)
109 ! ZD_TOP = Topmodel active layer
110 ! ZQTOP = Topmodel lateral sub-surface flow (-)
111 !
112 INTEGER, DIMENSION(SIZE(PRAIN)) :: iup,idown ! HRUNOFF = SGH
113 ! change in xsat (or fsat) index
114 !
115 INTEGER, DIMENSION(SIZE(PRAIN)) :: nmask ! indices correspondance between arrays
116 !
117 REAL, DIMENSION(SIZE(PRAIN)) :: zwsat_avg, zwwilt_avg
118 ! Average soil properties content
119 !
120 REAL :: zw_up, zw_down
121 REAL :: zf_up, zf_down, zslopef
122 REAL :: zq_up, zq_down, zslopeq
123 !
124 INTEGER :: ini, jj, ji, jpatch, jtab, icount, &
125  jl
126 REAL(KIND=JPRB) :: zhook_handle
127 !
128 !-------------------------------------------------------------------------------
129 !
130 IF (lhook) CALL dr_hook('ISBA_SGH_UPDATE',0,zhook_handle)
131 !
132 ini=SIZE(prain,1)
133 pfsat(:) = 0.0
134 !
135 !* 1.0 Spatial distribution of precipitation
136 ! ---------------------------------------------
137 !
138 IF(hrain=='SGH')THEN
139 !
140  WHERE(prain(:)>0.0)
141  pmuf(:) =1.0
142  ELSEWHERE
143  pmuf(:) =0.0
144  ENDWHERE
145 
146 !
147 ! calculate the cell scale (in km)
148 !
149  zdist(:) = sqrt(ig%XMESH_SIZE(:))/xmtokm
150 !
151  WHERE(zdist(:)>=15.0)
152 !
153 ! calculate beta for the mu calculation
154 !
155  zbeta(:) = xmurega + xmuregp * exp(-x001*zdist(:))
156 !
157 ! calculate mu, precip is in mm/hr
158 !
159  pmuf(:) = 1.0 - exp(-zbeta(:)*(prain(:)*xstohr))
160 !
161  ENDWHERE
162 !
163 ENDIF
164 !
165 !* 2.0 Computation of the saturated fraction given by TOPMODEL
166 ! -----------------------------------------------------------
167 !
168 IF(hrunoff=='SGH')THEN
169 !
170 ! Calculation of the ative TOPMODEL-soil moisture at 't' (m)
171 ! ---------------------------------------------------------------
172 !
173  zqtop(:) = 0.0
174  zw_top(:) = 0.0
175  zd_top(:) = 0.0
176  zwsat_avg(:) = 0.0
177  zwwilt_avg(:) = 0.0
178 !
179  IF(hisba=='DIF')THEN
180 !
181  DO jpatch=1,i%NPATCH
182  IF (i%NSIZE_NATURE_P(jpatch)>0 )THEN
183  DO jl=1,i%NLAYER_DUN
184  DO jj=1,ini
185  zd_top(jj) = zd_top(jj) + i%XPATCH(jj,jpatch)*i%XSOILWGHT(jj,jl,jpatch)
186  zwsat_avg(jj) = zwsat_avg(jj) + i%XPATCH(jj,jpatch)*i%XSOILWGHT(jj,jl,jpatch)*i%XWSAT(jj,jl)
187  zwwilt_avg(jj) = zwwilt_avg(jj) + i%XPATCH(jj,jpatch)*i%XSOILWGHT(jj,jl,jpatch)*i%XWD0 (jj,jl)
188  zw_top(jj) = zw_top(jj) + i%XPATCH(jj,jpatch)*i%XSOILWGHT(jj,jl,jpatch)*i%XWG(jj,jl,jpatch)
189  ENDDO
190  ENDDO
191  ENDIF
192  ENDDO
193 !
194  WHERE(zd_top(:)>0.0)
195  zwsat_avg(:) = zwsat_avg(:)/zd_top(:)
196  zwwilt_avg(:) = zwwilt_avg(:)/zd_top(:)
197  zw_top(:) = zw_top(:)/zd_top(:)
198  ENDWHERE
199 !
200  ELSE
201 !
202  DO jpatch=1,i%NPATCH
203  IF (i%NSIZE_NATURE_P(jpatch)>0 )THEN
204  DO jj=1,ini
205  zd_top(jj) = zd_top(jj)+i%XRUNOFFD(jj,jpatch)*i%XPATCH(jj,jpatch)
206  zw_top(jj) = zw_top(jj)+i%XRUNOFFD(jj,jpatch)*i%XPATCH(jj,jpatch)*i%XWG(jj,2,jpatch)
207  ENDDO
208  ENDIF
209  ENDDO
210 !
211  WHERE(zd_top(:)>0.0)
212  zw_top(:) = zw_top(:) / zd_top(:)
213  ENDWHERE
214 !
215  zwsat_avg(:) = i%XWSAT(:,1)
216  zwwilt_avg(:) = i%XWD0 (:,1)
217 !
218  ENDIF
219 !
220 ! Find the boundary
221 ! -----------------
222 !
223  nmask(:)=0
224  icount=0
225  DO jj=1,ini
226  IF((i%XTI_MEAN(jj)/=xundef.AND.zw_top(jj)<zwsat_avg(jj).AND.zw_top(jj)>zwwilt_avg(jj)))THEN
227  icount=icount+1
228  nmask(icount)=jj
229  ENDIF
230  IF(zw_top(jj)>=zwsat_avg(jj))THEN
231  pfsat(jj) = 1.0
232  ENDIF
233  ENDDO
234 !
235 ! compare wt_array and WT
236 ! -----------------------
237 !
238  DO jtab=1,ndimtab
239  DO jj=1,icount
240  ji = nmask(jj)
241  IF(i%XTAB_WTOP(ji,jtab)>zw_top(ji))THEN
242  iup(jj)=jtab
243  idown(jj)=jtab+1
244  ELSEIF(i%XTAB_WTOP(ji,jtab)==zw_top(ji))THEN
245  iup(jj)=jtab
246  idown(jj)=jtab
247  ENDIF
248  ENDDO
249  ENDDO
250 !
251 ! calculate fsat
252 ! --------------
253 !
254  DO jj=1,icount
255 !
256  ji = nmask(jj)
257 !
258 ! new range
259  zf_up = i%XTAB_FSAT(ji,iup(jj))
260  zf_down = i%XTAB_FSAT(ji,idown(jj))
261  zq_up = i%XTAB_QTOP(ji,iup(jj))
262  zq_down = i%XTAB_QTOP(ji,idown(jj))
263  zw_up = i%XTAB_WTOP(ji,iup(jj))
264  zw_down = i%XTAB_WTOP(ji,idown(jj))
265 !
266 ! Calculate new FSAT
267  zslopef = 0.0
268  zslopeq = 0.0
269  IF(iup(jj)/=idown(jj))THEN
270  zslopef = (zf_up-zf_down)/(zw_up-zw_down)
271  zslopeq = (zq_up-zq_down)/(zw_up-zw_down)
272  ENDIF
273 !
274  pfsat(ji) = zf_down+(zw_top(ji)-zw_down)*zslopef
275  zqtop(ji) = zq_down+(zw_top(ji)-zw_down)*zslopeq
276 !
277  ENDDO
278 !
279 ! Subsurface flow by layer (m/s)
280 ! ------------------------------
281 !
282  IF(hisba=='DIF')THEN
283 !
284  DO jpatch=1,i%NPATCH
285  IF(i%NSIZE_NATURE_P(jpatch)>0)THEN
286  DO jl=1,i%NLAYER_DUN
287  DO jj=1,ini
288  ptopqs(jj,jl,jpatch)=i%XKANISO(jj,jl)*i%XCONDSAT(jj,1,jpatch)*zqtop(jj)*i%XSOILWGHT(jj,jl,jpatch)/i%XRUNOFFD(jj,jpatch)
289  ENDDO
290  ENDDO
291  ENDIF
292  ENDDO
293 !
294  ENDIF
295 !
296 ENDIF
297 !
298 IF (lhook) CALL dr_hook('ISBA_SGH_UPDATE',1,zhook_handle)
299 !
300 !-------------------------------------------------------------
301 !
302 END SUBROUTINE isba_sgh_update
subroutine isba_sgh_update(IG, I, HISBA, HRUNOFF, HRAIN, PRAIN, PMUF, PFSAT, PTOPQS)