1 | function [Optics] = gettwiss(THERING, DP) |
---|
2 | %GETWISS - Calculate the twiss parameters |
---|
3 | % [Optics] = gettwiss(THERING, DP) |
---|
4 | % |
---|
5 | % GETTWISS calls LINOPT2 for entire ring and returns Twiss parameters |
---|
6 | % See LinOpt2 for description of nomenclarture and mathematics |
---|
7 | % |
---|
8 | % Phase calculation from transfer matrices from '0' to location '1' (AIP 184 p. 50) |
---|
9 | % Only need initial alfa, beta |
---|
10 | % M=M44 |
---|
11 | % M11: sqrt(beta1/beta0)*(cos(phi) + alfa0*sin(phi)) |
---|
12 | % M12: sqrt(beta0*beta1)*sin(phi) |
---|
13 | % M21: (1/sqrt(beta0*beta1))*[(alfa0-alfa1)*cos(phi)-(1+alfa0*alfa1)*sin(phi)) |
---|
14 | % M22: sqrt(beta0/beta1)*(cos(phi)-alfa1*sin(phi)) |
---|
15 | % phi=atan2(M12,beta0*M11-alfa0*M12) |
---|
16 | % |
---|
17 | % Written by Jeff Corbett |
---|
18 | |
---|
19 | |
---|
20 | if nargin < 1 |
---|
21 | global THERING |
---|
22 | end |
---|
23 | if nargin < 2 |
---|
24 | DP = 1e-8; |
---|
25 | end |
---|
26 | |
---|
27 | |
---|
28 | %load linear optics structure for entire ring |
---|
29 | %disp(' Computing Coupled Lattice Parameters ...'); |
---|
30 | LinData = linopt2(THERING,DP,1:length(THERING)+1); |
---|
31 | |
---|
32 | %compute fractional tune |
---|
33 | nux=acos(trace(LinData(1).A/2))/(2*pi); |
---|
34 | nuy=acos(trace(LinData(1).B/2))/(2*pi); |
---|
35 | |
---|
36 | %pre-define arrays |
---|
37 | NR=length(THERING)+1; |
---|
38 | name=cell(NR,1); %initialize cell for names |
---|
39 | s=zeros(NR,1); |
---|
40 | len=s; |
---|
41 | betax=s; betay=s; |
---|
42 | alfax=s; alfay=s; |
---|
43 | gammax=s; gammay=s; |
---|
44 | etax=s; etay=s; |
---|
45 | etapx=s; etapy=s; |
---|
46 | phix=s; phiy=s; |
---|
47 | curlhx=s; curlhy=s; |
---|
48 | ch1=s; ch2=s; ch3=s; |
---|
49 | |
---|
50 | %compute optics for all elements |
---|
51 | for ii=1:NR |
---|
52 | |
---|
53 | %load position |
---|
54 | s(ii)=LinData(ii).SPos(1); |
---|
55 | |
---|
56 | %horizontal Twiss parameters |
---|
57 | m22=LinData(ii).A; |
---|
58 | a=m22(1,1); b=m22(1,2); c=m22(2,1); d=m22(2,2); |
---|
59 | betax(ii)=b/sin(2*pi*nux); |
---|
60 | alfax(ii)=(a-d)/(2*sin(2*pi*nux)); |
---|
61 | gammax(ii)=-c/sin(2*pi*nux); |
---|
62 | |
---|
63 | %vertical Twiss parameters |
---|
64 | m22=LinData(ii).B; |
---|
65 | a=m22(1,1); b=m22(1,2); c=m22(2,1); d=m22(2,2); |
---|
66 | betay(ii)=b/sin(2*pi*nuy); |
---|
67 | alfay(ii)=(a-d)/(2*sin(2*pi*nuy)); |
---|
68 | gammay(ii)=-c/sin(2*pi*nuy); |
---|
69 | |
---|
70 | %horizontal phase |
---|
71 | num=LinData(ii).M44(1,2); |
---|
72 | den=LinData(1).beta(1)*LinData(ii).M44(1,1)-LinData(1).alfa(1)*num; |
---|
73 | phix(ii)=atan2(num,den); |
---|
74 | |
---|
75 | %vertical phase |
---|
76 | num=LinData(ii).M44(3,4); |
---|
77 | den=LinData(1).beta(2)*LinData(ii).M44(3,3)-LinData(1).alfa(2)*num; |
---|
78 | phiy(ii)=atan2(num,den); |
---|
79 | |
---|
80 | %load element names |
---|
81 | if ii<NR |
---|
82 | if isfield(THERING{ii},'Name') |
---|
83 | name{ii}=THERING{ii}.Name; |
---|
84 | else |
---|
85 | name{ii}=THERING{ii}.FamName; |
---|
86 | end |
---|
87 | |
---|
88 | %load element lengths |
---|
89 | len(ii)=THERING{ii}.Length; |
---|
90 | end |
---|
91 | end |
---|
92 | |
---|
93 | if ii==NR |
---|
94 | name{NR}='End'; %last element has name 'End' and zero length |
---|
95 | len(NR)=0; %THERING only has NR-1 elements |
---|
96 | end |
---|
97 | |
---|
98 | %compute dispersion, derivative |
---|
99 | %disp(' Computing Dispersion ...'); |
---|
100 | dp=1e-6; |
---|
101 | orb4=findorbit4(THERING,dp,1:NR); |
---|
102 | etax =orb4(1,:)'/dp; |
---|
103 | etapx=orb4(2,:)'/dp; |
---|
104 | etay =orb4(3,:)'/dp; |
---|
105 | etapy=orb4(4,:)'/dp; |
---|
106 | |
---|
107 | %unwrap phase |
---|
108 | phix=unwrap(phix)/(2*pi); |
---|
109 | phiy=unwrap(phiy)/(2*pi); |
---|
110 | |
---|
111 | %compute integer tunes |
---|
112 | qx=round(phix(NR)); |
---|
113 | if phix(NR)-qx <=0 |
---|
114 | qx=qx-1; % Below half integer |
---|
115 | end |
---|
116 | qx=qx+nux; |
---|
117 | qy=round(phiy(NR)); |
---|
118 | if phiy(NR)-qy <=0 |
---|
119 | qy=qy-1; % Below half integer |
---|
120 | end |
---|
121 | qy=qy+nuy; |
---|
122 | |
---|
123 | %compute curly-H |
---|
124 | for ii=1:NR; |
---|
125 | %horizontal |
---|
126 | ch1(ii)=gammax(ii)*etax(ii)*etax(ii); |
---|
127 | ch2(ii)=2*alfax(ii)*etax(ii)*etapx(ii); |
---|
128 | ch3(ii)=betax(ii)*etapx(ii)*etapx(ii); |
---|
129 | curlhx(ii)= ch1(ii)+ch2(ii)+ch3(ii); |
---|
130 | %vertical |
---|
131 | ch1(ii)=gammay(ii)*etay(ii)*etay(ii); |
---|
132 | ch2(ii)=2*alfay(ii)*etay(ii)*etapy(ii); |
---|
133 | ch3(ii)=betay(ii)*etapy(ii)*etapy(ii); |
---|
134 | curlhy(ii)= ch1(ii)+ch2(ii)+ch3(ii); |
---|
135 | end |
---|
136 | |
---|
137 | %load output |
---|
138 | Optics.name =char(name); |
---|
139 | Optics.len =len; |
---|
140 | Optics.s =s; |
---|
141 | Optics.betax =betax; |
---|
142 | Optics.alfax =alfax; |
---|
143 | Optics.gammax=gammax; |
---|
144 | Optics.phix =phix; |
---|
145 | %Optics.qx =qx; |
---|
146 | %Optics.nux =nux; |
---|
147 | Optics.etax =etax; |
---|
148 | Optics.etapx =etapx; |
---|
149 | Optics.curlhx=curlhx; |
---|
150 | %load transport matrices 'A' |
---|
151 | for ii=1:NR |
---|
152 | Optics.r11x(ii,1)=LinData(ii).M44(1,1); |
---|
153 | Optics.r12x(ii,1)=LinData(ii).M44(1,2); |
---|
154 | Optics.r21x(ii,1)=LinData(ii).M44(2,1); |
---|
155 | Optics.r22x(ii,1)=LinData(ii).M44(2,2); |
---|
156 | end |
---|
157 | |
---|
158 | Optics.betay =betay; |
---|
159 | Optics.alfay =alfay; |
---|
160 | Optics.gammay=gammay; |
---|
161 | Optics.phiy =phiy; |
---|
162 | %Optics.qy =qy; |
---|
163 | %Optics.nuy =nuy; |
---|
164 | Optics.etay =etay; |
---|
165 | Optics.etapy =etapy; |
---|
166 | Optics.curlhy=curlhy; |
---|
167 | %load transport matrices 'B' |
---|
168 | for ii=1:NR |
---|
169 | Optics.r11y(ii,1)=LinData(ii).M44(3,3); |
---|
170 | Optics.r12y(ii,1)=LinData(ii).M44(3,4); |
---|
171 | Optics.r21y(ii,1)=LinData(ii).M44(4,3); |
---|
172 | Optics.r22y(ii,1)=LinData(ii).M44(4,4); |
---|
173 | end |
---|
174 | |
---|
175 | % plot(s,phix); hold on; plot(s,phiy,'r'); |
---|
176 | % figure; |
---|
177 | % ip=1:round(NR/4); |
---|
178 | % plot(s(ip),betax(ip)); hold on; plot(s(ip),betay(ip),'r'); plot(s(ip),10*Optics.etax(ip),'k'); |
---|
179 | % figure |
---|
180 | % plot(s(ip),curlhx(ip)); |
---|
181 | |
---|
182 | %disp([' Horizontal Tune: ', num2str(qx,'%6.3f')]); |
---|
183 | %disp([' Vertical Tune: ', num2str(qy,'%6.3f')]); |
---|