52 xdtopt, xwstopt, nnpix, nnbv_in_mesh
59 USE yomhook
,ONLY : lhook, dr_hook
60 USE parkind1
,ONLY : jprb
67 INTEGER,
INTENT(IN) :: ki
68 REAL,
DIMENSION(:),
INTENT(INOUT) :: phi
69 REAL,
DIMENSION(:,:),
INTENT(OUT) :: pht
74 LOGICAL,
DIMENSION(NNCAT,SIZE(NMASKI,3)) :: gtest
75 INTEGER :: j1,j2,j3,j4
76 INTEGER :: inbsat, inball
80 REAL(KIND=JPRB) :: zhook_handle
82 IF (lhook) CALL dr_hook(
'RECHARGE_SURF_TOPD',0,zhook_handle)
95 IF (phi(j3) <= 0.0)
THEN
100 j2 = nmaski(j3,j1,j4)
101 DO WHILE (j2 /= nundef .AND. j4<=nnbv_in_mesh(j3,j1) )
103 IF ( nmaskt(j1,j2) /= nundef )
THEN
105 zwnew = xwtopt(j1,j2) + phi(j3) / xdtopt(j1,j2)
107 IF ( zwnew >= xwfctopt(j1,j2) )
THEN
110 IF (xdmaxfc(j1,j2)/=xundef) xdmaxt(j1,j2) = xdmaxfc(j1,j2)
111 pht(j1,j2) = (zwnew - xwfctopt(j1,j2)) * xdtopt(j1,j2)
115 IF (xwstopt(j1,j2)/=xundef) &
116 xdmaxt(j1,j2) = (xwstopt(j1,j2) - zwnew) * xdtopt(j1,j2)
122 IF ( j4<=
SIZE(nmaski,3) ) j2 = nmaski(j3,j1,j4)
140 DO WHILE ( zrest>0.0 )
149 DO WHILE ( j2/=nundef .AND. j4<=nnbv_in_mesh(j3,j1) )
151 IF ( gtest(j1,j4) .AND. nmaskt(j1,j2)/=nundef )
THEN
153 zwnew = xwtopt(j1,j2) + phi(j3) / xdtopt(j1,j2)
155 IF ( xwtopt(j1,j2) == xwstopt(j1,j2) )
THEN
159 zrest = zrest + phi(j3)
160 gtest(j1,j4) = .false.
162 ELSE IF ( ( xwstopt(j1,j2) - xwtopt(j1,j2) ) * xdtopt(j1,j2) <= phi(j3) )
THEN
165 xdmaxt(j1,j2) = xdmaxfc(j1,j2)
166 pht(j1,j2) = ( xwstopt(j1,j2) - xwfctopt(j1,j2) ) * xdtopt(j1,j2)
167 zrest = zrest + phi(j3) - pht(j1,j2)
170 ELSE IF ( xwtopt(j1,j2) < xwfctopt(j1,j2) )
THEN
173 IF ( (xwtopt(j1,j2) + phi(j3)/xdtopt(j1,j2)) <= xwfctopt(j1,j2) )
THEN
176 xdmaxt(j1,j2) = ( xwstopt(j1,j2) - zwnew ) * xdtopt(j1,j2)
181 xdmaxt(j1,j2) = xdmaxfc(j1,j2)
182 pht(j1,j2) = ( zwnew - xwfctopt(j1,j2) ) * xdtopt(j1,j2)
188 xdmaxt(j1,j2) = xdmaxfc(j1,j2)
189 pht(j1,j2) = ( zwnew - xwfctopt(j1,j2) ) * xdtopt(j1,j2)
193 ELSE IF ( nmaskt(j1,j2)==nundef ) then
201 IF ( j4<=
SIZE(nmaski,3) ) j2 = nmaski(j3,j1,j4)
207 IF ( zrest/=0.0 )
THEN
209 inbsat=count(.NOT.gtest)
211 IF ( inbsat == nnpix(j3) )
THEN
213 IF (nnpix(j3) > 400 )
THEN
214 WRITE(*,*)
'MAILLE NUM=',j3,
'nb pix tot=',nnpix(j3)
222 phi(j3) = phi(j3) + ( zrest / (nnpix(j3) - inbsat) )
233 IF (lhook) CALL dr_hook(
'RECHARGE_SURF_TOPD',1,zhook_handle)
subroutine recharge_surf_topd(PHI, PHT, KI)