Coddington Raytrace

Matlab code

function fields = codd_ray(Uin,cv,th,rn)
%
%  CODD_RAY  Coddington raytrace
%
m = length(th);

Q = 0.0;
U = Uin;
% trigonometric raytrace
for (n=2:m)
   I = asin(sin(U)+Q*cv(n));
   Iprime = asin(rn(n-1)*sin(I)/rn(n));
   Uprime = U + Iprime - I;
   G = Q/(cos(U)+cos(I));
   Qprime = G*(cos(Uprime)+cos(Iprime));
   beta = Iprime - Uprime;
   Y = G*(1+cos(beta));
   % needed for Coddington raytrace
   Z(n) = G*sin(beta);
   Gamma(1,n) = cos(I);
   Gamma(2,n) = cos(Iprime);
   Gamma(3,n) = cos(Uprime);
   % transfer
   Q = Qprime + th(n)*sin(Uprime);
   U = Uprime;
end

% Coddington trace
U = Uin;
t = th(1)./cos(U);
s = t;
for (n=2:m-1)
   Phi = (rn(n)*Gamma(2,n) - rn(n-1)*Gamma(1,n))*cv(n);   
   sprime = rn(n)/(Phi-(rn(n-1)/s));
   tprime = rn(n)*Gamma(2,n)^2/(Phi-(rn(n-1)*Gamma(1,n)^2/t));
   D = (th(n) + Z(n+1) - Z(n))/Gamma(3,n);
   s = D - sprime;
   t = D - tprime;
end
zs = sprime*cos(Uprime) + Z(m-1) - th(m-1);
zt = tprime*cos(Uprime) + Z(m-1) - th(m-1);
fields = [ zs zt ]; 	

Example

First we define the optical system.

cv = [ 0 1/34.53 -1/21.98 -1/214.63 0];
th = [ 1e20 9 2.5 43.567826 0];
rn = [ 1 1.670028 1.72825 1 1 ];

The following script defines the field curvature for a half field-of-view of 4 degrees:

>> for (n=0:10)
>>    h = 0.1*n;
>>    u = h*4;
>>    fields(n+1,1:2) = [h u];
>>    fields(n+1,3:4) = codd_ray(u*pi/180,cv,th,rn);
>>  end
The result is
         h        uc        zs        zt
         0         0   -0.0000   -0.0000
    0.1000    0.4000   -0.0019   -0.0041
    0.2000    0.8000   -0.0075   -0.0163
    0.3000    1.2000   -0.0168   -0.0366
    0.4000    1.6000   -0.0299   -0.0650
    0.5000    2.0000   -0.0468   -0.1016
    0.6000    2.4000   -0.0673   -0.1462
    0.7000    2.8000   -0.0916   -0.1989
    0.8000    3.2000   -0.1196   -0.2597
    0.9000    3.6000   -0.1513   -0.3284
    1.0000    4.0000   -0.1868   -0.4051


Maintained by John Loomis, last updated 7 Feb 2003