SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
isba_to_topdsat.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 isba_to_topdsat(PKAPPA,PKAPPAC,KI,PRO_I,PRO_T)
8 ! ####################
9 !
10 !!**** *ISBA_TO_TOPDSAT*
11 !!
12 !! PURPOSE
13 !! -------
14 !
15 !
16 !
17 !!** METHOD
18 !! ------
19 !
20 !! EXTERNAL
21 !! --------
22 !!
23 !! none
24 !!
25 !! IMPLICIT ARGUMENTS
26 !! ------------------
27 !!
28 !!
29 !!
30 !! REFERENCE
31 !! ---------
32 !!
33 !!
34 !!
35 !! AUTHOR
36 !! ------
37 !!
38 !! K. Chancibault * LTHE / Meteo-France *
39 !!
40 !! MODIFICATIONS
41 !! -------------
42 !!
43 !! Original 23/11/2005
44 !-------------------------------------------------------------------------------
45 !
46 !* 0. DECLARATIONS
47 ! ------------
48 !
49 USE modd_surf_par, ONLY : xundef,nundef
50 !
51 USE modd_topodyn, ONLY : nncat, nnmc, nmesht
52 USE modd_coupling_topd,ONLY: nmaski, nmaskt, nnpix
53 !
54 USE yomhook ,ONLY : lhook, dr_hook
55 USE parkind1 ,ONLY : jprb
56 !
57 IMPLICIT NONE
58 !
59 !* 0.1 declarations of arguments
60 !
61 INTEGER, INTENT(IN) :: ki ! Number of Isba meshes
62 REAL, DIMENSION(:,:), INTENT(IN) :: pkappa ! Hydrological indexes on the catchments
63  ! at the previous time step
64 REAL, DIMENSION(:), INTENT(IN) :: pkappac ! Hydrological index at saturation at the
65  ! previous time step
66 REAL, DIMENSION(:), INTENT(IN) :: pro_i ! Runoff on Isba grid
67 REAL, DIMENSION(:,:), INTENT(OUT):: pro_t ! Runoff on TOPODYN grid
68 !
69 !
70 !* 0.2 declarations of local variables
71 !
72 INTEGER :: jcat, jpix, jmesh_isba,jj ! Loop indexes
73 INTEGER, DIMENSION(KI) :: insat ! number of saturated pixels in an ISBA mesh
74 INTEGER, DIMENSION(KI) :: indry ! Number of non-saturated pixels in an ISBA mesh
75 REAL, DIMENSION(NNCAT,NMESHT) :: zrosat !
76 REAL, DIMENSION(NNCAT,NMESHT) :: zrodry !
77  CHARACTER(LEN=30) :: yvar ! name of results file
78 !
79 REAL::zsmall,ztmp,ztmp2
80 REAL(KIND=JPRB) :: zhook_handle
81 !-------------------------------------------------------------------------------
82 IF (lhook) CALL dr_hook('ISBA_TO_TOPDSAT',0,zhook_handle)
83 !
84 !* 0. Initialization :
85 ! --------------
86 !
87 insat(:)=0
88 indry(:)=0
89 zrosat(:,:)=0.0
90 zrodry(:,:)=0.0
91 !
92 ! Only Isba meshes over studied catchments are scanned
93 DO jmesh_isba = 1,ki
94  !
95  DO jcat = 1,nncat
96  !
97  jj=1
98  jpix=nmaski(jmesh_isba,jcat,jj)
99  !
100  DO WHILE (jpix/=nundef .AND.(jj<=SIZE(nmaski,3)))
101  !
102  IF (pkappa(jcat,jpix)/=xundef .AND. nmaskt(jcat,jpix)/=nundef) THEN
103  ! Calculation of the saturated and dry catchment pixels in each Isba mesh
104  IF (pkappa(jcat,jpix).GE.pkappac(jcat)) THEN
105  insat(nmaskt(jcat,jpix)) = insat(nmaskt(jcat,jpix)) + 1
106  zrosat(jcat,jpix) = pro_i(nmaskt(jcat,jpix))
107  ELSE
108  indry(nmaskt(jcat,jpix)) = indry(nmaskt(jcat,jpix)) + 1
109  zrodry(jcat,jpix) = pro_i(nmaskt(jcat,jpix))
110  ENDIF
111  ENDIF
112  !
113  jj=jj+1
114  IF (jj<=SIZE(nmaski,3)) jpix=nmaski(jmesh_isba,jcat,jj)
115  !
116  ENDDO
117  !
118  ENDDO
119  !
120 ENDDO
121 !
122 !
123 DO jcat = 1,nncat
124  !
125  DO jpix = 1,nnmc(jcat)
126  !
127  IF (nmaskt(jcat,jpix)/=nundef) THEN
128  ! calculation of the runoff and deep drainage to rout in each Isba mesh, for each catchment
129  IF (insat(nmaskt(jcat,jpix)).GT.0 .AND. pkappa(jcat,jpix)/=xundef) THEN
130  pro_t(jcat,jpix) = zrosat(jcat,jpix) / insat(nmaskt(jcat,jpix))
131  ! if no runoff : calculation of the deep drainage to rout in each Isba mesh for each catchment
132  ELSEIF (indry(nmaskt(jcat,jpix)).GT.0 .AND. pkappa(jcat,jpix)/=xundef) THEN
133  pro_t(jcat,jpix) = zrodry(jcat,jpix) / indry(nmaskt(jcat,jpix))
134  ELSE
135  pro_t(jcat,jpix) = 0.
136  ENDIF
137  ENDIF
138  !
139  ENDDO
140  !
141  ! budget control
142  ztmp=0.
143  ztmp2=0.
144  !
145  DO jpix = 1,nnmc(jcat)
146  !
147  IF (pro_t(jcat,jpix)/=xundef) ztmp = ztmp + pro_t(jcat,jpix)
148  IF ( nmaskt(jcat,jpix)/=nundef) THEN
149  IF (pro_i(nmaskt(jcat,jpix))/=xundef .AND. nnpix(nmaskt(jcat,jpix))/=0 ) &
150  ztmp2 = ztmp2 + pro_i(nmaskt(jcat,jpix)) / nnpix(nmaskt(jcat,jpix))
151  ENDIF
152  !
153  enddo!JPIX
154  !
155  zsmall=abs(ztmp2*0.001)
156  !
157  IF( abs(ztmp-ztmp2) > zsmall ) THEN
158  WHERE ( pro_t(jcat,:)/=xundef )
159  pro_t(jcat,:) = pro_t(jcat,:)- ((ztmp-ztmp2)/nnmc(jcat))
160  ENDWHERE
161  ENDIF
162  !
163 ENDDO
164 !
165 IF (lhook) CALL dr_hook('ISBA_TO_TOPDSAT',1,zhook_handle)
166 !
167 END SUBROUTINE isba_to_topdsat
subroutine isba_to_topdsat(PKAPPA, PKAPPAC, KI, PRO_I, PRO_T)