source: MML/trunk/machine/SOLEIL/StorageRing/insertions/idCreateModelOrbDistMatr.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 
1%function outM = idCreateModelOrbDistMatr(x_or_z, ModelData, indUpstrBPM, sectLenBwBPMs, idCenPos, idLen, idKickOfst)
2function [outM, outR0] = idCreateModelOrbDistMatr(x_or_z, ModelData, GeomParUnd)
3
4% Creates orbit distortion matrix to simulate effect of an ID on e-beam
5% transverse positions along the ring
6
7%indDownstrBPM = GeomParUnd.indUpstrBPM + 1; % To precise this
8%if indDownstrBPM == 121
9%    indDownstrBPM = 1;
10%end
11
12ringCircum = ModelData.circ; %354; % [m]
13alpMomCompact = ModelData.alp1; %0.0004 @Soleil
14
15%numBPMsToSkip = length(arIndsBPMsToSkip);
16
17%[Btx, Btz] = modelbeta(strBPM);
18%[Alpx, Alpz] = modeltwiss('alpha', strBPM);
19%[Etax, Etaz] = modeldisp(strBPM); % Ask Laurent or Pascale
20%[Phx, Phz] = modelphase(strBPM);
21%Nuxz = modeltune;
22
23Bt = ModelData.Btx; Alp = ModelData.Alpx; Eta = ModelData.Etax; Ph = ModelData.Phx; Nu = ModelData.Nuxz(1);
24if strcmp(x_or_z, 'z') ~= 0
25        Bt = ModelData.Btz; Alp = ModelData.Alpz; Eta = ModelData.Etaz; Ph = ModelData.Phz; Nu = ModelData.Nuxz(2);
26end
27
28numBPMsAr = size(Bt);
29numBPMs = numBPMsAr(1);
30
31indDownstrBPM = GeomParUnd.indUpstrBPM + 1; % To precise this
32if indDownstrBPM > numBPMs
33    indDownstrBPM = 1;
34end
35
36%distUpstrBPM_Kick1 = GeomParUnd.idCenPos - 0.5*GeomParUnd.sectLenBwBPMs - 0.5*GeomParUnd.idLen + GeomParUnd.idKickOfst;
37%distUpstrBPM_Kick2 = GeomParUnd.idCenPos - 0.5*GeomParUnd.sectLenBwBPMs + 0.5*GeomParUnd.idLen - GeomParUnd.idKickOfst;
38%distUpstrBPM_Kick0 = GeomParUnd.idCenPos;
39% modifié le 24/10/08 par Pascale et Fabrice avec accord Oleg
40distUpstrBPM_Kick1 = GeomParUnd.idCenPos + 0.5*GeomParUnd.sectLenBwBPMs - 0.5*GeomParUnd.idLen + GeomParUnd.idKickOfst;
41distUpstrBPM_Kick2 = GeomParUnd.idCenPos + 0.5*GeomParUnd.sectLenBwBPMs + 0.5*GeomParUnd.idLen - GeomParUnd.idKickOfst;
42distUpstrBPM_Kick0 = GeomParUnd.idCenPos + 0.5*GeomParUnd.sectLenBwBPMs;
43
44btUpstr = Bt(GeomParUnd.indUpstrBPM);
45alpUpstr = Alp(GeomParUnd.indUpstrBPM);
46etaUpstr = Eta(GeomParUnd.indUpstrBPM);
47etaDownstr = Eta(indDownstrBPM);
48phUpstr = Ph(GeomParUnd.indUpstrBPM);
49%phDownstr = Ph(indDownstrBPM);
50
51gamUpstr = (1 + alpUpstr*alpUpstr)/btUpstr;
52twoAlpUpstr = 2*alpUpstr;
53btKick1 = btUpstr - distUpstrBPM_Kick1*twoAlpUpstr + distUpstrBPM_Kick1*distUpstrBPM_Kick1*gamUpstr;
54btKick2 = btUpstr - distUpstrBPM_Kick2*twoAlpUpstr + distUpstrBPM_Kick2*distUpstrBPM_Kick2*gamUpstr;
55btKick0 = btUpstr - distUpstrBPM_Kick0*twoAlpUpstr + distUpstrBPM_Kick0*distUpstrBPM_Kick0*gamUpstr;
56
57etaDifBwBPMs = etaDownstr - etaUpstr;
58etaKick1 = etaUpstr + (distUpstrBPM_Kick1/GeomParUnd.sectLenBwBPMs)*etaDifBwBPMs; % Ask Laurent or Pascale
59etaKick2 = etaUpstr + (distUpstrBPM_Kick2/GeomParUnd.sectLenBwBPMs)*etaDifBwBPMs;
60etaKick0 = etaUpstr + (distUpstrBPM_Kick0/GeomParUnd.sectLenBwBPMs)*etaDifBwBPMs;
61
62%phDifBwBPMs = phDownstr - phUpstr;
63%phKick1 = phUpstr + (distUpstrBPM_Kick1/GeomParUnd.sectLenBwBPMs)*phDifBwBPMs; % Ask Laurent or Pascale
64%phKick2 = phUpstr + (distUpstrBPM_Kick2/GeomParUnd.sectLenBwBPMs)*phDifBwBPMs;
65atan_alpUpstr = atan(alpUpstr);
66phKick1 = phUpstr + atan_alpUpstr + atan(gamUpstr*distUpstrBPM_Kick1 - alpUpstr);
67phKick2 = phUpstr + atan_alpUpstr + atan(gamUpstr*distUpstrBPM_Kick2 - alpUpstr);
68phKick0 = phUpstr + atan_alpUpstr + atan(gamUpstr*distUpstrBPM_Kick0 - alpUpstr);
69
70invTwoSinPiNu = 1./(2.*sin(pi*Nu));
71invAlpCircum = 1./(alpMomCompact*ringCircum);
72
73%numBPMsAr = size(Bt);
74%numBPMs = numBPMsAr(1);
75%outM = zeros(numBPMs - numBPMsToSkip, 2);
76
77outM = zeros(numBPMs, 2); %Main matrix for 2 virual kicks located (roughly) at undulator extremities and simulating 1st order effects
78outR0 = zeros(numBPMs, 1); %Vector for 1 virtual kick located in the middle of the undulator and simulating 2nd order effect
79
80%countBPM = 1;
81for i = 1:numBPMs
82    %if(numBPMsToSkip > 0)
83    %    skipThisBPM = 0;
84    %    for j = 1:numBPMsToSkip
85    %        if(i == arIndsBPMsToSkip(j))
86    %            skipThisBPM = 1;
87    %            break;
88    %           end
89    %    end
90    %    if(skipThisBPM ~= 0)
91    %        continue;
92    %    end
93    %end
94    %outM(countBPM, 1) = invTwoSinPiNu*sqrt(Bt(i)*btKick1)*cos(abs(Ph(i) - phKick1) - pi*Nu) + invAlpCircum*Eta(i)*etaKick1;
95    %outM(countBPM, 2) = invTwoSinPiNu*sqrt(Bt(i)*btKick2)*cos(abs(Ph(i) - phKick2) - pi*Nu) + invAlpCircum*Eta(i)*etaKick2;
96    %countBPM = countBPM + 1;
97   
98        outM(i, 1) = invTwoSinPiNu*sqrt(Bt(i)*btKick1)*cos(abs(Ph(i) - phKick1) - pi*Nu) + invAlpCircum*Eta(i)*etaKick1;
99        outM(i, 2) = invTwoSinPiNu*sqrt(Bt(i)*btKick2)*cos(abs(Ph(i) - phKick2) - pi*Nu) + invAlpCircum*Eta(i)*etaKick2;
100        outR0(i, 1) = invTwoSinPiNu*sqrt(Bt(i)*btKick0)*cos(abs(Ph(i) - phKick0) - pi*Nu) + invAlpCircum*Eta(i)*etaKick0;
101end
Note: See TracBrowser for help on using the repository browser.