SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/XRD38/module/eggangles.F90
Go to the documentation of this file.
00001 MODULE EGGANGLES
00002 
00003 ! Version 2009.0317 by JD GRIL
00004 
00005 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! DOC !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
00006 !  All these functions make a package tool for angle.
00007 !  In functions where appears DOM and UNIT indicate the domain of validity :
00008 !         DOM     UNIT           Longitudes           Latitudes
00009 !         "-+"    "D"          [-180.0,180.0[       [-90.0,90.0]
00010 !         "0+"    "D"             [0.0,360.0[       [-90.0,90.0]
00011 !         "-+"    "R"             [-pi,pi[        [-pi/2.0,pi/2.0] 
00012 !         "0+"    "R"              [0,pi[         [-pi/2.0,pi/2.0]
00013 !  (defaults values are DOM = "-+" and UNIT = "D").
00014 
00015 !  All functions work for scalar or one dimensional array in input.
00016 
00017 !  -1- ANGLE_DOMAIN function
00018 
00019 !->function ANGLE_DOMAIN(ALPHA,PI,DOM,UNIT)
00020 
00021 !     Converts longitudes in UNIT values under choisen DOMain.
00022 !     The input (ALPHA) is a longitude (REAL) or a LOLA type structure ( or
00023 !     array of them). The output has the same type than the input.       
00024 
00025 !  -2- VAL_ functions
00026 
00027 !->integer function VAL_LAT(LAT,NUM_ERR,PI,UNIT)
00028 
00029 !     Test validity of LAT [-90.0,90.0] 
00030 !     Return -1 or NUM_ERR if it's present in error case, 1 if it's ok.
00031 
00032 !->integer function VAL_LON(LON,NUM_ERR,PI,DOM,UNIT)
00033 
00034 !     Test validity of LON [-180.0,180.0[ or [0.0,360.0[ 
00035 !     Return -1 or NUM_ERR if it's present in error case, 1 if it's ok.
00036 
00037 !->integer function VAL_COORD(PT_COORD,NUM_ERR,PI,DOM,UNIT) 
00038 
00039 !     Test validity of LAT [-90.0,90.0] and LON [-180.0,180.0[ or [0.0,360.0[
00040 !     (depends the value of DOM) of a PT_COORD structure of type LOLA (in UNIT).
00041 !     Return -1 or NUM_ERR if it's present in error case, 1 if it's ok.
00042 
00043 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
00044 ! Author : Jean-Daniel GRIL , CNRM/GMAP/COOPE , Februry 08 2000
00045 
00046 ! Modified:
00047 ! In April 2001 by M. Janousek (A few modifs to port the deck to the model code)
00048 ! In November 2004 by JD Gril : more routines to manage angles
00049 !                             : debug VAL_COORD_x
00050 ! 2005 by JD Gril : more functions for Mercator RT
00051 ! In June 2006 by JD Gril     : line too long (L607 > 132 col.)
00052 ! July 2008 by JD Gril        : add 2 new functions to compute distance or size
00053 !                             : on longitude : DIST_2REF and SIZE_W2E
00054 ! March 2009 by JD Gril       : add Vector routines
00055 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
00056 
00057 ! ******************* Definition of parameters **********************************
00058 
00059 ! Include Kinds
00060 ! -------------
00061 
00062 !* kindef: define default KIND macros
00063 ! --------------------------------------
00064 USE PARKIND1  ,ONLY : JPIM,    JPRB
00065 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00066 ! --------------------------------------
00067 
00068 IMPLICIT NONE
00069 
00070 ! ******************* Definition of type ****************************************
00071 
00072 TYPE LOLA
00073   SEQUENCE
00074   REAL(KIND=JPRB) :: LON, LAT
00075 END TYPE LOLA
00076 
00077 ! ******************* Definition of Interface ***********************************
00078 
00079 INTERFACE ANGLE_DOMAIN
00080   MODULE PROCEDURE ANGLE_DOMAIN_RS, ANGLE_DOMAIN_LOLAS, ANGLE_DOMAIN_RV, ANGLE_DOMAIN_LOLAV
00081 END INTERFACE
00082 INTERFACE VAL_LAT
00083   MODULE PROCEDURE VAL_LAT_S, VAL_LAT_V
00084 END INTERFACE
00085 INTERFACE VAL_LON
00086   MODULE PROCEDURE VAL_LON_S, VAL_LON_V
00087 END INTERFACE
00088 INTERFACE VAL_COORD
00089   MODULE PROCEDURE VAL_COORD_S, VAL_COORD_V
00090 END INTERFACE
00091 INTERFACE LOLAD
00092   MODULE PROCEDURE LOLAD_S, LOLAD_V
00093 END INTERFACE
00094 INTERFACE LOLAR
00095   MODULE PROCEDURE LOLAR_S, LOLAR_V
00096 END INTERFACE
00097 INTERFACE MINIMAX
00098   MODULE PROCEDURE  MINIMAX_S, MINIMAX_V
00099 END INTERFACE
00100 INTERFACE COSIN_TO_ANGLE
00101   MODULE PROCEDURE COSIN_TO_ANGLE_S, COSIN_TO_ANGLE_V
00102 END INTERFACE
00103 INTERFACE P_ASIN
00104   MODULE PROCEDURE P_ASIN_S, P_ASIN_V
00105 END INTERFACE
00106 INTERFACE P_ACOS
00107   MODULE PROCEDURE P_ACOS_S, P_ACOS_V
00108 END INTERFACE
00109 INTERFACE DIST_2REF
00110   MODULE PROCEDURE DIST_2REF_S, DIST_2REF_V, DIST_2REF_L
00111 END INTERFACE
00112 INTERFACE SIZE_W2E
00113   MODULE PROCEDURE SIZE_W2E_S, SIZE_W2E_L
00114 END INTERFACE
00115 CONTAINS
00116 
00117 ! =================== FUNCTIONS =================================================
00118 
00119 ! ******************* Independants functions ************************************
00120 
00121 ! -------------------------------------------------------------------------------
00122 REAL(KIND=JPRB) FUNCTION ANGLE_DOMAIN_RS(ALPHA,PI,DOM,UNIT) RESULT (BETA)
00123 REAL(KIND=JPRB), INTENT(IN)                           :: ALPHA
00124 CHARACTER (LEN=2), INTENT(IN), OPTIONAL               :: DOM
00125 CHARACTER (LEN=1), INTENT(IN), OPTIONAL               :: UNIT
00126 REAL(KIND=JPRB), INTENT(IN), OPTIONAL                 :: PI
00127 
00128 
00129 REAL(KIND=JPRB)   :: CVT, TPI, M
00130 CHARACTER (LEN=2) :: TDOM
00131 CHARACTER (LEN=1) :: TUNIT
00132 REAL(KIND=JPRB)   :: ZHOOK_HANDLE
00133 
00134 IF (LHOOK) CALL DR_HOOK('EGGANGLES:ANGLE_DOMAIN_RS',0,ZHOOK_HANDLE)
00135 IF (PRESENT(PI)) THEN
00136   TPI = PI
00137 ELSE
00138   TPI = ASIN(1.0_JPRB)*2.0_JPRB
00139 ENDIF
00140 IF (PRESENT(DOM)) THEN
00141   IF ((DOM=='0+').OR.(DOM=='-+')) THEN
00142     TDOM = DOM
00143   ELSE
00144     TDOM = "-+"
00145   ENDIF
00146 ELSE
00147   TDOM = "-+"
00148 ENDIF
00149 IF (PRESENT(UNIT)) THEN
00150   IF ((UNIT=='R').OR.(UNIT=='D')) THEN
00151     TUNIT = UNIT
00152   ELSE
00153     TUNIT = "D"
00154   ENDIF
00155 ELSE
00156   TUNIT = "D"
00157 ENDIF
00158 
00159 IF (TUNIT=='R') THEN
00160   CVT = TPI
00161 ELSE
00162   CVT = 180.0_JPRB
00163 ENDIF
00164 
00165 IF (TDOM=='-+') THEN
00166   M = MOD(ALPHA,CVT)
00167   BETA = (M-CVT*MOD(REAL(INT(ALPHA/CVT),KIND=JPRB),2.0_JPRB))*SIGN(1.0_JPRB,ALPHA)*SIGN(1.0_JPRB,M)
00168 ELSE
00169   M = MOD(ALPHA,2.0_JPRB*CVT)
00170   BETA = M-2.0_JPRB*CVT*(SIGN(0.5_JPRB,ALPHA)-0.5_JPRB)
00171 ENDIF
00172 IF (LHOOK) CALL DR_HOOK('EGGANGLES:ANGLE_DOMAIN_RS',1,ZHOOK_HANDLE)
00173 END FUNCTION ANGLE_DOMAIN_RS
00174 ! -------------------------------------------------------------------------------
00175 TYPE (LOLA) FUNCTION ANGLE_DOMAIN_LOLAS(ALPHA,PI,DOM,UNIT) RESULT (BETA)
00176 TYPE (LOLA), INTENT(IN)                                :: ALPHA
00177 CHARACTER (LEN=2), INTENT(IN), OPTIONAL                :: DOM
00178 CHARACTER (LEN=1), INTENT(IN), OPTIONAL                :: UNIT
00179 REAL(KIND=JPRB), INTENT(IN), OPTIONAL                  :: PI
00180 
00181 REAL(KIND=JPRB)   :: TPI
00182 CHARACTER (LEN=2) :: TDOM
00183 CHARACTER (LEN=1) :: TUNIT
00184 REAL(KIND=JPRB)   :: ZHOOK_HANDLE
00185 
00186 IF (LHOOK) CALL DR_HOOK('EGGANGLES:ANGLE_DOMAIN_LOLAS',0,ZHOOK_HANDLE)
00187 IF (PRESENT(PI)) THEN
00188   TPI = PI
00189 ELSE
00190   TPI = ASIN(1.0_JPRB)*2.0_JPRB
00191 ENDIF
00192 IF (PRESENT(DOM)) THEN
00193   IF ((DOM=='0+').OR.(DOM=='-+')) THEN
00194     TDOM = DOM
00195   ELSE
00196     TDOM = "-+"
00197   ENDIF
00198 ELSE
00199   TDOM = "-+"
00200 ENDIF
00201 IF (PRESENT(UNIT)) THEN
00202   IF ((UNIT=='R').OR.(UNIT=='D')) THEN
00203     TUNIT = UNIT
00204   ELSE
00205     TUNIT = "D"
00206   ENDIF
00207 ELSE
00208   TUNIT = "D"
00209 ENDIF
00210 
00211 BETA%LON = ANGLE_DOMAIN(ALPHA%LON,TPI,TDOM,TUNIT)
00212 BETA%LAT = ALPHA%LAT
00213 IF (LHOOK) CALL DR_HOOK('EGGANGLES:ANGLE_DOMAIN_LOLAS',1,ZHOOK_HANDLE)
00214 END FUNCTION ANGLE_DOMAIN_LOLAS
00215 ! -------------------------------------------------------------------------------
00216 FUNCTION ANGLE_DOMAIN_RV(ALPHA,PI,DOM,UNIT) RESULT (BETA)
00217 REAL(KIND=JPRB), DIMENSION(:), INTENT(IN)             :: ALPHA
00218 CHARACTER (LEN=2), INTENT(IN), OPTIONAL               :: DOM
00219 CHARACTER (LEN=1), INTENT(IN), OPTIONAL               :: UNIT
00220 REAL(KIND=JPRB), INTENT(IN), OPTIONAL                 :: PI
00221 REAL(KIND=JPRB), DIMENSION(SIZE(ALPHA)) :: BETA
00222 
00223 REAL(KIND=JPRB)                         :: CVT, TPI
00224 REAL(KIND=JPRB), DIMENSION(SIZE(ALPHA)) :: Z_M
00225 CHARACTER (LEN=2)                       :: TDOM
00226 CHARACTER (LEN=1)                       :: TUNIT
00227 REAL(KIND=JPRB)                         :: ZHOOK_HANDLE
00228 
00229 IF (LHOOK) CALL DR_HOOK('EGGANGLES:ANGLE_DOMAIN_RV',0,ZHOOK_HANDLE)
00230 IF (PRESENT(PI)) THEN
00231   TPI = PI
00232 ELSE
00233   TPI = ASIN(1.0_JPRB)*2.0_JPRB
00234 ENDIF
00235 IF (PRESENT(DOM)) THEN
00236   IF ((DOM=='0+').OR.(DOM=='-+')) THEN
00237     TDOM = DOM
00238   ELSE
00239     TDOM = "-+"
00240   ENDIF
00241 ELSE
00242   TDOM = "-+"
00243 ENDIF
00244 IF (PRESENT(UNIT)) THEN
00245   IF ((UNIT=='R').OR.(UNIT=='D')) THEN
00246     TUNIT = UNIT
00247   ELSE
00248     TUNIT = "D"
00249   ENDIF
00250 ELSE
00251   TUNIT = "D"
00252 ENDIF
00253 
00254 IF (TUNIT=='R') THEN
00255   CVT = TPI
00256 ELSE
00257   CVT = 180.0_JPRB
00258 ENDIF
00259 
00260 IF (TDOM=='-+') THEN
00261   Z_M(:) = MOD(ALPHA(:),CVT)
00262   BETA = (Z_M(:)-CVT*MOD(REAL(INT(ALPHA(:)/CVT),KIND=JPRB),2.0_JPRB))*SIGN(1.0_JPRB,ALPHA(:))*SIGN(1.0_JPRB,Z_M(:))
00263 ELSE
00264   Z_M(:) = MOD(ALPHA(:),2.0_JPRB*CVT)
00265   BETA = Z_M(:)-2.0_JPRB*CVT*(SIGN(0.5_JPRB,ALPHA(:))-0.5_JPRB)
00266 ENDIF
00267 IF (LHOOK) CALL DR_HOOK('EGGANGLES:ANGLE_DOMAIN_RV',1,ZHOOK_HANDLE)
00268 END FUNCTION ANGLE_DOMAIN_RV
00269 ! -------------------------------------------------------------------------------
00270 FUNCTION ANGLE_DOMAIN_LOLAV(YL_ALPHA,PI,DOM,UNIT) RESULT (YD_BETA)
00271 TYPE (LOLA), DIMENSION(:), INTENT(IN)               :: YL_ALPHA
00272 CHARACTER (LEN=2), INTENT(IN), OPTIONAL             :: DOM
00273 CHARACTER (LEN=1), INTENT(IN), OPTIONAL             :: UNIT
00274 REAL(KIND=JPRB), INTENT(IN), OPTIONAL               :: PI
00275 TYPE (LOLA), DIMENSION(SIZE(YL_ALPHA)) :: YD_BETA
00276 
00277 REAL(KIND=JPRB)   :: TPI
00278 CHARACTER (LEN=2) :: TDOM
00279 CHARACTER (LEN=1) :: TUNIT
00280 REAL(KIND=JPRB)   :: ZHOOK_HANDLE
00281 
00282 IF (LHOOK) CALL DR_HOOK('EGGANGLES:ANGLE_DOMAIN_LOLAV',0,ZHOOK_HANDLE)
00283 IF (PRESENT(PI)) THEN
00284   TPI = PI
00285 ELSE
00286   TPI = ASIN(1.0_JPRB)*2.0_JPRB
00287 ENDIF
00288 IF (PRESENT(DOM)) THEN
00289   IF ((DOM=='0+').OR.(DOM=='-+')) THEN
00290     TDOM = DOM
00291   ELSE
00292     TDOM = "-+"
00293   ENDIF
00294 ELSE
00295   TDOM = "-+"
00296 ENDIF
00297 IF (PRESENT(UNIT)) THEN
00298   IF ((UNIT=='R').OR.(UNIT=='D')) THEN
00299     TUNIT = UNIT
00300   ELSE
00301     TUNIT = "D"
00302   ENDIF
00303 ELSE
00304   TUNIT = "D"
00305 ENDIF
00306 
00307 YD_BETA(:)%LON = ANGLE_DOMAIN(YL_ALPHA(:)%LON,TPI,TDOM,TUNIT)
00308 YD_BETA(:)%LAT = YL_ALPHA(:)%LAT
00309 IF (LHOOK) CALL DR_HOOK('EGGANGLES:ANGLE_DOMAIN_LOLAV',1,ZHOOK_HANDLE)
00310 END FUNCTION ANGLE_DOMAIN_LOLAV
00311 ! -------------------------------------------------------------------------------
00312 INTEGER(KIND=JPIM) FUNCTION VAL_LAT_S(LAT,NUM_ERR,PI,UNIT) RESULT(ETAT)
00313 REAL(KIND=JPRB), INTENT(IN)                          :: LAT
00314 CHARACTER (LEN=1), INTENT(IN), OPTIONAL              :: UNIT
00315 REAL(KIND=JPRB), INTENT(IN), OPTIONAL                :: PI
00316 INTEGER(KIND=JPIM), INTENT(IN), OPTIONAL             :: NUM_ERR
00317 
00318 INTEGER(KIND=JPIM) :: TNE
00319 REAL(KIND=JPRB)    :: TPI, LATMXABS
00320 CHARACTER (LEN=1)  :: TUNIT
00321 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00322 
00323 IF (LHOOK) CALL DR_HOOK('EGGANGLES:VAL_LAT_S',0,ZHOOK_HANDLE)
00324 IF (PRESENT(NUM_ERR))THEN
00325   TNE = NUM_ERR
00326 ELSE
00327   TNE = -1_JPIM
00328 ENDIF
00329 IF (PRESENT(PI)) THEN
00330   TPI = PI
00331 ELSE
00332   TPI = ASIN(1.0_JPRB)*2.0_JPRB
00333 ENDIF
00334 IF (PRESENT(UNIT)) THEN
00335   IF ((UNIT=='R').OR.(UNIT=='D')) THEN
00336     TUNIT = UNIT
00337   ELSE
00338     TUNIT = "D"
00339   ENDIF
00340 ELSE
00341   TUNIT = "D"
00342 ENDIF
00343 
00344 IF (TUNIT=='R') THEN
00345   LATMXABS = TPI/2.0_JPRB
00346 ELSE
00347   LATMXABS = 90.0_JPRB
00348 ENDIF
00349 
00350 IF (ABS(LAT) > LATMXABS) THEN
00351   ETAT = TNE
00352 ELSE
00353   ETAT = 1_JPIM
00354 ENDIF
00355 IF (LHOOK) CALL DR_HOOK('EGGANGLES:VAL_LAT_S',1,ZHOOK_HANDLE)
00356 END FUNCTION VAL_LAT_S
00357 ! -------------------------------------------------------------------------------
00358 INTEGER(KIND=JPIM) FUNCTION VAL_LAT_V(P_LAT,NUM_ERR,PI,UNIT) RESULT(ETAT)
00359 REAL(KIND=JPRB), DIMENSION(:), INTENT(IN)                 :: P_LAT
00360 CHARACTER (LEN=1), INTENT(IN), OPTIONAL                   :: UNIT
00361 REAL(KIND=JPRB), INTENT(IN), OPTIONAL                     :: PI
00362 INTEGER(KIND=JPIM), INTENT(IN), OPTIONAL                  :: NUM_ERR
00363 
00364 INTEGER(KIND=JPIM) :: TNE
00365 REAL(KIND=JPRB)    :: TPI, Z_LATMXABS
00366 CHARACTER (LEN=1)  :: TUNIT
00367 REAL(KIND=JPRB)    :: ZHOOK_HANDLE
00368 
00369 IF (LHOOK) CALL DR_HOOK('EGGANGLES:VAL_LAT_V',0,ZHOOK_HANDLE)
00370 IF (PRESENT(NUM_ERR))THEN
00371   TNE = NUM_ERR
00372 ELSE
00373   TNE = -1_JPIM
00374 ENDIF
00375 IF (PRESENT(PI)) THEN
00376   TPI = PI
00377 ELSE
00378   TPI = ASIN(1.0_JPRB)*2.0_JPRB
00379 ENDIF
00380 IF (PRESENT(UNIT)) THEN
00381   IF ((UNIT=='R').OR.(UNIT=='D')) THEN
00382     TUNIT = UNIT
00383   ELSE
00384     TUNIT = "D"
00385   ENDIF
00386 ELSE
00387   TUNIT = "D"
00388 ENDIF
00389 
00390 IF (TUNIT=='R') THEN
00391   Z_LATMXABS = TPI/2.0_JPRB
00392 ELSE
00393   Z_LATMXABS = 90.0_JPRB
00394 ENDIF
00395 
00396 IF (ANY(ABS(P_LAT(:)) > Z_LATMXABS)) THEN
00397   ETAT = TNE
00398 ELSE
00399   ETAT = 1_JPIM
00400 ENDIF
00401 IF (LHOOK) CALL DR_HOOK('EGGANGLES:VAL_LAT_V',1,ZHOOK_HANDLE)
00402 END FUNCTION VAL_LAT_V
00403 ! -------------------------------------------------------------------------------
00404 INTEGER(KIND=JPIM) FUNCTION VAL_LON_S(LON,NUM_ERR,PI,DOM,UNIT) RESULT(ETAT)
00405 REAL(KIND=JPRB), INTENT(IN)                                :: LON
00406 CHARACTER (LEN=2), INTENT(IN), OPTIONAL                    :: DOM
00407 CHARACTER (LEN=1), INTENT(IN), OPTIONAL                    :: UNIT
00408 REAL(KIND=JPRB), INTENT(IN), OPTIONAL                      :: PI
00409 INTEGER(KIND=JPIM), INTENT(IN), OPTIONAL                   :: NUM_ERR
00410 
00411 INTEGER(KIND=JPIM) :: TNE
00412 REAL(KIND=JPRB)    :: TPI, CVT, S, LONMIN, LONMAX
00413 CHARACTER (LEN=2)  :: TDOM
00414 CHARACTER (LEN=1)  :: TUNIT
00415 REAL(KIND=JPRB)    :: ZHOOK_HANDLE
00416 
00417 IF (LHOOK) CALL DR_HOOK('EGGANGLES:VAL_LON_S',0,ZHOOK_HANDLE)
00418 IF (PRESENT(NUM_ERR))THEN
00419   TNE = NUM_ERR
00420 ELSE
00421   TNE = -1_JPIM
00422 ENDIF
00423 IF (PRESENT(PI)) THEN
00424   TPI = PI
00425 ELSE
00426   TPI = ASIN(1.0_JPRB)*2.0_JPRB
00427 ENDIF
00428 IF (PRESENT(DOM)) THEN
00429   IF ((DOM=='0+').OR.(DOM=='-+')) THEN
00430     TDOM = DOM
00431   ELSE
00432     TDOM = "-+"
00433   ENDIF
00434 ELSE
00435   TDOM = "-+"
00436 ENDIF
00437 IF (PRESENT(UNIT)) THEN
00438   IF ((UNIT=='R').OR.(UNIT=='D')) THEN
00439     TUNIT = UNIT
00440   ELSE
00441     TUNIT = "D"
00442   ENDIF
00443 ELSE
00444   TUNIT = "D"
00445 ENDIF
00446 
00447 IF (TUNIT=='R') THEN
00448   CVT = TPI
00449 ELSE
00450   CVT = 180.0_JPRB
00451 ENDIF
00452 IF (TDOM=='-+') THEN
00453   S = -1.0_JPRB
00454 ELSE
00455   S = 0.0_JPRB
00456 ENDIF
00457 LONMIN = S*CVT
00458 LONMAX =(2.0_JPRB +S)*CVT
00459 
00460 IF ((LON < LONMIN).OR.(LON >= LONMAX)) THEN
00461   ETAT = TNE
00462 ELSE
00463   ETAT = 1_JPIM
00464 ENDIF
00465 IF (LHOOK) CALL DR_HOOK('EGGANGLES:VAL_LON_S',1,ZHOOK_HANDLE)
00466 END FUNCTION VAL_LON_S
00467 ! -------------------------------------------------------------------------------
00468 INTEGER(KIND=JPIM) FUNCTION VAL_LON_V(LON,NUM_ERR,PI,DOM,UNIT) RESULT(ETAT)
00469 REAL(KIND=JPRB), DIMENSION(:), INTENT(IN)                       :: LON
00470 CHARACTER (LEN=2), INTENT(IN), OPTIONAL                         :: DOM
00471 CHARACTER (LEN=1), INTENT(IN), OPTIONAL                         :: UNIT
00472 REAL(KIND=JPRB), INTENT(IN), OPTIONAL                           :: PI
00473 INTEGER(KIND=JPIM), INTENT(IN), OPTIONAL                        :: NUM_ERR
00474 
00475 INTEGER(KIND=JPIM) :: TNE
00476 REAL(KIND=JPRB)    :: TPI, Z_CVT, Z_S, Z_LONMIN, Z_LONMAX
00477 CHARACTER (LEN=2)  :: TDOM
00478 CHARACTER (LEN=1)  :: TUNIT
00479 REAL(KIND=JPRB)    :: ZHOOK_HANDLE
00480 
00481 IF (LHOOK) CALL DR_HOOK('EGGANGLES:VAL_LON_V',0,ZHOOK_HANDLE)
00482 IF (PRESENT(NUM_ERR))THEN
00483   TNE = NUM_ERR
00484 ELSE
00485   TNE = -1_JPIM
00486 ENDIF
00487 IF (PRESENT(PI)) THEN
00488   TPI = PI
00489 ELSE
00490   TPI = ASIN(1.0_JPRB)*2.0_JPRB
00491 ENDIF
00492 IF (PRESENT(DOM)) THEN
00493   IF ((DOM=='0+').OR.(DOM=='-+')) THEN
00494     TDOM = DOM
00495   ELSE
00496     TDOM = "-+"
00497   ENDIF
00498 ELSE
00499   TDOM = "-+"
00500 ENDIF
00501 IF (PRESENT(UNIT)) THEN
00502   IF ((UNIT=='R').OR.(UNIT=='D')) THEN
00503     TUNIT = UNIT
00504   ELSE
00505     TUNIT = "D"
00506   ENDIF
00507 ELSE
00508   TUNIT = "D"
00509 ENDIF
00510 
00511 IF (TUNIT=='R') THEN
00512   Z_CVT = TPI
00513 ELSE
00514   Z_CVT = 180.0_JPRB
00515 ENDIF
00516 IF (TDOM=='-+') THEN
00517   Z_S = -1.0_JPRB
00518 ELSE
00519   Z_S = 0.0_JPRB
00520 ENDIF
00521 Z_LONMIN = Z_S*Z_CVT
00522 Z_LONMAX =(2.0_JPRB +Z_S)*Z_CVT
00523 
00524 IF ((ANY(LON(:) < Z_LONMIN)).OR.(ANY(LON(:) >= Z_LONMAX))) THEN
00525   ETAT = TNE
00526 ELSE
00527   ETAT = 1_JPIM
00528 ENDIF
00529 IF (LHOOK) CALL DR_HOOK('EGGANGLES:VAL_LON_V',1,ZHOOK_HANDLE)
00530 END FUNCTION VAL_LON_V
00531 ! -------------------------------------------------------------------------------
00532 INTEGER(KIND=JPIM) FUNCTION VAL_COORD_S(PT_COORD,NUM_ERR,PI,DOM,UNIT) RESULT(ETAT)
00533 TYPE (LOLA), INTENT(IN)                               :: PT_COORD
00534 CHARACTER (LEN=2), INTENT(IN), OPTIONAL               :: DOM
00535 CHARACTER (LEN=1), INTENT(IN), OPTIONAL               :: UNIT
00536 REAL(KIND=JPRB), INTENT(IN), OPTIONAL                 :: PI
00537 INTEGER(KIND=JPIM), INTENT(IN), OPTIONAL              :: NUM_ERR
00538 
00539 INTEGER(KIND=JPIM) :: TNE
00540 REAL(KIND=JPRB)    :: TPI
00541 CHARACTER (LEN=2)  :: TDOM
00542 CHARACTER (LEN=1)  :: TUNIT
00543 REAL(KIND=JPRB)    :: ZHOOK_HANDLE
00544 
00545 IF (LHOOK) CALL DR_HOOK('EGGANGLES:VAL_COORD_S',0,ZHOOK_HANDLE)
00546 IF (PRESENT(NUM_ERR))THEN
00547   TNE = NUM_ERR
00548 ELSE
00549   TNE = -1_JPIM
00550 ENDIF
00551 IF (PRESENT(PI)) THEN
00552   TPI = PI
00553 ELSE
00554   TPI = ASIN(1.0_JPRB)*2.0_JPRB
00555 ENDIF
00556 IF (PRESENT(DOM)) THEN
00557   IF ((DOM=='0+').OR.(DOM=='-+')) THEN
00558     TDOM = DOM
00559   ELSE
00560     TDOM = "-+"
00561   ENDIF
00562 ELSE
00563   TDOM = "-+"
00564 ENDIF
00565 IF (PRESENT(UNIT)) THEN
00566   IF ((UNIT=='R').OR.(UNIT=='D')) THEN
00567     TUNIT = UNIT
00568   ELSE
00569     TUNIT = "D"
00570   ENDIF
00571 ELSE
00572   TUNIT = "D"
00573 ENDIF
00574 
00575 IF ((VAL_LON(PT_COORD%LON,TNE,TPI,TDOM,TUNIT) == 1_JPIM).AND.(VAL_LAT(PT_COORD%LAT,TNE,TPI,TUNIT) == 1_JPIM)) THEN
00576   ETAT = 1_JPIM
00577 ELSE
00578   ETAT = TNE
00579 ENDIF
00580 IF (LHOOK) CALL DR_HOOK('EGGANGLES:VAL_COORD_S',1,ZHOOK_HANDLE)
00581 END FUNCTION VAL_COORD_S
00582 ! -------------------------------------------------------------------------------
00583 INTEGER(KIND=JPIM) FUNCTION VAL_COORD_V(YD_PT_COORD,K_NUM_ERR,PI,CD_DOM,CD_UNIT) RESULT(ETAT)
00584 TYPE (LOLA), DIMENSION(:), INTENT(IN)                   :: YD_PT_COORD
00585 CHARACTER (LEN=2), INTENT(IN), OPTIONAL                 :: CD_DOM
00586 CHARACTER (LEN=1), INTENT(IN), OPTIONAL                 :: CD_UNIT
00587 REAL(KIND=JPRB), INTENT(IN), OPTIONAL                   :: PI
00588 INTEGER(KIND=JPIM), INTENT(IN), OPTIONAL                :: K_NUM_ERR
00589 
00590 INTEGER(KIND=JPIM) :: I_TNE
00591 CHARACTER (LEN=2)  :: CL_TDOM
00592 REAL(KIND=JPRB)    :: Z_TPI
00593 CHARACTER (LEN=1)  :: CL_TUNIT
00594 REAL(KIND=JPRB)    :: ZHOOK_HANDLE
00595 
00596 IF (LHOOK) CALL DR_HOOK('EGGANGLES:VAL_COORD_V',0,ZHOOK_HANDLE)
00597 IF (PRESENT(K_NUM_ERR))THEN
00598   I_TNE = K_NUM_ERR
00599 ELSE
00600   I_TNE = -1_JPIM
00601 ENDIF
00602 IF (PRESENT(PI)) THEN
00603   Z_TPI = PI
00604 ELSE
00605   Z_TPI = ASIN(1.0_JPRB)*2.0_JPRB
00606 ENDIF
00607 IF (PRESENT(CD_DOM)) THEN
00608   IF ((CD_DOM=='0+').OR.(CD_DOM=='-+')) THEN
00609     CL_TDOM = CD_DOM
00610   ELSE
00611     CL_TDOM = "-+"
00612   ENDIF
00613 ELSE
00614   CL_TDOM = "-+"
00615 ENDIF
00616 IF (PRESENT(CD_UNIT)) THEN
00617   IF ((CD_UNIT=='R').OR.(CD_UNIT=='D')) THEN
00618     CL_TUNIT = CD_UNIT
00619   ELSE
00620     CL_TUNIT = "D"
00621   ENDIF
00622 ELSE
00623   CL_TUNIT = "D"
00624 ENDIF
00625 
00626 IF ((VAL_LON(YD_PT_COORD(:)%LON,I_TNE,Z_TPI,CL_TDOM,CL_TUNIT) == 1_JPIM).AND. &
00627  & (VAL_LAT(YD_PT_COORD(:)%LAT,I_TNE,Z_TPI,CL_TUNIT) == 1_JPIM)) THEN
00628   ETAT = 1_JPIM
00629 ELSE
00630   ETAT = I_TNE
00631 ENDIF
00632 IF (LHOOK) CALL DR_HOOK('EGGANGLES:VAL_COORD_V',1,ZHOOK_HANDLE)
00633 END FUNCTION VAL_COORD_V
00634 ! -------------------------------------------------------------------------------
00635 TYPE(LOLA) FUNCTION LOLAR_S (COORD_DEG) RESULT (COORD_RAD)
00636 ! DEG => RAD for lola type
00637 TYPE(LOLA), INTENT(IN)                      :: COORD_DEG
00638 
00639 REAL(KIND=JPRB) :: TPI,DTR
00640 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00641 
00642 IF (LHOOK) CALL DR_HOOK('EGGANGLES:LOLAR_S',0,ZHOOK_HANDLE)
00643 TPI = ASIN(1.0_JPRB)*2.0_JPRB
00644 DTR = TPI/180.0_JPRB
00645 COORD_RAD%LON = COORD_DEG%LON*DTR
00646 COORD_RAD%LAT = COORD_DEG%LAT*DTR
00647 IF (LHOOK) CALL DR_HOOK('EGGANGLES:LOLAR_S',1,ZHOOK_HANDLE)
00648 END FUNCTION LOLAR_S
00649 
00650 FUNCTION LOLAR_V (COORD_DEG) RESULT (COORD_RAD)
00651 ! DEG => RAD for lola type
00652 TYPE(LOLA), DIMENSION(:), INTENT(IN)                :: COORD_DEG
00653 TYPE(LOLA), DIMENSION(SIZE(COORD_DEG)) :: COORD_RAD
00654 
00655 REAL(KIND=JPRB) :: TPI,DTR
00656 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00657 
00658 IF (LHOOK) CALL DR_HOOK('EGGANGLES:LOLAR_V',0,ZHOOK_HANDLE)
00659 TPI = ASIN(1.0_JPRB)*2.0_JPRB
00660 DTR = TPI/180.0_JPRB
00661 COORD_RAD(:)%LON = COORD_DEG(:)%LON*DTR
00662 COORD_RAD(:)%LAT = COORD_DEG(:)%LAT*DTR
00663 IF (LHOOK) CALL DR_HOOK('EGGANGLES:LOLAR_V',1,ZHOOK_HANDLE)
00664 END FUNCTION LOLAR_V
00665 ! -------------------------------------------------------------------------------
00666 TYPE(LOLA) FUNCTION LOLAD_S (COORD_RAD) RESULT (COORD_DEG)
00667 ! RAD => DEG for lola type
00668 TYPE(LOLA), INTENT(IN)                      :: COORD_RAD
00669 
00670 REAL(KIND=JPRB) :: TPI,RTD
00671 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00672 
00673 IF (LHOOK) CALL DR_HOOK('EGGANGLES:LOLAD_S',0,ZHOOK_HANDLE)
00674 TPI = ASIN(1.0_JPRB)*2.0_JPRB
00675 RTD = 180.0_JPRB/TPI
00676 COORD_DEG%LON = COORD_RAD%LON*RTD
00677 COORD_DEG%LAT = COORD_RAD%LAT*RTD
00678 IF (LHOOK) CALL DR_HOOK('EGGANGLES:LOLAD_S',1,ZHOOK_HANDLE)
00679 END FUNCTION LOLAD_S
00680 
00681 FUNCTION LOLAD_V (COORD_RAD) RESULT (COORD_DEG)
00682 ! RAD => DEG for lola type
00683 TYPE(LOLA), DIMENSION(:), INTENT(IN)                :: COORD_RAD
00684 TYPE(LOLA), DIMENSION(SIZE(COORD_RAD)) :: COORD_DEG
00685 
00686 REAL(KIND=JPRB) :: TPI,RTD
00687 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00688 
00689 IF (LHOOK) CALL DR_HOOK('EGGANGLES:LOLAD_V',0,ZHOOK_HANDLE)
00690 TPI = ASIN(1.0_JPRB)*2.0_JPRB
00691 RTD = 180.0_JPRB/TPI
00692 COORD_DEG(:)%LON = COORD_RAD(:)%LON*RTD
00693 COORD_DEG(:)%LAT = COORD_RAD(:)%LAT*RTD
00694 IF (LHOOK) CALL DR_HOOK('EGGANGLES:LOLAD_V',1,ZHOOK_HANDLE)
00695 END FUNCTION LOLAD_V
00696 ! -------------------------------------------------------------------------------
00697 ! Function to compute Cosine,Sine to Angle
00698 ! -------------------------------------------------------------------------------
00699 REAL(KIND=JPRB) FUNCTION COSIN_TO_ANGLE_S(COSINUS,SINUS) RESULT (ANGLE)
00700 ! (Cosinus,Sinus) => Angle
00701 REAL(KIND=JPRB), INTENT(IN)                  :: COSINUS,SINUS
00702 
00703 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00704 
00705 IF (LHOOK) CALL DR_HOOK('EGGANGLES:COSIN_TO_ANGLE_S',0,ZHOOK_HANDLE)
00706 ANGLE = P_ACOS(COSINUS)*SIGN(1.0_JPRB,SINUS)
00707 IF (LHOOK) CALL DR_HOOK('EGGANGLES:COSIN_TO_ANGLE_S',1,ZHOOK_HANDLE)
00708 END FUNCTION COSIN_TO_ANGLE_S
00709 
00710 FUNCTION COSIN_TO_ANGLE_V(COSINUS,SINUS) RESULT (ANGLE)
00711 ! (Cosinus,Sinus) => Angle
00712 REAL(KIND=JPRB), DIMENSION(:), INTENT(IN)              :: COSINUS,SINUS
00713 REAL(KIND=JPRB), DIMENSION(SIZE(COSINUS)) :: ANGLE
00714 
00715 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00716 
00717 IF (LHOOK) CALL DR_HOOK('EGGANGLES:COSIN_TO_ANGLE_V',0,ZHOOK_HANDLE)
00718 ANGLE(:) = P_ACOS(COSINUS(:))*SIGN(1.0_JPRB,SINUS(:))
00719 IF (LHOOK) CALL DR_HOOK('EGGANGLES:COSIN_TO_ANGLE_V',1,ZHOOK_HANDLE)
00720 END FUNCTION COSIN_TO_ANGLE_V
00721 ! -------------------------------------------------------------------------------
00722 ! -------------------------------------------------------------------------------
00723 ! Function to compute Acos without error
00724 ! -------------------------------------------------------------------------------
00725 REAL(KIND=JPRB) FUNCTION P_ACOS_S(COSINUS) RESULT (ANGLE)
00726 ! Protected ACOS
00727 REAL(KIND=JPRB), INTENT(IN)                  :: COSINUS
00728 
00729 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00730 
00731 IF (LHOOK) CALL DR_HOOK('EGGANGLES:P_ACOS_S',0,ZHOOK_HANDLE)
00732 ANGLE = ACOS(MINIMAX(COSINUS))
00733 IF (LHOOK) CALL DR_HOOK('EGGANGLES:P_ACOS_S',1,ZHOOK_HANDLE)
00734 END FUNCTION P_ACOS_S
00735 
00736 FUNCTION P_ACOS_V(COSINUS) RESULT (ANGLE)
00737 ! Protected ACOS
00738 REAL(KIND=JPRB), DIMENSION(:), INTENT(IN)              :: COSINUS
00739 REAL(KIND=JPRB), DIMENSION(SIZE(COSINUS)) :: ANGLE
00740 
00741 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00742 
00743 IF (LHOOK) CALL DR_HOOK('EGGANGLES:P_ACOS_V',0,ZHOOK_HANDLE)
00744 ANGLE(:) = ACOS(MINIMAX(COSINUS(:)))
00745 IF (LHOOK) CALL DR_HOOK('EGGANGLES:P_ACOS_V',1,ZHOOK_HANDLE)
00746 END FUNCTION P_ACOS_V
00747 ! -------------------------------------------------------------------------------
00748 ! -------------------------------------------------------------------------------
00749 ! Function to compute Asin without error
00750 ! -------------------------------------------------------------------------------
00751 REAL(KIND=JPRB) FUNCTION P_ASIN_S(SINUS) RESULT (ANGLE)
00752 ! Protected ASIN
00753 REAL(KIND=JPRB), INTENT(IN)                  :: SINUS
00754 
00755 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00756 
00757 IF (LHOOK) CALL DR_HOOK('EGGANGLES:P_ASIN_S',0,ZHOOK_HANDLE)
00758 ANGLE = ASIN(MINIMAX(SINUS))
00759 IF (LHOOK) CALL DR_HOOK('EGGANGLES:P_ASIN_S',1,ZHOOK_HANDLE)
00760 END FUNCTION P_ASIN_S
00761 
00762 FUNCTION P_ASIN_V(SINUS) RESULT (ANGLE)
00763 ! Protected ASIN
00764 REAL(KIND=JPRB), DIMENSION(:), INTENT(IN)            :: SINUS
00765 REAL(KIND=JPRB), DIMENSION(SIZE(SINUS)) :: ANGLE
00766 
00767 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00768 
00769 IF (LHOOK) CALL DR_HOOK('EGGANGLES:P_ASIN_V',0,ZHOOK_HANDLE)
00770 ANGLE(:) = ASIN(MINIMAX(SINUS(:)))
00771 IF (LHOOK) CALL DR_HOOK('EGGANGLES:P_ASIN_V',1,ZHOOK_HANDLE)
00772 END FUNCTION P_ASIN_V
00773 ! -------------------------------------------------------------------------------
00774 ! -------------------------------------------------------------------------------
00775 ! Function MinMax
00776 ! -------------------------------------------------------------------------------
00777 REAL(KIND=JPRB) FUNCTION MINIMAX_S(VAL,LIM) RESULT (VALO)
00778 ! Return Value in [-LIM,LIM]
00779 REAL(KIND=JPRB), INTENT(IN)                      :: VAL
00780 REAL(KIND=JPRB), INTENT(IN), OPTIONAL            :: LIM
00781 
00782 REAL(KIND=JPRB) :: TLIM
00783 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00784 
00785 IF (LHOOK) CALL DR_HOOK('EGGANGLES:MINIMAX_S',0,ZHOOK_HANDLE)
00786 IF (PRESENT(LIM)) THEN
00787   TLIM = LIM
00788 ELSE
00789   TLIM = 1.0_JPRB
00790 ENDIF
00791 VALO = MIN(TLIM,MAX(-1.0_JPRB*TLIM,VAL))
00792 IF (LHOOK) CALL DR_HOOK('EGGANGLES:MINIMAX_S',1,ZHOOK_HANDLE)
00793 END FUNCTION MINIMAX_S
00794 
00795 FUNCTION MINIMAX_V(VAL,LIM) RESULT (VALO)
00796 ! Return Value in [-LIM,LIM]
00797 REAL(KIND=JPRB), DIMENSION(:), INTENT(IN)          :: VAL
00798 REAL(KIND=JPRB), INTENT(IN), OPTIONAL              :: LIM
00799 REAL(KIND=JPRB), DIMENSION(SIZE(VAL)) :: VALO
00800 
00801 REAL(KIND=JPRB) :: TLIM
00802 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00803 
00804 IF (LHOOK) CALL DR_HOOK('EGGANGLES:MINIMAX_V',0,ZHOOK_HANDLE)
00805 IF (PRESENT(LIM)) THEN
00806   TLIM = LIM
00807 ELSE
00808   TLIM = 1.0_JPRB
00809 ENDIF
00810 VALO(:) = MIN(TLIM,MAX(-1.0_JPRB*TLIM,VAL(:)))
00811 IF (LHOOK) CALL DR_HOOK('EGGANGLES:MINIMAX_V',1,ZHOOK_HANDLE)
00812 END FUNCTION MINIMAX_V
00813 ! -------------------------------------------------------------------------------
00814 ! -------------------------------------------------------------------------------
00815 ! Functions Longitude size/distance
00816 ! -------------------------------------------------------------------------------
00817 REAL(KIND=JPRB) FUNCTION DIST_2REF_L(COORD_LON,REF_LON,PI) RESULT(DIST)
00818 ! COORD_LON, REF_LON in -+Radians
00819 ! DIST in -+Radians
00820 
00821 ! Calcule la distance orientee DIST (abscisse dans l'intervale [-pi,pi[ et d'origine le meridien de
00822 ! reference REF_LON) de COORD_LON a REF_LON (coordonnees en radians dans l'intervale
00823 ! [-pi,pi[ et avec comme origine le meridien de GreenWiTch). Les valeurs negatives sont vers l'Ouest
00824 ! des origines.
00825 
00826 ! Computes oriented distance DIST (as an absciss in [-pi,pi[ with origin at REF_LON meridian)
00827 ! from COORD_LON to REF_LON (coordinates in rad [-pi,pi[ with origin at GreenWiTch meridian)
00828 ! Negatives values are on West of origins.
00829 
00830 REAL(KIND=JPRB), INTENT(IN)                   :: COORD_LON, REF_LON
00831 REAL(KIND=JPRB), INTENT(IN), OPTIONAL         :: PI 
00832 
00833 REAL(KIND=JPRB)                            :: Z  
00834 REAL(KIND=JPRB)                            :: TPI
00835 REAL(KIND=JPRB)                            :: ZHOOK_HANDLE
00836 
00837 IF (LHOOK) CALL DR_HOOK('EGGANGLES:DIST2REF_L',0,ZHOOK_HANDLE)    
00838 
00839 IF (PRESENT(PI)) THEN
00840   TPI = PI
00841 ELSE
00842   TPI = ASIN(1.0_JPRB)*2.0_JPRB
00843 ENDIF
00844 Z = (COORD_LON-REF_LON)
00845 Z = Z-SIGN(TPI,Z)*(1.0_JPRB+SIGN(1.0_JPRB,ABS(Z)-TPI))
00846 DIST = -Z*SIGN(1.0_JPRB,Z-TPI) ! because [-pi,pi[ : if pi then -pi 
00847 
00848 IF (LHOOK) CALL DR_HOOK('EGGANGLES:DIST2REF_L',1,ZHOOK_HANDLE)
00849 END FUNCTION DIST_2REF_L
00850 ! -------------------------------------------------------------------------------
00851 REAL(KIND=JPRB) FUNCTION DIST_2REF_S(PT_COORD,REF_COORD,PI) RESULT(DIST)
00852 ! PT_COORD, REF_COORD in -+Radians
00853 ! DIST in -+Radians
00854 
00855 ! Calcule la distance orientee DIST (abscisse dans l'intervale [-pi,pi[ et d'origine le meridien de
00856 ! reference REF_COORD%LON) de PT_COORD%LON a REF_COORD%LON (coordonnees en radians dans l'intervale
00857 ! [-pi,pi[ et avec comme origine le meridien de GreenWiTch). Les valeurs negatives sont vers l'Ouest
00858 ! des origines.
00859 
00860 ! Computes oriented distance DIST (as an absciss in [-pi,pi[ with origin at REF_COORD%LON meridian)
00861 ! from PT_COORD%LON to REF_COORD%LON (coordinates in rad [-pi,pi[ with origin at GreenWiTch meridian)
00862 ! Negatives values are on West of origins.
00863 
00864 TYPE (LOLA), INTENT(IN)                       :: PT_COORD, REF_COORD
00865 REAL(KIND=JPRB), INTENT(IN), OPTIONAL         :: PI 
00866 
00867 REAL(KIND=JPRB)                            :: TPI
00868 REAL(KIND=JPRB)                            :: ZHOOK_HANDLE
00869 
00870 IF (LHOOK) CALL DR_HOOK('EGGANGLES:DIST2REF_S',0,ZHOOK_HANDLE)    
00871 
00872 IF (PRESENT(PI)) THEN
00873   TPI = PI
00874 ELSE
00875   TPI = ASIN(1.0_JPRB)*2.0_JPRB
00876 ENDIF
00877 DIST = DIST_2REF(PT_COORD%LON,REF_COORD%LON,TPI)
00878 
00879 IF (LHOOK) CALL DR_HOOK('EGGANGLES:DIST2REF_S',1,ZHOOK_HANDLE)
00880 END FUNCTION DIST_2REF_S
00881 ! -------------------------------------------------------------------------------
00882 FUNCTION DIST_2REF_V(PT_COORD,REF_COORD,PI) RESULT(DIST)
00883 ! PT_COORD, REF_COORD in -+Radians
00884 ! DIST in -+Radians
00885 
00886 ! Calcule la distance orientee DIST (abscisse dans l'intervale [-pi,pi[ et d'origine le meridien de
00887 ! reference REF_COORD%LON) de PT_COORD%LON a REF_COORD%LON (coordonnees en radians dans l'intervale
00888 ! [-pi,pi[ et avec comme origine le meridien de GreenWiTch). Les valeurs negatives sont vers l'Ouest
00889 ! des origines.
00890 
00891 ! Computes oriented distance DIST (as an absciss in [-pi,pi[ with origin at REF_COORD%LON meridian)
00892 ! from PT_COORD%LON to REF_COORD%LON (coordinates in rad [-pi,pi[ with origin at GreenWiTch meridian)
00893 ! Negatives values are on West of origins.
00894 
00895 TYPE (LOLA), DIMENSION(:), INTENT(IN)                   :: PT_COORD
00896 TYPE (LOLA), INTENT(IN)                                 :: REF_COORD
00897 REAL(KIND=JPRB), INTENT(IN), OPTIONAL                   :: PI 
00898 REAL(KIND=JPRB), DIMENSION(SIZE(PT_COORD)) :: DIST
00899 
00900 REAL(KIND=JPRB), DIMENSION(SIZE(PT_COORD)) :: Z
00901 REAL(KIND=JPRB)                            :: TPI
00902 REAL(KIND=JPRB)                            :: ZHOOK_HANDLE
00903 
00904 IF (LHOOK) CALL DR_HOOK('EGGANGLES:DIST2REF_V',0,ZHOOK_HANDLE)    
00905 
00906 IF (PRESENT(PI)) THEN
00907   TPI = PI
00908 ELSE
00909   TPI = ASIN(1.0_JPRB)*2.0_JPRB
00910 ENDIF
00911 Z(:) = PT_COORD(:)%LON-REF_COORD%LON
00912 Z(:) = Z(:)-SIGN(TPI,Z(:))*(1.0_JPRB+SIGN(1.0_JPRB,ABS(Z(:))-TPI))
00913 DIST(:) = -Z(:)*SIGN(1.0_JPRB,Z(:)-TPI) ! because [-pi,pi[ : if pi then -pi 
00914 
00915 IF (LHOOK) CALL DR_HOOK('EGGANGLES:DIST2REF_V',1,ZHOOK_HANDLE)
00916 END FUNCTION DIST_2REF_V
00917 ! -------------------------------------------------------------------------------
00918 REAL(KIND=JPRB) FUNCTION SIZE_W2E_L(WEST_LON,EAST_LON,PI) RESULT(TAILLE)
00919 ! WEST_LON, EAST_LON in -+Radians
00920 ! SIZE in 0+Radians 
00921 
00922 ! Calcule la distance ou taille (norme entre ]0,2pi]) entre WEST_LON et EAST_LON
00923 ! dans le sens des aiguilles d'une montre en regardant du Pole Sud vers le Pole Nord ( ceci
00924 ! pour ne pas calculer le complementaire a 2pi ).
00925 
00926 ! Computes distance or length (norm in ]0,2pi]) between WEST_LON and EAST_LON in
00927 ! clockwise seeing from South Pole to North Pole.
00928 
00929 REAL(KIND=JPRB), INTENT(IN)                   :: WEST_LON, EAST_LON
00930 REAL(KIND=JPRB), INTENT(IN), OPTIONAL         :: PI 
00931 
00932 REAL(KIND=JPRB)                            :: Z  
00933 REAL(KIND=JPRB)                            :: TPI
00934 REAL(KIND=JPRB)                            :: ZHOOK_HANDLE
00935 
00936 IF (LHOOK) CALL DR_HOOK('EGGANGLES:SIZE_W2E_L',0,ZHOOK_HANDLE)    
00937 
00938 IF (PRESENT(PI)) THEN
00939   TPI = PI
00940 ELSE
00941   TPI = ASIN(1.0_JPRB)*2.0_JPRB
00942 ENDIF
00943 Z =  DIST_2REF(WEST_LON,EAST_LON,TPI)
00944 TAILLE = TPI*(1.0_JPRB+SIGN(1.0_JPRB,Z))-Z
00945 
00946 IF (LHOOK) CALL DR_HOOK('EGGANGLES:SIZE_W2E_L',1,ZHOOK_HANDLE)
00947 END FUNCTION SIZE_W2E_L
00948 ! -------------------------------------------------------------------------------
00949 REAL(KIND=JPRB) FUNCTION SIZE_W2E_S(WEST_COORD,EAST_COORD,PI) RESULT(TAILLE)
00950 ! WEST_COORD, EAST_COORD in -+Radians
00951 ! SIZE in 0+Radians 
00952 
00953 ! Calcule la distance ou taille (norme entre ]0,2pi]) entre WEST_COORD%LON et EAST_COORD%LON
00954 ! dans le sens des aiguilles d'une montre en regardant du Pole Sud vers le Pole Nord ( ceci
00955 ! pour ne pas calculer le complementaire a 2pi ).
00956 
00957 ! Computes distance or length (norm in ]0,2pi]) between WEST_COORD%LON and EAST_COORD%LON in
00958 ! clockwise seeing from South Pole to North Pole.
00959 
00960 TYPE (LOLA), INTENT(IN)                       :: WEST_COORD, EAST_COORD
00961 REAL(KIND=JPRB), INTENT(IN), OPTIONAL         :: PI 
00962 
00963 REAL(KIND=JPRB)                            :: TPI
00964 REAL(KIND=JPRB)                            :: ZHOOK_HANDLE
00965 
00966 IF (LHOOK) CALL DR_HOOK('EGGANGLES:SIZE_W2E_S',0,ZHOOK_HANDLE)    
00967 
00968 IF (PRESENT(PI)) THEN
00969   TPI = PI
00970 ELSE
00971   TPI = ASIN(1.0_JPRB)*2.0_JPRB
00972 ENDIF
00973 TAILLE = SIZE_W2E(WEST_COORD%LON,EAST_COORD%LON,TPI)
00974 
00975 IF (LHOOK) CALL DR_HOOK('EGGANGLES:SIZE_W2E_S',1,ZHOOK_HANDLE)
00976 END FUNCTION SIZE_W2E_S
00977 ! -------------------------------------------------------------------------------
00978 END MODULE EGGANGLES