8 pwgm,pwg,pdg,pmesh_size,&
65 USE yomhook
,ONLY : lhook, dr_hook
66 USE parkind1
,ONLY : jprb
75 TYPE(isba_t
),
INTENT(INOUT) :: i
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
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
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
99 REAL(KIND=JPRB) :: zhook_handle
102 IF (lhook) CALL dr_hook(
'CONTROL_WATER_BUDGET_TOPD',0,zhook_handle)
107 DO jj=1,
SIZE(i%XPATCH,1)
108 zsumpatch(jj) = zsumpatch(jj) + i%XPATCH(jj,jpatch)
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
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)
127 WHERE (zavg_dg(:)>0.0.AND.zsumpatch(:)>0.)
128 zavg_wgm(:) = zavg_wgm(:) / zavg_dg(:)
129 zavg_wg(:) = zavg_wg(:) / zavg_dg(:)
133 zavg_wgm(:)= pwgm(:,1)
134 zavg_wg(:) = pwg(:,1)
135 zavg_dg(:) = pdg(:,1)
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.&
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.&
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.)
156 IF (zavg_dgall/=0.)
THEN
157 zcontrol_water_budget_topd = ( zstock_wg - zstock_wgm )/ zavg_dgall / pavg_mesh_size
159 IF (zcontrol_water_budget_topd==0.0) goto 66
161 ztmp = count( zavg_wg(:)/=zavg_wgm(:).AND.zavg_wg(:)/=xundef.AND.zavg_wgm(:)/=xundef.AND.zsumpatch(:)>0. )
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.)
174 zavg_wg(:) = min(max(zavg_wg(:) - (zcontrol_water_budget_topd/ztmp),xwgmin),pwsat(:))
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(:))
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.&
195 IF (zavg_dgall/=0)
THEN
196 zcontrol_water_budget_topd = ( zstock_wg - zstock_wgm )/ zavg_dgall / pavg_mesh_size
201 IF (lhook) CALL dr_hook(
'CONTROL_WATER_BUDGET_TOPD',1,zhook_handle)
subroutine control_water_budget_topd(I, U, PWGM, PWG, PDG, PMESH_SIZE, PAVG_MESH_SIZE, PWSAT)