|
|
C $Id: vctcnv.f 3304 2011-01-17 15:25:59Z brideout $
|
|
|
C
|
|
|
SUBROUTINE VCTCNV(FX,FY,FZ,X,Y,Z,FR,FT,FP,R,THETA,PHI,IMODE)
|
|
|
C
|
|
|
C jmh - 11/79 ans fortran 66
|
|
|
C
|
|
|
C VCTCNV converts between the cartesian and spherical coordinate
|
|
|
C representations of a vector field f. (FX,FY,FZ) are the
|
|
|
C components of the field at (X,Y,Z). (FR,FT,FP) are the
|
|
|
C components of the field at (R,THETA,PHI) in the directions of
|
|
|
C increasing R, increasing THETA and increasing PHI. if IMODE=1,
|
|
|
C (FX,FY,FZ,X,Y,Z) -> (FR,FT,FP,R,THETA,PHI). if IMODE=2,
|
|
|
C (FR,FT,FP,R,THETA,PHI) -> (FX,FY,FZ,X,Y,Z). THETA and PHI are
|
|
|
C in degrees.
|
|
|
C
|
|
|
C Input:
|
|
|
C IMODE - 1 cartesian to spherical
|
|
|
C 2 spherical to cartesian
|
|
|
C
|
|
|
C Input, output:
|
|
|
C FX,FY,FZ - cartesian vector field components
|
|
|
C X,Y,Z - cartesian vector field coordinates
|
|
|
C FR,FT,FP - spherical vector field components
|
|
|
C R,THETA,PHI - spherical vector field coordinates
|
|
|
C
|
|
|
C .. Scalar Arguments ..
|
|
|
DOUBLE PRECISION FP,FR,FT,FX,FY,FZ,PHI,R,THETA,X,Y,Z
|
|
|
INTEGER IMODE
|
|
|
C ..
|
|
|
C .. Local Scalars ..
|
|
|
DOUBLE PRECISION CP,CT,DTR,P,RHO2,RLMIN,SP,ST,T
|
|
|
C ..
|
|
|
C .. Intrinsic Functions ..
|
|
|
INTRINSIC ABS,DATAN2,DCOS,DMAX1,DSIN,DSQRT,SIGN
|
|
|
C ..
|
|
|
C .. Data statements ..
|
|
|
DATA DTR/.0174532925199D0/,RLMIN/1.D-38/
|
|
|
C ..
|
|
|
C
|
|
|
IF (IMODE.EQ.2) THEN
|
|
|
C
|
|
|
T = DTR*THETA
|
|
|
P = DTR*PHI
|
|
|
CT = DCOS(T)
|
|
|
ST = DSIN(T)
|
|
|
CP = DCOS(P)
|
|
|
SP = DSIN(P)
|
|
|
X = R*ST*CP
|
|
|
Y = R*ST*SP
|
|
|
Z = R*CT
|
|
|
FX = ST*CP*FR + CT*CP*FT - SP*FP
|
|
|
FY = ST*SP*FR + CT*SP*FT + CP*FP
|
|
|
FZ = CT*FR - ST*FT
|
|
|
ELSE
|
|
|
C
|
|
|
RHO2 = X*X + Y*Y
|
|
|
R = DSQRT(RHO2+Z*Z)
|
|
|
THETA = DATAN2(DSQRT(RHO2),SIGN(1.D0,Z)*DMAX1(ABS(Z),RLMIN))
|
|
|
PHI = DATAN2(Y,SIGN(1.D0,X)*DMAX1(ABS(X),RLMIN))
|
|
|
CT = DCOS(THETA)
|
|
|
ST = DSIN(THETA)
|
|
|
CP = DCOS(PHI)
|
|
|
SP = DSIN(PHI)
|
|
|
THETA = THETA/DTR
|
|
|
PHI = PHI/DTR
|
|
|
FR = ST*CP*FX + ST*SP*FY + CT*FZ
|
|
|
FT = CT*CP*FX + CT*SP*FY - ST*FZ
|
|
|
FP = -SP*FX + CP*FY
|
|
|
END IF
|
|
|
RETURN
|
|
|
C
|
|
|
END
|
|
|
|