source: MML/trunk/at/atphysics/findorbit4.m @ 5

Last change on this file since 5 was 4, checked in by zhangj, 11 years ago

Initial import--MML version from SOLEIL@2013

File size: 3.8 KB
Line 
1function orbit = findorbit4(RING,dP,varargin);
2%FINDORBIT4 finds closed orbit in the 4-d transverse phase
3% space by numerically solving  for a fixed point of the one turn
4% map M calculated with LINEPASS
5%
6%         (X, PX, Y, PY, dP2, CT2 ) = M (X, PX, Y, PY, dP1, CT1)
7%
8%    under the CONSTANT MOMENTUM constraint, dP2 = dP1 = dP and
9%    there is NO constraint on the 6-th coordinate CT
10%
11% IMPORTANT!!! FINDORBIT4 imposes a constraint on dP and relaxes
12%    the constraint on the revolution frequency. A physical storage
13%    ring does exactly the opposite: the momentum deviation of a
14%    particle on the closed orbit settles at the value
15%    such that the revolution is synchronous with the RF cavity
16%
17%                 HarmNumber*Frev = Frf
18%
19%    To impose this artificial constraint in FINDORBIT4
20%    PassMethod used for any element SHOULD NOT
21%    1. change the longitudinal momentum dP (cavities , magnets with radiation)
22%    2. have any time dependence (localized impedance, fast kickers etc)
23%
24% FINDORBIT4(RING,dP) is 4x1 vector - fixed point at the
25%    entrance of the 1-st element of the RING (x,px,y,py)
26%
27% FINDORBIT4(RING,dP,REFPTS) is 4-by-Length(REFPTS)
28%     array of column vectors - fixed points (x,px,y,py)
29%     at the entrance of each element indexed  REFPTS array.
30%     REFPTS is an array of increasing indexes that  select elements
31%     from the range 1 to length(RING)+1.
32%     See further explanation of REFPTS in the 'help' for FINDSPOS 
33%
34% FINDORBIT4(RING,dP,REFPTS,GUESS) - same as above but the search
35%     for the fixed point starts at the initial condition GUESS
36%     Otherwise the search starts from [0 0 0 0 0 0]'.
37%     GUESS must be a 6-by-1 vector;
38%
39% [ORBIT, FIXEDPOINT] = FINDORBIT4( ... )
40%     The optional second return parameter is
41%     a 6-by-1 vector of initial conditions
42%     on the closed orbit at the entrance to the RING.
43%
44% See also FINDORBIT, FINDSYNCORBIT, FINDORBIT6.
45
46if ~iscell(RING)
47   error('First argument must be a cell array');
48end
49
50%d = sqrt(eps); % step size for numerical differentiation
51d = 1e-8;
52D5 = d*eye(4);
53
54max_iterations = 20;
55J = zeros(4);
56
57% Check if guess argument was supplied
58if nargin == 4
59    if isnumeric(varargin{2}) & all(eq(size(varargin{2}),[6,1]))
60       Ri = varargin{2};
61    else
62       error('The last argument GUESS must be a 6-by-1 vector');
63    end       
64else
65    Ri = zeros(6,1);
66end
67% Set the momentum component of Ri to the specified dP
68Ri(5) = dP;
69
70%First iteration
71RMATi= Ri*ones(1,5);
72for k = 1:4
73    RMATi(k,k) = RMATi(k,k)+d;
74end
75RMATf = linepass(RING,RMATi);
76Rf = RMATf(:,5);
77% compute the transverse part of the Jacobian
78J4 =  [RMATf(1:4,1:4)-RMATf(1:4,5)*ones(1,4)]/d;
79% Replace matrix inversion with \
80% B4 = inv(eye(4) - J4);
81% Ri_next = Ri +  [B4*(Rf(1:4)-Ri(1:4)); 0; 0];
82
83Ri_next = Ri +  [(eye(4) - J4)\(Rf(1:4)-Ri(1:4)); 0; 0];
84
85change = norm(Ri_next - Ri);
86Ri = Ri_next;
87
88
89itercount = 1;
90
91while (change>eps) & (itercount < max_iterations)
92    RMATi=[Ri Ri Ri Ri Ri];
93    for k = 1:4
94        RMATi(k,k) = RMATi(k,k)+d;
95    end
96    RMATf = linepass(RING,RMATi,'reuse');
97    Rf = RMATf(:,5);
98   
99    % compute the transverse part of the Jacobian
100    J4 =  [RMATf(1:4,1:4)-RMATf(1:4,5)*ones(1,4)]/d;
101% Replace matrix inversion with \
102%     B4 = inv(eye(4) - J4);
103%     Ri_next = Ri +  [B4*(Rf(1:4)-Ri(1:4)); 0; 0];
104   
105    Ri_next = Ri +  [(eye(4) - J4)\(Rf(1:4)-Ri(1:4)); 0; 0];
106    change = norm(Ri_next - Ri);
107    Ri = Ri_next;
108    itercount = itercount+1;
109end;
110
111if(nargin<3) | (varargin{1}==(length(RING)+1)) 
112    % return only the fixed point at the entrance of RING{1}
113   orbit=Ri(1:4,1);
114else  % 3-rd input argument - vector of reference points along the RING
115      % is supplied - return orbit           
116   orb6 = linepass(RING,Ri,varargin{1},'reuse');
117   orbit = orb6(1:4,:);
118end
119
120if nargout==2
121    varargout{1}=Ri;
122end
Note: See TracBrowser for help on using the repository browser.