SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
get_mesh_index_lonlat_reg.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_mesh_index_lonlat_reg(KGRID_PAR,KSSO,PGRID_PAR,PLAT,PLON,&
7  kindex,kissox,kissoy,pvalue,pnodata)
8 ! ###############################################################
9 !
10 !!**** *GET_MESH_INDEX_LONLAT_REG* get the grid mesh where point (lat,lon) is located
11 !!
12 !! PURPOSE
13 !! -------
14 !!
15 !! AUTHOR
16 !! ------
17 !!
18 !! V. Masson Meteo-France
19 !!
20 !! MODIFICATION
21 !! ------------
22 !!
23 !! Original 12/09/95
24 !!
25 !----------------------------------------------------------------------------
26 !
27 !* 0. DECLARATION
28 ! -----------
29 !
30 USE modd_get_mesh_index_lonlat_reg, ONLY : xlonlim, xlatlim, nlat, nlon, xlon0
32 !
33 !
34 USE yomhook ,ONLY : lhook, dr_hook
35 USE parkind1 ,ONLY : jprb
36 !
37 IMPLICIT NONE
38 !
39 !* 0.1 Declaration of arguments
40 ! ------------------------
41 !
42 INTEGER, INTENT(IN) :: kgrid_par ! size of PGRID_PAR
43 INTEGER, INTENT(IN) :: ksso ! number of subgrid mesh in each direction
44 REAL, DIMENSION(:), INTENT(IN) :: pgrid_par ! grid parameters
45 REAL, DIMENSION(:), INTENT(IN) :: plat ! latitude of the point
46 REAL, DIMENSION(:), INTENT(IN) :: plon ! longitude of the point
47 INTEGER, DIMENSION(:,:), INTENT(OUT) :: kindex ! index of the grid mesh where the point is
48 INTEGER, DIMENSION(:,:), INTENT(OUT) :: kissox ! X index of the subgrid mesh
49 INTEGER, DIMENSION(:,:), INTENT(OUT) :: kissoy ! Y index of the subgrid mesh
50 !
51 REAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: pvalue ! value of the point to add
52 REAL, OPTIONAL, INTENT(IN) :: pnodata
53 !
54 !* 0.2 Declaration of other local variables
55 ! ------------------------------------
56 !
57 INTEGER :: ji ! loop counter in x
58 INTEGER :: jj ! loop counter in y
59 INTEGER :: jl ! loop counter on input points
60 !
61 REAL :: zlonmin ! minimum longitude (degrees)
62 REAL :: zlonmax ! maximum longitude (degrees)
63 REAL :: zlatmin ! minimum latitude (degrees)
64 REAL :: zlatmax ! maximum latitude (degrees)
65 REAL :: zdlon ! longitude grid size
66 REAL :: zdlat ! latitude grid size
67 !
68 REAL :: znodata
69 !
70 REAL, DIMENSION(SIZE(PLAT)) :: zvalue
71 !
72 REAL, DIMENSION(SIZE(PLON)) :: zlon
73 !
74 INTEGER, DIMENSION(SIZE(PLAT)) :: ici, icj
75 !
76 REAL(KIND=JPRB) :: zhook_handle
77 !
78 !----------------------------------------------------------------------------
79 !
80 IF (lhook) CALL dr_hook('GET_MESH_INDEX_LONLAT_REG_1',0,zhook_handle)
81 !
82 IF (present(pvalue) .AND. present(pnodata)) THEN
83  zvalue(:) = pvalue(:)
84  znodata = pnodata
85 ELSE
86  zvalue(:) = 1
87  znodata = 0
88 ENDIF
89 !
90 IF (.NOT. ALLOCATED(xlatlim)) THEN
91 !
92 !* 1. Uncode parameters of the grid
93 ! -----------------------------
94 !
95  CALL get_gridtype_lonlat_reg(pgrid_par,zlonmin,zlonmax, &
96  zlatmin,zlatmax,nlon,nlat )
97 !
98 !----------------------------------------------------------------------------
99 !
100 !* 2. Limits of grid meshes
101 ! ---------------------
102 !
103  zdlon = (zlonmax-zlonmin) / float(nlon)
104  zdlat = (zlatmax-zlatmin) / float(nlat)
105 !
106  ALLOCATE(xlonlim(nlon+1))
107  DO ji=1,nlon+1
108  xlonlim(ji) = zlonmin + float(ji-1)*zdlon
109  END DO
110 
111  ALLOCATE(xlatlim(nlat+1))
112  DO ji=1,nlat+1
113  xlatlim(ji) = zlatmin + float(ji-1)*zdlat
114  END DO
115 !
116  xlon0 = 0.5*(zlonmin+zlonmax)
117 !
118 END IF
119 IF (lhook) CALL dr_hook('GET_MESH_INDEX_LONLAT_REG_1',1,zhook_handle)
120 IF (lhook) CALL dr_hook('GET_MESH_INDEX_LONLAT_REG_2',0,zhook_handle)
121 !----------------------------------------------------------------------------
122 !
123 !* 3. Reshifts the longitudes with respect to projection reference point
124 ! ------------------------------------------------------------------
125 !
126 !
127 zlon(:) = plon(:)+nint((xlon0-plon(:))/360.)*360.
128 !
129 !----------------------------------------------------------------------------
130 !
131 !* 4. Localisation of the data points on (x,y) grid
132 ! ---------------------------------------------
133 !
134 IF (SIZE(plat)/=nlon*nlat) THEN
135  kindex = 0
136  kissox = 0
137  kissoy = 0
138 END IF
139 !
140 IF (lhook) CALL dr_hook('GET_MESH_INDEX_LONLAT_REG_2',1,zhook_handle)
141 IF (lhook) CALL dr_hook('GET_MESH_INDEX_LONLAT_REG_3',0,zhook_handle)
142 !
143 ici(:) = 0
144 icj(:) = 0
145 !$OMP PARALLEL DO PRIVATE(JL,JJ)
146 DO jl=1,SIZE(plat)
147  !
148  IF (zvalue(jl)==znodata) cycle
149  !
150  DO jj=SIZE(xlonlim),1,-1
151  IF (xlonlim(jj)<=zlon(jl)) THEN
152  ici(jl) = jj
153  EXIT
154  ENDIF
155  ENDDO
156  DO jj=SIZE(xlatlim),1,-1
157  IF (xlatlim(jj)<=plat(jl)) THEN
158  icj(jl) = jj
159  EXIT
160  ENDIF
161  ENDDO
162  !
163 ENDDO
164 !$OMP END PARALLEL DO
165 !
166 IF (lhook) CALL dr_hook('GET_MESH_INDEX_LONLAT_REG_3',1,zhook_handle)
167 IF (lhook) CALL dr_hook('GET_MESH_INDEX_LONLAT_REG_4',0,zhook_handle)
168 !
169 kindex(:,:) = 0
170 
171 DO jl=1,SIZE(plat)
172  !
173  IF (zvalue(jl)==znodata) cycle
174  !
175  IF ( zlon(jl)<xlonlim(1) .OR. zlon(jl)>=xlonlim(nlon+1) &
176  .OR. plat(jl)<xlatlim(1) .OR. plat(jl)>=xlatlim(nlat+1) ) THEN
177 
178  IF (ksso/=0) THEN
179  kissox(1,jl) = 0
180  kissoy(1,jl) = 0
181  END IF
182  cycle
183 
184  END IF
185 
186  ji = ici(jl)
187  jj = icj(jl)
188  kindex(1,jl) = (jj-1) * nlon + ji
189 !
190 !
191 !* 6. Localisation of the data points on in the subgrid of this mesh
192 ! --------------------------------------------------------------
193 !
194  IF (ksso/=0) THEN
195  kissox(1,jl) = 1 + int( float(ksso) * (zlon(jl)-xlonlim(ji))/(xlonlim(ji+1)-xlonlim(ji)) )
196  kissoy(1,jl) = 1 + int( float(ksso) * (plat(jl)-xlatlim(jj))/(xlatlim(jj+1)-xlatlim(jj)) )
197  END IF
198 END DO
199 IF (lhook) CALL dr_hook('GET_MESH_INDEX_LONLAT_REG_4',1,zhook_handle)
200 !
201 !-------------------------------------------------------------------------------
202 !
203 END SUBROUTINE get_mesh_index_lonlat_reg
subroutine get_gridtype_lonlat_reg(PGRID_PAR, PLONMIN, PLONMAX, PLATMIN, PLATMAX, KLON, KLAT, KL, PLON, PLAT)
subroutine get_mesh_index_lonlat_reg(KGRID_PAR, KSSO, PGRID_PAR, PLAT, PLON, KINDEX, KISSOX, KISSOY, PVALUE, PNODATA)