SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
topd_to_isba.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 topd_to_isba (I, UG, U, &
8  ki,kstep,gtopd)
9 ! ####################
10 !
11 !!**** *TOPD_TO_ISBA*
12 !!
13 !! PURPOSE
14 !! -------
15 !
16 !
17 !
18 !
19 !!** METHOD
20 !! ------
21 !
22 !! EXTERNAL
23 !! --------
24 !!
25 !! none
26 !!
27 !! IMPLICIT ARGUMENTS
28 !! ------------------
29 !!
30 !!
31 !!
32 !!
33 !!
34 !! REFERENCE
35 !! ---------
36 !!
37 !!
38 !!
39 !! AUTHOR
40 !! ------
41 !!
42 !! K. Chancibault * LTHE / Meteo-France *
43 !!
44 !! MODIFICATIONS
45 !! -------------
46 !!
47 !! Original 09/10/2003
48 !! 03/2014 (B. Vincendon) correction for meshes covered by several watersheds
49 !! 03/2015 (E. Artinyan) YSTEP jusqu'a 99999 steps
50 !-------------------------------------------------------------------------------
51 !
52 !* 0. DECLARATIONS
53 ! ------------
54 !
55 !
56 !
57 USE modd_isba_n, ONLY : isba_t
59 USE modd_surf_atm_n, ONLY : surf_atm_t
60 !
62 !
63 USE modi_write_file_isbamap
64 USE modi_open_file
65 USE modi_close_file
66 !
67 USE modd_topd_par, ONLY : nunit
68 USE modd_topodyn, ONLY : nncat, nnmc, nnb_topd_step
69 USE modd_coupling_topd, ONLY : xwg_full, xdtopt, xwtopt, xwsupsat,&
70  nmaskt, xtotbv_in_mesh, nnpix,&
71  nfreq_maps_wg, xbv_in_mesh,nnbv_in_mesh
72 !
73 USE modd_surf_par, ONLY : xundef,nundef
74 USE modd_isba_par, ONLY : xwgmin
75 !
76 USE yomhook ,ONLY : lhook, dr_hook
77 USE parkind1 ,ONLY : jprb
78 !
79 IMPLICIT NONE
80 !
81 !* 0.1 declarations of arguments
82 !
83 !
84 !
85 TYPE(isba_t), INTENT(INOUT) :: i
86 TYPE(surf_atm_grid_t), INTENT(INOUT) :: ug
87 TYPE(surf_atm_t), INTENT(INOUT) :: u
88 !
89 INTEGER, INTENT(IN) :: ki ! Grid dimensions
90 INTEGER, INTENT(IN) :: kstep ! Topodyn current time step
91 LOGICAL, DIMENSION(:), INTENT(INOUT) :: gtopd !
92 !
93 !* 0.2 declarations of local variables
94 !
95 !
96 INTEGER :: jj, ji , jmesh, jcat ! loop control
97 REAL, DIMENSION(KI) :: zw ! TOPODYN water content on ISBA grid (mm)
98 REAL, DIMENSION(KI) :: zwsat_full ! Water content at saturation on the layer 2
99  ! on the full grid
100 REAL, DIMENSION(KI) :: zwg_old
101 REAL, DIMENSION(KI) :: zdg_full
102 !
103 REAL, DIMENSION(KI,NNCAT) :: zcount, zw_cat
104 !
105  CHARACTER(LEN=5) :: ystep
106 INTEGER :: jcat_in
107 
108 REAL(KIND=JPRB) :: zhook_handle
109 !-------------------------------------------------------------------------------
110 IF (lhook) CALL dr_hook('TOPD_TO_ISBA',0,zhook_handle)
111 !
112 !* 0. Initialization:
113 ! ---------------
114 !
115 zw(:)= 0.0
116 zw_cat(:,:)= 0.0
117 zcount(:,:)=0.0
118 !
119 zwg_old(:) = xwg_full(:)
120 !
121 !
122 !* 1. TOPODYN-LAT => ISBA
123 ! -------------------
124 !* 1.1 mobilizable water
125 ! -----------------
126 !
127 DO jj=1,nncat
128  IF (gtopd(jj)) THEN
129  DO ji=1,nnmc(jj)
130  IF ( (xdtopt(jj,ji) /= xundef).AND. (nmaskt(jj,ji) /= nundef) )THEN
131  zw_cat(nmaskt(jj,ji),jj) = zw_cat(nmaskt(jj,ji),jj) + xwtopt(jj,ji)
132  zcount(nmaskt(jj,ji),jj) = zcount(nmaskt(jj,ji),jj) + 1.0
133  ENDIF
134  ENDDO
135  ENDIF
136 ENDDO
137 !
138 !
139 jcat_in=1
140 DO jmesh=1,ki
141  IF (xtotbv_in_mesh(jmesh)/=0.0 .AND. xtotbv_in_mesh(jmesh)/=xundef ) THEN
142  ! at least 1 catchment over mesh
143  DO jcat=1,nncat
144  IF (xtotbv_in_mesh(jmesh)==xbv_in_mesh(jmesh,jcat)) THEN ! only 1 catchment on mesh
145  jcat_in=jcat
146  IF (gtopd(jcat).AND. nnbv_in_mesh(jmesh,jcat) /=0.) THEN
147  IF (xbv_in_mesh(jmesh,jcat)>=ug%XMESH_SIZE(jmesh)*0.75.AND. zcount(jmesh,jcat)/=0.) THEN ! catchment covers totaly mesh
148  zw(jmesh) = zw_cat(jmesh,jcat) / zcount(jmesh,jcat)
149  ELSEIF(zcount(jmesh,jcat)/=0.)THEN
150  zw(jmesh) = zw_cat(jmesh,jcat) / zcount(jmesh,jcat)
151  ENDIF
152 
153  ELSE
154  zw(jmesh)=zwg_old(jmesh)
155  ENDIF
156  ENDIF
157  ENDDO
158  !
159  IF(zw(jmesh)==0.0) jcat_in=0 ! several catchments on the same mesh
160  !
161  IF (jcat_in==0) THEN ! several catchments on the same mesh
162  IF (xtotbv_in_mesh(jmesh)>=ug%XMESH_SIZE(jmesh)*0.75) THEN ! catchmentS cover totaly mesh
163  DO jcat=1,nncat
164  IF (gtopd(jcat).AND. zcount(jmesh,jcat)/=0.) THEN
165  zw(jmesh) = zw(jmesh) + zw_cat(jmesh,jcat) / zcount(jmesh,jcat) *&
166  min(1.0,(xbv_in_mesh(jmesh,jcat)/ug%XMESH_SIZE(jmesh)))
167  ELSE
168  zw(jmesh)=0.
169  ENDIF
170  ENDDO
171  IF (zw(jmesh)==0.) zw(jmesh)=zwg_old(jmesh)
172  ELSE
173  DO jcat=1,nncat
174  IF (gtopd(jcat).AND. zcount(jmesh,jcat)/=0.) THEN
175  zw(jmesh) = zw(jmesh) + zw_cat(jmesh,jcat) / zcount(jmesh,jcat)*&
176  min(1.0,(xbv_in_mesh(jmesh,jcat)/ug%XMESH_SIZE(jmesh)))
177  ELSE
178  zw(jmesh)=0.
179  ENDIF
180  ENDDO
181  IF (zw(jmesh)==0.) zw(jmesh)=zwg_old(jmesh)
182  !
183  ENDIF
184  ENDIF
185 
186  ELSE
187  zw(jmesh)=zwg_old(jmesh)
188  ENDIF
189 ENDDO
190 !
191 xwg_full(:) = max(zw(:),xwgmin)
192 !
193 !
194  CALL unpack_same_rank(u%NR_NATURE,i%XWSAT(:,2),zwsat_full)
195 !
196 xwsupsat=0.
197 !ludo glace Wsat varie
198 WHERE ( xwg_full(:) > zwsat_full(:) .AND. xwg_full(:)/=xundef )
199  !ludo calcul sat avant wg
200  xwsupsat(:) = xwg_full(:) - zwsat_full(:)
201  xwg_full(:) = zwsat_full(:)
202 ENDWHERE
203 !
204 IF ( (nfreq_maps_wg/=0 .AND. mod(kstep,nfreq_maps_wg)==0) .OR.&
205  ( kstep==nnb_topd_step) ) THEN
206  ! writing of YSTEP to be able to write maps
207  IF (kstep<10) THEN
208  WRITE(ystep,'(I1)') kstep
209  ELSEIF (kstep < 100) THEN
210  WRITE(ystep,'(I2)') kstep
211  ELSEIF (kstep < 1000) THEN
212  WRITE(ystep,'(I3)') kstep
213  ELSEIF (kstep < 10000) THEN
214  WRITE(ystep,'(I4)') kstep
215  ELSE
216  WRITE(ystep,'(I5)') kstep
217  ENDIF
218  !
219  CALL open_file('ASCII ',nunit,hfile='carte_w'//ystep,hform='FORMATTED',haction='WRITE')
220  CALL write_file_isbamap(ug, &
221  nunit,xwg_full,ki)
222  CALL close_file('ASCII ',nunit)
223  !
224 ENDIF
225 !
226 
227 IF (lhook) CALL dr_hook('TOPD_TO_ISBA',1,zhook_handle)
228 !
229 END SUBROUTINE topd_to_isba
subroutine topd_to_isba(I, UG, U, KI, KSTEP, GTOPD)
Definition: topd_to_isba.F90:7
subroutine write_file_isbamap(UG, KUNIT, PVAR, KI)
subroutine close_file(HPROGRAM, KUNIT)
Definition: close_file.F90:6
subroutine open_file(HPROGRAM, KUNIT, HFILE, HFORM, HACTION, HACCESS, KRECL)
Definition: open_file.F90:6