64 xcstopi, xwtopt, xavg_runoffcm, xavg_draincm,&
65 xdtopt, xka_pre, xkac_pre, nmaski, xdmaxfc, &
66 xwg_full, xwstopt, xwfctopt, nmaskt, &
67 nnbv_in_mesh, xbv_in_mesh, xtotbv_in_mesh,&
69 xfrac_d2, xfrac_d3, xwgi_full,&
70 xrun_torout, xdr_torout,&
71 lstock_topd,nnb_stp_restart,nmaskt_patch
73 USE modd_topodyn, ONLY : nncat, xmpara, xcstopt, nmesht, xdxt,&
74 nnmc, xrtop_d2, nnb_topd_step, xdmaxt
81 USE modi_read_file_masktopd
85 USE modi_restart_coupl_topd
91 USE yomhook
,ONLY : lhook, dr_hook
92 USE parkind1
,ONLY : jprb
100 TYPE(isba_t
),
INTENT(INOUT) :: i
104 CHARACTER(LEN=*),
INTENT(IN) :: hprogram
105 INTEGER,
INTENT(IN) :: ki
110 REAL,
DIMENSION(:),
ALLOCATABLE :: zsand_full, zclay_full, zdg_full
111 REAL,
DIMENSION(:),
ALLOCATABLE :: zfrac
112 REAL,
DIMENSION(:),
ALLOCATABLE :: zdmaxav
113 REAL,
DIMENSION(:),
ALLOCATABLE :: zsandtopi, zclaytopi
116 REAL,
DIMENSION(:),
ALLOCATABLE :: zksat
117 REAL,
DIMENSION(:),
ALLOCATABLE :: zdg2_full, zdg3_full, zwg2_full, zwg3_full, zrtop_d2
118 REAL,
DIMENSION(:),
ALLOCATABLE :: zwgi_full, z_wfctopi, z_wstopi
123 INTEGER :: jcat,jmesh
126 REAL,
DIMENSION(SIZE(I%XWG,1),3) :: zwg_3l,zwgi_3l,zdg_3l
128 REAL(KIND=JPRB) :: zhook_handle
130 IF (lhook) CALL dr_hook(
'INIT_COUPL_TOPD',0,zhook_handle)
134 WRITE(iluout,*)
'INITIALISATION INIT_COUPL_TOPD'
136 ALLOCATE(nmaskt(nncat,nmesht))
141 ALLOCATE(nmaskt_patch(
SIZE(i%XWG,1)))
143 IF (i%CISBA==
'DIF')
THEN
145 SIZE(i%XWG,1),zdg_3l)
146 ELSEIF (i%CISBA==
'3-L')
THEN
148 SIZE(i%XWG,1),zwg_3l,zwgi_3l,zdg_3l)
151 ALLOCATE(xka_pre(nncat,nmesht))
152 ALLOCATE(xkac_pre(nncat))
154 xkac_pre(:) = maxval(xka_pre) + 1.
157 ALLOCATE(xrunoff_top(u%NSIZE_NATURE))
158 xrunoff_top(:) = dgei%XAVG_RUNOFFC(:)
160 IF(.NOT.
ALLOCATED(xavg_runoffcm))
ALLOCATE(xavg_runoffcm(u%NSIZE_NATURE))
161 xavg_runoffcm(:) = dgei%XAVG_RUNOFFC(:)
163 IF(.NOT.
ALLOCATED(xavg_draincm ))
ALLOCATE(xavg_draincm(u%NSIZE_NATURE))
164 xavg_draincm(:) = dgei%XAVG_DRAINC(:)
173 ALLOCATE(nnbv_in_mesh(ki,nncat))
174 ALLOCATE(xbv_in_mesh(ki,nncat))
175 ALLOCATE(xtotbv_in_mesh(ki))
177 xtotbv_in_mesh(:) = 0.0
181 xbv_in_mesh(jj,:) = 0.0
184 nnbv_in_mesh(jj,ji) = count( nmaski(jj,ji,:)/=nundef )
185 xbv_in_mesh(jj,ji) =
REAL(NNBV_IN_MESH(JJ,JI)) * xdxt(ji)**2
186 xtotbv_in_mesh(jj) = xtotbv_in_mesh(jj) + xbv_in_mesh(jj,ji)
189 IF (xtotbv_in_mesh(jj)> ug%XMESH_SIZE(jj))
THEN
190 xbv_in_mesh(jj,:) = xbv_in_mesh(jj,:) * ug%XMESH_SIZE(jj)/xtotbv_in_mesh(jj)
191 xtotbv_in_mesh(jj) = ug%XMESH_SIZE(jj)
199 zfrac(:) = ( ug%XMESH_SIZE(:)-xtotbv_in_mesh(:) ) / ug%XMESH_SIZE(:)
200 zfrac(:) = min(max(zfrac(:),0.),1.)
202 ALLOCATE(xatop(u%NSIZE_NATURE))
206 IF (hprogram==
'POST ') goto 10
213 ALLOCATE(zsand_full(ki))
214 ALLOCATE(zclay_full(ki))
219 ALLOCATE(zdg2_full(ki))
220 ALLOCATE(zdg3_full(ki))
225 ALLOCATE(zrtop_d2(ki))
229 IF ( zdg2_full(jmesh)/=xundef .AND. zfrac(jmesh)<1. )
THEN
232 !moyenne ponderee pour cas ou plusieurs bv sur maille
233 zrtop_d2(jmesh) = zrtop_d2(jmesh) + xrtop_d2(jcat)*min(xbv_in_mesh(jmesh,jcat)/xtotbv_in_mesh(jmesh),1.)
238 WHERE( zdg2_full/=xundef .AND. zrtop_d2*zdg2_full>zdg3_full ) zrtop_d2(:) = zdg3_full(:)/zdg2_full(:)
242 ALLOCATE(xfrac_d2(ki))
243 ALLOCATE(xfrac_d3(ki))
247 IF (i%CISBA==
'3-L')
THEN
248 WHERE( zdg2_full/=xundef )
249 xfrac_d2(:) = min(1.,zrtop_d2(:))
251 WHERE( zdg2_full/=xundef .AND. zrtop_d2*zdg2_full>zdg2_full )
252 xfrac_d3(:) = (zrtop_d2(:)*zdg2_full(:)-zdg2_full(:)) / (zdg3_full(:)-zdg2_full(:))
253 xfrac_d3(:) = max(0.,xfrac_d3(:))
257 ALLOCATE(zdg_full(ki))
258 WHERE (zdg2_full/=xundef)
259 zdg_full = xfrac_d2*zdg2_full + xfrac_d3*(zdg3_full-zdg2_full)
264 ALLOCATE(zsandtopi(ki))
265 ALLOCATE(zclaytopi(ki))
270 WHERE ( zdg_full/=xundef .AND. zdg_full/=0. )
272 zsandtopi = zsandtopi + zsand_full * zdg_full
273 zclaytopi = zclaytopi + zclay_full * zdg_full
274 zsandtopi = zsandtopi / xdtopi
275 zclaytopi = zclaytopi / xdtopi
281 DEALLOCATE(zsand_full)
282 DEALLOCATE(zclay_full)
287 ALLOCATE(xdtopt(nncat,nmesht))
294 ALLOCATE(xwstopi(ki))
295 ALLOCATE(xwfctopi(ki))
299 IF (i%CISBA==
'2-L' .OR. i%CISBA==
'3-L')
THEN
301 xwfctopi =
wfc_func_1d(zclaytopi,zsandtopi,i%CPEDOTF)
302 ELSE IF (i%CISBA==
'DIF')
THEN
304 xwfctopi =
w33_func_1d(zclaytopi,zsandtopi,i%CPEDOTF)
308 WRITE(iluout,*)
'CKSAT==',i%CKSAT
312 ALLOCATE(xcstopi(ki))
314 IF( i%CKSAT==
'SGH' .OR. i%CKSAT==
'EXP' )
THEN
319 WHERE ( zdg_full/=xundef .AND. (xwstopi-xwfctopi/=0.) )
320 xcstopi(:) = zksat(:) / (xwstopi(:)-xwfctopi(:))
327 WHERE ( zdg_full/=xundef .AND. (xwstopi-xwfctopi/=0.) )
328 xcstopi(:) = xcstopi(:) / (xwstopi(:)-xwfctopi(:))
333 DEALLOCATE(zsandtopi)
334 DEALLOCATE(zclaytopi)
340 ALLOCATE(xcstopt(nncat,nmesht))
342 WHERE (xcstopt == xundef) xcstopt = 0.0
344 xcstopt = xcstopt*zcoef_anis
347 ALLOCATE(xwg_full(ki))
348 ALLOCATE(xwgi_full(ki))
349 ALLOCATE(xwtopt(nncat,nmesht))
351 ALLOCATE(xwstopt(nncat,nmesht))
352 ALLOCATE(xwfctopt(nncat,nmesht))
353 ALLOCATE(xdmaxfc(nncat,nmesht))
354 xdmaxfc(:,:) = xundef
355 ALLOCATE(xdmaxt(nncat,nmesht))
358 ALLOCATE(zwg2_full(ki))
359 ALLOCATE(zwg3_full(ki))
364 WHERE ( zdg_full/=xundef .AND. zdg_full/=0. )
365 xwg_full = xfrac_d2*(zdg2_full/zdg_full)*zwg2_full + xfrac_d3*((zdg3_full-zdg2_full)/zdg_full)*zwg3_full
379 ALLOCATE(xmpara(nncat))
381 IF (.NOT.
ALLOCATED(xf_param))
ALLOCATE(xf_param(
SIZE(i%XF_PARAM)))
387 ALLOCATE(xas_nature(u%NSIZE_NATURE))
396 ALLOCATE(xrun_torout(nncat,nnb_topd_step+nnb_stp_restart))
397 ALLOCATE(xdr_torout(nncat,nnb_topd_step+nnb_stp_restart))
398 xrun_torout(:,:) = 0.
401 IF (hprogram==
'POST ') goto 20
409 DEALLOCATE(zdg2_full)
410 DEALLOCATE(zdg3_full)
411 DEALLOCATE(zwg2_full)
412 DEALLOCATE(zwg3_full)
416 IF (lhook) CALL dr_hook(
'INIT_COUPL_TOPD',1,zhook_handle)
subroutine dg_dfto3l(I, KI, PDG)
real function, dimension(size(pclay)) wfc_func_1d(PCLAY, PSAND, HPEDOTF)
subroutine restart_coupl_topd(UG, U, HPROGRAM, KI)
subroutine read_file_masktopd(KI)
subroutine avg_patch_wg(I, KI, PWG, PWGI, PDG)
subroutine get_luout(HPROGRAM, KLUOUT)
real function, dimension(size(pclay)) w33_func_1d(PCLAY, PSAND, HPEDOTF)
real function, dimension(size(psand)) wsat_func_1d(PCLAY, PSAND, HPEDOTF)
subroutine init_coupl_topd(DGEI, I, UG, U, HPROGRAM, KI)
subroutine isba_to_topd(PVARI, PVART)