PageRenderTime 28ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/src/utils/get_DR_quads.m

http://slac-lucretia.googlecode.com/
MATLAB | 326 lines | 183 code | 35 blank | 108 comment | 20 complexity | 42f359c5119e701467ff82d369d9cda6 MD5 | raw file
Possible License(s): BSD-2-Clause
  1. function varargout=get_DR_quads(opCode,energy,varargin)
  2. %
  3. % [Iquad,KL]=get_DR_quads(1,energy,Imain,Itrim,fflag);
  4. %
  5. % Compute "effective" main coil currents and normalized integrated strengths
  6. % (GL/brho) for individual DR quadrupoles from main coil currents, trim coil
  7. % currents, and beam energy
  8. %
  9. % Iquad=get_DR_quads(2,energy,KL,fflag);
  10. %
  11. % Compute main coil currents for DR quadrupole families from normalized
  12. % integrated strengths (GL/brho) and beam energy
  13. %
  14. % INPUTs (opCode=1):
  15. %
  16. % opCode = 1 (I to KL conversion)
  17. % energy = DR energy (GeV) [scalar]
  18. % Imain = DR quadrupole family main coil currents (amps) [26 element array]
  19. % Itrim = DR quadrupole trim coil currents (amps) [100 element array]
  20. % fflag = (optional) if present and nonzero, fudge factors will be used
  21. %
  22. % INPUTs (opCode=2):
  23. %
  24. % opCode = 2 (KL to I conversion)
  25. % energy = DR energy (GeV) [scalar]
  26. % KL = normalized integrated strengths (1/m; positive means "QF")
  27. % [26 element array]
  28. % fflag = (optional) if present and nonzero, fudge factors will be used
  29. %
  30. % The order of quadrupole families in the Imain or KL arrays must be:
  31. %
  32. % QF1R,QF2R,
  33. % QM1R,QM2R,QM3R,QM4R,QM5R,
  34. % QM6R,QM7R,QM8R,QM9R,QM10R,
  35. % QM11R,QM12R,QM13R,QM14R,QM15R,
  36. % QM16R,QM17R,QM18R,QM19R,QM20R,
  37. % QM21R,QM22R,QM23R,QM7AR
  38. %
  39. % The order of quadrupole trims in the Itrim array must be:
  40. %
  41. % QF1R.1:28,QF2R.1:26,
  42. % QM1R.1:2,QM2R.1:2,QM3R.1:2,QM4R.1:2,QM5R.1:2,
  43. % QM6R.1:2,QM7R.1:2,QM8R.1:2,QM9R.1:2,QM10R.1:2,
  44. % QM11R.1:2,QM12R.1:2,QM13R.1:2,QM14R.1:2,QM15R.1:2,
  45. % QM16R.1:2,QM17R.1:2,QM18R.1:2,QM19R.1:2,QM20R.1:2,
  46. % QM21R.1:2,QM22R.1:2,QM23R.1:2
  47. %
  48. % OUTPUTs (opCode=1):
  49. %
  50. % Iquad = effective DR quadrupole currents (amps) [100 element array,
  51. % same order as Itrim]
  52. % KL = normalized integrated strengths (1/m; positive means "QF")
  53. % [26 element array]
  54. %
  55. % OUTPUT (opCode=2):
  56. %
  57. % Iquad = DR quadrupole family currents (amps) [26 element array]
  58. % ==============================================================================
  59. % 26-FEB-2009, M. Woodley
  60. % Correct Nm(=49) and Nt(=20) for QEA quads per IHEP drawing
  61. % 22-FEB-2009, M. Woodley
  62. % Add support for QM7AR and QEAs; do either I-to-KL and KL-to-I conversion
  63. % 22-MAY-2007, M. Woodley
  64. % Data for IHEP "QEA" quads (QM12R, QM13R, QM14R) from control system file
  65. % 06-FEB-2007, M. Woodley
  66. % Tokin 3581 quads replaced with IHEP "QEA" quads (QM12R, QM13R, QM14R)
  67. % ==============================================================================
  68. Nmain=26;
  69. Ntrim=100;
  70. % check input args
  71. if (~exist('opCode','var'))
  72. error('opCode argument not supplied')
  73. end
  74. if (~exist('energy','var'))
  75. error('energy argument not supplied')
  76. else
  77. if (energy<=0)
  78. error('Bad energy value')
  79. end
  80. end
  81. if (opCode==1)
  82. if (nargin<4)
  83. error('At least 4 input arguments required for opCode=1')
  84. end
  85. Imain=varargin{1};
  86. if (length(Imain)~=Nmain)
  87. error('Incorrect Imain length')
  88. end
  89. Itrim=varargin{2};
  90. if (length(Itrim)~=Ntrim)
  91. error('Incorrect Itrim length')
  92. end
  93. if (nargin>4)
  94. fflag=varargin{3};
  95. else
  96. fflag=0;
  97. end
  98. elseif (opCode==2)
  99. if (nargin<3)
  100. error('At least 3 input arguments required for opCode=2')
  101. end
  102. KL=varargin{1};
  103. if (length(KL)~=Nmain)
  104. error('Incorrect KL length')
  105. end
  106. if (nargin>3)
  107. fflag=varargin{2};
  108. else
  109. fflag=0;
  110. end
  111. else
  112. error('Invalid opCode')
  113. end
  114. fudge=(fflag~=0);
  115. % ==============================================================================
  116. % DR QUAD MAGNET DATA
  117. % ==============================================================================
  118. % there are 11 DR quadrupole types:
  119. % 1 = Hitachi type 1
  120. % 2 = Hitachi type 2
  121. % 3 = Hitachi type 3
  122. % 4 = Hitachi type 4
  123. % 5 = Tokin type 3325 ("18 cm")
  124. % 6 = Tokin type 3582 ("18 cm (42p)")
  125. % 7 = Tokin type 3393 ("6 cm")
  126. % 8 = Tokin type 3581 ("6 cm")
  127. % 9 = QEA-13 (IHEP type D32L180 # 13) ... in series with QEA-14
  128. % 10 = QEA-19 (IHEP type D32L180 # 19) ... in series with QEA-17
  129. % 11 = QEA-21 (IHEP type D32L180 # 21) ... in series with QEA-18
  130. % magnet data (I is amp, G is T/m, leff is m)
  131. % (from: ATF$MAG:MAG_KI_Q_HITACHI_1.FOR
  132. % ATF$MAG:MAG_KI_Q_HITACHI_2.FOR
  133. % ATF$MAG:MAG_KI_Q_HITACHI_3.FOR
  134. % ATF$MAG:MAG_KI_Q_HITACHI_4.FOR
  135. % ATF$MAG:MAG_KI_Q_TOKIN_3325.FOR
  136. % ATF$MAG:MAG_KI_Q_TOKIN_3582.FOR
  137. % ATF$MAG:MAG_KI_Q_TOKIN_3393.FOR
  138. % ATF$MAG:MAG_KI_Q_TOKIN_3581.FOR
  139. % mainamp50AmaxAbs.txt (M.Masuzawa))
  140. Nmms=[11,11,11,11,11,11,8,11,16,16,16];
  141. qI=[ ...
  142. 0.0, 0.0, 0.0, 0.0, 0.00, 0.0, 0.0, 0.0,0.0000000,0.0000000,0.0000000; ...
  143. 14.2, 10.2, 20.4, 20.2,100.00, 50.0, 20.0, 50.0,3.3333001,3.3333001,3.3333001; ...
  144. 28.6, 20.2, 40.0, 40.2,200.00,100.0, 40.0, 80.0,6.6666999,6.6666999,6.6666999; ...
  145. 42.2, 30.2, 60.0, 60.4,300.00,150.0, 60.0,100.0,10.000000,10.000000,10.000000; ...
  146. 56.0, 40.0, 80.2, 80.4,400.00,170.0, 80.0,130.0,13.333000,13.333000,13.333000; ...
  147. 70.2, 50.0,100.8,100.0,417.24,190.0,100.0,150.0,16.667000,16.667000,16.667000; ...
  148. 84.2, 60.2,120.2,120.2,434.48,210.0,120.0,170.0,20.000000,20.000000,20.000000; ...
  149. 98.2, 70.2,140.0,140.2,451.72,220.0,139.0,190.0,23.333000,23.333000,23.333000; ...
  150. 112.2, 80.2,160.2,160.2,468.97,230.0, 0 ,210.0,26.667000,26.667000,26.667000; ...
  151. 126.0, 90.2,180.2,180.0,503.45,240.0, 0 ,230.0,30.000000,30.000000,30.000000; ...
  152. 140.2,100.2,200.2,200.4,512.07,245.0, 0 ,245.0,33.333000,33.333000,33.333000; ...
  153. 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,36.667000,36.667000,36.667000; ...
  154. 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,40.000000,40.000000,40.000000; ...
  155. 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,43.333000,43.333000,43.333000; ...
  156. 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,46.667000,46.667000,46.667000; ...
  157. 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,50.000000,50.000000,50.000000; ...
  158. ];
  159. qG=[ ...
  160. 0.000, 0.000, 0.000, 0.000, 0.00, 0.0, 0.0, 0.0,0 ,0 ,0 ; ...
  161. 2.350, 3.832, 5.628, 4.612,10.80, 7.6, 3.4, 7.5,0.32538533,0.33133936,0.32236442; ...
  162. 4.712, 7.646,11.109, 9.201,21.45,14.9, 6.8,11.8,0.63208896,0.63420987,0.62648714; ...
  163. 6.981,11.498,16.656,13.858,32.05,22.2,10.0,14.8,0.94148004,0.93937200,0.93356729; ...
  164. 9.256,15.202,22.243,18.440,42.65,25.0,13.2,19.1,1.2529521 ,1.2468803 ,1.2427585 ; ...
  165. 11.604,18.927,27.866,22.884,44.70,28.0,16.6,21.8,1.5639043 ,1.5545483 ,1.5514039 ; ...
  166. 13.892,22.657,33.122,27.464,46.65,30.8,19.8,24.4,1.8741443 ,1.8627108 ,1.8593891 ; ...
  167. 16.167,26.285,38.487,31.925,48.10,32.1,23.0,26.4,2.1841798 ,2.1716371 ,2.1672122 ; ...
  168. 18.410,29.896,43.828,36.386,49.70,33.3, 0 ,28.0,2.5015478 ,2.4888871 ,2.4827976 ; ...
  169. 20.629,33.438,48.575,40.726,52.35,34.2, 0 ,29.3,2.8104367 ,2.7979240 ,2.7898581 ; ...
  170. 22.898,36.758,51.971,45.143,52.80,34.7, 0 ,30.1,3.1178350 ,3.1058538 ,3.0956228 ; ...
  171. 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,3.4247386 ,3.4134352 ,3.4008279 ; ...
  172. 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,3.7313569 ,3.7210751 ,3.7056735 ; ...
  173. 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,4.0364571 ,4.0274525 ,4.0088239 ; ...
  174. 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,4.3408098 ,4.3334475 ,4.3110003 ; ...
  175. 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,4.6463265 ,4.6411600 ,4.6146355 ; ...
  176. ];
  177. qleff=[0.078765,0.07867,0.19847,0.198745,0.19886,0.202628,0.07890677,0.084339,0.19849,0.19849,0.19849];
  178. Nm=[17,39,29,24,11,26,17,26,49,49,49]; % main coil turns
  179. Nt=[20,20,20,20,20,20,20,20,20,20,20]; % trim coil turns
  180. % NOTE: data for types 9-11 (IHEP type D32L180 ("QEA")) are integrated strength
  181. % in Tesla ... divide by leff for standard handling
  182. for n=9:11
  183. qG(:,n)=qG(:,n)/qleff(n);
  184. end
  185. % quadrupole family names
  186. qname=['QF1R ';'QF2R ';'QM1R ';'QM2R ';'QM3R ';'QM4R ';'QM5R ';'QM6R '; ...
  187. 'QM7R ';'QM8R ';'QM9R ';'QM10R';'QM11R';'QM12R';'QM13R';'QM14R'; ...
  188. 'QM15R';'QM16R';'QM17R';'QM18R';'QM19R';'QM20R';'QM21R';'QM22R'; ...
  189. 'QM23R';'QM7AR'];
  190. % quadrupole family types
  191. % (from: ATF$MAG:MAG_KI_MAIN.FOR)
  192. qtype=[1;5;3;2;2;3;4;4;7;7;4;4;6;9;10;11;6;4;4;4;4;3;2;2;3;8];
  193. % polarities
  194. qsgn=[1;1;1;-1;-1;1;1;-1;1;1;-1;1;-1;1;-1;1;-1;1;-1;-1;1;1;-1;-1;1;1];
  195. % "Kubo" fudge factors
  196. % (NOTE: set fudge factors to zero ... who knows what they are now)
  197. qfudge=[ ...
  198. 0.0; ... % QF1R
  199. 0.0; ... % QF2R
  200. 0.0; ... % QM1R
  201. 0.0; ... % QM2R
  202. 0.0; ... % QM3R
  203. 0.0; ... % QM4R
  204. 0.0; ... % QM5R
  205. 0.0; ... % QM6R
  206. 0.0; ... % QM7R
  207. 0.0; ... % QM8R
  208. 0.0; ... % QM9R
  209. 0.0; ... % QM10R
  210. 0.0; ... % QM11R
  211. 0.0; ... % QM12R
  212. 0.0; ... % QM13R
  213. 0.0; ... % QM14R
  214. 0.0; ... % QM15R
  215. 0.0; ... % QM16R
  216. 0.0; ... % QM17R
  217. 0.0; ... % QM18R
  218. 0.0; ... % QM19R
  219. 0.0; ... % QM20R
  220. 0.0; ... % QM21R
  221. 0.0; ... % QM22R
  222. 0.0; ... % QM23R
  223. 0.0; ... % QM7AR
  224. ];
  225. % quadrupole family pointers
  226. idq=[ ...
  227. 1*ones(28,1); ... % QF1R
  228. 2*ones(26,1); ... % QF2R
  229. 3*ones( 2,1); ... % QM1R
  230. 4*ones( 2,1); ... % QM2R
  231. 5*ones( 2,1); ... % QM3R
  232. 6*ones( 2,1); ... % QM4R
  233. 7*ones( 2,1); ... % QM5R
  234. 8*ones( 2,1); ... % QM6R
  235. [26;9]; ... % QM7AR,QM7R
  236. 10*ones( 2,1); ... % QM8R
  237. 11*ones( 2,1); ... % QM9R
  238. 12*ones( 2,1); ... % QM10R
  239. 13*ones( 2,1); ... % QM11R
  240. 14*ones( 2,1); ... % QM12R
  241. 15*ones( 2,1); ... % QM13R
  242. 16*ones( 2,1); ... % QM14R
  243. 17*ones( 2,1); ... % QM15R
  244. 18*ones( 2,1); ... % QM16R
  245. 19*ones( 2,1); ... % QM17R
  246. 20*ones( 2,1); ... % QM18R
  247. 21*ones( 2,1); ... % QM19R
  248. 22*ones( 2,1); ... % QM20R
  249. 23*ones( 2,1); ... % QM21R
  250. 24*ones( 2,1); ... % QM22R
  251. 25*ones( 2,1); ... % QM23R
  252. ];
  253. % ==============================================================================
  254. % compute rigidity
  255. Cb=1e10/2.99792458e8; % kG-m/GeV
  256. brho=Cb*energy;
  257. % perform requested conversion
  258. % (NOTE: polynomial evaluation is not presently used to convert current to
  259. % gradient ... linear interpolation of MMS data is used)
  260. if (opCode==1)
  261. % convert current to KL
  262. Iquad=zeros(Ntrim,1);
  263. KL=zeros(Ntrim,1);
  264. for n=1:Ntrim
  265. m=idq(n); % quad family (1-26)
  266. t=qtype(m); % quad type (1-11)
  267. Iquad(n)=Imain(m)+(Nt(t)/Nm(t))*Itrim(n);
  268. if (Iquad(n)<=0)
  269. G=0;
  270. else
  271. G=interp1(qI(1:Nmms(t),t),qG(1:Nmms(t),t),Iquad(n),'linear');
  272. end
  273. KL(n)=qsgn(m)*(10*G)*qleff(t)/brho;
  274. if (fudge),KL(n)=KL(n)/(1+qfudge(m));end
  275. end
  276. varargout{1}=Iquad;
  277. varargout{2}=KL;
  278. else
  279. % convert KL to current
  280. Iquad=zeros(Nmain,1);
  281. for n=1:Nmain
  282. if (KL(n)~=0)
  283. t=qtype(n); % quad type (1-11)
  284. G=0.1*brho*abs(KL(n))/qleff(t); % T/m
  285. if (fudge),G=G*(1+qfudge(t));end
  286. Iquad(n)=interp1(qG(1:Nmms(t),t),qI(1:Nmms(t),t),G,'linear');
  287. end
  288. end
  289. varargout{1}=Iquad;
  290. end
  291. end