SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
topodyn_lat.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 ! ###########################
7 SUBROUTINE topodyn_lat(PRW,PDEF,PKAPPA,PKAPPAC,GTOPD)
8 !,PERROR)
9 ! ###########################
10 !
11 !
12 ! PURPOSE
13 ! -------
14 ! to distribute laterally soil water following topodyn concept
15 !
16 !
17 ! METHOD
18 ! ------
19 !
20 ! EXTERNAL
21 ! --------
22 ! none
23 !
24 !
25 ! AUTHOR
26 ! ------
27 !
28 ! G.-M. Saulnier * LTHE *
29 ! K. Chancibault * CNRM *
30 !
31 ! MODIFICATIONS
32 ! -------------
33 !
34 ! Original 12/2003
35 ! writing in fortran 90 12/2004
36 !------------------------------------------------------------------------------------------
37 !
38 !* 0.0 DECLARATIONS
39 ! ------------
40 USE modd_topodyn, ONLY : nncat, nmesht, xdmaxt, xdxt, xmpara, nnmc, xconn, nline,&
41  xslop, xdarea, xlambda
42 USE modd_coupling_topd, ONLY : xwstopt, xdtopt
43 USE modd_topd_par, ONLY : xstepk
44 !
45 USE modd_surf_par, ONLY : xundef
46 !
47 USE modi_flowdown
48 USE modi_abor1_sfx
49 USE modi_write_file_vecmap
50 USE modi_write_file_map
51 !
52 USE yomhook ,ONLY : lhook, dr_hook
53 USE parkind1 ,ONLY : jprb
54 !
55 IMPLICIT NONE
56 !
57 !* 0.1 declarations of arguments
58 !
59 REAL, DIMENSION(:,:), INTENT(IN) :: prw
60 REAL, DIMENSION(:,:), INTENT(OUT) :: pdef
61 REAL, DIMENSION(:,:), INTENT(OUT) :: pkappa
62 REAL, DIMENSION(:), INTENT(OUT) :: pkappac
63 LOGICAL, DIMENSION(:), INTENT(OUT) :: gtopd
64 !
65 !* 0.2 declarations of local variables
66 !
67 LOGICAL :: gfound ! logical variable
68 REAL :: zsomme
69 REAL :: zm ! XMPARA in m
70 REAL :: zdx ! XDXT in m
71 REAL :: zkval, zkvalmin, zkvalmax
72 REAL :: zdav ! Averaged deficit (m)
73 REAL :: zdav2 ! Averaged deficit on ZA-ZAS-ZAD (m)
74 REAL :: zndmaxav,znkav ! temporary averaged maximal deficit and averaged similarity index
75 REAL :: zdmaxav,zkav ! averaged maximal deficit and averaged similarity index
76 REAL :: zfunc
77 REAL :: zdif,zdifmin ! difference calcul
78 REAL :: znas, znad ! temporary saturated and dry relative catchment area
79 REAL :: zas,zad ! saturated and dry relative catchment area
80 REAL :: za ! total catchment area
81 REAL :: ztmp
82 !
83 REAL, DIMENSION(NMESHT) :: zdmax ! XDMAXT in m
84 REAL, DIMENSION(NMESHT) :: zrw ! PRW in m
85 REAL, DIMENSION(NMESHT) :: zdini ! initial deficit
86 REAL, DIMENSION(NMESHT) :: zmask
87 REAL, DIMENSION(NMESHT) :: zkappa_pack, zdmax_pack
88 !REAL, DIMENSION(NMESHT) :: ZTMP
89 !
90 INTEGER :: j1, j2, jj !
91 INTEGER :: inkappa ! number of steps in similarity index distribution
92 INTEGER :: inpcon ! number of connected pixels
93 INTEGER :: inas ! number of saturated pixels
94 INTEGER :: inad ! number of dry pixels
95 INTEGER :: i_dim
96 !
97 REAL(KIND=JPRB) :: zhook_handle
98 !-----------------------------------------------------------------------------------
99 IF (lhook) CALL dr_hook('TOPODYN_LAT',0,zhook_handle)
100 !
101 pkappa(:,: )= 0.0
102 pkappac(:) = 0.
103 gtopd(:) = .true.
104 pdef(:,:) = 0.
105 zas=0.
106 zad=1.
107 !
108 DO jj = 1,nncat
109  !* 0. Initialisation
110  ! --------------
111  zmask(:) = 0.0
112  zrw(:) = 0.0
113  zdmax(:) = 0.0
114  inpcon = 0
115  zdav = 0.0
116  zdav2 = 0.0
117  gfound = .false.
118  zdifmin = 99999.
119  !
120  zrw(:) = prw(jj,:)
121  zdmax(:) = xdmaxt(jj,:)
122  zdx = xdxt(jj)
123  zm = xmpara(jj)
124  zdini(:) = zdmax(:)
125  !
126  !* 0.2 definition of the catchment area concerned by lateral distribution
127  ! ------------------------------------------------------------------
128  !
129  DO j1=1,nnmc(jj)
130  !
131  IF ( zrw(j1)>0.0 .AND. zrw(j1)/=xundef) THEN
132  zmask(j1)=1.0
133  ELSE
134  zmask(j1)=0.0
135  ENDIF
136  !
137  ENDDO
138  !
139  CALL flowdown(nnmc(jj),zmask,xconn(jj,:,:),nline(jj,:))
140  !
141  WHERE (zmask == 0.0) zmask = xundef
142  !
143  !
144  !* 1. Calcul of hydrological similarity and topographic indexes
145  ! ---------------------------------------------------------
146  !* 1.1 Calcul of averaged deficit and initialisation of indexes
147  ! --------------------------------------------------------
148  !
149  za = nnmc(jj) * zdx**2
150  ztmp=0.
151  !
152  DO j1=1,nnmc(jj)
153  !
154  IF (zmask(j1)/=xundef) THEN
155  !
156  pkappa(jj,j1) = zrw(j1)
157  inpcon = inpcon + 1
158  zdini(j1) = zdmax(j1) - zrw(j1)
159  !
160  IF ( zdini(j1) <0.0 ) THEN
161  ! WRITE(*,*) J1,'Dini negatif !'
162  ztmp = ztmp - zdini(j1) !we stock here water above saturation to be
163  ! distributed among the others pixels
164  zdini(j1) = 0.
165  ENDIF
166  !
167  zdav = zdav + zdini(j1)
168  !
169  ELSE
170  !
171  pkappa(jj,j1) = xundef
172  !
173  ENDIF
174  !
175  ENDDO
176  !
177  IF (ztmp>0.) THEN
178  !write(*,*) COUNT(ZDINI(:)<0.),' pixels avec ZDINI negatif. Volume total :', ZTMP
179  WHERE ( zdini(:)>0. ) zdini(:) = zdini(:)-ztmp/(count(zdini(:)>0.))
180  ENDIF
181  !
182  IF (inpcon >= nnmc(jj)/1000) THEN
183  !
184  zdav = zdav / inpcon
185  zdav = zdav / zm
186  !
187  !* 1.2 Propagation of indexes
188  ! ----------------------
189  !
190  CALL flowdown(nnmc(jj),pkappa(jj,:),xconn(jj,:,:),nline(jj,:))
191  !
192  !* 1.3 Distribution of indexes
193  ! ----------------------
194  !
195  j2=1
196  !
197  DO WHILE ( .NOT.gfound .AND. j2.LE.nnmc(jj) )
198  !
199  IF (zmask(j2)/=xundef) THEN
200  !
201  gfound = .true.
202  zkval = pkappa(jj,j2) * exp(xlambda(jj,j2))
203  !ZKVAL = PKAPPA(JJ,J2) * XDAREA(JJ,J2) / XSLOP(JJ,J2)
204  zkval = log(zkval)
205  zkvalmax = zkval
206  zkvalmin = zkval
207  pkappa(jj,j2) = zkval
208  !
209  ELSE
210  !
211  pkappa(jj,j2) = xundef
212  !
213  ENDIF
214  !
215  j2 = j2 + 1
216  !
217  ENDDO
218  !
219  DO j1 = j2,nnmc(jj)
220  !
221  IF (zmask(j1)/=xundef) THEN
222  !
223  zkval = pkappa(jj,j1) * exp(xlambda(jj,j1))
224 ! ZKVAL = PKAPPA(JJ,J1) * XDAREA(JJ,J1) / XSLOP(JJ,J1)
225  zkval = log(zkval)
226  !
227  IF (zkval.GT.zkvalmax) THEN
228  zkvalmax = zkval
229  ELSEIF (zkval.LT.zkvalmin) THEN
230  zkvalmin = zkval
231  ENDIF
232  !
233  pkappa(jj,j1) = zkval
234  !
235  ELSE
236  !
237  pkappa(jj,j1) = xundef
238  !
239  ENDIF
240  !
241  ENDDO
242  !
243  !* 1.4 Calcul of saturation index
244  ! --------------------------
245  !
246  i_dim = count( zmask(1:nnmc(jj))/=xundef )
247  zkappa_pack(:) = xundef
248  zdmax_pack(:) = xundef
249  zkappa_pack(1:i_dim) = pack(pkappa(jj,1:nnmc(jj)),zmask(1:nnmc(jj))/=xundef)
250  zdmax_pack(1:i_dim) = pack(zdmax(1:nnmc(jj)),zmask(1:nnmc(jj))/=xundef)
251  !
252  inkappa = int((zkvalmax - zkvalmin) / xstepk)
253  !
254  DO j1=1,inkappa
255  !
256  zkval = zkvalmin + (xstepk * (j1-1))
257  inas = 0
258  inad = 0
259  zndmaxav = 0.0
260  znkav = 0.0
261  !
262  DO j2=1,i_dim
263  !
264  IF ( zkappa_pack(j2).GE.zkval ) THEN
265  ! saturated pixel
266  inas = inas + 1
267  ELSEIF (zkappa_pack(j2).LE.( zkval-(zdmax_pack(j2)/zm)) ) THEN
268  ! dry pixel
269  inad = inad + 1
270  zndmaxav = zndmaxav + zdmax_pack(j2)
271  ELSE
272  znkav = znkav + zkappa_pack(j2)
273  ENDIF
274  !
275  ENDDO
276  !
277  IF (inad == 0) THEN
278  zndmaxav = 0.0
279  ELSE
280  zndmaxav = zndmaxav / REAL(inad)
281  ENDIF
282  !
283  IF ( inpcon == inas .OR. inpcon == inad .OR. inpcon == (inad+inas)) THEN
284  znkav = 0.0
285  ELSE
286  znkav = znkav / REAL(inpcon - inad - inas)
287  ENDIF
288  !
289  IF (inpcon /= 0) THEN
290  znas = REAL(INAS) / REAL(inpcon)
291  znad = REAL(INAD) / REAL(inpcon)
292  ENDIF
293  !
294  zfunc = (1 - znas - znad) * ( zkval - znkav )
295  IF (zm /= 0.) zfunc = zfunc + (znad * (zndmaxav / zm))
296  !
297  zdif = abs( zfunc - zdav )
298  !
299  IF ( zdif.LT.zdifmin ) THEN
300  !
301  zdifmin = zdif
302  pkappac(jj) = zkval
303  zas = znas
304  zad = znad
305  zdmaxav = zndmaxav
306  zkav = znkav
307  !
308  ENDIF
309  !
310  ENDDO
311  !
312  !* 2. Local deficits calculation
313  ! --------------------------
314  !
315  !* 2.1 New averaged deficit on A-Ad-As
316  ! -------------------------------
317  !
318  zdav = zdav * zm
319  !
320  IF ( zas<1. .AND. zad<1. .AND. (zas + zad/=1.) ) THEN
321  !
322  zdav2 = (zdav - zdmaxav * zad) / (1 - zas - zad)
323  !
324  ELSE
325  !
326  IF (zas>=1.) WRITE(*,*) 'ALL THE AREA IS SATURATED'
327  IF (zad>=1.) WRITE(*,*) 'ALL THE AREA HAS A MAXIMAL DEFICIT'
328  WRITE(*,*) 'ALL THE AREA',zas,zad
329  ! CALL ABOR1_SFX("TOPODYN_LAT: ALL THE AREA IS SATURATED OR HAS A MAXIMAL DEFICIT")
330  !
331  ENDIF
332  !
333  !* 2.2 Local deficits
334  ! --------------
335  !
336  ! ZSOMME=0.0
337  !ZTMP(:)=XUNDEF
338  !
339  DO j1=1,nnmc(jj)
340  !
341  IF ( zmask(j1)/=xundef ) THEN
342  !
343  IF ( (pkappa(jj,j1).GT.(pkappac(jj) - zdmax(j1)/zm)) .AND. (pkappa(jj,j1).LT.pkappac(jj)) ) THEN
344  !
345  pdef(jj,j1) = zm * (zkav - pkappa(jj,j1)) + zdav2
346  !ZTMP(J1) = 0.5
347  IF (pdef(jj,j1) < 0.0) pdef(jj,j1) = 0.0
348  !
349  ELSEIF ( pkappa(jj,j1).GE.pkappac(jj) ) THEN
350  !
351  pdef(jj,j1) = 0.0
352  !ZTMP(J1) = 1.
353  !
354  ELSEIF ( pkappa(jj,j1).LE.(pkappac(jj) - zdmax(j1)/zm) ) THEN
355  !
356  pdef(jj,j1) = zdmax(j1)
357  !ZTMP(J1) = -1.0
358  !
359  ENDIF
360  !
361  ! nouveau contenu en eau total (m)
362  !ZSOMME = ZSOMME + ( XWSTOPT(JJ,J1)*XDTOPT(JJ,J1) - PDEF(JJ,J1) )
363  !
364  ELSE
365  !
366  pdef(jj,j1) = zdmax(j1)
367  !
368  ENDIF
369  !
370  ENDDO
371  !
372  ! variation du contenu en eau total
373  DO j1=1,nnmc(jj)
374  !
375  IF (pdef(jj,j1)<0.0) THEN
376  WRITE(*,*) 'LAMBDA=',pkappa(jj,j1),'LAMBDAC=',pkappac(jj)
377  ENDIF
378  !
379  ENDDO
380  !
381  gtopd(jj)=.true.
382  !
383  ELSE
384  !
385  ! 'Pas de redistribution laterale'
386  gtopd(jj)=.false.
387  !
388  pkappa(jj,:) = xundef
389  ! PDEF(JJ,:) = ZDMAX(:) - ZRW(:)
390  pdef(jj,:) = zdini(:)
391  pkappac(jj) = xundef
392  !
393  ENDIF
394  !
395 ENDDO
396 !
397 IF (lhook) CALL dr_hook('TOPODYN_LAT',1,zhook_handle)
398 !
399 END SUBROUTINE topodyn_lat
400 
subroutine flowdown(KNMC, PVAR, PCONN, KLINE)
Definition: flowdown.F90:7
subroutine topodyn_lat(PRW, PDEF, PKAPPA, PKAPPAC, GTOPD)
Definition: topodyn_lat.F90:7