Subject | : その8 |
Article No | : 73 |
Date | : 2006/01/30(Mon) 20:04:48 |
Contributor | : Kentaro Harada <
> |
その8:トラッキングの方法(その1) これでほぼゴールです。(というか、はじめからこのコマンドの使い方 だけで十分だったという話も……^_^;) 挿入光源の高次の磁場を手で入れる 場合、挿入光源直前まで転送してから、挿入光源部分はスクリプト内で手入力 した数式で転送して、またリング最後まで転送、とすればできます。 実際に粒子の座標を入れて、トラッキングします。サンプルとして、 4極磁石1個分だけトラックしてみて、転送行列が出てくることを確かめます。 TrackParticles[{始点要素番号、転送前座標}、終点要素番号] で、結果は{終点要素番号、転送後座標}です。結果のリストも TrackParticles[]にそのまま投げられる形です。 座標は {{x1,x2,x3...},{x'1,x'2,x'3..},{y1,y2,y3...},{y'1,y'2,y'3...}, {z1,z2,z3..},{dP/P1,dP/P2,dP/P3...},{生死1,生死2,生死3...}} という7つのリストからなります。粒子を1つだけ転送するなら、 {{x1},{x'1},{y1},{y'1},{z1},{dP/P1},{1}} となります。粒子の運動がある範囲内(確か、水平垂直 3m 以内?)に 留まっていて安定に生きている場合、生死は1、それを飛び出して お亡くなりになった場合は生死にゼロが入ります。ゼロが入った 粒子に対しては計算をしません。(転送後も転送前そのままです。) 始点と終点が同じ番号の場合、リングを1周して戻ってきます。また、 始点の方が終点よりも後にある場合も、リング最後まで転送し、 最初に戻って終点まで転送します。粒子1個を1周転送したい場合は、 TrackParticles[{1,{{x1},{x'1},{y1},{y'1},{z1},{dP/P1},{1}}},1] です。 (スクリプト) rqk = Sqrt[LINE["K1","Q2"]/LINE["L", "Q2"]]; (粒子を通す4極として、Q2を選びました。√Kを計算しておきます。 SAD では K = B'L/(B rho) なので L で割ってルートを取ります。) ql = LINE["L", "Q2"]; (長さです。) Print[rqk, ql];
qkmath = {{0,0},{0,0}}; qkmatv = {{0,0},{0,0}}; qkmath[1] = {Cos[rqk * ql],Sin[rqk * ql]/rqk}; qkmath[2] = {-rqk * Sin[rqk * ql], Cos[rqk * ql]}; qkmatv[1] = {Cosh[rqk * ql], Sinh[rqk * ql]/rqk}; qkmatv[2] = {rqk * Sinh[rqk * ql], Cosh[rqk * ql]}; (言うまでもなく、ごく普通の4極電磁石の転送行列です。)
Print[qkmath[1,1],qkmath[1,2],0,0]; Print[qkmath[2,1],qkmath[2,2],0,0]; Print[0,0,qkmatv[1,1],qkmatv[1,2]]; Print[0,0,qkmatv[2,1],qkmatv[2,2]];
Print[Det[qkmath], Det[qkmatv]]; (念のため、行列式が1になることを確認。)
before = {5,{{0.001,0,0,0},{0,0.001,0,0},{0,0,0.001,0},{0,0,0,0.001},{0,0,0,0},{0,0,0,0},{1,1,1,1}}}; (LINE の中で Q2 の要素番号は5番です。before は5番の「入り口」での 値ということです。初振幅は 1mm、初角度発散も 1mrad とします。(実は これでも振幅依存項が効いてきてしまう値です。) x,,x',y,y' のどれか 1つだけに値を入れて転送(それを4粒子分)することで、転送行列を取り 出せます。) after = TrackParticles[before,6]; (6番(要は Q2 の出口まで転送します。)
after[2] = after[2] * 1000; (1mm、1mrad だったので、1000 倍して表示します。)
Print[after[2,1,1],after[2,1,2],after[2,1,3],after[2,1,4]]; Print[after[2,2,1],after[2,2,2],after[2,2,3],after[2,2,4]]; Print[after[2,3,1],after[2,3,2],after[2,3,3],after[2,3,4]]; Print[after[2,4,1],after[2,4,2],after[2,4,3],after[2,4,4]]; (これらは振幅依存の高次項の影響を除けば、手計算した転送行列と 等しくなっています。)
なお、トラッキングは6次元計算です。理想的にカップリングがない場合、 初座標の指定で水平と垂直は独立のままに保てますが、縦方向は必ず 混じってしまいます。(と言っても桁の問題ですが。)
|