SURFEX v8.1
General documentation of Surfex
read_nam_grid_ign.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 read_nam_grid_ign(PGRID_FULL_PAR,KDIM_FULL,HPROGRAM,KGRID_PAR,KL,PGRID_PAR,HDIR)
7 ! ################################################################
8 !
9 !!**** *READ_NAM_GRID_IGN* - routine to read in namelist the horizontal grid
10 !!
11 !! PURPOSE
12 !! -------
13 !!
14 !!** METHOD
15 !! ------
16 !!
17 !! EXTERNAL
18 !! --------
19 !!
20 !!
21 !! IMPLICIT ARGUMENTS
22 !! ------------------
23 !!
24 !! REFERENCE
25 !! ---------
26 !!
27 !!
28 !! AUTHOR
29 !! ------
30 !! E. Martin *Meteo France*
31 !!
32 !! MODIFICATIONS
33 !! -------------
34 !! Original 10/2007
35 !! 07/2011 add maximum domain dimension for output (B. Decharme)
36 !-------------------------------------------------------------------------------
37 !
38 !* 0. DECLARATIONS
39 ! ------------
40 !
41 USE modd_surfex_mpi, ONLY : nrank, nsize_task
42 !
43 USE modd_surf_par, ONLY : xundef
44 !
45 USE mode_pos_surf
46 !
47 USE modi_open_namelist
48 USE modi_close_namelist
49 USE modi_get_luout
51 !
53 USE modi_get_xyall_ign
54 !
56 !
57 USE yomhook ,ONLY : lhook, dr_hook
58 USE parkind1 ,ONLY : jprb
59 !
60 IMPLICIT NONE
61 !
62 !* 0.1 Declarations of arguments
63 ! -------------------------
64 !
65 REAL, DIMENSION(:), POINTER :: PGRID_FULL_PAR
66 INTEGER, INTENT(IN) :: KDIM_FULL
67 !
68  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! calling program
69 INTEGER, INTENT(INOUT) :: KGRID_PAR ! size of PGRID_PAR
70 INTEGER, INTENT(OUT) :: KL ! number of points
71 REAL, DIMENSION(KGRID_PAR), INTENT(OUT) :: PGRID_PAR ! parameters defining this grid
72  CHARACTER(LEN=1), INTENT(IN) :: HDIR
73 !
74 !* 0.2 Declarations of local variables
75 ! -------------------------------
76 !
77 INTEGER :: ILUOUT ! output listing logical unit
78 INTEGER :: ILUNAM ! namelist file logical unit
79 INTEGER :: ILAMBERT ! Lambert type
80 
81 REAL, DIMENSION(:), ALLOCATABLE :: ZX, ZX0 ! X conformal coordinate of grid mesh
82 REAL, DIMENSION(:), ALLOCATABLE :: ZY, ZY0 ! Y conformal coordinate of grid mesh
83 REAL, DIMENSION(:), ALLOCATABLE :: ZDX, ZDX0 ! X grid mesh size
84 REAL, DIMENSION(:), ALLOCATABLE :: ZDY, ZDY0 ! Y grid mesh size
85 !
86 !* 0.3 Declarations of namelist
87 ! ------------------------
88 !
89  CHARACTER(LEN=3) :: CLAMBERT ! Lambert type
90 INTEGER :: NPOINTS ! number of points
91 REAL, DIMENSION(1000000) :: XX ! X coordinate of grid mesh center (in meters)
92 REAL, DIMENSION(1000000) :: XY ! Y coordinate of grid mesh center (in meters)
93 REAL, DIMENSION(1000000) :: XDX ! X mesh size (in meters)
94 REAL, DIMENSION(1000000) :: XDY ! Y mesh size (in meters)
95 !
96 REAL :: XX_LLCORNER ! X coordinate of left side of the domain
97 REAL :: XY_LLCORNER ! Y coordinate of lower side of the domain
98 REAL :: XCELLSIZE ! size of the cell (equal in X and Y)
99 INTEGER :: NCOLS ! number of columns
100 INTEGER :: NROWS ! number of rows
101 !
102 REAL, DIMENSION(:), ALLOCATABLE :: ZXALL ! maximum domain X coordinate of grid mesh
103 REAL, DIMENSION(:), ALLOCATABLE :: ZYALL ! maximum domain Y coordinate of grid mesh
104 INTEGER :: IDIMX ! maximum domain length in X
105 INTEGER :: IDIMY ! maximum domain length in Y
106 !
107 REAL, DIMENSION(:), POINTER :: ZGRID_PAR
108 !
109 INTEGER :: JCOLS, JROWS, IINDEX ! loop counters
110 LOGICAL :: GFOUND
111 REAL(KIND=JPRB) :: ZHOOK_HANDLE
112 !
113 NAMELIST/nam_ign/clambert,npoints,xx,xy,xdx,xdy, &
114  xx_llcorner, xy_llcorner, xcellsize, &
115  ncols, nrows
116 !
117 !------------------------------------------------------------------------------
118 !
119 !* 1. opening of namelist
120 !
121 IF (lhook) CALL dr_hook('READ_NAM_GRID_IGN',0,zhook_handle)
122  CALL get_luout(hprogram,iluout)
123 !
124 IF (hdir/='H') THEN
125  !
126  CALL open_namelist(hprogram,ilunam)
127  !
128  xx_llcorner = xundef
129  xy_llcorner = xundef
130  xcellsize = xundef
131  ncols = 0
132  nrows = 0
133  !
134  !---------------------------------------------------------------------------
135  !
136  !* 2. Reading of projection parameters
137  ! --------------------------------
138  !
139  CALL posnam(ilunam,'NAM_IGN',gfound,iluout)
140  IF (gfound) READ(unit=ilunam,nml=nam_ign)
141  !
142  !---------------------------------------------------------------------------
143  CALL close_namelist(hprogram,ilunam)
144  !---------------------------------------------------------------------------
145  !
146  !* 3. Initialisation for a regular grid
147  ! ---------------------------------
148  !
149  IF (xcellsize/=xundef) THEN
150  !
151  WRITE(iluout,*) 'Initialisation of IGN Coordinates for a regular grid'
152  !
153  xdx(:) = xcellsize
154  xdy(:) = xcellsize
155  !
156  IF ( xx_llcorner/=xundef .AND. xy_llcorner/=xundef &
157  .AND. ncols>0 .AND. nrows>0 ) THEN
158  !
159  npoints = ncols * nrows
160  !
161  DO jrows=1,nrows
162  DO jcols=1,ncols
163  !
164  iindex = jcols + (jrows-1) * ncols
165  xx(iindex) = xx_llcorner + (jcols-0.5) * xcellsize
166  xy(iindex) = xy_llcorner + (jrows-0.5) * xcellsize
167  !
168  END DO
169  END DO
170  !
171  ENDIF
172  !
173  END IF
174  !
175  !---------------------------------------------------------------------------
176  !
177  !* 3. Number of points
178  ! ----------------
179  !
180  kl = npoints
181  !
182  !---------------------------------------------------------------------------
183  !
184  !* 3. Array of X and Y coordinates
185  ! ----------------------------
186  !
187  !
188  ALLOCATE(zx(kl))
189  ALLOCATE(zy(kl))
190  zx(:) = xx(:kl)
191  zy(:) = xy(:kl)
192  !
193  !---------------------------------------------------------------------------
194  !
195  !* 4. Array of X and Y increments
196  ! ---------------------------
197  !
198  ALLOCATE(zdx(kl))
199  ALLOCATE(zdy(kl))
200  zdx(:) = xdx(:kl)
201  zdy(:) = xdy(:kl)
202  !
203  !---------------------------------------------------------------------------
204  !
205  !* 5. Lambert type
206  ! ------------
207  !
208  CALL test_nam_var_surf(iluout,'CLAMBERT',clambert,'L1 ','L2 ','L3 ',&
209  'L4 ','L2E','L93' )
210  !
211  SELECT CASE (clambert)
212  CASE ('L1 ')
213  ilambert=1
214  CASE ('L2 ')
215  ilambert=2
216  CASE ('L3 ')
217  ilambert=3
218  CASE ('L4 ')
219  ilambert=4
220  CASE ('L2E')
221  ilambert=5
222  CASE ('L93')
223  ilambert=6
224  END SELECT
225  !
226  !---------------------------------------------------------------------------
227  !
228  !* 7. maximum domain lengths
229  ! ----------------------
230  !
231  ALLOCATE(zxall(kl*3))
232  ALLOCATE(zyall(kl*3))
233  CALL get_xyall_ign(zx,zy,zdx,zdy,zxall,zyall,idimx,idimy)
234  !
235  !---------------------------------------------------------------------------
236  !
237  !* 8. All this information stored into pointer PGRID_PAR
238  ! --------------------------------------------------
239  !
240  CALL put_gridtype_ign(zgrid_par,ilambert,zx,zy,zdx,zdy, &
241  idimx,idimy,zxall(1:idimx),zyall(1:idimy))
242  !
243 ELSE
244  !
245  ALLOCATE(zx0(kdim_full),zy0(kdim_full),zdx0(kdim_full),zdy0(kdim_full))
246  !
247  CALL get_gridtype_ign(pgrid_full_par,klambert=ilambert,&
248  px=zx0,py=zy0,pdx=zdx0,pdy=zdy0)
249  !
250  kl = nsize_task(nrank)
251  ALLOCATE(zx(kl),zy(kl),zdx(kl),zdy(kl))
252  ALLOCATE(zxall(kl*3),zyall(kl*3))
253  idimx=0
254  idimy=0
255  !
256  CALL read_and_send_mpi(zx0,zx)
257  CALL read_and_send_mpi(zy0,zy)
258  CALL read_and_send_mpi(zdx0,zdx)
259  CALL read_and_send_mpi(zdy0,zdy)
260  !
261  DEALLOCATE(zx0,zy0,zdx0,zdy0)
262  !
263  CALL put_gridtype_ign(zgrid_par,ilambert,zx,zy,zdx,zdy, &
264  idimx,idimy,zxall,zyall)
265  !
266 ENDIF
267 !
268 !---------------------------------------------------------------------------
269 DEALLOCATE(zx)
270 DEALLOCATE(zy)
271 DEALLOCATE(zdx)
272 DEALLOCATE(zdy)
273 DEALLOCATE(zxall)
274 DEALLOCATE(zyall)
275 !---------------------------------------------------------------------------
276 !
277 !* 1st call : initializes dimension
278 !
279 IF (kgrid_par==0) THEN
280  kgrid_par = SIZE(zgrid_par)
281 !
282 ELSE
283 !
284 !* 2nd call : initializes grid array
285 !
286  pgrid_par(:) = 0.
287  pgrid_par(:) = zgrid_par
288 END IF
289 !
290 DEALLOCATE(zgrid_par)
291 IF (lhook) CALL dr_hook('READ_NAM_GRID_IGN',1,zhook_handle)
292 !
293 !---------------------------------------------------------------------------
294 !
295 END SUBROUTINE read_nam_grid_ign
subroutine get_gridtype_ign(PGRID_PAR, KLAMBERT, KL, PX, PY, PDX, PDY, KDIMX, KDIMY, PXALL, PYALL)
subroutine read_nam_grid_ign(PGRID_FULL_PAR, KDIM_FULL, HPROGRAM, KGR
subroutine posnam(KULNAM, HDNAML, OFOUND, KLUOUT)
real, parameter xundef
subroutine get_xyall_ign(PX, PY, PDX, PDY, PXALL, PYALL, KDIMX, KDIMY)
integer, parameter jprb
Definition: parkind1.F90:32
subroutine close_namelist(HPROGRAM, KLUNAM)
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
integer, dimension(:), allocatable nsize_task
logical lhook
Definition: yomhook.F90:15
subroutine put_gridtype_ign(PGRID_PAR, KLAMBERT, PX, PY, PDX, PDY, KDIMX, KDIMY, PXALL, PYALL)
subroutine open_namelist(HPROGRAM, KLUNAM, HFILE)