ULYSSES
					
					
					
					
					
						
					
					
					
						
						
					
					
							
					
					
					
						
					
					
					
					
					
					
					
					
					
				
					
					
				
			Ulysses HISCALE Data Analysis Handbook
Appendix 10. Effect of Backscattered Electrons on the Geometric Factors of the LEMS30 Telescope (Hong MS Thesis)
  
						****************************************************************************** * * * PROGRAM I.3 * * * ****************************************************************************** * * * TRAJRT4BDET * * THIS SUBROUTINE SHOULD BE LINKED WITH TRAJ4PT. IT NOT ONLY INCLUDES * * OUTP, BUT ALSO THE DIFFERENTIAL EQUATION SOLVER TDHPCG. * * * ******************************************************************************
SUBROUTINE DHPCG(PRMT,PV,DERY,NDIM,IHLF,FCT,OUTP,AUX)
      implicit none
      REAL*8 PRMT(5),X,H,Z,DELT,PV(6),DERY(6),AUX(16,6)
      INTEGER NHIT,wscatter,scatter,i,n,istep,imod,ihlf,ihlf1,isw,ndim
      common /nhit/nhit,/wscatter/wscatter,/scatter/scatter
						      integer startnsurf,ape
      logical firstcheck,secondcheck	
      common /startnsurf/startnsurf,/ape/ape
      common /firstcheck/firstcheck,/secondcheck/secondcheck
						      scatter=0
      NHIT=0
      N=1  
      IHLF1=0
      IHLF=0
      X=PRMT(1)
      H=PRMT(3)
      PRMT(5)=0.D0 
      DO I=1,NDIM  
         AUX(16,I)=0.D0 
         AUX(15,I)=DERY(I)  
         AUX(1,I)=PV(I)  
      ENDDO
C     ERROR RETURNS
      IF((H*PRMT(2)).LT.X*H) THEN
         IHLF=13
      ELSE IF((H*PRMT(2)).EQ.X*H) THEN
         IHLF=12
      ENDIF
      ISW=0
C     ****************************************************************
C
C     COMPUTATION OF DERY FOR STARTING VALUES  
C     BLOCK 1   VS OLD LABELS 4_20
C
C     ***************************************************************
      DO WHILE (ISW.NE.4)
         IF(ISW.EQ.0) THEN
            IHLF1=0
            CALL FCT(X,PV,DERY)
C           RECORDING OF STARTING VALUES
            CALL OUTP(X,PV,DERY,IHLF,NDIM,PRMT,NHIT)  
            IF (NHIT.NE.0) RETURN
            IF(PRMT(5).NE.0.) THEN
               RETURN
            ENDIF
            DO I=1,NDIM  
               AUX(8,I)=DERY(I) 
            ENDDO
C           COMPUTATION OF AUX(2,I)  
            ISW=1
         ELSE  IF(ISW.EQ.1) THEN
            IF(IHLF1.NE.1) THEN
               X=X+H
               DO I=1,NDIM 
                  AUX(2,I)=PV(I)  
               ENDDO
            ENDIF
            IHLF1=0
C           INCREMENT IS TESTED BY MEANS OF BISECTION  
            IHLF=IHLF+1  
            X=X-H
            DO I=1,NDIM 
               AUX(4,I)=AUX(2,I)  
            ENDDO
            H=.5D0*H 
            N=1  
            ISW=2
         ELSE IF(ISW.EQ.2) THEN
            X=X+H
            CALL FCT(X,PV,DERY)
            N=2  
            DO  I=1,NDIM 
               AUX(2,I)=PV(I)  
               AUX(9,I)=DERY(I) 
            ENDDO
            ISW=3
         ELSE IF(ISW.EQ.3) THEN
C           COMPUTATION OF TEST VALUE DELT 
            DELT=0.D0
            DO  I=1,NDIM 
               DELT=DELT+AUX(15,I)*DABS(PV(I)-AUX(4,I))  
            ENDDO
            DELT=.66666666667D-1*DELT  
	    if (delt.le.prmt(4)) then
c            IF(DELE.LE.PRMT(4)) THEN
               ISW=5
            ELSE
               IF(IHLF.GE.10) THEN
                  IHLF=11
                  X=X+H
                  ISW=0
                  IHLF1=2
               ELSE
C                 NO SATISFACTORY ACCURACY AFTER 10 BISECTIONS. ERROR MESSAGE. 
                  IHLF1=1
                  ISW=1
               ENDIF
            ENDIF
         ELSE IF(ISW.EQ.5) THEN
C           THERE IS SATISFACTORY ACCURACY AFTER LESS THAN 11 BISECTIONS.  
            X=X+H
            CALL FCT(X,PV,DERY)
            DO I=1,NDIM 
               AUX(3,I)=PV(I)  
               AUX(10,I)=DERY(I)  
            ENDDO
            N=3  
            ISW=4
         ENDIF
C        *******************************************************************
C
C        THE FOLLOWING PART OF SUBROUTINE HPCG COMPUTES BY MEANS OF 
C        RUNGE-KUTTA METHOD STARTING VALUES FOR THE NOT SELF-STARTING 
C        PREDICTOR-CORRECTOR METHOD.
C        BLOCK 2   VS OLD LABELS 100_104 
C
C        *******************************************************************
         IF(ISW.NE.5.AND.IHLF1.EQ.0) THEN
            DO I=1,NDIM  
               Z=H*AUX(N+7,I) 
               AUX(5,I)=Z
               PV(I)=AUX(N,I)+.4D0*Z 
            ENDDO
C           Z IS AN AUXILIARY STORAGE LOCATION 
            Z=X+.4D0*H
            CALL FCT(X,PV,DERY)
            DO I=1,NDIM  
               Z=H*DERY(I)  
               AUX(6,I)=Z
               PV(I)=AUX(N,I)+.29697760925D0*AUX(5,I)+.15875964497D0*Z 
            ENDDO
            Z=X+.45573725422D0*H 
            CALL FCT(X,PV,DERY)
            DO I=1,NDIM  
               Z=H*DERY(I)  
               AUX(7,I)=Z
       PV(I)=AUX(N,I)+0.21810038823D0*AUX(5,I)-3.0509651487D0*AUX(6,I)  
     *        + 3.8328647605D0*Z  
            ENDDO
            Z=X+H
            CALL FCT(X,PV,DERY)
            DO I=1,NDIM  
          PV(I)=AUX(N,I)+.17476028223D0*AUX(5,I)-.55148066288D0*AUX(6,I)  
     *     +1.2055355994D0*AUX(7,I)+.17118478122D0*H*DERY(I)  
            ENDDO
         ENDIF
      ENDDO
C     *******************************************************************
C
C     BLOCK 3   VS OLD LABELS 21_22
C
C     *******************************************************************
      N=1  
      X=X+H
      CALL FCT(X,PV,DERY)
      X=PRMT(1)
      DO I=1,NDIM 
         AUX(11,I)=DERY(I)  
         PV(I)=AUX(1,I)+H*(.375D0*AUX(8,I)+.79166666667D0*AUX(9,I) 
     *   -.20833333333D0*AUX(10,I)+.41666666667D-1*DERY(I)) 
      ENDDO
C     *********************************************************************
C
C     BLOCK 4   VS OLD LABELS 23_30
C
C     *********************************************************************
      DO WHILE (N.LT.4)
         X=X+H
         N=N+1
         CALL FCT(X,PV,DERY)
         CALL OUTP(X,PV,DERY,IHLF,NDIM,PRMT,NHIT)   
         IF (NHIT.NE.0) RETURN
         IF(PRMT(5).NE.0) THEN
            RETURN
         ELSE IF((N-4).LT.0) THEN
            DO I=1,NDIM 
               AUX(N,I)=PV(I)  
               AUX(N+7,I)=DERY(I) 
            ENDDO
            IF(N.LT.3) THEN
               DO I=1,NDIM 
                  DELT=AUX(9,I)+AUX(9,I) 
                  DELT=DELT+DELT 
               PV(I)=AUX(1,I)+.33333333333D0*H*(AUX(8,I)+DELT+AUX(10,I)) 
               ENDDO
            ELSE 
               DO I=1,NDIM 
                  DELT=AUX(9,I)+AUX(10,I)
                  DELT=DELT+DELT+DELT  
                  PV(I)=AUX(1,I)+.375D0*H*(AUX(8,I)+DELT+AUX(11,I)) 
               ENDDO
            ENDIF
         ENDIF
      ENDDO
      ISW=6
C     ******************************************************************
C
C     POSSIBLE BREAK POINT FOR LINKAGE
C     STARTING VALUES ARE COMPUTED
C     NOW START HAMMINGS MODIFIED PREDICTOR-CORRECTOR METHOD.  
C     BLOCK 5   VS OLD LABELS 200_226
C
C     ******************************************************************
      ISTEP=3  
      DO WHILE (ISW.GE.6)
         IF(ISW.EQ.6) THEN
            IF(N.EQ.8) THEN
C              N=8 CAUSES THE ROWS OF AUX TO CHANGE THEIR STORAGE LOCATIONS 
               DO N=2,7 
                  DO I=1,NDIM  
                     AUX(N-1,I)=AUX(N,I)  
                     AUX(N+6,I)=AUX(N+7,I)  
                  ENDDO
               ENDDO
               N=7  
            ENDIF
C           N LESS THAN 8 CAUSES N+1 TO GET N  
            N=N+1
C           COMPUTATION OF NEXT VECTOR PV
            DO I=1,NDIM  
               AUX(N-1,I)=PV(I)  
               AUX(N+6,I)=DERY(I) 
            ENDDO
            X=X+H
            ISW=7
         ELSE IF(ISW.EQ.7) THEN
            ISTEP=ISTEP+1  
            DO I=1,NDIM  
               DELT=AUX(N-4,I)+1.3333333333D0*H*(AUX(N+6,I)+AUX(N+6,I)
     *         -AUX(N+5,I)+AUX(N+4,I)+AUX(N+4,I))
               PV(I)=DELT-.92561983471D0*AUX(16,I) 
               AUX(16,I)=DELT 
            ENDDO
C           PREDICTOR IS NOW GENERATED IN ROW 16 OF AUX, MODIFIED PREDICTOR
C           IS GENERATED I PV.  DELT MEANS AN AUXILIARY STORAGE.  
            CALL FCT(X,PV,DERY)
C           DERIVATIVE OF MODIFIED PREDICTOR IS GENERATED IN DERY  
            DO I=1,NDIM  
               DELT=.125D0*(9.D0*AUX(N-1,I)-AUX(N-3,I)+3.D0*H*(DERY(I)
     *         +AUX(N+6,I)+AUX(N+6,I)-AUX(N+5,I)))
               AUX(16,I)=AUX(16,I)-DELT
               PV(I)=DELT+.7438016529D-1*AUX(16,I) 
            ENDDO
C           TEST WHETHER H MUST BE HALVED OR DOUBLED 
            DELT=0.D0
            DO I=1,NDIM  
               DELT=DELT+AUX(15,I)*DABS(AUX(16,I))  
            ENDDO
            ISW=8
         ELSE IF(ISW.EQ.8) THEN
            IF(DELT.LT.PRMT(4).OR.IHLF1.EQ.5) THEN
               IHLF1=0
C              H MUST NOT BE HALVED.  THAT MEANS PV(I) ARE GOOD. 
               CALL FCT(X,PV,DERY)
               CALL OUTP(X,PV,DERY,IHLF,NDIM,PRMT,NHIT)     
               IF (NHIT.NE.0) RETURN
               IF(PRMT(5).NE.0.OR.IHLF.GE.11.OR.(H*(X-PRMT(2))).GE.0
     *         .OR.DABS(X-PRMT(2)).LT.0.1D0*DABS(H)) THEN
 1150             FORMAT(I5)
                  RETURN
               ELSE
                  IF(DELT.LE.(.2D-1*PRMT(4)).AND.IHLF.GT.0.AND.N.GE.7
     *			.AND.ISTEP.GE.4) THEN
C      H COULD BE DOUBLED IF ALL NECESSARY PRECEEDING VALUES ARE AVAILABLE
                     IMOD=ISTEP/2 
                     IF((ISTEP-IMOD-IMOD).EQ.0) THEN
                        H=H+H
                        IHLF=IHLF-1  
                        ISTEP=0  
                        DO I=1,NDIM  
                           AUX(N-1,I)=AUX(N-2,I)  
                           AUX(N-2,I)=AUX(N-4,I)  
                           AUX(N-3,I)=AUX(N-6,I)  
                           AUX(N+6,I)=AUX(N+5,I)  
                           AUX(N+5,I)=AUX(N+3,I)  
                           AUX(N+4,I)=AUX(N+1,I)  
                           DELT=AUX(N+6,I)+AUX(N+5,I) 
                           DELT=DELT+DELT+DELT  
             AUX(16,I)=8.962962963D0*(PV(I)-AUX(N-3,I))-3.361111111D0*H* 
     *                     (DERY(I)+DELT+AUX(N+4,I))  
                        ENDDO
                        ISW=6
                     ELSE
                        ISW=6
                     ENDIF
                  ELSE
                     ISW=6
                  ENDIF
               ENDIF
               ISW=6
            ELSE
               ISW=9
            ENDIF
         ELSE IF(ISW.EQ.9) THEN
C           H MUST BE HALVED 
            IHLF=IHLF+1  
            IF(IHLF.LE.10) THEN
               ISW=10
            ELSE
               ISW=8
               IHLF1=5
            ENDIF
         ELSE IF(ISW.EQ.10) THEN
            H=.5D0*H 
            ISTEP=0  
            DO I=1,NDIM  
               PV(I)=.390625D-2*(8.D1*AUX(N-1,I)+135.D0*AUX(N-2,I)
     *        + 4.D1*AUX(N-1,I)+AUX(N-4,I))-.1171875D0*(AUX(N+6,I)
     *        -  6.D0*AUX(N+5,I)-AUX(N+4,I))*H
           AUX(N-4,I)=.390625D-2*(12.D0*AUX(N-1,I)+135.D0*AUX(N-2,I)+ 
     *         08.D0*AUX(N-3,I)+AUX(N-4,I))-.234375D-1*(AUX(N+6,I)+  
     *         8.D0*AUX(N+5,I)-9.D0*AUX(N+4,I))*H  
               AUX(N-3,I)=AUX(N-2,I)  
               AUX(N+4,I)=AUX(N+5,I)  
            ENDDO
            X=X-H
            DELT=X-(H+H) 
            CALL FCT(X,PV,DERY)
            DO I=1,NDIM  
               AUX(N-2,I)=PV(I)  
               AUX(N+5,I)=DERY(I) 
               PV(I)=AUX(N-4,I)  
            ENDDO
            DELT=DELT-(H+H)  
            CALL FCT(X,PV,DERY)
            DO I=1,NDIM  
               DELT=AUX(N+5,I)+AUX(N+4,I) 
               DELT=DELT+DELT+DELT  
               AUX(16,I)=8.9629696296D0*(AUX(N-1,I)-PV(I))
     *       -  3.3611111111D0*H*(AUX(N+6,I)+DELT+DERY(I))  
               AUX(N+3,I)=DERY(I) 
            ENDDO
            ISW=7
         ENDIF
      ENDDO
c	print*, nhit
						c pause
return
END C----------------------------------------------------------------------- C----------------------------------------------------------------------- C THIS IS A FILE OF ROUTINES THAT HAVE BEEN DECLARED EXTERNAL IN THE C MAIN PROGRAM & WHICH ARE PASSED INTO THE ROUTINE DHPCG THAT SOLVES THE C SYSTEM OF DIFFERENTIAL EQUATIONS.
SUBROUTINE FCT(X,Y,DERY)
      IMPLICIT NONE
      INTEGER NDIM
      PARAMETER (NDIM=6)
      REAL*8 BX,BY,BZ,DERY(NDIM),FAC,QMC,X,X00,Y(NDIM),Y00,Z00
      COMMON /QMC/QMC
C     COMMON /BX/BX,BY,BZ,/X00/X00,Y00,Z00
      PARAMETER (FAC=1.0D-2)
C SUBROUTINE TO COMPUTE THE RIGHT HAND SIDE DERY OF THE SYSTEM AT THE 
C GIVEN VALUES OF X & Y.
 
						      X00 = Y(1)/FAC
      Y00 = Y(2)/FAC
      Z00 = Y(3)/FAC
      CALL FDMOD(X00,Y00,Z00,BX,BY,BZ)
D     PRINT *,' QMC ',QMC
D     PRINT *,' X00 ',X00,' Y00 ',Y00,' Z00 ',Z00
D     PRINT *,' BX ',BX,' BY ',BY,' BZ ',BZ
      DERY(1) = Y(4)
      DERY(2) = Y(5)
      DERY(3) = Y(6)
      DERY(4) = QMC * (Y(5)*BZ - Y(6)*BY)
      DERY(5) = QMC * (Y(6)*BX - Y(4)*BZ)
      DERY(6) = QMC * (Y(4)*BY - Y(5)*BX)
      
						      RETURN
      END
C--------------------------------------------------------------------
C---------------------------------------------------------------------
      	SUBROUTINE OUTP(X,Y,DERY,IHLF,NDIM,PRMT,HIT)
						C PURPOSE : THIS IS A ROUTINE THAT IS DECLARED EXTERNAL IN THE MAIN C ROUTINE. IT PRINTS THE OUTPUT VALUES OBTAINED FROM THE ROUTINE C DHPCG - WHICH SOLVES THE SYSTEM OF DIFF. EQUATIONS.
      	IMPLICIT NONE
      	CHARACTER*72 FNAME
      	INTEGER HIT,I,IHLF,MULC,MULC1,NCOUNT,NDIM,NSURF,NU,ek
      	integer scatter,wscatter,change,Nscatter,nsurf1
      	REAL*8 DERY(NDIM),PRMT(5),X,Y(NDIM),TLN(2,3),TOTV,BX,BY,BZ,B,
     &  	X00,Y00,Z00,FAC,PASVEL(10000,2)
	real*8 x01(3),x02(3),aux(16,6),sect(3),c1(4),theta,phi
      	REAL*8 FPHI,DIST,X1,Y1,Z1
						      integer startnsurf,ape
      logical firstcheck,secondcheck    
      common /startnsurf/startnsurf,/ape/ape
      common /firstcheck/firstcheck,/secondcheck/secondcheck
							external fct
      	PARAMETER (FAC=1.0D-2)
      	COMMON /NCOUNT/NCOUNT,/ek/ek
      	COMMON /TLN/TLN,/NU/NU
	common /wscatter/wscatter,/scatter/scatter
	common /sect/sect,/nsurf1/nsurf1,/c1/c1,/Nscatter/Nscatter
	common /theta/theta,/phi/phi
C      	COMMON /PASVEL/PASVEL
      	INCLUDE 'PASS5.CMN'
      	DATA MULC/40/,MULC1/10/
						TOTV=DSQRT(Y(4)*Y(4) + Y(5)*Y(5) + Y(6)*Y(6))
NCOUNT = NCOUNT + 1
D B = DSQRT(BX*BX + BY*BY + BZ*BZ)
      	IF (NU .EQ. 1) THEN
       	    DO I=1,3
            	TLN(2,I)=Y(I)/FAC
       	    ENDDO
      	ELSE
       	    DO I=1,3
        	TLN(1,I)=TLN(2,I)
        	TLN(2,I)=Y(I)/FAC
       	    ENDDO
	    do 31 i=1,3
	    	x01(i)=tln(1,i)
	    	x02(i)=tln(2,i)
31	    enddo
	  
						c	    if (secondcheck) then	
c                 write(6,*)'-----',startnsurf,ape
c	    endif
     	    CALL CHECKHIT(HIT,NSURF)
                        !HIT=0 :CONTINUE WITH TRAJECTORY CALCULATION
                        !   =1 :HIT THE NSURF(NTH SURFACE), LOST
                        !   =2 :SUCCESSFULLY ESCAPED FROM THE SENSOR 
							if ( ((x01(1).gt.7.0).or.(x01(1).lt.0.0).or.(x01(2).gt.4)
     & .or.(x01(2).lt.1.0).or.(x01(3).gt.1.0).or.(x01(3).lt.-1.0)) 
     & .and. (hit.eq.0) ) then
c	write(6,*)'Special case, trajectory has run out of assembly'
c     & ,x02(1),x02(2),x02(3)
	hit = 1
	endif
						       	    IF (HIT .EQ. 2) THEN
	    	NPAS = NPAS + 1
	    	X1=TLN(2,1)-TLN(1,1)
  	    	Y1=TLN(2,2)-TLN(1,2)
	    	Z1=TLN(2,3)-TLN(1,3)
		DIST=DSQRT(X1*X1 + Y1*Y1 + Z1*Z1)
		pas(npas,1)=theta
		pas(npas,2)=phi
		PAS(NPAS,3)=DACOS(Z1/DIST)
		PAS(NPAS,4)=FPHI(X1,Y1)
		pas(npas,11)=1
C		PASVEL(NPAS,1)=DACOS(Y(6)/TOTV)
C		PASVEL(NPAS,2)=FPHI(Y(4),Y(5))
		DO I=1,6
	  	    PAS(NPAS,I+4)=Y(I)
		ENDDO
     	    ENDIF
						C	    if ((hit.eq.0).and.(scatter.eq.1)) then
C	    	if (wscatter.eq.1) then
C		    call SCATTERSUB(HIT,sect,X01,X02,C1,y)
C		    nsurf1 = nsurf - 1	
C		    if (hit.eq.0) then	
C	       	        call fct(x,y,dery)	
C	    	        call DHPCG1(PRMT,Y,DERY,NDIM,IHLF,FCT,OUTP1,AUX)
C		    endif	
C	        endif
C	    	if (wscatter.eq.2) then
C	    	    do i=1,nscatter
C		    	call SCATTERSUB(HIT,sect,X01,X02,C1,y)
C			nsurf1 = nsurf - 1	
C		    	if (hit.eq.0) then
C	       	    	    call fct(x,y,dery)	
C	    	    	    call DHPCG1(PRMT,Y,DERY,NDIM,IHLF,
C     &					FCT,OUTP1,AUX)
C------------------------------------------------------------------------
C   	Here is a modification to restrict only one diffuse scattering
C	   occurs during the process, Be careful with this modification
C	   need more testing for this.
C
C			    if (hit.eq.2) then	
C				nu=nu+1
C				return
C			    endif
C------------------------------------------------------------------------
C		    	endif
C		    enddo	
C	    	endif
C		hit=1
C	    endif
      	ENDIF 
      	NU=NU+1         
						D WRITE(3,15) X,(Y(I),I=1,NDIM),TOTV C15 FORMAT (1X,D14.7,6(1X,D14.7),1X,D14.7,1X,F10.3) 15 FORMAT (1X,D14.7,6(1X,D15.8),1X,D21.14) 20 FORMAT(3(X,F13.6))
RETURN
END **************************************************************************
Return to Appendix 10.11 List of Programs
Return to the Table of Contents for Hong's MS 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

		