SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
mode_geo_gauss.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.
6  !!
7  !! AUTHOR
8  !! ------
9  !! J-D Gril
10  !!
11  !! MODIFICATION
12  !! ------------
13  !! Original 10/2005
14  !!
15  !---------------------------------------------------------------------------
16  USE eggangles, ONLY : lola
17  !
18 !
19  USE yomhook ,ONLY : lhook, dr_hook
20  USE parkind1 ,ONLY : jprb
21 !
22  IMPLICIT NONE
23  !
24  INTERFACE gauss_tr
25  MODULE PROCEDURE gauss_tr_v, gauss_tr_s
26  END INTERFACE
27  !
28  INTERFACE gauss_rt
29  MODULE PROCEDURE gauss_rt_v, gauss_rt_s
30  END INTERFACE
31  !
32  INTERFACE etir
33  MODULE PROCEDURE etir_v, etir_s
34  END INTERFACE
35  !
36  INTERFACE retre
37  MODULE PROCEDURE retre_v, retre_s
38  END INTERFACE
39  !
40  INTERFACE rotate_g
41  MODULE PROCEDURE rotate_g_v, rotate_g_s
42  END INTERFACE
43  !
44  INTERFACE anti_rotate_g
45  MODULE PROCEDURE anti_rotate_g_v, anti_rotate_g_s
46  END INTERFACE
47  !
48  INTERFACE map_fac
49  MODULE PROCEDURE map_fac_v, map_fac_s
50  END INTERFACE
51  !
52  CONTAINS
53  !==========================GAUSS_TR=========================================
54  TYPE(lola) function gauss_tr_s (pt_reel,pt_pole,pcodil) result (pt_g)
55  TYPE (lola), INTENT(IN) :: pt_reel
56  TYPE (lola), INTENT(IN) :: pt_pole
57  REAL, INTENT(IN) :: pcodil
58  REAL(KIND=JPRB) :: zhook_handle
59 
60  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:GAUSS_TR_S',0,zhook_handle)
61  pt_g=etir(anti_rotate_g(pt_reel,pt_pole),pcodil)
62  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:GAUSS_TR_S',1,zhook_handle)
63 
64  END FUNCTION gauss_tr_s
65 
66  FUNCTION gauss_tr_v (PT_REEL,PT_POLE,PCODIL) RESULT (PT_G)
67  TYPE (lola), DIMENSION(:), INTENT(IN) :: pt_reel
68  TYPE (lola), INTENT(IN) :: pt_pole
69  REAL, INTENT(IN) :: pcodil
70  TYPE (lola), DIMENSION(SIZE(PT_REEL)) :: pt_g
71  REAL(KIND=JPRB) :: zhook_handle
72 
73  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:GAUSS_TR_V',0,zhook_handle)
74  pt_g=etir(anti_rotate_g(pt_reel,pt_pole),pcodil)
75  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:GAUSS_TR_V',1,zhook_handle)
76 
77  END FUNCTION gauss_tr_v
78  !==========================GAUSS_RT=========================================
79  TYPE(lola) function gauss_rt_s (pt_g,pt_pole,pcodil) result (pt_reel)
80  TYPE (lola), INTENT(IN) :: pt_g
81  TYPE (lola), INTENT(IN) :: pt_pole
82  REAL, INTENT(IN) :: pcodil
83  REAL(KIND=JPRB) :: zhook_handle
84 
85  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:GAUSS_RT_S',0,zhook_handle)
86  pt_reel=rotate_g(retre(pt_g,pcodil),pt_pole)
87  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:GAUSS_RT_S',1,zhook_handle)
88 
89  END FUNCTION gauss_rt_s
90 
91  FUNCTION gauss_rt_v (PT_G,PT_POLE,PCODIL) RESULT (PT_REEL)
92  TYPE (lola), DIMENSION(:), INTENT(IN) :: pt_g
93  TYPE (lola), INTENT(IN) :: pt_pole
94  REAL, INTENT(IN) :: pcodil
95  TYPE (lola), DIMENSION(SIZE(PT_G)) :: pt_reel
96  REAL(KIND=JPRB) :: zhook_handle
97 
98  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:GAUSS_RT_V',0,zhook_handle)
99  pt_reel=rotate_g(retre(pt_g,pcodil),pt_pole)
100  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:GAUSS_RT_V',1,zhook_handle)
101 
102  END FUNCTION gauss_rt_v
103  !==========================ROTATE_G=========================================
104  TYPE(lola) function rotate_g_s (pt_tr,pt_pole) result (pt_reel)
105  USE eggangles, ONLY : cosin_to_angle, p_asin
106  TYPE (lola), INTENT(IN) :: pt_tr
107  TYPE (lola), INTENT(IN) :: pt_pole
108 
109  REAL(KIND=JPRB) :: zsin, zcos
110  REAL(KIND=JPRB) :: zhook_handle
111 
112  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:ROTATE_G_S',0,zhook_handle)
113  pt_reel%LAT = p_asin(sin(pt_pole%LAT)*sin(pt_tr%LAT)+cos(pt_pole%LAT)*cos(pt_tr%LAT)*cos(pt_tr%LON))
114 
115  IF (cos(pt_reel%LAT) /= 0.0) THEN
116  zsin = -1.0*cos(pt_tr%LAT)*sin(pt_tr%LON)/cos(pt_reel%LAT)
117  zcos = (cos(pt_pole%LAT)*sin(pt_tr%LAT)-sin(pt_pole%LAT)*cos(pt_tr%LAT)*cos(pt_tr%LON))/cos(pt_reel%LAT)
118  pt_reel%LON = cosin_to_angle(zcos,zsin) + pt_pole%LON
119  ELSE
120  pt_reel%LON = 0.0
121  ENDIF
122  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:ROTATE_G_S',1,zhook_handle)
123 
124  END FUNCTION rotate_g_s
125 
126  FUNCTION rotate_g_v (PT_TR,PT_POLE) RESULT (PT_REEL)
127  USE eggangles, ONLY : cosin_to_angle, p_asin
128  TYPE (lola), DIMENSION(:), INTENT(IN) :: pt_tr
129  TYPE (lola), INTENT(IN) :: pt_pole
130  TYPE (lola), DIMENSION(SIZE(PT_TR)) :: pt_reel
131 
132  REAL(KIND=JPRB), DIMENSION(SIZE(PT_TR)) :: zsin, zcos
133  REAL(KIND=JPRB) :: zhook_handle
134 
135  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:ROTATE_G_V',0,zhook_handle)
136  pt_reel%LAT = p_asin(sin(pt_pole%LAT)*sin(pt_tr%LAT)+cos(pt_pole%LAT)*cos(pt_tr%LAT)*cos(pt_tr%LON))
137 
138  pt_reel%LON = 0.0
139  WHERE (cos(pt_reel%LAT) /= 0.0)
140  zsin = -1.0*cos(pt_tr%LAT)*sin(pt_tr%LON)/cos(pt_reel%LAT)
141  zcos = (cos(pt_pole%LAT)*sin(pt_tr%LAT)-sin(pt_pole%LAT)*cos(pt_tr%LAT)*cos(pt_tr%LON))/cos(pt_reel%LAT)
142  pt_reel%LON = cosin_to_angle(zcos,zsin) + pt_pole%LON
143  ENDWHERE
144  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:ROTATE_G_V',1,zhook_handle)
145 
146 
147 ! DO I=1,SIZE(PT_TR)
148 ! PT_REEL(I) = ROTATE_G(PT_TR(I),PT_POLE)
149 ! END DO
150 
151  END FUNCTION rotate_g_v
152  !==========================ANTI_ROTATE_G====================================
153  TYPE(lola) function anti_rotate_g_s (pt_reel,pt_pole) result (pt_tr)
154  USE eggangles, ONLY : cosin_to_angle, p_asin
155  TYPE (lola), INTENT(IN) :: pt_reel
156  TYPE (lola), INTENT(IN) :: pt_pole
157 
158  REAL(KIND=JPRB) :: zsin, zcos
159  REAL(KIND=JPRB) :: zhook_handle
160 
161  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:ANTI_ROTATE_G_S',0,zhook_handle)
162  pt_tr%LAT = p_asin(sin(pt_pole%LAT)*sin(pt_reel%LAT)+cos(pt_pole%LAT)*cos(pt_reel%LAT)*cos(pt_reel%LON-pt_pole%LON))
163 
164  IF (cos(pt_tr%LAT) /= 0.0) THEN
165  zsin = -1.0*cos(pt_reel%LAT)*sin(pt_reel%LON-pt_pole%LON)/cos(pt_tr%LAT)
166  zcos = (cos(pt_pole%LAT)*sin(pt_reel%LAT)-sin(pt_pole%LAT)*cos(pt_reel%LAT)*cos(pt_reel%LON-pt_pole%LON))/cos(pt_tr%LAT)
167  pt_tr%LON = cosin_to_angle(zcos,zsin)
168  ELSE
169  pt_tr%LON = 0.0
170  ENDIF
171  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:ANTI_ROTATE_G_S',1,zhook_handle)
172  END FUNCTION anti_rotate_g_s
173 
174  FUNCTION anti_rotate_g_v (PT_REEL,PT_POLE) RESULT (PT_TR)
175  USE eggangles, ONLY : cosin_to_angle, p_asin
176  TYPE (lola), DIMENSION(:), INTENT(IN) :: pt_reel
177  TYPE (lola), INTENT(IN) :: pt_pole
178  TYPE (lola), DIMENSION(SIZE(PT_REEL)) :: pt_tr
179 
180  REAL(KIND=JPRB), DIMENSION(SIZE(PT_REEL)) :: zsin, zcos
181  REAL(KIND=JPRB) :: zhook_handle
182 
183  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:ANTI_ROTATE_G_V',0,zhook_handle)
184  pt_tr%LAT = p_asin(sin(pt_pole%LAT)*sin(pt_reel%LAT)+cos(pt_pole%LAT)*cos(pt_reel%LAT)*cos(pt_reel%LON-pt_pole%LON))
185 
186  pt_tr%LON = 0.0
187  WHERE (cos(pt_tr%LAT) /= 0.0)
188  zsin = -1.0*cos(pt_reel%LAT)*sin(pt_reel%LON-pt_pole%LON)/cos(pt_tr%LAT)
189  zcos = (cos(pt_pole%LAT)*sin(pt_reel%LAT)-sin(pt_pole%LAT)*cos(pt_reel%LAT)*cos(pt_reel%LON-pt_pole%LON))/cos(pt_tr%LAT)
190  pt_tr%LON = cosin_to_angle(zcos,zsin)
191  ENDWHERE
192  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:ANTI_ROTATE_G_V',1,zhook_handle)
193 
194 ! DO I=1,SIZE(PT_REEL)
195 ! PT_TR(I) = ANTI_ROTATE_G(PT_REEL(I),PT_POLE)
196 ! END DO
197 
198  END FUNCTION anti_rotate_g_v
199  !==========================ETIR=============================================
200  TYPE(lola) function etir_s (pt_coord,pcodil) result (pt_et)
201  USE eggangles, ONLY : cosin_to_angle
202  TYPE (lola), INTENT(IN) :: pt_coord
203  REAL, INTENT(IN) :: pcodil
204 
205  REAL(KIND=JPRB) :: zpc2, zsin, zcos
206  REAL(KIND=JPRB) :: zhook_handle
207 
208  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:ETIR_S',0,zhook_handle)
209  pt_et%LON = pt_coord%LON
210  zpc2 = pcodil*pcodil
211  zsin = ((1.0-zpc2)+(1.0+zpc2)*sin(pt_coord%LAT))/((1.0+zpc2)+(1.0-zpc2)*sin(pt_coord%LAT))
212  zcos = 2.0*pcodil*cos(pt_coord%LAT)/((1.0+zpc2)+(1.0-zpc2)*sin(pt_coord%LAT))
213 
214  pt_et%LAT = cosin_to_angle(zcos,zsin)
215  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:ETIR_S',1,zhook_handle)
216 
217  END FUNCTION etir_s
218 
219  FUNCTION etir_v (PT_COORD,PCODIL) RESULT (PT_ET)
220  USE eggangles, ONLY : cosin_to_angle
221  TYPE (lola), DIMENSION(:), INTENT(IN) :: pt_coord
222  REAL, INTENT(IN) :: pcodil
223  TYPE (lola), DIMENSION(SIZE(PT_COORD)) :: pt_et
224 
225  REAL(KIND=JPRB), DIMENSION(SIZE(PT_COORD)) :: zpc2, zsin, zcos
226  REAL(KIND=JPRB) :: zhook_handle
227 
228  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:ETIR_V',0,zhook_handle)
229  pt_et%LON = pt_coord%LON
230  zpc2 = pcodil*pcodil
231  zsin = ((1.0-zpc2)+(1.0+zpc2)*sin(pt_coord%LAT))/((1.0+zpc2)+(1.0-zpc2)*sin(pt_coord%LAT))
232  zcos = 2.0*pcodil*cos(pt_coord%LAT)/((1.0+zpc2)+(1.0-zpc2)*sin(pt_coord%LAT))
233 
234  pt_et%LAT = cosin_to_angle(zcos,zsin)
235  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:ETIR_V',1,zhook_handle)
236 
237  END FUNCTION etir_v
238  !==========================RETRE============================================
239  TYPE(lola) function retre_s (pt_coord,pcodil) result (pt_re)
240  USE eggangles, ONLY : cosin_to_angle
241  TYPE (lola), INTENT(IN) :: pt_coord
242  REAL, INTENT(IN) :: pcodil
243 
244  REAL(KIND=JPRB) :: zpc2, zsin, zcos
245  REAL(KIND=JPRB) :: zhook_handle
246 
247  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:RETRE_S',0,zhook_handle)
248  pt_re%LON = pt_coord%LON
249  zpc2 = pcodil*pcodil
250  zsin = (-1.0*(1.0-zpc2)+(1.0+zpc2)*sin(pt_coord%LAT))/((1.0+zpc2)-(1.0-zpc2)*sin(pt_coord%LAT))
251  zcos = 2.0*pcodil*cos(pt_coord%LAT)/((1.0+zpc2)-(1.0-zpc2)*sin(pt_coord%LAT))
252 
253  pt_re%LAT = cosin_to_angle(zcos,zsin)
254  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:RETRE_S',1,zhook_handle)
255 
256  END FUNCTION retre_s
257 
258  FUNCTION retre_v (PT_COORD,PCODIL) RESULT (PT_RE)
259  USE eggangles, ONLY : cosin_to_angle
260  TYPE (lola), DIMENSION(:), INTENT(IN) :: pt_coord
261  REAL, INTENT(IN) :: pcodil
262  TYPE (lola), DIMENSION(SIZE(PT_COORD)) :: pt_re
263 
264  REAL(KIND=JPRB), DIMENSION(SIZE(PT_COORD)) :: zpc2, zsin, zcos
265  REAL(KIND=JPRB) :: zhook_handle
266 
267  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:RETRE_V',0,zhook_handle)
268  pt_re%LON = pt_coord%LON
269  zpc2 = pcodil*pcodil
270  zsin = (-1.0*(1.0-zpc2)+(1.0+zpc2)*sin(pt_coord%LAT))/((1.0+zpc2)-(1.0-zpc2)*sin(pt_coord%LAT))
271  zcos = 2.0*pcodil*cos(pt_coord%LAT)/((1.0+zpc2)-(1.0-zpc2)*sin(pt_coord%LAT))
272 
273  pt_re%LAT = cosin_to_angle(zcos,zsin)
274  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:RETRE_V',1,zhook_handle)
275 
276 ! DO I=1,SIZE(PT_COORD)
277 ! PT_RE(I) = RETRE(PT_COORD(I),PCODIL)
278 ! END DO
279 
280  END FUNCTION retre_v
281  !==========================MAP FACTOR=======================================
282  REAL FUNCTION map_fac_s (POLE,PCODIL,PT_COORD) RESULT (PMF)
283  TYPE (lola), INTENT(IN) :: pole, pt_coord
284  REAL, INTENT(IN) :: pcodil
285 
286  REAL(KIND=JPRB) :: zpc2
287  REAL(KIND=JPRB) :: zhook_handle
288  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:MAP_FAC_S',0,zhook_handle)
289  zpc2 = pcodil*pcodil
290  pmf = (2.0*pcodil)/((1+zpc2)+(1-zpc2)* &
291  (sin(pt_coord%LAT)*sin(pole%LAT)+cos(pt_coord%LAT)*cos(pole%LAT)*cos(pt_coord%LON-pole%LON)))
292  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:MAP_FAC_S',1,zhook_handle)
293 
294  END FUNCTION map_fac_s
295 
296  FUNCTION map_fac_v (POLE,PCODIL,PT_COORD) RESULT (PMF)
297  TYPE (lola), INTENT(IN) :: pole
298  TYPE (lola), DIMENSION(:), INTENT(IN) :: pt_coord
299  REAL, INTENT(IN) :: pcodil
300  REAL, DIMENSION(SIZE(PT_COORD)) :: pmf
301 
302  REAL(KIND=JPRB), DIMENSION(SIZE(PT_COORD)) :: zpc2
303  REAL(KIND=JPRB) :: zhook_handle
304 
305  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:MAP_FAC_V',0,zhook_handle)
306  zpc2 = pcodil*pcodil
307  pmf = (2.0*pcodil)/((1+zpc2)+(1-zpc2)* &
308  (sin(pt_coord%LAT)*sin(pole%LAT)+cos(pt_coord%LAT)*cos(pole%LAT)*cos(pt_coord%LON-pole%LON)))
309  IF (lhook) CALL dr_hook('MODE_GEO_GAUSS:MAP_FAC_V',1,zhook_handle)
310 
311 ! DO I=1,SIZE(PT_COORD)
312 ! PMF(I) = MAP_FAC(POLE,PCODIL,PT_COORD(I))
313 ! END DO
314 
315  END FUNCTION map_fac_v
316 END MODULE mode_geo_gauss
TYPE(LOLA) function retre_s(PT_COORD, PCODIL)
real function, dimension(size(pt_coord)) map_fac_v(POLE, PCODIL, PT_COORD)
TYPE(LOLA) function gauss_tr_s(PT_REEL, PT_POLE, PCODIL)
type(lola) function, dimension(size(pt_coord)) retre_v(PT_COORD, PCODIL)
TYPE(LOLA) function rotate_g_s(PT_TR, PT_POLE)
REAL function map_fac_s(POLE, PCODIL, PT_COORD)
TYPE(LOLA) function anti_rotate_g_s(PT_REEL, PT_POLE)
type(lola) function, dimension(size(pt_reel)) gauss_tr_v(PT_REEL, PT_POLE, PCODIL)
type(lola) function, dimension(size(pt_tr)) rotate_g_v(PT_TR, PT_POLE)
type(lola) function, dimension(size(pt_reel)) anti_rotate_g_v(PT_REEL, PT_POLE)
TYPE(LOLA) function gauss_rt_s(PT_G, PT_POLE, PCODIL)
type(lola) function, dimension(size(pt_g)) gauss_rt_v(PT_G, PT_POLE, PCODIL)
TYPE(LOLA) function etir_s(PT_COORD, PCODIL)
type(lola) function, dimension(size(pt_coord)) etir_v(PT_COORD, PCODIL)