SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
init_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  SUBROUTINE init_budget_coupl_rout (DGEI, DGMI, IG, I, U, &
7  kni)
8 ! ##########################
9 !
10 !!
11 !! PURPOSE
12 !! -------
13 ! Initialise varriables usefull for budget computation
14 !
15 !!** METHOD
16 !! ------
17 !! Terms of the budget on all the domain
18 !! XB_VAR_TOT(forcing time step,variable)
19 !! Water going in the system
20 !! variable =1 : Rain
21 !! variable =2 : Snow
22 !! Water going out of the system
23 !! variable =3 : Incerception
24 !! variable =4 : Evaporation
25 !! variable =5 : Runoff
26 !! variable =6 : Drainage
27 !! variable =7 : Variation of liquid water stocked in the ground
28 !! variable =8 : Variation of solid water stocked in the ground
29 !! variable =9 : Variation of melting snow
30 !! Budget
31 !! variable =10: Water going in the system- Water going out of the system
32 !!
33 !! Terms of the budget on a given catchment
34 !! XB_VAR_BV(forcing time step,catchment,variable)
35 !! XB_VAR_NOBV(forcing time step,catchment,variable)
36 !!
37 !! EXTERNAL
38 !! --------
39 !!
40 !! none
41 !!
42 !! IMPLICIT ARGUMENTS
43 !! ------------------
44 !!
45 !! REFERENCE
46 !! ---------
47 !!
48 !! AUTHOR
49 !! ------
50 !!
51 !! L. Bouilloud & B. Vincendon * Meteo-France *
52 
53 !!
54 !! MODIFICATIONS
55 !! -------------
56 !!
57 !! Original 03/2008
58 !! 03/2014: Modif BV : add more variables
59 !-------------------------------------------------------------------------------
60 !
61 !* 0. DECLARATIONS
62 ! ------------
63 !
64  ! declarative modules
65 !
68 USE modd_isba_grid_n, ONLY : isba_grid_t
69 USE modd_isba_n, ONLY : isba_t
70 USE modd_surf_atm_n, ONLY : surf_atm_t
71 !
72 USE modd_budget_coupl_rout ! contains all useful variables XB_*
73 !
74 USE modd_topodyn, ONLY : nncat, nnmc, xqtot,&
75  nnb_topd_step, xdxt, xqb_dr, xqb_run
76 USE modd_coupling_topd, ONLY : xas_nature, nnb_topd,&
77  xatop, xbv_in_mesh
78 !
79 USE modd_surf_par, ONLY:xundef
80 !
82 USE modi_avg_patch_wg
83 USE modi_dg_dfto3l
84 !
85 USE yomhook ,ONLY : lhook, dr_hook
86 USE parkind1 ,ONLY : jprb
87 !
88 IMPLICIT NONE
89 !
90 !* 0.1 declarations of arguments
91 !
92 !
93 TYPE(diag_evap_isba_t), INTENT(INOUT) :: dgei
94 TYPE(diag_misc_isba_t), INTENT(INOUT) :: dgmi
95 TYPE(isba_grid_t), INTENT(INOUT) :: ig
96 TYPE(isba_t), INTENT(INOUT) :: i
97 TYPE(surf_atm_t), INTENT(INOUT) :: u
98 !
99 INTEGER, INTENT(IN) :: kni ! expected physical size of full surface array
100 !
101 !* 0.2 declarations of local variables
102 !
103 INTEGER :: jj,jwrk2
104 INTEGER :: inb_var ! number of variable to write
105 REAL, DIMENSION(SIZE(I%XWG,1),3) :: zwg_3l,zwgi_3l,zdg_3l
106 !
107 REAL(KIND=JPRB) :: zhook_handle
108 !-------------------------------------------------------------------------------
109 IF (lhook) CALL dr_hook('INIT_BUDGET_COUPL_ROUT',0,zhook_handle)
110 !
111 !* 0. Initialization:
112 ! ---------------
113 inb_var=12
114 
115 IF (i%CISBA=='DIF') THEN
116  CALL dg_dfto3l(i, &
117  SIZE(i%XWG,1),zdg_3l)
118  zwg_3l(:,2)=dgmi%XFRD2_TWG(:)
119  zwg_3l(:,3)=dgmi%XFRD3_TWG(:)
120  zwgi_3l(:,2)=dgmi%XFRD2_TWGI(:)
121  zwgi_3l(:,3)=dgmi%XFRD3_TWGI(:)
122 
123 ELSEIF (i%CISBA=='3-L') THEN
124  CALL avg_patch_wg(i, &
125  SIZE(i%XWG,1),zwg_3l,zwgi_3l,zdg_3l)
126 ENDIF
127 !
128 ALLOCATE(yb_var(inb_var))
129 yb_var(1)='RAIN '
130 yb_var(2)='SNOW '
131 yb_var(3)='INTERC'
132 yb_var(4)='EVATRA'
133 yb_var(5)='RUNOFF'
134 yb_var(6)='DRAINA'
135 yb_var(7)='DSTOWG'
136 yb_var(8)='DSTOWI'
137 yb_var(9)='DSTOSW'
138 yb_var(10)='BUDGET'
139 yb_var(11)='HORTON'
140 yb_var(12)='WATBUD'
141 !
142 !
143 ALLOCATE(xb_rain(kni))
144 ALLOCATE(xb_snow(kni))
145 !
146 ALLOCATE(xb_wr(kni))
147 ALLOCATE(xb_evap(kni))
148 ALLOCATE(xb_runoff_isba(kni))
149 ALLOCATE(xb_horton(kni))
150 ALLOCATE(xb_drain(kni))
151 ALLOCATE(xb_wg2(kni))
152 ALLOCATE(xb_wg3(kni))
153 ALLOCATE(xb_wgtot(kni))
154 ALLOCATE(xb_wgi2(kni))
155 ALLOCATE(xb_wgi3(kni))
156 ALLOCATE(xb_wgitot(kni))
157 ALLOCATE(xb_swe1(kni))
158 ALLOCATE(xb_swe2(kni))
159 ALLOCATE(xb_swe3(kni))
160 ALLOCATE(xb_swetot(kni))
161 !
162 ALLOCATE(xb_wrm(kni))
163 ALLOCATE(xb_evapm(kni))
164 ALLOCATE(xb_drainm(kni))
165 ALLOCATE(xb_runoff_isbam(kni))
166 ALLOCATE(xb_hortonm(kni))
167 ALLOCATE(xb_wg2m(kni))
168 ALLOCATE(xb_wg3m(kni))
169 ALLOCATE(xb_wgtotm(kni))
170 ALLOCATE(xb_wgi2m(kni))
171 ALLOCATE(xb_wgi3m(kni))
172 ALLOCATE(xb_wgitotm(kni))
173 ALLOCATE(xb_swe1m(kni))
174 ALLOCATE(xb_swe2m(kni))
175 ALLOCATE(xb_swe3m(kni))
176 ALLOCATE(xb_swetotm(kni))
177 !
178 ALLOCATE(xb_mesh_size(kni))
179 ALLOCATE(xb_dg2(kni))
180 ALLOCATE(xb_dg3(kni))
181 !
182 !init var tot
183  CALL unpack_same_rank(u%NR_NATURE,i%XWR(:,1),xb_wrm)
184  CALL unpack_same_rank(u%NR_NATURE,dgei%XAVG_EVAPC,xb_evapm)
185  CALL unpack_same_rank(u%NR_NATURE,dgei%XAVG_RUNOFFC,xb_runoff_isbam)
186  CALL unpack_same_rank(u%NR_NATURE,dgei%XAVG_HORTC,xb_hortonm)
187  CALL unpack_same_rank(u%NR_NATURE,dgei%XAVG_DRAINC,xb_drainm)
188  CALL unpack_same_rank(u%NR_NATURE,zwg_3l(:,2),xb_wg2m)
189  CALL unpack_same_rank(u%NR_NATURE,zwg_3l(:,3),xb_wg3m)
190  CALL unpack_same_rank(u%NR_NATURE,zdg_3l(:,2),xb_dg2)
191  CALL unpack_same_rank(u%NR_NATURE,zdg_3l(:,3),xb_dg3)
192 !
193 WHERE ( xb_wg2m/=xundef .AND. xb_dg2/=xundef .AND. xb_wg3m/=xundef .AND. xb_dg3/=xundef )
194  xb_wgtotm(:) = xb_wg2m(:)*xb_dg2(:) + xb_wg3m(:)*(xb_dg3(:)-xb_dg2(:)) !m3/m2
195 ELSEWHERE
196  xb_wgtotm(:) = xundef
197 ENDWHERE
198 !
199  CALL unpack_same_rank(u%NR_NATURE,zwgi_3l(:,2),xb_wgi2m)
200  CALL unpack_same_rank(u%NR_NATURE,zwgi_3l(:,3),xb_wgi3m)
201 WHERE ((xb_wgi2m/=xundef).AND.(xb_dg2/=xundef).AND.(xb_wgi3m/=xundef).AND.(xb_dg3/=xundef))
202  xb_wgitotm(:) = xb_wgi2m(:)*xb_dg2(:) + xb_wgi3m(:)*(xb_dg3(:)-xb_dg2(:)) !m3/m2
203 ELSEWHERE
204  xb_wgitotm(:) = xundef
205 ENDWHERE
206 !
207  CALL unpack_same_rank(u%NR_NATURE,i%TSNOW%WSNOW(:,1,1),xb_swe1m)
208  CALL unpack_same_rank(u%NR_NATURE,i%TSNOW%WSNOW(:,2,1),xb_swe2m)
209  CALL unpack_same_rank(u%NR_NATURE,i%TSNOW%WSNOW(:,3,1),xb_swe3m)
210 xb_swetotm(:) = xb_swe1m(:)+xb_swe2m(:)+xb_swe3m(:)
211 !
212  CALL unpack_same_rank(u%NR_NATURE,ig%XMESH_SIZE,xb_mesh_size)
213 !
214 ALLOCATE(xb_abv_bymesh(kni,nncat))
215 DO jj=1,kni
216  xb_abv_bymesh(jj,:) = xbv_in_mesh(jj,:)/xb_mesh_size(jj) !*NNMC(:)*XDXT(:)**2 !
217  xb_abv_bymesh(jj,:) = min(1.,xb_abv_bymesh(jj,:))
218 ENDDO
219 !
220 ALLOCATE(xb_var_bv(nnb_topd_step,nncat,inb_var))
221 xb_var_bv(:,:,:) = 0.
222 ALLOCATE(xb_var_nobv(nnb_topd_step,nncat,inb_var))
223 xb_var_nobv(:,:,:) = 0.
224 !
225 ALLOCATE(xb_var_tot(nnb_topd_step,inb_var))
226 xb_var_tot(:,:) = 0.
227 !
228 ALLOCATE(xb_runoff_topd(kni))
229 ALLOCATE(xb_runoff_topdm(kni))
230 ALLOCATE(xb_atop_bymesh(kni))
231 !
232  CALL unpack_same_rank(u%NR_NATURE,xatop,xb_atop_bymesh)
233  xb_runoff_topdm = xb_runoff_isbam
234 !
235 ALLOCATE(yb_varq(5))
236 yb_varq(1)='Q_TOT '
237 yb_varq(2)='Q_RUN '
238 yb_varq(3)='Q_DR '
239 yb_varq(4)='ST_RUN'
240 yb_varq(5)='ST_DR '
241 !
242 !
243 ALLOCATE(xb_qtot(nncat))
244 ALLOCATE(xb_qdr(nncat))
245 ALLOCATE(xb_qrun(nncat))
246 ALLOCATE(xb_var_q(nnb_topd_step,nncat,5))
247 !
248 ALLOCATE(xb_qtotm(nncat))
249 ALLOCATE(xb_qdrm(nncat))
250 ALLOCATE(xb_qrunm(nncat))
251 !
252 !init var bilan q
253 xb_qtot(:)=0.
254 xb_qdr(:) =0.
255 xb_qrun(:)=0.
256 !
257 xb_var_q(:,:,:)=0
258 !
259 DO jj=1,nncat
260  xb_qtotm(jj) = sum(xqtot(jj,:))
261  xb_qrunm(jj) = sum(xqb_run(jj,:))
262  xb_qdrm(jj) = sum(xqb_dr(jj,:))
263 ENDDO
264 !
265 IF (lhook) CALL dr_hook('INIT_BUDGET_COUPL_ROUT',1,zhook_handle)
266 !
267 END SUBROUTINE init_budget_coupl_rout
subroutine dg_dfto3l(I, KI, PDG)
Definition: dg_dfto3l.F90:7
subroutine avg_patch_wg(I, KI, PWG, PWGI, PDG)
Definition: avg_patch_wg.F90:7
subroutine init_budget_coupl_rout(DGEI, DGMI, IG, I, U, KNI)