|
SURFEX v7.3
General documentation of Surfex
|
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
1.8.0