source: MML/trunk/mml/at/fittunedisp2.m

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

Initial import--MML version from SOLEIL@2013

File size: 5.7 KB
Line 
1function varargout =  fittunedisp2(newtunes_disp, quadfam1, quadfam2, quadfam3, dispind, varargin)
2%FITTUNEDISP2 - Fits the linear tunes and the dispersion of model using 3 quadrupole families. 
3%  fittune2([nux nuy disp], QUADFAMILY1, QUADFAMILY2, QUADFAMILY3, DISPIND)
4%
5%  INPUTS
6%  1. nux and nuy - the tunes (indlucing the integer parts)
7%     disp        - dispersion at the position (AT index) given by DISPIND
8%  2. QUADFAMILY1 - Quadrupole family #1
9%  3. QUADFAMILY2 - Quadrupole family #2
10%  4. QUADFAMILY3 - Quadrupole family #3
11%  5. DISPIND - AT index to measure dispersion
12%
13%  ALGORITHM
14%  Iteratively calculate the required quadrupole strengths to fit the new tunes and dispersion.
15%
16%  Written by Eugene Tan
17
18
19% Must declare THERING as global in order for the function to modify quadrupole values
20global THERING
21MAXDEPTH = 5;
22threshold = 1e-9;
23if nargin > 5 % use externally supplied step size for quadrupole K-values
24    delta = varargin{1};
25else
26    delta = 1e-6; % default step size for quadrupole K-values
27end
28if nargin > 6
29    recursion_depth = varargin{2};
30else
31    recursion_depth = 0;
32end
33try
34    THERING{dispind};
35catch
36    fprintf('Invalid position/index to measure dispersion %d\n',dispind);
37end
38
39% find indexes of the 2 quadrupole families use for fitting
40Q1I = findcells(THERING,'FamName',quadfam1);
41if isempty(Q1I); fprintf('Cannot find quadfamily: %s\n',quadfam1); return; end;
42Q2I = findcells(THERING,'FamName',quadfam2);
43if isempty(Q2I); fprintf('Cannot find quadfamily: %s\n',quadfam2); return; end;
44Q3I = findcells(THERING,'FamName',quadfam3);
45if isempty(Q3I); fprintf('Cannot find quadfamily: %s\n',quadfam3); return; end;
46
47
48InitialK1 = getcellstruct(THERING,'K',Q1I);
49InitialK2 = getcellstruct(THERING,'K',Q2I);
50InitialK3 = getcellstruct(THERING,'K',Q3I);
51InitialPolB1 = getcellstruct(THERING,'PolynomB',Q1I,2);
52InitialPolB2 = getcellstruct(THERING,'PolynomB',Q2I,2);
53InitialPolB3 = getcellstruct(THERING,'PolynomB',Q3I,2);
54
55% Compute initial tunes before fitting
56% [ LD, InitialTunes] = linopt(THERING,0);
57mach = machine_at;
58TempTunes = [mach.nux(end);mach.nuy(end)];
59TempDisp  = mach.etax(1);
60TempK1 = InitialK1;
61TempK2 = InitialK2;
62TempK3 = InitialK3;
63TempPolB1 = InitialPolB1;
64TempPolB2 = InitialPolB2;
65TempPolB3 = InitialPolB3;
66
67if recursion_depth == 0
68    fprintf('\n==== Fitting Tunes and Dispersion ====\n');
69    fprintf('Desired Tunes and Dispersion: %14.10f (H) %14.10f (V) %14.10f (D)\n',...
70        newtunes_disp);
71    fprintf('Initial Tunes and Dispersion: %14.10f (H) %14.10f (V) %14.10f (D)\n',...
72        TempTunes(1),TempTunes(2),TempDisp);
73    fprintf('Inital K values: %9.7f (%s) %9.7f (%s) %9.7f (%s)\n',...
74        InitialK1(1), quadfam1, InitialK2(1), quadfam2, InitialK3(1), quadfam3);
75end
76
77% Take Derivative
78THERING = setcellstruct(THERING,'K',Q1I,TempK1+delta);
79THERING = setcellstruct(THERING,'PolynomB',Q1I,TempPolB1+delta,2);
80mach = machine_at;
81Tunes_dK1 = [mach.nux(end);mach.nuy(end)];
82Disp_dK1 = mach.etax(1);
83THERING = setcellstruct(THERING,'K',Q1I,TempK1);
84THERING = setcellstruct(THERING,'PolynomB',Q1I,TempPolB1,2);
85
86THERING = setcellstruct(THERING,'K',Q2I,TempK2+delta);
87THERING = setcellstruct(THERING,'PolynomB',Q2I,TempPolB2+delta,2);
88mach = machine_at;
89Tunes_dK2 = [mach.nux(end);mach.nuy(end)];
90Disp_dK2 = mach.etax(1);
91THERING = setcellstruct(THERING,'K',Q2I,TempK2);
92THERING = setcellstruct(THERING,'PolynomB',Q2I,TempPolB2,2);
93
94THERING = setcellstruct(THERING,'K',Q3I,TempK3+delta);
95THERING = setcellstruct(THERING,'PolynomB',Q3I,TempPolB3+delta,2);
96mach = machine_at;
97Tunes_dK3 = [mach.nux(end);mach.nuy(end)];
98Disp_dK3 = mach.etax(1);
99THERING = setcellstruct(THERING,'K',Q3I,TempK3);
100THERING = setcellstruct(THERING,'PolynomB',Q3I,TempPolB3,2);
101
102
103%Construct the Jacobian
104change_dK = zeros(3);
105tempTunesDisp = zeros(3);
106
107change_dK(:,1) = [Tunes_dK1(1); Tunes_dK1(2); Disp_dK1];
108change_dK(:,2) = [Tunes_dK2(1); Tunes_dK2(2); Disp_dK2];
109change_dK(:,3) = [Tunes_dK3(1); Tunes_dK3(2); Disp_dK3];
110tempTunesDisp(:,1) = [TempTunes(1); TempTunes(2); TempDisp];
111tempTunesDisp(:,2) = [TempTunes(1); TempTunes(2); TempDisp];
112tempTunesDisp(:,3) = [TempTunes(1); TempTunes(2); TempDisp];
113
114
115J = (change_dK - tempTunesDisp)/delta;
116Jinv = inv(J);
117
118dnu = (newtunes_disp(:) - tempTunesDisp(:,1));
119dK = Jinv*dnu;
120
121
122TempK1 = TempK1+dK(1);
123TempK2 = TempK2+dK(2);
124TempK3 = TempK3+dK(3);
125TempPolB1 = TempPolB1+dK(1);
126TempPolB2 = TempPolB2+dK(2);
127TempPolB3 = TempPolB3+dK(3);
128
129
130THERING = setcellstruct(THERING,'K',Q1I,TempK1);
131THERING = setcellstruct(THERING,'PolynomB',Q1I,TempPolB1,2);
132THERING = setcellstruct(THERING,'K',Q2I,TempK2);
133THERING = setcellstruct(THERING,'PolynomB',Q2I,TempPolB2,2);
134THERING = setcellstruct(THERING,'K',Q3I,TempK3);
135THERING = setcellstruct(THERING,'PolynomB',Q3I,TempPolB3,2);
136
137mach = machine_at;
138newTunes = [mach.nux(end);mach.nuy(end)];
139newDisp = mach.etax(1);
140if sqrt((newtunes_disp - [newTunes(:); newDisp]').^2)/3 > threshold | recursion_depth > MAXDEPTH
141%     disp('looping again')
142    [Kvals newTunes] = fittunedisp2(newtunes_disp,quadfam1,quadfam2,quadfam3,dispind,delta,recursion_depth+1);
143else
144    fprintf('Finished calculations. Recursion depth %d\n',recursion_depth);
145    Kvals = [TempK1(1) TempK2(1) TempK3(1)];
146    newTunes = [mach.nux(end) mach.nuy(end) mach.etax(1)];
147end
148
149if recursion_depth == 0
150    fprintf('Final K values:  %9.7f (%s) %9.7f (%s) %9.7f (%s)\n',...
151        Kvals(1), quadfam1, Kvals(2), quadfam2, Kvals(3), quadfam3);
152    fprintf('Change        :  %9.7f (%s) %9.7f (%s) %9.7f (%s)\n',...
153        1-(InitialK1(1)/Kvals(1)), quadfam1, 1-(InitialK2(1)/Kvals(2)), quadfam2, 1-(InitialK3(1)/Kvals(3)), quadfam3);
154    fprintf('Final Tunes and Dispersion:   %14.10f (H) %14.10f (V) %14.10f (D)\n',...
155        newTunes(1), newTunes(2), newTunes(3));
156end
157
158varargout{1} = Kvals;
159varargout{2} = newTunes;
Note: See TracBrowser for help on using the repository browser.