SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
get_xyall_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_xyall_ign(PX,PY,PDX,PDY,PXALL,PYALL,KDIMX,KDIMY)
7 ! ################################################################
8 !
9 !!**** *GET_XYALL_IGN*
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 !! S. Faroux *Meteo France*
31 !!
32 !! MODIFICATIONS
33 !! -------------
34 !! Original 07/2011
35 !-------------------------------------------------------------------------------
36 !
37 USE yomhook ,ONLY : lhook, dr_hook
38 USE parkind1 ,ONLY : jprb
39 !
40 IMPLICIT NONE
41 !
42 !* 0.1 Declarations of arguments
43 ! -------------------------
44 !
45 REAL, DIMENSION(:), INTENT(IN) :: px
46 REAL, DIMENSION(:), INTENT(IN) :: py
47 REAL, DIMENSION(:), INTENT(IN) :: pdx
48 REAL, DIMENSION(:), INTENT(IN) :: pdy
49 REAL, DIMENSION(:), INTENT(OUT) :: pxall
50 REAL, DIMENSION(:), INTENT(OUT) :: pyall
51 INTEGER, INTENT(OUT) :: kdimx
52 INTEGER, INTENT(OUT) :: kdimy
53 !
54 !* 0.2 Declarations of local variables
55 ! -------------------------------
56 !
57 REAL, DIMENSION(MAX(SIZE(PXALL),SIZE(PYALL))*3) :: zall
58 REAL(KIND=JPRB) :: zhook_handle
59 !
60 !----------------------------------------------------------------------------
61 !
62 IF (lhook) CALL dr_hook('GET_XYALL_IGN',0,zhook_handle)
63 !
64 kdimx = 0
65 kdimy = 0
66 !
67  CALL get_coord(px,pdx,zall,kdimx)
68 !sort values from lower to grower
69  CALL sort(kdimx,zall,pxall)
70 !
71  CALL get_coord(py,pdy,zall,kdimy)
72 !sort values from lower to grower
73  CALL sort(kdimy,zall,pyall)
74 !
75 IF (lhook) CALL dr_hook('GET_XYALL_IGN',1,zhook_handle)
76 !-------------------------------------------------------------------------------
77  CONTAINS
78 !
79 SUBROUTINE get_coord(PIN,PDIN,POUT,KSIZE)
80 !
81 IMPLICIT NONE
82 !
83 REAL, DIMENSION(:), INTENT(IN) :: pin
84 REAL, DIMENSION(:), INTENT(IN) :: pdin
85 REAL, DIMENSION(:), INTENT(OUT) :: pout
86 INTEGER, INTENT(INOUT) :: ksize
87 REAL, DIMENSION(SIZE(POUT)) :: zdout
88 INTEGER :: i, j
89 REAL(KIND=JPRB) :: zhook_handle
90 !
91 IF (lhook) CALL dr_hook('GET_XYALL_IGN:GET_COORD',0,zhook_handle)
92 !
93 zdout(:) = 0.
94 pout(:) = -9999.
95 IF (SIZE(pout)>0) THEN
96  zdout(1) = pdin(1)/2.
97  pout(1) = pin(1)
98  IF (SIZE(pout)>1) pout(2) = pin(1)-pdin(1)
99  IF (SIZE(pout)>2) pout(3) = pin(1)+pdin(1)
100 ENDIF
101 ksize = min(3,SIZE(pin))
102 !
103 DO i=1,SIZE(pin)
104  !point
105  DO j=1,ksize
106  IF ( pout(j) == pin(i) ) EXIT
107  IF ( j == ksize ) THEN
108  ksize = ksize + 1
109  pout(ksize) = pin(i)
110  zdout(ksize) = pdin(i)/2.
111  ENDIF
112  ENDDO
113  !limits of the mesh
114  DO j=1,ksize
115  IF ( pout(j)<pin(i) .AND. pout(j)+zdout(j)>=pin(i)-pdin(i) ) EXIT
116  IF ( j == ksize ) THEN
117  ksize = ksize + 1
118  pout(ksize) = pin(i)-pdin(i)
119  ENDIF
120  ENDDO
121  DO j=1,ksize
122  IF ( pout(j)>pin(i) .AND. pout(j)-zdout(j)<=pin(i)+pdin(i) ) EXIT
123  IF ( j == ksize ) THEN
124  ksize = ksize + 1
125  pout(ksize) = pin(i)+pdin(i)
126  ENDIF
127  ENDDO
128 ENDDO
129 !
130 IF (lhook) CALL dr_hook('GET_XYALL_IGN:GET_COORD',1,zhook_handle)
131 !
132 END SUBROUTINE get_coord
133 !
134 SUBROUTINE sort(KSIZE,PIN,POUT)
135 !
136 IMPLICIT NONE
137 !
138 INTEGER, INTENT(INOUT) :: ksize
139 REAL, DIMENSION(:), INTENT(INOUT) :: pin
140 REAL, DIMENSION(:), INTENT(OUT) :: pout
141 REAL, DIMENSION(SIZE(PIN)) :: zout
142 REAL :: zmin, zmax
143 INTEGER,DIMENSION(1) :: idmin
144 INTEGER :: j
145 REAL(KIND=JPRB) :: zhook_handle
146 !
147 IF (lhook) CALL dr_hook('GET_XYALL_IGN:SORT',0,zhook_handle)
148 !
149 zmax = maxval(pin(1:ksize))
150 DO j=1,ksize
151  zmin = minval(pin(1:ksize))
152  zout(j) = zmin
153  idmin = minloc(pin(1:ksize))
154  pin(idmin(1)) = zmax+1
155 ENDDO
156 !
157 !to suppress fictive points at boundaries
158 pout(1:ksize-2) = zout(2:ksize-1)
159 ksize = max(0,ksize-2)
160 !
161 IF (lhook) CALL dr_hook('GET_XYALL_IGN:SORT',1,zhook_handle)
162 !
163 END SUBROUTINE sort
164 !
165 END SUBROUTINE get_xyall_ign
subroutine get_xyall_ign(PX, PY, PDX, PDY, PXALL, PYALL, KDIMX, KDIMY)
subroutine sort(KSIZE, PIN, POUT)
subroutine get_coord(PIN, PDIN, POUT, KSIZE)