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

Subject その7
Date: 2006/01/30(Mon) 20:04:14
ContributorKentaro Harada < >

  その7:ダイナミックアパーチャサーベイ(方法その1)
 
  関数 DynamicApertureSurvey[] を用いたダイナミックアパーチャ
サーベイの方法について述べる。
 (トラッキングには RF の DPHI が反映されます。入れたままで計算
すると、加減速されてビームが落ちます。また、Xは水平、Yは垂直、
Zは縦(エネルギー・RF位相方向)というノーテーションです。)
 
(スクリプト)
(初期値(ビームの振幅)は全て「シグマ」単位で指定します。シグマは
 自然エミッタンスを考慮に入れた時のビームサイズですが、分散関数と
 エネルギー広がりの分は考えません。以下が単位換算です。)
w = EMITX;
sigx = Sqrt[Twiss["BX",1] * w];
sigy = Sqrt[Twiss["BY",1] * w];
dp = 0.01 / SIGE;
 (普通は垂直エミッタンスゼロなので、水平エミッタンスにβをかけて
 ルートを取ればビームサイズです。Z方向については、「エネルギー広がり」が
 Z方向1シグマの時のエネルギーのずれ具合なので、0.01 をエネルギー
 広がりで割ると、エネルギーのずれが1%の時に何シグマか、が分かります。
 sigx、sigy は1シグマと言った時の振幅 [m] 、dp はエネルギーのずれが
 1%の時が何シグマに対応するか、です。(考えてみれば、変数名 dp は DP が
 あるので避けるべきですね。))

DynamicApertureSurvey[サーベイ範囲、ターン数、結果出力先] です。
  サーベイ結果出力先は画面(6番)にし、ターン数は1000ターンまで
計算します。
  範囲は、{{xmin, xmax}, {ymin, ymax},{Z方向}}で指定します。{Z方向}の
値1つにつき、1行結果を出します。つまり、-1%, 0%, +1% と指定すれば、
3行結果が出ます。今回はバケットが 1.3% なので、-1.5% から +1.5%
まで、0.5% おきに5点計算(5行表示)します。振幅方向ですが、
(xmax,ymax)、(xmin, ymin) で指定される2点間を50分割して、両端が
あるので51点を計算します。必ず50分割します。そして、各点について
何ターンまわったか(振幅方向に 3m を越えたら死亡と認定)計算します。
結果は100ターン毎に 1, 2, 3,..., 8, 9, A, a, B, b... と表示します。
100ターンはまわった(200ターンまでの間で死亡)なら1、1000ターンまわり
きれば A と表示します。なお、結果を自動の画面表示だけでなくて数字で
表示すると、何ターン目で死んだか具体的に分かります。計算は外側
(xmax, ymax)の点から始めて、順に内側へ進みます。Z方向1点につき、
最大で51点計算しますが、普通は振幅方向外側から順に何点か連続して
1000 ターンまわれば、それよりも小さい振幅では全部まわるだろうという
推測をします。何点連続でまわりきったらその内側の点の計算を省くか、が
DAPWIDTH です。51 だと推測せずに全部計算、10 にすると、10点連続で
A なら、内側は省いて * にします。外側何シグマの振幅から内側でビームが
生き残ったか(ダイナミックアパーチャ)を「スコア」として表示します。)

DAPWIDTH = 51;

FFS["cell calc emit"];
zrange = Range[-1.5 * dp, 1.6 * dp, dp /2];
range = {{0,100},{1,1},zrange};
resx = DynamicApertureSurvey[range,1000,Output->6];

(出力は以下の通り)
Range Xmin: 0.000 Xmax: 100.000
(Ymin: 1.000 Ymax: 1.000)
     ((x,y) = (0, 1)と(100, 1)シグマ間を50分割。ここでは水平
   方向の値を求めたいのですが、y = 0 としてしまうと、完全に水平
   面内に運動が制限され、非常によくまわる ^_^; 結果が出ます。現実
   的にする為に、必ず1シグマくらいずらしておきます。)
Zmin: -16.346 Zmax: 16.346
      (DP/P 1% は 10.9 シグマです。-1.5% - +1.5% まで。)
Display: 100 turns/character
        (水平垂直振幅方向)→
NZ 0----!----1----!----2----!----3----!----4----!----5
           (←50分割(51点)を計算→)
↓(Z方向)
-16.35 0 333333333333222222000000000000000000000000000000000
-10.90 17 AAAAAAAAAAAAAAAAA0000000000000000000000000000000000
-5.45 16 AAAAAAAAAAAAAAAA00000000000000000000000000000000000
0.00 16 AAAAAAAAAAAAAAAA00000000000000000000000000000000000
5.45 16 AAAAAAAAAAAAAAAA10000000000000000000000000000000000
10.90 17 AAAAAAAAAAAAAAAAA1000000000000000000000000000000000
16.35 7 AAAAAAA8A6AAA55651100000000000000000000000000000000
NZ 0----!----1----!----2----!----3----!----4----!----5
Score: 89

  (-1.5%(バケットの外) では、小振幅でも 300ターンくらいで
落ちてしまいます。バケット内では、およそ運動量に依らずに 17-16 の
「スコア」になっています。(score - 1) * max / 50 がまわった振幅の
シグマの値です。すなわち、スコアが 17 なら、32 シグマまで "A" で
まわったということです。)

Do[
Print[zrange[i],resx[2,2,i,2],(resx[2,2,i,2] - 1) * sigx * 1000 * 2];
    (一応、運動量(シグマ)、スコア、実振幅 [mm] を書き出します。1000を
    かけるのは mm にしたいから、2は100シグマを50分割したスコアだからです。)
,{i,1,Length[zrange]}];
range = {{1,1},{0,100},zrange};
resy = DynamicApertureSurvey[range,1000,Output->6];
Do[
Print[zrange[i],resy[2,2,i,2],(resy[2,2,i,2] - 1) * sigy * 1000 * 2];
,{i,1,Length[zrange]}];
 
  LINE の始点がダイナミックアパーチャの始点です。βx 1.1m、βy 0.36m なので
水平7mm、垂直5mmとか、小さいです。入射点のβはもっと大きいですか?
 
  なお、お気づきかも知れませんが、これは「XY面内」でアパーチャサーベイを
するには非常に不便にできています。(それをしたい時は別途スクリプトを書いてDoで
まわします。)


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