NCEPLIBS-ip 4.0.0
movect.f90
1 SUBROUTINE movect(FLAT,FLON,TLAT,TLON,CROT,SROT)
2!$$$ SUBPROGRAM DOCUMENTATION BLOCK
3!
4! SUBPROGRAM: MOVECT MOVE A VECTOR ALONG A GREAT CIRCLE
5! PRGMMR: IREDELL ORG: W/NMC23 DATE: 96-04-10
6!
7! ABSTRACT: THIS SUBPROGRAM PROVIDES THE ROTATION PARAMETERS
8! TO MOVE A VECTOR ALONG A GREAT CIRCLE FROM ONE
9! POSITION TO ANOTHER WHILE CONSERVING ITS ORIENTATION
10! WITH RESPECT TO THE GREAT CIRCLE. THESE ROTATION
11! PARAMETERS ARE USEFUL FOR VECTOR INTERPOLATION.
12!
13! PROGRAM HISTORY LOG:
14! 96-04-10 IREDELL
15! 1999-04-08 IREDELL GENERALIZE PRECISION
16!
17! USAGE: CALL MOVECT(FLAT,FLON,TLAT,TLON,CROT,SROT)
18!
19! INPUT ARGUMENT LIST:
20! FLAT - REAL LATITUDE IN DEGREES FROM WHICH TO MOVE THE VECTOR
21! FLON - REAL LONGITUDE IN DEGREES FROM WHICH TO MOVE THE VECTOR
22! TLAT - REAL LATITUDE IN DEGREES TO WHICH TO MOVE THE VECTOR
23! TLON - REAL LONGITUDE IN DEGREES TO WHICH TO MOVE THE VECTOR
24!
25! OUTPUT ARGUMENT LIST:
26! CROT - REAL CLOCKWISE VECTOR ROTATION COSINE
27! SROT - REAL CLOCKWISE VECTOR ROTATION SINE
28! (UTO=CROT*UFROM-SROT*VFROM;
29! VTO=SROT*UFROM+CROT*VFROM)
30!
31! ATTRIBUTES:
32! LANGUAGE: FORTRAN 90
33!
34!$$$
35 IMPLICIT NONE
36!
37 INTEGER, PARAMETER :: KD=selected_real_kind(15,45)
38!
39 REAL, INTENT(IN ) :: FLAT, FLON
40 REAL, INTENT(IN ) :: TLAT, TLON
41 REAL, INTENT( OUT) :: CROT, SROT
42!
43 REAL(KIND=kd), PARAMETER :: crdlim=0.9999999
44 REAL(KIND=kd), PARAMETER :: pi=3.14159265358979
45 REAL(KIND=kd), PARAMETER :: dpr=180./pi
46!
47 REAL(KIND=kd) :: ctlat,stlat,cflat,sflat
48 REAL(KIND=kd) :: cdlon,sdlon,crd
49 REAL(KIND=kd) :: srd2rn,str,ctr,sfr,cfr
50! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
51! COMPUTE COSINE OF THE RADIAL DISTANCE BETWEEN THE POINTS.
52 ctlat=cos(tlat/dpr)
53 stlat=sin(tlat/dpr)
54 cflat=cos(flat/dpr)
55 sflat=sin(flat/dpr)
56 cdlon=cos((flon-tlon)/dpr)
57 sdlon=sin((flon-tlon)/dpr)
58 crd=stlat*sflat+ctlat*cflat*cdlon
59! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
60! COMPUTE ROTATIONS AT BOTH POINTS WITH RESPECT TO THE GREAT CIRCLE
61! AND COMBINE THEM TO GIVE THE TOTAL VECTOR ROTATION PARAMETERS.
62 IF(abs(crd).LE.crdlim) THEN
63 srd2rn=-1/(1-crd**2)
64 str=cflat*sdlon
65 ctr=cflat*stlat*cdlon-sflat*ctlat
66 sfr=ctlat*sdlon
67 cfr=ctlat*sflat*cdlon-stlat*cflat
68 crot=srd2rn*(ctr*cfr-str*sfr)
69 srot=srd2rn*(ctr*sfr+str*cfr)
70! USE A DIFFERENT APPROXIMATION FOR NEARLY COINCIDENT POINTS.
71! MOVING VECTORS TO ANTIPODAL POINTS IS AMBIGUOUS ANYWAY.
72 ELSE
73 crot=cdlon
74 srot=sdlon*stlat
75 ENDIF
76! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
77 END SUBROUTINE movect