SURFEX v8.1
General documentation of Surfex
trip_surface_water.F90
Go to the documentation of this file.
1 ! #########
2 SUBROUTINE trip_surface_water (KLISTING,PTSTEP,KGRCN,KSEQ,KNEXTX,KNEXTY,KSEQMAX, &
3  OPRINT,OMASK_VEL,PLEN,PRUNOFF, &
4  PVEL,PHS,PSURF_STO,PSURF_STO2,PGOUT,PSIN,PSOUT, &
5  PAREA,PQFR,PQRF, &
6  PSSTO_ALL,PSSTO2_ALL,PSIN_ALL,PDRUN_ALL, &
7  PSOUT_ALL,PVEL_ALL,PHS_ALL )
8 ! ################################################################
9 !
10 !!**** *TRIP_SURFACE_WATER*
11 !!
12 !! PURPOSE
13 !! -------
14 !
15 ! Calculate the river storage in the next time step based on the storage of current time step
16 ! Where OMASK_VEL=true the Manning equation is used to compute a variable flow velocity.
17 !
18 !
19 !!** METHOD
20 !! ------
21 !
22 ! RK Ordre 4 Rang 4
23 !
24 !! EXTERNAL
25 !! --------
26 !
27 ! None
28 !!
29 !! IMPLICIT ARGUMENTS
30 !! ------------------
31 !!
32 !!
33 !! REFERENCE
34 !! ---------
35 !!
36 !! AUTHOR
37 !! ------
38 !! B. Decharme
39 !!
40 !! MODIFICATIONS
41 !! -------------
42 !! Original 01/02/09
43 !-------------------------------------------------------------------------------
44 !
45 !* 0. DECLARATIONS
46 ! ------------
47 !
48 USE modn_trip, ONLY : xcvel
49 USE modd_trip_par, ONLY : xundef, xm, xvelmin, &
50  xhsmin, xrholw
51 !
52 USE yomhook ,ONLY : lhook, dr_hook
53 USE parkind1 ,ONLY : jprb
54 !
55 USE modi_abort_trip
56 !
57 IMPLICIT NONE
58 !
59 !* 0.1 declarations of arguments
60 !
61 INTEGER, INTENT(IN) :: KLISTING
62 !
63 REAL, INTENT(IN) :: PTSTEP ! Trip timestep value (10800s)
64 !
65 INTEGER, DIMENSION(:,:),INTENT(IN) :: KGRCN ! Flow direction (1->8)
66 INTEGER, DIMENSION(:,:),INTENT(IN) :: KSEQ ! River sequence
67 INTEGER, DIMENSION(:,:),INTENT(IN) :: KNEXTX ! returns x and y point
68 INTEGER, DIMENSION(:,:),INTENT(IN) :: KNEXTY ! of destination grid:
69 ! 8 1 2
70 ! 7 3
71 ! 6 5 4
72 !
73 INTEGER, INTENT(IN) :: KSEQMAX ! maximum down flow
74 LOGICAL, INTENT(IN) :: OPRINT !Printable budget key
75 !
76 LOGICAL, DIMENSION(:,:), INTENT(IN) :: OMASK_VEL ! Variable velocity mask
77 REAL, DIMENSION(:,:), INTENT(IN) :: PLEN ! river length [m]
78 REAL, DIMENSION(:,:), INTENT(IN) :: PAREA ! Grid-cell area [mē]
79 REAL, DIMENSION(:,:), INTENT(IN) :: PRUNOFF ! Surface runoff from ISBA [kg/s]
80 REAL, DIMENSION(:,:), INTENT(IN) :: PGOUT ! ground water outflow [kg/s]
81 REAL, DIMENSION(:,:), INTENT(IN) :: PQFR ! Flood flow to river [kg/s]
82 REAL, DIMENSION(:,:), INTENT(IN) :: PQRF ! River flow to floodplain [kg/s]
83 REAL, DIMENSION(:,:), INTENT(IN) :: PHS ! river channel height [m]
84 REAL, DIMENSION(:,:), INTENT(IN) :: PVEL ! River channel velocity [m/s]
85 REAL, DIMENSION(:,:), INTENT(IN) :: PSURF_STO ! river channel storage at t [kg]
86 !
87 REAL, DIMENSION(:,:), INTENT(INOUT) :: PSURF_STO2 ! river channel storage at t+1[kg]
88 !
89 REAL, DIMENSION(:,:), INTENT(OUT) :: PSIN ! Inflow to the surface river reservoir [kg/s]
90 REAL, DIMENSION(:,:), INTENT(OUT) :: PSOUT ! Outflow from the surface river reservoir [kg/s]
91 !
92 REAL, INTENT(OUT) :: PSSTO_ALL,PSSTO2_ALL,PSIN_ALL, &
93  PDRUN_ALL,PSOUT_ALL,PVEL_ALL, &
94  PHS_ALL
95 ! Final budget variable
96 !
97 !* 0.2 declarations of local variables
98 !
99 REAL, DIMENSION(SIZE(PLEN,1),SIZE(PLEN,2)) :: ZQIN
100 REAL, DIMENSION(SIZE(PLEN,1),SIZE(PLEN,2)) :: ZRADIUS
101 REAL, DIMENSION(SIZE(PLEN,1),SIZE(PLEN,2)) :: ZQOUT
102 REAL, DIMENSION(SIZE(PLEN,1),SIZE(PLEN,2)) :: ZSTOMAX
103 !
104 REAL :: ZAREA
105 !
106 INTEGER :: ILON, ILAT, JLON, JLAT, ISEQ, INEXTX, INEXTY
107 !
108 REAL(KIND=JPRB) :: ZHOOK_HANDLE
109 !
110 !-------------------------------------------------------------------------------
111 ! * Init
112 !-------------------------------------------------------------------------------
113 !
114 IF (lhook) CALL dr_hook('TRIP_SURFACE_WATER',0,zhook_handle)
115 !
116 ilon = SIZE(plen,1)
117 ilat = SIZE(plen,2)
118 !
119 psurf_sto2(:,:) = 0.0
120 psin(:,:) = 0.0
121 psout(:,:) = 0.0
122 !
123 zqin(:,:) = 0.0
124 zradius(:,:) = 0.0
125 zqout(:,:) = 0.0
126 zstomax(:,:) = 0.0
127 !
128 !-------------------------------------------------------------------------------
129 ! * Sequence loop (optimized computation)
130 !-------------------------------------------------------------------------------
131 !
132 iseq=1
133  CALL sequence_loop(iseq)
134 !
135 IF(kseqmax>2)THEN
136  iseq=2
137  CALL sequence_loop(iseq)
138 ENDIF
139 !
140 IF(kseqmax>3)THEN
141  DO iseq=3,kseqmax-1
142  CALL sequence_loop(iseq)
143  ENDDO
144 ENDIF
145 !
146 IF(kseqmax>1)THEN
147  iseq=kseqmax
148  CALL sequence_loop(iseq)
149 ENDIF
150 !
151 !-------------------------------------------------------------------------------
152 ! * Budget calculation
153 !-------------------------------------------------------------------------------
154 !
155 IF(oprint)THEN
156 !
157  pdrun_all = 0.0
158  pssto_all = 0.0
159  pssto2_all = 0.0
160  psin_all = 0.0
161  psout_all = 0.0
162  pvel_all = 0.0
163  phs_all = 0.0
164  zarea = 0.0
165 !
166  DO jlat=1,ilat
167  DO jlon=1,ilon
168  IF(kseq(jlon,jlat)>0)THEN
169  pdrun_all = pdrun_all + prunoff(jlon,jlat)+pgout(jlon,jlat)+pqfr(jlon,jlat)-pqrf(jlon,jlat)
170  pssto_all = pssto_all + psurf_sto(jlon,jlat) / parea(jlon,jlat)
171  pssto2_all = pssto2_all + psurf_sto2(jlon,jlat) / parea(jlon,jlat)
172  psin_all = psin_all + zqin(jlon,jlat) / parea(jlon,jlat)
173  psout_all = psout_all + psout(jlon,jlat) / parea(jlon,jlat)
174  ENDIF
175  IF(omask_vel(jlon,jlat))THEN
176  pvel_all = pvel_all + pvel(jlon,jlat) * parea(jlon,jlat)
177  phs_all = phs_all + phs(jlon,jlat) * parea(jlon,jlat)
178  zarea = zarea + parea(jlon,jlat)
179  ENDIF
180  ENDDO
181  ENDDO
182 !
183  IF(zarea>0.0)THEN
184  pvel_all = pvel_all / zarea
185  phs_all = phs_all / zarea
186  ENDIF
187 !
188 ENDIF
189 !
190 IF (lhook) CALL dr_hook('TRIP_SURFACE_WATER',1,zhook_handle)
191 !
192 !-------------------------------------------------------------------------------
193  CONTAINS
194 !-------------------------------------------------------------------------------
195 !
196 SUBROUTINE sequence_loop(KNUM)
197 !
198 INTEGER, INTENT(IN) :: KNUM
199 !
200 REAL(KIND=JPRB) :: ZHOOK_HANDLE
201 !
202 IF (lhook) CALL dr_hook('TRIP_SURFACE_WATER:SEQUENCE_LOOP',0,zhook_handle)
203 !
204 DO jlat=1,ilat
205  DO jlon=1,ilon
206 !
207  IF(kseq(jlon,jlat)==knum)THEN
208 !
209 ! ---------------------------------------------------------------------
210 ! inflow calculation
211 !
212  zqin(jlon,jlat)=zqin(jlon,jlat)+prunoff(jlon,jlat)+pgout(jlon,jlat)+pqfr(jlon,jlat)-pqrf(jlon,jlat)
213  psin(jlon,jlat)=zqin(jlon,jlat)
214 !
215 ! ------------------------------------------------------------------
216 ! river channel storage calculation
217 !
218  zstomax(jlon,jlat) = psurf_sto(jlon,jlat)+zqin(jlon,jlat)*ptstep
219 !
220  psurf_sto2(jlon,jlat) = zstomax(jlon,jlat)/(1.0+ptstep*pvel(jlon,jlat)/plen(jlon,jlat))
221 !
222 ! -------------------------------------------------------------------
223 ! supress numerical artifacs
224 !
225  psurf_sto2(jlon,jlat)=min(zstomax(jlon,jlat),psurf_sto2(jlon,jlat))
226 !
227 ! ------------------------------------------------------------------
228 ! river channel outflow calculation and supress numerical artifacs
229 !
230  zqout(jlon,jlat) = (psurf_sto(jlon,jlat)-psurf_sto2(jlon,jlat))/ptstep+zqin(jlon,jlat)
231  psout(jlon,jlat) = max(zqout(jlon,jlat),0.0)
232 !
233  psurf_sto2(jlon,jlat) = psurf_sto2(jlon,jlat) + (psout(jlon,jlat)-zqout(jlon,jlat))*ptstep
234 !
235 ! ------------------------------------------------------------------
236  IF(kgrcn(jlon,jlat)>=1.AND.kgrcn(jlon,jlat)<=8)THEN
237  inextx=knextx(jlon,jlat)
238  inexty=knexty(jlon,jlat)
239  zqin(inextx,inexty)=zqin(inextx,inexty)+psout(jlon,jlat)
240  ENDIF
241 !
242  ENDIF
243 !
244  ENDDO
245 ENDDO
246 !
247 IF (lhook) CALL dr_hook('TRIP_SURFACE_WATER:SEQUENCE_LOOP',1,zhook_handle)
248 !
249 END SUBROUTINE sequence_loop
250 !
251 !-------------------------------------------------------------------------------
252 END SUBROUTINE trip_surface_water
subroutine trip_surface_water(KLISTING, PTSTEP, KGRCN, KSEQ, KNEXTX, KNEXTY, KSEQMAX, OPRINT, OMASK_VEL, PLEN, PRUNOFF, PVEL, PHS, PSURF_STO, PSURF_STO2, PGOUT, PSIN, PSOUT, PAREA, PQFR, PQRF, PSSTO_ALL, PSSTO2_ALL, PSIN_ALL, PDRUN_ALL, PSOUT_ALL, PVEL_ALL, PHS_ALL)
real, save xm
real xcvel
Definition: modn_trip.F90:45
real, save xrholw
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
real, save xvelmin
subroutine sequence_loop(KNUM)
real, save xhsmin
real, save xundef