SURFEX v8.1
General documentation of Surfex
trip_surface_flood.F90
Go to the documentation of this file.
1 SUBROUTINE trip_surface_flood (KLISTING,PTSTEP,OPRINT,OMASK_FLD, &
2  PTAB_F,PTAB_H,PTAB_VF,PAREA, PVEL, &
3  PLEN,PWIDTH,PN_FLOOD,PHC, &
4  PHS,PSURF_STO,PFLOOD_STO,PSOURCE, &
5  PFLOOD_STO2,PHFLOOD,PFFLOOD,PFLOOD_LEN, &
6  PWFLOOD,PQFR,PQRF,PVFIN,PVFOUT,PHSF, &
7  PFSTO_ALL,PFSTO2_ALL,PSOURCE_ALL, &
8  PFIN_ALL,PFOUT_ALL,PHF_ALL,PFF_ALL )
9 !
10 ! ################################################################
11 !
12 !!**** *TRIP_SURFACE_FLOOD*
13 !!
14 !! PURPOSE
15 !! -------
16 !
17 ! Calculate the flood storage in the next time step based on storages
18 ! of current time step using the Manning equation.
19 !
20 ! Decharme et al., Clim. Dyn., 2012
21 !
22 !!** METHOD
23 !! ------
24 !
25 !! EXTERNAL
26 !! --------
27 !
28 ! None
29 !!
30 !! IMPLICIT ARGUMENTS
31 !! ------------------
32 !!
33 !!
34 !! REFERENCE
35 !! ---------
36 !!
37 !! AUTHOR
38 !! ------
39 !! B. Decharme
40 !!
41 !! MODIFICATIONS
42 !! -------------
43 !! Original 09/01/14
44 !-------------------------------------------------------------------------------
45 !
46 !* 0. DECLARATIONS
47 ! ------------
48 !
49 USE modd_trip_par, ONLY : xrholw, xm, xundef
50 !
51 USE modi_abort_trip
52 USE modi_flood_update
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) :: KLISTING
62 REAL, INTENT(IN) :: PTSTEP ! Trip timestep value (10800s)
63 LOGICAL, INTENT(IN) :: OPRINT !Printable budget key
64 !
65 LOGICAL, DIMENSION(:,:), INTENT(IN) :: OMASK_FLD !Floodplain mask
66 !
67 REAL,DIMENSION(:,:,:), INTENT(IN) :: PTAB_F ! Flood fraction array
68 REAL,DIMENSION(:,:,:), INTENT(IN) :: PTAB_H ! Topo height array
69 REAL,DIMENSION(:,:,:), INTENT(IN) :: PTAB_VF ! Flood volume array
70 !
71 REAL,DIMENSION(:,:), INTENT(IN) :: PAREA ! Grid-cell area [mē]
72 REAL,DIMENSION(:,:), INTENT(IN) :: PVEL ! river velocity [m/s]
73 REAL,DIMENSION(:,:), INTENT(IN) :: PLEN ! river length [m]
74 REAL,DIMENSION(:,:), INTENT(IN) :: PWIDTH ! river widths [m]
75 REAL,DIMENSION(:,:), INTENT(IN) :: PN_FLOOD ! Manning coeficient over floodplains [-] (0.1)
76 REAL,DIMENSION(:,:), INTENT(IN) :: PHC ! River bed depth [m]
77 REAL,DIMENSION(:,:), INTENT(IN) :: PHS ! river channel height [m]
78 REAL,DIMENSION(:,:), INTENT(IN) :: PSURF_STO ! river channel storage at t [kg]
79 REAL,DIMENSION(:,:), INTENT(IN) :: PFLOOD_STO ! Floodplain water storage at t [kg]
80 REAL,DIMENSION(:,:), INTENT(IN) :: PSOURCE ! precip-infiltration-evaporation [kg/s]
81 !
82 REAL,DIMENSION(:,:), INTENT(INOUT) :: PFLOOD_STO2! Floodplain water storage at t+1 [kg]
83 !
84 REAL,DIMENSION(:,:), INTENT(OUT) :: PHFLOOD ! Floodplain water depth [m]
85 REAL,DIMENSION(:,:), INTENT(OUT) :: PFFLOOD ! Fraction of flood [-]
86 REAL,DIMENSION(:,:), INTENT(OUT) :: PFLOOD_LEN ! Floodplain length along the river [m]
87 REAL,DIMENSION(:,:), INTENT(OUT) :: PWFLOOD ! Floodplain width [m]
88 !
89 REAL,DIMENSION(:,:), INTENT(OUT) :: PQFR ! Flood flow to river [kg/s]
90 REAL,DIMENSION(:,:), INTENT(OUT) :: PQRF ! River flow to floodplain [kg/s]
91 REAL,DIMENSION(:,:), INTENT(OUT) :: PVFIN ! River flow to flood velocity [m/s]
92 REAL,DIMENSION(:,:), INTENT(OUT) :: PVFOUT! Flood flow to river velocity [m/s]
93 REAL,DIMENSION(:,:), INTENT(OUT) :: PHSF ! River-Floodplain depth comparison [m] during dt
94 !
95 REAL, INTENT(OUT) :: PFSTO_ALL,PFSTO2_ALL,PSOURCE_ALL, &
96  PFIN_ALL,PFOUT_ALL,PHF_ALL,PFF_ALL
97 ! Final budget variable
98 !
99 !* 0.2 declarations of local variables
100 !
101 REAL, PARAMETER :: ZLEN_MIN = 1.e-6
102 !
103 REAL, DIMENSION(SIZE(PAREA,1),SIZE(PAREA,2)) :: ZMF
104 REAL, DIMENSION(SIZE(PAREA,1),SIZE(PAREA,2)) :: ZSLOPE
105 REAL, DIMENSION(SIZE(PAREA,1),SIZE(PAREA,2)) :: ZRADIUS
106 REAL, DIMENSION(SIZE(PAREA,1),SIZE(PAREA,2)) :: ZDIST
107 REAL, DIMENSION(SIZE(PAREA,1),SIZE(PAREA,2)) :: ZDELTA
108 REAL, DIMENSION(SIZE(PAREA,1),SIZE(PAREA,2)) :: ZMF_IN
109 REAL, DIMENSION(SIZE(PAREA,1),SIZE(PAREA,2)) :: ZMF_OUT
110 REAL, DIMENSION(SIZE(PAREA,1),SIZE(PAREA,2)) :: ZFLD_LEN
111 REAL, DIMENSION(SIZE(PAREA,1),SIZE(PAREA,2)) :: ZAREA_SG
112 REAL, DIMENSION(SIZE(PAREA,1),SIZE(PAREA,2)) :: ZVRIV
113 REAL, DIMENSION(SIZE(PAREA,1),SIZE(PAREA,2)) :: ZVFLD
114 REAL, DIMENSION(SIZE(PAREA,1),SIZE(PAREA,2)) :: ZVINER
115 !
116 REAL :: ZAREA
117 !
118 INTEGER :: ILON, ILAT, JLON, JLAT
119 !
120 REAL(KIND=JPRB) :: ZHOOK_HANDLE
121 !
122 !-------------------------------------------------------------------------------
123 ! * Init
124 !-------------------------------------------------------------------------------
125 !
126 IF (lhook) CALL dr_hook('TRIP_SURFACE_FLOOD',0,zhook_handle)
127 !
128 ilon = SIZE(parea,1)
129 ilat = SIZE(parea,2)
130 !
131 pflood_sto2(:,:) = 0.0
132 phsf(:,:) = 0.0
133 pvfin(:,:) = 0.0
134 pvfout(:,:) = 0.0
135 pqfr(:,:) = 0.0
136 pqrf(:,:) = 0.0
137 !
138 zmf(:,:) = 0.0
139 zslope(:,:) = 0.0
140 zradius(:,:) = 0.0
141 zdist(:,:) = 0.0
142 zdelta(:,:) = 0.0
143 zmf_in(:,:) = 0.0
144 zmf_out(:,:) = 0.0
145 zfld_len(:,:) = 0.0
146 !
147 WHERE(omask_fld(:,:))
148  zarea_sg(:,:) = parea(:,:)-(plen(:,:)*pwidth(:,:))
149 ELSEWHERE
150  zarea_sg(:,:) = parea(:,:)
151 ENDWHERE
152 !
153 !-------------------------------------------------------------------------------
154 ! * Update the floodplain storage due to source (Precip inter - LEf - Infil)
155 !-------------------------------------------------------------------------------
156 !
157 WHERE(omask_fld(:,:))
158  pflood_sto2(:,:)=pflood_sto(:,:)+ptstep*psource(:,:)
159 ENDWHERE
160 !
161 !------------------------------------------------------------------
162 ! * Update the floodplain geomorphological properties
163 !------------------------------------------------------------------
164 !
165  CALL flood_update(ptab_f,ptab_h,ptab_vf,zarea_sg,pflood_sto2, &
166  plen,phflood,pfflood,pflood_len,pwflood )
167 !
168 zfld_len(:,:)=max(zlen_min,pflood_len(:,:))
169 !
170 !------------------------------------------------------------------
171 ! * Update the floodplain storage due to inflow or outflow
172 !------------------------------------------------------------------
173 !
174 DO jlat=1,ilat
175  DO jlon=1,ilon
176 !
177  IF(omask_fld(jlon,jlat))THEN
178 !
179 ! ------------------------------------------------------------------
180 ! Calculate the potential water mass exchange
181 !
182  phsf(jlon,jlat)=phs(jlon,jlat)-phc(jlon,jlat)-phflood(jlon,jlat)
183 !
184  zmf(jlon,jlat)=phsf(jlon,jlat)*zfld_len(jlon,jlat)*pwidth(jlon,jlat)*xrholw
185  zdist(jlon,jlat)=0.5*(pwidth(jlon,jlat)+pwflood(jlon,jlat))
186  zslope(jlon,jlat)=phsf(jlon,jlat)/zdist(jlon,jlat)
187 !
188  ENDIF
189 !
190 ! ------------------------------------------------------------------
191 ! Floodplain inflow case
192 !
193  IF(zmf(jlon,jlat)>0.0.AND.pfflood(jlon,jlat)<1.0)THEN
194 !
195  zradius(jlon,jlat) = phs(jlon,jlat)-phc(jlon,jlat)
196  zradius(jlon,jlat) = exp(xm*log(zradius(jlon,jlat)))
197 !
198  zvfld(jlon,jlat) = zradius(jlon,jlat)*sqrt(zslope(jlon,jlat))/pn_flood(jlon,jlat)
199  zvriv(jlon,jlat) = max(pvel(jlon,jlat),zvfld(jlon,jlat))
200  zviner(jlon,jlat) = sqrt(zvriv(jlon,jlat)*zvfld(jlon,jlat))
201  pvfin(jlon,jlat) = min(zviner(jlon,jlat),zdist(jlon,jlat)/ptstep)
202  pvfout(jlon,jlat) = 0.0
203 !
204  zmf_in(jlon,jlat) = zmf(jlon,jlat)
205  zmf_out(jlon,jlat) = 0.0
206 !
207  ENDIF
208 !
209 ! ------------------------------------------------------------------
210 ! Floodplain outflow case
211 !
212  IF(zmf(jlon,jlat)<0.0.AND.pfflood(jlon,jlat)>0.0)THEN
213 !
214  zradius(jlon,jlat) = phflood(jlon,jlat)
215  zradius(jlon,jlat) = exp(xm*log(zradius(jlon,jlat)))
216 !
217  pvfin(jlon,jlat) = 0.0
218  zvfld(jlon,jlat) = zradius(jlon,jlat)*sqrt(-1.0*zslope(jlon,jlat))/pn_flood(jlon,jlat)
219  pvfout(jlon,jlat) = min(zvfld(jlon,jlat),zdist(jlon,jlat)/ptstep)
220 !
221  zmf_in(jlon,jlat) = 0.0
222  zmf_out(jlon,jlat) = abs(zmf(jlon,jlat))
223 !
224  zdelta(jlon,jlat) = merge(1.0,0.0,pflood_sto2(jlon,jlat)<zmf_out(jlon,jlat))
225 !
226  ENDIF
227 !
228 ! ------------------------------------------------------------------
229 ! Update the floodplain storage
230 !
231  IF(omask_fld(jlon,jlat).AND.zmf(jlon,jlat)/=0.0)THEN
232 !
233  pqrf(jlon,jlat) = zmf_in(jlon,jlat)*pvfin(jlon,jlat)/zdist(jlon,jlat)
234 !
235  pqfr(jlon,jlat) = (1.0-zdelta(jlon,jlat)) * zmf_out(jlon,jlat)*pvfout(jlon,jlat)/zdist(jlon,jlat) &
236  + zdelta(jlon,jlat) * pflood_sto2(jlon,jlat)/ptstep
237 !
238  pflood_sto2(jlon,jlat) = pflood_sto2(jlon,jlat)+ptstep*(pqrf(jlon,jlat)-pqfr(jlon,jlat))
239 !
240  ENDIF
241 !
242  ENDDO
243 ENDDO
244 !
245 !------------------------------------------------------------------
246 ! * Update the floodplain geomorphological properties
247 !------------------------------------------------------------------
248 !
249  CALL flood_update(ptab_f,ptab_h,ptab_vf,zarea_sg,pflood_sto2, &
250  plen,phflood,pfflood,pflood_len,pwflood )
251 !
252 !-------------------------------------------------------------------------------
253 ! * Budget calculation
254 !-------------------------------------------------------------------------------
255 !
256 IF(oprint)THEN
257 !
258  pfsto_all = 0.0
259  pfsto2_all = 0.0
260  psource_all = 0.0
261  pfin_all = 0.0
262  pfout_all = 0.0
263  phf_all = 0.0
264  pff_all = 0.0
265  zarea = 0.0
266 !
267  DO jlat=1,ilat
268  DO jlon=1,ilon
269  IF(omask_fld(jlon,jlat))THEN
270  pfsto_all = pfsto_all + pflood_sto(jlon,jlat) / parea(jlon,jlat)
271  pfsto2_all = pfsto2_all + pflood_sto2(jlon,jlat) / parea(jlon,jlat)
272  pfin_all = pfin_all + pqrf(jlon,jlat) / parea(jlon,jlat)
273  pfout_all = pfout_all + pqfr(jlon,jlat) / parea(jlon,jlat)
274  psource_all= psource_all+ psource(jlon,jlat) / parea(jlon,jlat)
275  phf_all = phf_all + phflood(jlon,jlat) * parea(jlon,jlat)
276  pff_all = pff_all + pfflood(jlon,jlat) * parea(jlon,jlat)
277  zarea = zarea + parea(jlon,jlat)
278  ENDIF
279  ENDDO
280  ENDDO
281 !
282  IF(zarea>0.0)THEN
283  phf_all = phf_all / zarea
284  pff_all = pff_all / zarea
285  ENDIF
286 !
287 ENDIF
288 !
289 !-------------------------------------------------------------------------------
290 IF (lhook) CALL dr_hook('TRIP_SURFACE_FLOOD',1,zhook_handle)
291 !-------------------------------------------------------------------------------
292 !-------------------------------------------------------------------------------
293 END SUBROUTINE trip_surface_flood
real, save xm
subroutine flood_update(PTAB_F, PTAB_H, PTAB_VF, PAREA, PFLOOD_STO, PLEN, PHFLOOD, PFFLOOD, PFLOOD_LEN, PWFLOOD)
Definition: flood_update.F90:4
real, save xrholw
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine trip_surface_flood(KLISTING, PTSTEP, OPRINT, OMASK_FLD, PTAB_F, PTAB_H, PTAB_VF, PAREA, PVEL, PLEN, PWIDTH, PN_FLOOD, PHC, PHS, PSURF_STO, PFLOOD_STO, PSOURCE, PFLOOD_STO2, PHFLOOD, PFFLOOD, PFLOOD_LEN, PWFLOOD, PQFR, PQRF, PVFIN, PVFOUT, PHSF, PFSTO_ALL, PFSTO2_ALL, PSOURCE_ALL, PFIN_ALL, PFOUT_ALL, PHF_ALL, PFF_ALL)
real, save xundef