SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
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 (&
7  ug, u, &
8  hprogram,hfile,hfiletype,ogrid,hgrid,kgrid_par,pgrid_par)
9 ! ##########################################################
10 !!
11 !! PURPOSE
12 !! -------
13 !! Reads in namelist the grid type and parameters.
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 01/2004
38 !! E. Martin 10/2007 IGN grid
39 !! P. Samuelsson 12/2012 Rotated lonlat
40 !----------------------------------------------------------------------------
41 !
42 !* 0. DECLARATION
43 ! -----------
44 !
45 !
46 !
47 !
48 !
50 USE modd_surf_atm_n, ONLY : surf_atm_t
51 !
52 USE modd_surfex_mpi, ONLY : nsize, nindex, npio, nrank
53 USE modd_surfex_omp, ONLY : nindx2sfx, nwork, nwork2, xwork, xwork2, xwork3, &
54  nwork_full, nwork2_full, xwork_full, xwork2_full
55 !
56 USE modd_pgd_grid, ONLY : nl, xgrid_par, ngrid_par, xmeshlength
57 USE modn_pgd_grid
58 USE modd_csts, ONLY : xpi, xradius
59 !
60 USE modi_default_grid
61 USE modi_grid_from_file
62 USE modi_open_namelist
64 USE modi_close_namelist
65 USE modi_get_luout
66 USE modi_read_nam_gridtype
67 USE modi_latlon_grid
68 !
69 USE mode_pos_surf
70 !
71 !
72 USE yomhook ,ONLY : lhook, dr_hook
73 USE parkind1 ,ONLY : jprb
74 !
75 USE modi_abor1_sfx
76 !
77 IMPLICIT NONE
78 !
79 !* 0.1 Declaration of dummy arguments
80 ! ------------------------------
81 !
82 !
83 !
84 !
85 TYPE(surf_atm_grid_t), INTENT(INOUT) :: ug
86 TYPE(surf_atm_t), INTENT(INOUT) :: u
87 !
88  CHARACTER(LEN=6), INTENT(IN) :: hprogram ! program calling the surface
89  CHARACTER(LEN=28), INTENT(IN) :: hfile ! atmospheric file name
90  CHARACTER(LEN=6), INTENT(IN) :: hfiletype ! atmospheric file type
91 LOGICAL, INTENT(IN) :: ogrid ! .true. if grid is imposed by atm. model
92  CHARACTER(LEN=10), INTENT(OUT) :: hgrid ! grid type
93 INTEGER, INTENT(OUT) :: kgrid_par ! size of PGRID_PAR
94 REAL, DIMENSION(:), POINTER :: pgrid_par ! parameters defining this grid
95 !
96 !
97 !* 0.2 Declaration of local variables
98 ! ------------------------------
99 !
100 INTEGER :: iluout ! output listing logical unit
101 INTEGER :: ilunam ! namelist file logical unit
102 LOGICAL :: gfound ! Flag true if namelist is present
103 REAL(KIND=JPRB) :: zhook_handle
104 !
105 !* 0.3 Declaration of namelists
106 ! ------------------------
107 !
108 !------------------------------------------------------------------------------
109 !
110 !* 1. Defaults
111 ! --------
112 !
113 IF (lhook) CALL dr_hook('PGD_GRID',0,zhook_handle)
114  CALL default_grid(hprogram,cgrid)
115 !
116 yinifile = ' '
117 yinifiletype = ' '
118 !
119 IF (ogrid) THEN
120  yinifile = hfile
121  yinifiletype = hfiletype
122 END IF
123 !
124  CALL get_luout(hprogram,iluout)
125 !------------------------------------------------------------------------------
126 !
127 !* 2. Open namelist
128 ! -------------
129 !
130 IF (.NOT. ogrid) THEN
131  CALL open_namelist(hprogram,ilunam)
132 !
133 !------------------------------------------------------------------------------
134 !
135 !* 3. Read grid type
136 ! --------------
137 !
138  CALL posnam(ilunam,'NAM_PGD_GRID',gfound,iluout)
139  IF (gfound) READ(unit=ilunam,nml=nam_pgd_grid)
140 !
141 !------------------------------------------------------------------------------
142 !
143 !* 5. Close namelist
144 ! --------------
145 !
146  CALL close_namelist(hprogram,ilunam)
147 !
148 END IF
149 !-------------------------------------------------------------------------------
150 !
151 !* 4. check of grid and input file types
152 ! ----------------------------------
153 !
154  CALL test_nam_var_surf(iluout,'CGRID',cgrid,'CONF PROJ ','NONE ','LONLAT REG','CARTESIAN ','GAUSS ',&
155  'IGN ','LONLATVAL ','LONLAT ROT')
156  CALL test_nam_var_surf(iluout,'YINIFILETYPE',yinifiletype,' ','MESONH','LFI ','ASCII ','NC ')
157 !
158 !
159 !------------------------------------------------------------------------------
160 !
161 !* 5. Initializes grid characteristics
162 ! --------------------------------
163 !
164 !* 5.1 From another file
165 ! -----------------
166 !
167 IF (len_trim(yinifiletype)>0 .AND. len_trim(yinifile)>0 ) THEN
168  IF (yinifiletype=='MESONH' .OR. yinifiletype=='LFI ' .OR. yinifiletype=='ASCII ' .OR. yinifiletype=='NC ') THEN
169  CALL grid_from_file(&
170  hprogram,yinifile,yinifiletype,ogrid,cgrid,ngrid_par,xgrid_par,nl)
171  ELSE
172  CALL abor1_sfx('PGD_GRID: FILE TYPE NOT SUPPORTED '//hfiletype//' FOR FILE '//hfile)
173  END IF
174 !
175 ELSE
176 !
177 !* 5.2 Grid not initialized
178 ! --------------------
179 !
180  IF (cgrid=='NONE ' .OR. cgrid==' ') THEN
181  CALL abor1_sfx('PGD_GRID: GRID TYPE NOT INITIALIZED, CGRID='//cgrid)
182 
183 !
184 !* 5.3 Grid initialized
185 ! ----------------
186 !
187  ELSE
188 !
189  CALL read_nam_gridtype(hprogram,cgrid,ngrid_par,xgrid_par,nl)
190 !
191  END IF
192 
193 END IF
194 !
195 hgrid = cgrid
196 u%NDIM_FULL = nl
197 nsize = u%NDIM_FULL
198 IF (.NOT.ALLOCATED(nindex)) THEN
199  ALLOCATE(nindex(u%NDIM_FULL))
200  nindex(:) = 0
201 ENDIF
202 nindx2sfx = u%NDIM_FULL
203 ALLOCATE(nwork(u%NDIM_FULL))
204 ALLOCATE(xwork(u%NDIM_FULL))
205 ALLOCATE(nwork2(u%NDIM_FULL,10))
206 ALLOCATE(xwork2(u%NDIM_FULL,10))
207 ALLOCATE(xwork3(u%NDIM_FULL,10,10))
208 IF (nrank==npio) THEN
209  ALLOCATE(nwork_full(u%NDIM_FULL))
210  ALLOCATE(xwork_full(u%NDIM_FULL))
211  ALLOCATE(nwork2_full(u%NDIM_FULL,10))
212  ALLOCATE(xwork2_full(u%NDIM_FULL,10))
213 ELSE
214  ALLOCATE(nwork_full(0))
215  ALLOCATE(xwork_full(0))
216  ALLOCATE(nwork2_full(0,0))
217  ALLOCATE(xwork2_full(0,0))
218 ENDIF
219 !
220 kgrid_par = ngrid_par
221 ALLOCATE(pgrid_par(kgrid_par))
222 pgrid_par = xgrid_par
223 !
224 !------------------------------------------------------------------------------
225 !
226 !* 6. Latitude and longitude
227 ! ----------------------
228 !
229 ALLOCATE(ug%XLAT (nl))
230 ALLOCATE(ug%XLON (nl))
231 ALLOCATE(ug%XMESH_SIZE (nl))
232 ALLOCATE(ug%XJPDIR (nl))
233  CALL latlon_grid(cgrid,ngrid_par,nl,iluout,xgrid_par,ug%XLAT,ug%XLON,ug%XMESH_SIZE,ug%XJPDIR)
234 !
235 !------------------------------------------------------------------------------
236 !
237 !* 7. Average grid length (in degrees)
238 ! --------------------------------
239 !
240 !* in meters
241 xmeshlength = sum( sqrt(ug%XMESH_SIZE) ) / nl
242 !
243 !* in degrees (of latitude)
244 xmeshlength = xmeshlength *180. / xpi / xradius
245 IF (lhook) CALL dr_hook('PGD_GRID',1,zhook_handle)
246 !
247 !-------------------------------------------------------------------------------
248 !
249 END SUBROUTINE pgd_grid
subroutine grid_from_file(HPROGRAM, HFILE, HFILETYPE, OGRID, HGRID, KGRID_PAR, PGRID_PAR, KL)
subroutine latlon_grid(HGRID, KGRID_PAR, KL, KLUOUT, PGRID_PAR, PLAT, PLON, PMESH_SIZE, PDIR)
Definition: latlon_grid.F90:6
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine close_namelist(HPROGRAM, KLUNAM)
subroutine read_nam_gridtype(HPROGRAM, HGRID, KGRID_PAR, PGRID_PAR, KL)
subroutine posnam(KULNAM, HDNAML, OFOUND, KLUOUT)
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:6
subroutine pgd_grid(UG, U, HPROGRAM, HFILE, HFILETYPE, OGRID, HGRID, KGRID_PAR, PGRID_PAR)
Definition: pgd_grid.F90:6
subroutine open_namelist(HPROGRAM, KLUNAM, HFILE)
subroutine default_grid(HPROGRAM, HGRID)
Definition: default_grid.F90:6