1 !SURFEX_LIC Copyright 1994-2014 Meteo-France
2 !SURFEX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SURFEX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SURFEX_LIC for details. version 1.
6 SUBROUTINE PGD_GRID(HPROGRAM,HFILE,HFILETYPE,OGRID,HGRID,KGRID_PAR,PGRID_PAR)
7 ! ##########################################################
11 !! Reads in namelist the grid type and parameters.
30 !! V. Masson Meteo-France
36 !! E. Martin 10/2007 IGN grid
37 !! M. Moge 05/02/2015 parallelization (using local sizes, GET_MEAN_OF_COORD_SQRT_ll, SET_NAM_GRID_CONF_PROJ_LOCAL) + MPPDB_CHECK
38 !! M. Moge 01/03/2015 call SPLIT_GRID if CPROGRAM == 'PGD ' + remove SET_NAM_GRID_CONF_PROJ_LOCAL
39 !! M. Moge 01/03/2015 change in the input arguments of PGD_GRID_IO_INIT : passing IDXRATIO, IDYRATIO
40 !----------------------------------------------------------------------------
45 USE MODD_SURFEX_MPI, ONLY : NSIZE, NINDEX, NPIO, NRANK
46 USE MODD_SURFEX_OMP, ONLY : NINDX2, NWORK, XWORK, XWORK2, XWORK3, &
47 NWORK_FULL, XWORK_FULL, XWORK2_FULL
49 USE MODD_PGD_GRID, ONLY : NL, XGRID_PAR, NGRID_PAR, XMESHLENGTH
51 USE MODD_SURF_ATM_GRID_n, ONLY : XLAT, XLON, XMESH_SIZE, XJPDIR
52 USE MODD_SURF_ATM_n, ONLY : NDIM_FULL, NSIZE_FULL
53 USE MODD_CSTS, ONLY : XPI, XRADIUS
56 USE MODI_GRID_FROM_FILE
57 USE MODI_OPEN_NAMELIST
58 USE MODI_TEST_NAM_VAR_SURF
59 USE MODI_CLOSE_NAMELIST
61 USE MODI_READ_NAM_GRIDTYPE
67 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK
68 USE PARKIND1 ,ONLY : JPRB
72 USE MODI_PGD_GRID_IO_INIT
74 USE MODE_TOOLS_ll, ONLY : GET_MEAN_OF_COORD_SQRT_ll
76 USE MODI_GET_SIZE_FULL_n
78 USE MODD_CONF, ONLY : CPROGRAM
83 !* 0.1 Declaration of dummy arguments
84 ! ------------------------------
86 CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling the surface
87 CHARACTER(LEN=28), INTENT(IN) :: HFILE ! atmospheric file name
88 CHARACTER(LEN=6), INTENT(IN) :: HFILETYPE ! atmospheric file type
89 LOGICAL, INTENT(IN) :: OGRID ! .true. if grid is imposed by atm. model
90 CHARACTER(LEN=10), INTENT(OUT) :: HGRID ! grid type
91 INTEGER, INTENT(OUT) :: KGRID_PAR ! size of PGRID_PAR
92 REAL, DIMENSION(:), POINTER :: PGRID_PAR ! parameters defining this grid
95 !* 0.2 Declaration of local variables
96 ! ------------------------------
98 INTEGER :: ILUOUT ! output listing logical unit
99 INTEGER :: ILUNAM ! namelist file logical unit
100 LOGICAL :: GFOUND ! Flag true if namelist is present
101 REAL(KIND=JPRB) :: ZHOOK_HANDLE
102 INTEGER :: IIMAX_ll, IJMAX_ll ! global size of son model
105 INTEGER :: IXOR = 1 ! position of modified bottom left point
106 INTEGER :: IYOR = 1 ! according to initial grid
107 INTEGER :: IXSIZE = -999 ! number of grid meshes in initial grid to be
108 INTEGER :: IYSIZE = -999 ! covered by the modified grid
109 INTEGER :: IDXRATIO = 1 ! resolution ratio between modified grid
110 INTEGER :: IDYRATIO = 1 ! and initial grid
111 NAMELIST/NAM_INIFILE_CONF_PROJ/IXOR,IYOR,IXSIZE,IYSIZE,IDXRATIO,IDYRATIO
113 !* 0.3 Declaration of namelists
114 ! ------------------------
116 !------------------------------------------------------------------------------
121 IF (LHOOK) CALL DR_HOOK('PGD_GRID',0,ZHOOK_HANDLE)
122 CALL DEFAULT_GRID(HPROGRAM,CGRID)
129 YFILETYPE = HFILETYPE
132 CALL GET_LUOUT(HPROGRAM,ILUOUT)
133 !------------------------------------------------------------------------------
138 IF (.NOT. OGRID) THEN
139 CALL OPEN_NAMELIST(HPROGRAM,ILUNAM)
141 !------------------------------------------------------------------------------
146 CALL POSNAM(ILUNAM,'NAM_PGD_GRID',GFOUND,ILUOUT)
147 IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_PGD_GRID)
149 !------------------------------------------------------------------------------
154 CALL CLOSE_NAMELIST(HPROGRAM,ILUNAM)
157 !-------------------------------------------------------------------------------
159 !* 4. check of grid and input file types
160 ! ----------------------------------
162 CALL TEST_NAM_VAR_SURF(ILUOUT,'CGRID',CGRID,'CONF PROJ ','NONE ','LONLAT REG','CARTESIAN ','GAUSS ',&
164 CALL TEST_NAM_VAR_SURF(ILUOUT,'YFILETYPE',YFILETYPE,' ','MESONH','LFI ','ASCII ')
167 !------------------------------------------------------------------------------
169 !* 5. Initializes grid characteristics
170 ! --------------------------------
172 !* 5.1 From another file
175 IF (LEN_TRIM(YFILETYPE)>0 .AND. LEN_TRIM(YINIFILE)>0 ) THEN
176 IF (YFILETYPE=='MESONH' .OR. YFILETYPE=='LFI ' .OR. YFILETYPE=='ASCII ') THEN
177 CALL GRID_FROM_FILE(HPROGRAM,YINIFILE,YFILETYPE,OGRID,CGRID,NGRID_PAR,XGRID_PAR,NL)
179 IF ( HGRID == "IGN " .OR. HGRID == "GAUSS " .OR. HGRID == "NONE " ) THEN
184 ! on lit la taille globale du modele fils dans la namelist
185 CALL OPEN_NAMELIST(HPROGRAM,ILUNAM)
186 CALL POSNAM(ILUNAM,'NAM_INIFILE_CONF_PROJ',GFOUND,ILUOUT)
188 READ(UNIT=ILUNAM,NML=NAM_INIFILE_CONF_PROJ)
189 IIMAX_ll = IXSIZE*IDXRATIO
190 IJMAX_ll = IYSIZE*IDYRATIO
192 CALL CLOSE_NAMELIST(HPROGRAM,ILUNAM)
194 !* 3. Additional actions for I/O
198 CALL PGD_GRID_IO_INIT(HPROGRAM,NGRID_PAR,XGRID_PAR, HGRID, GRECT, IIMAX_ll, IJMAX_ll, IDXRATIO, IDYRATIO)
200 CALL PGD_GRID_IO_INIT(HPROGRAM)
205 CALL PGD_GRID_IO_INIT(HPROGRAM,NGRID_PAR,XGRID_PAR, HGRID, GRECT)
207 CALL PGD_GRID_IO_INIT(HPROGRAM)
212 CALL GET_SIZE_FULL_n(HPROGRAM,NDIM_FULL,NSIZE_FULL)
218 CALL ABOR1_SFX('PGD_GRID: FILE TYPE NOT SUPPORTED '//HFILETYPE//' FOR FILE '//HFILE)
220 !we don't need to call SPLIT_GRID, the grid has been splitted in GRID_FROM_FILE
224 !* 5.2 Grid not initialized
225 ! --------------------
227 IF (CGRID=='NONE ' .OR. CGRID==' ') THEN
228 CALL ABOR1_SFX('PGD_GRID: GRID TYPE NOT INITIALIZED, CGRID='//CGRID)
231 !* 5.3 Grid initialized
236 CALL READ_NAM_GRIDTYPE(HPROGRAM,CGRID,NGRID_PAR,XGRID_PAR,NL)
238 !* 3. Additional actions for I/O
241 CALL PGD_GRID_IO_INIT(HPROGRAM,NGRID_PAR,XGRID_PAR)
243 CALL PGD_GRID_IO_INIT(HPROGRAM)
248 CALL GET_SIZE_FULL_n(HPROGRAM,NDIM_FULL,NSIZE_FULL)
255 ! IF we are in PREP_PGD, we need to split the grid. Otherwise, the grid was read in parallel and is already splitted
256 IF ( CPROGRAM == 'PGD ') THEN
257 CALL SPLIT_GRID('MESONH',NGRID_PAR,XGRID_PAR)
264 IF (.NOT.ALLOCATED(NINDEX)) THEN
265 ALLOCATE(NINDEX(NDIM_FULL))
269 ALLOCATE(NWORK(NDIM_FULL))
270 ALLOCATE(XWORK(NDIM_FULL))
271 ALLOCATE(XWORK2(NDIM_FULL,10))
272 ALLOCATE(XWORK3(NDIM_FULL,10,10))
273 IF (NRANK==NPIO) THEN
274 ALLOCATE(NWORK_FULL(NDIM_FULL))
275 ALLOCATE(XWORK_FULL(NDIM_FULL))
276 ALLOCATE(XWORK2_FULL(NDIM_FULL,10))
278 ALLOCATE(NWORK_FULL(0))
279 ALLOCATE(XWORK_FULL(0))
280 ALLOCATE(XWORK2_FULL(0,0))
283 KGRID_PAR = NGRID_PAR
284 ALLOCATE(PGRID_PAR(KGRID_PAR))
285 PGRID_PAR = XGRID_PAR
287 !------------------------------------------------------------------------------
289 !* 6. Latitude and longitude
290 ! ----------------------
292 ALLOCATE(XLAT (NSIZE_FULL))
293 ALLOCATE(XLON (NSIZE_FULL))
294 ALLOCATE(XMESH_SIZE (NSIZE_FULL))
295 ALLOCATE(XJPDIR (NSIZE_FULL))
296 CALL LATLON_GRID(CGRID,NGRID_PAR,NSIZE_FULL,ILUOUT,XGRID_PAR,XLAT,XLON,XMESH_SIZE,XJPDIR)
298 !------------------------------------------------------------------------------
300 !* 7. Average grid length (in degrees)
301 ! --------------------------------
305 CALL GET_MEAN_OF_COORD_SQRT_ll(XMESH_SIZE,NSIZE_FULL,NDIM_FULL,XMESHLENGTH)
307 XMESHLENGTH = SUM ( SQRT(XMESH_SIZE) ) / NL
310 !* in degrees (of latitude)
311 XMESHLENGTH = XMESHLENGTH *180. / XPI / XRADIUS
312 IF (LHOOK) CALL DR_HOOK('PGD_GRID',1,ZHOOK_HANDLE)
314 !-------------------------------------------------------------------------------
316 END SUBROUTINE PGD_GRID