1 | function [B, M, r] = findelemraddiffm(ELEM,rin, varargin); |
---|
2 | %FINDELEMRADDIFFM |
---|
3 | |
---|
4 | MaxOrder = 2; |
---|
5 | |
---|
6 | B = zeros(6); |
---|
7 | M = eye(6); |
---|
8 | r = rin; |
---|
9 | |
---|
10 | switch ELEM.PassMethod |
---|
11 | case {'BndMPoleSymplectic4Pass', 'BndMPoleSymplectic4RadPass'} |
---|
12 | invrho = ELEM.BendingAngle/ELEM.Length; |
---|
13 | if isfield(ELEM,'T1') |
---|
14 | r = r + ELEM.T1'; |
---|
15 | end |
---|
16 | if isfield(ELEM,'R1') |
---|
17 | r = ELEM.R1*r; |
---|
18 | B = ELEM.R1*B*ELEM.R1'; |
---|
19 | M = ELEM.R1*M; |
---|
20 | end |
---|
21 | |
---|
22 | % Entrance edge effects |
---|
23 | E = eye(6); |
---|
24 | E(2,1) = invrho*tan(ELEM.EntranceAngle); |
---|
25 | if isfield(ELEM,'FullGap') & isfield(ELEM,'FringeInt1') |
---|
26 | E(4,3) = -invrho*tan(ELEM.EntranceAngle... |
---|
27 | -ELEM.FullGap*ELEM.FringeInt1... |
---|
28 | *(1+sin(ELEM.EntranceAngle)^2)/cos(ELEM.EntranceAngle)... |
---|
29 | /(1+r(5))); |
---|
30 | else |
---|
31 | E(4,3) = -invrho*tan(ELEM.EntranceAngle); |
---|
32 | end |
---|
33 | |
---|
34 | r = E*r; |
---|
35 | M = E*M; |
---|
36 | B = E*B*E'; |
---|
37 | |
---|
38 | % Body of dipole |
---|
39 | [Bbody, Mbody, r] = findthickmpoleraddiffm(r,... |
---|
40 | ELEM.PolynomA, ELEM.PolynomB, ELEM.Length, invrho, ... |
---|
41 | ELEM.Energy, MaxOrder,ELEM.NumIntSteps); |
---|
42 | |
---|
43 | |
---|
44 | B = Mbody*B*Mbody'+Bbody; |
---|
45 | M = Mbody*M; |
---|
46 | |
---|
47 | % Exit edge effects |
---|
48 | E = eye(6); |
---|
49 | E(2,1) = invrho*tan(ELEM.ExitAngle); |
---|
50 | if isfield(ELEM,'FullGap') & isfield(ELEM,'FringeInt2') |
---|
51 | E(4,3) = -invrho*tan(ELEM.ExitAngle... |
---|
52 | -ELEM.FullGap*ELEM.FringeInt1... |
---|
53 | *(1+sin(ELEM.ExitAngle)^2)/cos(ELEM.ExitAngle)... |
---|
54 | /(1+r(5))); |
---|
55 | else |
---|
56 | E(4,3) = -invrho*tan(ELEM.ExitAngle); |
---|
57 | end |
---|
58 | |
---|
59 | r = E*r; |
---|
60 | M = E*M; |
---|
61 | B = E*B*E'; |
---|
62 | |
---|
63 | |
---|
64 | if isfield(ELEM,'R2') |
---|
65 | r = ELEM.R2*r; |
---|
66 | B = ELEM.R2*B*ELEM.R2'; |
---|
67 | M = ELEM.R2*M; |
---|
68 | end |
---|
69 | |
---|
70 | if isfield(ELEM,'T2') |
---|
71 | r = r + ELEM.T2'; |
---|
72 | end |
---|
73 | |
---|
74 | case {'StrMPoleSymplectic4Pass', 'StrMPoleSymplectic4RadPass'} |
---|
75 | |
---|
76 | if isfield(ELEM,'T1') |
---|
77 | r = r + ELEM.T1; |
---|
78 | end |
---|
79 | if isfield(ELEM,'R1') |
---|
80 | r = ELEM.R1*r; |
---|
81 | B = ELEM.R1*B*ELEM.R1'; |
---|
82 | M = ELEM.R1*M; |
---|
83 | end |
---|
84 | |
---|
85 | % Body |
---|
86 | [Bbody, Mbody, r] = findthickmpoleraddifm(r,... |
---|
87 | ELEM.PolynomA, ELEM.PolynomB, ELEM.Length, invrho, ... |
---|
88 | ELEM.Energy, MaxOrder,ELEM.NumIntSteps); |
---|
89 | |
---|
90 | |
---|
91 | B = Mbody*B*Mbody'+Bbody; |
---|
92 | M = Mbody*M; |
---|
93 | |
---|
94 | |
---|
95 | if isfield(ELEM,'R2') |
---|
96 | r = ELEM.R2*r; |
---|
97 | B = ELEM.R2*B*ELEM.R2'; |
---|
98 | M = ELEM.R2*M; |
---|
99 | end |
---|
100 | |
---|
101 | if isfield(ELEM,'T2') |
---|
102 | r = r + ELEM.T2; |
---|
103 | end |
---|
104 | |
---|
105 | case 'BendLinearPass' |
---|
106 | % Add fields to element to make it 'BndMPoleSymplectic4Pass |
---|
107 | % compatible and call FINDELEMRADDIFFM recursively |
---|
108 | elem = ELEM; |
---|
109 | elem.PassMethod = 'BndMPoleSymplectic4Pass'; |
---|
110 | elem.PolynomB = [0 0 0]; |
---|
111 | elem.PolynomB = [0 elem.K 0]; |
---|
112 | elem.NumIntSteps = 10; |
---|
113 | elem.MaxOrder = 2; |
---|
114 | [B, M, r] = findelemraddiffm(elem,rin); |
---|
115 | |
---|
116 | case 'IdentityPass' |
---|
117 | % Do nothing : [M, B, r] are the same at the exit |
---|
118 | |
---|
119 | otherwise |
---|
120 | M = findelemm66(ELEM,ELEM.PassMethod,rin); |
---|
121 | r = feval(ELEM.PassMethod,ELEM,rin); |
---|
122 | B = M*B*M'; |
---|
123 | |
---|
124 | end |
---|