SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
control_water_budget_topd.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 control_water_budget_topd (I, U, &
8  pwgm,pwg,pdg,pmesh_size,&
9  pavg_mesh_size,pwsat)
10 ! #####################
11 !
12 !!**** *CONTROL_WATER_BUDGET_TOPD*
13 !!
14 !! PURPOSE
15 !! -------
16 ! To control water budget after topodyn_lat lateral distribution
17 !
18 !
19 !
20 !!** METHOD
21 !! ------
22 !
23 !! EXTERNAL
24 !! --------
25 !!
26 !! none
27 !!
28 !! IMPLICIT ARGUMENTS
29 !! ------------------
30 !!
31 !!
32 !!
33 !!
34 !!
35 !! REFERENCE
36 !! ---------
37 !!
38 !!
39 !!
40 !! AUTHOR
41 !! ------
42 !!
43 !! B. Vincendon * Meteo-France *
44 !!
45 !! MODIFICATIONS
46 !! -------------
47 !!
48 !! Original : Out of COUPL_TOPD in february 2014
49 !-------------------------------------------------------------------------------
50 !
51 !* 0. DECLARATIONS
52 ! ------------
53 !
54 !
55 USE modd_isba_n, ONLY : isba_t
56 USE modd_surf_atm_n, ONLY : surf_atm_t
57 !
58 USE modd_surf_par, ONLY : xundef, nundef
59 USE modd_coupling_topd, ONLY : xtotbv_in_mesh
60 USE modd_isba_par, ONLY : xwgmin
61 USE modi_avg_patch_wg
62 !
64 !
65 USE yomhook ,ONLY : lhook, dr_hook
66 USE parkind1 ,ONLY : jprb
67 !
68 !
69 IMPLICIT NONE
70 !
71 !* 0.1 declarations of arguments
72 !
73 !
74 !
75 TYPE(isba_t), INTENT(INOUT) :: i
76 TYPE(surf_atm_t), INTENT(INOUT) :: u
77 !
78 REAL, DIMENSION(:,:), INTENT(IN) :: pwgm
79 REAL, DIMENSION(:,:), INTENT(INOUT) :: pwg
80 REAL, DIMENSION(:,:), INTENT(IN) :: pdg
81 REAL, DIMENSION(:), INTENT(IN) :: pmesh_size
82 REAL, INTENT(IN) :: pavg_mesh_size
83 REAL, DIMENSION(:), INTENT(IN) :: pwsat
84 !
85 !
86 !* 0.2 declarations of local variables
87 !
88 !
89 REAL, DIMENSION(SIZE(PWG,1),3) :: zwg_3l, zwgi_3l, zdg_3l
90 REAL :: zstock_wgm, zstock_wg
91 REAL :: zavg_dgall, zcontrol_water_budget_topd
92 REAL :: ztmp, ztmp2
93 INTEGER :: jmesh, jpatch, jj
94 REAL, DIMENSION(SIZE(I%XPATCH,1)) :: zsumpatch
95 REAL, DIMENSION(SIZE(I%XPATCH,1)) :: zwg_corr, zavg_wgm, zavg_wg, zavg_dg
96 REAL, DIMENSION(SIZE(I%XPATCH,1)) :: ztotbv_in_mesh
97 LOGICAL, DIMENSION(SIZE(I%XPATCH,1)) :: lmodif
98 !
99 REAL(KIND=JPRB) :: zhook_handle
100 !-------------------------------------------------------------------------------
101 !
102 IF (lhook) CALL dr_hook('CONTROL_WATER_BUDGET_TOPD',0,zhook_handle)
103 !
104 IF(i%NPATCH/=1) THEN
105  zsumpatch(:) = 0.0
106  DO jpatch=1,i%NPATCH
107  DO jj=1,SIZE(i%XPATCH,1)
108  zsumpatch(jj) = zsumpatch(jj) + i%XPATCH(jj,jpatch)
109  ENDDO
110  ENDDO
111 zavg_wgm(:) = 0.
112 zavg_wg(:) = 0.
113 zavg_dg(:) = 0.
114 !
115  DO jpatch=1,i%NPATCH
116  DO jj=1,SIZE(i%XPATCH,1)
117  IF(zsumpatch(jj) > 0..AND.pwgm(jj,jpatch)/=xundef.AND.pwg(jj,jpatch)/=xundef.AND.pdg(jj,jpatch)/=xundef)THEN
118 !
119  zavg_wgm(jj) = zavg_wgm(jj) + i%XPATCH(jj,jpatch) * pwgm(jj,jpatch) * pdg(jj,jpatch)
120  zavg_wg(jj) = zavg_wg(jj) + i%XPATCH(jj,jpatch) * pwg(jj,jpatch) * pdg(jj,jpatch)
121  zavg_dg(jj) = zavg_dg(jj) + i%XPATCH(jj,jpatch) * pdg(jj,jpatch)
122 !
123  ENDIF
124  ENDDO
125  ENDDO
126 !
127  WHERE (zavg_dg(:)>0.0.AND.zsumpatch(:)>0.)
128  zavg_wgm(:) = zavg_wgm(:) / zavg_dg(:)
129  zavg_wg(:) = zavg_wg(:) / zavg_dg(:)
130  ENDWHERE
131 !
132 ELSE
133 zavg_wgm(:)= pwgm(:,1)
134 zavg_wg(:) = pwg(:,1)
135 zavg_dg(:) = pdg(:,1)
136 zsumpatch(:) = 1.0
137 ENDIF
138 !
139 !
140 zstock_wgm = sum(zavg_wgm(:)*zavg_dg(:)*pmesh_size(:),&
141  mask=(zavg_wgm(:)/=xundef.AND.&
142  zavg_dg(:)/=xundef.AND.&
143  pmesh_size(:)/=xundef.AND.&
144  zsumpatch(:)>0.)) ! water stocked in the ground (m3)
145 !
146 zstock_wg = sum(zavg_wg(:)*zavg_dg(:)*pmesh_size(:),&
147  mask=(zavg_wg(:)/=xundef.AND.&
148  zavg_dg(:)/=xundef.AND.&
149  pmesh_size(:)/=xundef.AND.&
150  zsumpatch(:)>0.)) ! water stocked in the ground (m3)
151 !
152 IF ( count(zavg_dg(:)/=xundef.AND.zsumpatch(:)>0.)/=0. )&
153 zavg_dgall = sum(zavg_dg(:),mask=(zavg_dg(:)/=xundef.AND.zsumpatch(:)>0.))&
154  / count(zavg_dg(:)/=xundef.AND.zsumpatch(:)>0.)
155 
156 IF (zavg_dgall/=0.) THEN
157  zcontrol_water_budget_topd = ( zstock_wg - zstock_wgm )/ zavg_dgall / pavg_mesh_size
158 !
159  IF (zcontrol_water_budget_topd==0.0) goto 66
160  !
161  ztmp = count( zavg_wg(:)/=zavg_wgm(:).AND.zavg_wg(:)/=xundef.AND.zavg_wgm(:)/=xundef.AND.zsumpatch(:)>0. )
162 !
163  lmodif(:)=.false.
164 
165  CALL pack_same_rank(u%NR_NATURE,xtotbv_in_mesh,ztotbv_in_mesh)
166  IF (ztmp/=0.) THEN
167  WHERE (ztotbv_in_mesh(:)/=0.0.AND.zavg_wgm(:)/=xundef.AND.zavg_wg(:)/=xundef.AND.&
168  zavg_wg(:)/=zavg_wgm(:) .AND. zavg_wg(:)>xwgmin+(zcontrol_water_budget_topd/ztmp).AND.&
169  zavg_wg(:)<=pwsat(:)+(zcontrol_water_budget_topd/ztmp).AND.zsumpatch(:)>0.)
170  lmodif(:)=.true.
171  ENDWHERE
172 !
173  WHERE (lmodif)
174  zavg_wg(:) = min(max(zavg_wg(:) - (zcontrol_water_budget_topd/ztmp),xwgmin),pwsat(:))
175  ENDWHERE
176 !
177  ENDIF
178 ENDIF
179 
180 DO jpatch=1,i%NPATCH
181  WHERE ((pwg(:,jpatch)/=xundef).AND.(i%XPATCH(:,jpatch)>0.)&
182  .AND.(i%XPATCH(:,jpatch)/=xundef).AND.(ztotbv_in_mesh(:)/=0.0))
183  pwg(:,jpatch)=min(max(zavg_wg(:),xwgmin),pwsat(:))
184  ENDWHERE
185 ENDDO
186 
187 
188 zstock_wg = sum(zavg_wg(:)*zavg_dg(:)*pmesh_size(:),&
189  mask=(zavg_wg(:)/=xundef.AND.&
190  zavg_dg(:)/=xundef.AND.&
191  pmesh_size(:)/=xundef.AND.&
192  zsumpatch(:)>0.)) ! water stocked in the ground (m3)
193 
194 
195  IF (zavg_dgall/=0) THEN
196  zcontrol_water_budget_topd = ( zstock_wg - zstock_wgm )/ zavg_dgall / pavg_mesh_size
197  ENDIF
198 
199 66 CONTINUE
200 !
201 IF (lhook) CALL dr_hook('CONTROL_WATER_BUDGET_TOPD',1,zhook_handle)
202 !
203 END SUBROUTINE control_water_budget_topd
204 
subroutine control_water_budget_topd(I, U, PWGM, PWG, PDG, PMESH_SIZE, PAVG_MESH_SIZE, PWSAT)