SURFEX v8.1
General documentation of Surfex
eggdir.F90
Go to the documentation of this file.
1 SUBROUTINE eggdir (PRPI, PRA, PDELX, PDELY, KPROF,&
2  & KBEG, KEND, KULOUT, PGX, PGY)
3 !****
4 !---------------------------------------------------------------------
5 
6 ! GEOGRAPHY OF GRID-POINTS, ROTATION/PROJECTION FROM GEOGRAPHICAL
7 ! SPHERE TO ARPEGE-ALADIN
8 ! --------------------------------------------------------------------
9 
10 ! ---------------------------------------------------
11 ! PURPOSE
12 ! -------
13 ! KNOWING THE PRECISE GEOGRAPHICAL TRANSFORMATION FROM
14 ! ARGUMENTS AND COMMON /YEMGGCM/, COMPUTES THE LOCATION
15 ! OF THE GEOGRAPHICAL POINTS GIVEN IN INPUT ON
16 ! ON THE ARPEGE-ALADIN GRID
17 
18 ! MUST BE USED IN CONNECTION WITH SUBROUTINE EGGX
19 ! AFTER IT HAS INITIALIZED /YEMGGCM/
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 ! PGX(KPROF) : INPUT: TRUE GEOGRAPHICAL LONGITUDE IN RADIANS
30 ! (SEE EGGX FOR CONVENTIONS)
31 ! PGY(KPROF) : INPUT : TRUE GEOGRAPHICAL LATITUDE IN RADIANS
32 
33 ! IN SHORT, THE OUTPUT IS SUITABLE FOR USE IN EGGRVS
34 
35 ! IMPLICIT INPUT
36 ! --------------
37 ! COMMON /YEMGGCM/ MUST HAVE BEEN INITIALIZED
38 
39 ! OUTPUT PARAMETERS
40 ! -----------------
41 ! PGX (KPROF):
42 ! OUTPUT: X LOCATION OF POINTS, DISTANCE UNDER PROJECTION,
43 ! RELATIVE ROTATED LONGITUDE UNDER ROTATION,
44 ! ALWAYS DEFINED AS (JLON-KDLUN)*PDELX
45 ! PGY (KPROF):
46 ! OUTPUT : Y LOCATION OF POINTS, DISTANCE UNDER PROJECTION,
47 ! RELATIVE ROTATED LATITUDE UNDER ROTATION,
48 ! ALWAYS DEFINED AS (JLAT-KDGUN)*PDELY
49 ! UNDER ROTATION, THE POSITION OF THE ORIGIN (XLAT1R,XLON1U)
50 ! IS HANDLED BY THIS SUBROUTINE : ONLY RELATIVE LOCATION
51 ! ARE GIVEN ON OUTPUT.
52 
53 ! WRITTEN BY
54 ! ---------- ALAIN JOLY
55 
56 ! ORIGINAL NORTHERN HEMISPHERE VERSION : 10/5/92
57 ! SOUTHERN HEMISPHERE VERSION : 27/1/93
58 
59 !-------------------------------------------------------------------
60 
61 USE parkind1 ,ONLY : jpim ,jprb
62 USE yomhook ,ONLY : lhook, dr_hook
63 
64 USE yemggcm , ONLY : nymggi ,nymggr ,nymggwh ,xlatr ,&
65  & xlonr ,xggpk ,xlat0r ,xlon0u ,xipore ,&
67  & hsud ,xbeta
68 
69 !-------------------------------------------------------------------
70 
71 IMPLICIT NONE
72 
73 INTEGER(KIND=JPIM),INTENT(IN) :: KPROF
74 REAL(KIND=JPRB) ,INTENT(IN) :: PRPI
75 REAL(KIND=JPRB) ,INTENT(IN) :: PRA
76 REAL(KIND=JPRB) ,INTENT(IN) :: PDELX
77 REAL(KIND=JPRB) ,INTENT(IN) :: PDELY
78 INTEGER(KIND=JPIM),INTENT(IN) :: KBEG
79 INTEGER(KIND=JPIM),INTENT(IN) :: KEND
80 INTEGER(KIND=JPIM),INTENT(IN) :: KULOUT
81 REAL(KIND=JPRB) ,INTENT(INOUT) :: PGX(kprof)
82 REAL(KIND=JPRB) ,INTENT(INOUT) :: PGY(kprof)
83 
84 !-------------------------------------------------------------------
85 
86 INTEGER(KIND=JPIM) :: JJ
87 
88 LOGICAL :: LLGWH
89 
90 REAL(KIND=JPRB) :: Z2PI, Z2PIPK, ZCOBETA, ZCOS, ZCOSO, ZGAM,&
91  & ZLAT, ZLIMIT, ZLON, ZPIS2, ZPIS4, ZRC, ZRR, &
92  & ZSECAN, ZSECUR, ZSIBETA, ZSIN, ZSINO, ZXE, &
93  & ZXP, ZYE, ZYP
94 REAL(KIND=JPRB) :: ZHOOK_HANDLE
95 
96 !-------------------------------------------------------------------
97 
98 #include "abor1.intfb.h"
99 
100 !-------------------------------------------------------------------
101 IF (lhook) CALL dr_hook('EGGDIR',0,zhook_handle)
102 !-------------------------------------------------------------------
103 
104 zrc=0.0_jprb
105 
106 IF ( nymggi /= 10 ) THEN
107  WRITE (kulout,*) '*** EGGDIR *** UNINITIALISED MODULE '
108  CALL abor1(' EGGDIR: NYMGGI /= 10 ')
109 ENDIF
110 
111 IF ( hsud < 0.0_jprb ) THEN
112  DO jj = kbeg, kend
113  pgy(jj) = abs( pgy(jj) )
114  ENDDO
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 ! CHECK LONGITUDES
126 DO jj = kbeg, kend
127  IF ( pgx(jj) < 0.0_jprb ) THEN
128  pgx(jj) = pgx(jj) + 2.0_jprb*prpi
129  ENDIF
130 ENDDO
131 
132 !*
133 !----------------------------------------------------------------------
134 ! 1.- DIRECT ROTATION
135 ! --------------------
136 IF ( nymggr /= 0 ) THEN
137  DO jj = kbeg, kend
138  zsin = cos( xlatr )*sin( pgy(jj) ) -&
139  & sin( xlatr )*cos( pgy(jj) )*cos( pgx(jj)-xlonr )
140  zlat = asin( zsin )
141  IF ( abs(zlat) >= zpis2 ) THEN
142  zlon = 0.0_jprb
143  ELSE
144  zcos = cos( zlat )
145  zcoso = ( sin( xlatr )*sin( pgy(jj) ) +&
146  & cos( xlatr )*cos( pgy(jj) )*cos( pgx(jj)-xlonr ) )/zcos
147  zcoso = min(1.0_jprb,max(-1.0_jprb,zcoso))
148  zsino = ( cos( pgy(jj) )*sin( pgx(jj)-xlonr ) )/zcos
149  zsino = min(1.0_jprb,max(-1.0_jprb,zsino))
150  zlon = acos( zcoso )
151  IF ( asin( zsino ) < 0.0_jprb ) zlon = 2.0_jprb*prpi - zlon
152  ENDIF
153  pgx(jj) = zlon
154  pgy(jj) = zlat
155  ENDDO
156 ENDIF
157 
158 ! CORRECTION OF POSITION IF DOMAIN ASTRIDE GREENWICH
159 ! --------------------------------------------------
160 IF ( llgwh ) THEN
161  DO jj = kbeg, kend
162  zlimit=0.5_jprb*(xlon2r+xlon1r-zpis2)
163  IF ( pgx(jj) < xlon1r .AND. pgx(jj) < zlimit )&
164  & pgx(jj) = pgx(jj) + 2.0_jprb*prpi
165  ENDDO
166 ENDIF
167 
168 ! FINAL RESULT IN THE ABSENCE OF PROJECTION
169 ! -----------------------------------------
170 IF ( xggpk < 0.0_jprb ) THEN
171  DO jj = kbeg, kend
172  pgx(jj) = pgx(jj) - xlon1u
173  pgy(jj) = pgy(jj) - xlat1r
174  ENDDO
175 ENDIF
176 
177 !*
178 !------------------------------------------------------------------
179 ! 2.- DIRECT STEREO-LAMBERT PROJECTION
180 ! ------------------------------------
181 IF ( xggpk > 0.0_jprb ) THEN
182  IF ( xggpk < 1.0_jprb ) THEN
183  zrc = pra*( cos( xlat0r )**(1.0_jprb-xggpk) )*&
184  & ( (1.0_jprb+sin( xlat0r ))**xggpk )/xggpk
185  z2pi = 2.0_jprb*prpi
186  z2pipk = 2.0_jprb*prpi*xggpk
187  DO jj = kbeg, kend
188  IF ( (pgx(jj)-xlon0u) > z2pipk ) THEN
189  pgx(jj) = pgx(jj) - z2pi
190  ENDIF
191  ENDDO
192  ELSEIF ( xggpk == 1.0_jprb ) THEN
193  zrc = pra*( 1.0_jprb + sin( xlat0r ) )
194  ELSE
195  WRITE (kulout,*) ' *** EGGDIR *** UNKNOWN PROJECTION '
196  ENDIF
197  zxp = xipore*pdelx
198  zyp = xjpore*pdely
199 
200  DO jj = kbeg, kend
201  zrr = zrc*( cos(pgy(jj)) /&
202  & ( 1.0_jprb+ sqrt(1.0_jprb-cos(pgy(jj))**2 )) )**xggpk
203  zgam = xggpk*( pgx(jj)-xlon0u ) - xbeta
204  pgx(jj) = zxp + zrr*sin( zgam )
205  pgy(jj) = zyp - hsud*zrr*cos( zgam )
206  ENDDO
207 ENDIF
208 
209 !*
210 !----------------------------------------------------------------------
211 ! 3.- DIRECT MERCATOR PROJECTION
212 ! ------------------------------
213 IF ( xggpk == 0.0_jprb ) THEN
214  zrc = pra*cos( xlat0r )
215  zxe = xipore*pdelx
216  zye = xjpore*pdely
217  zsibeta = sin( xbeta )
218  zcobeta = cos( xbeta )
219  DO jj = kbeg, kend
220  zxp = zxe + zrc*( pgx(jj)-xlon0u )
221  zyp = zye - zrc*log( tan(zpis4 - 0.5_jprb*pgy(jj)) )
222  pgx(jj) = zxp*zcobeta + zyp*zsibeta
223  pgy(jj) = -zxp*zsibeta + zyp*zcobeta
224  ENDDO
225 ENDIF
226 
227 !-------------------------------------------------------------------
228 IF (lhook) CALL dr_hook('EGGDIR',1,zhook_handle)
229 END SUBROUTINE eggdir
integer(kind=jpim) nymggr
Definition: yemggcm.F90:12
integer, parameter jpim
Definition: parkind1.F90:13
real(kind=jprb) xlon2r
Definition: yemggcm.F90:27
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) xjpore
Definition: yemggcm.F90:22
real(kind=jprb) xlon1u
Definition: yemggcm.F90:25
real(kind=jprb) xlonr
Definition: yemggcm.F90:15
integer, parameter jprb
Definition: parkind1.F90:32
subroutine eggdir(PRPI, PRA, PDELX, PDELY, KPROF, KBEG, KEND, KULOUT, PGX, PGY)
Definition: eggdir.F90:3
integer(kind=jpim) nymggi
Definition: yemggcm.F90:11
real(kind=jprb) xlatr
Definition: yemggcm.F90:14
logical lhook
Definition: yomhook.F90:15
real(kind=jprb) xlon1r
Definition: yemggcm.F90:24
integer(kind=jpim) nymggwh
Definition: yemggcm.F90:13
real(kind=jprb) hsud
Definition: yemggcm.F90:28
real(kind=jprb) xlat1r
Definition: yemggcm.F90:26
real(kind=jprb) xbeta
Definition: yemggcm.F90:29
real(kind=jprb) xlon0u
Definition: yemggcm.F90:20