SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
get_adj_mes_lonlatval.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_adj_mes_lonlatval(KGRID_PAR,KL,PGRID_PAR,KLEFT,KRIGHT,KTOP,KBOTTOM)
7 ! ##############################################################
8 !
9 !!**** *GET_ADJ_MES_LONLATVAL* get the near grid mesh indices
10 !!
11 !! PURPOSE
12 !! -------
13 !!
14 !! METHOD
15 !! ------
16 !!
17 !! REFERENCE
18 !! ---------
19 !!
20 !! AUTHOR
21 !! ------
22 !!
23 !! V. Masson Meteo-France
24 !!
25 !! MODIFICATION
26 !! ------------
27 !!
28 !! Original 03/2004
29 !!
30 !----------------------------------------------------------------------------
31 !
32 !* 0. DECLARATION
33 ! -----------
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) :: kl ! number of points
48 REAL, DIMENSION(KGRID_PAR), INTENT(IN) :: pgrid_par ! grid parameters
49 INTEGER, DIMENSION(KL), INTENT(OUT) :: kleft ! left mesh index
50 INTEGER, DIMENSION(KL), INTENT(OUT) :: kright ! right mesh index
51 INTEGER, DIMENSION(KL), INTENT(OUT) :: ktop ! top mesh index
52 INTEGER, DIMENSION(KL), INTENT(OUT) :: kbottom ! bottom mesh index
53 !
54 !* 0.2 Declaration of other local variables
55 ! ------------------------------------
56 !
57 REAL,DIMENSION(KL) :: zx
58 REAL,DIMENSION(KL) :: zy
59 REAL,DIMENSION(KL) :: zdx
60 REAL,DIMENSION(KL) :: zdy
61 REAL :: zecx, zecy, zecdx, zecdy
62 INTEGER :: jlat, jlon
63 INTEGER :: il
64 REAL(KIND=JPRB) :: zhook_handle
65 !
66 !----------------------------------------------------------------------------
67 !
68 IF (lhook) CALL dr_hook('GET_ADJ_MES_LONLATVAL',0,zhook_handle)
69 !
70  CALL get_gridtype_lonlatval(pgrid_par,il,zx,zy,zdx,zdy)
71 !
72 kleft(:) = 0
73 kright(:) = 0
74 ktop(:) = 0
75 kbottom(:) = 0
76 !
77 DO jlat=1,kl
78  !
79  DO jlon=1,kl
80  !
81  zecx = abs(zx(jlon)-zx(jlat))
82  zecy = abs(zy(jlon)-zy(jlat))
83  !
84  zecdx = (zdx(jlon)+zdx(jlat))/2.
85  zecdy = (zdy(jlon)+zdy(jlat))/2.
86  !
87  IF ( zecx <= zecdx .AND. zecy <= zecdy ) THEN ! points overlap or are next to each other in x and y directions
88  !
89  IF ( zecdy-zecy <= zecdx-zecx .AND. zecx/=zecdx ) THEN ! overlap smaller in y than in x
90  !
91  IF ( zy(jlon) < zy(jlat) .AND. & ! Y under X in y direction
92  ( kbottom(jlat)==0 .OR. & ! bottom not assigned yet
93  zecy < abs(zy(max(1,kbottom(jlat)))-zy(jlat)) .OR. & ! this y point is closer to x in y direction
94  zecx < abs(zx(max(1,kbottom(jlat)))-zx(jlat)) ) ) THEN ! this y point is closer to x in x direction
95  !
96  kbottom(jlat) = jlon
97  !
98  ELSEIF ( zy(jlon) > zy(jlat) .AND. & ! Y above X in y direction
99  ( ktop(jlat)==0 .OR. & ! top not assigned yet
100  zecy < abs(zy(max(1,ktop(jlat)))-zy(jlat)) .OR. & ! this y point is closer to x in y direction
101  zecx < abs(zx(max(1,ktop(jlat)))-zx(jlat)) ) ) THEN ! this y point is closer to x in x direction
102  !
103  ktop(jlat) = jlon
104  !
105  ENDIF
106  !
107  ELSEIF (zecdx-zecx < zecdy-zecy ) THEN ! overlap smaller in x than in y
108  !
109  IF ( zx(jlon) < zx(jlat) .AND. & ! Y left X in x direction
110  ( kleft(jlat)==0 .OR. & ! left not assigned yet
111  zecy < abs(zy(max(1,kleft(jlat)))-zy(jlat)) .OR. & ! this y point is closer to x in y direction
112  zecx < abs(zx(max(1,kleft(jlat)))-zx(jlat)) ) ) THEN ! this y point is closer to x in x direction
113  !
114  kleft(jlat)=jlon
115  !
116  ELSEIF ( zx(jlon) > zx(jlat) .AND. & ! Y right X in x direction
117  ( kright(jlat)==0 .OR. & ! right not assigned yet
118  zecy < abs(zy(max(1,kright(jlat)))-zy(jlat)) .OR. & ! this y point is closer to x in y direction
119  zecx < abs(zx(max(1,kright(jlat)))-zx(jlat)) ) ) THEN ! this y point is closer to x in x direction
120  !
121  kright(jlat)=jlon
122  !
123  ENDIF
124  !
125  ENDIF
126  !
127  ENDIF
128  !
129  ENDDO
130  !
131 ENDDO
132 !
133 IF (lhook) CALL dr_hook('GET_ADJ_MES_LONLATVAL',1,zhook_handle)
134 !
135 !-------------------------------------------------------------------------------
136 !
137 END SUBROUTINE get_adj_mes_lonlatval
subroutine get_gridtype_lonlatval(PGRID_PAR, KL, PX, PY, PDX, PDY)
subroutine get_adj_mes_lonlatval(KGRID_PAR, KL, PGRID_PAR, KLEFT, KRIGHT, KTOP, KBOTTOM)