source: MML/trunk/at/atphysics/findelemraddiffm.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.3 KB
Line 
1function [B, M, r] = findelemraddiffm(ELEM,rin, varargin);
2%FINDELEMRADDIFFM
3
4MaxOrder = 2;
5
6B = zeros(6);
7M = eye(6);
8r = rin;
9
10switch 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       
124end
Note: See TracBrowser for help on using the repository browser.