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