vctcnv.f
72 lines
| 2.1 KiB
| text/x-fortran
|
FortranFixedLexer
r0 | 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 | ||||