SURFEX v8.1
General documentation of Surfex
eggx.F90
Go to the documentation of this file.
1 SUBROUTINE eggx (PRPI, PRA, KROTEQ, PLONR, PLATR, PBETA,&
2  & PLON1, PLAT1, PLON2, PLAT2, PLON0, PLAT0, PRPK, KULOUT,&
3  & KSOTRP, KGIV0,&
4  & PGELAM, PGELAT, PGM, PGNORX, PGNORY,&
5  & KDLSA, KDLSUR, KDGSA, KDGEN, KDLUN, KDLUX, KDGUN, KDGUX,&
6  & PDELX, PDELY)
7 !****
8 !----------------------------------------------------------------------
9 
10 ! GEOGRAPHY OF GRID-POINTS
11 ! ARPEGE-ALADIN
12 ! -------------------------
13 
14 ! -------------------------------------------------------
15 ! PURPOSE
16 ! -------
17 ! PROVIDES THE BASIC GEOGRAPHICAL PARAMETERS OF EACH GRID-POINT
18 ! IN THE WINDOW OF INTERNAL+COUPLING ZONE, DEFINING THE
19 ! GEOGRAPHICAL DOMAIN OF INTEREST.
20 ! SIMULTANEOUSLY, INITIALISES THE INTERNAL GEOGRAPHICAL COMMON
21 ! /YEMGGCM/ FOR POSSIBLE RE-USE OF POSITION INVERSION SUBROUTINE
22 ! EGGRVS.
23 
24 ! THE GEOGRAPHICAL PARAMETERS ARE :
25 ! - GEOGRAPHIC LONGITUDE
26 ! - GEOGRAPHIC LATITUDE
27 ! - MAP FACTOR
28 ! - COMPONENTS OF VECTOR DIRECTED TOWARDS THE GEOGRAPHIC NORTH
29 ! POLE FOR PROJECTION OF VECTORS
30 ! - X GRID-SIZE (DISTANCE OR LONGITUDE INCREMENT)
31 ! - Y GRID-SIZE (DISTANCE OR LATITUDE INCREMENT)
32 ! THE LAST TWO DEPEND ON THE GEOMETRY. THE LATTER CAN BE
33 ! - SPHERICAL GEOMETRY, WITH ROTATION OF DOMAIN TO THE EQUATOR
34 ! - CARTESIAN GEOMETRY, WITH PROJECTION OF DOMAIN ON A PLANE
35 
36 ! ROTATION AND PROJECTION CAN BE COMBINED. HOWEVER, PROJECTIONS
37 ! OTHER THAN MERCATOR SHOULD BE USED WITHOUT ROTATION.
38 
39 ! EGGX CAN RUN UNDER FULL USER CONTROL OR IN MORE OR LESS
40 ! AUTOMATIC MODES
41 
42 ! FROM THESE BASIC PARAMETERS, OTHER CAN EASILY BE DEDUCED, SUCH
43 ! AS THE CORIOLIS PARAMETER, ETC.
44 
45 ! (GENERAL WARNING ABOUT AUTOMATIC MODE)
46 ! --------------------------------------
47 ! NOTE THAT AUTOMATIC MODE IS NOT SURE TO CONVERGE, AND MOREOVER,
48 ! IT MAY CONVERGE TOWARD A SOLUTION DIFFERENT FROM WHAT YOU EXPECTED
49 ! THIS IS SO IN PARTICULAR FOR A DOMAIN OVER THE POLE OR NEAR THE
50 ! EQUATOR. IT IS RECOMMENDED TO CHECK CAREFULLY A CHOICE OF
51 ! PARAMETERS BEFORE RUNNING A COMPLETE SUITE
52 
53 ! (CONVENTIONS FOR LATITUDE, LONGITUDE)
54 ! -------------------------------------
55 ! THEY ARE IN RADIANS
56 ! LATITUDE VARY FROM -PI/2 (SOUTH POLE) TO PI/2 (NORTH POLE)
57 ! LONGITUDE VARY FROM 0 (GREENWICH OR EQUIVALENT) TO 2*PI
58 ! THE CONVENTION FOR A POLE IS THAT IT HAS LONGITUDE 0
59 
60 ! (HANDLING OF PROJECTION IN SOUTHERN HEMISPHERE)
61 ! ------------------------------------------------
62 ! IT IS ASSUMED THAT DOMAINS NOT ROTATED AND ENTERELY CONTAINED
63 ! IN THE SOUTHERN HEMISPHERE WILL BE PROJECTED USING STEREO/LAMBERT
64 
65 ! IN THAT CASE, AND IN THAT CASE ONLY,
66 ! HSUD IS SET TO -1. IN THE INTERNAL COMMON
67 
68 ! THE SIGN OF LATITUDES IS CHANGED FOR ALL INTERNAL CALCULATIONS,
69 ! SO THAT ALL THE TRIGONOMETRY IS UNCHANGED, HOWEVER, THE RESPECTIVE
70 ! POSITIONS OF POLE AND GRID ARE REVERSED
71 
72 ! WHEREVER THIS DIFFERENCE MATTERS, THAT IS:
73 ! - MAPPING POLAR COORDINATES TO (X,Y)
74 ! - VECTOR ROTATION
75 ! ALTERNATIVE LINES OR MULTIPLICATIONS BY HSUD ARE INCLUDED
76 
77 ! THE SIGNS OF OUTGOING OR INCOMING LATITUDES ARE CHANGED AT THE LAST
78 ! MINUTE OR PRIOR TO ANY COMPUTATION
79 
80 ! (CONVENTIONS FOR ARRAY ORGANISATION)
81 ! ------------------------------------
82 ! THE POINT (KDLUN,KDGUN) HAS GEOGRAPHIC COORDINATES (PLON1,PLAT1)
83 ! THE POINT (KDLUX,KDGUX) (PLON2,PLAT2)
84 ! THE FIRST INDEX (X DIRECTION) VARIES ROUGHLY
85 ! WITH INCREASING LONGITUDE
86 ! THE SECOND INDEX (Y DIRECTION) VARIES
87 ! ROUGHLY WITH INCREASING LATITUDE
88 ! THEY ARE ACTUAL LONGITUDE, LATITUDE ONLY IN THE CASE WITHOUT PROJ.
89 
90 ! ONLY A PART OF THE ARRAYS IS INITIALIZED : THAT PART CORRESPONDING
91 ! TO INTERNAL + COUPLING ZONES. IT MIGHT BE NECESSARY TO COMPLETE
92 ! THE ARRAYS (SUCH AS GM) IN ORDER TO MAKE THEM DOUBLY-PERIODIC.
93 
94 ! ONE TYPE OF ROTATION AND THREE TYPES OF PROJECTIONS ARE RECOGNISED
95 
96 ! (CONVENTIONS FOR WIND AND OTHER VECTORS ROTATION)
97 ! --------------------------------------------------
98 ! GEOGRAPHIC U = PGNORY * U PROJ - PGNORX * V PROJ
99 ! GEOGRAPHIC V = PGNORX * U PROJ + PGNORY * V PROJ
100 
101 ! WHEN USING THIS TRANSFORM, DO NOT FORGET THE MAP FACTOR EFFECT
102 
103 ! THE INVERSE TRANSFORM IS EASY TO DEDUCE (IT IS A ROTATION)
104 
105 ! (OVERVIEW OF ALGORITHM)
106 ! -----------------------
107 ! PARAMETERS ARE EDITED AND POSSIBLY CHECKED
108 ! THEY ARE OPTIONNALLY ROTATED
109 ! SOME AUTOMATIC ADJUSTMENTS OF PROJECTION PARAMETER ARE OPTIONALLY
110 ! PERFORMED
111 ! PROJECTION IS PERFORMED (OPTIONNALLY) ON THE ROTATED SPHERE
112 ! AT THIS STAGE, INCREMENTS OR DISTANCE ON THE MAP ARE DEDUCED
113 ! COMPONENTS OF ROTATION UNDER PROJECTION ARE COMPUTED
114 ! INVERSE ROTATION BACK TO GEOGRAPHICAL VALUES IS OPTIONNALLY DONE
115 ! ON THE RESULTS, COMPONENTS OF ROTATION ARE COMPOSED WITH THOSE
116 ! OF PROJECTION
117 
118 ! INPUT PARAMETERS
119 ! ----------------
120 ! PRPI : PI (3.14ETC AS GENERALLY DEFINED ELSEWHERE : YOMCST IN ARPEGE)
121 ! PRA : A, RADIUS OF SPHERICAL PLANET (M)
122 ! WARNING :
123 ! --------- DEPENDING ON OPTIONS, INPUT PARAMETERS MAY BECOME OUTPUT
124 ! PARAMETERS. EVEN IF UNITIALISED, THE VARIABLES MUST BE
125 ! DECLARE INDEPENDENTLY.
126 
127 ! KROTEQ = 0 : NO ROTATION
128 ! = 1 : POINT (PLONR,PLATR) IS ROTATED TO EQUATOR, THE NORTH POLE
129 ! IS ON THE NEW GREENWICH MERIDIAN
130 
131 ! PLONR : GEOGRAPHIC LONGITUDE OF REFERENCE POINT OF ROTATION
132 ! PLATR : GEOGRAPHIC LATITUDE OF REFERENCE POINT OF ROTATION
133 
134 ! PBETA : ANGLE (IN RD) BETWEEN X-AXIS AND ROTATED LATITUDE CIRCLES
135 ! AT THE REFERENCE LONGITUDE
136 ! (USUALLY, PBETA = 0. : GIVES PURE PROJECTIONS)
137 
138 ! PLON1, PLAT1 : GEOGRAPHIC LONGITUDE, LATITUDE OF THE SOUTH-WEST
139 ! CORNER OF USEFUL DOMAIN
140 ! PLON2, PLAT2 : GEOGRAPHIC LONGITUDE, LATITUDE OF THE NORTH-EAST
141 ! CORNER OF USEFUL DOMAIN
142 ! IF ROTATION IS REQUIRED, (PLON1,PLAT1) IS SELF DETERMINED
143 ! FROM (PLONR,PLATR) AND (PLON2,PLAT2) WHEN KSOTRP = 2
144 ! IF PROJECTION IS REQUIRED, PLAT1 IS SEFL DETERMINED WHEN
145 ! KSOTRP = 2. PLON1 MUST BE GIVEN.
146 
147 ! IF ROTATION IS REQUIRED, (PLON2,PLAT2) IS SELF DETERMINED
148 ! FROM (PLONR,PLATR) AND (PLON1,PLAT1) WHEN KSOTRP = 1
149 ! IF PROJECTION IS REQUIRED, PLAT2 IS SEFL DETERMINED WHEN
150 ! KSOTRP = 1. PLON2 MUST BE GIVEN.
151 
152 ! PLON0 : GEOGRAPHIC LONGITUDE OF REFERENCE FOR THE PROJECTION
153 ! (THE VERTICAL ONE IN STEREO/LAMBERT)
154 ! WARNING :
155 ! --------- STRANGE RESULTS MAIN OCCUR IF PLON0 IS OUT OF THE
156 ! DOMAIN
157 ! PLON0 IS NOT REQUIRED WHEN KGIV0 =1 OR 3
158 ! PLAT0 : GEOGRAPHIC LATITUDE OF REFERENCE FOR THE PROJECTION
159 ! (WHERE M = 1)
160 ! PLAT0 IS NOT REQUIRED WHEN KGIV0 = 2 OR 3
161 ! PRPK : PROJECTION PARAMETER AND DEFINITION
162 ! PRPK = 10. PROJECTION TYPE SELF DETERMINED
163 ! BY MINIMIZING THE VARIATION OF THE MAP FACTOR
164 ! PRPK = 1. POLAR STEREOGRAPHIC PROJECTION
165 ! 0. < PRPK < 1. LAMBERT CONFORMAL PROJECTION WITH
166 ! CONE PARAMETER PRPK
167 ! PRPK = 0. MERCATOR CONFORMAL PROJECTION
168 ! PRPK < 0. NO PROJECTION
169 ! ON OUTPUT, PRPK CONTAINS THE EFFECTIVE PROJECTION
170 ! PARAMETER THAT HAS BEEN USED
171 ! KSOTRP : ISOTROPY PARAMETER UNDER PROJECTION
172 ! = 0, PLAT1, PLAT2 USED AS GIVEN. GRID SPACING ISOTROPY
173 ! GENERALLY NOT AVAILABLE ( PDELX DIFFERENT FORM PDELY )
174 ! = 1, GRID SPACING ISOTROPIC, PLAT1 USED AS GIVEN,
175 ! PLAT2 CHANGED (PLON2 SELF DETERMINED IF KROTEQ = 1)
176 ! = 2, GRID SPACING ISOTROPIC, PLAT2 USED AS GIVEN,
177 ! PLAT1 CHANGED (PLON1 SELF DETERMINED IF KROTEQ = 1)
178 
179 ! KGIV0 : CHOICE OF REFERENCE POINT FOR PROJECTION
180 ! = 0, PLAT0 AND PLON0 USED AS GIVEN
181 ! = 1, PLAT0 REQUIRED, PLON0 SELF DETERMINED
182 ! = 2, PLON0 REQUIRED, PLAT0 SELF DETERMINED
183 ! = 3, PLAT0 AND PLON0 SELF DETERMINED
184 
185 ! KDLSA:KDLSUR : LOWER AND UPPER FIRST DIMENSIONS OF ARRAYS (X)
186 ! KDGSA:KDGEN : LOWER AND UPPER SECOND DIMENSIONS OF ARRAYS (Y)
187 
188 ! KDLUN:KDLUX : LOWER AND UPPER FIRST DIMENSIONS OF
189 ! THE DOMAIN OF INTEREST, WHERE ARRAYS ARE
190 ! INITIALIZED.
191 ! KDGUN:KDGUX : LOWER AND UPPER SECOND DIMENSIONS OF
192 ! THE DOMAIN OF INTEREST, WHERE ARRAYS ARE
193 ! INITIALIZED.
194 ! TOGETHER WITH THE CORNERS OF THE DOMAIN, THESE
195 ! DEFINE THE GRID RESOLUTION
196 
197 ! KULOUT : UNIT OF OUTPUT FILE
198 
199 ! IMPLICIT INPUT
200 ! --------------
201 ! NONE
202 ! THIS IS AN ENVIRONMENT INDEPENDENT SUBROUTINE
203 
204 ! OTHER INPUT OR EXTERNALS
205 ! -------------------------
206 ! ALL MANNER OF TRIGONOMETRIC FUNCTIONS AND LOGARITHMS
207 ! CALLS EGGMLT TO COMPUTE MISSING LATITUDE WHEN KSOTRP > 0
208 ! CALLS EGGRVS TO DEDUCE GEOGRAPHIC PARAMETERS FROM FINAL
209 ! PROJECTION AND ROTATION PARAMETERS.
210 
211 ! AFTER A FIRST CALL TO EGGX, ROUTINE EGGRVS CAN BE RE-CALLED
212 ! EXTERNALLY WITH DIFFERENT (PROJECTED OR) ROTATED POSITIONS
213 
214 ! OUTPUT PARAMETERS
215 ! -----------------
216 ! PGELAM(KDLSA:KDLSUR,KDGSA:KDGEN) :
217 ! GEOGRAPHIC LONGITUDE
218 ! PGELAT(KDLSA:KDLSUR,KDGSA:KDGEN) :
219 ! GEOGRAPHIC LATITUDE
220 ! PGM(KDLSA:KDLSUR,KDGSA:KDGSUR) : MAP FACTOR
221 ! PGNORX(KDLSA:KDLSUR,KDGSA:KDGEN) :
222 ! PROJECTION OF GEOGRAPHICAL NORTH UNIT VECTOR ON X AXIS
223 ! PGNORY(KDLSA:KDLSUR,KDGSA:KDGEN) :
224 ! PROJECTION OF GEOGRAPHICAL NORTH UNIT VECTOR ON Y AXIS
225 
226 ! PDELX : GRID SIZE IN M ALONG X IF PROJECTION
227 ! LONGITUDE INCREMENT IN RD IF SPHERICAL GEOMETRY
228 ! NECESSARY TO COMPUTE PERIOD AND DERIVATIVES
229 ! PDELY : GRID SIZE IN M ALONG Y IF PROJECTION
230 ! LATITUDE INCREMENT IN RD IF SPEHRICAL GEOMETRY
231 
232 ! WRITTEN BY
233 ! ---------- ALAIN JOLY
234 
235 ! NEW NORTHERN HEMISPHERE VERSION : 27/2/92
236 ! SOUTHERN HEM ISPHERE VERSION : 27/1/93
237 
238 !---------------------------------------------------------------------
239 
240 USE parkind1 ,ONLY : jpim ,jprb
241 USE yomhook ,ONLY : lhook, dr_hook
242 
243 USE yemggcm , ONLY : nymggi ,nymggr ,nymggwh ,xlatr ,&
244  & xlonr ,xggpk ,xrpksm ,xlat0r ,xlon0r ,&
245  & xlon0u ,xipore ,xjpore ,xggm0 ,xlon1r ,&
246  & xlon1u ,xlat1r ,xlon2r ,hsud ,xbeta
247 
248 !---------------------------------------------------------------------
249 
250 IMPLICIT NONE
251 
252 INTEGER(KIND=JPIM),INTENT(IN) :: KDLSA
253 INTEGER(KIND=JPIM),INTENT(IN) :: KDLSUR
254 INTEGER(KIND=JPIM),INTENT(IN) :: KDGSA
255 INTEGER(KIND=JPIM),INTENT(IN) :: KDGEN
256 REAL(KIND=JPRB) ,INTENT(IN) :: PRPI
257 REAL(KIND=JPRB) ,INTENT(IN) :: PRA
258 INTEGER(KIND=JPIM),INTENT(IN) :: KROTEQ
259 REAL(KIND=JPRB) ,INTENT(INOUT) :: PLONR
260 REAL(KIND=JPRB) ,INTENT(INOUT) :: PLATR
261 REAL(KIND=JPRB) ,INTENT(IN) :: PBETA
262 REAL(KIND=JPRB) ,INTENT(INOUT) :: PLON1
263 REAL(KIND=JPRB) ,INTENT(INOUT) :: PLAT1
264 REAL(KIND=JPRB) ,INTENT(INOUT) :: PLON2
265 REAL(KIND=JPRB) ,INTENT(INOUT) :: PLAT2
266 REAL(KIND=JPRB) ,INTENT(INOUT) :: PLON0
267 REAL(KIND=JPRB) ,INTENT(INOUT) :: PLAT0
268 REAL(KIND=JPRB) ,INTENT(INOUT) :: PRPK
269 INTEGER(KIND=JPIM),INTENT(IN) :: KULOUT
270 INTEGER(KIND=JPIM),INTENT(INOUT) :: KSOTRP
271 INTEGER(KIND=JPIM),INTENT(IN) :: KGIV0
272 REAL(KIND=JPRB) ,INTENT(OUT) :: PGELAM(kdlsa:kdlsur,kdgsa:kdgen)
273 REAL(KIND=JPRB) ,INTENT(OUT) :: PGELAT(kdlsa:kdlsur,kdgsa:kdgen)
274 REAL(KIND=JPRB) ,INTENT(OUT) :: PGM(kdlsa:kdlsur,kdgsa:kdgen)
275 REAL(KIND=JPRB) ,INTENT(OUT) :: PGNORX(kdlsa:kdlsur,kdgsa:kdgen)
276 REAL(KIND=JPRB) ,INTENT(OUT) :: PGNORY(kdlsa:kdlsur,kdgsa:kdgen)
277 INTEGER(KIND=JPIM),INTENT(IN) :: KDLUN
278 INTEGER(KIND=JPIM),INTENT(IN) :: KDLUX
279 INTEGER(KIND=JPIM),INTENT(IN) :: KDGUN
280 INTEGER(KIND=JPIM),INTENT(IN) :: KDGUX
281 REAL(KIND=JPRB) ,INTENT(OUT) :: PDELX
282 REAL(KIND=JPRB) ,INTENT(OUT) :: PDELY
283 
284 !---------------------------------------------------------------------
285 
286 INTEGER(KIND=JPIM) :: INBESS, INNEGA, ISPECA, ITERK, ITERKX, JLAT, JLON
287 INTEGER(KIND=JPIM) :: ISOTRP
288 
289 LOGICAL :: LLGWH, LL510, LL520
290 LOGICAL :: LLPLANEX
291 LOGICAL :: LLPLANEY
292 
293 REAL(KIND=JPRB) :: ZCONDEG, ZCONRAD, ZCOSA, ZCOSO, ZDCLA0, ZDCLA1,&
294  & ZDCLA2, ZDLON, ZDM, ZDMMAX, ZDMMIN, ZDRK, &
295  & ZDTLAT, ZFACE, ZIPV, ZJPV, ZLAT, ZLAT2R, &
296  & ZLATLIM, ZLON, ZLON2U, ZPIS2, ZPIS4, ZRKAX, &
297  & ZRKI, ZRKII, ZRKIN, ZRKOLD, ZRKT, ZRPK, ZSECAN, &
298  & ZSECUR, ZSINA, ZSINO, ZUSKP
299 REAL(KIND=JPRB) :: ZHOOK_HANDLE
300 
301 !---------------------------------------------------------------------
302 
303 #include "eggmlt.h"
304 #include "eggrvs.h"
305 
306 #include "abor1.intfb.h"
307 
308 !---------------------------------------------------------------------
309 IF (lhook) CALL dr_hook('EGGX',0,zhook_handle)
310 !---------------------------------------------------------------------
311 
312 zpis2 = prpi*0.5_jprb
313 zpis4 = prpi*0.25_jprb
314 zsecur = 1.e-12_jprb
315 zsecan = 1.e-05_jprb
316 
317 !*
318 !---------------------------------------------------------------------
319 ! 1.- PRINTING INPUT PARAMETERS
320 zconrad = prpi/180._jprb
321 zcondeg = 180._jprb/prpi
322 
323 WRITE (kulout,*) ' '
324 WRITE (kulout,*) ' ---------------------------------- '
325 WRITE (kulout,*) ' '
326 WRITE (kulout,*) ' ARPEGE-ALADIN '
327 WRITE (kulout,*) ' '
328 WRITE (kulout,*) ' GEOGRAPHY OF GRID-POINTS '
329 WRITE (kulout,*) ' '
330 WRITE (kulout,*) ' ---------------------------------- '
331 WRITE (kulout,*) ' '
332 WRITE (kulout,*) ' INPUT PARAMETERS '
333 WRITE (kulout,*) ' '
334 WRITE (kulout,*) ' PI = ',prpi
335 WRITE (kulout,*) ' RADIUS OF PLANET A = ',pra*1.e-03_jprb,' KM '
336 WRITE (kulout,*) ' '
337 WRITE (kulout,*) ' X-SIZE OF ARRAYS ',kdlsur-kdlsa+1
338 WRITE (kulout,*) ' Y-SIZE OF ARRAYS ',kdgen-kdgsa+1
339 WRITE (kulout,*) ' '
340 WRITE (kulout,*) ' X WINDOW KDLUN = ',kdlun,' KDLUX = ',kdlux
341 WRITE (kulout,*) ' SIZE = ',kdlux-kdlun+1
342 WRITE (kulout,*) ' Y WINDOW KDGUN = ',kdgun,' KDGUX = ',kdgux
343 WRITE (kulout,*) ' SIZE = ',kdgux-kdgun+1
344 WRITE (kulout,*) ' '
345 WRITE (kulout,*) ' ROTATION PARAMETER KROTEQ = ',kroteq
346 WRITE (kulout,*) ' PLONR = ',plonr
347 WRITE (kulout,*) ' PLATR = ',platr
348 WRITE (kulout,*) ' '
349 WRITE (kulout,*) ' ANGLE WITH X/LATITUDE AT PLON0 = ',pbeta
350 WRITE (kulout,*) ' '
351 WRITE (kulout,*) ' SW CORNER PLON1 = ',plon1
352 WRITE (kulout,*) ' PLAT1 = ',plat1
353 WRITE (kulout,*) ' '
354 WRITE (kulout,*) ' NE CORNER PLON2 = ',plon2
355 WRITE (kulout,*) ' PLAT2 = ',plat2
356 WRITE (kulout,*) ' '
357 WRITE (kulout,*) ' PROJECTION PARAMETER PRPK = ',prpk
358 WRITE (kulout,*) ' REF POINT PLON0 = ',plon0
359 WRITE (kulout,*) ' PLAT0 = ',plat0
360 WRITE (kulout,*) ' '
361 WRITE (kulout,*) ' ISOTROPY PARAMETER KSOTRP = ',ksotrp
362 WRITE (kulout,*) ' '
363 WRITE (kulout,*) ' PROJECTION REF POINT KGIV0 = ',kgiv0
364 WRITE (kulout,*) ' '
365 WRITE (kulout,*) ' ---------------------------------- '
366 WRITE (kulout,*) ' '
367 
368 !* have a look whether we calculate plane model version
369 llplanex = kdlun == kdlux
370 llplaney = kdgun == kdgux
371 
372 IF( llplanex.OR.llplaney )THEN
373  isotrp = ksotrp
374  ksotrp = 0
375  WRITE (kulout,*) '!'
376  WRITE (kulout,*) 'YOU RUN PLANE MODEL'
377  WRITE (kulout,*) 'KSOTRP LOCALLY RESET TO 0 (ISOTROPIC PARAMETER) '
378  WRITE (kulout,*) 'ISOTROPY PARAMETER KSOTRP = ',ksotrp
379  WRITE (kulout,*) '!'
380 ENDIF
381 
382 ! SECURITY CORRECTIONS
383 IF ( kroteq == 0 ) THEN
384  plonr = 0.0_jprb
385  platr = 0.0_jprb
386 ENDIF
387 IF ( prpk < 0.0_jprb ) THEN
388  plon0 = plonr
389  plat0 = platr
390 ENDIF
391 ! CHECK LONGITUDES
392 IF ( kroteq == 1 ) THEN
393  IF ( plonr < 0.0_jprb ) THEN
394  plonr = plonr + 2.0_jprb*prpi
395  WRITE (kulout,*) ' *** EGGX ERROR *** WRONG CONVENTION',&
396  & ' USED FOR LONGITUDES '
397  WRITE (kulout,*) ' *** NEW PLONR = ',plonr
398  ENDIF
399 ENDIF
400 IF ( plon1 < 0.0_jprb ) THEN
401  plon1 = plon1 + 2.0_jprb*prpi
402  WRITE (kulout,*) ' *** EGGX ERROR *** WRONG CONVENTION',&
403  & ' USED FOR LONGITUDES '
404  WRITE (kulout,*) ' *** NEW PLON1 = ',plon1
405 ENDIF
406 IF ( plon2 < 0.0_jprb ) THEN
407  plon2 = plon2 + 2.0_jprb*prpi
408  WRITE (kulout,*) ' *** EGGX ERROR *** WRONG CONVENTION',&
409  & ' USED FOR LONGITUDES '
410  WRITE (kulout,*) ' *** NEW PLON2 = ',plon2
411 ENDIF
412 IF ( kgiv0 == 0.OR. kgiv0 == 2 ) THEN
413  IF ( plon0 < 0.0_jprb ) THEN
414  plon0 = plon0 + 2.0_jprb*prpi
415  WRITE (kulout,*) ' *** EGGX ERROR *** WRONG CONVENTION',&
416  & ' USED FOR LONGITUDES '
417  WRITE (kulout,*) ' *** NEW PLON0 = ',plon0
418  ENDIF
419 ENDIF
420 
421 nymggr = kroteq
422 xlatr = platr
423 xlonr = plonr
424 xbeta = pbeta
425 !*
426 !--------------------------------------------------------------------
427 ! 2.- ROTATION TO EQUATOR
428 
429 hsud = 1.0_jprb
430 IF ( kroteq == 0 ) THEN
431  ! SOUTH HEMISPHERE DETECTION
432  IF ( prpk == 10._jprb .OR. (prpk > 0.0_jprb .AND. prpk <= 1.0_jprb) ) THEN
433  ! WHEN PROJECTION IS UNKNOWN, IF ONE OF THE REQUESTED LATITUDE IS
434  ! NEGATIVE, A GUESS FOR THE OTHER MUST BE PROVIDED : SO BOTH PLAT1
435  ! AND PLAT2 ARE ASSUMED KNOWN
436  IF ( ksotrp == 0 ) THEN
437  IF ( plat1 < 0.0_jprb .AND. plat2 < 0.0_jprb ) THEN
438  hsud = -1.0_jprb
439  plat1 = abs(plat1)
440  plat2 = abs(plat2)
441  ENDIF
442  ELSEIF (ksotrp == 1 ) THEN
443  IF ( plat1 < 0.0_jprb ) THEN
444  IF ( zpis2 >= plat2.AND. plat2 >= -zpis2 ) THEN
445  IF ( plat2 < 0.0_jprb ) THEN
446  hsud = -1.0_jprb
447  plat1 = abs(plat1)
448  plat2 = abs(plat2)
449  ELSEIF ( prpk == 10._jprb .AND. plat2 >= 0.0_jprb ) THEN
450  prpk = 0.0_jprb
451  ELSE
452  WRITE (kulout,*) ' *** EGGX WARNING *** ',&
453  & ' YOU SHOULD USE MERCATOR PROJECTION '
454  ENDIF
455  ELSEIF ( prpk /= 10._jprb ) THEN
456  hsud = -1.0_jprb
457  plat1 = abs(plat1)
458  ELSE
459  WRITE (kulout,*) ' *** EGGX ERROR *** ',&
460  & ' REFERENCE POLE (HSUD) CANNOT BE DECIDED '
461  WRITE (kulout,*) ' RERUN WITH A REASONABLE GUESS ',' FOR PLAT2 '
462  CALL abor1(' EGGX: abor1 2.1')
463  ENDIF
464  ENDIF
465 
466  ELSEIF ( ksotrp == 2 ) THEN
467  IF ( plat2 < 0.0_jprb ) THEN
468  IF ( zpis2 >= plat1.AND. plat1 >= -zpis2 ) THEN
469  IF ( plat1 < 0.0_jprb ) THEN
470  hsud = -1.0_jprb
471  plat1 = abs(plat1)
472  plat2 = abs(plat2)
473  ELSEIF ( plat1 >= 0.0_jprb ) THEN
474  WRITE (kulout,*) ' *** EGGX ERROR *** ',&
475  & ' PLAT1 CANNOT BE GREATER THAN PLAT2 '
476  WRITE (kulout,*) ' RERUN WITH A REASONABLE GUESS ',' FOR PLAT1 '
477  CALL abor1(' EGGX: abor1 2.2')
478  ENDIF
479  ELSEIF ( prpk /= 10._jprb ) THEN
480  hsud = -1.0_jprb
481  plat2 = abs(plat2)
482  ELSE
483  WRITE (kulout,*) ' *** EGGX ERROR *** ',&
484  & ' REFERENCE POLE (HSUD) CANNOT BE DECIDED '
485  WRITE (kulout,*) ' RERUN WITH A REASONABLE GUESS ',' FOR PLAT1 '
486  CALL abor1(' EGGX: abor1 2.3')
487  ENDIF
488  ENDIF
489  ENDIF
490 
491  ENDIF
492 
493  IF ( hsud < 0.0_jprb ) THEN
494  plat0 = abs( plat0 )
495  ENDIF
496 
497  ! NO ROTATION
498  xlon1r =mod(plon1,2.0_jprb*prpi)
499  IF ( ksotrp /= 2 ) xlat1r = plat1
500  xlon2r = mod(plon2,2.0_jprb*prpi)
501  IF ( ksotrp /= 1 ) zlat2r = plat2
502  IF ( kgiv0 == 0.OR. kgiv0 == 2 ) xlon0r = plon0
503  IF ( kgiv0 == 0.OR. kgiv0 == 1 ) xlat0r = plat0
504 
505 ELSE
506  ! ROTATION
507  IF ( ksotrp == 0.OR. ksotrp == 1 ) THEN
508  ! ROTATION OF SW CORNER
509  ! ----------------------
510  zsina = cos( platr )*sin( plat1 )&
511  & - sin( platr )*cos( plat1 )*cos( plon1-plonr )
512  xlat1r = asin( zsina )
513  IF ( abs( xlat1r ) >= zpis2 ) THEN
514  xlon1r = 0.0_jprb
515  ELSE
516  zcosa = cos( xlat1r )
517  zcoso = ( sin( platr )*sin( plat1 ) +&
518  & cos( platr )*cos( plat1 )*cos( plon1-plonr ) )/zcosa
519  zcoso = min(1.0_jprb,max(-1.0_jprb,zcoso))
520  zsino = ( cos( plat1 )*sin( plon1-plonr ) )/zcosa
521  zsino = min(1.0_jprb,max(-1.0_jprb,zsino))
522  xlon1r = acos( zcoso )
523  IF ( asin( zsino ) < 0.0_jprb ) xlon1r = 2.0_jprb*prpi - xlon1r
524  ENDIF
525  ENDIF
526 
527  IF ( ksotrp == 0.OR. ksotrp == 2 ) THEN
528  ! ROTATION OF NE CORNER
529  ! ----------------------
530  zsina = cos( platr )*sin( plat2 )&
531  & - sin( platr )*cos( plat2 )*cos( plon2-plonr )
532  zlat2r = asin( zsina )
533  IF ( abs( zlat2r ) >= zpis2 ) THEN
534  xlon2r = 0.0_jprb
535  ELSE
536  zcosa = cos( zlat2r )
537  zcoso = ( sin( platr )*sin( plat2 ) +&
538  & cos( platr )*cos( plat2 )*cos( plon2-plonr ) )/zcosa
539  zcoso = min(1.0_jprb,max(-1.0_jprb,zcoso))
540  zsino = ( cos( plat2 )*sin( plon2-plonr ) )/zcosa
541  zsino = min(1.0_jprb,max(-1.0_jprb,zsino))
542  xlon2r = acos( zcoso )
543  IF ( asin( zsino ) < 0.0_jprb ) xlon2r = 2.0_jprb*prpi - xlon2r
544  ENDIF
545  ENDIF
546 
547  ! ROTATION OF PROJECTION REFERENCE POINT
548  ! --------------------------------------
549  IF ( kgiv0 == 2 ) THEN
550  WRITE (kulout,*) ' *** EGGX ERROR '
551  WRITE (kulout,*) ' KGIV0 = 2 IMPOSSIBLE WITH KROTEQ = 1 '
552  CALL abor1(' EGGX: abor1 2.4')
553  ENDIF
554  IF ( kgiv0 == 0.OR. kgiv0 == 1 ) THEN
555  zsina = cos( platr )*sin( plat0 )&
556  & - sin( platr )*cos( plat0 )*cos( plon0-plonr )
557  xlat0r = asin( zsina )
558  ENDIF
559  IF ( kgiv0 == 0 ) THEN
560  IF ( abs( xlat0r ) >= zpis2 ) THEN
561  xlon0r = 0.0_jprb
562  ELSE
563  zcosa = max( cos( xlat0r ) , zsecur )
564  zcoso = ( sin( platr )*sin( plat0 ) +&
565  & cos( platr )*cos( plat0 )*cos( plon0-plonr ) )/zcosa
566  zcoso = min(1.0_jprb,max(-1.0_jprb,zcoso))
567  zsino = ( cos( plat0 )*sin( plon0-plonr ) )/zcosa
568  zsino = min(1.0_jprb,max(-1.0_jprb,zsino))
569  xlon0r = acos( zcoso )
570  IF ( asin( zsino ) < 0.0_jprb ) xlon0r = 2.0_jprb*prpi - xlon0r
571  ENDIF
572  ENDIF
573 ENDIF
574 
575 IF ( kroteq /= 0 ) THEN
576  IF ( prpk > 0.0_jprb ) THEN
577  WRITE (kulout,*) ' *** EGGX WARNING ',&
578  & ' USE OF ROTATION + NON-MERCATOR PROJECTION WILL LEAD ',&
579  & ' TO UNPREDICTABLE RESULTS, ESP. IN SOUTH HEMISPHERE '
580  IF ( xlat1r < 0.0_jprb .AND. zlat2r < 0.0_jprb ) THEN
581  hsud = -1.0_jprb
582  xlat1r = abs( xlat1r )
583  zlat2r = abs( zlat2r )
584  xlat0r = abs( xlat0r )
585  ENDIF
586  ENDIF
587 ENDIF
588 
589 WRITE (kulout,*) ' '
590 WRITE (kulout,*) ' HEMISPHERE INDICATOR HSUD = ',hsud
591 WRITE (kulout,*) ' '
592 WRITE (kulout,*) ' ROTATED COORDINATES '
593 WRITE (kulout,*) ' SW CORNER XLON1R = ',xlon1r
594 WRITE (kulout,*) ' XLAT1R = ',xlat1r
595 WRITE (kulout,*) ' '
596 WRITE (kulout,*) ' NE CORNER XLON2R = ',xlon2r
597 WRITE (kulout,*) ' ZLAT2R = ',zlat2r
598 WRITE (kulout,*) ' '
599 WRITE (kulout,*) ' REF POINT XLON0R = ',xlon0r
600 WRITE (kulout,*) ' XLAT0R = ',xlat0r
601 WRITE (kulout,*) ' '
602 
603 !*
604 !--------------------------------------------------------------------
605 ! 3.- SPHERICAL GEOMETRY
606 
607 IF ( prpk < 0.0_jprb ) THEN
608 
609  ! THE GRID IS MADE UP OF REGULARLY SPACED POINTS IN LONGITUDE (X)
610  ! AND LATITUDE (Y) CORRDINATES
611 
612  ! PDELX AND PDELY ARE NON DIMENSIONNAL IN THAT CASE
613 
614  IF ( ksotrp == 0 ) THEN
615  xlon1u = xlon1r
616  zlon2u = xlon2r
617  IF ( zlon2u < xlon1u ) zlon2u = 2.0_jprb*prpi + zlon2u
618  ENDIF
619  ! DEFINES OTHER CORNER
620  IF ( ksotrp == 1 ) THEN
621  xlon1u = xlon1r
622  zlat2r = - xlat1r
623  zlon2u = xlon1u + ( zlat2r-xlat1r )*&
624  & REAL(kdlux-kdlun,jprb)/REAL(KDGUX-KDGUN,JPRB)
625  xlon2r = zlon2u
626  IF ( zlon2u >= 2.0_jprb*prpi ) xlon2r = zlon2u - 2.0_jprb*prpi
627  ENDIF
628  IF ( ksotrp == 2 ) THEN
629  zlon2u = xlon2r
630  xlat1r = - zlat2r
631  xlon1u = zlon2u - ( zlat2r-xlat1r )*&
632  & REAL(kdlux-kdlun,jprb)/REAL(KDGUX-KDGUN,JPRB)
633  xlon1r = xlon1u
634  IF ( xlon1u >= 2.0_jprb*prpi ) xlon1r = xlon1u - 2.0_jprb*prpi
635  ENDIF
636 
637  IF( .NOT.llplanex.AND..NOT.llplaney )THEN
638  pdelx = ( zlon2u-xlon1u )/REAL( kdlux-kdlun ,jprb)
639  pdely = ( zlat2r-xlat1r )/REAL( kdgux-kdgun ,jprb)
640  ELSEIF( llplanex )THEN
641  pdely = ( zlat2r-xlat1r )/REAL( kdgux-kdgun )
642  pdelx = pdely
643  ELSEIF( llplaney )THEN
644  pdelx = ( zlon2u-xlon1u )/REAL( kdlux-kdlun )
645  pdely = pdelx
646  ENDIF
647 
648  xipore=0.0_jprb
649  xjpore=0.0_jprb
650  xrpksm=prpk
651  xggpk = prpk
652  nymggi = 10
653 
654  DO jlat = kdgun, kdgux
655  zlat = REAL(jlat-kdgun,jprb)*PDELY
656 
657  DO jlon = kdlun, kdlux
658  zlon = REAL(jlon-kdlun,jprb)*PDELX
659  pgelam(jlon,jlat) = zlon
660  pgelat(jlon,jlat) = zlat
661  ENDDO
662 
663  CALL eggrvs (prpi, pra, pdelx, pdely, kdlsur-kdlsa+1,&
664  & 1, kdlux-kdlun+1, kulout,&
665  & pgelam(kdlun,jlat), pgelat(kdlun,jlat), pgm(kdlun,jlat),&
666  & pgnorx(kdlun,jlat), pgnory(kdlun,jlat))
667  ENDDO
668 ENDIF
669 
670 !*
671 !--------------------------------------------------------------------
672 ! 4.- MAP FACTOR ON SPHERICAL GEOMETRY
673 
674 !*
675 !--------------------------------------------------------------------
676 ! 5.- PREPARATION OF PROJECTION PARAMETERS
677 
678 IF ( prpk >= 0.0_jprb ) THEN
679 
680  ! PROJECTION LONGITUDES ARE ALWAYS KNOWN
681 
682  ! SPECIAL LOGICAL TRUE WHEN DOMAIN ASTRIDE GREENWICH MERIDIAN
683  ! LLGWH = .F. : GREENWICH OUT OF DOMAIN
684  ! LLGWH = .T. : GREENWICH WITHIN DOMAIN
685  llgwh = ( xlon2r < xlon1r )
686  nymggwh = 0
687  IF ( llgwh ) nymggwh = 1
688  ! SHIFT LONGITUDES WHEN GREENWICH MERIDIAN IS WITHIN THE DOMAIN
689  xlon1u = xlon1r
690  zlon2u = xlon2r
691  IF ( llgwh ) THEN
692  zlon2u = xlon2r + 2.0_jprb*prpi
693  ENDIF
694 
695  IF ( kgiv0 == 1.OR. kgiv0 == 3 ) THEN
696  IF ( abs(abs(zlon2u-xlon1u)-prpi) > zsecan ) THEN
697  WRITE (kulout,*) ' NORMAL LONGITUDE DIFFERENCE '
698  xlon0u = 0.5_jprb*( xlon1u + zlon2u )
699  xlon0r = xlon0u
700  ELSE
701  WRITE (kulout,*) ' LONGITUDE DIFFERENCE = PI '
702  xlon0u = xlon1u + zpis4
703  xlon0r = xlon0u
704  ENDIF
705  IF ( xlon0u >= 2.0_jprb*prpi ) xlon0r = xlon0r - 2.0_jprb*prpi
706  WRITE (kulout,*) ' '
707  WRITE (kulout,*) ' PROJECTION REFERENCE LONGITUDE '
708  WRITE (kulout,*) ' (ON ROTATED SPHERE) LON0R = ',xlon0r
709  WRITE (kulout,*) ' GREENWICH LOGICAL = ',llgwh
710  WRITE (kulout,*) ' '
711  ENDIF
712 
713  xlon0u = xlon0r
714  IF ( llgwh .AND. xlon0r < xlon1r ) THEN
715  xlon0u = xlon0r + 2.0_jprb*prpi
716  ENDIF
717 
718  ! PROJECTION TYPE IS GIVEN BY THE USER
719  ! ------------------------------------
720 
721  IF ( prpk <= 1.0_jprb ) THEN
722 
723  ! DETERMINES MISSING LATITUDE IF ANY
724  IF ( ksotrp >= 1 ) THEN
725 
726  ! ADJUSTMENT OF ONE EXTREME LATITUDE IN ORDER TO HAVE PDELX = PDELY
727  CALL eggmlt (prpi,kdlux,kdlun,kdgux,kdgun,kulout,1,&
728  & prpk,xlon0u,xlon1u,zlon2u,ksotrp,xlat1r,zlat2r,&
729  & hsud,xbeta)
730 
731  ENDIF
732 
733  ! DETERMINES REFERENCE LATITUDE
734 
735  IF ( kgiv0 == 2.OR. kgiv0 == 3 ) THEN
736  xlat0r = 0.5_jprb*( zlat2r + xlat1r )
737  xlat0r = min(zpis2,max(-zpis2,xlat0r))
738  WRITE (kulout,*) ' '
739  WRITE (kulout,*) ' PROJECTION REFERENCE LATITUDE ',&
740  & ' (ON ROTATED SPHERE) '
741  WRITE (kulout,*) ' LAT0R = ',xlat0r
742  WRITE (kulout,*) ' '
743  ENDIF
744 
745  ENDIF
746 
747  ! MAP PROJECTION TYPE AND POSSIBLY ONE CORNER MUST BE DETERMINED
748  ! --------------------------------------------------------------
749  IF ( prpk == 10._jprb ) THEN
750 
751  ! EXPLORE VARIATIONS OF MAP FACTOR
752  ! --------------------------------
753 
754  zlatlim = prpi/6._jprb
755  ! FIRST GUESS : EITHER STEREO OR MERCATOR
756  IF ( ksotrp == 0 ) THEN
757  zrpk = 1.0_jprb
758  IF ( xlat1r < zlatlim ) zrpk = 0.0_jprb
759  ELSEIF ( ksotrp == 1 ) THEN
760  zrpk = 1.0_jprb
761  IF ( xlat1r < zlatlim ) zrpk = 0.0_jprb
762  ELSEIF ( ksotrp == 2 ) THEN
763  zrpk = 1.0_jprb
764  IF ( zlat2r < zlatlim ) zrpk = 0.0_jprb
765  ENDIF
766 
767  ! FIRST GUESS POSSIBLE OTHER LATITUDE
768  IF ( ksotrp >= 1 ) THEN
769  CALL eggmlt (prpi,kdlux,kdlun,kdgux,kdgun,kulout,1,&
770  & zrpk,xlon0u,xlon1u,zlon2u,ksotrp,xlat1r,zlat2r,&
771  & hsud,xbeta)
772  ENDIF
773  ! FIRST GUESS REFERENCE LATITUDE
774  IF ( kgiv0 == 2.OR. kgiv0 == 3 ) THEN
775  xlat0r = 0.5_jprb*( zlat2r + xlat1r )
776  xlat0r = min(zpis2,max(-zpis2,xlat0r))
777  ENDIF
778 
779  ! PREPARING FOR OUTER ITERATION LOOP (RK + LATITUDE)
780  iterkx = 10
781  iterk = 0
782  zrkold = zrpk
783 
784  ll510=.true.
785 
786  DO WHILE(ll510)
787 
788  zrkii = 0.01_jprb
789  zdrk = 0.01_jprb
790  zrki = 0.0_jprb
791  ispeca = 0
792 
793  ! IDENTIFYING SPECIAL CASES THAT MUST GO INTO THE INNER LOOP
794  IF ( xlat1r*zlat2r <= 0.0_jprb ) THEN
795  ! SPECIAL CASE : DOMAIN ASTRIDE EQUATOR
796  zrpk = 0.0_jprb
797  zrkold = zrpk
798  ispeca = 1
799  ELSEIF ( hsud > 0.0_jprb .AND.abs(zlat2r) <= abs(xlat1r) ) THEN
800  ! SPECIAL CASE : DOMAIN INCLUDING NORTH POLE (THE TEST IS A WEAK ONE)
801  zrpk = 1.0_jprb
802  zrkold = zrpk
803  ispeca = 1
804  ELSEIF ( hsud < 0.0_jprb .AND.abs(xlat1r) <= abs(zlat2r) ) THEN
805  ! SPECIAL CASE : DOMAIN INCLUDING SOUTH POLE (THE TEST IS A WEAK ONE)
806  zrpk = 1.0_jprb
807  zrkold = zrpk
808  ispeca = 1
809  ELSEIF ( abs(abs(zlat2r)-zpis2) < zsecan ) THEN
810  ! VARIOUS OTHER SPECIAL CASES THAT MUST NOT COVER THE WHOLE LOOP
811  zrki = zrkii
812  ELSEIF ( abs(abs(xlat1r)-zpis2) < zsecan ) THEN
813  ! VARIOUS OTHER SPECIAL CASES THAT MUST NOT COVER THE WHOLE LOOP
814  zrki = zrkii
815  ENDIF
816 
817  IF ( ispeca /= 1 ) THEN
818 
819  ! PREPARE FOR INNER LOOP ON RK
820  zdmmax = -1.0_jprb
821  zdmmin = 1.e+05_jprb
822  zrkax = 1.0_jprb
823  zrkin = 1.0_jprb
824  innega = 0
825  inbess = 0
826  zrkt = zrki
827 
828  ! INNER LOOP ON RK
829 
830  ll520=.true.
831 
832  DO WHILE(ll520)
833  ! COMPUTES MAP FACTOR VARIATION FOR VARIOUS PROJECTION
834  IF ( zrkt == 0.0_jprb ) THEN
835  zdm = cos(xlat0r)/cos(zlat2r) - cos(xlat0r)/cos(xlat1r)
836  ELSEIF ( zrkt /= 1.0_jprb ) THEN
837  zdm = (cos(xlat0r)**(1.0_jprb-zrkt))*&
838  & ((1.0_jprb+sin(xlat0r))**zrkt)*( (cos(xlat1r)**(zrkt-1.0_jprb))*&
839  & ((1.0_jprb+sin(xlat1r))**(-zrkt)) - (cos(zlat2r)**(zrkt-1.0_jprb))*&
840  & ((1.0_jprb+sin(zlat2r))**(-zrkt)) )
841  ELSEIF ( zrkt == 1.0_jprb ) THEN
842  zdm = (1.0_jprb+sin(xlat0r))*( 1.0_jprb/(1.0_jprb+sin(xlat1r)) -&
843  & 1.0_jprb/(1.0_jprb+sin(zlat2r)) )
844  ENDIF
845  inbess = inbess + 1
846  IF ( zdm <= 0.0_jprb ) THEN
847  innega = innega + 1
848  ENDIF
849  IF ( zdm >= zdmmax .AND. zdm > 0.0_jprb ) THEN
850  zdmmax = zdm
851  zrkax = zrkt
852  ENDIF
853  IF ( zdm <= zdmmin .AND. zdm > 0.0_jprb ) THEN
854  zdmmin = zdm
855  zrkin = zrkt
856  ENDIF
857  zrkt = zrkt + zdrk
858  ll520=(zrkt <= 1.0_jprb)
859  ENDDO ! DO WHILE(LL520)
860 
861  WRITE (kulout,*) ' '
862  WRITE (kulout,*) ' CHOICE OF OPTIMAL RK ITERATION ',iterk
863  WRITE (kulout,*) ' PREVIOUS RK ',zrkold
864  WRITE (kulout,*) ' TEST OVER ',inbess,' VALUES '
865  WRITE (kulout,*) ' INCLUDING ',innega,' NEGATIVE VALUES'
866  WRITE (kulout,*) ' RK MINI = ',zrki,' INCRMENT = ',zdrk
867  WRITE (kulout,*) ' '
868  WRITE (kulout,*) ' DELTA(M) MAXI = ',zdmmax,' AT RK = ',zrkax
869  WRITE (kulout,*) ' DELTA(M) MINI = ',zdmmin,' AT RK = ',zrkin
870 
871  ! UPDATES VALUE OF GUESS ZRPK
872  zrkold = zrpk
873  zrpk = zrkin
874 
875  ENDIF ! ISPECA /= 1
876 
877  IF ( ksotrp == 0 ) THEN
878  ! END THE OUTER LOOP IF BOTH LATITUDES WERE KNOWN
879  zrkold = zrpk
880  ELSEIF ( ksotrp >= 1 ) THEN
881  ! DETRMINES NEW OTHER LATITUDE
882  CALL eggmlt (prpi,kdlux,kdlun,kdgux,kdgun,kulout,1,&
883  & zrpk,xlon0u,xlon1u,zlon2u,ksotrp,xlat1r,zlat2r,&
884  & hsud,xbeta)
885  ENDIF
886  ! NEW REFERENCE LATITUDE
887  IF ( kgiv0 == 2.OR. kgiv0 == 3 ) THEN
888  xlat0r = 0.5_jprb*( zlat2r + xlat1r )
889  xlat0r = min(zpis2,max(-zpis2,xlat0r))
890  ENDIF
891 
892  ! COMPLETES INTERATION OF OUTER LOOP (RK AND LATITUDE)
893  iterk = iterk + 1
894  IF ( iterk > iterkx ) THEN
895  WRITE (kulout,*) ' *** EGGX **** TROUBLE '
896  WRITE (kulout,*) ' NO CONVERGENCE OF AUTOMATIC CHOICE '
897  CALL abor1(' EGGX: abor1 5.1')
898  ENDIF
899 
900  ll510=(abs(zrpk-zrkold) > zdrk)
901 
902  ENDDO ! DO WHILE(LL510)
903 
904  prpk = zrpk
905  WRITE (kulout,*) ' '
906  WRITE (kulout,*) ' --- EGGX AUTOMATIC CHOICE '
907  WRITE (kulout,*) ' '
908  WRITE (kulout,*) ' FINAL VALUE OF PRPK = ',prpk
909  WRITE (kulout,*) ' '
910  WRITE (kulout,*) ' PROJECTION REFERENCE LATITUDE ',&
911  & ' (ON ROTATED SPHERE) '
912  WRITE (kulout,*) ' FINAL LATITUDE LAT1 R = ',xlat1r
913  WRITE (kulout,*) ' FINAL LATITUDE LAT2 R = ',zlat2r
914  WRITE (kulout,*) ' LAT0R = ',xlat0r
915  WRITE (kulout,*) ' '
916  ENDIF
917 
918 ENDIF
919 ! MEMORIZES THE FINAL VALUE OF PRPK
920 xggpk = prpk
921 
922 !*
923 !---------------------------------------------------------------------
924 ! 6.- PROJECTION ON CARTESIAN PLAN
925 
926 ! REMARK : THE CODE IS GENERAL, BUT STEREO/LAMBERT SHOULD
927 ! NOT BE COMBINED TO ROTATION
928 
929 IF ( prpk > 1.0_jprb ) THEN
930  WRITE (kulout,*) ' *** EGGX ERROR : NON-EXISTING PROJ.'
931  CALL abor1(' EGGX: abor1 6.1')
932 ENDIF
933 
934 IF ( prpk > 0.0_jprb ) THEN
935  WRITE (kulout,*) ' STEREO OR LAMBERT PROJECTION '
936  IF ( prpk == 1.0_jprb ) WRITE (kulout,*)&
937  & ' EFFECTIVELY STREOGRAPHIC PROJECTION '
938 
939  ! COMPUTES BASIC PARAMETERS
940  ! -------------------------
941 
942  ! HALF COLATITUDE
943  zdcla1 = zpis4 - 0.5_jprb*xlat1r
944  zdcla2 = zpis4 - 0.5_jprb*zlat2r
945  zdcla0 = zpis4 - 0.5_jprb*xlat0r
946  ! PROJECTION CONSTANTS
947  IF ( prpk < 1.0_jprb ) THEN
948  xggm0 = ( cos( xlat0r )**(1.0_jprb-prpk) )*&
949  & ( ( 1.0_jprb + sin( xlat0r ) )**prpk )
950  zuskp = xggm0/prpk
951  xrpksm = 1.0_jprb/zuskp
952  ELSE
953  xggm0 = 1.0_jprb + sin( xlat0r )
954  zuskp = xggm0
955  xrpksm = 1.0_jprb/zuskp
956  ENDIF
957 
958  ! COMPUTES RESOLUTION
959  ! -------------------
960  IF( .NOT.llplanex.AND..NOT.llplaney )THEN
961  pdelx = pra*zuskp*( (tan(zdcla2)**prpk)*sin( prpk*(&
962  & zlon2u-xlon0u)-xbeta ) - (tan(zdcla1)**prpk)*&
963  & sin( prpk*(xlon1u-xlon0u)-xbeta ) )/REAL(KDLUX-KDLUN,JPRB)
964  pdely = hsud*pra*zuskp*( (tan(zdcla1)**prpk)*cos( prpk*(&
965  & xlon1u-xlon0u)-xbeta ) - (tan(zdcla2)**prpk)*&
966  & cos( prpk*(zlon2u-xlon0u)-xbeta ) )/REAL(KDGUX-KDGUN,JPRB)
967  ELSEIF( llplanex )THEN
968  pdely = hsud*pra*zuskp*( (tan(zdcla1)**prpk)*cos( prpk*(&
969  & xlon1u-xlon0u)-xbeta ) - (tan(zdcla2)**prpk)*&
970  & cos( prpk*(zlon2u-xlon0u)-xbeta ) )/REAL(KDGUX-KDGUN)
971  pdelx=pdely
972  ELSEIF( llplaney )THEN
973  pdelx = pra*zuskp*( (tan(zdcla2)**prpk)*sin( prpk*(&
974  & zlon2u-xlon0u)-xbeta ) - (tan(zdcla1)**prpk)*&
975  & sin( prpk*(xlon1u-xlon0u)-xbeta ) )/REAL(KDLUX-KDLUN)
976  pdely = pdelx
977  ENDIF
978 
979  WRITE (kulout,*) ' '
980  WRITE (kulout,*) ' MAP FACTOR BASE XGGM0 = ',xggm0
981  WRITE (kulout,*) ' ZUSKP = ',zuskp
982  WRITE (kulout,*) ' '
983  WRITE (kulout,*) ' X GRID SIZE (KM) = ',pdelx*1.e-03_jprb
984  WRITE (kulout,*) ' '
985  WRITE (kulout,*) ' Y GRID SIZE (KM) = ',pdely*1.e-03_jprb
986  WRITE (kulout,*) ' '
987 
988  ! COMPUTES POLE LOCATION ON GRID
989  ! ------------------------------
990 
991  xipore = - pra*zuskp*( tan( zdcla1 )**prpk )*&
992  & sin( prpk*(xlon1u-xlon0u)-xbeta )/pdelx
993  xjpore = hsud*pra*zuskp*( tan( zdcla1 )**prpk )*&
994  & cos( prpk*(xlon1u-xlon0u)-xbeta )/pdely
995  nymggi = 10
996 
997  WRITE (kulout,*) ' '
998  WRITE (kulout,*) ' POLE LOCATION ON GRID IP = ',xipore,' JP = ',xjpore
999 
1000  zipv = REAL( KDLUX ,JPRB) - PRA*ZUSKP*( tan( zdcla2 )**prpk )*&
1001  & SIN( PRPK*(ZLON2U-XLON0U)-XBETA )/PDELX - REAL(KDLUN,JPRB)
1002  ZJPV = real( kdgux ,jprb) + pra*zuskp*( tan( zdcla2 )**prpk )*&
1003  & cos( prpk*(zlon2u-xlon0u)-xbeta )*hsud/pdely -&
1004  & REAL(KDGUN,JPRB)
1005 
1006  WRITE (kulout,*) ' VRF POLE LOCATION ON GRID IP = ',zipv,' JP = ',zjpv
1007 
1008  ! GRID POINTS LOCATION
1009  ! --------------------
1010 
1011  DO jlat = kdgun, kdgux
1012 
1013  DO jlon = kdlun, kdlux
1014  pgelam(jlon,jlat) = REAL(jlon-kdlun,jprb)*PDELX
1015  pgelat(jlon,jlat) = REAL(jlat-kdgun,jprb)*PDELY
1016  ENDDO
1017 
1018  CALL eggrvs (prpi, pra, pdelx, pdely, kdlsur-kdlsa+1,&
1019  & 1, kdlux-kdlun+1, kulout,&
1020  & pgelam(kdlun,jlat), pgelat(kdlun,jlat), pgm(kdlun,jlat),&
1021  & pgnorx(kdlun,jlat), pgnory(kdlun,jlat))
1022  ENDDO
1023 
1024 ENDIF
1025 
1026 IF ( prpk == 0.0_jprb ) THEN
1027  WRITE (kulout,*) ' MERCATOR PROJECTION '
1028 
1029  ! COMPUTES BASIC PARAMETERS
1030  ! -------------------------
1031 
1032  ! HALF COLATITUDE
1033  zdcla1 = zpis4 - 0.5_jprb*xlat1r
1034  zdcla2 = zpis4 - 0.5_jprb*zlat2r
1035  zdcla0 = zpis4 - 0.5_jprb*xlat0r
1036 
1037  ! COMPUTES RESOLUTION
1038  ! -------------------
1039 
1040  zface = pra*cos( xlat0r )
1041  zdlon = zlon2u - xlon1u
1042  zdtlat = log( tan(zdcla1)/tan(zdcla2) )
1043  IF( .NOT.llplanex.AND..NOT.llplaney )THEN
1044  pdelx = zface*( zdlon*cos(xbeta) + zdtlat*sin(xbeta) )&
1045  & /REAL( KDLUX-KDLUN ,JPRB)
1046  pdely = zface*( -zdlon*sin(xbeta) + zdtlat*cos(xbeta) )&
1047  & /REAL( KDGUX-KDGUN ,JPRB)
1048  ELSEIF( llplanex )THEN
1049  pdely = zface*( -zdlon*sin(xbeta) + zdtlat*cos(xbeta) )&
1050  & /REAL( KDGUX-KDGUN )
1051  pdelx = pdely
1052  ELSEIF( llplaney )THEN
1053  pdelx = zface*( zdlon*cos(xbeta) + zdtlat*sin(xbeta) )&
1054  & /REAL( KDLUX-KDLUN )
1055  pdely = pdelx
1056  ENDIF
1057 
1058  WRITE (kulout,*) ' '
1059  WRITE (kulout,*) ' MAP FACTOR BASE COS( LAT0 ) = ',cos( xlat0r )
1060  WRITE (kulout,*) ' '
1061  WRITE (kulout,*) ' X GRID SIZE (KM) = ',pdelx*1.e-03_jprb
1062  WRITE (kulout,*) ' '
1063  WRITE (kulout,*) ' Y GRID SIZE (KM) = ',pdely*1.e-03_jprb
1064  WRITE (kulout,*) ' '
1065 
1066  ! COMPUTES EQUATOR LOCATION ON GRID
1067  ! ------------------------------
1068 
1069  xipore = - pra*cos( xlat0r )*( xlon1u-xlon0u )/pdelx
1070  xjpore = + pra*cos( xlat0r )*log(tan( zdcla1 ) )/pdely
1071  xrpksm=1.0_jprb
1072  xggpk = prpk
1073  nymggi = 10
1074 
1075  WRITE (kulout,*) ' '
1076  WRITE (kulout,*) ' EQUATOR LOCATION ON GRID IE = ',xipore,' JE = ',xjpore
1077 
1078  ! GRID POINTS LOCATION
1079  ! --------------------
1080 
1081  DO jlat = kdgun, kdgux
1082 
1083  DO jlon = kdlun, kdlux
1084  pgelam(jlon,jlat) = REAL(jlon-kdlun,jprb)*PDELX
1085  pgelat(jlon,jlat) = REAL(jlat-kdgun,jprb)*PDELY
1086  ENDDO
1087 
1088  CALL eggrvs (prpi, pra, pdelx, pdely, kdlsur-kdlsa+1,&
1089  & 1, kdlux-kdlun+1, kulout,&
1090  & pgelam(kdlun,jlat), pgelat(kdlun,jlat), pgm(kdlun,jlat),&
1091  & pgnorx(kdlun,jlat), pgnory(kdlun,jlat))
1092  ENDDO
1093 
1094 ENDIF
1095 
1096 !*
1097 !---------------------------------------------------------------------
1098 ! 7.- INVERSE ROTATION BACK TO GEOGRAPHICAL COORDINATES
1099 
1100 ! THIS OPERATION IS PERFORMED BY EGGRVS
1101 
1102 ! FINAL UPDATE OF ACTUAL CORNERS USED
1103 
1104 IF ( ksotrp == 1 ) THEN
1105  plat2 = pgelat(kdlux,kdgux)
1106  plon2 = pgelam(kdlux,kdgux)
1107 ENDIF
1108 IF ( ksotrp == 2 ) THEN
1109  plat1 = pgelat(kdlun,kdgun)
1110  plon1 = pgelam(kdlun,kdgun)
1111 ENDIF
1112 
1113 ! PLON1 AND PLON2 MUST BE BETWEEN 0 AND 2*RPI
1114 
1115 plon1=mod(plon1,2*prpi)
1116 plon2=mod(plon2,2*prpi)
1117 
1118 IF ( hsud < 0.0_jprb ) THEN
1119  IF ( ksotrp /= 2 ) THEN
1120  plat1 = hsud*plat1
1121  ENDIF
1122  IF ( ksotrp /= 1 ) THEN
1123  plat2 = hsud*plat2
1124  ENDIF
1125  plat0 = hsud*plat0
1126 ENDIF
1127 
1128 ! KSOTRP reset back to original value
1129 IF( llplanex.OR.llplaney )THEN
1130  ksotrp = isotrp
1131 ENDIF
1132 
1133 WRITE (kulout,*) ' '
1134 WRITE (kulout,*) ' ---------- '
1135 WRITE (kulout,*) ' '
1136 WRITE (kulout,*) ' EGGX IS OVER '
1137 WRITE (kulout,*) ' '
1138 WRITE (kulout,*) ' ---------- '
1139 WRITE (kulout,*) ' '
1140 WRITE (kulout,*) ' '
1141 
1142 !---------------------------------------------------------------------
1143 IF (lhook) CALL dr_hook('EGGX',1,zhook_handle)
1144 END SUBROUTINE eggx
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
subroutine eggmlt(PRPI, KDLUX, KDLUN, KDGUX, KDGUN, KULOUT, KPRINT, PRPK, PLON0U, PLON1U, PLON2U, KSOTRP, PLAT1R, PLAT2R, PHSUD, PBETA)
Definition: eggmlt.F90:4
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
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
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
real8 real
Definition: privpub.h:396
subroutine eggx(PRPI, PRA, KROTEQ, PLONR, PLATR, PBETA, PLON1, PLAT1, PLON2, PLAT2, PLON0, PLAT0, PRPK, KULOUT, KSOTRP, KGIV0, PGELAM, PGELAT, PGM, PGNORX, PGNORY, KDLSA, KDLSUR, KDGSA, KDGEN, KDLUN, KDLUX, KDGUN, KDGUX, PDELX, PDELY)
Definition: eggx.F90:7