ULYSSES
Ulysses HISCALE Data Analysis Handbook
Appendix 9 Geometric Factor Study for the Deflected and Unscattered Electrons of HISCALE (Buckley MS Thesis)
A9.13 Appendix: Computer Programs
* PROGRAM I.2 *
******************************************************************************* * CHECHITSEN1 * * THIS FILE CONTAINS ALL THE SUBROUTINES THAT ARE USED TO FIND WHETHER * * THE LINE SEGMENT HAS HIT ANY OF THE SURFACES AND LOST OR NOT. * *******************************************************************************
SUBROUTINE CHECKHIT(HIT,NSURF)
IMPLICIT NONE INTEGER I,J,HIT,MAXSURF,NSURF,NTY,NVERT PARAMETER (MAXSURF=55) REAL*8 A,B,C,COEFF(MAXSURF,4),D,VERT(10,3) COMMON /COEFF/COEFF,/VERT/VERT,NVERT,/NTY/NTY
NSURF=1 HIT=0 DO WHILE((NSURF.LE.NTY).AND.(HIT.EQ.0)) CALL FINDVERT(VERT,NVERT,NSURF) D WRITE(6,*) 'NO. OF VERTICES ARE: ',NVERT D DO I=1,NVERT D WRITE(6,*) (VERT(I,J),J=1,3) D END DO A=COEFF(NSURF,1) B=COEFF(NSURF,2) C=COEFF(NSURF,3) D=COEFF(NSURF,4) D WRITE(6,*)(COEFF(NSURF,1),COEFF(NSURF,2),COEFF(NSURF,3)) CALL SCANPOLY(A,B,C,D,HIT,NSURF) NSURF=NSURF+1 END DO RETURN END C------------------------------------------------------------------ SUBROUTINE FINDVERT(VERT,NVERT,NSURF)
INTEGER I1,I2,J,MAXSURF,MAXCOO,NVERT PARAMETER (MAXSURF=55,MAXCOO=55) REAL*8 CHAN(MAXSURF,MAXCOO),VERT(10,3) COMMON /CHAN/CHAN
NVERT=IDINT(CHAN(NSURF,1)) I2=2 DO I1=1,NVERT DO J=1,3 VERT(I1,J)=CHAN(NSURF,I2) I2=I2+1 END DO END DO RETURN END
C----------------------------------------------------------------- SUBROUTINE SCANPOLY(A,B,C,D,HIT,I)
IMPLICIT NONE REAL*8 A,B,C,D,SECT(3),TLN(2,3),VERT(10,3) INTEGER FLAG,HIT,I,NCOUNT,NGAMAP,NLOWAP,NERR,NVERT,NOPAP PARAMETER (NOPAP=40,NGAMAP=56,NLOWAP=57) C HIT : WHOSE VALUE INDICATES WHETHER TRAJECTORY CALCULATION IS TO BE CONTINUED C OR NOT. C = 0 PARTICLE IS NOT LOST-SO CONTINUE WITH THE TRAJECTORY CALCULATION. C = 1 PARTICLE IS LOST-DO NOT CONTINUE WITH THE TRAJECTORY CALCULATION. C = 2 PARTICLE ESCAPES FROM THE SENSOR ASSEMBLY WITHOUT HITTING C ANY OF THE OTHER SURFACES. NO NEED TO CONTINUE WITH THE C TRAJECTORY CALCULATION - SO STOP CALCULATION.
CALL INTERSECT(SECT,A,B,C,D,NERR) C NERR = 0 :NO INTERSECTION BETWEEN THE LINE & THE PLANE IF (NERR .EQ. 0) THEN HIT=0 D WRITE(6,*) 'LINE SEGMENT PARALLEL TO THE PLANE' RETURN END IF
C SINCE AT THS POINT INTERSECTION IS POSSIBLE,FIND WHETHER THE POINT C BELONGS TO THE LINE SEGMENT OR NOT. D WRITE(6,*) 'INTERSECTION POINT :',(SECT(NCOUNT),NCOUNT=1,3) D WRITE(6,*) I D WRITE(6,*) 'TEST WHETHER IT BELONGS TO THE LINE-SEGMENT OR NOT' CALL BETWEEN(SECT,NERR) C NERR = 0 :POINT DOES NOT BELONG TO THE LINE-SEGMENT C SO IT HAS NOT REACHED THE PLANE YET-HANGING THERE
IF (NERR .EQ. 0) THEN HIT=0 D WRITE(6,*) 'POINT DOES NOT BELONG TO THE LINE SEGMENT' RETURN END IF
C POINT BELONGS TO THE LINE-SEGMENT-TEST WHETHER THIS C INTERSECTION POINT C LIES ON THE EDGES OF THE POLYGON OR NOT
D WRITE(6,*) 'TEST WHETHER IT LIES ON THE EDGES OF THE D & POLYGON OR NOT' CALL HITEDGE(SECT,NERR) C NERR = 0 :IT DOES NOT LIE ON ANY OF THE C EDGES OF THE POLYGON C = 1 :PARTICLE LOST-SINCE IT LIES ON ONE OF C THE EDGES OF THE POLYGON.
IF (NERR .EQ. 1) THEN HIT=1 WRITE(6,*) 'IT LIES ON THE EDGES OF THE POLYGON' RETURN END IF
C TEST WHETHER THE PARTICLE LIES INSIDE THE POLYGON OR NOT
D WRITE(6,*) 'TEST WHETHER IT LIES INSIDE THE POLYGON OR NOT' CALL INOUT(SECT,FLAG) C FLAG = 0 :PARTCLE LIES OUTSIDE THE POLYGON C = 1 :IT LIES INSIDE THE POLYGON
IF (FLAG .EQ. 1) THEN IF ((I .EQ. NLOWAP) .OR. (I .EQ. NGAMAP))THEN !LIES INSIDE THE LOWER APERTURE OR GAMMA OPENING HIT=0 WRITE(6,*) 'IT LIES INSIDE THE LOWER POLYGON' RETURN ELSE IF (I .EQ. NOPAP) THEN !INSIDE THE OUTER APERTURE HIT=2 WRITE(6,*) 'IT LIES INSIDE THE OUTER OPENING APERUTRE' RETURN END IF END IF HIT=1 !INSIDE THE OTHER POLYGONS WRITE(6,*) 'IT LIES INSIDE THE OTHER POLYGONS' RETURN END IF
IF (FLAG .NE. 0) THEN WRITE(6,*) 'ERROR IN INOUT ROUTINE-CHECK' HIT=10 RETURN END IF
IF ((I .EQ. NLOWAP).OR.(I .EQ. NOPAP).OR.(I.EQ.NGAMAP)) THEN !LIES OUTSIDE THE APERTURE SURFACES HIT=1 WRITE(6,*) 'LIES OUTSIDE THE APERTURE SURFACES' ELSE HIT=0 !OUTSIDE THE OTHER PLANE D WRITE(6,*) 'LIES OUTSIDE OTHER PLANES-SO NOT LOST YET' END IF !POLYGONS-MAY NOT BE LOST YET
RETURN END C *********************************************************************** C SUBROUTINE INTERSECT(SECT,A,B,C,D,NERR) C IMPLICIT NONE REAL*8 A,B,C,D,DX,DY,DZ,DET,RATIO REAL*8 TLN(2,3),SECT(3),NUM INTEGER NERR,i COMMON /TLN/TLN NERR = 1 DX=TLN(2,1)-TLN(1,1) DY=TLN(2,2)-TLN(1,2) DZ=TLN(2,3)-TLN(1,3) D WRITE(6,*) A,B,C,D D WRITE(6,*) (DX,DY,DZ) DET=A*DX+B*DY+C*DZ NUM=-(A*TLN(1,1)+B*TLN(1,2)+C*TLN(1,3)+D)
D WRITE(6,*) (DET,NUM) IF (DET.EQ. 0.0) THEN NERR=0 RETURN END IF RATIO=NUM/DET D WRITE(6,*) RATIO C SECT(1)=DX*RATIO+TLN(1,1) SECT(2)=DY*RATIO+TLN(1,2) SECT(3)=DZ*RATIO+TLN(1,3) RETURN END
C ********************************************************************* C SUBROUTINE BETWEEN(SECT,NERR) IMPLICIT NONE REAL*8 DD,DT1,DT2,DT3,DIS(2),SECT(3),TLN(2,3) INTEGER I,NERR,h COMMON /TLN/TLN NERR = 1 DT1=TLN(1,1)-TLN(2,1) DT2=TLN(1,2)-TLN(2,2) DT3=TLN(1,3)-TLN(2,3) DD=DSQRT(DT1**2+DT2**2+DT3**2) DO I=1,2 DT1=TLN(I,1)-SECT(1) DT2=TLN(I,2)-SECT(2) DT3=TLN(I,3)-SECT(3) d write(6,*) dt1,dt2,dt3 if (abs(dt1).gt.(100000000)) then h = h + 1 write(6,*) h dt1=dt1/(10000000000000000.0d0) dt2=dt2/(10000000000000000.0d0) dt3=dt3/(10000000000000000.0d0) write(6,*) dt1,dt2,dt3 end if DIS(I)=DSQRT(DT1**2+DT2**2+DT3**2) END DO IF (DIS(1).GT.DD.OR.DIS(2).GT.DD) THEN NERR=0 END IF
C RETURN END C ********************************************************************* C SUBROUTINE HITEDGE(SECT,NERR) C C IMPLICIT NONE REAL*8 VERT(10,3),SECT(3),TOL REAL*8 DS,DS1,DS2,DIF PARAMETER (TOL=5.D-05) INTEGER I,K,NERR,NVERT COMMON /VERT/VERT,NVERT C
I=1 NERR = 0 DO WHILE(I.LE.NVERT.AND.NERR.EQ.0) DS=0.D0 DS1=0.D0 DS2=0.D0 IF (I.NE.NVERT) THEN DO K=1,3 DS=DS+(VERT(I,K)-VERT(I+1,K))**2 DS1=DS1+(VERT(I,K)-SECT(K))**2 DS2=DS2+(VERT(I+1,K)-SECT(K))**2 END DO ELSE DO K=1,3 DS=DS+(VERT(I,K)-VERT(1,K))**2 DS1=DS1+(VERT(I,K)-SECT(K))**2 DS2=DS2+(VERT(1,K)-SECT(K))**2 END DO END IF DS=DSQRT(DS) DS1=DSQRT(DS1) DS2=DSQRT(DS2) DIF=DABS(DS-DS1-DS2) C IF (DIF.LE.TOL) THEN NERR=1 END IF I=I+1 END DO RETURN END C ************************************************************************ C SUBROUTINE INOUT(SECT,FLAG) C IMPLICIT NONE REAL*8 VECT1(3),VECT2(3),CRSPRCT(3) REAL*8 VERT(10,3),SECT(3) INTEGER I,J,SINAL(3),NSINAL(3),FLAG,NVERT COMMON /VERT/VERT,NVERT C C C COMPUTE THE CROSS PRODUCT OF THE FIRST TWO VECTORS FROM THE FIRST TWO C VERTICES AND INTERSECTION POINT. THE SINAL OF THIS CURL VECTOR WILL C BE USED AS A REFERENCE TO TEST THE REST OF THE CROSS PRODUCT VECTORS. C FLAG=1 DO J=1,3 VECT1(J)=VERT(1,J)-SECT(J) VECT2(J)=VERT(2,J)-SECT(J) END DO C C COMPUTE THE COMPONENTS OF THE COMPONENTS OF THE FIRST CROSS PRODUCT C CRSPRCT(1)=VECT1(2)*VECT2(3)-VECT1(3)*VECT2(2) CRSPRCT(2)=VECT1(3)*VECT2(1)-VECT1(1)*VECT2(3) CRSPRCT(3)=VECT1(1)*VECT2(2)-VECT1(2)*VECT2(1) CALL CRSPRCTSIGN(CRSPRCT,SINAL) C C TEST IF THE OTHER CROSS PRODUCT VECTORS HAVE THE SAME DIRECTIONS C AS THE FIRST ONE. IF YES ,THEN "IN". IF NO,THEN "OUT". C I=2 DO WHILE (FLAG.EQ.1.AND.I.LE.NVERT) DO J=1,3 VECT1(J)=VERT(I,J)-SECT(J) IF (I.NE.NVERT) THEN VECT2(J)=VERT(I+1,J)-SECT(J) ELSE VECT2(J)=VERT(1,J)-SECT(J) END IF END DO C C COMPUTE THE COMPONENTS OF THE CROSS PRODUCT VECTORS OF THE REST C OF THE VERTICES. C CRSPRCT(1)=VECT1(2)*VECT2(3)-VECT1(3)*VECT2(2) CRSPRCT(2)=VECT1(3)*VECT2(1)-VECT1(1)*VECT2(3) CRSPRCT(3)=VECT1(1)*VECT2(2)-VECT1(2)*VECT2(1) C CALL CRSPRCTSIGN(CRSPRCT,NSINAL) IF (NSINAL(1).EQ.SINAL(1).AND.NSINAL(2).EQ.SINAL(2). & AND.NSINAL(3).EQ.SINAL(3)) THEN FLAG=1 ELSE FLAG=0 END IF I=I+1 END DO RETURN END C C ******************************************************************** C SUBROUTINE CRSPRCTSIGN(CRSPRCT,SINAL)
IMPLICIT NONE REAL*8 TOL PARAMETER (TOL=5.D-05) REAL*8 CRSPRCT(3) INTEGER I,SINAL(3) C DO I=1,3 IF (DABS(CRSPRCT(I)).LT.TOL) THEN SINAL(I)=0 ELSE IF (CRSPRCT(I).LT.0.0D0) THEN SINAL(I)=-1 ELSE SINAL(I)=1 END IF END IF END DO RETURN END C ************************************************************************
Return to the Table of Contents for Buckley's Thesis
Return to HISCALE List of Appendices
Return to Ulysses HISCALE Data Analysis Handbook Table of Contents
Updated 8/8/19, Cameron Crane
QUICK FACTS
Manufacturer:
ESA provided the Ulysses spacecraft, NASA provided the power
supply, and various others provided its instruments.
Mission End Date: June 30, 2009
Destination: The inner heliosphere of the sun away from the ecliptic plane
Orbit: Elliptical orbit transversing the polar regions of the sun outside of the ecliptic plane
Mission End Date: June 30, 2009
Destination: The inner heliosphere of the sun away from the ecliptic plane
Orbit: Elliptical orbit transversing the polar regions of the sun outside of the ecliptic plane