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

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

Initial import--MML version from SOLEIL@2013

File size: 7.6 KB
Line 
1function varargout = atsummary
2%ATSUMMARY - Prints out the paramters of the current AT lattice
3%  The parameters that come after the Synchrotron Integrals are
4%  parameters that depend on the Integrals themselves. The equations to
5%  calculate them were taken from [1].
6%
7%  [1] Alexander Wu Chao and Maury Tigner, Handbook of Accelerator Physics
8%  and Engineering (World Scientific, Singapore, 1998), pp. 183-187. (or
9%  187-190 in ed. 2)
10
11%
12%  Written by Eugene Tan
13%  Revised by Laurent S. Nadolski
14
15
16global THERING GLOBVAL
17
18% if exist('sum','var')
19%     clear global sum;
20%     global sum;
21% end
22
23% Structure to store info
24sum.e0 = GLOBVAL.E0*1e-9;
25sum.circumference = findspos(THERING, length(THERING)+1);
26sum.revTime = sum.circumference / 2.99792458e8;
27sum.revFreq = 2.99792458e8 / sum.circumference;
28sum.gamma = sum.e0 / 0.51099906e-3;
29sum.beta = sqrt(1 - 1/sum.gamma);
30[TD sum.tunes sum.chromaticity] = twissring(THERING, 0, 1:length(THERING)+1, 'chrom', 1e-8);
31sum.compactionFactor = mcf(THERING);
32
33% For calculating the synchrotron integrals
34temp  = cat(2,TD.Dispersion);
35D_x   = temp(1,:)';
36D_x_  = temp(2,:)';
37beta  = cat(1, TD.beta);
38alpha = cat(1, TD.alpha);
39gamma = (1 + alpha.^2) ./ beta;
40circ  = TD(length(THERING)+1).SPos;
41
42% Synchrotron integral calculation
43sum.integrals = [0.0 0.0 0.0 0.0 0.0 0.0];
44
45for i = 1:length(THERING),
46    if isfield(THERING{i}, 'BendingAngle') && isfield(THERING{i}, 'EntranceAngle')
47        rho = THERING{i}.Length/THERING{i}.BendingAngle;
48        dispersion = 0.5*(D_x(i)+D_x(i+1));
49        sum.integrals(1) = sum.integrals(1) + dispersion*THERING{i}.Length/rho;
50        sum.integrals(2) = sum.integrals(2) + THERING{i}.Length/(rho^2);
51        sum.integrals(3) = sum.integrals(3) + THERING{i}.Length/(rho^3);
52        % For general wedge magnets
53        sum.integrals(4) = sum.integrals(4) + ...
54            D_x(i)*tan(THERING{i}.EntranceAngle)/rho^2 + ...
55            (1 + 2*rho^2*THERING{i}.PolynomB(2))*(D_x(i)+D_x(i+1))*THERING{i}.Length/(2*rho^3) + ...
56            D_x(i+1)*tan(THERING{i}.ExitAngle)/rho^2;
57        %         sum.integrals(4) = sum.integrals(4) + 2*0.5*(D_x(i)+D_x(i+1))*THERING{i}.Length/rho^3;
58        H1 = beta(i,1)*D_x_(i)*D_x_(i)+2*alpha(i)*D_x(i)*D_x_(i)+gamma(i)*D_x(i)*D_x(i);
59        H0 = beta(i+1,1)*D_x_(i+1)*D_x_(i+1)+2*alpha(i+1)*D_x(i+1)*D_x_(i+1)+gamma(i+1)*D_x(i+1)*D_x(i+1);
60        sum.integrals(5) = sum.integrals(5) + THERING{i}.Length*(H1+H0)*0.5/(rho^3);
61        %         if H1+H0 < 0
62        %             fprintf('%f %i %s\n', H1+H0, i, THERING{i}.FamName)
63        %         end
64        sum.integrals(6) = sum.integrals(6) + ...
65            THERING{i}.PolynomB(2)^2*dispersion^2*THERING{i}.Length;
66    end
67end
68
69% Damping numbers
70% Use Robinson's Theorem
71sum.damping(1) = 1 - sum.integrals(4)/sum.integrals(2);
72sum.damping(2) = 1;
73sum.damping(3) = 2 + sum.integrals(4)/sum.integrals(2);
74
75sum.radiation = 8.846e-5*sum.e0.^4*sum.integrals(2)/(2*pi);
76sum.naturalEnergySpread = sqrt(3.8319e-13*sum.gamma.^2*sum.integrals(3)/(2*sum.integrals(2) + sum.integrals(4)));
77sum.naturalEmittance = 3.8319e-13*(sum.e0*1e3/0.510999).^2*sum.integrals(5)/(sum.damping(1)*sum.integrals(2));
78
79% Damping times
80sum.radiationDamping(1) = 1/(2113.1*sum.e0.^3*sum.integrals(2)*sum.damping(1)/circ);
81sum.radiationDamping(2) = 1/(2113.1*sum.e0.^3*sum.integrals(2)*sum.damping(2)/circ);
82sum.radiationDamping(3) = 1/(2113.1*sum.e0.^3*sum.integrals(2)*sum.damping(3)/circ);
83
84% Slip factor
85sum.etac = sum.gamma^(-2) - sum.compactionFactor;
86
87cavind = findcells(THERING,'HarmNumber');
88if ~isempty(cavind)
89    freq = THERING{cavind(:,1)}.Frequency;
90    v_cav = THERING{cavind(:,1)}.Voltage;
91else
92    % Default
93    freq = 352.202e6;
94    v_cav = 3e6;
95end
96sum.harmon = sum.circumference/(2.99792458e8/freq); % Assuming 499.654MHz RF
97sum.overvoltage = v_cav/(sum.radiation*1e9); % Assuming 3e6 volt cavities.
98% Assuming the harmon and overvoltage above.
99% references:  H. Winick, "Synchrotron Radiation Sources: A Primer",
100% World Scientific Publishing, Singapore, pp92-95. (1995)
101% Wiedemann, pp290,350. Chao, pp189.
102sum.syncphase = pi - asin(1/sum.overvoltage);
103sum.energyacceptance = sqrt(v_cav*sin(sum.syncphase)*2*(sqrt(sum.overvoltage^2-1) - acos(1/sum.overvoltage))/(pi*sum.harmon*abs(sum.etac)*sum.e0*1e9));
104sum.synctune = sqrt((sum.etac*sum.harmon*v_cav*cos(sum.syncphase))/(2*pi*sum.e0*1e9));
105sum.bunchlength = sum.beta*299792458*abs(sum.etac)*sum.naturalEnergySpread/(sum.synctune*sum.revFreq*2*pi);
106
107% optics
108[bx by] = modelbeta;
109[ax ay] = modelalpha;
110[etax etay] = modeleta;
111[etaprimex etaprimey] = modeletaprime;
112
113SeparatorString = '   ******************************************************************\n';
114fprintf('\n');
115fprintf('   *************  Summary for ''%s'' ************\n', GLOBVAL.LatticeFile);
116fprintf('   Energy: \t\t\t% 4.5f [GeV]\n', sum.e0);
117fprintf('   Gamma: \t\t\t% 4.5f \n', sum.gamma);
118fprintf('   Circumference: \t\t% 4.5f [m]\n', sum.circumference);
119fprintf('   Revolution time: \t\t% 4.5f [ns] (%4.5f [MHz]) \n', sum.revTime*1e9,sum.revFreq*1e-6);
120fprintf('   Betatron tune H: \t\t% 4.5f (%4.5f [kHz])\n', sum.tunes(1),sum.tunes(1)/sum.revTime*1e-3);
121fprintf('                 V: \t\t% 4.5f (%4.5f [kHz])\n', sum.tunes(2),sum.tunes(2)/sum.revTime*1e-3);
122fprintf('   Momentum Compaction Factor: \t% 4.5e\n', sum.compactionFactor);
123fprintf('   Chromaticity H: \t\t%+4.5f\n', sum.chromaticity(1));
124fprintf('                V: \t\t%+4.5f\n', sum.chromaticity(2));
125fprintf(SeparatorString);
126fprintf('   Synchrotron Integral 1: \t% 4.5e [m]\n', sum.integrals(1));
127fprintf('                        2: \t% 4.5e [m^-1]\n', sum.integrals(2));
128fprintf('                        3: \t% 4.5e [m^-2]\n', sum.integrals(3));
129fprintf('                        4: \t% 4.5e [m^-1]\n', sum.integrals(4));
130fprintf('                        5: \t% 4.5e [m^-1]\n', sum.integrals(5));
131fprintf('                        6: \t% 4.5e [m^-1]\n', sum.integrals(6));
132fprintf('   Damping Partition H: \t% 4.5f\n', sum.damping(1));
133fprintf('                     V: \t% 4.5f\n', sum.damping(2));
134fprintf('                     E: \t% 4.5f\n', sum.damping(3));
135fprintf('   Radiation Loss: \t\t% 4.5f [keV]\n', sum.radiation*1e6);
136fprintf('   Natural Energy Spread: \t% 4.5e\n', sum.naturalEnergySpread);
137fprintf('   Natural Emittance: \t\t% 4.5e [mrad]\n', sum.naturalEmittance);
138fprintf('   Radiation Damping H: \t% 4.5f [ms]\n', sum.radiationDamping(1)*1e3);
139fprintf('                     V: \t% 4.5f [ms]\n', sum.radiationDamping(2)*1e3);
140fprintf('                     E: \t% 4.5f [ms]\n', sum.radiationDamping(3)*1e3);
141fprintf('   Slip factor : \t\t%4.5e\n', sum.etac);
142fprintf(SeparatorString);
143fprintf('   Assuming cavities Voltage: \t% 4.5f [kV]\n', v_cav/1e3);
144fprintf('                   Frequency: \t%4.5f [MHz]\n', freq/1e6);
145fprintf('             Harmonic Number: \t% 4.5f\n', sum.harmon);
146fprintf('   Overvoltage factor: \t\t% 4.5f\n', sum.overvoltage);
147fprintf('   Synchronous Phase:  \t\t% 4.5f [rad] (%4.5f [deg])\n', sum.syncphase, sum.syncphase*180/pi);
148fprintf('   Linear Energy Acceptance:  \t% 4.5f%%\n', sum.energyacceptance*100);
149fprintf('   Synchrotron Tune:   \t\t% 4.5f (%4.5f kHz or %4.2f turns) \n', sum.synctune, sum.synctune/sum.revTime*1e-3, 1/sum.synctune);
150fprintf('   Bunch Length:       \t\t% 4.5f [mm] (%4.5f ps)\n', sum.bunchlength*1e3, sum.bunchlength/3e8*1e12);
151fprintf(SeparatorString);
152fprintf('   Injection:\n   H: beta=% 4.3f [m] alpha =% 4.1e eta =% 4.3f [m] eta'' =% 4.1e \n', bx(1), ax(1), etax(1), etaprimex(1));
153fprintf('   V: beta=% 4.3f [m] alpha =% 4.1e eta =% 4.3f [m] eta'' =% 4.1e \n', by(1), ay(1), etay(1), etaprimey(1));
154fprintf('   ********** End of Summary for ''%s'' **********\n', GLOBVAL.LatticeFile);
155fprintf('\n');
156
157if nargout > 0
158    varargout{1} = sum;
159end
Note: See TracBrowser for help on using the repository browser.