C $Id: integ.f 3304 2011-01-17 15:25:59Z brideout $ C SUBROUTINE INTEG(ARC,BEG,BEND,B,JEP,ECO,FI) C C Private/Internal subroutine. Part of Apex coordinate computation C package. See COORD for public API. INTEG determines the value of C the integral invariant FI by numerically integrating along the C field line from the specified point of interest to its conjugate C point. C C Input: C ARC - Altitudes in earth radii (array). C BEG - floating point array. C BEND - floating point array. C B - Magnitude of field (array) C ECO - floating point array. C JEP - floating point scaler. C C Output: C FI - floating point scaler. C C .. Scalar Arguments .. DOUBLE PRECISION FI INTEGER JEP C .. C .. Array Arguments .. DOUBLE PRECISION ARC(200),B(200),BEG(200),BEND(200),ECO(200) C .. C .. Local Scalars .. DOUBLE PRECISION A,ARG1,ASUM,BB,C,DN,T,TB,TE,X2,X3 INTEGER I,KK C .. C .. Intrinsic Functions .. INTRINSIC ABS,DLOG,DSQRT C .. KK = JEP IF (KK.GE.4) THEN IF (KK.GT.4) THEN T = DSQRT(1.0D0-BEND(2)/B(2)) FI = (2.0D0*T-DLOG((1.0D0+T)/(1.0D0-T)))/ECO(2) IF (B(2).GT.BEND(KK)) KK = KK + 1 T = DSQRT(ABS(1.0D0-BEG(KK)/B(2))) FI = FI - (2.0D0*T-DLOG((1.0D0+T)/(1.0D0-T)))/ECO(KK) KK = KK - 1 DO 10 I = 3,KK ARG1 = 1.D0 - BEND(I)/B(2) IF (ARG1.GT.0) THEN TE = DSQRT(ARG1) ELSE TE = 1.D-5 END IF ARG1 = 1.D0 - BEG(I)/B(2) IF (ARG1.LE.0) THEN TB = 1.D-5 ELSE TB = DSQRT(ARG1) END IF IF (ABS(ECO(I)).GT.2.D-5) THEN FI = FI + (2.D0*(TE-TB)-DLOG((1.D0+TE)*(1.D0- * TB)/((1.D0-TE)*(1.D0+TB))))/ECO(I) ELSE FI = FI + ((TE+TB)*(ARC(I)+ARC(I+1)))/4.D0 END IF 10 CONTINUE GO TO 20 ELSE KK = KK - 1 END IF END IF A = B(KK-1)/B(2) X2 = B(KK)/B(2) X3 = B(KK+1)/B(2) ASUM = ARC(KK) + ARC(KK+1) DN = ARC(KK)*ARC(KK+1)*ASUM BB = (-A*ARC(KK+1)*(ARC(KK)+ASUM)+X2*ASUM**2-X3*ARC(KK)**2)/DN C = (A*ARC(KK+1)-X2*ASUM+X3*ARC(KK))/DN FI = .157079632D01*(1.0D0-A+BB*BB/(4.0D0*C))/DSQRT(ABS(C)) 20 CONTINUE RETURN C END