SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
budget_coupl_rout.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 budget_coupl_rout (DGEI, DGMI, I, U, &
8  kni,kforc_step)
9 ! ##########################
10 !
11 !!
12 !! PURPOSE
13 !! -------
14 !
15 !
16 !!** METHOD
17 !! ------
18 !
19 !! EXTERNAL
20 !! --------
21 !!
22 !! none
23 !!
24 !! IMPLICIT ARGUMENTS
25 !! ------------------
26 !!
27 !! REFERENCE
28 !! ---------
29 !!
30 !! AUTHOR
31 !! ------
32 !!
33 !! L. Bouilloud & B. Vincendon * Meteo-France *
34 !!
35 !! MODIFICATIONS
36 !! -------------
37 !!
38 !! Original 03/2008
39 !! 03/2014: Modif BV : add more variables
40 !-------------------------------------------------------------------------------
41 !
42 !* 0. DECLARATIONS
43 ! ------------
44 !
47 USE modd_isba_n, ONLY : isba_t
48 USE modd_surf_atm_n, ONLY : surf_atm_t
49 !
50 USE modd_budget_coupl_rout ! contains all useful variables XB_*
51 !
52 USE modd_topodyn, ONLY : nncat, xqtot, xtopd_step, xqb_dr, xqb_run
53 USE modd_coupling_topd, ONLY : xrunoff_top, xrun_torout, xdr_torout, xatop, nnb_topd
54 
55 !
56 USE modd_surf_par
57 USE modd_csts, ONLY : xrholw
58 !
59 USE modd_forc_atm, ONLY : xsnow ,&! snow precipitation (kg/m2/s)
60  xrain ! liquid precipitation (kg/m2/s)
61 !
64 USE modi_avg_patch_wg
65 USE modi_dg_dfto3l
66 !USE MODI_WRITE_DISCHARGE_FILE_PRTEST
67 !
68 USE yomhook ,ONLY : lhook, dr_hook
69 USE parkind1 ,ONLY : jprb
70 !
71 IMPLICIT NONE
72 !
73 !* 0.1 declarations of arguments
74 !
75 TYPE(diag_evap_isba_t), INTENT(INOUT) :: dgei
76 TYPE(diag_misc_isba_t), INTENT(INOUT) :: dgmi
77 TYPE(isba_t), INTENT(INOUT) :: i
78 TYPE(surf_atm_t), INTENT(INOUT) :: u
79 !
80 INTEGER, INTENT(IN) :: kni ! expected physical size of full surface array
81 INTEGER, INTENT(IN) :: kforc_step ! time step
82 !
83 !* 0.2 declarations of local variables
84 REAL :: zfact0, zfact1, zfact2
85 INTEGER :: jmesh,jcat
86 REAL, DIMENSION(SIZE(I%XWG,1),3) :: zwg_3l,zwgi_3l,zdg_3l
87 REAL, DIMENSION(KNI) :: zb_dwgtot,zb_dwgitot,zb_dswetot,zb_dwr,zb_watbud
88 !
89 REAL(KIND=JPRB) :: zhook_handle
90 !-------------------------------------------------------------------------------
91 IF (lhook) CALL dr_hook('BUDGET_COUPL_ROUT',0,zhook_handle)
92 !
93 !* 1. Budget computation:
94 ! ---------------
95 IF (i%CISBA=='DIF') THEN
96  CALL dg_dfto3l(i, &
97  SIZE(i%XWG,1),zdg_3l)
98  zwg_3l(:,2)=dgmi%XFRD2_TWG(:)
99  zwg_3l(:,3)=dgmi%XFRD3_TWG(:)
100  zwgi_3l(:,2)=dgmi%XFRD2_TWGI(:)
101  zwgi_3l(:,3)=dgmi%XFRD3_TWGI(:)
102 
103 ELSEIF (i%CISBA=='3-L') THEN
104  CALL avg_patch_wg(i, &
105  SIZE(i%XWG,1),zwg_3l,zwgi_3l,zdg_3l)
106 ENDIF
107 !
108  CALL unpack_same_rank(u%NR_NATURE,dgei%XRAINFALL(:), xb_rain)
109  CALL unpack_same_rank(u%NR_NATURE,dgei%XSNOWFALL(:), xb_snow)
110 !
111  CALL unpack_same_rank(u%NR_NATURE,dgei%XAVG_DWR, zb_dwr)
112  CALL unpack_same_rank(u%NR_NATURE,dgei%XAVG_EVAPC, xb_evap)
113 !
114  CALL unpack_same_rank(u%NR_NATURE,dgei%XAVG_RUNOFFC,xb_runoff_isba)
115  CALL unpack_same_rank(u%NR_NATURE,dgei%XAVG_HORTC,xb_horton)
116  CALL unpack_same_rank(u%NR_NATURE,dgei%XAVG_WATBUD, zb_watbud)
117 xb_runoff_topd = xb_runoff_isba
118  CALL unpack_same_rank(u%NR_NATURE,dgei%XAVG_DRAINC, xb_drain)
119 !
120  CALL unpack_same_rank(u%NR_NATURE,zwg_3l(:,2) ,xb_wg2)
121  CALL unpack_same_rank(u%NR_NATURE,zwg_3l(:,3) ,xb_wg3)
122 WHERE ( xb_wg2/=xundef .AND. xb_dg2/=xundef .AND. xb_wg3/=xundef .AND. xb_dg3/=xundef )
123  xb_wgtot(:) = xb_wg2(:)*xb_dg2(:) + xb_wg3(:)*(xb_dg3(:)-xb_dg2(:)) !m3/m2
124 ELSEWHERE
125  xb_wgtot(:) = xundef
126 ENDWHERE
127 !
128  CALL unpack_same_rank(u%NR_NATURE,zwgi_3l(:,2) ,xb_wgi2)
129  CALL unpack_same_rank(u%NR_NATURE,zwgi_3l(:,3) ,xb_wgi3)
130 WHERE ( xb_wgi2/=xundef .AND. xb_dg2/=xundef .AND. xb_wgi3/=xundef .AND. xb_dg3/=xundef )
131  xb_wgitot(:) = xb_wgi2(:)*xb_dg2(:) + xb_wgi3(:)*(xb_dg3(:)-xb_dg2(:)) !m3/m2
132 ELSEWHERE
133  xb_wgitot(:) = xundef
134 ENDWHERE
135 !
136  CALL unpack_same_rank(u%NR_NATURE,i%TSNOW%WSNOW(:,1,1),xb_swe1)
137  CALL unpack_same_rank(u%NR_NATURE,i%TSNOW%WSNOW(:,2,1),xb_swe2)
138  CALL unpack_same_rank(u%NR_NATURE,i%TSNOW%WSNOW(:,3,1),xb_swe3)
139 xb_swetot(:) = xb_swe1(:)+xb_swe2(:)+xb_swe3(:)
140 !
141 DO jcat=1,nncat
142  xb_qtot(jcat) = sum(xqtot(jcat,1:kforc_step))
143  xb_qrun(jcat) = sum(xqb_run(jcat,1:kforc_step))
144  xb_qdr(jcat) = sum(xqb_dr(jcat,1:kforc_step))
145 ENDDO
146 !
147 DO jcat=1,nncat
148  !
149  DO jmesh=1,kni
150  !
151  IF ( xb_dg2(jmesh)/=xundef ) THEN
152 !! Water going in the system
153  zfact0 = xb_abv_bymesh(jmesh,jcat) * xb_mesh_size(jmesh)
154  zfact1 = zfact0 / xrholw
155  zfact2 = nnb_topd * zfact1
156  !ZFACT2 = XTOPD_STEP * ZFACT1
157  !
158 !! variable =1 : Rain
159  xb_var_bv(kforc_step,jcat,1) = xb_var_bv(kforc_step,jcat,1) + xb_rain(jmesh) * zfact2
160 !! variable =2 : Snow
161  xb_var_bv(kforc_step,jcat,2) = xb_var_bv(kforc_step,jcat,2) + xb_snow(jmesh) * zfact2
162 !! Water going out of the system
163 !! variable =3 : Incerception
164  xb_var_bv(kforc_step,jcat,3) = xb_var_bv(kforc_step,jcat,3) + zb_dwr(jmesh) * zfact2
165 !! variable =4 : Evaporation
166  xb_var_bv(kforc_step,jcat,4) = xb_var_bv(kforc_step,jcat,4) + (xb_evap(jmesh)-xb_evapm(jmesh)) * zfact1
167 !! variable =5 : Runoff
168  xb_var_bv(kforc_step,jcat,5) = xb_var_bv(kforc_step,jcat,5) + (xb_runoff_topd(jmesh)-xb_runoff_topdm(jmesh)) * zfact1
169 !! variable =6 : Drainage
170  xb_var_bv(kforc_step,jcat,6) = xb_var_bv(kforc_step,jcat,6) + (xb_drain(jmesh)-xb_drainm(jmesh)) * zfact1
171 !! variable =7 : Variation of liquid water stocked in the ground
172  xb_var_bv(kforc_step,jcat,7) = xb_var_bv(kforc_step,jcat,7) + (xb_wgtot(jmesh)-xb_wgtotm(jmesh)) * zfact0
173 !! variable =8 : Variation of solid water stocked in the ground
174  xb_var_bv(kforc_step,jcat,8) = xb_var_bv(kforc_step,jcat,8) + (xb_wgitot(jmesh)-xb_wgitotm(jmesh)) * zfact0
175 !! variable =9 : Variation of melting snow
176  xb_var_bv(kforc_step,jcat,9) = xb_var_bv(kforc_step,jcat,9) + (xb_swetot(jmesh)-xb_swetotm(jmesh)) * zfact0
177 !! variable =11 : Hortonian Runoff
178  xb_var_bv(kforc_step,jcat,11) = xb_var_bv(kforc_step,jcat,11) + (xb_horton(jmesh)-xb_hortonm(jmesh)) * zfact1
179 !! variable =12 : ISBA water budget
180  xb_var_bv(kforc_step,jcat,12) = xb_var_bv(kforc_step,jcat,12) + zb_watbud(jmesh) * zfact2
181 
182  !! bilan hors BV en m3
183  zfact0 = (1.-xb_abv_bymesh(jmesh,jcat)) * xb_mesh_size(jmesh)
184  zfact1 = zfact0 / xrholw
185  zfact2 = nnb_topd * zfact1
186 ! ZFACT2 = XTOPD_STEP * ZFACT1
187  !
188  xb_var_nobv(kforc_step,jcat,1) = xb_var_nobv(kforc_step,jcat,1) + xb_rain(jmesh) * zfact2
189  xb_var_nobv(kforc_step,jcat,2) = xb_var_nobv(kforc_step,jcat,2) + xb_snow(jmesh) * zfact2
190  xb_var_nobv(kforc_step,jcat,3) = xb_var_nobv(kforc_step,jcat,3) + zb_dwr(jmesh) * zfact2
191  xb_var_nobv(kforc_step,jcat,4) = xb_var_nobv(kforc_step,jcat,4) + (xb_evap(jmesh)-xb_evapm(jmesh)) * zfact1
192  xb_var_nobv(kforc_step,jcat,5) = xb_var_nobv(kforc_step,jcat,5) + (xb_runoff_isba(jmesh)-xb_runoff_isbam(jmesh)) * zfact1
193  xb_var_nobv(kforc_step,jcat,6) = xb_var_nobv(kforc_step,jcat,6) + (xb_drain(jmesh)-xb_drainm(jmesh)) * zfact1
194  xb_var_nobv(kforc_step,jcat,7) = xb_var_nobv(kforc_step,jcat,7) + (xb_wgtot(jmesh)-xb_wgtotm(jmesh)) * zfact0
195  xb_var_nobv(kforc_step,jcat,8) = xb_var_nobv(kforc_step,jcat,8) + (xb_wgitot(jmesh)-xb_wgitotm(jmesh)) * zfact0
196  xb_var_nobv(kforc_step,jcat,9) = xb_var_nobv(kforc_step,jcat,9) + (xb_swetot(jmesh)-xb_swetotm(jmesh)) * zfact0
197  xb_var_nobv(kforc_step,jcat,11) = xb_var_nobv(kforc_step,jcat,11) + (xb_horton(jmesh)-xb_hortonm(jmesh)) * zfact1
198  xb_var_nobv(kforc_step,jcat,12) = xb_var_nobv(kforc_step,jcat,12) + zb_watbud(jmesh) * zfact2
199  !
200  ENDIF
201  !
202  ENDDO
203  !
204  xb_var_bv(kforc_step,jcat,10) = sum(xb_var_bv(kforc_step,jcat,1:2)) - sum(xb_var_bv(kforc_step,jcat,3:9))
205  !
206  xb_var_nobv(kforc_step,jcat,10) = sum(xb_var_nobv(kforc_step,jcat,1:2)) - sum(xb_var_nobv(kforc_step,jcat,3:9))
207  !
208  xb_var_q(kforc_step,jcat,1) = (xb_qtot(jcat)-xb_qtotm(jcat)) * xtopd_step
209  xb_var_q(kforc_step,jcat,2) = (xb_qrun(jcat)-xb_qrunm(jcat)) * xtopd_step
210  xb_var_q(kforc_step,jcat,3) = (xb_qdr(jcat)- xb_qdrm(jcat)) * xtopd_step
211  xb_var_q(kforc_step,jcat,4) = sum(xrun_torout(jcat,:)) * xtopd_step
212  xb_var_q(kforc_step,jcat,5) = sum(xdr_torout(jcat,:)) * xtopd_step
213  !
214 ENDDO
215 !
216 !bilan tot isba (m3)
217 DO jmesh=1,kni
218  !
219  IF (xb_dg2(jmesh)/=xundef) THEN
220  !
221  zfact0 = xb_mesh_size(jmesh)
222  zfact1 = zfact0 / xrholw
223  zfact2 = nnb_topd * zfact1
224 ! ZFACT2 = XTOPD_STEP * ZFACT1
225  !
226 !! Water going in the system
227 !! variable =1 : Rain
228  xb_var_tot(kforc_step,1) = xb_var_tot(kforc_step,1) + xb_rain(jmesh) * zfact2
229 !! variable =2 : Snow
230  xb_var_tot(kforc_step,2) = xb_var_tot(kforc_step,2) + xb_snow(jmesh) * zfact2
231 !! Water going out of the system
232 !! variable =3 : Incerception
233  xb_var_tot(kforc_step,3) = xb_var_tot(kforc_step,3) + zb_dwr(jmesh) * zfact2
234 !! variable =4 : Evaporation
235  xb_var_tot(kforc_step,4) = xb_var_tot(kforc_step,4) + (xb_evap(jmesh)-xb_evapm(jmesh)) * zfact1
236 !! variable =5 : Runoff
237  xb_var_tot(kforc_step,5) = xb_var_tot(kforc_step,5) + (xb_runoff_isba(jmesh)-xb_runoff_isbam(jmesh)) * zfact1
238 !! variable =6 : Drainage
239  xb_var_tot(kforc_step,6) = xb_var_tot(kforc_step,6) + (xb_drain(jmesh)-xb_drainm(jmesh)) * zfact1
240 !! variable =7 : Variation of liquid water stocked in the ground
241  xb_var_tot(kforc_step,7) = xb_var_tot(kforc_step,7) + (xb_wgtot(jmesh)-xb_wgtotm(jmesh)) * zfact0
242 !! variable =8 : Variation of solid water stocked in the ground
243  xb_var_tot(kforc_step,8) = xb_var_tot(kforc_step,8) + (xb_wgitot(jmesh)-xb_wgitotm(jmesh)) * zfact0
244 !! variable =9 : Variation of melting snow
245  xb_var_tot(kforc_step,9) = xb_var_tot(kforc_step,9) + (xb_swetot(jmesh)-xb_swetotm(jmesh)) * zfact0
246 !! variable =11: Hortonian runoff
247  xb_var_tot(kforc_step,11) = xb_var_tot(kforc_step,11) + (xb_horton(jmesh)-xb_hortonm(jmesh)) * zfact1
248 !! variable =12 : ISBA water budget
249  xb_var_tot(kforc_step,12) = xb_var_tot(kforc_step,12) + zb_watbud(jmesh) * zfact2
250  !
251  ENDIF
252  !
253 ENDDO !JMESH
254 !
255 xb_var_tot(kforc_step,10) = sum(xb_var_tot(kforc_step,1:2)) - sum(xb_var_tot(kforc_step,3:9))
256 !
257 !
258 xb_wrm(:) = xb_wr(:)
259 xb_evapm(:) = xb_evap(:)
260 !
261 xb_runoff_topdm(:) = xb_runoff_topd(:)
262 xb_runoff_isbam(:) = xb_runoff_isba(:)
263 xb_hortonm(:) = xb_horton(:)
264 xb_drainm(:) = xb_drain(:)
265 !
266 xb_wg2m(:) = xb_wg2(:)
267 xb_wg3m(:) = xb_wg3(:)
268 xb_wgtotm(:) = xb_wgtot(:)
269 xb_wgi2m(:) = xb_wgi2(:)
270 xb_wgi3m(:) = xb_wgi3(:)
271 xb_wgitotm(:) = xb_wgitot(:)
272 xb_swe1m(:) = xb_swe1(:)
273 xb_swe2m(:) = xb_swe2(:)
274 xb_swe3m(:) = xb_swe3(:)
275 xb_swetotm(:) = xb_swetot(:)
276 !
277 xb_qtotm(:) = xb_qtot(:)
278 xb_qrunm(:) = xb_qrun(:)
279 xb_qdrm(:) = xb_qdr(:)
280 !
281 IF (lhook) CALL dr_hook('BUDGET_COUPL_ROUT',1,zhook_handle)
282 !
283 END SUBROUTINE budget_coupl_rout
subroutine dg_dfto3l(I, KI, PDG)
Definition: dg_dfto3l.F90:7
subroutine budget_coupl_rout(DGEI, DGMI, I, U, KNI, KFORC_STEP)
subroutine avg_patch_wg(I, KI, PWG, PWGI, PDG)
Definition: avg_patch_wg.F90:7