Program for finding aberrations of a magnetic deflector, used in conjunction with xmpl3d30.dat
This can be copied from the end of file xmpl3d30.dat, which is supplied with the CPO3D package.
Program for finding aberrations of a magnetic deflector (in Fortran, early version).
DIMENSION x(100) , y(100) , z(100) , vx(100) , vy(100) , vz(100) ,
& xf(100) , yf(100)
n = 14
C =number of results in output file
zf_gaussian = 50.0
C =final z at which image is supposed to be
dzf = 0.05
C =decrements for testing for z positions of minimum spots (in tangential
C and sagittal directions, and disc of least confusion)
zf_min = 45.0
C =lowest vale of zf for looking for minimum spots
ntest = int((zf_gaussian-zf_min)/dzf)
zf = zf_gaussian + dzf
OPEN (UNIT=1,FILE='temp30a.dat',STATUS='OLD')
C =trajectory output file
OPEN (UNIT=2,FILE='tempres.dat',STATUS='UNKNOWN')
C =results file
DO i = 1 , n
READ (1,*) x(i) , y(i) , z(i) , vx(i) , vy(i) , vz(i)
ENDDO
dxmin = 1.E10
C =spread in x direction
dymin = 1.E10
C =spread in y direction
dxymin = 1.E10
C =spread in either x or y directions -ie disc of least confusion
DO iz = 1 , ntest
zf = zf - dzf
C =test value of final z, to find minimum spots
xmax = -1.E10
xmin = 1.E10
ymax = -1.E10
ymin = 1.E10
DO i = 1 , n
xf(i) = x(i) + (zf - zf_gaussian)*vx(i)/vz(i)
yf(i) = y(i) + (zf - zf_gaussian)*vy(i)/vz(i)
C =x and y at test plane
C (put in arrays in case more sophisticated analysis is wanted later)
xmax = max(xmax,xf(i))
xmin = min(xmin,xf(i))
ymax = max(ymax,yf(i))
ymin = min(ymin,yf(i))
ENDDO
dx = xmax - xmin
C =spread in x direction
dy = 2.*(ymax - ymin)
C =spread in y direction
C (2* because of reflection in y plane)
IF (iz.EQ.1) THEN
dx_gaussian = dx
dy_gaussian = dy
C =saved values at z=zf_gaussian
ENDIF
IF (dx.LT.dxmin) THEN
C Best size of spot so far, in the x direction only
dxmin = dx
dzminx = zf_gaussian - zf
IF (iz.EQ.ntest)
& WRITE (2,'(''Range of z not large enough'')')
ENDIF
IF (dy.LT.dymin) THEN
C Best size of spot so far, in the y direction only
dymin = dy
dzminy = zf_gaussian - zf
IF (iz.EQ.ntest)
& WRITE (2,'(''Range of z not large enough'')')
ENDIF
dxy = max(dx,dy)
C =largest spread in x or y direction (for disc of least confusion)
IF (dxy.LT.dxymin) THEN
C Best size of spot of least confusion so far
dxymin = dxy
dzminlc = zf_gaussian - zf
IF (iz.EQ.ntest)
& WRITE (2,'(''Range of z not large enough'')')
ENDIF
ENDDO
WRITE (2,99001) x(1) , dx_gaussian , dy_gaussian , dxmin ,
& dzminx , dymin , dzminy , dxymin , dzminlc
99001 FORMAT (
& 'Gaussian plane: tangential: sagital: least confus
&ion:'/
& 'median_x dx dy dx dz dy dz dx,y dz
&'/
& F7.4,2F8.5,F9.5,F5.2,F9.5,F5.2,F9.5,F5.2)
STOP
END