SURFEX v8.1
General documentation of Surfex
pgd_grid.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 pgd_grid (UG, U, GCP, HPROGRAM,HFILE,HFILETYPE,OGRID,HDIR)
7 ! ##########################################################
8 !!
9 !! PURPOSE
10 !! -------
11 !! Reads in namelist the grid type and parameters.
12 !!
13 !! METHOD
14 !! ------
15 !!
16 !! EXTERNAL
17 !! --------
18 !!
19 !!
20 !! IMPLICIT ARGUMENTS
21 !! ------------------
22 !!
23 !!
24 !! REFERENCE
25 !! ---------
26 !!
27 !! AUTHOR
28 !! ------
29 !!
30 !! V. Masson Meteo-France
31 !!
32 !! MODIFICATION
33 !! ------------
34 !!
35 !! Original 01/2004
36 !! E. Martin 10/2007 IGN grid
37 !! P. Samuelsson 12/2012 Rotated lonlat
38 !! M. Moge 05/02/2015 parallelization (using local sizes, GET_MEAN_OF_COORD_SQRT_ll, SET_NAM_GRID_CONF_PROJ_LOCAL) + MPPDB_CHECK
39 !! M. Moge 01/03/2015 call SPLIT_GRID if CPROGRAM == 'PGD ' + remove SET_NAM_GRID_CONF_PROJ_LOCAL
40 !! M. Moge 01/03/2015 change in the input arguments of PGD_GRID_IO_INIT : passing IDXRATIO, IDYRATIO
41 !----------------------------------------------------------------------------
42 !
43 !* 0. DECLARATION
44 ! -----------
45 !
47 USE modd_surf_atm_n, ONLY : surf_atm_t
49 !
50 USE modd_surfex_mpi, ONLY : nsize, npio, nrank, ncomm, nproc
51 !
53 USE modn_pgd_grid
54 USE modd_csts, ONLY : xpi, xradius
55 !
56 USE modi_default_grid
57 USE modi_grid_from_file
58 USE modi_open_namelist
60 USE modi_close_namelist
61 USE modi_get_luout
62 USE modi_read_nam_gridtype
63 USE modi_latlon_grid
64 USE modi_abor1_sfx
65 USE modi_pgd_grid_io_init
67 !
68 USE mode_pos_surf
69 !
70 #ifdef MNH_PARALLEL
71 USE modd_conf, ONLY : cprogram
72 USE mode_tools_ll, ONLY : get_mean_of_coord_sqrt_ll
73 !
74 USE modi_get_size_full_n
75 USE modi_split_grid
76 #endif
77 !
78 USE yomhook ,ONLY : lhook, dr_hook
79 USE parkind1 ,ONLY : jprb
80 !
81 IMPLICIT NONE
82 !
83 #ifdef SFX_MPI
84 include "mpif.h"
85 #endif
86 !
87 !* 0.1 Declaration of dummy arguments
88 ! ------------------------------
89 !
90 TYPE(surf_atm_grid_t), INTENT(INOUT) :: UG
91 TYPE(surf_atm_t), INTENT(INOUT) :: U
92 TYPE(grid_conf_proj_t),INTENT(INOUT) :: GCP
93 !
94  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling the surface
95  CHARACTER(LEN=28), INTENT(IN) :: HFILE ! atmospheric file name
96  CHARACTER(LEN=6), INTENT(IN) :: HFILETYPE ! atmospheric file type
97 LOGICAL, INTENT(IN) :: OGRID ! .true. if grid is imposed by atm. model
98  CHARACTER(LEN=1), INTENT(IN), OPTIONAL :: HDIR
99 !
100 !
101 !* 0.2 Declaration of local variables
102 ! ------------------------------
103 !
104 REAL, DIMENSION(:), ALLOCATABLE :: ZMESH_SIZE
105  CHARACTER(LEN=1) :: YDIR
106 INTEGER :: ILUOUT ! output listing logical unit
107 INTEGER :: ILUNAM ! namelist file logical unit
108 INTEGER :: IIMAX_ll, IJMAX_ll ! global size of son model
109 INTEGER :: ISIZE_FULL
110 LOGICAL :: GFOUND ! Flag true if namelist is present
111 LOGICAL :: GRECT
112 INTEGER :: INFOMPI
113 !
114 REAL(KIND=JPRB) :: ZHOOK_HANDLE
115 !
116 !* 0.3 Declaration of namelists
117 ! ------------------------
118 !
119  INTEGER :: IXOR = 1 ! position of modified bottom left point
120  INTEGER :: IYOR = 1 ! according to initial grid
121  INTEGER :: IXSIZE = -999 ! number of grid meshes in initial grid to be
122  INTEGER :: IYSIZE = -999 ! covered by the modified grid
123  INTEGER :: IDXRATIO = 1 ! resolution ratio between modified grid
124  INTEGER :: IDYRATIO = 1 ! and initial grid
125 NAMELIST/nam_inifile_conf_proj/ixor,iyor,ixsize,iysize,idxratio,idyratio
126 !
127 !------------------------------------------------------------------------------
128 !
129 !* 1. Defaults
130 ! --------
131 !
132 IF (lhook) CALL dr_hook('PGD_GRID',0,zhook_handle)
133 !
134 ydir = 'H'
135 IF (PRESENT(hdir)) ydir = hdir
136 !
137 IF (ASSOCIATED(xgrid_par)) DEALLOCATE(xgrid_par)
138 !
139  CALL default_grid(hprogram,cgrid)
140 !
141 yinifile = ' '
142 yinifiletype = ' '
143 !
144 IF (ogrid) THEN
145  yinifile = hfile
146  yinifiletype = hfiletype
147 END IF
148 !
149  CALL get_luout(hprogram,iluout)
150 !------------------------------------------------------------------------------
151 !
152 !* 2. Open namelist
153 ! -------------
154 !
155 IF (.NOT. ogrid) THEN
156 !
157  CALL open_namelist(hprogram,ilunam)
158 !
159 !------------------------------------------------------------------------------
160 !
161 !* 3. Read grid type
162 ! --------------
163 !
164  CALL posnam(ilunam,'NAM_PGD_GRID',gfound,iluout)
165  IF (gfound) READ(unit=ilunam,nml=nam_pgd_grid)
166 !
167 !------------------------------------------------------------------------------
168 !
169 !* 5. Close namelist
170 ! --------------
171 !
172  CALL close_namelist(hprogram,ilunam)
173 !
174 END IF
175 !-------------------------------------------------------------------------------
176 !
177 !* 4. check of grid and input file types
178 ! ----------------------------------
179 !
180  CALL test_nam_var_surf(iluout,'CGRID',cgrid,'CONF PROJ ','NONE ','LONLAT REG','CARTESIAN ','GAUSS ',&
181  'IGN ','LONLATVAL ','LONLAT ROT')
182  CALL test_nam_var_surf(iluout,'YINIFILETYPE',yinifiletype,' ','MESONH','LFI ','ASCII ','NC ')
183 !
184 !
185 !------------------------------------------------------------------------------
186 !
187 !* 5. Initializes grid characteristics
188 ! --------------------------------
189 !
190 !* 5.1 From another file
191 ! -----------------
192 !
193 IF (len_trim(yinifiletype)>0 .AND. len_trim(yinifile)>0 ) THEN
194  !
195  IF (yinifiletype=='MESONH' .OR. yinifiletype=='LFI ' .OR. yinifiletype=='ASCII ' .OR. yinifiletype=='NC ') THEN
196  !
197  CALL grid_from_file(u,gcp,ug%XGRID_FULL_PAR,hprogram,yinifile,yinifiletype,&
198  ogrid,cgrid,ngrid_par,xgrid_par,nl,ydir)
199  !
200  ug%G%CGRID = cgrid
201  !
202  IF ( cgrid == "IGN " .OR. cgrid == "GAUSS " .OR. cgrid == "NONE " ) THEN
203  grect = .false.
204  ELSE
205  grect = .true.
206  ENDIF
207  !
208  ! on lit la taille globale du modele fils dans la namelist
209  CALL open_namelist(hprogram,ilunam)
210  CALL posnam(ilunam,'NAM_INIFILE_CONF_PROJ',gfound,iluout)
211  IF (gfound) THEN
212  READ(unit=ilunam,nml=nam_inifile_conf_proj)
213  iimax_ll = ixsize*idxratio
214  ijmax_ll = iysize*idyratio
215  ENDIF
216  CALL close_namelist(hprogram,ilunam)
217  !
218  !* 3. Additional actions for I/O
219  !
220  IF (gfound) THEN
221 #ifdef MNH_PARALLEL
222  CALL pgd_grid_io_init(hprogram,ug,ngrid_par,xgrid_par,cgrid,grect,iimax_ll,ijmax_ll,idxratio,idyratio)
223 #else
224  CALL pgd_grid_io_init(hprogram,ug)
225 #endif
226  IF (ydir/='H') u%NDIM_FULL = nl
227  ELSE
228 #ifdef MNH_PARALLEL
229  CALL pgd_grid_io_init(hprogram,ug,ngrid_par,xgrid_par,cgrid,grect)
230 #else
231  CALL pgd_grid_io_init(hprogram,ug)
232 #endif
233  ENDIF
234  !
235 #ifdef MNH_PARALLEL
236  CALL get_size_full_n(hprogram,u%NDIM_FULL,u%NSIZE_FULL,isize_full)
237  u%NSIZE_FULL = isize_full
238  nl = u%NSIZE_FULL
239 #else
240  u%NSIZE_FULL = nl
241 #endif
242  ELSE
243  CALL abor1_sfx('PGD_GRID: FILE TYPE NOT SUPPORTED '//hfiletype//' FOR FILE '//hfile)
244  END IF
245 !
246 ELSE
247 !
248 !* 5.2 Grid not initialized
249 ! --------------------
250 !
251  IF (cgrid=='NONE ' .OR. cgrid==' ') THEN
252  CALL abor1_sfx('PGD_GRID: GRID TYPE NOT INITIALIZED, CGRID='//cgrid)
253 
254 !
255 !* 5.3 Grid initialized
256 ! ----------------
257 !
258  ELSE
259 !
260  CALL read_nam_gridtype(gcp,ug%XGRID_FULL_PAR,u%NDIM_FULL,hprogram,cgrid,ngrid_par,xgrid_par,nl,ydir)
261 !
262  !* 3. Additional actions for I/O
263  !
264  ug%G%CGRID = cgrid
265  !
266 #ifdef MNH_PARALLEL
267  CALL pgd_grid_io_init(hprogram,ug,ngrid_par,xgrid_par)
268 #else
269  CALL pgd_grid_io_init(hprogram,ug)
270 #endif
271  IF (ydir/='H') u%NDIM_FULL = nl
272 #ifdef MNH_PARALLEL
273  CALL get_size_full_n(hprogram,nl,u%NSIZE_FULL,isize_full)
274  u%NSIZE_FULL = isize_full
275  nl = u%NSIZE_FULL
276 #endif
277  !
278  END IF
279 
280 #ifdef MNH_PARALLEL
281  ! IF we are in PREP_PGD, we need to split the grid. Otherwise, the grid was read in parallel and is already splitted
282  IF ( cprogram == 'PGD ') THEN
283  CALL split_grid(ug,u,'MESONH',ngrid_par,xgrid_par)
284  ENDIF
285 #endif
286 
287 END IF
288 !
289 IF (hdir=='A') THEN
290  ug%NGRID_FULL_PAR = ngrid_par
291  ALLOCATE(ug%XGRID_FULL_PAR(ug%NGRID_FULL_PAR))
292  ug%XGRID_FULL_PAR = xgrid_par
293 ELSE
294  ug%G%NGRID_PAR = ngrid_par
295  ALLOCATE(ug%G%XGRID_PAR(ug%G%NGRID_PAR))
296  ug%G%XGRID_PAR = xgrid_par
297 ENDIF
298 !
299 IF (ydir=='A') THEN
300  CALL dr_hook('PGD_GRID',1,zhook_handle)
301  RETURN
302 ENDIF
303 !
304 !------------------------------------------------------------------------------
305 !
306 !* 6. Latitude and longitude
307 ! ----------------------
308 !
309 ALLOCATE(ug%G%XLAT (nl))
310 ALLOCATE(ug%G%XLON (nl))
311 ALLOCATE(ug%G%XMESH_SIZE (nl))
312 ALLOCATE(ug%XJPDIR (nl))
313  CALL latlon_grid(ug%G,nl,ug%XJPDIR)
314 !
315 !------------------------------------------------------------------------------
316 !
317 !* 7. Average grid length (in degrees)
318 ! --------------------------------
319 !
320 !* in meters
321 #ifdef MNH_PARALLEL
322  CALL get_mean_of_coord_sqrt_ll(ug%G%XMESH_SIZE,u%NSIZE_FULL,u%NDIM_FULL,xmeshlength)
323 #else
324 IF (nrank==npio) ALLOCATE(zmesh_size(u%NDIM_FULL))
325  CALL gather_and_write_mpi(ug%G%XMESH_SIZE,zmesh_size)
326 IF (nrank==npio) xmeshlength = sum( sqrt(zmesh_size) ) / max(u%NDIM_FULL,1)
327 IF (nproc>1) THEN
328 #ifdef SFX_MPI
329  CALL mpi_bcast(xmeshlength,kind(xmeshlength)/4,mpi_real,npio,ncomm,infompi)
330 #endif
331 ENDIF
332 IF (nrank==npio) DEALLOCATE(zmesh_size)
333 #endif
334 !
335 !* in degrees (of latitude)
337 IF (lhook) CALL dr_hook('PGD_GRID',1,zhook_handle)
338 !
339 !-------------------------------------------------------------------------------
340 !
341 END SUBROUTINE pgd_grid
real, save xradius
Definition: modd_csts.F90:54
subroutine latlon_grid(G, KL, PDIR)
Definition: latlon_grid.F90:7
character(len=6) yinifiletype
real, save xpi
Definition: modd_csts.F90:43
subroutine get_size_full_n(HPROGRAM, KDIM_FULL, KSIZE_FULL_IN, KSIZE
subroutine posnam(KULNAM, HDNAML, OFOUND, KLUOUT)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
subroutine split_grid(UG, U, HPROGRAM, KGRID_PAR, PGRID_PAR, KHALO)
Definition: split_grid.F90:7
integer, parameter jprb
Definition: parkind1.F90:32
real, dimension(:), pointer xgrid_par
subroutine grid_from_file(U, GCP, PGRID_FULL_PAR, HPROGRAM, HFILE, HFI
subroutine pgd_grid_io_init(HPROGRAM, UG, KGRID_PAR, PGRID_PAR, HGRID,
subroutine close_namelist(HPROGRAM, KLUNAM)
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
intent(out) overrides sub arrays one Sort by the least significant key first sum(iindex(1:n))
logical lhook
Definition: yomhook.F90:15
subroutine open_namelist(HPROGRAM, KLUNAM, HFILE)
subroutine read_nam_gridtype(GCP, PGRID_FULL_PAR, KDIM_FULL, HPROGRAM
subroutine default_grid(HPROGRAM, HGRID)
Definition: default_grid.F90:7
subroutine pgd_grid(UG, U, GCP, HPROGRAM, HFILE, HFILETYPE, OGRID, HD
Definition: pgd_grid.F90:7
character(len=28) yinifile