source: MML/trunk/mml/at/gettwiss.m @ 4

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

Initial import--MML version from SOLEIL@2013

File size: 4.5 KB
Line 
1function [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
20if nargin < 1
21    global THERING
22end
23if nargin < 2
24    DP = 1e-8;
25end
26
27
28%load linear optics structure for entire ring
29%disp('   Computing Coupled Lattice Parameters ...');
30LinData = linopt2(THERING,DP,1:length(THERING)+1);
31
32%compute fractional tune
33nux=acos(trace(LinData(1).A/2))/(2*pi);
34nuy=acos(trace(LinData(1).B/2))/(2*pi);
35
36%pre-define arrays
37NR=length(THERING)+1;
38name=cell(NR,1);        %initialize cell for names
39s=zeros(NR,1);
40len=s;
41betax=s;   betay=s;
42alfax=s;   alfay=s;
43gammax=s;  gammay=s;
44etax=s;    etay=s;
45etapx=s;   etapy=s;
46phix=s;    phiy=s;
47curlhx=s;  curlhy=s;
48ch1=s; ch2=s; ch3=s;
49
50%compute optics for all elements
51for 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
91end
92
93if ii==NR
94    name{NR}='End';       %last element has name 'End' and zero length
95    len(NR)=0;            %THERING only has NR-1 elements
96end
97
98%compute dispersion, derivative
99%disp('   Computing Dispersion ...');
100dp=1e-6;
101orb4=findorbit4(THERING,dp,1:NR);
102etax =orb4(1,:)'/dp;
103etapx=orb4(2,:)'/dp;
104etay =orb4(3,:)'/dp;
105etapy=orb4(4,:)'/dp;
106
107%unwrap phase
108phix=unwrap(phix)/(2*pi);
109phiy=unwrap(phiy)/(2*pi);
110
111%compute integer tunes
112qx=round(phix(NR));
113if phix(NR)-qx <=0
114    qx=qx-1;   % Below half integer
115end
116qx=qx+nux;
117qy=round(phiy(NR));
118if phiy(NR)-qy <=0
119    qy=qy-1;   % Below half integer
120end
121qy=qy+nuy;
122
123%compute curly-H
124for 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);
135end
136
137%load output
138Optics.name  =char(name);
139Optics.len   =len;
140Optics.s     =s;
141Optics.betax =betax;
142Optics.alfax =alfax;
143Optics.gammax=gammax;
144Optics.phix  =phix;
145%Optics.qx    =qx;
146%Optics.nux   =nux;
147Optics.etax  =etax;
148Optics.etapx =etapx;
149Optics.curlhx=curlhx;
150%load transport matrices 'A'
151for 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);
156end
157
158Optics.betay =betay;
159Optics.alfay =alfay;
160Optics.gammay=gammay;
161Optics.phiy  =phiy;
162%Optics.qy    =qy;
163%Optics.nuy   =nuy;
164Optics.etay  =etay;
165Optics.etapy =etapy;
166Optics.curlhy=curlhy;
167%load transport matrices 'B'
168for 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);
173end
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')]);
Note: See TracBrowser for help on using the repository browser.