SURFEX v8.1
General documentation of Surfex
zoom_pgd_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  SUBROUTINE zoom_pgd_isba (CHI, DTCO, DTV, IG, IO, S, K, ISS, UG, U, USS, GCP, &
7  HPROGRAM,HINIFILE,HINIFILETYPE,HFILE,HFILETYPE,OECOCLIMAP)
8 ! ###########################################################
9 
10 !!
11 !! PURPOSE
12 !! -------
13 !! This program prepares the physiographic data fields.
14 !!
15 !! METHOD
16 !! ------
17 !!
18 !! EXTERNAL
19 !! --------
20 !!
21 !!
22 !! IMPLICIT ARGUMENTS
23 !! ------------------
24 !!
25 !!
26 !! REFERENCE
27 !! ---------
28 !!
29 !! AUTHOR
30 !! ------
31 !!
32 !! V. Masson Meteo-France
33 !!
34 !! MODIFICATION
35 !! ------------
36 !!
37 !! Original 13/10/03
38 !! B. Decharme 2008 XWDRAIN
39 !! M.Tomasini 17/04/12 Add interpolation for ISBA variables (MODD_DATA_ISBA_n)
40 !----------------------------------------------------------------------------
41 !
42 !* 0. DECLARATION
43 ! -----------
44 !
45 USE modd_ch_isba_n, ONLY : ch_isba_t
47 USE modd_data_isba_n, ONLY : data_isba_t
48 USE modd_sfx_grid_n, ONLY : grid_t
49 USE modd_sso_n, ONLY : sso_t
52 USE modd_isba_n, ONLY : isba_s_t, isba_k_t
54 USE modd_surf_atm_n, ONLY : surf_atm_t
55 USE modd_sso_n, ONLY : sso_t
56 !
57 USE modd_surf_par, ONLY : xundef
58 USE modd_data_cover_par, ONLY : jpcover
59 USE modd_isba_par, ONLY : xoptimgrid
61 !
62 USE modi_get_luout
63 USE modi_open_aux_io_surf
65 USE modi_close_aux_io_surf
66 USE modi_get_surf_size_n
67 USE modi_pack_pgd
68 USE modi_zoom_pgd_isba_full
69 USE modi_get_aos_n
70 USE modi_get_sso_n
71 USE modi_pack_pgd_isba
72 !
73 USE yomhook ,ONLY : lhook, dr_hook
74 USE parkind1 ,ONLY : jprb
75 !
76 IMPLICIT NONE
77 !
78 !* 0.1 Declaration of dummy arguments
79 ! ------------------------------
80 !
81 !
82 TYPE(ch_isba_t), INTENT(INOUT) :: CHI
83 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
84 TYPE(data_isba_t), INTENT(INOUT) :: DTV
85 TYPE(grid_t), INTENT(INOUT) :: IG
86 TYPE(sso_t), INTENT(INOUT) :: ISS
87 TYPE(isba_options_t), INTENT(INOUT) :: IO
88 TYPE(isba_s_t), INTENT(INOUT) :: S
89 TYPE(isba_k_t), INTENT(INOUT) :: K
90 TYPE(surf_atm_grid_t), INTENT(INOUT) :: UG
91 TYPE(surf_atm_t), INTENT(INOUT) :: U
92 TYPE(sso_t), INTENT(INOUT) :: USS
93 TYPE(grid_conf_proj_t),INTENT(INOUT) :: GCP
94 !
95  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling
96  CHARACTER(LEN=28), INTENT(IN) :: HINIFILE ! input atmospheric file name
97  CHARACTER(LEN=6), INTENT(IN) :: HINIFILETYPE! input atmospheric file type
98  CHARACTER(LEN=28), INTENT(IN) :: HFILE ! output file name
99  CHARACTER(LEN=6), INTENT(IN) :: HFILETYPE ! output file type
100 LOGICAL, INTENT(IN) :: OECOCLIMAP ! flag to use ecoclimap
101 !
102 !
103 !* 0.2 Declaration of local variables
104 ! ------------------------------
105 !
106 INTEGER :: ISIZE_LMEB_PATCH
107 INTEGER :: IVERSION, IBUGFIX
108 INTEGER :: IRESP
109 INTEGER :: ILUOUT
110 INTEGER :: IL ! total 1D dimension (output grid, total surface)
111 INTEGER :: ILU ! total 1D dimension (output grid, ISBA points only)
112 REAL, DIMENSION(:), ALLOCATABLE :: ZAOSIP ! A/S i+ on all surface points
113 REAL, DIMENSION(:), ALLOCATABLE :: ZAOSIM ! A/S i- on all surface points
114 REAL, DIMENSION(:), ALLOCATABLE :: ZAOSJP ! A/S j+ on all surface points
115 REAL, DIMENSION(:), ALLOCATABLE :: ZAOSJM ! A/S j- on all surface points
116 REAL, DIMENSION(:), ALLOCATABLE :: ZHO2IP ! h/2 i+ on all surface points
117 REAL, DIMENSION(:), ALLOCATABLE :: ZHO2IM ! h/2 i- on all surface points
118 REAL, DIMENSION(:), ALLOCATABLE :: ZHO2JP ! h/2 j+ on all surface points
119 REAL, DIMENSION(:), ALLOCATABLE :: ZHO2JM ! h/2 j- on all surface points
120 REAL, DIMENSION(:), ALLOCATABLE :: ZSSO_SLOPE! subgrid slope on all surface points
121 REAL(KIND=JPRB) :: ZHOOK_HANDLE
122 !------------------------------------------------------------------------------
123 IF (lhook) CALL dr_hook('ZOOM_PGD_ISBA',0,zhook_handle)
124  CALL get_luout(hprogram,iluout)
125 !
126 !* 1. Preparation of IO for reading in the file
127 ! -----------------------------------------
128 !
129 !* Note that all points are read, even those without physical meaning.
130 ! These points will not be used during the horizontal interpolation step.
131 ! Their value must be defined as XUNDEF.
132 !
133  CALL open_aux_io_surf(hinifile,hinifiletype,'FULL ')
134 !
135  CALL read_surf(hinifiletype,'VERSION',iversion,iresp)
136  CALL read_surf(hinifiletype,'BUG',ibugfix,iresp)
137  CALL read_surf(hinifiletype,'PATCH_NUMBER',io%NPATCH,iresp)
138 !
139 ALLOCATE(io%LMEB_PATCH(io%NPATCH))
140 !
141 IF (iversion>=8) THEN
142  !
143  CALL read_surf(hinifiletype,'MEB_PATCH',io%LMEB_PATCH(:),iresp,hdir='-')
144  isize_lmeb_patch = count(io%LMEB_PATCH(:))
145  !
146  IF (isize_lmeb_patch>0)THEN
147  CALL read_surf(hinifiletype,'FORC_MEASURE',io%LFORC_MEASURE,iresp)
148  CALL read_surf(hinifiletype,'MEB_LITTER',io%LMEB_LITTER,iresp)
149  CALL read_surf(hinifiletype,'MEB_GNDRES',io%LMEB_GNDRES,iresp)
150  ELSE
151  io%LFORC_MEASURE = .false.
152  io%LMEB_LITTER = .false.
153  io%LMEB_GNDRES = .false.
154  ENDIF
155  !
156 ELSE
157  io%LMEB_PATCH(:)= .false.
158  io%LFORC_MEASURE= .false.
159  io%LMEB_LITTER = .false.
160  io%LMEB_GNDRES = .false.
161 ENDIF
162 !
163 !
164  CALL read_surf(hinifiletype,'GROUND_LAYER',io%NGROUND_LAYER,iresp)
165  CALL read_surf(hinifiletype,'ISBA',io%CISBA,iresp)
166 IF (iversion >= 7) THEN
167  CALL read_surf(hinifiletype,'PEDOTF',io%CPEDOTF,iresp)
168 ELSE
169  io%CPEDOTF = 'CH78'
170 ENDIF
171  CALL read_surf(hinifiletype,'PHOTO',io%CPHOTO,iresp)
172 !
173 IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=2) THEN
174  !
175  CALL read_surf(hinifiletype,'TR_ML',io%LTR_ML,iresp)
176  !
177 ELSE
178  io%LTR_ML = .false.
179 ENDIF
180 !
181 IF(io%CISBA=='DIF') THEN
182  ALLOCATE(io%XSOILGRID(io%NGROUND_LAYER))
183  io%XSOILGRID=xundef
184  IF (iversion>7 .OR. iversion==7 .AND. ibugfix>=2) THEN
185  CALL read_surf(hinifiletype,'SOILGRID',io%XSOILGRID,iresp,hdir='-')
186  ELSE
187  io%XSOILGRID(1:io%NGROUND_LAYER)=xoptimgrid(1:io%NGROUND_LAYER)
188  ENDIF
189 ELSE
190  ALLOCATE(io%XSOILGRID(0))
191 ENDIF
192 !
193 !* number of biomass pools
194 !
195 IF (iversion>=6) THEN
196  CALL read_surf(hprogram,'NBIOMASS',io%NNBIOMASS,iresp)
197 ELSE
198  SELECT CASE (io%CPHOTO)
199  CASE ('AST')
200  io%NNBIOMASS = 1
201  CASE ('NIT')
202  io%NNBIOMASS = 3
203  CASE ('NCB')
204  io%NNBIOMASS = 6
205  END SELECT
206 ENDIF
207 !
208  CALL close_aux_io_surf(hinifile,hinifiletype)
209 !
210 !------------------------------------------------------------------------------
211 io%LECOCLIMAP = oecoclimap
212 !
213 !-------------------------------------------------------------------------------
214 !
215 !* 7. Number of points and packing of general fields
216 ! ----------------------------------------------
217 !
218 !
219  CALL get_surf_size_n(dtco, u,'NATURE',ilu)
220 !
221 ALLOCATE(s%LCOVER (jpcover))
222 ALLOCATE(s%XZS (ilu))
223 ALLOCATE(ig%XLAT (ilu))
224 ALLOCATE(ig%XLON (ilu))
225 ALLOCATE(ig%XMESH_SIZE (ilu))
226 ALLOCATE(iss%XZ0EFFJPDIR(ilu))
227 !
228  CALL pack_pgd(dtco, u, hprogram, 'NATURE', ig, s%LCOVER, s%XCOVER, s%XZS )
229 !
230 !------------------------------------------------------------------------------
231 !
232 !* 3. Reading of sand, clay, runoffb, wdrain and interpolations
233 ! --------------------------------------------------
234 !
235 ALLOCATE(k%XSAND(ilu,io%NGROUND_LAYER))
236 ALLOCATE(k%XCLAY(ilu,io%NGROUND_LAYER))
237 ALLOCATE(k%XRUNOFFB(ilu))
238 ALLOCATE(k%XWDRAIN (ilu))
239  CALL zoom_pgd_isba_full(chi, dtco, dtv, ig, io, s, k, ug, u, gcp, &
240  hprogram,hinifile,hinifiletype)
241 !
242 !-------------------------------------------------------------------------------
243 !
244 !* 8. Packing of ISBA specific fields
245 ! -------------------------------
246 !
247  CALL get_surf_size_n(dtco, u, 'FULL ',il)
248 !
249 ALLOCATE(zaosip(il))
250 ALLOCATE(zaosim(il))
251 ALLOCATE(zaosjp(il))
252 ALLOCATE(zaosjm(il))
253 ALLOCATE(zho2ip(il))
254 ALLOCATE(zho2im(il))
255 ALLOCATE(zho2jp(il))
256 ALLOCATE(zho2jm(il))
257 ALLOCATE(zsso_slope(il))
258 
259  CALL get_aos_n(uss,hprogram,il,zaosip,zaosim,zaosjp,zaosjm,zho2ip,zho2im,zho2jp,zho2jm)
260  CALL get_sso_n(uss,hprogram,il,zsso_slope)
261 
262  CALL pack_pgd_isba(dtco, ig%NDIM, iss, u, hprogram, &
263  zaosip, zaosim, zaosjp, zaosjm, &
264  zho2ip, zho2im, zho2jp, zho2jm, &
265  zsso_slope )
266 !
267 DEALLOCATE(zaosip)
268 DEALLOCATE(zaosim)
269 DEALLOCATE(zaosjp)
270 DEALLOCATE(zaosjm)
271 DEALLOCATE(zho2ip)
272 DEALLOCATE(zho2im)
273 DEALLOCATE(zho2jp)
274 DEALLOCATE(zho2jm)
275 DEALLOCATE(zsso_slope)
276 IF (lhook) CALL dr_hook('ZOOM_PGD_ISBA',1,zhook_handle)
277 !-------------------------------------------------------------------------------
278 !
279 END SUBROUTINE zoom_pgd_isba
subroutine get_surf_size_n(DTCO, U, HTYPE, KL)
subroutine get_aos_n(USS, HPROGRAM, KI, PAOSIP, PAOSIM, PAOSJP, PAOSJM, PHO2IP, PHO2IM, PHO2JP, PHO2JM)
Definition: get_aosn.F90:9
character(len=10) cingrid_type
Definition: modd_prep.F90:39
character(len=6) cinterp_type
Definition: modd_prep.F90:40
subroutine close_aux_io_surf(HFILE, HFILETYPE)
subroutine pack_pgd(DTCO, U, HPROGRAM, HSURF, G, OCOVER, PCOVER,
Definition: pack_pgd.F90:7
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
subroutine get_sso_n(USS, HPROGRAM, KI, PSSO_SLOPE)
Definition: get_sson.F90:8
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
logical lhook
Definition: yomhook.F90:15
subroutine zoom_pgd_isba_full(CHI, DTCO, DTV, IG, IO, S, K, UG, U
subroutine pack_pgd_isba(DTCO, KDIM, ISS, U, HPROGRAM,
subroutine open_aux_io_surf(HFILE, HFILETYPE, HMASK, HDIR)
static int count
Definition: memory_hook.c:21
subroutine zoom_pgd_isba(CHI, DTCO, DTV, IG, IO, S, K, ISS, UG, U