|
|
C $Id: iterat.f 3304 2011-01-17 15:25:59Z brideout $
|
|
|
C
|
|
|
SUBROUTINE ITERAT
|
|
|
C
|
|
|
C Private/Internal subroutine. Part of Apex coordinate computation
|
|
|
C package. See COORD for public API. ITERAT integrates magnetic
|
|
|
C field line using a 4-point adams formula after initialization.
|
|
|
C First 7 iterations advance point by 3*DS.
|
|
|
C
|
|
|
C Input (via common block ITER):
|
|
|
C L - step count. set l=1 first time thru,
|
|
|
C set l=l+1 thereafter.
|
|
|
C B,BR,BT,BP - field + components at point y
|
|
|
C ST - sine of geocentric colatitude
|
|
|
C SGN - sgn=+1 traces in direction of field
|
|
|
C sgn=-1 traces in negative field direction
|
|
|
C DS - integration stepsize (arc increment) in km
|
|
|
C
|
|
|
C Input, Output (via common block ITER):
|
|
|
C Y - R,DLAT,DLON: geocentric tracing point coordinates
|
|
|
C (km,deg)
|
|
|
C
|
|
|
C Output (via common block ITER):
|
|
|
C YOLD - Y at iteration L-1
|
|
|
C
|
|
|
C .. Scalars in Common ..
|
|
|
C ..
|
|
|
C .. Arrays in Common ..
|
|
|
C ..
|
|
|
C .. Local Scalars ..
|
|
|
C
|
|
|
DOUBLE PRECISION D12,D2,D24,D6,FAC,RAD
|
|
|
INTEGER I,J
|
|
|
C ..
|
|
|
C .. Local Arrays ..
|
|
|
DOUBLE PRECISION YP(3,4)
|
|
|
C ..
|
|
|
C .. Common blocks ..
|
|
|
COMMON /ITER/Y,YOLD,HP,BR,BT,BP,B,ST,SGN,DS,L
|
|
|
DOUBLE PRECISION B,BP,BR,BT,DS,HP,SGN,ST
|
|
|
INTEGER L
|
|
|
DOUBLE PRECISION Y(3),YOLD(3)
|
|
|
C ..
|
|
|
C .. Save statement ..
|
|
|
SAVE D12,D2,D24,D6,FAC,RAD,I,J,YP
|
|
|
C ..
|
|
|
C .. Data statements ..
|
|
|
DATA RAD/57.2957795D0/,D12/0.0D0/,D2/0.0D0/,D24/0.0D0/,D6/0.0D0/
|
|
|
C ..
|
|
|
C
|
|
|
YP(1,4) = SGN*BR/B
|
|
|
FAC = SGN*RAD/(B*Y(1))
|
|
|
YP(2,4) = -BT*FAC
|
|
|
YP(3,4) = BP*FAC/ST
|
|
|
IF (L.GT.7) THEN
|
|
|
DO 20 I = 1,3
|
|
|
YOLD(I) = Y(I)
|
|
|
Y(I) = YOLD(I) + D24*(55.D0*YP(I,4)-59.D0*YP(I,3)+
|
|
|
* 37.D0*YP(I,2)-9.D0*YP(I,1))
|
|
|
DO 10 J = 1,3
|
|
|
YP(I,J) = YP(I,J+1)
|
|
|
10 CONTINUE
|
|
|
20 CONTINUE
|
|
|
ELSE
|
|
|
DO 30 I = 1,3
|
|
|
IF (L.EQ.2) THEN
|
|
|
YP(I,2) = YP(I,4)
|
|
|
Y(I) = YOLD(I) + D2*(YP(I,2)+YP(I,1))
|
|
|
ELSE IF (L.EQ.3) THEN
|
|
|
Y(I) = YOLD(I) + D6*(2.D0*YP(I,4)+YP(I,2)+3.D0*YP(I,1))
|
|
|
ELSE IF (L.EQ.4) THEN
|
|
|
YP(I,2) = YP(I,4)
|
|
|
YOLD(I) = Y(I)
|
|
|
Y(I) = YOLD(I) + D2*(3.D0*YP(I,2)-YP(I,1))
|
|
|
ELSE IF (L.EQ.5) THEN
|
|
|
Y(I) = YOLD(I) + D12*(5.D0*YP(I,4)+8.D0*YP(I,2)-YP(I,1))
|
|
|
ELSE IF (L.EQ.6) THEN
|
|
|
YP(I,3) = YP(I,4)
|
|
|
YOLD(I) = Y(I)
|
|
|
Y(I) = YOLD(I) + D12*(23.D0*YP(I,3)-16.D0*YP(I,2)+
|
|
|
* 5.D0*YP(I,1))
|
|
|
ELSE IF (L.EQ.7) THEN
|
|
|
Y(I) = YOLD(I) + D24*(9.D0*YP(I,4)+19.D0*YP(I,3)-
|
|
|
* 5.D0*YP(I,2)+YP(I,1))
|
|
|
ELSE
|
|
|
D2 = DS/2.D0
|
|
|
D6 = DS/6.D0
|
|
|
D12 = DS/12.D0
|
|
|
D24 = DS/24.D0
|
|
|
YP(I,1) = YP(I,4)
|
|
|
YOLD(I) = Y(I)
|
|
|
Y(I) = YOLD(I) + DS*YP(I,1)
|
|
|
END IF
|
|
|
30 CONTINUE
|
|
|
END IF
|
|
|
RETURN
|
|
|
C
|
|
|
END
|
|
|
|