|
|
C $Id: lines.f 3304 2011-01-17 15:25:59Z brideout $
|
|
|
C
|
|
|
SUBROUTINE LINES(R1,R2,R3,B,ARC,ERR,J,VP,VN,TM)
|
|
|
C
|
|
|
C Private/Internal subroutine. Part of Apex coordinate computation
|
|
|
C package. See COORD for public API. Makes repeated calls to the
|
|
|
C IGRF, tracing magnetic field line to minimum B.
|
|
|
C
|
|
|
C Input:
|
|
|
C ERR - tolerance factor (see INVAR)
|
|
|
C TM - Time in floating point years (e.g. 1995.7)
|
|
|
C
|
|
|
C Input, Output:
|
|
|
C R1,R2,R3 - field strength in geocentric directions.
|
|
|
C B - Magnitude of field (array)
|
|
|
C ARC - Altitudes in earth radii (array)
|
|
|
C VP - Geocentric latitude (array)
|
|
|
C VN - Geocentric longitude (array)
|
|
|
C
|
|
|
C Output:
|
|
|
C J - Number of points in trace.
|
|
|
C
|
|
|
C .. Scalar Arguments ..
|
|
|
DOUBLE PRECISION ERR,TM
|
|
|
INTEGER J
|
|
|
C ..
|
|
|
C .. Array Arguments ..
|
|
|
DOUBLE PRECISION ARC(200),B(200),R1(3),R2(3),R3(3),VN(3),VP(3)
|
|
|
C ..
|
|
|
C .. Local Scalars ..
|
|
|
DOUBLE PRECISION A1,A2,A3,AA,AAB,AD,AM,AO6,ARCJ,ASUM,BB,BD,BP,BR,
|
|
|
* BT,CC,CD,COP,COT,CRE,DD,DN,PRE1,PRE2,PRE3,QRT,
|
|
|
* RBAR,RKM,RT,SIP,SIT,SNA,X
|
|
|
INTEGER I,ILP,IS
|
|
|
C ..
|
|
|
C .. Local Arrays ..
|
|
|
DOUBLE PRECISION RA(3)
|
|
|
C ..
|
|
|
C .. External Subroutines ..
|
|
|
EXTERNAL MILMAG
|
|
|
C ..
|
|
|
C .. Intrinsic Functions ..
|
|
|
INTRINSIC ABS,DCOS,DSIN,DSQRT
|
|
|
C ..
|
|
|
C .. Data statements ..
|
|
|
DATA PRE1,PRE2,PRE3,RA/0.0D0,0.0D0,0.0D0,0.0D0,0.0D0,0.0D0/
|
|
|
C .. initialize
|
|
|
AA=0.0D0
|
|
|
AD=0.0D0
|
|
|
ARCJ=0.0D0
|
|
|
ASUM=0.0D0
|
|
|
BB=0.0D0
|
|
|
BD=0.0D0
|
|
|
CC=0.0D0
|
|
|
CD=0.0D0
|
|
|
|
|
|
CRE = 0.25D0
|
|
|
IF (ERR.LT.0.15625D0) CRE = (ERR**0.333333333D0)
|
|
|
A3 = ARC(3)
|
|
|
AAB = ABS(A3)
|
|
|
SNA = A3/AAB
|
|
|
A1 = ARC(1)
|
|
|
A2 = ARC(2)
|
|
|
AO6 = A3*A3/6.0D0
|
|
|
J = 3
|
|
|
ILP = 1
|
|
|
IS = 1
|
|
|
10 CONTINUE
|
|
|
IF (VN(2).LT.0) VN(2) = -VN(2)
|
|
|
20 CONTINUE
|
|
|
IF (VN(2).GT.3.141592653D0) THEN
|
|
|
VN(2) = 6.283185307D0 - VN(2)
|
|
|
GO TO 20
|
|
|
END IF
|
|
|
30 CONTINUE
|
|
|
IF (VN(3).LT.0) THEN
|
|
|
VN(3) = VN(3) + 6.283185307D0
|
|
|
GO TO 30
|
|
|
END IF
|
|
|
40 CONTINUE
|
|
|
IF (VN(3).GT.6.283185307D0) THEN
|
|
|
VN(3) = VN(3) - 6.283185307D0
|
|
|
GO TO 40
|
|
|
END IF
|
|
|
IF (IS.EQ.2) THEN
|
|
|
SIT = ABS(DSIN(VN(2)))
|
|
|
B(J) = B(J)*((PRE1/VN(1))**3)
|
|
|
QRT = 0.5D0*ABS(R3(1))/(0.1D0+ABS(R3(2)*VN(1)))
|
|
|
X = (ABS(VN(1)-PRE1)+QRT*ABS(VN(1)*VN(2)-PRE2)+
|
|
|
* ABS(VN(1)*SIT*VN(3)-PRE3))/(AAB*ERR*DSQRT(1.D0+QRT*QRT))
|
|
|
IF (.NOT.(ILP.EQ.1.OR.ILP.EQ.3)) THEN
|
|
|
IF (X.GE.3.3D0) THEN
|
|
|
A3 = A3*0.2D0*(8.0D0+X)/(0.8D0+X)
|
|
|
J = J - 1
|
|
|
ILP = 3
|
|
|
ASUM = A2 + A1
|
|
|
AA = ASUM*A1
|
|
|
BB = A2*A1
|
|
|
CC = ASUM*A2
|
|
|
DO 50 I = 1,3
|
|
|
VN(I) = VP(I)
|
|
|
R3(I) = R2(I)
|
|
|
R2(I) = R1(I)
|
|
|
R1(I) = RA(I)
|
|
|
50 CONTINUE
|
|
|
GO TO 60
|
|
|
END IF
|
|
|
END IF
|
|
|
IF (J.GE.200) GO TO 80
|
|
|
A1 = A2
|
|
|
IF (B(J).GT.B(2)) GO TO 80
|
|
|
ILP = 2
|
|
|
A2 = A3
|
|
|
A3 = A3*.2D0*(8.D0+X)/(.8D0+X)
|
|
|
AM = (2.D0-R3(2)*VN(1))*VN(1)*CRE
|
|
|
IF (ABS(A3).GT.AM) A3 = SNA*AM
|
|
|
IF (SNA*R3(1)+.5D0.LE.0) THEN
|
|
|
AM = -.5D0*SNA*VN(1)/R3(1)
|
|
|
IF (ABS(A3).GT.AM) A3 = SNA*AM
|
|
|
END IF
|
|
|
60 CONTINUE
|
|
|
ARC(J+1) = A3
|
|
|
AAB = ABS(A3)
|
|
|
IS = 1
|
|
|
J = J + 1
|
|
|
AO6 = A3*A3/6.0D0
|
|
|
ARCJ = A1 + A2 + A3
|
|
|
AD = (ASUM+A1)/AA
|
|
|
BD = ASUM/BB
|
|
|
CD = A1/CC
|
|
|
ELSE
|
|
|
SIT = ABS(DSIN(VN(2)))
|
|
|
PRE1 = VN(1)
|
|
|
PRE2 = PRE1*VN(2)
|
|
|
PRE3 = PRE1*SIT*VN(3)
|
|
|
RKM = VN(1)*6371.2D0
|
|
|
COT = DCOS(VN(2))
|
|
|
SIP = DSIN(VN(3))
|
|
|
COP = DCOS(VN(3))
|
|
|
CALL MILMAG(TM,RKM,SIT,COT,SIP,COP,BR,BT,BP,B(J))
|
|
|
R3(1) = BR/B(J)
|
|
|
DN = B(J)*VN(1)
|
|
|
R3(2) = BT/DN
|
|
|
R3(3) = BP/(DN*SIT)
|
|
|
ASUM = A3 + A2
|
|
|
AA = ASUM*A2
|
|
|
BB = A3*A2
|
|
|
CC = ASUM*A3
|
|
|
IS = 2
|
|
|
END IF
|
|
|
DO 70 I = 1,3
|
|
|
DD = R1(I)/AA - R2(I)/BB + R3(I)/CC
|
|
|
IF (IS.NE.2) THEN
|
|
|
RT = R1(I) - (AD*R1(I)-BD*R2(I)+CD*R3(I)-DD*ARCJ)*ARCJ
|
|
|
RA(I) = R1(I)
|
|
|
R1(I) = R2(I)
|
|
|
R2(I) = R3(I)
|
|
|
R3(I) = RT
|
|
|
VP(I) = VN(I)
|
|
|
END IF
|
|
|
RBAR = (R2(I)+R3(I))/2.D0 - DD*AO6
|
|
|
VN(I) = VP(I) + A3*RBAR
|
|
|
70 CONTINUE
|
|
|
GO TO 10
|
|
|
80 CONTINUE
|
|
|
RETURN
|
|
|
C
|
|
|
END
|
|
|
|