SURFEX v8.1
General documentation of Surfex
eggpack.F90
Go to the documentation of this file.
1 MODULE eggpack
2 
3 ! Version 2009.0317 by JD GRIL
4 
5 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! DOC !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
6 
7 ! This package contains many usefull functions about Projection in "Tangent
8 !Case" for Lambert Conic Comformal, Polar Stereographic and Mercator. A Domain
9 !Maker subroutine for grid points domain defined by its center is present.
10 ! * The functions are classed in three types :
11 ! - Independants functions
12 ! - Specifics functions -| theses functions work for single point data structure
13 ! - Generics functions -| or for array of single point data structure (rank of
14 ! | array is one)
15 ! * One subroutine to make domain
16 
17 ! -1- Decription of Functions :
18 
19 ! -1.1- Independants functions :
20 
21 ! Theses functions have not direct relations with projection but are usefull
22 ! for this package.
23 
24 !->logical function RETURN_PRINT(CODE_ERR,NUM_TEST,AUTO_STOP)
25 
26 ! Return a logical to know if in case of error the the program will stop
27 ! or return an error code to the caller depending AUTO_STOP logical flag.
28 ! In every cases it prints informations (ERROR,WARNING,INFO,OK) contained in
29 ! CODE_ERR structure of type ERROR and NUM_TEST. It's used in subroutine
30 ! MAKDO. See how inside.
31 
32 !->function TYPE_PROJ(REF_COORD)
33 
34 ! Return 1 character (M,L,S) depending the coordinates of reference point
35 ! REF_COORD structure of type LOLA (in Degrees).
36 
37 !->real function POLE_IS (REF_COORD)
38 
39 ! Return pole location (South is -1.0, North is 1.0) for Polar Stereographic or
40 ! Lambert projections (return 0.0 in Mercator : no sense) depending the coor-
41 ! dinates of reference point REF_COORD structure of type LOLA (in Degrees).
42 
43 ! -1.2- Specifics functions :
44 
45 ! These functions are only used in Polar Stereographic or Lambert projection
46 ! type. Depending the type of arguments (arrays or not) the generic caller-
47 ! name defined by interface selects the good one (suffixed by _V for arrays
48 ! or _S for scalars).
49 ! All of these functions are prefixed by STPL_; they use P_PJ structure of
50 ! type PARAM_PROJ (the most important of this package) that defines the
51 ! parameters of the projection depending the reference point, see below.
52 
53 !->type (RTETA) function STPL_LATLON_TO_RTETA(PT_COORD,P_PJ,PI) result (PT_RTETA)
54 
55 !->type (LOLA) function STLP_RTETA_TO_LATLON(PT_RTETA,P_PJ,PI) result (PT_COORD)
56 
57 !->type (XY) function STLP_RTETA_TO_XY(PT_RTETA,P_PJ) result (PT_XY)
58 
59 !->type (RTETA) function STLP_XY_TO_RTETA(PT_XY,P_PJ,PI) result (PT_RTETA)
60 
61 ! These functions convert coordinates from LAT-LON (in Radians) to R-THETA
62 ! (in meters, radians) and from R-THETA to XY (in meters) and reverse. PT_???
63 ! are structures or arrays of structures. PT_XY coordinates are referenced by
64 ! STD (standard) origin that is projection of pole, the X axis is West to
65 ! East, the Y axis is South to North. PT_RTETA coordinates are referenced by
66 ! STD (standard) origin that is projection of pole, R is the distance to it,
67 ! TETA is angle with reference point longitude (negative in clockwise).
68 ! Remark -> PT_XY and PT_RTETA are on projection plane !
69 
70 ! -1.3- Generics functions :
71 
72 ! These functions are standards for all types of projections (M,L,S). the most
73 ! important is :
74 
75 !->type (PARAM_PROJ) function REF_DATAS (REF_COORD,RA,TOZERO_COORD,LRT)
76 ! result (P_P)
77 
78 ! It defines a P_P structure of type PARAM_PROJ that creates all the
79 ! parameters needs by all specifics and generics functions : this structure
80 ! defines the type of projection depending the reference point coordinates
81 ! (in Degrees, inside you have the reference point coordinates in Radians).
82 ! For all others functions, the generic caller-name selects the good one
83 ! (suffixed by _V for arrays or _S for scalars) depending the type of
84 ! arguments (arrays or not). they are three classes of functions :
85 
86 ! a) changing origin of XY type of coordinates :
87 
88 ! In Mercator projection the YX origin is the reference point, because
89 ! projection of pole is non sense.
90 
91 !->type (XY) function XY_NEW_TO_STD_ORIGIN(NEW_ORIGIN_COORD,PT_XY_IN_NEW_ORIGIN,
92 ! P_PJ,PI) result (PT_XY_IN_STD_ORIGIN)
93 
94 ! This function changes coordinates PT_XY_IN_NEW_ORIGIN (may be an array)
95 ! relative to NEW_ORIGIN_COORD (in Degrees) to STD origin (depending of
96 ! projection).
97 
98 !->type (XY) function XY_STD_TO_NEW_ORIGIN(NEW_ORIGIN_COORD,PT_XY_IN_STD_ORIGIN,
99 ! P_PJ,PI) result (PT_XY_IN_NEW_ORIGIN)
100 
101 ! This function changes coordinates PT_XY_IN_STD_ORIGIN (may be an array)
102 ! relative to STD origin (depending of projection) to NEW_ORIGIN_COORD
103 ! (in Degrees).
104 
105 ! Remark -> To pass PT_XY_IN_OLD_ORIGIN to PT_XY_IN_NEW_ORIGIN, you
106 ! can do (or create your own function) :
107 ! PT_XY_IN_NEW_ORIGIN = &
108 ! XY_STD_TO_NEW_ORIGIN(NEW_ORIGIN_COORD, &
109 ! XY_NEW_TO_STD_ORIGIN(OLD_ORIGIN_COORD,PT_XY_IN_OLD_ORIGIN,P_PJ,PI), &
110 ! P_PJ,PI)
111 
112 ! b) converting LAT-LON coordinates in XY and reverse :
113 
114 !->type (XY) function LATLON_TO_XY(PT_COORD,P_PJ,PI) result (PT_XY)
115 
116 !->type (LOLA) function XY_TO_LATLON(PT_XY,P_PJ,PI) result (PT_COORD)
117 
118 ! These functions convert coordinates from LAT-LON (in Radians) to XY (in
119 ! meters) and reverse. PT_??? are structures or arrays of structures. PT_XY
120 ! coordinates are referenced by STD (standard) origin that is projection of
121 ! pole, for Lambert or Polar Stereographic projection or reference point for
122 ! Mercator; the X axis is West to East, the Y axis is South to North.
123 ! Remark -> PT_XY is on projection plane !
124 
125 ! c) Map Factor, projection of Geographical North :
126 
127 !->real function MAP_FACTOR(PT_COORD,P_PJ,PI,RA)
128 
129 ! Compute Map Factor for PT_COORD (in Radians) (array of) structure of type
130 ! LOLA depending type of projection.
131 
132 !->type (PGN) function GN(PT_COORD,P_PJ)
133 
134 ! Compute Projection of Geographical North unit vector on XY for PT_COORD (in
135 ! Radians) (array of) structure of type LOLA depending type of projection.
136 
137 ! -2- Decription of Subroutine :
138 
139 ! Subroutine MAKDO (make domain) use CENTER point of the Domain as the Origin
140 ! of XY points.
141 
142 !->subroutine MAKDO(REF_COORD,CENTER_COORD,PDEL,NB_PTS,GRID_COORD,GRID_MF,
143 ! GRID_PGN,GRID_INFO,ERR_CODE,AUTO_STOP,PI,RA,LMRT)
144 
145 ! This subroutine creates a grid domain usefull datas depending projection.
146 ! It makes validations tests, using functions of this package computes
147 ! outputs.
148 ! The X and Y points are computed from the center in a 2 dimensional array
149 ! GRID_XY_C structure of type XY
150 ! To pass 2 dimensional arrays to one dimensional in functions we must
151 ! use the pack F90 function and unpack for the reverse because all the
152 ! functions are defined in interfaces.
153 
154 ! - Inputs-Outputs :
155 ! REF_COORD, CENTER_COORD : in Degrees in input, in Radians in output
156 ! type LOLA
157 ! defining Reference coordinates for the
158 ! projection and center coordinates of domain.
159 ! - Inputs :
160 ! PDEL : resolution in meters of the grid in projection
161 ! plane.
162 ! type DELTA
163 ! NB_PTS : number of points on X and Y
164 ! type NBPTS
165 ! - Optionals Inputs :
166 ! PI, RA : Pi and Raduis of Earth
167 ! type real
168 ! AUTO_STOP : specify if ERROR stops the program (default)
169 ! or return ERR_CODE to caller
170 ! type logical
171 ! - Outputs :
172 ! ERR_CODE : error code returned
173 ! type ERROR
174 ! GRID_INFO : informations on grid domain (projections,
175 ! reference point, center, corners, map factors)
176 ! type DOMI
177 ! GRID_COORD : grid coordinates LAT [-90.0,90.0] in Radian
178 ! LON [0.0,360.0[ in Radians
179 ! array dim = 2 : NB_PTS%ONX,NB_PTS%ONY
180 ! type LOLA
181 ! GRID_MF : grid map factor
182 ! array dim = 2 : NB_PTS%ONX,NB_PTS%ONY
183 ! type real
184 ! GRID_PGN : projection of Geographical North unit vector
185 ! on X and Y
186 ! array dim = 2 : NB_PTS%ONX,NB_PTS%ONY
187 ! type PGN
188 
189 ! Remark -> the EBETA parameter in old EGGX is fully automatic
190 ! for Lambert and Polar Stereographic : it depends only
191 ! of reference longitude. In mercator, it has non sense
192 ! because alls meridians are parallels to reference
193 ! longitude.
194 
195 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
196 ! Author : Jean-Daniel GRIL , CNRM/GMAP/EXT , March 28 2002
197 ! Modified 04-08-19 R. El Khatib & J.-D. Gril : cleanups
198 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
199 
200 ! Modifications :
201 ! _______________
202 
203 ! November 09, 2004 : JD GRIL
204 ! --------------------------
205 ! - supress of many "#define" values
206 ! - add 2 news optionals arguments in REF_DATAS :
207 ! - TOZERO_COORD coordinates of domain's center that is placed in (0,0)
208 ! coord. if Rotated-Tilted Mercator Projection is used
209 ! - LRT flag to .TRUE. if you use Rotated-Tilted Mercator Projection
210 ! The use of this flag defines a "W" value for P_P%TYPE_PJ (projection
211 ! type) and the use of EGGMRT module. The functions and MAKDO routine
212 ! was modified according this new feature.
213 ! - MAKDO has a new optional parameter to define Rotated-Tilted Mercator
214 ! Projection :
215 ! - LD_LMRT
216 
217 ! To use Rotated-Tilted Mercator projection, remember that reference coordinates
218 ! YD_REF_COORD%LAT = 0 (mercator) and YD_REF_COORD%LON is the tilting angle
219 ! of the domain (at the point of coordinate (0,0)),
220 ! after the rotation of the center of the domain (YD_CENTER_COORD coordinates)
221 ! to the point of coordinates (0,0).
222 ! All use of functions is unchanged (the new description of projection is
223 ! done by the P_P argument).
224 
225 ! - add some protections in Lambert (STLP_XY_TO_RTETA functions) to prevent
226 ! the nosense of XY values in the cutting part of Lambert projected plane.
227 
228 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
229 
230 ! Modified 11-07-2006 : JD Gril : use of LOLAD & LOLAR functions vs /DTR & *DTR
231 ! Modified 16-10-2006 : JD Gril : replace pack/unpack by reshape intrinsic func.
232 ! Modified 12-01-2007 : JD Gril : cleaning
233 ! Modified 04-07-2008 : JD Gril : latlon_to_xy and stpl_latlon_to_rteta edge
234 ! : effect for huge domain : pb diff longitudes.
235 ! : replace reshape by do loop
236 ! Modified 13-03-2009 : JD Gril : Optimization et cleanup
237 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
238 
239 ! ******************* Definition of parameters **********************************
240 
241 ! Include Kinds
242 ! -------------
243 
244 #ifndef DEBUG
245 ! force no print info in makdo by default
246 #define _DEFP_ .FALSE.
247 #else
248 ! force print info in makdo by default
249 #define _DEFP_ .TRUE.
250 #endif
251 
252 USE parkind1 ,ONLY : jpim, jprd
253 USE yomhook ,ONLY : lhook, dr_hook
254 
255 ! ******************* Loading module ********************************************
256 
258 USE eggmrt ,ONLY : merotil, metilrot
259 
260 IMPLICIT NONE
261 
262 ! Physics constant
263 ! ----------------
264 
265 REAL(KIND=JPRD), PARAMETER, PUBLIC :: r_earth = 6371229._jprd
266 
267 ! ******************* Definition of type ****************************************
268 
269 TYPE error
270  INTEGER(KIND=JPIM) :: num
271  CHARACTER(LEN=100) :: txt
272 END TYPE error
273 
274 TYPE pgn
275  REAL(KIND=JPRD) :: onx, ony
276 END TYPE pgn
277 
278 TYPE nbpts
279  INTEGER(KIND=JPIM) :: onx, ony
280 END TYPE nbpts
281 
282 TYPE delta
283  REAL(KIND=JPRD) :: onx, ony
284 END TYPE delta
285 
286 TYPE rteta
287  REAL(KIND=JPRD) :: r, teta
288 END TYPE rteta
289 
290 TYPE xy
291  REAL(KIND=JPRD) :: x, y
292 END TYPE xy
293 
295  sequence
296  type(lola) :: ref_pt,tzo_pt
297  REAL(KIND=JPRD) :: kl, r_equateur, pole
298  CHARACTER(LEN=1) :: type_pj
299 END TYPE param_proj
300 
301 TYPE domi
302  type(nbpts) :: g_size
303  type(lola) :: ct_coord, rf_coord, sw_coord, se_coord, ne_coord, nw_coord
304  REAL(KIND=JPRD) :: mf_ct, mf_rf, mf_sw, mf_se, mf_ne, mf_nw
305  type(param_proj) :: info_proj
306 END TYPE domi
307 
308 ! ******************* Definition of Interface ***********************************
309 
310 INTERFACE info_print
311  MODULE PROCEDURE info_pp_print, info_domi_print
312 END INTERFACE
313 
316 END INTERFACE
317 
320 END INTERFACE
321 
324 END INTERFACE
325 
327  MODULE PROCEDURE stlp_rteta_to_xy_v, stlp_rteta_to_xy_s
328 END INTERFACE
329 
331  MODULE PROCEDURE stlp_xy_to_rteta_v, stlp_xy_to_rteta_s
332 END INTERFACE
333 
336 END INTERFACE
337 
338 INTERFACE latlon_to_xy
339  MODULE PROCEDURE latlon_to_xy_v, latlon_to_xy_s
340 END INTERFACE
341 
342 INTERFACE xy_to_latlon
343  MODULE PROCEDURE xy_to_latlon_v, xy_to_latlon_s
344 END INTERFACE
345 
346 INTERFACE map_factor
347  MODULE PROCEDURE map_factor_v, map_factor_s
348 END INTERFACE
349 
350 INTERFACE gn
351  MODULE PROCEDURE gn_v, gn_s
352 END INTERFACE
353 
354 #include "abor1.intfb.h"
355 
356 CONTAINS
357 
358 ! =================== FUNCTIONS =================================================
359 
360 ! ******************* Independants functions ************************************
361 
362 ! -------------------------------------------------------------------------------
363 SUBROUTINE info_domi_print(YD_G_INFO,KOUT,PI)
364 type(domi), INTENT(IN) :: yd_g_info
365 INTEGER(KIND=JPIM), INTENT(IN), OPTIONAL :: KOUT
366 REAL(KIND=JPRD), INTENT(IN), OPTIONAL :: PI
367 
368 REAL(KIND=JPRD) :: TPI
369 INTEGER(KIND=JPIM) :: TKOUT
370 REAL(KIND=JPRD) :: ZHOOK_HANDLE
371 
372 IF (lhook) CALL dr_hook('EGGPACK:INFO_DOMI_PRINT',0,zhook_handle)
373 IF (PRESENT(kout))THEN
374  tkout = kout
375 ELSE
376  tkout = 6_jpim
377 ENDIF
378 IF (PRESENT(pi)) THEN
379  tpi = pi
380 ELSE
381  tpi = asin(1.0_jprd)*2.0_jprd
382 ENDIF
383 CALL info_print(yd_g_info%INFO_PROJ,tkout,tpi)
384 WRITE(tkout,*) "============================================================="
385 WRITE(tkout,*) "=== Informations about Domain Information Structure ===="
386 WRITE(tkout,*) "============================================================="
387 WRITE(tkout,*)
388 WRITE(tkout,*) " -Size of Domain (in points) :"
389 WRITE(tkout,'(13X,A7,10X,A7)') " On X "," On Y "
390 WRITE(tkout,'(13X,I7,10X,I7)') yd_g_info%G_SIZE%ONX,yd_g_info%G_SIZE%ONY
391 WRITE(tkout,*) " -Most important points informations :"
392 WRITE(tkout,'(1X,A7,1X,"|",1X,A9,1X,"|",1X,A8,1X,"|",1X,A16)') &
393  & " Points ","Longitude","Latitude"," Map Factor "
394 WRITE(tkout,'(A47)') "------------------------------------------------"
395 WRITE(tkout,'(1X,A7,1X,"|",2X,F7.2,2X,"|",2X,F7.2,1X,"|",1X,G16.10)') &
396  & "Center ",yd_g_info%CT_COORD%LON,yd_g_info%CT_COORD%LAT,yd_g_info%MF_CT
397 WRITE(tkout,'(1X,A7,1X,"|",2X,F7.2,2X,"|",2X,F7.2,1X,"|",1X,G16.10)') &
398  & "Refer. ",yd_g_info%RF_COORD%LON,yd_g_info%RF_COORD%LAT,yd_g_info%MF_RF
399 WRITE(tkout,'(1X,A7,1X,"|",2X,F7.2,2X,"|",2X,F7.2,1X,"|",1X,G16.10)') &
400  & "S.West ",yd_g_info%SW_COORD%LON,yd_g_info%SW_COORD%LAT,yd_g_info%MF_SW
401 WRITE(tkout,'(1X,A7,1X,"|",2X,F7.2,2X,"|",2X,F7.2,1X,"|",1X,G16.10)') &
402  & "S.East ",yd_g_info%SE_COORD%LON,yd_g_info%SE_COORD%LAT,yd_g_info%MF_SE
403 WRITE(tkout,'(1X,A7,1X,"|",2X,F7.2,2X,"|",2X,F7.2,1X,"|",1X,G16.10)') &
404  & "N.East ",yd_g_info%NE_COORD%LON,yd_g_info%NE_COORD%LAT,yd_g_info%MF_NE
405 WRITE(tkout,'(1X,A7,1X,"|",2X,F7.2,2X,"|",2X,F7.2,1X,"|",1X,G16.10)') &
406  & "N.West ",yd_g_info%NW_COORD%LON,yd_g_info%NW_COORD%LAT,yd_g_info%MF_NW
407 WRITE(tkout,*) "============================================================="
408 IF (lhook) CALL dr_hook('EGGPACK:INFO_DOMI_PRINT',1,zhook_handle)
409 END SUBROUTINE info_domi_print
410 ! -------------------------------------------------------------------------------
411 SUBROUTINE info_pp_print(P_P,KOUT,PI)
412 type(param_proj), INTENT(IN) :: p_p
413 INTEGER(KIND=JPIM), INTENT(IN), OPTIONAL :: KOUT
414 REAL(KIND=JPRD), INTENT(IN), OPTIONAL :: PI
415 
416 REAL(KIND=JPRD) :: TPI, DTR
417 INTEGER(KIND=JPIM) :: TKOUT
418 REAL(KIND=JPRD) :: ZHOOK_HANDLE
419 
420 IF (lhook) CALL dr_hook('EGGPACK:INFO_PP_PRINT',0,zhook_handle)
421 IF (PRESENT(kout))THEN
422  tkout = kout
423 ELSE
424  tkout = 6_jpim
425 ENDIF
426 IF (PRESENT(pi)) THEN
427  tpi = pi
428 ELSE
429  tpi = asin(1.0_jprd)*2.0_jprd
430 ENDIF
431 dtr = tpi/180.0_jprd
432 WRITE(tkout,*) "============================================================="
433 WRITE(tkout,*) "=== Informations about Parameters Projection Structure ===="
434 WRITE(tkout,*) "============================================================="
435 WRITE(tkout,*)
436 WRITE(tkout,*) " -Reference Point Coordinates :"
437 WRITE(tkout,'(13X,A7,10X,A7)') "Degrees","Radians"
438 WRITE(tkout,'(1X,"Longitude : ",F7.2,5X,G16.10)') p_p%REF_PT%LON/dtr,p_p%REF_PT%LON
439 WRITE(tkout,'(1X,"Latitude : ",F7.2,5X,G16.10)') p_p%REF_PT%LAT/dtr,p_p%REF_PT%LAT
440 WRITE(tkout,*) " -Projection Characteristics :"
441 WRITE(tkout,'(13X,A16,5X,A18)') " ERPK or KL ","Type of Projection"
442 WRITE(tkout,'(13X,G16.10,13X,A1)') p_p%KL,p_p%TYPE_PJ
443 IF ((p_p%TYPE_PJ == "M").OR.(p_p%TYPE_PJ == "W")) THEN
444  WRITE(tkout,*) " -Rayon of Earth (in meters) :"
445 ELSE
446  WRITE(tkout,*) " -Distance between Equator and Pole of projection on"
447  WRITE(tkout,*) " projection plane (in meters) :"
448 ENDIF
449 WRITE(tkout,'(13X,G16.10)') p_p%R_EQUATEUR
450 WRITE(tkout,*) " -Pole of projection (-1.0 for South, 1.0 for North, 0.0 for"
451 WRITE(tkout,*) " Mercator projection : no sense) :"
452 WRITE(tkout,'(13X,F4.1)') p_p%POLE
453 WRITE(tkout,*) "============================================================="
454 IF (lhook) CALL dr_hook('EGGPACK:INFO_PP_PRINT',1,zhook_handle)
455 END SUBROUTINE info_pp_print
456 ! -------------------------------------------------------------------------------
457 LOGICAL FUNCTION return_print(YD_CODE_ERR,K_NUM_TEST,AUTO_STOP,KOUT)
458 CHARACTER(LEN=36), PARAMETER :: FMT = '(A25,I4," ; test number = ",I3,A100)'
459 type(error), INTENT(IN) :: yd_code_err
460 INTEGER(KIND=JPIM), INTENT(IN) :: K_NUM_TEST
461 LOGICAL, INTENT(IN), OPTIONAL :: AUTO_STOP
462 INTEGER(KIND=JPIM), INTENT(IN), OPTIONAL :: KOUT
463 
464 CHARACTER(LEN=25) :: CL_ADD_TEXT
465 LOGICAL :: TAS
466 INTEGER(KIND=JPIM) :: TKOUT
467 REAL(KIND=JPRD) :: ZHOOK_HANDLE
468 
469 IF (lhook) CALL dr_hook('EGGPACK:RETURN_PRINT',0,zhook_handle)
470 IF (PRESENT(kout))THEN
471  tkout = kout
472 ELSE
473  tkout = 6_jpim
474 ENDIF
475 IF (PRESENT(auto_stop))THEN
476  tas = auto_stop
477 ELSE
478  tas = .true.
479 ENDIF
480 SELECT CASE (yd_code_err%NUM)
481 CASE(:-1_jpim) ; cl_add_text = 'ERROR : return value = '
482 CASE(0_jpim) ; cl_add_text = 'OK : return value = '
483 CASE(1_jpim) ; cl_add_text = 'INFO : return value = '
484 CASE(2_jpim:) ; cl_add_text = 'WARNING : return value = '
485 END SELECT
486 IF (yd_code_err%NUM < 0_jpim) WRITE (tkout,*) "Subroutine last status when aborted : "
487 WRITE (tkout,fmt) cl_add_text,yd_code_err%NUM,k_num_test,yd_code_err%TXT
488 IF (yd_code_err%NUM < 0_jpim) THEN
489  IF (tas) THEN
490  CALL abor1("Abort by EGGPACK:RETURN_PRINT")
491  ELSE
492  return_print = .true.
493  ENDIF
494 ELSE
495  return_print = .false.
496 ENDIF
497 IF (lhook) CALL dr_hook('EGGPACK:RETURN_PRINT',1,zhook_handle)
498 END FUNCTION return_print
499 ! -------------------------------------------------------------------------------
500 FUNCTION type_proj(REF_COORD) RESULT (TY_PJ)
501 ! REF_COORD in Degrees
502 type(lola), INTENT(IN) :: ref_coord
503 CHARACTER(LEN=1) :: TY_PJ
504 
505 REAL(KIND=JPRD) :: ZHOOK_HANDLE
506 
507 IF (lhook) CALL dr_hook('EGGPACK:TYPE_PROJ',0,zhook_handle)
508 IF (ref_coord%LAT == 0.0_jprd) THEN
509  ty_pj = "M"
510 ELSEIF (abs(ref_coord%LAT) == 90.0_jprd) THEN
511  ty_pj = "S"
512 ELSE
513  ty_pj = "L"
514 ENDIF
515 IF (lhook) CALL dr_hook('EGGPACK:TYPE_PROJ',1,zhook_handle)
516 END FUNCTION type_proj
517 ! -------------------------------------------------------------------------------
518 REAL(KIND=JPRD) FUNCTION pole_is (REF_COORD) RESULT (POL)
519 ! REF_COORD in Degrees
520 type(lola), INTENT(IN) :: ref_coord
521 
522 REAL(KIND=JPRD) :: ZHOOK_HANDLE
523 
524 IF (lhook) CALL dr_hook('EGGPACK:POLE_IS',0,zhook_handle)
525 IF (ref_coord%LAT == 0.0_jprd) THEN
526  pol = 0.0_jprd
527 ELSE
528  pol = sign(1.0_jprd,ref_coord%LAT)
529 ENDIF
530 IF (lhook) CALL dr_hook('EGGPACK:POLE_IS',1,zhook_handle)
531 END FUNCTION pole_is
532 ! -------------------------------------------------------------------------------
533 
534 ! ******************* Specifics functions ***************************************
535 
536 ! STPL : STEREOGRAPHIQUE POLAIRE / LAMBERT MODE FONCTIONS
537 ! Transform LAT-LON to R-TETA, R-TETA to XY in STD Origin and reverse (-+R)
538 ! -------------------------------------------------------------------------------
539 type(rteta) FUNCTION stpl_latlon_to_rteta_s(PT_COORD,P_PJ,PI) RESULT (PT_RTETA)
540 ! PT_COORD in Radians
541 type(lola), INTENT(IN) :: pt_coord
542 type(param_proj), INTENT(IN) :: p_pj
543 REAL(KIND=JPRD), INTENT(IN), OPTIONAL :: PI
544 
545 REAL(KIND=JPRD) :: TPI
546 REAL(KIND=JPRD) :: ZHOOK_HANDLE
547 
548 IF (lhook) CALL dr_hook('EGGPACK:STPL_LATLON_TO_RTETA_S',0,zhook_handle)
549 IF (PRESENT(pi)) THEN
550  tpi = pi
551 ELSE
552  tpi = asin(1.0_jprd)*2.0_jprd
553 ENDIF
554 pt_rteta%R = p_pj%R_EQUATEUR*((tan((tpi/4.0_jprd)-((p_pj%POLE*pt_coord%LAT)/2.0_jprd)))**(p_pj%KL))
555 pt_rteta%TETA = p_pj%KL*dist_2ref(pt_coord,p_pj%REF_PT,tpi)
556 IF (lhook) CALL dr_hook('EGGPACK:STPL_LATLON_TO_RTETA_S',1,zhook_handle)
557 END FUNCTION stpl_latlon_to_rteta_s
558 ! -------------------------------------------------------------------------------
559 type(xy) FUNCTION stlp_rteta_to_xy_s(PT_RTETA,P_PJ) RESULT (PT_XY)
560 ! PT_XY in STD Origin that is pole ( Y positive to North, X positive to East )
561 type(rteta), INTENT(IN) :: pt_rteta
562 type(param_proj), INTENT(IN) :: p_pj
563 
564 REAL(KIND=JPRD) :: ZHOOK_HANDLE
565 
566 IF (lhook) CALL dr_hook('EGGPACK:STLP_RTETA_TO_XY_S',0,zhook_handle)
567 pt_xy%X = pt_rteta%R*sin(pt_rteta%TETA)
568 pt_xy%Y = -p_pj%POLE*pt_rteta%R*cos(pt_rteta%TETA)
569 IF (lhook) CALL dr_hook('EGGPACK:STLP_RTETA_TO_XY_S',1,zhook_handle)
570 END FUNCTION stlp_rteta_to_xy_s
571 ! -------------------------------------------------------------------------------
572 type(rteta) FUNCTION stlp_xy_to_rteta_s(PT_XY,P_PJ,PI) RESULT (PT_RTETA)
573 ! PT_XY in STD Origin that is pole ( Y positive to North, X positive to East )
574 type(xy), INTENT(IN) :: pt_xy
575 type(param_proj), INTENT(IN) :: p_pj
576 REAL(KIND=JPRD), INTENT(IN), OPTIONAL :: PI
577 
578 REAL(KIND=JPRD) :: TPI,TATNG
579 REAL(KIND=JPRD) :: ZHOOK_HANDLE
580 
581 IF (lhook) CALL dr_hook('EGGPACK:STLP_XY_TO_RTETA_S',0,zhook_handle)
582 IF (PRESENT(pi)) THEN
583  tpi = pi
584 ELSE
585  tpi = asin(1.0_jprd)*2.0_jprd
586 ENDIF
587 pt_rteta%R = sqrt((pt_xy%X*pt_xy%X)+(pt_xy%Y*pt_xy%Y))
588 IF (pt_xy%Y == 0.0_jprd) THEN
589  IF (pt_xy%X == 0.0_jprd) THEN
590  tatng = tpi
591  ELSE
592  tatng = sign(tpi/2.0_jprd,-p_pj%POLE*pt_xy%X)
593  ENDIF
594 ELSE
595  tatng = atan(-p_pj%POLE*(pt_xy%X/pt_xy%Y))
596 ENDIF
597 pt_rteta%TETA = tpi*sign(1.0_jprd,pt_xy%X)*(sign(0.5_jprd,p_pj%POLE*pt_xy%Y)+0.5_jprd)+tatng
598 ! This term : <-------------------------------------------------------------> modifies the value of atan() according
599 ! the square defined by : y<0 => 0 ; x>0 and y>0 => pi ; x<0 and y>0 => -pi
600 !========>if PT_RTETA%TETA > TPI*P_PJ%KL then error (bad section of planed cone)
601 IF (abs(pt_rteta%TETA) > tpi*p_pj%KL) THEN
602  print *,"Point at x = ",pt_xy%X," , y = ",pt_xy%Y
603  print *,"Is out of the planed cone section ! Abort !!!"
604  CALL abor1("Abort by EGGPACK:STLP_XY_TO_RTETA_S")
605 ENDIF
606 IF (lhook) CALL dr_hook('EGGPACK:STLP_XY_TO_RTETA_S',1,zhook_handle)
607 END FUNCTION stlp_xy_to_rteta_s
608 ! -------------------------------------------------------------------------------
609 type(lola) FUNCTION stlp_rteta_to_latlon_s(PT_RTETA,P_PJ,PI) RESULT (PT_COORD)
610 ! PT_COORD in Radians
611 type(rteta), INTENT(IN) :: pt_rteta
612 type(param_proj), INTENT(IN) :: p_pj
613 REAL(KIND=JPRD), INTENT(IN), OPTIONAL :: PI
614 
615 REAL(KIND=JPRD) :: TPI
616 REAL(KIND=JPRD) :: ZHOOK_HANDLE
617 
618 IF (lhook) CALL dr_hook('EGGPACK:STLP_RTETA_TO_LATLON_S',0,zhook_handle)
619 IF (PRESENT(pi)) THEN
620  tpi = pi
621 ELSE
622  tpi = asin(1.0_jprd)*2.0_jprd
623 ENDIF
624 pt_coord%LON = p_pj%REF_PT%LON + pt_rteta%TETA/p_pj%KL
625 pt_coord%LAT = p_pj%POLE*((tpi/2.0_jprd)-2.0_jprd*atan((pt_rteta%R/p_pj%R_EQUATEUR)**(1.0_jprd/p_pj%KL)))
626 IF (lhook) CALL dr_hook('EGGPACK:STLP_RTETA_TO_LATLON_S',1,zhook_handle)
627 END FUNCTION stlp_rteta_to_latlon_s
628 ! -------------------------------------------------------------------------------
629 FUNCTION stpl_latlon_to_rteta_v(PT_COORD,P_PJ,PI) RESULT (PT_RTETA)
630 ! PT_COORD in Radians
631 type(lola), DIMENSION(:), INTENT(IN) :: pt_coord
632 type(param_proj), INTENT(IN) :: p_pj
633 REAL(KIND=JPRD), INTENT(IN), OPTIONAL :: PI
634 type(rteta), DIMENSION(SIZE(PT_COORD)) :: pt_rteta
635 
636 REAL(KIND=JPRD) :: TPI
637 REAL(KIND=JPRD) :: ZHOOK_HANDLE
638 
639 IF (lhook) CALL dr_hook('EGGPACK:STPL_LATLON_TO_RTETA_V',0,zhook_handle)
640 IF (PRESENT(pi)) THEN
641  tpi = pi
642 ELSE
643  tpi = asin(1.0_jprd)*2.0_jprd
644 ENDIF
645 pt_rteta(:)%R = p_pj%R_EQUATEUR*((tan((tpi/4.0_jprd)-((p_pj%POLE*pt_coord(:)%LAT)/2.0_jprd)))**(p_pj%KL))
646 pt_rteta(:)%TETA = p_pj%KL*dist_2ref(pt_coord(:),p_pj%REF_PT,tpi)
647 IF (lhook) CALL dr_hook('EGGPACK:STPL_LATLON_TO_RTETA_V',1,zhook_handle)
648 END FUNCTION stpl_latlon_to_rteta_v
649 ! -------------------------------------------------------------------------------
650 FUNCTION stlp_rteta_to_xy_v(PT_RTETA,P_PJ) RESULT (PT_XY)
651 ! PT_XY in STD Origin that is pole ( Y positive to North, X positive to East )
652 type(rteta), DIMENSION(:), INTENT(IN) :: pt_rteta
653 type(param_proj), INTENT(IN) :: p_pj
654 type(xy), DIMENSION(SIZE(PT_RTETA)) :: pt_xy
655 
656 REAL(KIND=JPRD) :: ZHOOK_HANDLE
657 
658 IF (lhook) CALL dr_hook('EGGPACK:STLP_RTETA_TO_XY_V',0,zhook_handle)
659 pt_xy(:)%X = pt_rteta(:)%R*sin(pt_rteta(:)%TETA)
660 pt_xy(:)%Y = -p_pj%POLE*pt_rteta(:)%R*cos(pt_rteta(:)%TETA)
661 IF (lhook) CALL dr_hook('EGGPACK:STLP_RTETA_TO_XY_V',1,zhook_handle)
662 END FUNCTION stlp_rteta_to_xy_v
663 ! -------------------------------------------------------------------------------
664 FUNCTION stlp_xy_to_rteta_v(PT_XY,P_PJ,PI) RESULT (PT_RTETA)
665 ! PT_XY in STD Origin that is pole ( Y positive to North, X positive to East )
666 type(xy), DIMENSION(:), INTENT(IN) :: pt_xy
667 type(param_proj), INTENT(IN) :: p_pj
668 REAL(KIND=JPRD), INTENT(IN), OPTIONAL :: PI
669 type(rteta), DIMENSION(SIZE(PT_XY)) :: pt_rteta
670 
671 REAL(KIND=JPRD) :: TPI
672 REAL(KIND=JPRD), DIMENSION(SIZE(PT_XY)) :: TATNG
673 REAL(KIND=JPRD) :: ZHOOK_HANDLE
674 
675 IF (lhook) CALL dr_hook('EGGPACK:STLP_XY_TO_RTETA_V',0,zhook_handle)
676 IF (PRESENT(pi)) THEN
677  tpi = pi
678 ELSE
679  tpi = asin(1.0_jprd)*2.0_jprd
680 ENDIF
681 pt_rteta(:)%R = sqrt((pt_xy(:)%X*pt_xy(:)%X)+(pt_xy(:)%Y*pt_xy(:)%Y))
682 WHERE (pt_xy(:)%Y == 0.0_jprd)
683  WHERE (pt_xy(:)%X == 0.0_jprd)
684  tatng = tpi
685  ELSEWHERE
686  tatng = sign(tpi/2.0_jprd,-p_pj%POLE*pt_xy(:)%X)
687  ENDWHERE
688 ELSEWHERE
689  tatng = atan(-p_pj%POLE*(pt_xy(:)%X/pt_xy(:)%Y))
690 ENDWHERE
691 pt_rteta(:)%TETA = tpi*sign(1.0_jprd,pt_xy(:)%X)*(sign(0.5_jprd,p_pj%POLE*pt_xy(:)%Y)+0.5_jprd)+tatng(:)
692 ! This term : <-------------------------------------------------------------------> modifies the value of atan()
693 ! according the square defined by : y<0 => 0 ; x>0 and y>0 => pi ; x<0 and y>0 => -pi
694 !========>if one of PT_RTETA(:)%TETA > TPI*P_PJ%KL then error (bad section of planed cone)
695 IF (any(abs(pt_rteta(:)%TETA) > tpi*p_pj%KL)) THEN
696  print *,"Some points are out of planed cone section ! Abort !!!"
697  CALL abor1("Abort by EGGPACK:STLP_XY_TO_RTETA_V")
698 ENDIF
699 IF (lhook) CALL dr_hook('EGGPACK:STLP_XY_TO_RTETA_V',1,zhook_handle)
700 END FUNCTION stlp_xy_to_rteta_v
701 ! -------------------------------------------------------------------------------
702 FUNCTION stlp_rteta_to_latlon_v(PT_RTETA,P_PJ,PI) RESULT (PT_COORD)
703 ! PT_COORD in Radians
704 type(rteta), DIMENSION(:), INTENT(IN) :: pt_rteta
705 type(param_proj), INTENT(IN) :: p_pj
706 REAL(KIND=JPRD), INTENT(IN), OPTIONAL :: PI
707 type(lola), DIMENSION(SIZE(PT_RTETA)) :: pt_coord
708 
709 REAL(KIND=JPRD) :: TPI
710 REAL(KIND=JPRD) :: ZHOOK_HANDLE
711 
712 IF (lhook) CALL dr_hook('EGGPACK:STLP_RTETA_TO_LATLON_V',0,zhook_handle)
713 IF (PRESENT(pi)) THEN
714  tpi = pi
715 ELSE
716  tpi = asin(1.0_jprd)*2.0_jprd
717 ENDIF
718 pt_coord(:)%LON = p_pj%REF_PT%LON + pt_rteta(:)%TETA/p_pj%KL
719 pt_coord(:)%LAT = p_pj%POLE*((tpi/2.0_jprd)-2.0_jprd*atan((pt_rteta(:)%R/p_pj%R_EQUATEUR)**(1.0_jprd/p_pj%KL)))
720 IF (lhook) CALL dr_hook('EGGPACK:STLP_RTETA_TO_LATLON_V',1,zhook_handle)
721 END FUNCTION stlp_rteta_to_latlon_v
722 ! -------------------------------------------------------------------------------
723 
724 ! ******************* Generics functions ****************************************
725 
726 ! Creation of Structure Definition projection type (-+D)
727 ! -------------------------------------------------------------------------------
728 type(param_proj) FUNCTION ref_datas (REF_COORD,RA,TOZERO_COORD,LRT) RESULT (P_P)
729 ! REF_COORD,TOZERO_COORD in -+Degrees
730 type(lola), INTENT(IN) :: ref_coord
731 REAL(KIND=JPRD), INTENT(IN), OPTIONAL :: RA
732 type(lola), INTENT(IN), OPTIONAL :: tozero_coord
733 LOGICAL, INTENT(IN), OPTIONAL :: LRT
734 
735 REAL(KIND=JPRD) :: RT
736 REAL(KIND=JPRD) :: ZHOOK_HANDLE
737 
738 IF (lhook) CALL dr_hook('EGGPACK:REF_DATAS',0,zhook_handle)
739 IF (PRESENT(ra))THEN
740  rt = ra
741 ELSE
742  rt = r_earth
743 ENDIF
744 ! P_P%REF in -+Radians
745 p_p%REF_PT = lolar(angle_domain(ref_coord)) ! expect REF_COORD in Dg & put it in -+
746 IF (PRESENT(lrt)) THEN ! flag rot-tilt present
747  IF ((lrt).AND.(p_p%REF_PT%LAT==0.0_jprd)) THEN ! flag rot-tilt true and mercator
748  p_p%TYPE_PJ = "W"
749  IF (PRESENT(tozero_coord)) THEN ! value of TOZERO_COORD
750  p_p%TZO_PT = lolar(angle_domain(tozero_coord)) ! expect TOZERO_COORD in Dg & put it in -+
751  ELSE ! default TOZERO_COORD value is (0,0)
752  p_p%TZO_PT%LAT = 0.0_jprd
753  p_p%TZO_PT%LON = 0.0_jprd
754  ENDIF
755  ELSE ! either flag false either not mercator so
756  p_p%TYPE_PJ = type_proj(ref_coord) ! doing standard
757  p_p%TZO_PT%LAT = -999.999_jprd ! no need of TOZERO_COORD
758  p_p%TZO_PT%LON = -999.999_jprd
759  ENDIF
760 ELSE ! not rot-tilt mode so
761  p_p%TYPE_PJ = type_proj(ref_coord) ! doing standard
762  p_p%TZO_PT%LAT = -999.999_jprd ! no need of TOZERO_COORD
763  p_p%TZO_PT%LON = -999.999_jprd
764 ENDIF
765 p_p%POLE = pole_is(ref_coord)
766 p_p%KL = p_p%POLE*sin(p_p%REF_PT%LAT)
767 IF (p_p%KL /= 0.0_jprd) THEN
768  ! Rho of projection of equator on polar plane (Rho-Theta)
769  p_p%R_EQUATEUR = rt*((cos(p_p%REF_PT%LAT))**(1.0_jprd -p_p%KL))*(((1.0_jprd +p_p%KL)**p_p%KL)/p_p%KL)
770 ELSE
771  p_p%R_EQUATEUR = rt
772 ENDIF
773 IF (lhook) CALL dr_hook('EGGPACK:REF_DATAS',1,zhook_handle)
774 END FUNCTION ref_datas
775 ! -------------------------------------------------------------------------------
776 ! Change of origine between STD and NEW and reverse (-+D)
777 ! -------------------------------------------------------------------------------
778 type(xy) FUNCTION xy_new_to_std_origin_s(NEW_ORIGIN_COORD,PT_XY_IN_NEW_ORIGIN,P_PJ,PI) RESULT (PT_XY_IN_STD_ORIGIN)
779 ! NEW_ORIGIN_COORD in -+Degrees
780 type(lola), INTENT(IN) :: new_origin_coord
781 type(xy), INTENT(IN) :: pt_xy_in_new_origin
782 type(param_proj), INTENT(IN) :: p_pj
783 REAL(KIND=JPRD), INTENT(IN), OPTIONAL :: PI
784 
785 REAL(KIND=JPRD) :: TPI
786 type(xy) :: n_o_pt_xy
787 REAL(KIND=JPRD) :: ZHOOK_HANDLE
788 
789 IF (lhook) CALL dr_hook('EGGPACK:XY_NEW_TO_STD_ORIGIN_S',0,zhook_handle)
790 IF (PRESENT(pi)) THEN
791  tpi = pi
792 ELSE
793  tpi = asin(1.0_jprd)*2.0_jprd
794 ENDIF
795 n_o_pt_xy = latlon_to_xy(lolar(new_origin_coord),p_pj,tpi)
796 pt_xy_in_std_origin%X = pt_xy_in_new_origin%X+n_o_pt_xy%X
797 pt_xy_in_std_origin%Y = pt_xy_in_new_origin%Y+n_o_pt_xy%Y
798 IF (lhook) CALL dr_hook('EGGPACK:XY_NEW_TO_STD_ORIGIN_S',1,zhook_handle)
799 END FUNCTION xy_new_to_std_origin_s
800 ! -------------------------------------------------------------------------------
801 type(xy) FUNCTION xy_std_to_new_origin_s(NEW_ORIGIN_COORD,PT_XY_IN_STD_ORIGIN,P_PJ,PI) RESULT (PT_XY_IN_NEW_ORIGIN)
802 ! NEW_ORIGIN_COORD in -+Degrees
803 type(lola), INTENT(IN) :: new_origin_coord
804 type(xy), INTENT(IN) :: pt_xy_in_std_origin
805 type(param_proj), INTENT(IN) :: p_pj
806 REAL(KIND=JPRD), INTENT(IN), OPTIONAL :: PI
807 
808 REAL(KIND=JPRD) :: TPI
809 type(xy) :: n_o_pt_xy
810 REAL(KIND=JPRD) :: ZHOOK_HANDLE
811 
812 IF (lhook) CALL dr_hook('EGGPACK:XY_STD_TO_NEW_ORIGIN_S',0,zhook_handle)
813 IF (PRESENT(pi)) THEN
814  tpi = pi
815 ELSE
816  tpi = asin(1.0_jprd)*2.0_jprd
817 ENDIF
818 n_o_pt_xy = latlon_to_xy(lolar(new_origin_coord),p_pj,tpi)
819 pt_xy_in_new_origin%X = pt_xy_in_std_origin%X-n_o_pt_xy%X
820 pt_xy_in_new_origin%Y = pt_xy_in_std_origin%Y-n_o_pt_xy%Y
821 IF (lhook) CALL dr_hook('EGGPACK:XY_STD_TO_NEW_ORIGIN_S',1,zhook_handle)
822 END FUNCTION xy_std_to_new_origin_s
823 ! -------------------------------------------------------------------------------
824 FUNCTION xy_new_to_std_origin_v(NEW_ORIGIN_COORD,PT_XY_IN_NEW_ORIGIN,P_PJ,PI) RESULT (PT_XY_IN_STD_ORIGIN)
825 ! NEW_ORIGIN_COORD in -+Degrees
826 type(lola), INTENT(IN) :: new_origin_coord
827 type(xy), DIMENSION(:), INTENT(IN) :: pt_xy_in_new_origin
828 type(param_proj), INTENT(IN) :: p_pj
829 REAL(KIND=JPRD), INTENT(IN), OPTIONAL :: PI
830 type(xy), DIMENSION(SIZE(PT_XY_IN_NEW_ORIGIN)) :: pt_xy_in_std_origin
831 
832 REAL(KIND=JPRD) :: TPI
833 type(xy) :: n_o_pt_xy
834 REAL(KIND=JPRD) :: ZHOOK_HANDLE
835 
836 IF (lhook) CALL dr_hook('EGGPACK:XY_NEW_TO_STD_ORIGIN_V',0,zhook_handle)
837 IF (PRESENT(pi)) THEN
838  tpi = pi
839 ELSE
840  tpi = asin(1.0_jprd)*2.0_jprd
841 ENDIF
842 n_o_pt_xy = latlon_to_xy(lolar(new_origin_coord),p_pj,tpi)
843 pt_xy_in_std_origin(:)%X = pt_xy_in_new_origin(:)%X+n_o_pt_xy%X
844 pt_xy_in_std_origin(:)%Y = pt_xy_in_new_origin(:)%Y+n_o_pt_xy%Y
845 IF (lhook) CALL dr_hook('EGGPACK:XY_NEW_TO_STD_ORIGIN_V',1,zhook_handle)
846 END FUNCTION xy_new_to_std_origin_v
847 ! -------------------------------------------------------------------------------
848 FUNCTION xy_std_to_new_origin_v(YL_NEW_ORIGIN_COORD,YL_PT_XY_IN_STD_ORIGIN,P_PJ,PI) RESULT (YD_PT_XY_IN_NEW_ORIGIN)
849 ! YL_NEW_ORIGIN_COORD in -+Degrees
850 type(lola), INTENT(IN) :: yl_new_origin_coord
851 type(xy), DIMENSION(:), INTENT(IN) :: yl_pt_xy_in_std_origin
852 type(param_proj), INTENT(IN) :: p_pj
853 REAL(KIND=JPRD), INTENT(IN), OPTIONAL :: PI
854 type(xy), DIMENSION(SIZE(YL_PT_XY_IN_STD_ORIGIN)) :: yd_pt_xy_in_new_origin
855 
856 REAL(KIND=JPRD) :: TPI
857 type(xy) :: yl_n_o_pt_xy
858 REAL(KIND=JPRD) :: ZHOOK_HANDLE
859 
860 IF (lhook) CALL dr_hook('EGGPACK:XY_STD_TO_NEW_ORIGIN_V',0,zhook_handle)
861 IF (PRESENT(pi)) THEN
862  tpi = pi
863 ELSE
864  tpi = asin(1.0_jprd)*2.0_jprd
865 ENDIF
866 yl_n_o_pt_xy = latlon_to_xy(lolar(yl_new_origin_coord),p_pj,tpi)
867 yd_pt_xy_in_new_origin(:)%X = yl_pt_xy_in_std_origin(:)%X-yl_n_o_pt_xy%X
868 yd_pt_xy_in_new_origin(:)%Y = yl_pt_xy_in_std_origin(:)%Y-yl_n_o_pt_xy%Y
869 IF (lhook) CALL dr_hook('EGGPACK:XY_STD_TO_NEW_ORIGIN_V',1,zhook_handle)
870 END FUNCTION xy_std_to_new_origin_v
871 ! -------------------------------------------------------------------------------
872 ! Coordinates transforms between XY in STD Origin and LAT-LON (-+R)
873 ! -------------------------------------------------------------------------------
874 type(xy) FUNCTION latlon_to_xy_s(PT_COORD,P_PJ,PI) RESULT (PT_XY)
875 ! PT_COORD in -+Radians
876 ! PT_XY in STD Origin
877 type(lola), INTENT(IN) :: pt_coord
878 type(param_proj), INTENT(IN) :: p_pj
879 REAL(KIND=JPRD), INTENT(IN), OPTIONAL :: PI
880 
881 REAL(KIND=JPRD) :: TPI
882 type(lola) :: pt_coord2
883 REAL(KIND=JPRD) :: ZHOOK_HANDLE
884 
885 IF (lhook) CALL dr_hook('EGGPACK:LATLON_TO_XY_S',0,zhook_handle)
886 IF (PRESENT(pi)) THEN
887  tpi = pi
888 ELSE
889  tpi = asin(1.0_jprd)*2.0_jprd
890 ENDIF
891 IF ((p_pj%TYPE_PJ == "S").OR.(p_pj%TYPE_PJ == "L")) THEN
892  pt_xy = stlp_rteta_to_xy(stpl_latlon_to_rteta(pt_coord,p_pj,tpi),p_pj)
893 ELSE
894  pt_coord2 = pt_coord
895  IF (p_pj%TYPE_PJ == "W") THEN
896  pt_coord2 = metilrot(p_pj%REF_PT,p_pj%TZO_PT,pt_coord)
897  pt_xy%X = pt_coord2%LON*p_pj%R_EQUATEUR
898  ELSE
899  pt_xy%X = p_pj%R_EQUATEUR*dist_2ref(pt_coord,p_pj%REF_PT,tpi)
900  ENDIF
901  pt_xy%Y = -p_pj%R_EQUATEUR*log(tan((tpi/4.0_jprd)-(pt_coord2%LAT/2.0_jprd)))
902 ENDIF
903 IF (lhook) CALL dr_hook('EGGPACK:LATLON_TO_XY_S',1,zhook_handle)
904 END FUNCTION latlon_to_xy_s
905 ! -------------------------------------------------------------------------------
906 type(lola) FUNCTION xy_to_latlon_s(PT_XY,P_PJ,PI) RESULT (PT_COORD)
907 ! PT_XY in STD Origin
908 ! PT_COORD in -+Radians??
909 type(xy), INTENT(IN) :: pt_xy
910 type(param_proj), INTENT(IN) :: p_pj
911 REAL(KIND=JPRD), INTENT(IN), OPTIONAL :: PI
912 
913 REAL(KIND=JPRD) :: TPI
914 REAL(KIND=JPRD) :: ZHOOK_HANDLE
915 
916 IF (lhook) CALL dr_hook('EGGPACK:XY_TO_LATLON_S',0,zhook_handle)
917 IF (PRESENT(pi)) THEN
918  tpi = pi
919 ELSE
920  tpi = asin(1.0_jprd)*2.0_jprd
921 ENDIF
922 IF ((p_pj%TYPE_PJ == "S").OR.(p_pj%TYPE_PJ == "L")) THEN
923  pt_coord = stlp_rteta_to_latlon(stlp_xy_to_rteta(pt_xy,p_pj,tpi),p_pj,tpi)
924 ELSE
925  pt_coord%LON = (pt_xy%X/p_pj%R_EQUATEUR)
926  pt_coord%LAT = (tpi/2.0_jprd)-2.0_jprd*atan(exp(-(pt_xy%Y/p_pj%R_EQUATEUR)))
927  IF (p_pj%TYPE_PJ == "W") THEN
928  pt_coord=merotil(p_pj%REF_PT,p_pj%TZO_PT,pt_coord)
929  ELSE
930  pt_coord%LON = p_pj%REF_PT%LON+pt_coord%LON
931  ENDIF
932 ENDIF
933 IF (lhook) CALL dr_hook('EGGPACK:XY_TO_LATLON_S',1,zhook_handle)
934 END FUNCTION xy_to_latlon_s
935 ! -------------------------------------------------------------------------------
936 FUNCTION latlon_to_xy_v(PT_COORD,P_PJ,PI) RESULT (PT_XY)
937 ! PT_COORD in -+Radians
938 ! PT_XY in STD Origin
939 type(lola), DIMENSION(:), INTENT(IN) :: pt_coord
940 type(param_proj), INTENT(IN) :: p_pj
941 REAL(KIND=JPRD), INTENT(IN), OPTIONAL :: PI
942 type(xy), DIMENSION(SIZE(PT_COORD)) :: pt_xy
943 
944 REAL(KIND=JPRD) :: TPI
945 type(lola), DIMENSION(SIZE(PT_COORD)) :: pt_coord2
946 REAL(KIND=JPRD) :: ZHOOK_HANDLE
947 
948 IF (lhook) CALL dr_hook('EGGPACK:LATLON_TO_XY_V',0,zhook_handle)
949 IF (PRESENT(pi)) THEN
950  tpi = pi
951 ELSE
952  tpi = asin(1.0_jprd)*2.0_jprd
953 ENDIF
954 IF ((p_pj%TYPE_PJ == "S").OR.(p_pj%TYPE_PJ == "L")) THEN
955  pt_xy = stlp_rteta_to_xy(stpl_latlon_to_rteta(pt_coord,p_pj,tpi),p_pj)
956 ELSE
957  pt_coord2(:) = pt_coord(:)
958  IF (p_pj%TYPE_PJ == "W") THEN
959  pt_coord2(:) = metilrot(p_pj%REF_PT,p_pj%TZO_PT,pt_coord(:))
960  pt_xy(:)%X = pt_coord2(:)%LON*p_pj%R_EQUATEUR
961  ELSE
962  pt_xy(:)%X = p_pj%R_EQUATEUR*dist_2ref(pt_coord(:),p_pj%REF_PT,tpi)
963  ENDIF
964  pt_xy(:)%Y = -p_pj%R_EQUATEUR*log(tan((tpi/4.0_jprd)-(pt_coord2(:)%LAT/2.0_jprd)))
965 ENDIF
966 IF (lhook) CALL dr_hook('EGGPACK:LATLON_TO_XY_V',1,zhook_handle)
967 END FUNCTION latlon_to_xy_v
968 ! -------------------------------------------------------------------------------
969 FUNCTION xy_to_latlon_v(YL_PT_XY,P_PJ,PI) RESULT (PT_COORD)
970 ! YL_PT_XY in STD Origin
971 ! PT_COORD in -+Radians??
972 type(xy), DIMENSION(:), INTENT(IN) :: yl_pt_xy
973 type(param_proj), INTENT(IN) :: p_pj
974 REAL(KIND=JPRD), INTENT(IN), OPTIONAL :: PI
975 type(lola), DIMENSION(SIZE(YL_PT_XY)) :: pt_coord
976 
977 REAL(KIND=JPRD) :: TPI
978 REAL(KIND=JPRD) :: ZHOOK_HANDLE
979 
980 IF (lhook) CALL dr_hook('EGGPACK:XY_TO_LATLON_V',0,zhook_handle)
981 IF (PRESENT(pi)) THEN
982  tpi = pi
983 ELSE
984  tpi = asin(1.0_jprd)*2.0_jprd
985 ENDIF
986 IF ((p_pj%TYPE_PJ == "S").OR.(p_pj%TYPE_PJ == "L")) THEN
987  pt_coord = stlp_rteta_to_latlon(stlp_xy_to_rteta(yl_pt_xy,p_pj,tpi),p_pj,tpi)
988 ELSE
989  pt_coord(:)%LON = (yl_pt_xy(:)%X/p_pj%R_EQUATEUR)
990  pt_coord(:)%LAT = (tpi/2.0_jprd)-2.0_jprd*atan(exp(-(yl_pt_xy(:)%Y/p_pj%R_EQUATEUR)))
991  IF (p_pj%TYPE_PJ == "W") THEN
992  pt_coord(:)=merotil(p_pj%REF_PT,p_pj%TZO_PT,pt_coord(:))
993  ELSE
994  pt_coord(:)%LON = p_pj%REF_PT%LON+pt_coord(:)%LON
995  ENDIF
996 ENDIF
997 IF (lhook) CALL dr_hook('EGGPACK:XY_TO_LATLON_V',1,zhook_handle)
998 END FUNCTION xy_to_latlon_v
999 ! -------------------------------------------------------------------------------
1000 ! Functions MAP_FACTOR and GN
1001 ! -------------------------------------------------------------------------------
1002 REAL(KIND=JPRD) FUNCTION map_factor_s(PT_COORD,P_PJ,PI,RA)
1003 ! PT_COORD in -+Radians??
1004 type(lola), INTENT(IN) :: pt_coord
1005 type(param_proj), INTENT(IN) :: p_pj
1006 REAL(KIND=JPRD), INTENT(IN), OPTIONAL :: RA, PI
1007 
1008 REAL(KIND=JPRD) :: RT, TPI
1009 type(rteta) :: pt_rteta
1010 type(lola) :: pt_coord2
1011 REAL(KIND=JPRD) :: ZHOOK_HANDLE
1012 
1013 IF (lhook) CALL dr_hook('EGGPACK:MAP_FACTOR_S',0,zhook_handle)
1014 IF (PRESENT(ra))THEN
1015  rt = ra
1016 ELSE
1017  rt = r_earth
1018 ENDIF
1019 IF (PRESENT(pi)) THEN
1020  tpi = pi
1021 ELSE
1022  tpi = asin(1.0_jprd)*2.0_jprd
1023 ENDIF
1024 SELECT CASE(p_pj%TYPE_PJ)
1025 CASE('W') ; pt_coord2 = metilrot(p_pj%REF_PT,p_pj%TZO_PT,pt_coord)
1026  map_factor_s = 1.0_jprd/(cos(pt_coord2%LAT))
1027 CASE('M') ; map_factor_s = 1.0_jprd/(cos(pt_coord%LAT))
1028 CASE('S') ; map_factor_s = 2.0_jprd/(1.0_jprd +p_pj%POLE*sin(pt_coord%LAT))
1029 CASE('L') ; pt_rteta = stpl_latlon_to_rteta(pt_coord,p_pj,tpi)
1030  map_factor_s = (p_pj%KL*pt_rteta%R)/(rt*cos(pt_coord%LAT))
1031 END SELECT
1032 IF (lhook) CALL dr_hook('EGGPACK:MAP_FACTOR_S',1,zhook_handle)
1033 END FUNCTION map_factor_s
1034 ! -------------------------------------------------------------------------------
1035 FUNCTION map_factor_v(PT_COORD,P_PJ,PI,RA)
1036 ! PT_COORD in -+Radians??
1037 type(lola), DIMENSION(:), INTENT(IN) :: pt_coord
1038 type(param_proj), INTENT(IN) :: p_pj
1039 REAL(KIND=JPRD), INTENT(IN), OPTIONAL :: RA, PI
1040 REAL(KIND=JPRD), DIMENSION(SIZE(PT_COORD)) :: MAP_FACTOR_V
1041 
1042 REAL(KIND=JPRD) :: RT, TPI
1043 type(rteta), DIMENSION(SIZE(PT_COORD)) :: yl_pt_rteta
1044 type(lola), DIMENSION(SIZE(PT_COORD)) :: pt_coord2
1045 REAL(KIND=JPRD) :: ZHOOK_HANDLE
1046 
1047 IF (lhook) CALL dr_hook('EGGPACK:MAP_FACTOR_V',0,zhook_handle)
1048 IF (PRESENT(ra))THEN
1049  rt = ra
1050 ELSE
1051  rt = r_earth
1052 ENDIF
1053 IF (PRESENT(pi)) THEN
1054  tpi = pi
1055 ELSE
1056  tpi = asin(1.0_jprd)*2.0_jprd
1057 ENDIF
1058 SELECT CASE(p_pj%TYPE_PJ)
1059 CASE('W') ; pt_coord2(:) = metilrot(p_pj%REF_PT,p_pj%TZO_PT,pt_coord(:))
1060  map_factor_v(:) = 1.0_jprd/(cos(pt_coord2(:)%LAT))
1061 CASE('M') ; map_factor_v(:) = 1.0_jprd/(cos(pt_coord(:)%LAT))
1062 CASE('S') ; map_factor_v(:) = 2.0_jprd/(1.0_jprd +p_pj%POLE*sin(pt_coord(:)%LAT))
1063 CASE('L') ; yl_pt_rteta = stpl_latlon_to_rteta(pt_coord,p_pj,tpi)
1064  map_factor_v(:) = (p_pj%KL*yl_pt_rteta(:)%R)/(rt*cos(pt_coord(:)%LAT))
1065 END SELECT
1066 IF (lhook) CALL dr_hook('EGGPACK:MAP_FACTOR_V',1,zhook_handle)
1067 END FUNCTION map_factor_v
1068 ! -------------------------------------------------------------------------------
1069 type(pgn) FUNCTION gn_s(PT_COORD,P_PJ)
1070 ! PT_COORD in -+Radians??
1071 type(lola), INTENT(IN) :: pt_coord
1072 type(param_proj), INTENT(IN) :: p_pj
1073 
1074 type(lola) :: pt_coord2
1075 REAL(KIND=JPRD) :: ZHOOK_HANDLE
1076 
1077 IF (lhook) CALL dr_hook('EGGPACK:GN_S',0,zhook_handle)
1078 SELECT CASE(p_pj%TYPE_PJ)
1079 CASE('W') ; pt_coord2 = metilrot(p_pj%REF_PT,p_pj%TZO_PT,pt_coord)
1080  gn_s%ONY = (((cos(p_pj%REF_PT%LON)*((cos(p_pj%TZO_PT%LAT)*cos(pt_coord%LAT))+ &
1081  & (sin(p_pj%TZO_PT%LAT)*sin(pt_coord%LAT)*cos(pt_coord%LON-p_pj%TZO_PT%LON)))) &
1082  & -(sin(p_pj%REF_PT%LON)*sin(pt_coord%LAT)*sin(pt_coord%LON-p_pj%TZO_PT%LON))) &
1083  & /cos(pt_coord2%LAT))
1084  gn_s%ONX = -((cos(p_pj%REF_PT%LON)*sin(p_pj%TZO_PT%LAT)*sin(pt_coord%LON-p_pj%TZO_PT%LON)) &
1085  & +(sin(p_pj%REF_PT%LON)*cos(pt_coord%LON-p_pj%TZO_PT%LON)))/cos(pt_coord2%LAT)
1086 CASE('M') ; gn_s%ONX = 0.0_jprd
1087  gn_s%ONY = 1.0_jprd
1088 CASE DEFAULT ; gn_s%ONX = -p_pj%POLE*sin(p_pj%KL*(pt_coord%LON-p_pj%REF_PT%LON))
1089  gn_s%ONY = cos(p_pj%KL*(pt_coord%LON-p_pj%REF_PT%LON))
1090 END SELECT
1091 IF (lhook) CALL dr_hook('EGGPACK:GN_S',1,zhook_handle)
1092 END FUNCTION gn_s
1093 ! -------------------------------------------------------------------------------
1094 FUNCTION gn_v(YD_PT_COORD,YD_P_PJ)
1095 ! YD_PT_COORD in -+Radians??
1096 type(lola), DIMENSION(:), INTENT(IN) :: yd_pt_coord
1097 type(param_proj), INTENT(IN) :: yd_p_pj
1098 type(pgn), DIMENSION(SIZE(YD_PT_COORD)) :: gn_v
1099 
1100 type(lola), DIMENSION(SIZE(YD_PT_COORD)) :: yd_pt_coord2
1101 REAL(KIND=JPRD) :: ZHOOK_HANDLE
1102 
1103 IF (lhook) CALL dr_hook('EGGPACK:GN_V',0,zhook_handle)
1104 SELECT CASE(yd_p_pj%TYPE_PJ)
1105 CASE('W') ; yd_pt_coord2(:) = metilrot(yd_p_pj%REF_PT,yd_p_pj%TZO_PT,yd_pt_coord(:))
1106  gn_v(:)%ONY = (((cos(yd_p_pj%REF_PT%LON)*((cos(yd_p_pj%TZO_PT%LAT)*cos(yd_pt_coord(:)%LAT))+ &
1107  & (sin(yd_p_pj%TZO_PT%LAT)*sin(yd_pt_coord(:)%LAT)*cos(yd_pt_coord(:)%LON-yd_p_pj%TZO_PT%LON)))) &
1108  & -(sin(yd_p_pj%REF_PT%LON)*sin(yd_pt_coord(:)%LAT)*sin(yd_pt_coord(:)%LON-yd_p_pj%TZO_PT%LON))) &
1109  & /cos(yd_pt_coord2(:)%LAT))
1110  gn_v(:)%ONX = -((cos(yd_p_pj%REF_PT%LON)*sin(yd_p_pj%TZO_PT%LAT)*sin(yd_pt_coord(:)%LON-yd_p_pj%TZO_PT%LON)) &
1111  & +(sin(yd_p_pj%REF_PT%LON)*cos(yd_pt_coord(:)%LON-yd_p_pj%TZO_PT%LON)))/cos(yd_pt_coord2(:)%LAT)
1112 CASE('M') ; gn_v(:)%ONX = 0.0_jprd
1113  gn_v(:)%ONY = 1.0_jprd
1114 CASE DEFAULT ; gn_v(:)%ONX = -yd_p_pj%POLE*sin(yd_p_pj%KL*(yd_pt_coord(:)%LON-yd_p_pj%REF_PT%LON))
1115  gn_v(:)%ONY = cos(yd_p_pj%KL*(yd_pt_coord(:)%LON-yd_p_pj%REF_PT%LON))
1116 END SELECT
1117 IF (lhook) CALL dr_hook('EGGPACK:GN_V',1,zhook_handle)
1118 END FUNCTION gn_v
1119 ! -------------------------------------------------------------------------------
1120 
1121 ! =================== SUBROUTINE ================================================
1122 
1123 ! ******************* subroutine to make grid domain ****************************
1124 
1125 ! -------------------------------------------------------------------------------
1126 SUBROUTINE makdo(YD_REF_COORD,YD_CENTER_COORD,YD_PDEL,YD_NB_PTS,YD_GRID_COORD,P_GRID_MF, &
1127  & YD_GRID_PGN,YD_GRID_INFO,YD_ERR_CODE,LD_LIP,LD_AUTO_STOP,PI,P_RA,KOUT,LD_LMRT)
1128 ! Input Coordinates are in -+Degrees, output in 0+Radians excepted in YD_GRID_INFO : 0+D sauf Ref & Cen -+D
1129 type(lola), INTENT(INOUT) :: yd_ref_coord, yd_center_coord
1130 type(delta), INTENT(IN) :: yd_pdel
1131 type(nbpts), INTENT(IN) :: yd_nb_pts
1132 REAL(KIND=JPRD), INTENT(IN), OPTIONAL :: PI, P_RA
1133 LOGICAL, INTENT(IN), OPTIONAL :: LD_AUTO_STOP, LD_LIP, LD_LMRT
1134 type(lola), DIMENSION(YD_NB_PTS%ONX,YD_NB_PTS%ONY), INTENT(OUT) :: yd_grid_coord
1135 REAL(KIND=JPRD), DIMENSION(YD_NB_PTS%ONX,YD_NB_PTS%ONY), INTENT(OUT) :: P_GRID_MF
1136 type(pgn), DIMENSION(YD_NB_PTS%ONX,YD_NB_PTS%ONY), INTENT(OUT) :: yd_grid_pgn
1137 type(domi), INTENT(OUT) :: yd_grid_info
1138 type(error), INTENT(OUT) :: yd_err_code
1139 INTEGER(KIND=JPIM), INTENT(IN), OPTIONAL :: KOUT
1140 type(error), DIMENSION(-6:4) :: yl_tab_err_def = (/ &
1141  & error(-6_jpim, " : In Mercator, Deformations are too big out of [-85.0,85.0] (Rotated/Tilted mode)!"), &
1142  & error(-5_jpim, " : In Lambert, the pole must be out of the domain !"), &
1143  & error(-4_jpim, " : In Mercator, Deformations are too big out of [-85.0,85.0] !"), &
1144  & error(-3_jpim, " : Center point degrees coordinates out of bounds !"), &
1145  & error(-2_jpim, " : Reference point degrees coordinates out of bounds !"), &
1146  & error(-1_jpim, " : Subroutine aborted, sorry ..."), &
1147  & error( 0_jpim, " : Subroutine finished successly."), &
1148  & error( 1_jpim, " : Test OK, subroutine go ahead !"), &
1149  & error( 2_jpim, " : In Mercator, It's better to use Lambert or St.Pol. if ABS(CENTER_LAT) > 20.0 !"), &
1150  & error( 3_jpim, " : In St.Pol. , It's better to use Lambert or Mercator if ABS(CENTER_LAT) < 70.0 !"), &
1151  & error( 4_jpim, " : In Lambert , It's better to use St.Pol. or Mercator if ABS(REF_LAT) is out of [20.0,70.0] !") &
1152  & /)
1153 REAL(KIND=JPRD) :: Z_RT, Z_TPI
1154 LOGICAL :: LL_TAS, LL_TLIP, LL_TLMRT
1155 INTEGER(KIND=JPIM) :: I, J, I_TKOUT
1156 type(param_proj) :: yl_p_p
1157 type(xy), DIMENSION(YD_NB_PTS%ONX,YD_NB_PTS%ONY) :: yl_grid_xy_c, yl_grid_xy_p
1158 REAL(KIND=JPRD) :: ZHOOK_HANDLE
1159 IF (lhook) CALL dr_hook('EGGPACK:MAKDO',0,zhook_handle)
1160 IF (PRESENT(ld_lip))THEN
1161  ll_tlip = ld_lip
1162 ELSE
1163  ll_tlip = _defp_
1164 ENDIF
1165 IF (PRESENT(ld_lmrt))THEN
1166  ll_tlmrt = ld_lmrt
1167 ELSE
1168  ll_tlmrt = .false.
1169 ENDIF
1170 IF (PRESENT(kout))THEN
1171  i_tkout = kout
1172 ELSE
1173  i_tkout = 6_jpim
1174 ENDIF
1175 IF (PRESENT(ld_auto_stop))THEN
1176  ll_tas = ld_auto_stop
1177 ELSE
1178  ll_tas = .true.
1179 ENDIF
1180 IF (PRESENT(p_ra))THEN
1181  z_rt = p_ra
1182 ELSE
1183  z_rt = r_earth
1184 ENDIF
1185 IF (PRESENT(pi)) THEN
1186  z_tpi = pi
1187 ELSE
1188  z_tpi = asin(1.0_jprd)*2.0_jprd
1189 ENDIF
1190 WRITE(i_tkout,*) "Begining of Makin Domain MAKDO subroutine"
1191 ! Validation of inputs LAT_LON coordinates or init YD_ERR_CODE to no error
1192 yd_err_code = yl_tab_err_def(val_coord(yd_ref_coord,-2_jpim,z_tpi))
1193 test_1: IF (return_print(yd_err_code,1_jpim,ll_tas,i_tkout)) THEN
1194  IF (lhook) CALL dr_hook('EGGPACK:MAKDO',1,zhook_handle)
1195  RETURN
1196 ENDIF test_1
1197 yd_err_code = yl_tab_err_def(val_coord(yd_center_coord,-3_jpim,z_tpi))
1198 test_2: IF (return_print(yd_err_code,2_jpim,ll_tas,i_tkout)) THEN
1199  IF (lhook) CALL dr_hook('EGGPACK:MAKDO',1,zhook_handle)
1200  RETURN
1201 ENDIF test_2
1202 ! Compute parameters of projection and init of domain structures
1203 yd_grid_info%CT_COORD = yd_center_coord
1204 yd_grid_info%RF_COORD = yd_ref_coord
1205 yl_p_p = ref_datas(yd_ref_coord,z_rt,yd_center_coord,ll_tlmrt)
1206 yd_grid_info%INFO_PROJ = yl_p_p
1207 ! Degrees to Radians
1208 yd_center_coord = lolar(yd_center_coord)
1209 yd_ref_coord = yl_p_p%REF_PT
1210 ! Compute XY grid points under CENTER origin
1211 DO i=1_jpim,yd_nb_pts%ONX
1212  DO j=1_jpim,yd_nb_pts%ONY
1213  yl_grid_xy_c(i,j)%X = (REAL(i,kind=jprd)-(REAL(yd_nb_pts%onx+1_jpim,kind=jprd)/2.0_jprd))*yd_pdel%ONX
1214  yl_grid_xy_c(i,j)%Y = (REAL(j,kind=jprd)-(REAL(yd_nb_pts%ony+1_jpim,kind=jprd)/2.0_jprd))*yd_pdel%ONY
1215  ENDDO
1216 ENDDO
1217 IF (yl_p_p%TYPE_PJ/='W') THEN
1218  ! Change XY coordinates in CENTER Origin in STD Origin
1219  DO j=1_jpim,yd_nb_pts%ONY
1220  yl_grid_xy_p(1:yd_nb_pts%ONX,j) = &
1221  & xy_new_to_std_origin(yd_grid_info%CT_COORD,yl_grid_xy_c(1:yd_nb_pts%ONX,j),yl_p_p,z_tpi)
1222  ENDDO
1223 ELSE
1224  yl_grid_xy_p = yl_grid_xy_c
1225 ENDIF
1226 ! Validation depending projection type
1227 SELECT CASE (yl_p_p%TYPE_PJ)
1228 CASE('M')
1229  ! Validation of Mercator projection
1230  IF (abs(yd_grid_info%CT_COORD%LAT) > 20.0_jprd) yd_err_code = yl_tab_err_def(2_jpim)
1231  test_3: IF (return_print(yd_err_code,3_jpim,ll_tas,i_tkout)) THEN
1232  IF (lhook) CALL dr_hook('EGGPACK:MAKDO',1,zhook_handle)
1233  RETURN
1234  ENDIF test_3
1235  IF (maxval(abs(yl_grid_xy_p(:,:)%Y)) > 3.0_jprd*z_rt) yd_err_code = yl_tab_err_def(-4_jpim)
1236  test_4: IF (return_print(yd_err_code,4_jpim,ll_tas,i_tkout)) THEN
1237  IF (lhook) CALL dr_hook('EGGPACK:MAKDO',1,zhook_handle)
1238  RETURN
1239  ENDIF test_4
1240 CASE('S')
1241  ! Validation of Polar Stereographic projection
1242  IF (abs(yd_grid_info%CT_COORD%LAT) < 70.0_jprd) yd_err_code = yl_tab_err_def(3_jpim)
1243  test_5: IF (return_print(yd_err_code,5_jpim,ll_tas,i_tkout)) THEN
1244  IF (lhook) CALL dr_hook('EGGPACK:MAKDO',1,zhook_handle)
1245  RETURN
1246  ENDIF test_5
1247 CASE('L')
1248  ! Validation of Lambert projection
1249  IF ((abs(yd_grid_info%RF_COORD%LAT) < 20.0_jprd).OR.(abs(yd_grid_info%RF_COORD%LAT) > 70.0_jprd)) &
1250  & yd_err_code = yl_tab_err_def(4_jpim)
1251  test_6: IF (return_print(yd_err_code,6_jpim,ll_tas,i_tkout)) THEN
1252  IF (lhook) CALL dr_hook('EGGPACK:MAKDO',1,zhook_handle)
1253  RETURN
1254  ENDIF test_6
1255  IF (((yl_grid_xy_p(1,1)%X*yl_grid_xy_p(yd_nb_pts%ONX,1)%X) < 0.0_jprd).AND. &
1256  & ((yl_grid_xy_p(1,1)%Y*yl_grid_xy_p(1,yd_nb_pts%ONY)%Y) < 0.0_jprd)) yd_err_code = yl_tab_err_def(-5_jpim)
1257  test_7: IF (return_print(yd_err_code,7_jpim,ll_tas,i_tkout)) THEN
1258  IF (lhook) CALL dr_hook('EGGPACK:MAKDO',1,zhook_handle)
1259  RETURN
1260  ENDIF test_7
1261 CASE('W')
1262  ! Validation of Mercator projection in rotated/tilted case
1263  IF (maxval(abs(yl_grid_xy_p(:,:)%Y)) > 3.0_jprd*z_rt) yd_err_code = yl_tab_err_def(-6_jpim)
1264  test_8: IF (return_print(yd_err_code,8_jpim,ll_tas,i_tkout)) THEN
1265  IF (lhook) CALL dr_hook('EGGPACK:MAKDO',1,zhook_handle)
1266  RETURN
1267  ENDIF test_8
1268 END SELECT
1269 ! Compute ouputs datas depending projection type
1270 DO j=1_jpim,yd_nb_pts%ONY
1271  yd_grid_coord(1:yd_nb_pts%ONX,j) = xy_to_latlon(yl_grid_xy_p(1:yd_nb_pts%ONX,j),yl_p_p,z_tpi)
1272  p_grid_mf(1:yd_nb_pts%ONX,j) = map_factor(yd_grid_coord(1:yd_nb_pts%ONX,j),yl_p_p,z_tpi,z_rt)
1273  yd_grid_pgn(1:yd_nb_pts%ONX,j) = gn(yd_grid_coord(1:yd_nb_pts%ONX,j),yl_p_p)
1274  yd_grid_coord(1:yd_nb_pts%ONX,j) = angle_domain(yd_grid_coord(1:yd_nb_pts%ONX,j),z_tpi,'0+','R')
1275 ENDDO
1276 ! Fill info structure
1277 yd_grid_info%G_SIZE = yd_nb_pts
1278 yd_grid_info%SW_COORD = lolad(yd_grid_coord(1,1))
1279 yd_grid_info%MF_SW = p_grid_mf(1,1)
1280 yd_grid_info%SE_COORD = lolad(yd_grid_coord(yd_nb_pts%ONX,1))
1281 yd_grid_info%MF_SE = p_grid_mf(yd_nb_pts%ONX,1)
1282 yd_grid_info%NE_COORD = lolad(yd_grid_coord(yd_nb_pts%ONX,yd_nb_pts%ONY))
1283 yd_grid_info%MF_NE = p_grid_mf(yd_nb_pts%ONX,yd_nb_pts%ONY)
1284 yd_grid_info%NW_COORD = lolad(yd_grid_coord(1,yd_nb_pts%ONY))
1285 yd_grid_info%MF_NW = p_grid_mf(1,yd_nb_pts%ONY)
1286 yd_grid_info%MF_RF = map_factor(yd_ref_coord,yl_p_p,z_tpi,z_rt)
1287 yd_grid_info%MF_CT = map_factor(yd_center_coord,yl_p_p,z_tpi,z_rt)
1288 yd_ref_coord = angle_domain(yd_ref_coord,z_tpi,'0+','R')
1289 yd_center_coord = angle_domain(yd_center_coord,z_tpi,'0+','R')
1290 IF (ll_tlip) CALL info_print(yd_grid_info,i_tkout,z_tpi)
1291 WRITE (i_tkout,*) "Subroutine last status when finished : "
1292 IF (yd_err_code%NUM == 1_jpim) yd_err_code = yl_tab_err_def(0_jpim)
1293 test_9: IF (return_print(yd_err_code,9_jpim,ll_tas,i_tkout)) THEN
1294  IF (lhook) CALL dr_hook('EGGPACK:MAKDO',1,zhook_handle)
1295  RETURN
1296 ENDIF test_9
1297 IF (lhook) CALL dr_hook('EGGPACK:MAKDO',1,zhook_handle)
1298 END SUBROUTINE makdo
1299 
1300 #undef _DEFP_
1301 ! -------------------------------------------------------------------------------
1302 END MODULE eggpack
type(lola) function xy_to_latlon_s(PT_XY, P_PJ, PI)
Definition: eggpack.F90:907
type(xy) function stlp_rteta_to_xy_s(PT_RTETA, P_PJ)
Definition: eggpack.F90:560
type(rteta) function, dimension(size(pt_coord)) stpl_latlon_to_rteta_v(PT_COORD, P_PJ, PI)
Definition: eggpack.F90:630
integer, parameter jpim
Definition: parkind1.F90:13
real(kind=jprd), parameter, public r_earth
Definition: eggpack.F90:265
integer, parameter jprd
Definition: parkind1.F90:39
subroutine abor1(CDTEXT)
Definition: abor1.F90:2
logical function return_print(YD_CODE_ERR, K_NUM_TEST, AUTO_STOP, KOUT)
Definition: eggpack.F90:458
type(xy) function xy_std_to_new_origin_s(NEW_ORIGIN_COORD, PT_XY_IN_STD_ORIGIN, P_PJ, PI)
Definition: eggpack.F90:802
type(rteta) function stlp_xy_to_rteta_s(PT_XY, P_PJ, PI)
Definition: eggpack.F90:573
type(xy) function, dimension(size(pt_rteta)) stlp_rteta_to_xy_v(PT_RTETA, P_PJ)
Definition: eggpack.F90:651
subroutine info_pp_print(P_P, KOUT, PI)
Definition: eggpack.F90:412
type(xy) function, dimension(size(yl_pt_xy_in_std_origin)) xy_std_to_new_origin_v(YL_NEW_ORIGIN_COORD, YL_PT_XY_IN_STD_ORIGIN, P_PJ, PI)
Definition: eggpack.F90:849
real(kind=jprd) function map_factor_s(PT_COORD, P_PJ, PI, RA)
Definition: eggpack.F90:1003
character(len=1) function type_proj(REF_COORD)
Definition: eggpack.F90:501
type(rteta) function stpl_latlon_to_rteta_s(PT_COORD, P_PJ, PI)
Definition: eggpack.F90:540
Definition: eggmrt.F90:1
type(param_proj) function ref_datas(REF_COORD, RA, TOZERO_COORD, LRT)
Definition: eggpack.F90:729
subroutine makdo(YD_REF_COORD, YD_CENTER_COORD, YD_PDEL, YD_NB_PTS, YD_GRID_COORD, P_GRID_MF, YD_GRID_PGN, YD_GRID_INFO, YD_ERR_CODE, LD_LIP, LD_AUTO_STOP, PI, P_RA, KOUT, LD_LMRT)
Definition: eggpack.F90:1128
type(xy) function, dimension(size(pt_coord)) latlon_to_xy_v(PT_COORD, P_PJ, PI)
Definition: eggpack.F90:937
type(rteta) function, dimension(size(pt_xy)) stlp_xy_to_rteta_v(PT_XY, P_PJ, PI)
Definition: eggpack.F90:665
logical lhook
Definition: yomhook.F90:15
type(xy) function xy_new_to_std_origin_s(NEW_ORIGIN_COORD, PT_XY_IN_NEW_ORIGIN, P_PJ, PI)
Definition: eggpack.F90:779
real(kind=jprd) function pole_is(REF_COORD)
Definition: eggpack.F90:519
type(lola) function stlp_rteta_to_latlon_s(PT_RTETA, P_PJ, PI)
Definition: eggpack.F90:610
type(lola) function, dimension(size(pt_rteta)) stlp_rteta_to_latlon_v(PT_RTETA, P_PJ, PI)
Definition: eggpack.F90:703
type(xy) function latlon_to_xy_s(PT_COORD, P_PJ, PI)
Definition: eggpack.F90:875
type(lola) function, dimension(size(yl_pt_xy)) xy_to_latlon_v(YL_PT_XY, P_PJ, PI)
Definition: eggpack.F90:970
type(xy) function, dimension(size(pt_xy_in_new_origin)) xy_new_to_std_origin_v(NEW_ORIGIN_COORD, PT_XY_IN_NEW_ORIGIN, P_PJ, PI)
Definition: eggpack.F90:825
subroutine info_domi_print(YD_G_INFO, KOUT, PI)
Definition: eggpack.F90:364
type(pgn) function gn_s(PT_COORD, P_PJ)
Definition: eggpack.F90:1070
real(kind=jprd) function, dimension(size(pt_coord)) map_factor_v(PT_COORD, P_PJ, PI, RA)
Definition: eggpack.F90:1036
type(pgn) function, dimension(size(yd_pt_coord)) gn_v(YD_PT_COORD, YD_P_PJ)
Definition: eggpack.F90:1095