SURFEX v8.1
General documentation of Surfex
flood_redistrib.F90
Go to the documentation of this file.
1 ! #########
2  SUBROUTINE flood_redistrib (TP, TPG, &
3  KLON,KLAT,PTSTEP,PREAD,PSRCFLD,PRESIDU)
4 ! #####################################################################
5 !
6 !!**** *FLOOD_REDISTRIB*
7 !!
8 !! PURPOSE
9 !! -------
10 !
11 !
12 !!** METHOD
13 !! ------
14 !
15 ! Direct calculation
16 !
17 !! EXTERNAL
18 !! --------
19 !
20 ! None
21 !!
22 !! IMPLICIT ARGUMENTS
23 !! ------------------
24 !!
25 !!
26 !! REFERENCE
27 !! ---------
28 !!
29 !! AUTHOR
30 !! ------
31 !! B. Decharme
32 !!
33 !! MODIFICATIONS
34 !! -------------
35 !! Original 01/12/13
36 !-------------------------------------------------------------------------------
37 !
38 !* 0. DECLARATIONS
39 ! ------------
40 !
41 USE modd_trip, ONLY : trip_t
42 USE modd_trip_grid, ONLY : trip_grid_t
43 !
45 !
46 USE modd_trip_par, ONLY : xundef, xrholw
47 !
48 USE modi_abort_trip
49 !
50 USE yomhook ,ONLY : lhook, dr_hook
51 USE parkind1 ,ONLY : jprb
52 !
53 IMPLICIT NONE
54 !
55 !* 0.1 declarations of arguments
56 !
57 !
58 TYPE(trip_t), INTENT(INOUT) :: TP
59 TYPE(trip_grid_t), INTENT(INOUT) :: TPG
60 !
61 INTEGER, INTENT(IN) :: KLON
62 INTEGER, INTENT(IN) :: KLAT
63 !
64 REAL, INTENT(IN) :: PTSTEP
65 !
66 REAL, DIMENSION(:,:), INTENT(IN ) :: PREAD ![kg/m2/s]
67 REAL, DIMENSION(:,:), INTENT(OUT) :: PSRCFLD ![kg/m2/s]
68 REAL, DIMENSION(:,:), INTENT(OUT) :: PRESIDU ![kg/m2/s]
69 !
70 !
71 !* 0.2 declarations of local variables
72 !
73 REAL, PARAMETER :: ZNEG = -1.0
74 REAL, PARAMETER :: ZLIM = -0.95
75 REAL, PARAMETER :: ZSTO = 0.1 ! kg/m2
76 !
77 LOGICAL, DIMENSION(0:TPG%NBASMAX) :: LBAS_FLD
78 !
79 REAL, DIMENSION(TPG%NBASMAX) :: ZBAS_REMAIN
80 REAL, DIMENSION(TPG%NBASMAX) :: ZBAS_AREA
81 REAL, DIMENSION(TPG%NBASMAX) :: ZBAS_STO
82 !
83 REAL, DIMENSION(KLON,KLAT) :: ZFLDBUDGET
84 REAL, DIMENSION(KLON,KLAT) :: ZRATIO
85 REAL, DIMENSION(KLON,KLAT) :: ZREMAIN
86 !
87 REAL :: ZFLUXE_IN
88 REAL :: ZFLUXE_OUT
89 REAL :: ZAREA_TOT
90 REAL :: ZTOT_STO
91 REAL :: ZBILAN
92 !
93 INTEGER :: JBAS, JLON, JLAT, ICOUNT
94 !
95 REAL(KIND=JPRB) :: ZHOOK_HANDLE
96 !
97 !-------------------------------------------------------------------------------
98 !
99 IF (lhook) CALL dr_hook('FLOOD_REDISTRIB',0,zhook_handle)
100 !
101 !-------------------------------------------------------------------------------
102 ! * Init
103 !-------------------------------------------------------------------------------
104 !
105 zfldbudget(:,:) = xundef
106 !
107 presidu(:,:) = 0.0
108 psrcfld(:,:) = 0.0
109 !
110 IF(all(pread(:,:)==0.0))THEN
111 ! If no fluxes, return
112  IF (lhook) CALL dr_hook('FLOOD_REDISTRIB',1,zhook_handle)
113  RETURN
114 ENDIF
115 !
116 !-------------------------------------------------------------------------------
117 ! * Localized water budget
118 !-------------------------------------------------------------------------------
119 !
120 WHERE(tpg%GMASK_FLD(:,:).AND.pread(:,:)/=0.0)
121  zfldbudget(:,:) = tp%XFLOOD_STO(:,:)+pread(:,:)*tpg%XAREA(:,:)*ptstep ! kg
122 ENDWHERE
123 !
124 WHERE(tp%XFLOOD_STO(:,:)>0.0.AND.zfldbudget(:,:)>=0.0.AND.zfldbudget(:,:)/=xundef)
125  psrcfld(:,:) = pread(:,:)
126  presidu(:,:) = 0.0
127 ENDWHERE
128 !
129 WHERE(tp%XFLOOD_STO(:,:)>0.0.AND.zfldbudget(:,:)<0.0.AND.zfldbudget(:,:)/=xundef)
130  psrcfld(:,:) = zneg*tp%XFLOOD_STO(:,:)/(tpg%XAREA(:,:)*ptstep) ! kg/m2/s
131  presidu(:,:) = max(zlim*tp%XSURF_STO(:,:),zfldbudget(:,:))/(tpg%XAREA(:,:)*ptstep) ! kg/m2/s
132 ENDWHERE
133 !
134 zremain(:,:) = pread(:,:) - psrcfld(:,:) - presidu(:,:)
135 !
136 !-------------------------------------------------------------------------------
137 ! * If some residue remains, redistribute the redidue
138 !-------------------------------------------------------------------------------
139 !
140 lbas_fld(:) = .false.
141 !
142 zfluxe_in = 0.0
143 ztot_sto = 0.0
144 !
145 DO jlat=1,klat
146  DO jlon=1,klon
147  jbas = tpg%NBASID(jlon,jlat)
148  IF(tpg%GMASK_FLD(jlon,jlat).AND.(.NOT.lbas_fld(jbas)))THEN
149  lbas_fld(jbas)=(tp%XFLOOD_STO(jlon,jlat)>0.0)
150  ENDIF
151  IF(tpg%GMASK_FLD(jlon,jlat))THEN
152  zfluxe_in = zfluxe_in + tpg%XAREA(jlon,jlat) * zremain(jlon,jlat) ! kg/s
153  ztot_sto = ztot_sto + tp%XSURF_STO(jlon,jlat)
154  ENDIF
155  ENDDO
156 ENDDO
157 !
158 zbas_area(:) = 0.0
159 zbas_sto(:) = 0.0
160 !
161 DO jlat=1,klat
162  DO jlon=1,klon
163  jbas=tpg%NBASID(jlon,jlat)
164  IF(tpg%GMASK_FLD(jlon,jlat).AND.lbas_fld(jbas).AND.tp%XFLOOD_STO(jlon,jlat)>0.0)THEN
165  zbas_area(jbas)=zbas_area(jbas)+tpg%XAREA (jlon,jlat)
166  zbas_sto(jbas)=zbas_sto(jbas)+tp%XSURF_STO(jlon,jlat)
167  ENDIF
168  ENDDO
169 ENDDO
170 !
171 icount = 0
172 !
173 DO jbas=tpg%NBASMIN,tpg%NBASMAX
174  IF(lbas_fld(jbas))THEN
175  IF((zbas_sto(jbas)/zbas_area(jbas))<=zsto)THEN
176  !WRITE(NLISTING,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
177  !WRITE(NLISTING,*)'A basin is empty :',JBAS
178  !WRITE(NLISTING,*)'MASS (kg/m2) = ', ZBAS_STO(JBAS)/ZBAS_AREA(JBAS)
179  !WRITE(NLISTING,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
180  lbas_fld(jbas)=.false.
181  ELSE
182  icount=icount+1
183  ENDIF
184  ENDIF
185 ENDDO
186 !
187 IF(zfluxe_in/=0.0.AND.icount==0)THEN
188 !
189 !------------------------------------------------------------------------------------------
190 ! * If there is no flooded areas, redistribute the redidue globaly
191 !------------------------------------------------------------------------------------------
192 !
193  DO jlat=1,klat
194  DO jlon=1,klon
195  IF(tpg%GMASK_FLD(jlon,jlat))THEN
196  zratio(jlon,jlat) = tp%XSURF_STO(jlon,jlat)/tpg%XAREA(jlon,jlat)
197  presidu(jlon,jlat) = presidu(jlon,jlat) + zfluxe_in * zratio(jlon,jlat) / ztot_sto ! kg/m2/s
198  ENDIF
199  ENDDO
200  ENDDO
201 !
202 ELSE
203 !
204 !-------------------------------------------------------------------------------
205 ! * Redistribute the redidue over each basin where there is flood
206 !-------------------------------------------------------------------------------
207 !
208  zbas_remain(:) = 0.0
209  zbas_sto(:) = 0.0
210 !
211  zfluxe_in = 0.0
212  ztot_sto = 0.0
213 !
214  DO jlat=1,klat
215  DO jlon=1,klon
216  jbas=tpg%NBASID(jlon,jlat)
217  IF(tpg%GMASK_FLD(jlon,jlat).AND.lbas_fld(jbas).AND.tp%XFLOOD_STO(jlon,jlat)>0.0)THEN
218  ztot_sto = ztot_sto + tp%XFLOOD_STO(jlon,jlat)
219  zbas_sto(jbas)=zbas_sto(jbas) + tp%XFLOOD_STO(jlon,jlat)
220  ENDIF
221  IF(tpg%GMASK_FLD(jlon,jlat).AND.lbas_fld(jbas))THEN
222  zbas_remain(jbas)=zbas_remain(jbas)+tpg%XAREA(jlon,jlat)*zremain(jlon,jlat) ! kg/s
223  ENDIF
224  IF(tpg%GMASK_FLD(jlon,jlat).AND.(.NOT.lbas_fld(jbas)))THEN
225  zfluxe_in = zfluxe_in + tpg%XAREA(jlon,jlat) * zremain(jlon,jlat) ! kg/s
226  ENDIF
227  ENDDO
228  ENDDO
229 !
230  DO jlat=1,klat
231  DO jlon=1,klon
232  jbas = tpg%NBASID(jlon,jlat)
233  IF(tpg%GMASK_FLD(jlon,jlat).AND.lbas_fld(jbas).AND.tp%XFLOOD_STO(jlon,jlat)>0.0)THEN
234  zratio(jlon,jlat) = tp%XFLOOD_STO(jlon,jlat)/tpg%XAREA(jlon,jlat)
235  psrcfld(jlon,jlat) = psrcfld(jlon,jlat) + zbas_remain(jbas)*zratio(jlon,jlat)/zbas_sto(jbas) & ! kg/m2/s
236  + zfluxe_in *zratio(jlon,jlat)/ztot_sto ! kg/m2/s
237  ENDIF
238  ENDDO
239  ENDDO
240 !
241 ENDIF
242 !
243 !-------------------------------------------------------------------------------
244 ! * Comput cumulated Fluxes (kg/s) and flooded areas (-)
245 !-------------------------------------------------------------------------------
246 !
247 zfluxe_in = 0.0
248 zfluxe_out = 0.0
249 zarea_tot = 0.0
250 !
251 DO jlat=1,klat
252  DO jlon=1,klon
253  IF(tpg%GMASK_FLD(jlon,jlat))THEN
254  zarea_tot = zarea_tot + tpg%XAREA(jlon,jlat)
255  zfluxe_in = zfluxe_in + tpg%XAREA(jlon,jlat) * pread(jlon,jlat)
256  zfluxe_out = zfluxe_out + tpg%XAREA(jlon,jlat) * (psrcfld(jlon,jlat)+presidu(jlon,jlat))
257  ENDIF
258  ENDDO
259 ENDDO
260 !
261 zbilan=(zfluxe_in-zfluxe_out)/zarea_tot
262 !
263 IF(abs(zbilan)>1.e-12)THEN
264  WRITE(nlisting,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
265  WRITE(nlisting,*)'Redistribution of flood sources has a problem'
266  WRITE(nlisting,*)'BILAN = ', zbilan, zfluxe_in/zarea_tot, zfluxe_out/zarea_tot
267  WRITE(nlisting,*)'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
268  CALL abort_trip('FLOOD_REDISTRIB: Redistribution of flood sources has a problem')
269 ENDIF
270 !
271 !-------------------------------------------------------------------------------
272 !
273 IF (lhook) CALL dr_hook('FLOOD_REDISTRIB',1,zhook_handle)
274 !
275 !-------------------------------------------------------------------------------
276 !
277 END SUBROUTINE flood_redistrib
real, save xrholw
integer, parameter jprb
Definition: parkind1.F90:32
subroutine flood_redistrib(TP, TPG,
logical lhook
Definition: yomhook.F90:15
subroutine abort_trip(YTEXT)
Definition: abort_trip.F90:3
real, save xundef