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

Subject その6
Date: 2006/01/30(Mon) 20:03:40
ContributorKentaro Harada < >

  その6:チューンのマッチングとモジュール化
 
  チューンをマッチングする。

ON LOG;
ON RFSW RADCOD RAD COD FLUC DAPERT;! BIPOL;
FFS;
$FORM = "15.10";
PageWidth = 1999;

(色収差補正とノーマルセルのチューンのマッチングをモジュール化する。
ChromCorrect[]:=(
Print["Chromaticity Correction"];
FFS["cell calc emit;"];
{nx0, ny0}=Twiss[{"NX","NY"},"***"]/2/Pi;
FFS["FIT;"];
FFS["NX nx0 2;"];
FFS["NY ny0 2;"];
FFS["DP=0.0001;"];
FFS["FREE S*;"];
FFS["GO;"];
FFS["FITP 1;"];
);
 (前回のスクリプトをモジュール化しただけです。)
(モジュールの定義の仕方は以下の通り。
  モジュール名[受け渡し変数]:=(
         内容
         );
   受け渡し変数がない場合、変数はグローバルとローカルで完全に区別が
  なくなります。モジュール外の変数をそのまま呼び出せ、値を変えて、
  ということが可能です。何か受け渡すと、少し複雑になります。
   また、";"の意味ですが、関数やモジュールの中か外で変わります。
1、直接 FFS の上で";"がある場合、コマンドや関数を復唱しないという意味に
 なります。
 例えば、
  a=1
  a=2;
 と言うのを FFS 上で実行すると、
  a=1
 Out[4]:= 1
  a=2; 
 など、";"を付けないと出力を復唱します。実は FFS ではコマンドを打つと
 まずは全て IN[] という関数に引き渡されます。その後、それが変数なのか、
 コマンドなのか、関数なのか判断され、それぞれの実行がなされます。
 IN[] が読みとった内容を画面に書き出す(OUT[]として)かどうかが";"に
 よって決まります。
2、関数やモジュールの中で";"をつけると、それはコマンド同士の行を繋げると
 いう意味になります。実を言えば、関数やモジュール内では全てを繋げないと
 いけません。それが";"です。(どこかの行に";"を付け忘れると、エラーに
 なります。ただし、モジュールの場合、最後の行に値を持ってきて、";"を
 付けないと、それは返値になります。例えば、
ModulePlus[a_,b_]:=(
Print[a, "plus", b];
a+b
);
Print[ModulePlus[1,2]];
 等とすると、"a + b"が返値となり、すなわち、ModulePlus[]を一つの数として
 扱うことができるようになります。(ModulePlus[1,2] + 2 とかできる。)
  今回のモジュール(色収差補正とチューンのマッチング)では返値はありません。)

MatchingNcellTune[]:=(
Print["Matching Tune to ",tunex,tuney,"!"];
FFS["cell calc emit;"];
FFS["fit MKD EX 0;"];
FFS["fit MKD EPX 0;"];
    (MKD (偏向磁石入り口に付けたマーク要素)で分散を消す。)
FFS["fit NX tunex;"];
FFS["fit NY tuney;"];

! FFS["fit Q2 BX 15"];
! FitValue["Q2","BX",dp_,vgoal_,vnow_]:=If[vnow<5,5,If[vnow>30,30,Null]];
    (2行1組。値を「ある値からある値までの間であればいい」というマッチングを
    する場合、こんな風に書きます。上の行で「フィットに使う」という宣言をして、
    下の行で上限と下限を指定します。上の行の行き先値(bx=15)はこの場合、
    使われません。下の行はほとんど呪文で、
    FitValue["場所","パラメータ",dp_,vgoal_,vnow_]:=If[vnow<下限,下限,If[vnow>上限,上限,Null]];
    と書きます。どうして2回ずつ書くのかは、訊かないでください。^_^;この場合、
    Q2の場所で水平βを5mから30mの間で抑えなさい、というコマンドに
    なります。)
! FFS["fit Q4 BX 15"];
! FitValue["Q4","BX",dp_,vgoal_,vnow_]:=If[vnow<5,5,If[vnow>25,25,Null]];
! FFS["fit Q1 BY 10"];
! FitValue["Q1","BY",dp_,vgoal_,vnow_]:=If[vnow<5,5,If[vnow>25,25,Null]];
! FFS["fit Q2 BY 15"];
! FitValue["Q2","BY",dp_,vgoal_,vnow_]:=If[vnow<5,5,If[vnow>30,30,Null]];
    (条件付けるとマッチングがうまくないので、外してしまいました。)
FFS["free Q*;"];
FFS["go;"];
! FFS["SAVE"];
FFS["cell calc"];
);

Do[
Do[
FFS["USE NCELL;"];
   (マッチング毎に4極の値はリセット。(SAVE せずに USE をやる。))
MatchingNcellTune[];
   (モジュール呼び出して、マッチング。)
ChromCorrect[];
   (モジュール呼び出して、色収差補正)
Print[tunex, tuney, Twiss["NX","$$$"]/2/Pi,Twiss["NY","$$$"]/2/Pi,EMITX, LINE["K1","Q1"],LINE["K1","Q2"],LINE["K1","Q3"],LINE["K1","Q4"],LINE["K2","SF"],LINE["K2","SD"]];
   (画面に結果を書き出します。)
datafile = OpenAppend["result.txt"];
   (ファイルに結果を書き出します。OpenAppend[]は繋げ書き、OpenWrite[]はファイルを
   消して新しく作ります。)
Write[datafile,tunex, tuney, Twiss["NX","$$$"]/2/Pi,Twiss["NY","$$$"]/2/Pi,EMITX, LINE["K1","Q1"],LINE["K1","Q2"],LINE["K1","Q3"],LINE["K1","Q4"],LINE["K2","SF"],LINE["K2","SD"]];
Close[datafile];
   (いちいち開いて閉じて、をしないと、どうもうまく書けない時があります。本当は
   ループの外で開いて、ループが終わったら閉じたいのですが……)
,{tuney, 0.6, 0.91,0.05}];
,{tunex, 1.1, 1.41, 0.05}];
   (チューンでループします。)
stop;
stop;


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