Conference Room SAD
[thread display] [new arrival display] [word search] [past log] [管理用]

Subject その8
Date: 2006/01/30(Mon) 20:04:48
ContributorKentaro 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次元計算です。理想的にカップリングがない場合、
初座標の指定で水平と垂直は独立のままに保てますが、縦方向は必ず
混じってしまいます。(と言っても桁の問題ですが。)


- 関連一覧ツリー (Click ▼ to display all articles in a thread.)