source: MML/trunk/mml/at/doc_html/at/readmad.html @ 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: 16.5 KB
Line 
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2                "http://www.w3.org/TR/REC-html40/loose.dtd">
3<html>
4<head>
5  <title>Description of readmad</title>
6  <meta name="keywords" content="readmad">
7  <meta name="description" content="READMAD reads the file output of MAD commands">
8  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
9  <meta name="generator" content="m2html &copy; 2003 Guillaume Flandin">
10  <meta name="robots" content="index, follow">
11  <link type="text/css" rel="stylesheet" href="../m2html.css">
12</head>
13<body>
14<a name="_top"></a>
15<div><a href="../index.html">Home</a> &gt;  <a href="index.html">at</a> &gt; readmad.m</div>
16
17<!--<table width="100%"><tr><td align="left"><a href="../index.html"><img alt="<" border="0" src="../left.png">&nbsp;Master index</a></td>
18<td align="right"><a href="index.html">Index for at&nbsp;<img alt=">" border="0" src="../right.png"></a></td></tr></table>-->
19
20<h1>readmad
21</h1>
22
23<h2><a name="_name"></a>PURPOSE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
24<div class="box"><strong>READMAD reads the file output of MAD commands</strong></div>
25
26<h2><a name="_synopsis"></a>SYNOPSIS <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
27<div class="box"><strong>function ATLATTICE = readmad(FILENAME) </strong></div>
28
29<h2><a name="_description"></a>DESCRIPTION <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
30<div class="fragment"><pre class="comment">READMAD reads the file output of MAD commands
31 TWISS, STRUCTURE, SURVEY.
32
33 READMAD reads the MAD file header to determine the number of elements
34 in the lattice, symmetry flag, the number of supperperiods etc.
35 
36 Then it interprets the entry for each element in the MAD output file.
37 The topology of the lattice is completely determined by
38 Length, Bending Angle, and Ttilt Angle in each element
39 
40 READMAD uses MAD TYPES and the values of to determine
41 which pass-method function in AT to use.
42 
43 MAD TYPE      |  AT PassMethod
44 ----------------------------------
45 DRIFT         |  DriftPass
46 SBEND         |  BendLinearPass, BendLinearFringeTiltPass, BndMPoleSymplectic4Pass
47 QUADRUPOLE    |  QualdLinearPass
48 SEXTUPOLE     |  StrMPoleSymplectic4Pass
49 OCTUPOLE      |  StrMPoleSymplectic4Pass
50 MULTIPOLE     |  !!! Not implemented, in future - ThinMPolePass
51 RFCAVITY      |  ThinCavityPass
52 KICKER        |  CorrectorPass
53 HKICKER       |  CorrectorPass
54 VKICKER       |  CorrectorPass
55 MONITOR       |  IdentityPass
56 HMONITOR      |  IdentityPass
57 VMONITOR      |  IdentityPass
58 MARKER        |  IdentityPass
59 -----------------------------------
60 all others    |  Length=0 -&gt; IdentityPass, Length~=0 -&gt; DriftPass</pre></div>
61
62<!-- crossreference -->
63<h2><a name="_cross"></a>CROSS-REFERENCE INFORMATION <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
64This function calls:
65<ul style="list-style-image:url(../matlabicon.gif)">
66<li><a href="mksrollmat.html" class="code" title="function R = mksrollmat(PSI);">mksrollmat</a> MKSROLLMAT - Rotation matrix around s-axis</li></ul>
67This function is called by:
68<ul style="list-style-image:url(../matlabicon.gif)">
69</ul>
70<!-- crossreference -->
71
72<h2><a name="_subfunctions"></a>SUBFUNCTIONS <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
73<ul style="list-style-image:url(../matlabicon.gif)">
74<li><a href="#_sub1" class="code">function atelem = mad2at(elementdata,madfiletype)</a></li></ul>
75<h2><a name="_source"></a>SOURCE CODE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
76<div class="fragment"><pre>0001 <a name="_sub0" href="#_subfunctions" class="code">function ATLATTICE = readmad(FILENAME)</a>
770002 <span class="comment">%READMAD reads the file output of MAD commands</span>
780003 <span class="comment">% TWISS, STRUCTURE, SURVEY.</span>
790004 <span class="comment">%</span>
800005 <span class="comment">% READMAD reads the MAD file header to determine the number of elements</span>
810006 <span class="comment">% in the lattice, symmetry flag, the number of supperperiods etc.</span>
820007 <span class="comment">%</span>
830008 <span class="comment">% Then it interprets the entry for each element in the MAD output file.</span>
840009 <span class="comment">% The topology of the lattice is completely determined by</span>
850010 <span class="comment">% Length, Bending Angle, and Ttilt Angle in each element</span>
860011 <span class="comment">%</span>
870012 <span class="comment">% READMAD uses MAD TYPES and the values of to determine</span>
880013 <span class="comment">% which pass-method function in AT to use.</span>
890014 <span class="comment">%</span>
900015 <span class="comment">% MAD TYPE      |  AT PassMethod</span>
910016 <span class="comment">% ----------------------------------</span>
920017 <span class="comment">% DRIFT         |  DriftPass</span>
930018 <span class="comment">% SBEND         |  BendLinearPass, BendLinearFringeTiltPass, BndMPoleSymplectic4Pass</span>
940019 <span class="comment">% QUADRUPOLE    |  QualdLinearPass</span>
950020 <span class="comment">% SEXTUPOLE     |  StrMPoleSymplectic4Pass</span>
960021 <span class="comment">% OCTUPOLE      |  StrMPoleSymplectic4Pass</span>
970022 <span class="comment">% MULTIPOLE     |  !!! Not implemented, in future - ThinMPolePass</span>
980023 <span class="comment">% RFCAVITY      |  ThinCavityPass</span>
990024 <span class="comment">% KICKER        |  CorrectorPass</span>
1000025 <span class="comment">% HKICKER       |  CorrectorPass</span>
1010026 <span class="comment">% VKICKER       |  CorrectorPass</span>
1020027 <span class="comment">% MONITOR       |  IdentityPass</span>
1030028 <span class="comment">% HMONITOR      |  IdentityPass</span>
1040029 <span class="comment">% VMONITOR      |  IdentityPass</span>
1050030 <span class="comment">% MARKER        |  IdentityPass</span>
1060031 <span class="comment">% -----------------------------------</span>
1070032 <span class="comment">% all others    |  Length=0 -&gt; IdentityPass, Length~=0 -&gt; DriftPass</span>
1080033
1090034 [fid, errmsg]  = fopen(FILENAME,<span class="string">'r'</span>);
1100035 <span class="keyword">if</span> fid==-1
1110036     error(<span class="string">'Could not open file'</span>);
1120037 <span class="keyword">end</span>
1130038
1140039 warnlevel = warning;
1150040 warning on
1160041
1170042 <span class="keyword">global</span> READMADCAVITYFLAG
1180043 READMADCAVITYFLAG = 0;
1190044
1200045 LINE1 = fgetl(fid);
1210046 LINE2 = fgetl(fid);
1220047
1230048 S = LINE1(9:16);
1240049 nonspaceindex = find(~isspace(S) &amp; (S~=0));
1250050 MADFILETYPE = S(nonspaceindex);
1260051 <span class="comment">% The possiblilites for MADFILETYPE are</span>
1270052 <span class="comment">% TWISS,SURVEY,STRUCTUR,ENVELOPE</span>
1280053
1290054
1300055 NSUPER = str2double(LINE1(41:48));
1310056
1320057 S = LINE1(56);
1330058 SYMFLAG = eq(S,<span class="string">'T'</span>);
1340059
1350060 NPOS = str2double(LINE1(57:64));
1360061
1370062 disp([<span class="string">'MAD output file: '</span>,FILENAME]);
1380063 disp(<span class="string">' '</span>);
1390064 disp([<span class="string">'MAD file type:           '</span>,MADFILETYPE]);
1400065 disp([<span class="string">'Symmetry flag:           '</span>,num2str(SYMFLAG)]);
1410066 disp([<span class="string">'Number of superperiods:  '</span>,num2str(NSUPER)]);
1420067 disp([<span class="string">'Number of elements :     '</span>,num2str(NPOS)]);
1430068 disp(<span class="string">' '</span>);
1440069
1450070
1460071 <span class="comment">% Allocate cell array to store AT lattice</span>
1470072 <span class="comment">% MAD files heve one extra entry for the beginning of the lattice</span>
1480073 ATNumElements = NPOS-1;
1490074 ATLATTICE = cell(1,ATNumElements);
1500075
1510076
1520077 <span class="keyword">switch</span> MADFILETYPE
1530078 <span class="keyword">case</span> {<span class="string">'STRUCTUR'</span>,<span class="string">'SURVEY'</span>}
1540079     NumLinesPerElement = 4;
1550080 <span class="keyword">case</span> {<span class="string">'TWISS'</span>,<span class="string">'CHROM'</span>}
1560081     NumLinesPerElement = 5;
1570082 <span class="keyword">case</span> <span class="string">'ENVELOPE'</span>
1580083     NumLinesPerElement = 8;
1590084 <span class="keyword">end</span>
1600085
1610086 ELEMENTDATA = cell(1,NumLinesPerElement);
1620087
1630088 <span class="comment">% Skip the INITIAL element in MAD file</span>
1640089 <span class="keyword">for</span> i = 1:NumLinesPerElement;
1650090     LINE = fgetl(fid);
1660091 <span class="keyword">end</span>
1670092
1680093 <span class="keyword">for</span> i = 1:ATNumElements
1690094     <span class="comment">% Read the first 2 lines of the element entry</span>
1700095     <span class="keyword">for</span> j= 1:NumLinesPerElement
1710096         ELEMENTDATA{j}=fgetl(fid);
1720097     <span class="keyword">end</span>
1730098     
1740099     ATLATTICE{i}=<a href="#_sub1" class="code" title="subfunction atelem = mad2at(elementdata,madfiletype)">mad2at</a>(ELEMENTDATA,MADFILETYPE);
1750100 <span class="keyword">end</span>
1760101     
1770102
1780103
1790104
1800105 fclose(fid);
1810106 warning(warnlevel);
1820107
1830108 disp(<span class="string">' '</span>);
1840109 disp([<span class="string">'AT cell array was successfully created from MAD output file '</span>,FILENAME]);
1850110 disp(<span class="string">'Some information may be not available in MAD otput files'</span>)
1860111 disp(<span class="string">'Some elements may have to be further modified to be consistent with AT element models'</span>)
1870112 disp(<span class="string">' '</span>);
1880113 disp(<span class="string">'For RF cavities READMAD creates elements that use DriftPass or IdentityPass (if Length ==0)'</span>);
1890114 disp(<span class="string">'Use CAVITYON(ENERGY) [eV] in order to turn them into cavities'</span>);
1900115
1910116
1920117 <span class="comment">% ---------------------------------------------------------------------------</span>
1930118
1940119 <a name="_sub1" href="#_subfunctions" class="code">function atelem = mad2at(elementdata,madfiletype)</a>
1950120     <span class="keyword">global</span> READMADCAVITYFLAG
1960121     MADTYPE = elementdata{1}(1:4);
1970122     atelem.FamName = deblank(elementdata{1}(5:20));
1980123     atelem.Length = str2double(elementdata{1}(21:32));
1990124     <span class="comment">% Type specific</span>
2000125     <span class="keyword">switch</span> MADTYPE
2010126     <span class="keyword">case</span> <span class="string">'DRIF'</span>
2020127         atelem.PassMethod = <span class="string">'DriftPass'</span>;
2030128     <span class="keyword">case</span> {<span class="string">'MARK'</span>,<span class="string">'MONI'</span>,<span class="string">'HMON'</span>,<span class="string">'VMON'</span>}
2040129         atelem.PassMethod = <span class="string">'IdentityPass'</span>;
2050130     <span class="keyword">case</span> <span class="string">'RFCA'</span>
2060131         <span class="comment">% Note MAD determines the RF frequency from the harmonic number HARMON</span>
2070132         <span class="comment">% defined by MAD stetement BEAM, and the total length of the closed orbit</span>
2080133         <span class="keyword">if</span> ~READMADCAVITYFLAG
2090134             warning(<span class="string">'MAD lattice contains RF cavities'</span>)
2100135             READMADCAVITYFLAG = 1;
2110136         <span class="keyword">end</span>
2120137         atelem.Frequency = 1e6*str2double(elementdata{2}(17:32)); <span class="comment">% MAD uses MHz</span>
2130138         atelem.Voltage = 1e6*str2double(elementdata{2}(33:48));
2140139         atelem.PhaseLag = str2double(elementdata{2}(49:64));
2150140         <span class="keyword">if</span> atelem.Length
2160141             atelem.PassMethod = <span class="string">'DriftPass'</span>;
2170142         <span class="keyword">else</span>
2180143             atelem.PassMethod = <span class="string">'IdentityPass'</span>;
2190144         <span class="keyword">end</span>
2200145     <span class="keyword">case</span> <span class="string">'SBEN'</span>
2210146         K1 = str2double(elementdata{1}(49:64));
2220147         K2 = str2double(elementdata{1}(65:80));
2230148         atelem.BendingAngle = str2double(elementdata{1}(33:48));
2240149         atelem.ByError = 0;
2250150         atelem.MaxOrder = 3;
2260151         atelem.NumIntSteps = 10;
2270152         atelem.TiltAngle = str2double(elementdata{2}(1:16));
2280153         atelem.EntranceAngle = str2double(elementdata{2}(17:32));
2290154         atelem.ExitAngle = str2double(elementdata{2}(33:48));
2300155         atelem.K = K1;
2310156         atelem.PolynomB = [0 K1 K2 0];
2320157         atelem.PolynomA = [0 0 0 0];     
2330158         atelem.T1 = zeros(1,6);
2340159         atelem.T2 = zeros(1,6);
2350160         atelem.R1 = eye(6);
2360161         atelem.R2 = eye(6);
2370162         <span class="keyword">if</span> atelem.BendingAngle
2380163             <span class="keyword">if</span> K2
2390164                 atelem.PassMethod = <span class="string">'BndMPoleSymplectic4Pass'</span>;
2400165             <span class="keyword">elseif</span> atelem.TiltAngle
2410166                 atelem.PassMethod = <span class="string">'BendLinearFringeTiltPass'</span>
2420167             <span class="keyword">else</span>
2430168                 atelem.PassMethod = <span class="string">'BendLinearPass'</span>;
2440169             <span class="keyword">end</span>
2450170             
2460171         <span class="keyword">else</span>
2470172             <span class="keyword">if</span> K2
2480173                 atelem.PassMethod = <span class="string">'StrMPoleSymplectic4Pass'</span>;
2490174             <span class="keyword">elseif</span> K1
2500175                 atelem.PassMethod = <span class="string">'QuadLinearPass'</span>;
2510176             <span class="keyword">else</span>
2520177                 atelem.PassMethod = <span class="string">'DriftPass'</span>;
2530178             <span class="keyword">end</span>
2540179         <span class="keyword">end</span>
2550180     <span class="keyword">case</span> <span class="string">'QUAD'</span>
2560181         K1 = str2double(elementdata{1}(49:64));
2570182         atelem.MaxOrder = 3;
2580183         atelem.NumIntSteps = 10;
2590184         atelem.K = K1;
2600185         atelem.PolynomB = [0 K1 0 0];
2610186         atelem.PolynomA = [0 0 0 0];
2620187         atelem.T1 = zeros(1,6);
2630188         atelem.T2 = zeros(1,6);
2640189         TILT = str2double(elementdata{2}(1:16));
2650190         atelem.R1 = <a href="mksrollmat.html" class="code" title="function R = mksrollmat(PSI);">mksrollmat</a>(TILT);
2660191         atelem.R2 = <a href="mksrollmat.html" class="code" title="function R = mksrollmat(PSI);">mksrollmat</a>(-TILT);
2670192         atelem.PassMethod = <span class="string">'QuadLinearPass'</span>;
2680193         
2690194     <span class="keyword">case</span> <span class="string">'SEXT'</span>
2700195         <span class="comment">% MAD multipole strength coefficients K(n) are defined without 1/n!</span>
2710196         <span class="comment">% Adjust to match AT</span>
2720197         K2 = str2double(elementdata{1}(65:80))/2;
2730198         atelem.MaxOrder = 3;
2740199         atelem.NumIntSteps = 10;
2750200         atelem.PolynomB = [0 0 K2 0];
2760201         atelem.PolynomA = [0 0 0 0];
2770202         atelem.T1 = zeros(1,6);
2780203         atelem.T2 = zeros(1,6);
2790204         TILT = str2double(elementdata{2}(1:16));
2800205         atelem.R1 = <a href="mksrollmat.html" class="code" title="function R = mksrollmat(PSI);">mksrollmat</a>(TILT);
2810206         atelem.R2 = <a href="mksrollmat.html" class="code" title="function R = mksrollmat(PSI);">mksrollmat</a>(-TILT);
2820207         atelem.PassMethod = <span class="string">'StrMPoleSymplectic4Pass'</span>;
2830208         
2840209     <span class="keyword">case</span> <span class="string">'OCTU'</span>
2850210         <span class="comment">% MAD multipole strength coefficients K(n) are defined without 1/n!</span>
2860211         <span class="comment">% Adjust to match AT</span>
2870212         K3 = str2double(elementdata{2}(17:32))/6;
2880213         atelem.MaxOrder = 3 ;
2890214         atelem.NumIntSteps = 10;
2900215         atelem.PolynomB = [0 0 0 K3];
2910216         atelem.PolynomA = [0 0 0 0];
2920217         atelem.T1 = zeros(1,6);
2930218         atelem.T2 = zeros(1,6);
2940219         TILT = str2double(elementdata{2}(1:16));
2950220         atelem.R1 = <a href="mksrollmat.html" class="code" title="function R = mksrollmat(PSI);">mksrollmat</a>(TILT);
2960221         atelem.R2 = <a href="mksrollmat.html" class="code" title="function R = mksrollmat(PSI);">mksrollmat</a>(-TILT);
2970222         atelem.PassMethod = <span class="string">'StrMPoleSymplectic4Pass'</span>;
2980223     <span class="keyword">otherwise</span>
2990224         <span class="keyword">if</span> atelem.Length
3000225             atelem.PassMethod = <span class="string">'DriftPass'</span>;
3010226         <span class="keyword">else</span>
3020227             atelem.PassMethod = <span class="string">'IdentityPass'</span>;
3030228         <span class="keyword">end</span>
3040229     <span class="keyword">end</span></pre></div>
305<hr><address>Generated on Fri 18-May-2007 17:13:39 by <strong><a href="http://www.artefact.tk/software/matlab/m2html/">m2html</a></strong> &copy; 2003</address>
306</body>
307</html>
Note: See TracBrowser for help on using the repository browser.