SURFEX v8.1
General documentation of Surfex
eggrvs.F90
Go to the documentation of this file.
1 SUBROUTINE eggrvs (PRPI, PRA, PDELX, PDELY, KPROF,&
2  & KBEG, KEND, KULOUT, PGELAM, PGELAT, PGM, PGNORX, PGNORY)
3 !****
4 !---------------------------------------------------------------------
5 
6 ! GEOGRAPHY OF GRID-POINTS, INVERSION FROM GRID TO GEOGRAPHICAL SPHERE
7 ! ARPEGE-ALADIN
8 ! --------------------------------------------------------------------
9 
10 ! ---------------------------------------------------
11 ! PURPOSE
12 ! -------
13 ! KNOWING THE PRECISE GEOGRAPHICAL TRANSFORMATION FROM
14 ! ARGUMENTS AND COMMON /YEMGGCM/, COMPUTES THE LOCATION
15 ! ON THEE GEOGRAPHICAL POINTS GIVEN IN INPUT BY THEIR LOCATION
16 ! ON THE ARPEGE-ALADIN GRID
17 
18 ! MUST BE USED IN CONNECTION WITH SUBROUTINE EGGX
19 ! EITHER WITHIN IT OR AFTER IT
20 
21 ! INPUT PARAMETERS
22 ! ----------------
23 ! PRPI : PI (3.14ETC)
24 ! PRA : A, RADIUS OF PLANET
25 ! PDELX, PDELY : GRID SIZE IN M IF PROJECTION, OR IN RADIANS
26 ! KPROF : SIZE OF (1D) ARRAYS
27 ! KBEG, KEND : BEGINNING AND END POINTS OF CALCULATIONS
28 ! KULOUT : LOGICAL UNIT OF LISTING
29 ! PGELAM(KPROF) : X LOCATION OF POINTS, DISTANCE UNDER PROJECTION,
30 ! RELATIVE ROTATED LONGITUDE UNDER ROTATION,
31 ! DEFINED AS (JLON-KDLUN)*PDELX
32 ! PGELAT(KPROF) : Y LOCATION OF POINTS, DISTANCE UNDER PROJECTION,
33 ! RELATIVE ROTATED LATITUDE UNDER ROTATION,
34 ! DEFINED AS (JLAT-KDGUN)*PDELY
35 ! UNDER ROTATION, THE POSITION OF THE ORIGIN (XLAT1R,XLON1U)
36 ! IS HANDLED BY THIS SUBROUTINE : ONLY RELATIVE LOCATION
37 ! NEED TO BE SPECIFIED
38 
39 ! IMPLICIT INPUT
40 ! --------------
41 ! COMMON /YEMGGCM/ MUST HAVE BEEN INITIALIZED
42 
43 ! OUTPUT PARAMETERS
44 ! -----------------
45 ! PGELAM (KPROF): GEOGRAPHICAL LONGITUDE
46 ! PGELAT (KPROF): GEOGRAPHICAL LATITUDE
47 ! PGM (KRPOF): MAP FACTOR
48 ! PGNORX (KPROF): PROJECTION OF GEOGRAPHICAL NORTH ON X
49 ! PGNORY (KPROF): PROJECTION OF GEOGRAPHICAL NORTH ON Y
50 
51 ! WRITTEN BY
52 ! ---------- ALAIN JOLY
53 
54 ! ORIGINAL NORTHERN HEMISPHERE VERSION : 27/2/92
55 ! SOUTHERN HEMISPHERE VERSION : 27/1/93
56 
57 ! Modified:
58 ! --------
59 
60 ! 98-05-07: P. Le Moigne :vectorization of eggrvs (LLSTOP)
61 
62 !-------------------------------------------------------------------
63 
64 USE parkind1 ,ONLY : jpim ,jprb
65 USE yomhook ,ONLY : lhook, dr_hook
66 
67 USE yemggcm , ONLY : nymggi ,nymggr ,nymggwh ,xlatr ,&
68  & xlonr ,xggpk ,xrpksm ,xlat0r ,xlon0r ,&
70  & xlat1r ,hsud ,xbeta
71 
72 !-------------------------------------------------------------------
73 
74 IMPLICIT NONE
75 
76 INTEGER(KIND=JPIM),INTENT(IN) :: KPROF
77 REAL(KIND=JPRB) ,INTENT(IN) :: PRPI
78 REAL(KIND=JPRB) ,INTENT(IN) :: PRA
79 REAL(KIND=JPRB) ,INTENT(IN) :: PDELX
80 REAL(KIND=JPRB) ,INTENT(IN) :: PDELY
81 INTEGER(KIND=JPIM),INTENT(IN) :: KBEG
82 INTEGER(KIND=JPIM),INTENT(IN) :: KEND
83 INTEGER(KIND=JPIM),INTENT(IN) :: KULOUT
84 REAL(KIND=JPRB) ,INTENT(INOUT) :: PGELAM(kprof)
85 REAL(KIND=JPRB) ,INTENT(INOUT) :: PGELAT(kprof)
86 REAL(KIND=JPRB) ,INTENT(OUT) :: PGM(kprof)
87 REAL(KIND=JPRB) ,INTENT(OUT) :: PGNORX(kprof)
88 REAL(KIND=JPRB) ,INTENT(OUT) :: PGNORY(kprof)
89 
90 !-------------------------------------------------------------------
91 
92 INTEGER(KIND=JPIM) :: JJ
93 
94 LOGICAL :: LLGWH, LLSTOP
95 
96 REAL(KIND=JPRB) :: Z2PIPK, ZCOBETA, ZCOLA, ZCOSA, ZCOSOG, ZDIST,&
97  & ZFUN, ZGAM, ZGM, ZKDL, ZLAT, ZLATG, ZLON, &
98  & ZLONG, ZNORX, ZNORXP, ZNORY, ZNORYP, ZPIS2, &
99  & ZPIS4, ZRPKSM2, ZSECAN, ZSECUR, ZSIBETA, &
100  & ZSINAG, ZSINOG, ZURA2, ZX, ZY
101 REAL(KIND=JPRB) :: ZHOOK_HANDLE
102 
103 !-------------------------------------------------------------------
104 
105 #include "abor1.intfb.h"
106 
107 !-------------------------------------------------------------------
108 IF (lhook) CALL dr_hook('EGGRVS',0,zhook_handle)
109 !-------------------------------------------------------------------
110 
111 llstop=.false.
112 IF ( nymggi /= 10 ) THEN
113  WRITE (kulout,*) '*** EGGRVS *** UNINITIALISED MODULE '
114  CALL abor1(' EGGRVS: NYMGGI /= 10 ')
115 ENDIF
116 
117 ! INITIALISE ROTATION ANGLE AND OTHER CONSTANTS
118 ! ---------------------------------------------
119 zpis2 = prpi*0.5_jprb
120 zpis4 = prpi*0.25_jprb
121 zsecur = 1.e-12_jprb
122 zsecan = 1.e-05_jprb
123 llgwh = .false.
124 IF ( nymggwh == 1 ) llgwh = .true.
125 
126 DO jj = kbeg, kend
127  pgm(jj) = 1.0_jprb
128  pgnorx(jj) = 0.0_jprb
129  pgnory(jj) = 1.0_jprb
130 ENDDO
131 
132 ! CORRECTION OF POSITION UNDER ROTATION ONLY
133 ! -------------------------------------------
134 
135 IF ( xggpk < 0.0_jprb ) THEN
136  DO jj = kbeg, kend
137  pgelam(jj) = xlon1u + pgelam(jj)
138  IF ( pgelam(jj) >= 2.0_jprb*prpi )pgelam(jj) = pgelam(jj) - 2.0_jprb*prpi
139  pgelat(jj) = xlat1r + pgelat(jj)
140  ENDDO
141 ENDIF
142 
143 !*
144 !--------------------------------------------------------------------
145 ! 1.- REVERSE STEREO-LAMBERT PROJECTION
146 ! -------------------------------------
147 IF ( xggpk > 0.0_jprb ) THEN
148  zrpksm2 = xrpksm*xrpksm
149  zura2 = 1.0_jprb/( pra*pra )
150  z2pipk = 2.0_jprb*prpi*xggpk
151 
152  DO jj = kbeg, kend
153  zx = pgelam(jj) - xipore*pdelx
154  zy = pgelat(jj) - xjpore*pdely
155  zdist = (zrpksm2*( zx*zx + zy*zy )*zura2)**(1.0_jprb/(2.0_jprb*xggpk))
156 
157  zlat = zpis2 - 2.0_jprb*atan( zdist )
158 
159  IF ( zdist < zsecur ) THEN
160  ! THE POLE IS TOO NEAR TO DEFINE LONGITUDE
161  zlon = 0.0_jprb
162  IF ( xggpk /= 1.0_jprb ) llstop=.true.
163  ! MAP FACTOR AT POLE FOR STEREOGRAPHIC PROJECTION
164  zgm = ( 1.0_jprb + sin( xlat0r ) )/( 1.0_jprb + sin( zlat ) )
165  ELSE
166  IF ( hsud > 0.0_jprb ) THEN
167  zkdl = atan2( zx,-zy )
168  ELSE
169  zkdl = atan2( zx,zy )
170  ENDIF
171  zlon = xlon0r + (zkdl + xbeta)/xggpk
172  IF ( zlon < 0.0_jprb ) zlon = 2.0_jprb*prpi + zlon
173  zgm = xggm0*( cos( zlat )**(xggpk-1.0_jprb) )*&
174  & ( ( 1.0_jprb + sin( zlat ) )**(-xggpk) )
175  ENDIF
176 
177  pgelam(jj) = zlon
178  pgelat(jj) = hsud*zlat
179  pgm(jj) = zgm
180  ! COMPONENTS OF VECTOR ROTATION MATRIX
181  IF ( llgwh ) zlon = zlon + 2.0_jprb*prpi
182  IF ( xggpk < 1.0_jprb .AND. (zlon-xlon0u) > z2pipk )&
183  & zlon = zlon - 2.0_jprb*prpi
184  zgam = hsud*(xggpk*( zlon - xlon0u ) - xbeta)
185  pgnorx(jj) = -sin( zgam )
186  pgnory(jj) = cos( zgam )
187  ENDDO
188  IF ( llstop ) THEN
189  WRITE (kulout,*) ' POLE WITHIN LAMBERT DOMAIN '
190  CALL abor1(' EGGRVS: POLE WITHIN LAMBERT DOMAIN ')
191  ENDIF
192 ENDIF
193 
194 !*
195 !--------------------------------------------------------------------
196 ! 2.- REVERSE MERCATOR PROJECTION
197 ! -------------------------------
198 IF ( xggpk == 0.0_jprb ) THEN
199  zsibeta = sin( xbeta )
200  zcobeta = cos( xbeta )
201  DO jj = kbeg, kend
202  zy = pgelam(jj)*zsibeta + pgelat(jj)*zcobeta - xjpore*pdely
203  zdist = exp( -zy/( pra*cos(xlat0r) ) )
204  zlat = zpis2 - 2.0_jprb*atan( zdist )
205 
206  zgm = cos( xlat0r )/cos( zlat )
207 
208  zx = pgelam(jj)*zcobeta - pgelat(jj)*zsibeta - xipore*pdelx
209  zlon = xlon0u + zx/( pra*cos( xlat0r ) )
210  IF ( zlon >= 2.0_jprb*prpi ) zlon = zlon - 2.0_jprb*prpi
211 
212  pgelam(jj) = zlon
213  pgelat(jj) = zlat
214  pgm(jj) = zgm
215  ! COMPONENTS OF VECTOR ROTATION MATRIX
216  pgnorx(jj) = zsibeta
217  pgnory(jj) = zcobeta
218  ENDDO
219 ENDIF
220 
221 !*
222 !--------------------------------------------------------------------
223 ! 3.- REVERSE ROTATION
224 ! --------------------
225 IF ( nymggr /= 0 ) THEN
226  DO jj = kbeg, kend
227  zlon = pgelam(jj)
228  zlat = pgelat(jj)
229  zsinag = sin( xlatr )*cos( zlat )*cos( zlon ) +cos( xlatr )*sin( zlat )
230  zsinag = min(1.0_jprb,max(-1.0_jprb,zsinag))
231  zlatg = asin( zsinag )
232  IF ( abs( zlatg ) >= zpis2 ) THEN
233  zlong = 0.0_jprb
234  ELSE
235  zcosa = cos( zlatg )
236  zfun = cos( xlatr )*cos( zlat )*cos( zlon ) -sin( xlatr )*sin( zlat )
237  zcosog = ( cos( xlonr )*zfun - sin( xlonr )*cos( zlat )*&
238  & sin( zlon ) )/zcosa
239  zcosog = min(1.0_jprb,max(-1.0_jprb,zcosog))
240  zsinog = ( sin( xlonr )*zfun + cos( xlonr )*cos( zlat )*&
241  & sin( zlon ) )/zcosa
242  zsinog = min(1.0_jprb,max(-1.0_jprb,zsinog))
243  zlong = acos( zcosog )
244  IF ( asin(zsinog) < 0.0_jprb ) zlong = 2.0_jprb*prpi - zlong
245  ENDIF
246  pgelam(jj) = zlong
247  pgelat(jj) = zlatg
248  ! COMPONENTS OF ROTATION MATRIX DUE TO ROTATION
249  zcola = sqrt( abs( 1.0_jprb - (cos( xlatr )*sin( zlatg )-&
250  & sin( xlatr )*cos( zlatg )*cos( zlong-xlonr ))**2 ) )
251  IF ( zcola < zsecur ) THEN
252  WRITE (kulout,*) ' *** EGGX QUASI ERROR ***',&
253  & ' DOMAIN EXTENDS UP TO NEW POLE : IT IS PROBABLY TOO LARGE'
254  znory = 1.0_jprb
255  znorx = 0.0_jprb
256  ELSE
257  znory = ( cos( xlatr )*cos( zlatg ) + sin( xlatr )*&
258  & sin( zlatg )*cos( zlong-xlonr ) )/zcola
259  znorx = - sin( xlatr )*sin( zlong-xlonr )/zcola
260  ENDIF
261  ! COMPOSITION OF THIS ROTATION WITH THE ONE RESULTING FROM PROJECTION
262  znoryp = pgnory(jj)
263  znorxp = pgnorx(jj)
264  pgnory(jj) = znory*znoryp - znorx*znorxp
265  pgnorx(jj) = znorx*znoryp + znory*znorxp
266  ENDDO
267 ENDIF
268 
269 !-------------------------------------------------------------------
270 IF (lhook) CALL dr_hook('EGGRVS',1,zhook_handle)
271 END SUBROUTINE eggrvs
integer(kind=jpim) nymggr
Definition: yemggcm.F90:12
integer, parameter jpim
Definition: parkind1.F90:13
subroutine abor1(CDTEXT)
Definition: abor1.F90:2
real(kind=jprb) xggpk
Definition: yemggcm.F90:16
real(kind=jprb) xipore
Definition: yemggcm.F90:21
real(kind=jprb) xlat0r
Definition: yemggcm.F90:18
real(kind=jprb) xggm0
Definition: yemggcm.F90:23
real(kind=jprb) xjpore
Definition: yemggcm.F90:22
real(kind=jprb) xlon0r
Definition: yemggcm.F90:19
real(kind=jprb) xlon1u
Definition: yemggcm.F90:25
real(kind=jprb) xlonr
Definition: yemggcm.F90:15
integer, parameter jprb
Definition: parkind1.F90:32
integer(kind=jpim) nymggi
Definition: yemggcm.F90:11
real(kind=jprb) xlatr
Definition: yemggcm.F90:14
real(kind=jprb) xrpksm
Definition: yemggcm.F90:17
logical lhook
Definition: yomhook.F90:15
integer(kind=jpim) nymggwh
Definition: yemggcm.F90:13
real(kind=jprb) hsud
Definition: yemggcm.F90:28
real(kind=jprb) xlat1r
Definition: yemggcm.F90:26
subroutine eggrvs(PRPI, PRA, PDELX, PDELY, KPROF, KBEG, KEND, KULOUT, PGELAM, PGELAT, PGM, PGNORX, PGNORY)
Definition: eggrvs.F90:3
real(kind=jprb) xbeta
Definition: yemggcm.F90:29
real(kind=jprb) xlon0u
Definition: yemggcm.F90:20