SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
get_grid_coord.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 get_grid_coord (UG, U, &
7  kluout,px,py,kl,hgrid,pgrid_par)
8 ! #######################################
9 !!
10 !! PURPOSE
11 !! -------
12 !! Gets the coordinates of all points in the natural system of each projection
13 !!
14 !! METHOD
15 !! ------
16 !!
17 !! EXTERNAL
18 !! --------
19 !!
20 !!
21 !! IMPLICIT ARGUMENTS
22 !! ------------------
23 !!
24 !!
25 !! REFERENCE
26 !! ---------
27 !!
28 !! AUTHOR
29 !! ------
30 !!
31 !! V. Masson Meteo-France
32 !!
33 !! MODIFICATION
34 !! ------------
35 !!
36 !! Original 01/2004
37 !! 10/2007 E. Martin IGN Grid
38 !! 10/2014 P. Samuelsson SMHI Rotated lonlat
39 !----------------------------------------------------------------------------
40 !
41 !* 0. DECLARATION
42 ! -----------
43 !
44 !
45 !
46 !
48 USE modd_surf_atm_n, ONLY : surf_atm_t
49 !
50 USE yomhook ,ONLY : lhook, dr_hook
51 USE parkind1 ,ONLY : jprb
52 !
53 USE modi_abor1_sfx
54 !
55 USE modi_get_grid_coord_cartesian
56 !
57 USE modi_get_grid_coord_conf_proj
58 !
59 USE modi_get_grid_coord_gauss
60 !
61 USE modi_get_grid_coord_ign
62 !
63 USE modi_get_grid_coord_lonlat_reg
64 !
65 USE modi_get_grid_coord_lonlatval
66 !
67 USE modi_get_grid_coord_lonlat_rot
68 IMPLICIT NONE
69 !
70 !* 0.1 Declaration of dummy arguments
71 ! ------------------------------
72 !
73 !
74 TYPE(surf_atm_grid_t), INTENT(INOUT) :: ug
75 TYPE(surf_atm_t), INTENT(INOUT) :: u
76 !
77 INTEGER, INTENT(IN) :: kluout ! output listing logical unit
78 REAL, DIMENSION(:), OPTIONAL, INTENT(OUT) :: px ! X natural coordinate in the projection
79 REAL, DIMENSION(:), OPTIONAL, INTENT(OUT) :: py ! X natural coordinate in the projection
80 INTEGER, OPTIONAL, INTENT(IN) :: kl ! number of points
81  CHARACTER(LEN=10), OPTIONAL, INTENT(IN) :: hgrid ! grid type
82 REAL, DIMENSION(:), OPTIONAL, POINTER :: pgrid_par ! parameters defining this grid
83 !
84 !
85 !* 0.2 Declaration of local variables
86 ! ------------------------------
87 !
88 REAL, DIMENSION(:), ALLOCATABLE :: zx
89 REAL, DIMENSION(:), ALLOCATABLE :: zy
90 !
91  CHARACTER(LEN=10) :: ygrid
92 REAL, DIMENSION(:), ALLOCATABLE :: zgrid_par
93 INTEGER :: igrid_par
94 INTEGER :: il
95 REAL(KIND=JPRB) :: zhook_handle
96 !------------------------------------------------------------------------------
97 !
98 IF (lhook) CALL dr_hook('GET_GRID_COORD',0,zhook_handle)
99 IF (present(hgrid)) THEN
100  ygrid = hgrid
101  igrid_par = SIZE(pgrid_par)
102  il = kl
103  ALLOCATE(zgrid_par(igrid_par))
104  zgrid_par = pgrid_par
105 ELSE
106  ygrid = ug%CGRID
107  igrid_par = ug%NGRID_PAR
108  il = u%NSIZE_FULL
109  ALLOCATE(zgrid_par(igrid_par))
110  zgrid_par = ug%XGRID_PAR
111 END IF
112 !
113 ALLOCATE(zx(il))
114 ALLOCATE(zy(il))
115 !
116 !
117 SELECT CASE (ygrid)
118 !
119 !* 1. Conformal projection grid
120 ! -------------------------
121 !
122  CASE ('CONF PROJ ')
123  CALL get_grid_coord_conf_proj(igrid_par,il,zgrid_par,zx,zy)
124  ! note that all points of the grid will be kept, whatever the surface
125  ! type under consideration (e.g. sea points will be kept even for
126  ! initialization of continents)
127  !
128 !
129 !* 2. Regular latlon grid
130 ! -------------------
131 !
132  CASE ('LONLAT REG')
133  CALL get_grid_coord_lonlat_reg(igrid_par,il,zgrid_par,zx,zy)
134 
135 !
136 !* 3. Cartesian grid
137 ! --------------
138 !
139  CASE ('CARTESIAN ')
140  CALL get_grid_coord_cartesian(igrid_par,il,zgrid_par,zx,zy)
141  ! note that all points of the grid will be kept, whatever the surface
142  ! type under consideration (e.g. sea points will be kept even for
143  ! initialization of continents)
144  !
145 !
146 !* 4. Gaussian grid
147 ! -------------
148 !
149  CASE ('GAUSS ')
150  CALL get_grid_coord_gauss(igrid_par,il,zgrid_par,zx,zy)
151 !
152 !* 5. IGN grid
153 ! -------------
154 !
155  CASE ('IGN ')
156  CALL get_grid_coord_ign(igrid_par,il,zgrid_par,zx,zy)
157 
158 !
159 !* 6. lonlatval
160 ! -------------
161 !
162  CASE ('LONLATVAL ')
163  CALL get_grid_coord_lonlatval(igrid_par,il,zgrid_par,zx,zy)
164 
165 !
166 !* 7. Rotated lonlat grid
167 ! -------------------
168 !
169  CASE ('LONLAT ROT')
170  CALL get_grid_coord_lonlat_rot(igrid_par,il,zgrid_par,zx,zy)
171 
172 !
173 !* 8. Other cases
174 ! -----------
175 !
176  CASE default
177  CALL abor1_sfx('GET_GRID_COORD: GRID TYPE '//ygrid//' NOT SUPPORTED')
178 
179 END SELECT
180 !
181 IF(present(px)) px(:)=zx(:)
182 IF(present(py)) py(:)=zy(:)
183 !
184 DEALLOCATE(zx)
185 DEALLOCATE(zy)
186 DEALLOCATE(zgrid_par)
187 IF (lhook) CALL dr_hook('GET_GRID_COORD',1,zhook_handle)
188 !-------------------------------------------------------------------------------
189 !
190 END SUBROUTINE get_grid_coord
subroutine get_grid_coord_lonlat_rot(KGRID_PAR, KL, PGRID_PAR, PX, PY)
subroutine get_grid_coord(UG, U, KLUOUT, PX, PY, KL, HGRID, PGRID_PAR)
subroutine get_grid_coord_lonlatval(KGRID_PAR, KL, PGRID_PAR, PX, PY)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine get_grid_coord_conf_proj(KGRID_PAR, KL, PGRID_PAR, PX, PY)
subroutine get_grid_coord_cartesian(KGRID_PAR, KL, PGRID_PAR, PX, PY)
subroutine get_grid_coord_gauss(KGRID_PAR, KL, PGRID_PAR, PLON_XY, PLAT_XY)
subroutine get_grid_coord_ign(KGRID_PAR, KL, PGRID_PAR, PX, PY)
subroutine get_grid_coord_lonlat_reg(KGRID_PAR, KL, PGRID_PAR, PX, PY)