SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
get_mesh_index_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 get_mesh_index_ign(KGRID_PAR,KSSO,PGRID_PAR,PLAT,PLON,&
7  kindex,kissox,kissoy,pvalue,pnodata)
8 ! ###############################################################
9 !
10 !!**** *GET_MESH_INDEX_IGN* get the grid mesh where point (lat,lon) is located
11 !!
12 !! PURPOSE
13 !! -------
14 !!
15 !! AUTHOR
16 !! ------
17 !!
18 !! E. Martin Meteo-France
19 !!
20 !! MODIFICATION
21 !! ------------
22 !!
23 !! Original 10/2007
24 !!
25 !----------------------------------------------------------------------------
26 !
27 !* 0. DECLARATION
28 ! -----------
29 !
30 USE modd_get_mesh_index_ign, ONLY : xxlim, xylim, xx_min, xx_max, xy_min, &
31  xy_max, xdx, xdy, xxlims, nxids, xdx_max,&
32  nfracd
34 !
36 !
37 !
38 USE yomhook ,ONLY : lhook, dr_hook
39 USE parkind1 ,ONLY : jprb
40 !
41 IMPLICIT NONE
42 !
43 !* 0.1 Declaration of arguments
44 ! ------------------------
45 !
46 INTEGER, INTENT(IN) :: kgrid_par ! size of PGRID_PAR
47 INTEGER, INTENT(IN) :: ksso ! number of subgrid mesh in each direction
48 REAL, DIMENSION(:), INTENT(IN) :: pgrid_par ! grid parameters
49 REAL, DIMENSION(:), INTENT(IN) :: plat ! latitude of the point
50 REAL, DIMENSION(:), INTENT(IN) :: plon ! longitude of the point
51 INTEGER, DIMENSION(:,:), INTENT(OUT) :: kindex ! index of the grid mesh where the point is
52 INTEGER, DIMENSION(:,:), INTENT(OUT) :: kissox ! X index of the subgrid mesh
53 INTEGER, DIMENSION(:,:), INTENT(OUT) :: kissoy ! Y index of the subgrid mesh
54 !
55 REAL, DIMENSION(:), OPTIONAL, INTENT(IN) :: pvalue ! value of the point to add
56 REAL, OPTIONAL, INTENT(IN) :: pnodata
57 !
58 !* 0.2 Declaration of other local variables
59 ! ------------------------------------
60 !
61 INTEGER :: ilambert ! Lambert type
62 !
63 REAL, DIMENSION(:), ALLOCATABLE :: zx ! X Lambert coordinate
64 REAL, DIMENSION(:), ALLOCATABLE :: zy ! Y Lambert coordinate
65 !
66 REAL, DIMENSION(:), ALLOCATABLE :: zxlim ! X Lambert coordinate
67 !
68 REAL, DIMENSION(SIZE(PLAT)) :: zvalue
69 !
70 LOGICAL, DIMENSION(SIZE(PLAT)) :: gmask
71 !
72 REAL :: zvalx
73 !
74 REAL :: znodata
75 !
76 INTEGER :: isize, ifact
77 INTEGER :: il, icpt ! Grid dimension
78 INTEGER :: jl ! loop counter in lambert grid
79 INTEGER :: ji, jj ! loop counter on input points
80 INTEGER, DIMENSION(SIZE(PLAT),2) :: ici
81 INTEGER, DIMENSION(1) :: idx0
82 REAL(KIND=JPRB) :: zhook_handle
83 !----------------------------------------------------------------------------
84 !
85 IF (lhook) CALL dr_hook('GET_MESH_INDEX_IGN_1',0,zhook_handle)
86 !
87 IF (present(pvalue) .AND. present(pnodata)) THEN
88  zvalue(:) = pvalue(:)
89  znodata = pnodata
90 ELSE
91  zvalue(:) = 1
92  znodata = 0
93 ENDIF
94 !
95 IF (.NOT. ALLOCATED(xxlim)) THEN
96 !
97 !* 1. Uncode parameters of the grid
98 ! -----------------------------
99 !
100  CALL get_gridtype_ign(pgrid_par,klambert=ilambert,kl=il)
101 !
102  ifact = floor(sqrt(float(il)))
103  isize = floor(float(il) / ifact)
104  ALLOCATE(nfracd(ifact+1))
105  nfracd(1) = 1
106  nfracd(ifact+1) = il
107  DO jj=2,ifact
108  nfracd(jj) = 1 + (jj-1)*isize
109  ENDDO
110 !
111  ALLOCATE(zx(il))
112  ALLOCATE(zy(il))
113  ALLOCATE(xdx(il))
114  ALLOCATE(xdy(il))
115  ALLOCATE(xxlim(il))
116  ALLOCATE(xylim(il))
117 
118  ALLOCATE(xxlims(0:il))
119  ALLOCATE(nxids(il))
120 
121  ALLOCATE(zxlim(il))
122 !
123  CALL get_gridtype_ign(pgrid_par,px=zx,py=zy,pdx=xdx,pdy=xdy)
124 !
125 !* 2. Limits of grid meshes in x and y
126 ! --------------------------------
127 !
128  xxlim(:)=zx(:)-xdx(:)/2.
129  xylim(:)=zy(:)-xdy(:)/2.
130 !
131  xx_min = minval(xxlim)
132  xx_max = maxval(xxlim+xdx)
133  xy_min = minval(xylim)
134  xy_max = maxval(xylim+xdy)
135 
136  xdx_max = minval(xdx)
137 
138  zxlim(:) = xxlim(:)
139 
140  zvalx = maxval(zxlim) + 1.
141  DO ji=1,il
142  idx0 = minloc(zxlim)
143  xxlims(ji) = zxlim(idx0(1))
144  nxids(ji) = idx0(1)
145  zxlim(idx0(1)) = zvalx
146  ENDDO
147  xxlims(0) = xxlims(1) - xdx_max -1.
148 
149  DEALLOCATE(zxlim)
150  DEALLOCATE(zx )
151  DEALLOCATE(zy )
152  !
153 ENDIF
154 IF (lhook) CALL dr_hook('GET_MESH_INDEX_IGN_1',1,zhook_handle)
155 IF (lhook) CALL dr_hook('GET_MESH_INDEX_IGN_2',0,zhook_handle)
156 !
157 !* 3. Projection
158 ! ----------
159 !
160 ALLOCATE(zx(SIZE(plat)))
161 ALLOCATE(zy(SIZE(plat)))
162 !
163  CALL get_gridtype_ign(pgrid_par,klambert=ilambert)
164 !
165 ! write (*,*),'APPEL XY_IGN'
166  CALL xy_ign(ilambert,zx,zy,plat,plon)
167 ! write(*,*) ' X Y SORTIE : ', ZX(1),ZY(1)
168 !
169 gmask(:) = .false.
170 DO jl=1,SIZE(plat)
171  IF ( zx(jl)<xx_min .OR. zx(jl)>xx_max &
172  .OR. zy(jl)<xy_min .OR. zy(jl)>xy_max ) gmask(jl) = .true.
173 ENDDO
174 !
175 !* 5. Localisation of the data points on (x,y) grid
176 ! ---------------------------------------------
177 !
178 IF (lhook) CALL dr_hook('GET_MESH_INDEX_IGN_2',1,zhook_handle)
179 IF (lhook) CALL dr_hook('GET_MESH_INDEX_IGN_3',0,zhook_handle)
180 !
181 ifact = SIZE(nfracd) - 1
182 !
183 kindex(:,:)=0
184 !
185 kissox(:,:) = 0
186 kissoy(:,:) = 0
187 !
188 ici(:,:) = 0
189 !$OMP PARALLEL DO PRIVATE(JL,JI,JJ)
190 DO jl=1,SIZE(plat)
191  !
192  IF (zvalue(jl)==znodata) cycle
193  IF (gmask(jl)) cycle
194  !
195  frac: &
196  DO jj=ifact,1,-1
197  !
198  IF (zx(jl)>xxlims(nfracd(jj))) THEN
199  !
200  DO ji = nfracd(jj+1),nfracd(jj),-1
201  IF (zx(jl)>xxlims(ji)) THEN
202  ici(jl,2) = ji
203  EXIT
204  ENDIF
205  ENDDO
206  !
207  DO ji = ici(jl,2),0,-1
208  IF (zx(jl)>=xxlims(ji)+xdx_max) THEN
209  ici(jl,1) = ji+1
210  EXIT
211  ENDIF
212  ENDDO
213  !
214  EXIT frac
215  !
216  ENDIF
217  !
218  ENDDO frac
219  !
220 ENDDO
221 !$OMP END PARALLEL DO
222 !
223 IF (lhook) CALL dr_hook('GET_MESH_INDEX_IGN_3',1,zhook_handle)
224 IF (lhook) CALL dr_hook('GET_MESH_INDEX_IGN_4',0,zhook_handle)
225 !
226 DO jl=1,SIZE(plat)
227  !
228  IF (zvalue(jl)==znodata) cycle
229  IF (gmask(jl)) cycle
230  !
231  icpt = 0
232  DO ji=ici(jl,1),ici(jl,2)
233  !
234  IF (zy(jl)>xylim(nxids(ji)) .AND. zy(jl)<xylim(nxids(ji))+xdy(nxids(ji)) &
235  .AND. zx(jl)<xxlims(ji)+xdx(nxids(ji))) THEN
236  !
237  icpt = icpt + 1
238  !
239  kindex(icpt,jl) = nxids(ji)
240  !
241  IF (ksso/=0) THEN
242  kissox(icpt,jl) = 1 + int( float(ksso) * (zx(jl)-xxlim(nxids(ji)))/xdx(nxids(ji)) )
243  kissoy(icpt,jl) = 1 + int( float(ksso) * (zy(jl)-xylim(nxids(ji)))/xdy(nxids(ji)) )
244  ENDIF
245  !
246  IF (icpt==novmx) EXIT
247  !
248  ENDIF
249  !
250  ENDDO
251  !
252 ENDDO
253 !
254 IF (lhook) CALL dr_hook('GET_MESH_INDEX_IGN_4',1,zhook_handle)
255 !-------------------------------------------------------------------------------
256 DEALLOCATE(zx )
257 DEALLOCATE(zy )
258 !-------------------------------------------------------------------------------
259 !
260 END SUBROUTINE get_mesh_index_ign
subroutine xy_ign(KLAMBERT, PX, PY, PLAT, PLON)
subroutine get_mesh_index_ign(KGRID_PAR, KSSO, PGRID_PAR, PLAT, PLON, KINDEX, KISSOX, KISSOY, PVALUE, PNODATA)
subroutine get_gridtype_ign(PGRID_PAR, KLAMBERT, KL, PX, PY, PDX, PDY, KDIMX, KDIMY, PXALL, PYALL)