SURFEX v8.1
General documentation of Surfex
mode_trip_function.F90
Go to the documentation of this file.
1 !########################
3 !########################
4 !
5 !!**** *MODE_TRIP_FUNCTION*
6 !!
7 !! PURPOSE
8 !! -------
9 !
10 ! The purpose of this routine is to store here all functions
11 ! used by MODE_TRIP_INIT.
12 !
13 !!
14 !!** IMPLICIT ARGUMENTS
15 !! ------------------
16 !! NONE
17 !!
18 !! REFERENCE
19 !! ---------
20 !!
21 !!
22 !! AUTHOR
23 !! ------
24 !! B. Decharme * Meteo France *
25 !!
26 !! MODIFICATIONS
27 !! -------------
28 !! Original 15/04/08
29 !--------------------------------------------------------------------------------
30 !
31 !* 0. DECLARATIONS
32 ! ------------
33 !
34 !
35 !-------------------------------------------------------------------------------
36 !
37 !
38 USE yomhook ,ONLY : lhook, dr_hook
39 USE parkind1 ,ONLY : jprb
40 !
41  CONTAINS
42 !-------------------------------------------------------------------------------
43 !
44 ! ###############################################
45  FUNCTION irnxtx(IX,NX,IRIV) RESULT(KNEXTX)
46 ! ###############################################
47 !
48 IMPLICIT NONE
49 !
50 INTEGER, INTENT(IN) :: IX,NX,IRIV
51 INTEGER :: KNEXTX
52 REAL(KIND=JPRB) :: ZHOOK_HANDLE
53 !
54 IF (lhook) CALL dr_hook('MODE_TRIP_FUNCTION:IRNXTX',0,zhook_handle)
55 IF(iriv==1.OR.iriv==5)THEN
56  knextx = ix
57 ELSEIF(iriv==8.OR.iriv==7.OR.iriv==6)THEN
58  IF(ix==1)THEN
59  knextx = nx
60  ELSE
61  knextx = ix-1
62  ENDIF
63 ELSEIF(iriv==2.OR.iriv==3.OR.iriv==4)THEN
64  IF(ix==nx)THEN
65  knextx = 1
66  ELSE
67  knextx = ix+1
68  ENDIF
69 ELSE
70  knextx = 0
71 ENDIF
72 IF (lhook) CALL dr_hook('MODE_TRIP_FUNCTION:IRNXTX',1,zhook_handle)
73 !
74 END FUNCTION irnxtx
75 !
76 !-------------------------------------------------------------------------------
77 !
78 ! ###############################################
79  FUNCTION irnxty(IY,NY,IRIV) RESULT(KNEXTY)
80 ! ###############################################
81 !
82 IMPLICIT NONE
83 !
84 INTEGER, INTENT(IN) :: IY,NY,IRIV
85 INTEGER :: KNEXTY
86 REAL(KIND=JPRB) :: ZHOOK_HANDLE
87 !
88 IF (lhook) CALL dr_hook('MODE_TRIP_FUNCTION:IRNXTY',0,zhook_handle)
89 IF(iriv==7.OR.iriv==3)THEN
90  knexty = iy
91 ELSEIF(iriv==6.OR.iriv==5.OR.iriv==4)THEN
92  knexty = iy-1
93 ELSEIF(iriv==8.OR.iriv==1.OR.iriv==2)THEN
94  IF(iy==ny)THEN
95  knexty = 0
96  ELSE
97  knexty = iy+1
98  ENDIF
99 ELSE
100  knexty = 0
101 ENDIF
102 IF (lhook) CALL dr_hook('MODE_TRIP_FUNCTION:IRNXTY',1,zhook_handle)
103 !
104 END FUNCTION irnxty
105 !
106 !-------------------------------------------------------------------------------
107 !
108 ! ###############################################
109  FUNCTION getlon(IX,NX) RESULT(PLON0)
110 ! ###############################################
111 !
112 IMPLICIT NONE
113 !
114 INTEGER, INTENT(IN) :: IX,NX
115 REAL :: PLON0
116 REAL(KIND=JPRB) :: ZHOOK_HANDLE
117 !
118 IF (lhook) CALL dr_hook('MODE_TRIP_FUNCTION:GETLON',0,zhook_handle)
119 plon0 = 360.0 * (REAL(ix)-0.5) / REAL(NX) - 180.0
120 IF (lhook) CALL dr_hook('MODE_TRIP_FUNCTION:GETLON',1,zhook_handle)
121 !
122 END FUNCTION getlon
123 !
124 !-------------------------------------------------------------------------------
125 !
126 ! ###############################################
127  FUNCTION getlat(IY,NY) RESULT(PLAT0)
128 ! ###############################################
129 !
130 IMPLICIT NONE
131 !
132 INTEGER, INTENT(IN) :: IY,NY
133 REAL :: PLAT0
134 REAL(KIND=JPRB) :: ZHOOK_HANDLE
135 !
136 IF (lhook) CALL dr_hook('MODE_TRIP_FUNCTION:GETLAT',0,zhook_handle)
137 plat0 = 180.0 * (REAL(iy)-0.5) / REAL(NY) - 90.0
138 IF (lhook) CALL dr_hook('MODE_TRIP_FUNCTION:GETLAT',1,zhook_handle)
139 !
140 END FUNCTION getlat
141 !
142 !-------------------------------------------------------------------------------
143 !
144 ! ###############################################
145  FUNCTION givelon(ZY) RESULT(PDLON)
146 ! ###############################################
147 !
148 USE modd_trip_par, ONLY : xpi, xrad
149 !
150 IMPLICIT NONE
151 !
152 REAL, INTENT(IN) :: ZY
153 REAL :: PDLON
154 !
155 REAL, PARAMETER :: ZE2 = 0.006694470
156 REAL :: ZR, ZY_RAD, ZRA
157 REAL(KIND=JPRB) :: ZHOOK_HANDLE
158 !
159 IF (lhook) CALL dr_hook('MODE_TRIP_FUNCTION:GIVELON',0,zhook_handle)
160 zra = xrad/1000.0
161 !
162 zy_rad = zy * xpi / 180.
163 !
164 pdlon = xpi / 180.0 * zra * cos(zy_rad) / sqrt(1.0 - ze2 * sin(zy_rad) * sin(zy_rad))
165 IF (lhook) CALL dr_hook('MODE_TRIP_FUNCTION:GIVELON',1,zhook_handle)
166 !
167 END FUNCTION givelon
168 !
169 !-------------------------------------------------------------------------------
170 !
171 ! ###############################################
172  FUNCTION givelat(ZY) RESULT(PDLAT)
173 ! ###############################################
174 !
175 USE modd_trip_par, ONLY : xpi, xrad
176 !
177 IMPLICIT NONE
178 !
179 REAL, INTENT(IN) :: ZY
180 REAL :: PDLAT
181 !
182 REAL, PARAMETER :: ZE2 = 0.006694470
183 REAL :: ZR, ZY_RAD, ZRA
184 REAL(KIND=JPRB) :: ZHOOK_HANDLE
185 !
186 IF (lhook) CALL dr_hook('MODE_TRIP_FUNCTION:GIVELAT',0,zhook_handle)
187 zra = xrad/1000.0
188 !
189 zy_rad = zy * xpi / 180.
190 !
191 pdlat = xpi / 180.0 * zra * (1.0-ze2) / sqrt( (1.0 - ze2 * sin(zy_rad) * sin(zy_rad))**3 )
192 IF (lhook) CALL dr_hook('MODE_TRIP_FUNCTION:GIVELAT',1,zhook_handle)
193 !
194 END FUNCTION givelat
195 !
196 !-------------------------------------------------------------------------------
197 !
198 ! ###############################################
199  FUNCTION giverad(ZY) RESULT(PRAD)
200 ! ###############################################
201 !
202 USE modd_trip_par, ONLY : xrad, xpi
203 !
204 IMPLICIT NONE
205 !
206 REAL, INTENT(IN) :: ZY
207 REAL :: PRAD
208 !
209 REAL, PARAMETER :: ZE2 = 0.006694470
210 REAL :: ZR, ZY_RAD, ZRN, ZRA
211 REAL(KIND=JPRB) :: ZHOOK_HANDLE
212 !
213 IF (lhook) CALL dr_hook('MODE_TRIP_FUNCTION:GIVERAD',0,zhook_handle)
214 zra = xrad/1000.0
215 !
216 zy_rad = zy * xpi / 180.
217 !
218 zrn = zra / sqrt(1.0 - ze2 * sin(zy_rad) * sin(zy_rad) )
219 !
220 prad = zrn * sqrt( 1.0 - ze2 * sin(zy_rad) + ze2 * ze2 * sin(zy_rad) * sin(zy_rad) )
221 IF (lhook) CALL dr_hook('MODE_TRIP_FUNCTION:GIVERAD',1,zhook_handle)
222 !
223 END FUNCTION giverad
224 !
225 !-------------------------------------------------------------------------------
226 !
227 ! ###############################################
228  FUNCTION givelen(ZX,ZY,ZX_N,ZY_N) RESULT(PLEN0)
229 ! ###############################################
230 !
231 IMPLICIT NONE
232 !
233 REAL, INTENT(IN) :: ZX,ZY,ZX_N,ZY_N
234 REAL :: PLEN0
235 !
236 REAL :: ZLAT, ZDX, ZDY, ZRAD, ZDLON, ZDLAT
237 REAL(KIND=JPRB) :: ZHOOK_HANDLE
238 !
239 IF (lhook) CALL dr_hook('MODE_TRIP_FUNCTION:GIVELEN',0,zhook_handle)
240 zdlon = abs(zx-zx_n)
241 zdlat = abs(zy-zy_n)
242 !
243 IF(zdlon>=180.0)zdlon = abs(360.0 - zdlon)
244 !
245 plen0 = 0.0
246 !
247 IF(zx==zx_n)THEN
248  zlat = (zy+zy_n) / 2.0
249  plen0 = givelat(zlat) * zdlat
250 ELSEIF(zy==zy_n)THEN
251  zlat = zy
252  plen0 = givelon(zlat) * zdlon
253 ELSE
254  zlat = (zy+zy_n) / 2.0
255  zrad = giverad(zlat)
256  zdx = givelon(zlat) * zdlon / zrad
257  zdy = givelat(zlat) * zdlat / zrad
258  plen0 = acos(cos(zdx)*cos(zdy)) * zrad
259 ENDIF
260 IF (lhook) CALL dr_hook('MODE_TRIP_FUNCTION:GIVELEN',1,zhook_handle)
261 !
262 END FUNCTION givelen
263 !
264 !-------------------------------------------------------------------------------
265 !
266 END MODULE mode_trip_function
real function getlat(IY, NY)
real function giverad(ZY)
real function givelen(ZX, ZY, ZX_N, ZY_N)
integer, parameter jprb
Definition: parkind1.F90:32
real, save xrad
real function givelat(ZY)
logical lhook
Definition: yomhook.F90:15
real, save xpi
real function getlon(IX, NX)
real function givelon(ZY)
integer function irnxtx(IX, NX, IRIV)
integer function irnxty(IY, NY, IRIV)