SURFEX v8.1
General documentation of Surfex
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 (IO, S, U, PWGM, PWG, PDG, PMESH_SIZE, PAVG_MESH_SIZE, PWSAT)
8 ! #####################
9 !
10 !!**** *CONTROL_WATER_BUDGET_TOPD*
11 !!
12 !! PURPOSE
13 !! -------
14 ! To control water budget after topodyn_lat lateral distribution
15 !
16 !
17 !
18 !!** METHOD
19 !! ------
20 !
21 !! EXTERNAL
22 !! --------
23 !!
24 !! none
25 !!
26 !! IMPLICIT ARGUMENTS
27 !! ------------------
28 !!
29 !!
30 !!
31 !!
32 !!
33 !! REFERENCE
34 !! ---------
35 !!
36 !!
37 !!
38 !! AUTHOR
39 !! ------
40 !!
41 !! B. Vincendon * Meteo-France *
42 !!
43 !! MODIFICATIONS
44 !! -------------
45 !!
46 !! Original : Out of COUPL_TOPD in february 2014
47 !-------------------------------------------------------------------------------
48 !
49 !* 0. DECLARATIONS
50 ! ------------
51 !
52 !
54 USE modd_isba_n, ONLY : isba_s_t
55 !
56 USE modd_surf_atm_n, ONLY : surf_atm_t
57 !
58 USE modd_surf_par, ONLY : xundef, nundef
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 TYPE(isba_options_t), INTENT(INOUT) :: IO
75 TYPE(isba_s_t), INTENT(INOUT) :: S
76 !
77 TYPE(surf_atm_t), INTENT(INOUT) :: U
78 !
79 REAL, DIMENSION(:,:), INTENT(IN) :: PWGM
80 REAL, DIMENSION(:,:), INTENT(INOUT) :: PWG
81 REAL, DIMENSION(:,:), INTENT(IN) :: PDG
82 REAL, DIMENSION(:), INTENT(IN) :: PMESH_SIZE
83 REAL, INTENT(IN) :: PAVG_MESH_SIZE
84 REAL, DIMENSION(:), INTENT(IN) :: PWSAT
85 !
86 !
87 !* 0.2 declarations of local variables
88 !
89 !
90 REAL, DIMENSION(SIZE(PWG,1),3) :: ZWG_3L, ZWGI_3L, ZDG_3L
91 REAL :: ZSTOCK_WGM, ZSTOCK_WG
92 REAL :: ZAVG_DGALL, ZCONTROL_WATER_BUDGET_TOPD
93 REAL :: ZTMP, ZTMP2
94 INTEGER :: JMESH, JP, JJ
95 REAL, DIMENSION(SIZE(S%XPATCH,1)) :: ZSUMPATCH
96 REAL, DIMENSION(SIZE(S%XPATCH,1)) :: ZWG_CORR, ZAVG_WGM, ZAVG_WG, ZAVG_DG
97 REAL, DIMENSION(SIZE(S%XPATCH,1)) :: ZTOTBV_IN_MESH
98 LOGICAL, DIMENSION(SIZE(S%XPATCH,1)) :: LMODIF
99 !
100 REAL(KIND=JPRB) :: ZHOOK_HANDLE
101 !-------------------------------------------------------------------------------
102 !
103 IF (lhook) CALL dr_hook('CONTROL_WATER_BUDGET_TOPD',0,zhook_handle)
104 !
105 IF(io%NPATCH/=1) THEN
106  !
107  zsumpatch(:) = 0.0
108  DO jp=1,io%NPATCH
109  DO jj=1,SIZE(s%XPATCH,1)
110  zsumpatch(jj) = zsumpatch(jj) + s%XPATCH(jj,jp)
111  ENDDO
112  ENDDO
113  zavg_wgm(:) = 0.
114  zavg_wg(:) = 0.
115  zavg_dg(:) = 0.
116  !
117  DO jp=1,io%NPATCH
118  DO jj=1,SIZE(s%XPATCH,1)
119  IF(zsumpatch(jj) > 0..AND.pwgm(jj,jp)/=xundef.AND.pwg(jj,jp)/=xundef.AND.pdg(jj,jp)/=xundef)THEN
120  !
121  zavg_wgm(jj) = zavg_wgm(jj) + s%XPATCH(jj,jp) * pwgm(jj,jp) * pdg(jj,jp)
122  zavg_wg(jj) = zavg_wg(jj) + s%XPATCH(jj,jp) * pwg(jj,jp) * pdg(jj,jp)
123  zavg_dg(jj) = zavg_dg(jj) + s%XPATCH(jj,jp) * pdg(jj,jp)
124  !
125  ENDIF
126  ENDDO
127  ENDDO
128  !
129  WHERE (zavg_dg(:)>0.0.AND.zsumpatch(:)>0.)
130  zavg_wgm(:) = zavg_wgm(:) / zavg_dg(:)
131  zavg_wg(:) = zavg_wg(:) / zavg_dg(:)
132  ENDWHERE
133  !
134 ELSE
135  zavg_wgm(:) = pwgm(:,1)
136  zavg_wg(:) = pwg(:,1)
137  zavg_dg(:) = pdg(:,1)
138  !
139  zsumpatch(:) = 1.0
140 ENDIF
141 !
142 !
143 zstock_wgm = sum(zavg_wgm(:)*zavg_dg(:)*pmesh_size(:),&
144  mask=(zavg_wgm(:)/=xundef.AND.zavg_dg(:)/=xundef.AND.&
145  pmesh_size(:)/=xundef.AND.zsumpatch(:)>0.)) ! water stocked in the ground (m3)
146 !
147 zstock_wg = sum(zavg_wg(:)*zavg_dg(:)*pmesh_size(:),&
148  mask=(zavg_wg(:)/=xundef.AND.zavg_dg(:)/=xundef.AND.&
149  pmesh_size(:)/=xundef.AND.zsumpatch(:)>0.)) ! water stocked in the ground (m3)
150 !
151 IF ( count(zavg_dg(:)/=xundef.AND.zsumpatch(:)>0.)/=0. ) &
152  zavg_dgall = sum(zavg_dg(:),mask=(zavg_dg(:)/=xundef.AND.zsumpatch(:)>0.))&
153  / count(zavg_dg(:)/=xundef.AND.zsumpatch(:)>0.)
154 
155 IF (zavg_dgall/=0.) THEN
156  !
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 
167  IF (ztmp/=0.) THEN
168  WHERE (ztotbv_in_mesh(:)/=0.0.AND.zavg_wgm(:)/=xundef.AND.zavg_wg(:)/=xundef.AND.&
169  zavg_wg(:)/=zavg_wgm(:) .AND. zavg_wg(:)>xwgmin+(zcontrol_water_budget_topd/ztmp).AND.&
170  zavg_wg(:)<=pwsat(:)+(zcontrol_water_budget_topd/ztmp).AND.zsumpatch(:)>0.)
171  lmodif(:)=.true.
172  ENDWHERE
173  !
174  WHERE (lmodif)
175  zavg_wg(:) = min(max(zavg_wg(:) - (zcontrol_water_budget_topd/ztmp),xwgmin),pwsat(:))
176  ENDWHERE
177  !
178  ENDIF
179  !
180 ENDIF
181 
182 DO jp=1,io%NPATCH
183  WHERE ((pwg(:,jp)/=xundef).AND.(s%XPATCH(:,jp)>0.).AND.(s%XPATCH(:,jp)/=xundef).AND.(ztotbv_in_mesh(:)/=0.0))
184  pwg(:,jp)=min(max(zavg_wg(:),xwgmin),pwsat(:))
185  ENDWHERE
186 ENDDO
187 
188 
189 zstock_wg = sum(zavg_wg(:)*zavg_dg(:)*pmesh_size(:),&
190  mask=(zavg_wg(:)/=xundef.AND.zavg_dg(:)/=xundef.AND.&
191  pmesh_size(:)/=xundef.AND.zsumpatch(:)>0.)) ! water stocked in the ground (m3)
192 
193 
194 IF (zavg_dgall/=0) THEN
195  zcontrol_water_budget_topd = ( zstock_wg - zstock_wgm )/ zavg_dgall / pavg_mesh_size
196 ENDIF
197 
198 66 CONTINUE
199 !
200 IF (lhook) CALL dr_hook('CONTROL_WATER_BUDGET_TOPD',1,zhook_handle)
201 !
202 END SUBROUTINE control_water_budget_topd
203 
real, parameter xundef
real, dimension(:), allocatable xtotbv_in_mesh
integer, parameter jprb
Definition: parkind1.F90:32
integer, parameter nundef
intent(out) overrides sub arrays one Sort by the least significant key first sum(iindex(1:n))
logical lhook
Definition: yomhook.F90:15
static int mask
Definition: ifssig.c:38
subroutine control_water_budget_topd(IO, S, U, PWGM, PWG, PDG, PM
static int count
Definition: memory_hook.c:21