Repository navigation
Expand file tree
/
Copy pathGeometryModeler.html
More file actions
275 lines (255 loc) · 98.4 KB
/
Copy pathGeometryModeler.html
File metadata and controls
275 lines (255 loc) · 98.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,IE=9,chrome=1"><meta name="generator" content="MATLAB 2021a"><title>3D-geometry of a beam line (Section 2.1)</title><style type="text/css">.rtcContent { padding: 30px; } .S0 { margin: 2px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre-wrap; color: rgb(0, 0, 0); font-family: Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: normal; text-align: left; }
.S1 { margin: 15px 10px 5px 4px; padding: 0px; line-height: 28.8px; min-height: 0px; white-space: pre-wrap; color: rgb(213, 80, 0); font-family: Helvetica, Arial, sans-serif; font-style: normal; font-size: 24px; font-weight: normal; text-align: left; }
.CodeBlock { background-color: #F7F7F7; margin: 10px 0 10px 0;}
.S2 { border-left: 1px solid rgb(233, 233, 233); border-right: 1px solid rgb(233, 233, 233); border-top: 1px solid rgb(233, 233, 233); border-bottom: 0px none rgb(0, 0, 0); border-radius: 4px 4px 0px 0px; padding: 6px 45px 0px 13px; line-height: 17.234px; min-height: 18px; white-space: nowrap; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 14px; }
.S3 { border-left: 1px solid rgb(233, 233, 233); border-right: 1px solid rgb(233, 233, 233); border-top: 0px none rgb(0, 0, 0); border-bottom: 0px none rgb(0, 0, 0); border-radius: 0px; padding: 0px 45px 0px 13px; line-height: 17.234px; min-height: 18px; white-space: nowrap; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 14px; }
.S4 { border-left: 1px solid rgb(233, 233, 233); border-right: 1px solid rgb(233, 233, 233); border-top: 0px none rgb(0, 0, 0); border-bottom: 1px solid rgb(233, 233, 233); border-radius: 0px 0px 4px 4px; padding: 0px 45px 4px 13px; line-height: 17.234px; min-height: 18px; white-space: nowrap; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 14px; }
.S5 { margin: 10px 10px 9px 4px; padding: 0px; line-height: 21px; min-height: 0px; white-space: pre-wrap; color: rgb(0, 0, 0); font-family: Helvetica, Arial, sans-serif; font-style: normal; font-size: 14px; font-weight: normal; text-align: left; }
.S6 { border-left: 1px solid rgb(233, 233, 233); border-right: 1px solid rgb(233, 233, 233); border-top: 1px solid rgb(233, 233, 233); border-bottom: 1px solid rgb(233, 233, 233); border-radius: 4px; padding: 6px 45px 4px 13px; line-height: 17.234px; min-height: 18px; white-space: nowrap; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 14px; }
.S7 { border-left: 1px solid rgb(233, 233, 233); border-right: 1px solid rgb(233, 233, 233); border-top: 0px none rgb(0, 0, 0); border-bottom: 1px solid rgb(233, 233, 233); border-radius: 0px; padding: 0px 45px 4px 13px; line-height: 17.234px; min-height: 18px; white-space: nowrap; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 14px; }
.S8 { color: rgb(64, 64, 64); padding: 10px 0px 6px 17px; background: rgb(255, 255, 255) none repeat scroll 0% 0% / auto padding-box border-box; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 14px; overflow-x: hidden; line-height: 17.234px; }
.S9 { margin: 3px 10px 5px 4px; padding: 0px; line-height: 20px; min-height: 0px; white-space: pre-wrap; color: rgb(60, 60, 60); font-family: Helvetica, Arial, sans-serif; font-style: normal; font-size: 20px; font-weight: bold; text-align: left; }
.S10 { margin: 10px 10px 5px 4px; padding: 0px; line-height: 18px; min-height: 0px; white-space: pre-wrap; color: rgb(60, 60, 60); font-family: Helvetica, Arial, sans-serif; font-style: normal; font-size: 15px; font-weight: bold; text-align: left; }</style></head><body><div class = rtcContent><div class = 'S0'><span>Companion software for "Volker Ziemann, </span><span style=' font-style: italic;'>Hands-on Accelerator physics using MATLAB, CRCPress, 2019</span><span>" (https://www.crcpress.com/9781138589940)</span></div><h1 class = 'S1'><span>3D-geometry of a beam line (Section 2.1)</span></h1><div class = 'S0'><span>Volker Ziemann, 211123</span></div><div class = 'S0'><span>In this example we discuss a program the produce the three-dimensional layout of an accelerator. It produces a top view of the beamline or ring and writes an input file for the solid-modeling program OpenSCAD, which is available from </span><a href = "https://openscad.org."><span>https://openscad.org.</span></a><span> It also maintains a list of start and end coordinates of each element in the laboratory frame.</span></div><div class = 'S0'><span>As an example, let us define a ring that consists of a sequence of quadrupole and dipole magnets known as a FODO lattice. We define one FODO cell as a sequence of element, distinguished by their code, which is the entry in the first column of the following array </span><span style=' font-family: monospace;'>fodo,</span><span> where code =1 indicates a beam pipe, code=5 indicates a quadrupole, and code=4 indicates dipole magnet. The second column denotes how many times the same element should be repeated, which is not used here, but is convenient later in the book. The third column indicates the length of the element and the fourth column its strength. We will use this format to describe beam lines throughout the book. In this example the only interesting parameter in the fourth column is the deflection angle of the dipole magnet, because it changes the direction of the reference system. The quadrupole excitations are not used here, because they do not change the direction of the reference orbit.</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S2'><span style="white-space: pre"><span >clear;</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >fodo=[ 1 1 2.5 0 ; </span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > 5 1 1.0 0.0777; </span><span style="color: rgb(2, 128, 9);">% quadrupole</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > 1 1 1.5 0 ; </span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > 4 1 2.0 30; </span><span style="color: rgb(2, 128, 9);">% dipole</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > 1 1 1.5 0; </span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > 5 1 1.0 -0.1472; </span><span style="color: rgb(2, 128, 9);">% quadrupole</span></span></div></div><div class="inlineWrapper"><div class = 'S4'><span style="white-space: pre"><span > 1 1 2.5 0;]; </span></span></div></div></div><div class = 'S5'><span>Having defined the fundamental cell with a 30-degree dipole, we realize that we need twelve cells to construct a whole ring. The resulting array is called beamline. We also count the number of lines and elements. The latter is needed, if we had used repeat codes in the scond column that differ from unity.</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S2'><span style="white-space: pre"><span >beamline=repmat(fodo,12,1);</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >nlines=size(beamline,1); </span><span style="color: rgb(2, 128, 9);">% number of lines</span></span></div></div><div class="inlineWrapper"><div class = 'S4'><span style="white-space: pre"><span >nele=sum(beamline(:,2))+1; </span><span style="color: rgb(2, 128, 9);">% number of elements</span></span></div></div></div><div class = 'S5'><span>The next lines allocate space for the coordinates </span><span style=' font-family: monospace;'>vvpos()</span><span> of the elements in beamline, set the origin </span><span style=' font-family: monospace;'>vv</span><span> where we start and the direction </span><span style=' font-family: monospace;'>ww</span><span>, which is specified by a rotation matrix. It is easy to visualize vv and ww as the location of the reference particle and its direction of travel; the columns of the matrix ww denote the three unit vectors that define a tripod that "rides on the reference particle." </span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S2'><span style="white-space: pre"><span >vvpos=zeros(3,nele); </span><span style="color: rgb(2, 128, 9);">% element positions</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >vv=[0;0;0]; </span><span style="color: rgb(2, 128, 9);">% x,y,z or origin</span></span></div></div><div class="inlineWrapper"><div class = 'S4'><span style="white-space: pre"><span >ww=eye(3); </span><span style="color: rgb(2, 128, 9);">% orientation of tripod</span></span></div></div></div><div class = 'S5'><span>Now we open a file with the name </span><span style=' font-family: monospace;'>layout.scad</span><span> to which we write OpenSCAD commands that create the 3D geometry. We also specify 'hold on' in order to add elements to the MATLAB plot with the top view onto the ring.</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S2'><span style="white-space: pre"><span >f=fopen(</span><span style="color: rgb(170, 4, 249);">'layout.scad'</span><span >,</span><span style="color: rgb(170, 4, 249);">'w'</span><span >); </span><span style="color: rgb(2, 128, 9);">% open output file for 3D view</span></span></div></div><div class="inlineWrapper"><div class = 'S4'><span style="white-space: pre"><span >hold </span><span style="color: rgb(170, 4, 249);">on</span><span > </span><span style="color: rgb(2, 128, 9);">% can add elements to the same plot</span></span></div></div></div><div class = 'S5'><span>After inilializing the element counter </span><span style=' font-family: monospace;'>ic</span><span>, we loop over the lines and segments in the </span><span style=' font-family: monospace;'>beamline</span><span>.</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S2'><span style="white-space: pre"><span >ic=1; </span><span style="color: rgb(2, 128, 9);">% element counter</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span style="color: rgb(14, 0, 255);">for </span><span >line=1:nlines </span><span style="color: rgb(2, 128, 9);">% loop over input elements</span></span></div></div><div class="inlineWrapper"><div class = 'S4'><span style="white-space: pre"><span > </span><span style="color: rgb(14, 0, 255);">for </span><span >seg=1:beamline(line,2) </span><span style="color: rgb(2, 128, 9);">% loop over repeat-count</span></span></div></div></div><div class = 'S5'><span>Inside the loop, we record the position </span><span style=' font-family: monospace;'>v0</span><span> and orientation </span><span style=' font-family: monospace;'>w0</span><span> of the previous point, update the lement counter</span><span style=' font-family: monospace;'> ic</span><span>, and check the code in the first column of </span><span style=' font-family: monospace;'>beamline</span><span> of the presently considered element. If it is an element that does not change the direction of the particle, such as drift spaces, quadrupoles, or solenoids, we only record by how much the position advances in </span><span style=' font-family: monospace;'>dv</span><span>, and note that the orientation stays the same with </span><span style=' font-family: monospace;'>dw</span><span>.</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S2'><span style="white-space: pre"><span > v0=vv; w0=ww; </span><span style="color: rgb(2, 128, 9);">% remember previous point</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > ic=ic+1; </span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > </span><span style="color: rgb(14, 0, 255);">switch </span><span >beamline(line,1) </span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > </span><span style="color: rgb(14, 0, 255);">case </span><span >{1,2,5,7} </span><span style="color: rgb(2, 128, 9);">% drift, quadrupole, solenoid</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > dv=[0;0;beamline(line,3)]; </span></span></div></div><div class="inlineWrapper"><div class = 'S4'><span style="white-space: pre"><span > dw=eye(3);</span></span></div></div></div><div class = 'S5'><span>If the element is a dipole magnet and the deflection angle is non-zerom we calculate its bending radius rho and update the position with</span><span style=' font-family: monospace;'> dv</span><span> along the sagitta of the trajectory in the magnet. The orientation of the coordinate system changes by the angle phi around the vertical axis, where we use </span><span style=' font-family: monospace;'>wmake()</span><span>, defined in the Appendix, to create the rotation matrix. For the OpenSCAD file we also need the rotation with half the angle phi. Note that if the rotation angle is less than </span><span texencoding="10^{-7}" style="vertical-align:-5px"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAmCAYAAACYsfiPAAADWklEQVRoQ+3YW6itUxQH8N8pQgiFBxJCrhF1RFHkFiXkdtBx9+DkgZIXSpEH5AkpuZYQpRCJ08GR0/HgTuSeS5QHlNxF/5pLX1/rW3uuY61vtc9e42Xt9hzfHOM/x5hj/MdcZonJsiWG1xzwxh7xeYQXYYQ/wl4dfj+M85priz3CR+EBPI3vGsCC61pcgoD+TxY74NtxC75qRfhAvI4d8OPGBHgb/DQkna/HETiuvVYb4U1xEa7EfpX3fF9cheX4C1vhFdyKjyv32FC1t3AP7hgX8Ca4ANdhN/yGLSq8OB9341WcXtIq6fUoDsW55d5VbDW2yu74DLviy3EAn4RTCsjLCtAawMfgefyMA1r3a1t8WvZKyr0xNpyFP0hWrcQhw1RHpXTS+M/y0TPIASwEOBmRNpFTvqlkRtvuzbgGr+Gwhf0fW2MtVuOGcQE39e/HhRWA0/MeKh8ejZeGGD0Bz5X/H48Xyt/5PbYS3hW4c4jujvi2RPftPgA/gdPwO5K+yYi2pHj9gGTDfaVXRudIxOEaSVHK1WjLpY16M3Sf2ipdG+HvsT3ewUEjPP8A++CLkv41IGt0cvXSAdJNpg54c/xarLyMsKAuWYfDy+J2bXJQg2yIztbIgZ+IF/sAvAc+KYaexKkjHH+2OBaVVPL3NxBk87OzcVe5Fun7U49w7mAqZOTBUuS67IbfnlMW057Sr/+vPFIITlpSp0zyDidFk6qR3PmLR9jNgYScRNKa0qJ6kUkCHjCcOJ5qHYbVJU/h5LK4C77uBS3VTzw1VTqU85fi+BqEcXVJOHVS+R9s1iA4U8c9yQjH2UFberOL2hVE72H/QhJ2mjrKhoFJA34cZxQenXYzrFomoiEeyYgME4Pi1QvuSQNegVTLSIrY+iEo0p8HffIs5JB6k0kDzsARypdClJEyA0Rbbixrn5e3qL97QztG0XoMZ+KPUmRG+ZipKhQvs+jeLT4dHh1yktk4Q0Smml6lJsKhbB9iUFz27CDuTcdXIe9NaU95KclsnGEik1QmpMtxb69Ii7FRgEMIMu5l+tm54dw3SMTfLQSjy++DcXV5EgrH3hIZ2W4rv7PAW92HZ+LcNIzWpPQ07M5szzngmR19T4bnEe7poGdmZh7hmR19T4aXXIT/BRfHpScrvfgYAAAAAElFTkSuQmCC" width="30" height="19" /></span><span> radians the element is treated as straight element.</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S2'><span style="white-space: pre"><span > </span><span style="color: rgb(14, 0, 255);">case </span><span >4 </span><span style="color: rgb(2, 128, 9);">% sector dipole</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > phi=beamline(line,4)*pi/180; </span><span style="color: rgb(2, 128, 9);">% convert to radians</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > </span><span style="color: rgb(14, 0, 255);">if </span><span >abs(phi)>1e-7</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > rho=beamline(line,3)/phi; </span><span style="color: rgb(2, 128, 9);">% bending radius</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > dv=[rho*(cos(phi)-1);0.0;rho*sin(phi)]; </span><span style="color: rgb(2, 128, 9);">% sagitta</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > dw=wmake(0,-phi,0);</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > dw2=wmake(0,-phi/2,0); </span><span style="color: rgb(2, 128, 9);">% for 3D renderer only</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > </span><span style="color: rgb(14, 0, 255);">else</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > dv=[0;0;beamline(line,3)]; </span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > dw=eye(3); </span></span></div></div><div class="inlineWrapper"><div class = 'S4'><span style="white-space: pre"><span > </span><span style="color: rgb(14, 0, 255);">end </span></span></div></div></div><div class = 'S5'><span>Occasioanlly, we need a coordinate rotation, for example to make a vertically deflecting dipole by sandwiching a horizontally deflecting dipole between two </span><span texencoding="90^o" style="vertical-align:-5px"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAmCAYAAAC76qlaAAAEGklEQVRYR+3XdahtVRAG8N+zxcZCsQO7G1QUMZ6FotitKAoWmOA/KooigmJgYGJigC0qJoqFLYrdCoqF3Xwy57Hd7HM9593HhQdn/rnn7rVmrdkz33zz7UmmU5s0ncZtFPhEV26U8VHGB8zACCoDJmqabRsr41nbBwdhMcyKr3ELzscP/xPFSjgW6+EPzIkncA7eHu8b9As8l9yONbE7HqmLdsQ1+A6T8UafAPbDZXgSu+BbLIibsD72wl19fOfBcZgdX2IbnI6Hm/v7BX419seRuLB1QQK5FV9gNXzVWt8CD1RFVsXHjfV58W4FtTFeaPmuUxU9DYkhdi4OwbLNu7oC3xBP4TcshO9bh8fnUyxShx/YWJ8Jb2FpnIFTOrJ6Nk7AM8hdPVsSz1ZVjm48z/lXYnvc03veFXggsjPeRHDaZRfjcPyOJSr72bc3riuHzfFoh/PWuL+eb4UH6/cdyP/L4POG35k4GVviobECf6fKksOD4y4LhoP12MGVkfzuvfSvCCx+6XBO/3yDVCeZjP9yValrcUDL524Efgs3q9/OeBoibDED7sV2fQLPC2U9djkOrd9ppgXwCtbo45vHaeoV8UHBKs16PY7CBQ2/pYqBzsPxzfO6Av+Rf1XjWJeH4oLHWDKyA2bDz/XsMWw2RuDpoY1qfb5imYsKKj3oZPlSbFBMlJ6bYl0Yfx9502Q+zdkLpum3fJU2z0JTKWW6PjCLBa87jRF4qtWDYZhnRryIfXFD+aVfTio6TcP/x7oCj+OetSsd3aOlpmNg8FI9uBl7YBM8Xs+C/zZWm/7NO0KL4fsMu+A9fTIz5kIYqKtPOj8k0iivYxZ8iE3xUePW4D/DJZfEMkWPqdIHArGrauL2S3peLA0eCyWGGoeyfgMohJ/BkzGfAXIFXi0IpRp/1yjPZWmsG6vJ3qvbk7UMqn52Z/VF1hfHJ0NFXU3YzydwOBFrl1YJflOJS6r7d8VfRVOZnmGkn+qwHu77nR3NEogkAUlO5sFQNjWydn58VlC6D9s2buzRYRotL9zPXsMqNWgWHSri2jw1gWdcp2mSrXVbeiPKMZUII4XmogrblgxnAKVCEV09Ihgq/mEDXx1P16Vp0MNat4VdgvdYeDp72xZ+76nN3UpUDRV0Ng8T+Nx4HuHwYDhys43N0FjUXxouAitCq22RqFnLvMhZfw4d9RCBRwlmJEc4RcMks9HkXRbMR8WFQldo8XB0Spo82jxia4poGjb4QTKeCRg9koyfhVOLTca664jSHKHFDLFgPqIryjEKMMoyFDvV1i/wZDjSNo0WdritvkIiiga1tepLZuWSDXPg5fowyN9xWVfg4e8wRyjrOUQwDc2z44pqAOdBoDLAMRO/ZRT4ROd8lPFRxgfMwAgqAyZqmm37Bwf6zSfA9ehYAAAAAElFTkSuQmCC" width="23" height="19" /></span><span> rotations with opposite sign. If an element with unknown code in the first column appears, a short warning is displayed and neither position nor orientation are changed.</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S2'><span style="white-space: pre"><span > </span><span style="color: rgb(14, 0, 255);">case </span><span >20 </span><span style="color: rgb(2, 128, 9);">% coordinate rotation</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > dv=[0;0;0];</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > dw=wmake(0,0,beamline(line,4)*pi/180);</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > </span><span style="color: rgb(14, 0, 255);">otherwise</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > disp(</span><span style="color: rgb(170, 4, 249);">'unsupported code'</span><span >)</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > dv=[0;0;0]; dw=eye(3);</span></span></div></div><div class="inlineWrapper"><div class = 'S4'><span style="white-space: pre"><span > </span><span style="color: rgb(14, 0, 255);">end</span></span></div></div></div><div class = 'S5'><span>After setting up the differential changes of position </span><span style=' font-family: monospace;'>dv</span><span> and orientation </span><span style=' font-family: monospace;'>dw</span><span>, we use them to update the corresponding absolute values </span><span style=' font-family: monospace;'>vv</span><span> and </span><span style=' font-family: monospace;'>ww</span><span>, which are defined at the end point of the currently considered element.</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S2'><span style="white-space: pre"><span > [vv,ww]=wprop(vv,ww,dv,dw);</span></span></div></div><div class="inlineWrapper"><div class = 'S4'><span style="white-space: pre"><span > vvpos(:,ic)=vv';</span></span></div></div></div><div class = 'S5'><span>Now it's time to add the elements to the top-down view and the OpenSCAD model, which we do for dipoles with code 4 and for quadrupoles with code 5 in the following switch statement.</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S6'><span style="white-space: pre"><span > </span><span style="color: rgb(14, 0, 255);">switch </span><span >beamline(line,1) </span></span></div></div></div><div class = 'S5'><span>In the case statement for the dipole the drawbox() command plots the blue rectangle at the position an orientation of the magnet in the Matlab figure. The call to draw3D() places a blue box and a pedestal in the OpenSCAD model. </span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S2'><span style="white-space: pre"><span > </span><span style="color: rgb(14, 0, 255);">case </span><span >4 </span><span style="color: rgb(2, 128, 9);">% sector dipole</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > drawbox(vv,v0,0.5,</span><span style="color: rgb(170, 4, 249);">'b'</span><span >); </span></span></div></div><div class="inlineWrapper"><div class = 'S4'><span style="white-space: pre"><span > draw3D(f,v0,w0*dw2,[1.,0.6,beamline(line,3)],[0,0,1]);</span></span></div></div></div><div class = 'S5'><span>Likewise does the following section place a red rectangle in the Matlab figure and a red box on a pedestal.</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S2'><span style="white-space: pre"><span > </span><span style="color: rgb(14, 0, 255);">case </span><span >5 </span><span style="color: rgb(2, 128, 9);">% quadrupole</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > drawbox(vv,v0,0.7,</span><span style="color: rgb(170, 4, 249);">'r'</span><span >);</span></span></div></div><div class="inlineWrapper"><div class = 'S4'><span style="white-space: pre"><span > draw3D(f,v0,w0,[0.8,0.8,beamline(line,3)],[1,0,0]);</span></span></div></div></div><div class = 'S5'><span>in all other places we place a grey cylinder, illustrating the beam pipe, into the OpenSCAD model.</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S2'><span style="white-space: pre"><span > </span><span style="color: rgb(14, 0, 255);">otherwise </span><span style="color: rgb(2, 128, 9);">% draw beampipe</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > draw3Dpipe(f,v0,w0,0.05,beamline(line,3)); </span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > </span><span style="color: rgb(14, 0, 255);">end</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > </span><span style="color: rgb(14, 0, 255);">end</span></span></div></div><div class="inlineWrapper"><div class = 'S4'><span style="white-space: pre"><span style="color: rgb(14, 0, 255);">end</span></span></div></div></div><div class = 'S5'><span>After all magnets are placed into the figure and the OpenSCAD model, we draw a thick black line into the Matlab figure that follows the position of the reference particle, or equivalently, the center f the beam pipe. The we ensure that the scale in both x and z direction are equal and annotate the axes.</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S2'><span style="white-space: pre"><span >plot(vvpos(3,:),vvpos(1,:),</span><span style="color: rgb(170, 4, 249);">'k'</span><span >,</span><span style="color: rgb(170, 4, 249);">'LineWidth'</span><span >,2);</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >axis </span><span style="color: rgb(170, 4, 249);">equal</span></span></div></div><div class="inlineWrapper outputs"><div class = 'S7'><span style="white-space: pre"><span >xlabel(</span><span style="color: rgb(170, 4, 249);">'z [m]'</span><span >); ylabel(</span><span style="color: rgb(170, 4, 249);">'x [m]'</span><span >);</span></span></div><div class = 'S8'><div class="inlineElement eoOutputWrapper embeddedOutputsFigure" uid="869D837F" data-scroll-top="null" data-scroll-left="null" data-testid="output_0" style="width: 1319px;"><div class="figureElement"><div class="figureContainingNode" style="width: 560px; max-width: 100%; display: inline-block;"><div class="GraphicsView" data-dojo-attach-point="graphicsViewNode,backgroundColorNode" id="uniqName_333_30" widgetid="uniqName_333_30" style="width: 100%; height: auto;"><div class="ImageView" id="uniqName_333_32" widgetid="uniqName_333_32" style="width: 100%; height: auto;">
<canvas class="ImageView" data-dojo-attach-point="canvasViewNode" draggable="false" ondragstart="return false;" style="width: 100%; height: auto; display: none;"></canvas>
<img class="ImageView figureImage" data-dojo-attach-point="imageViewNode" draggable="false" ondragstart="return false;" style="width: 100%; height: auto; display: inline;" src="data:image/png;base64,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ve99L3/7t3/LTFVVfOUrX+Guu+5iZWWF2267jS9/+cu89a1vRURERDaHisskhMCVV17J9u3b2b59O9u3b2f79u1s376d7du3s337drZv38727dvZvn07v/d7v4eZcT5//dd/zerqKqurq6yurrK6usrq6ipf+MIXmPvgBz/I9773PR588EG+//3vc/PNNyMiIiKbR8Vl8g//8A/80R/9ERdq+/bt/Pu//zuvp+3bt1NVFSIiIrK5VGwQP/rRj/jkJz/Jnj172LNnD3v27GHPnj188pOfRERERGStig3g05/+NB//+Md59tlnee6553juued47rnneO6553juuecQERERWatiA9i/fz/f+MY32L9/P48//jiPP/44jz/+OI8//jiPPfYYIiIiImtVbABXXHEF73nPexARERG5EBUbwN/8zd/w2c9+lqNHjyIiIiJyPhUbwM0338xTTz3Fe97zHq6//nquv/56rr/+eq6//np27NiBiIiIyFoVG8DNN9/M7//+7/OP//iPPPTQQzz00EM89NBDPPTQQ3zrW99CREREZK2KDeCFF17g29/+NjfccAPXXXcd1113Hddddx3XXXcd1113HSIiIiJrVWwAf/AHf8AvfvELRERERC5ExQbwrW99iz/7sz/jwQcf5JlnnuGZZ57hmWee4ZlnnuGZZ55BREREZK2KDeDWW29l5qtf/Sq33HILt9xyC7fccgu33HILH/3oRxERERFZq2ID2L9/P6urq6yurrK6usrq6iqrq6usrq5y6NAhRERERNaquEw+9rGPcfjwYS7U//zP/7Bjxw5EREREKi6T//3f/2V1dZXDhw9z+PBhDh8+zOHDhzl8+DCHDx/m8OHDHD58mMOHD3P48GFWV1f59a9/jYiIiEjFZVJVFZ/97GfZvXs3u3fvZvfu3ezevZvdu3eze/dudu/eze7du9m9eze7d+/mT//0T9m2bRsiIiIiFZfJ//t//49Dhw5x6NAhDh06xKFDhzh06BCHDh3i0KFDHDp0iEOHDnHo0CEOHTrEoUOH+MlPfoKIiIhIhYiIiMgmUyEiIiKyyVSIiIiIbDIVG9zRo0cRERERWatiA6jrmh/96Eecbpom/viP/xgRERGRtSo2gBtvvJGPf/zj3H///cx9+tOf5i/+P3twG6rXVSZ++Jddi1JkCNIXp1/mXm11+RelELFi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">
</div></div></div></div></div></div></div></div><div class = 'S5'><span>In the last step we place a solid grey slab under the OpenSCAD model and close the OpenSCAD file.</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S2'><span style="white-space: pre"><span >fprintf(f,</span><span style="color: rgb(170, 4, 249);">'color([0.99,0.99,0.99]) translate([-75,-1.5,-50])'</span><span >);</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >fprintf(f,</span><span style="color: rgb(170, 4, 249);">'cube([100,0.2,100]);'</span><span >);</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >fclose(f);</span></span></div></div><div class="inlineWrapper"><div class = 'S4'><span style="white-space: pre"><span style="color: rgb(2, 128, 9);">%system('openscad layout.scad &')</span></span></div></div></div><div class = 'S5'><span>We can explore the OpenSCAD model by first installing the openscad program and the opening </span><span style=' font-family: monospace;'>layout.scad</span><span> from the menu or from the command line with </span><span style=' font-family: monospace;'>openscad layout.scad.</span><span> The following image shows the geometry rendered in opescad.</span><img class = "imageNode" src = "data:image/png;base64,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" width = "720.9" height = "190" alt = "layout.png" style = "vertical-align: baseline"></img></div><h2 class = 'S9'><span>Appendix</span></h2><h4 class = 'S10'><span>wmake()</span></h4><div class = 'S0'><span>The function </span><span style=' font-family: monospace;'>wmake()</span><span> receives the three angles </span><span style=' font-family: monospace;'>phix, phiy,</span><span> and </span><span style=' font-family: monospace;'>phiz</span><span> as input and returns the product </span><span style=' font-family: monospace;'>dw</span><span> of the three rotation matrices around the x, y, and z-axis, respectively. Inside the function the three rotation matrices are constructed and multiplied.</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S2'><span style="white-space: pre"><span style="color: rgb(14, 0, 255);">function </span><span >dw=wmake(phix,phiy,phiz)</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >wx=eye(3); </span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >wx(2,2)=cos(phix); wx(3,3)=wx(2,2);</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >wx(2,3)=sin(phix); wx(3,2)=-wx(2,3);</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >wy=eye(3); </span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >wy(1,1)=cos(phiy); wy(3,3)=wy(1,1);</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >wy(1,3)=sin(phiy); wy(3,1)=-wy(1,3);</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >wz=eye(3);</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >wz(1,1)=cos(phiz); wz(2,2)=wz(1,1);</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >wz(1,2)=sin(phiz); wz(2,1)=-wz(1,2);</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >dw=wx*wy*wz;</span></span></div></div><div class="inlineWrapper"><div class = 'S4'><span style="white-space: pre"><span style="color: rgb(14, 0, 255);">end</span></span></div></div></div><h4 class = 'S10'><span>wprop()</span></h4><div class = 'S0'><span>The function </span><span style=' font-family: monospace;'>wprop()</span><span> receives the position </span><span style=' font-family: monospace;'>vv</span><span> and orienation </span><span style=' font-family: monospace;'>ww</span><span> at the start of an element, as well as the change in position </span><span style=' font-family: monospace;'>dv</span><span> and orientation </span><span style=' font-family: monospace;'>dw</span><span> as input. It then returns the position </span><span style=' font-family: monospace;'>vnew</span><span> and orienation </span><span style=' font-family: monospace;'>wnew</span><span> at the exit of that element. </span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S2'><span style="white-space: pre"><span style="color: rgb(14, 0, 255);">function </span><span >[vnew,wnew]=wprop(vv,ww,dv,dw)</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >vnew=vv+ww*dv;</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >wnew=ww*dw;</span></span></div></div><div class="inlineWrapper"><div class = 'S4'><span style="white-space: pre"><span style="color: rgb(14, 0, 255);">end</span></span></div></div></div><h4 class = 'S10'><span>drawbox()</span></h4><div class = 'S0'><span>The function </span><span style=' font-family: monospace;'>drawbox()</span><span> reveives the starting position </span><span style=' font-family: monospace;'>v0</span><span> and the end position </span><span style=' font-family: monospace;'>v</span><span> of an element, as well as its </span><span style=' font-family: monospace;'>width</span><span> and </span><span style=' font-family: monospace;'>color</span><span>, specified as an array with</span><span style=' font-family: monospace;'> [r,g,b]</span><span> values, where </span><span style=' font-family: monospace;'>r,g,b</span><span> are number between 0 and 1. The function the draws a box in the current figure.</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S2'><span style="white-space: pre"><span style="color: rgb(14, 0, 255);">function </span><span >drawbox(v0,v,width,color)</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >box=zeros(2,6);</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >tmp=hypot(v(3)-v0(3),v(1)-v0(1));</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span style="color: rgb(14, 0, 255);">if </span><span >tmp > 1e-8</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > p=[v(3)-v0(3),0,-(v(1)-v0(1))]/tmp;</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > box(:,1)=[v0(3),v0(1)];</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > box(:,2)=[v0(3)+p(3)*width,v0(1)+p(1)*width];</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > box(:,3)=[v(3)+p(3)*width,v(1)+p(1)*width];</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > box(:,4)=[v(3)-p(3)*width,v(1)-p(1)*width];</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > box(:,5)=[v0(3)-p(3)*width,v0(1)-p(1)*width];</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span > box(:,6)=[v0(3),v0(1)];</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span style="color: rgb(14, 0, 255);">end</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >plot(box(1,:),box(2,:),color,</span><span style="color: rgb(170, 4, 249);">'LineWidth'</span><span >,3);</span></span></div></div><div class="inlineWrapper"><div class = 'S4'><span style="white-space: pre"><span style="color: rgb(14, 0, 255);">end</span></span></div></div></div><h4 class = 'S10'><span>draw3Dpipe()</span></h4><div class = 'S0'><span>The function </span><span style=' font-family: monospace;'>drawPipe()</span><span> receives a file handle</span><span style=' font-family: monospace;'> f</span><span>, the start position </span><span style=' font-family: monospace;'>v0</span><span> and orientation </span><span style=' font-family: monospace;'>w0</span><span>, as well as the </span><span style=' font-family: monospace;'>radius</span><span> and the </span><span style=' font-family: monospace;'>length</span><span> as input and places a grey cylinder into the OpenScad model in file</span><span style=' font-family: monospace;'> f</span><span>.</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S2'><span style="white-space: pre"><span style="color: rgb(14, 0, 255);">function </span><span >draw3Dpipe(f,v0,w0,radius,len)</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >fprintf(f,</span><span style="color: rgb(170, 4, 249);">'multmatrix([ [ %f , %f , %f , %f ],\n'</span><span >,w0(1,1),w0(1,2),w0(1,3),v0(1));</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >fprintf(f,</span><span style="color: rgb(170, 4, 249);">' [ %f , %f , %f , %f ],\n'</span><span >,w0(2,1),w0(2,2),w0(2,3),v0(2));</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >fprintf(f,</span><span style="color: rgb(170, 4, 249);">' [ %f , %f , %f , %f ],\n'</span><span >,w0(3,1),w0(3,2),w0(3,3),v0(3));</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >fprintf(f,</span><span style="color: rgb(170, 4, 249);">' [ %f , %f , %f , %f ] ])\n'</span><span >,0,0,0,1);</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >fprintf(f,</span><span style="color: rgb(170, 4, 249);">'translate([%f,%f,%f])\n'</span><span >,0,0,len/2);</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >fprintf(f,</span><span style="color: rgb(170, 4, 249);">'color([0.7,0.7,0.7])\n'</span><span >);</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >fprintf(f,</span><span style="color: rgb(170, 4, 249);">'cylinder($fn=30, h=%f,r=%f,center=true);\n'</span><span >,len,radius);</span></span></div></div><div class="inlineWrapper"><div class = 'S4'><span style="white-space: pre"><span style="color: rgb(14, 0, 255);">end</span></span></div></div></div><h4 class = 'S10'><span>draw3D()</span></h4><div class = 'S0'><span>The function draw3D() receives a file handle f, the start position vo and orienation w0 of a </span><span style=' font-family: monospace;'>box</span><span>, which is specified by its three dimensions. The last argument specifies the </span><span style=' font-family: monospace;'>color</span><span> of the element that is placed into the OpenSCAD model. One box is produces for the magnet and one for the pedestal below it.</span></div><div class="CodeBlock"><div class="inlineWrapper"><div class = 'S2'><span style="white-space: pre"><span style="color: rgb(14, 0, 255);">function </span><span >draw3D(f,v0,w0,box,color)</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >fprintf(f,</span><span style="color: rgb(170, 4, 249);">'multmatrix([ [ %f , %f , %f , %f ],\n'</span><span >,w0(1,1),w0(1,2),w0(1,3),v0(1));</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >fprintf(f,</span><span style="color: rgb(170, 4, 249);">' [ %f , %f , %f , %f ],\n'</span><span >,w0(2,1),w0(2,2),w0(2,3),v0(2));</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >fprintf(f,</span><span style="color: rgb(170, 4, 249);">' [ %f , %f , %f , %f ],\n'</span><span >,w0(3,1),w0(3,2),w0(3,3),v0(3));</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >fprintf(f,</span><span style="color: rgb(170, 4, 249);">' [ %f , %f , %f , %f ] ])\n'</span><span >,0,0,0,1);</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >fprintf(f,</span><span style="color: rgb(170, 4, 249);">'translate([%f,%f,%f])\n'</span><span >,-box(1)/2,-box(2)/2,0);</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >fprintf(f,</span><span style="color: rgb(170, 4, 249);">'color([%f,%f,%f]){\n'</span><span >,color(1),color(2),color(3));</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >fprintf(f,</span><span style="color: rgb(170, 4, 249);">'cube([%f,%f,%f]);\n'</span><span >,box(1),box(2),box(3));</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >fprintf(f,</span><span style="color: rgb(170, 4, 249);">'translate([%f,%f,%f]) '</span><span >,box(1)/2,-0.5,box(3)/2);</span></span></div></div><div class="inlineWrapper"><div class = 'S3'><span style="white-space: pre"><span >fprintf(f,</span><span style="color: rgb(170, 4, 249);">'cube([%f,%f,%f],center=true);}\n'</span><span >,box(1)/3,1,box(3)/3);</span></span></div></div><div class="inlineWrapper"><div class = 'S4'><span style="white-space: pre"><span style="color: rgb(14, 0, 255);">end</span></span></div></div></div>
<br>
<!--
##### SOURCE BEGIN #####
%%
% Companion software for "Volker Ziemann, _Hands-on Accelerator physics using
% MATLAB, CRCPress, 2019_" (https://www.crcpress.com/9781138589940)
%% 3D-geometry of a beam line (Section 2.1)
% Volker Ziemann, 211123
%
% In this example we discuss a program the produce the three-dimensional layout
% of an accelerator. It produces a top view of the beamline or ring and writes
% an input file for the solid-modeling program OpenSCAD, which is available from
% <https://openscad.org. https://openscad.org.> It also maintains a list of start
% and end coordinates of each element in the laboratory frame.
%
% As an example, let us define a ring that consists of a sequence of quadrupole
% and dipole magnets known as a FODO lattice. We define one FODO cell as a sequence
% of element, distinguished by their code, which is the entry in the first column
% of the following array |fodo,| where code =1 indicates a beam pipe, code=5 indicates
% a quadrupole, and code=4 indicates dipole magnet. The second column denotes
% how many times the same element should be repeated, which is not used here,
% but is convenient later in the book. The third column indicates the length of
% the element and the fourth column its strength. We will use this format to describe
% beam lines throughout the book. In this example the only interesting parameter
% in the fourth column is the deflection angle of the dipole magnet, because it
% changes the direction of the reference system. The quadrupole excitations are
% not used here, because they do not change the direction of the reference orbit.
clear;
fodo=[ 1 1 2.5 0 ;
5 1 1.0 0.0777; % quadrupole
1 1 1.5 0 ;
4 1 2.0 30; % dipole
1 1 1.5 0;
5 1 1.0 -0.1472; % quadrupole
1 1 2.5 0;];
%%
% Having defined the fundamental cell with a 30-degree dipole, we realize that
% we need twelve cells to construct a whole ring. The resulting array is called
% beamline. We also count the number of lines and elements. The latter is needed,
% if we had used repeat codes in the scond column that differ from unity.
beamline=repmat(fodo,12,1);
nlines=size(beamline,1); % number of lines
nele=sum(beamline(:,2))+1; % number of elements
%%
% The next lines allocate space for the coordinates |vvpos()| of the elements
% in beamline, set the origin |vv| where we start and the direction |ww|, which
% is specified by a rotation matrix. It is easy to visualize vv and ww as the
% location of the reference particle and its direction of travel; the columns
% of the matrix ww denote the three unit vectors that define a tripod that "rides
% on the reference particle."
vvpos=zeros(3,nele); % element positions
vv=[0;0;0]; % x,y,z or origin
ww=eye(3); % orientation of tripod
%%
% Now we open a file with the name |layout.scad| to which we write OpenSCAD
% commands that create the 3D geometry. We also specify 'hold on' in order to
% add elements to the MATLAB plot with the top view onto the ring.
f=fopen('layout.scad','w'); % open output file for 3D view
hold on % can add elements to the same plot
%%
% After inilializing the element counter |ic|, we loop over the lines and segments
% in the |beamline|.
ic=1; % element counter
for line=1:nlines % loop over input elements
for seg=1:beamline(line,2) % loop over repeat-count
%%
% Inside the loop, we record the position |v0| and orientation |w0| of the previous
% point, update the lement counter |ic|, and check the code in the first column
% of |beamline| of the presently considered element. If it is an element that
% does not change the direction of the particle, such as drift spaces, quadrupoles,
% or solenoids, we only record by how much the position advances in |dv|, and
% note that the orientation stays the same with |dw|.
v0=vv; w0=ww; % remember previous point
ic=ic+1;
switch beamline(line,1)
case {1,2,5,7} % drift, quadrupole, solenoid
dv=[0;0;beamline(line,3)];
dw=eye(3);
%%
% If the element is a dipole magnet and the deflection angle is non-zerom we
% calculate its bending radius rho and update the position with |dv| along the
% sagitta of the trajectory in the magnet. The orientation of the coordinate system
% changes by the angle phi around the vertical axis, where we use |wmake()|, defined
% in the Appendix, to create the rotation matrix. For the OpenSCAD file we also
% need the rotation with half the angle phi. Note that if the rotation angle is
% less than $10^{-7}$ radians the element is treated as straight element.
case 4 % sector dipole
phi=beamline(line,4)*pi/180; % convert to radians
if abs(phi)>1e-7
rho=beamline(line,3)/phi; % bending radius
dv=[rho*(cos(phi)-1);0.0;rho*sin(phi)]; % sagitta
dw=wmake(0,-phi,0);
dw2=wmake(0,-phi/2,0); % for 3D renderer only
else
dv=[0;0;beamline(line,3)];
dw=eye(3);
end
%%
% Occasioanlly, we need a coordinate rotation, for example to make a vertically
% deflecting dipole by sandwiching a horizontally deflecting dipole between two
% $90^o$ rotations with opposite sign. If an element with unknown code in the
% first column appears, a short warning is displayed and neither position nor
% orientation are changed.
case 20 % coordinate rotation
dv=[0;0;0];
dw=wmake(0,0,beamline(line,4)*pi/180);
otherwise
disp('unsupported code')
dv=[0;0;0]; dw=eye(3);
end
%%
% After setting up the differential changes of position |dv| and orientation
% |dw|, we use them to update the corresponding absolute values |vv| and |ww|,
% which are defined at the end point of the currently considered element.
[vv,ww]=wprop(vv,ww,dv,dw);
vvpos(:,ic)=vv';
%%
% Now it's time to add the elements to the top-down view and the OpenSCAD model,
% which we do for dipoles with code 4 and for quadrupoles with code 5 in the following
% switch statement.
switch beamline(line,1)
%%
% In the case statement for the dipole the drawbox() command plots the blue
% rectangle at the position an orientation of the magnet in the Matlab figure.
% The call to draw3D() places a blue box and a pedestal in the OpenSCAD model.
case 4 % sector dipole
drawbox(vv,v0,0.5,'b');
draw3D(f,v0,w0*dw2,[1.,0.6,beamline(line,3)],[0,0,1]);
%%
% Likewise does the following section place a red rectangle in the Matlab figure
% and a red box on a pedestal.
case 5 % quadrupole
drawbox(vv,v0,0.7,'r');
draw3D(f,v0,w0,[0.8,0.8,beamline(line,3)],[1,0,0]);
%%
% in all other places we place a grey cylinder, illustrating the beam pipe,
% into the OpenSCAD model.
otherwise % draw beampipe
draw3Dpipe(f,v0,w0,0.05,beamline(line,3));
end
end
end
%%
% After all magnets are placed into the figure and the OpenSCAD model, we draw
% a thick black line into the Matlab figure that follows the position of the reference
% particle, or equivalently, the center f the beam pipe. The we ensure that the
% scale in both x and z direction are equal and annotate the axes.
plot(vvpos(3,:),vvpos(1,:),'k','LineWidth',2);
axis equal
xlabel('z [m]'); ylabel('x [m]');
%%
% In the last step we place a solid grey slab under the OpenSCAD model and close
% the OpenSCAD file.
fprintf(f,'color([0.99,0.99,0.99]) translate([-75,-1.5,-50])');
fprintf(f,'cube([100,0.2,100]);');
fclose(f);
%system('openscad layout.scad &')
%%
% We can explore the OpenSCAD model by first installing the openscad program
% and the opening |layout.scad| from the menu or from the command line with |openscad
% layout.scad.| The following image shows the geometry rendered in opescad.
%% Appendix
% wmake()
% The function |wmake()| receives the three angles |phix, phiy,| and |phiz|
% as input and returns the product |dw| of the three rotation matrices around
% the x, y, and z-axis, respectively. Inside the function the three rotation
% matrices are constructed and multiplied.
function dw=wmake(phix,phiy,phiz)
wx=eye(3);
wx(2,2)=cos(phix); wx(3,3)=wx(2,2);
wx(2,3)=sin(phix); wx(3,2)=-wx(2,3);
wy=eye(3);
wy(1,1)=cos(phiy); wy(3,3)=wy(1,1);
wy(1,3)=sin(phiy); wy(3,1)=-wy(1,3);
wz=eye(3);
wz(1,1)=cos(phiz); wz(2,2)=wz(1,1);
wz(1,2)=sin(phiz); wz(2,1)=-wz(1,2);
dw=wx*wy*wz;
end
% wprop()
% The function |wprop()| receives the position |vv| and orienation |ww| at the
% start of an element, as well as the change in position |dv| and orientation
% |dw| as input. It then returns the position |vnew| and orienation |wnew| at
% the exit of that element.
function [vnew,wnew]=wprop(vv,ww,dv,dw)
vnew=vv+ww*dv;
wnew=ww*dw;
end
% drawbox()
% The function |drawbox()| reveives the starting position |v0| and the end position
% |v| of an element, as well as its |width| and |color|, specified as an array
% with |[r,g,b]| values, where |r,g,b| are number between 0 and 1. The function
% the draws a box in the current figure.
function drawbox(v0,v,width,color)
box=zeros(2,6);
tmp=hypot(v(3)-v0(3),v(1)-v0(1));
if tmp > 1e-8
p=[v(3)-v0(3),0,-(v(1)-v0(1))]/tmp;
box(:,1)=[v0(3),v0(1)];
box(:,2)=[v0(3)+p(3)*width,v0(1)+p(1)*width];
box(:,3)=[v(3)+p(3)*width,v(1)+p(1)*width];
box(:,4)=[v(3)-p(3)*width,v(1)-p(1)*width];
box(:,5)=[v0(3)-p(3)*width,v0(1)-p(1)*width];
box(:,6)=[v0(3),v0(1)];
end
plot(box(1,:),box(2,:),color,'LineWidth',3);
end
% draw3Dpipe()
% The function |drawPipe()| receives a file handle |f|, the start position |v0|
% and orientation |w0|, as well as the |radius| and the |length| as input and
% places a grey cylinder into the OpenScad model in file |f|.
function draw3Dpipe(f,v0,w0,radius,len)
fprintf(f,'multmatrix([ [ %f , %f , %f , %f ],\n',w0(1,1),w0(1,2),w0(1,3),v0(1));
fprintf(f,' [ %f , %f , %f , %f ],\n',w0(2,1),w0(2,2),w0(2,3),v0(2));
fprintf(f,' [ %f , %f , %f , %f ],\n',w0(3,1),w0(3,2),w0(3,3),v0(3));
fprintf(f,' [ %f , %f , %f , %f ] ])\n',0,0,0,1);
fprintf(f,'translate([%f,%f,%f])\n',0,0,len/2);
fprintf(f,'color([0.7,0.7,0.7])\n');
fprintf(f,'cylinder($fn=30, h=%f,r=%f,center=true);\n',len,radius);
end
% draw3D()
% The function draw3D() receives a file handle f, the start position vo and
% orienation w0 of a |box|, which is specified by its three dimensions. The last
% argument specifies the |color| of the element that is placed into the OpenSCAD
% model. One box is produces for the magnet and one for the pedestal below it.
function draw3D(f,v0,w0,box,color)
fprintf(f,'multmatrix([ [ %f , %f , %f , %f ],\n',w0(1,1),w0(1,2),w0(1,3),v0(1));
fprintf(f,' [ %f , %f , %f , %f ],\n',w0(2,1),w0(2,2),w0(2,3),v0(2));
fprintf(f,' [ %f , %f , %f , %f ],\n',w0(3,1),w0(3,2),w0(3,3),v0(3));
fprintf(f,' [ %f , %f , %f , %f ] ])\n',0,0,0,1);
fprintf(f,'translate([%f,%f,%f])\n',-box(1)/2,-box(2)/2,0);
fprintf(f,'color([%f,%f,%f]){\n',color(1),color(2),color(3));
fprintf(f,'cube([%f,%f,%f]);\n',box(1),box(2),box(3));
fprintf(f,'translate([%f,%f,%f]) ',box(1)/2,-0.5,box(3)/2);
fprintf(f,'cube([%f,%f,%f],center=true);}\n',box(1)/3,1,box(3)/3);
end
##### SOURCE END #####
-->
</div></body></html>