東京大学高輝度光源計画
加速器の概要

挿入光源の非線形効果

  アンジュレーター磁場の非線形効果を計算するためのSADのスクリプト。

SAD script

!+
!     Matching & DA survey
!-

 ON  LOG;
 ON  RFSW RADCOD RAD COD FLUC DAPERT BIPOL;
 FFS;
      htune = 12.26;
      vtune = 11.10;
  nxnohn = 0;
  nynohn = 0;
  nxnono = (htune - 2)/24;
  nynono = (vtune - 2)/24;
  com=OpenWrite["res_Y_high.txt"];
vari = 0.000;
num = 0;
repeat 10;
  repeat 30;
  num = num + 1;
  vari = vari + 0.0001;
  loo = Sqrt[1/vari];
  looinv = Sqrt[vari];
USE LCELLDL;
  cell calc;
    Print["******************************"];
    Print[num,",",loo,",",looinv,",",0.023 *looinv/Sqrt[2]];
    Print["******************************"];
  LINE["ANGLE","B1L"] =  0.023 *looinv/Sqrt[2];
  LINE["ANGLE","B2L"] = -0.023 *looinv/Sqrt[2];
  LINE["ANGLE","B2IL"]= -0.023/2*looinv/Sqrt[2];
  LINE["ANGLE","B2FL"]= -0.023/2*looinv/Sqrt[2];
  cell calc;
SAVE ALL;
USE NCELL;
  cell;
  calc;
  fit NX nxnono;
  fit NY nynono;
  fit MARKN AX 0;
  fit MARKN AY 0;
  fit MARKN EPX 0;
  free QF QD;
  go;
  fix q*;
  {nxnohn, nynohn}=Twiss[{"NX","NY"},"***"]/4/Pi;
SAVE;
USE LCELLUR;
   ins;
   calc;
   fit MARKD EX 0;
   fit MARKD EPX 0;
   free QH1L QH2L;
   go;
   fix QH*;
SAVE;
USE NCELL;
   cell;
   calc;
   fix;
  {nxnohn, nynohn}=Twiss[{"NX","NY"},"***"]/4/Pi;
SAVE;
USE LCELLUR;
  ins;
  calc;
  nxnolh = 0.5 + nxnohn;
  nynolh = 0.5 + nynohn;
  fit MARKL AX 0;
  fit MARKL AY 0;
  fit MARKL EX 0;
  fit MARKL EPX 0;
  fit MARKL NX nxnolh;
  fit MARKL NY nynolh;
  free QH* QG*;
  go;
  fix Q*;
SAVE;
USE LCELLU;
  LINE["K1","QB1L"] = LINE["K1","QG1L"];
  LINE["K1","QB2L"] = LINE["K1","QG2L"];
  LINE["K1","QB3L"] = LINE["K1","QG3L"];
  LINE["K1","QB4L"] = LINE["K1","QG4L"];
  LINE["K1","QB5L"] = LINE["K1","QG5L"];
  LINE["K1","QB6L"] = LINE["K1","QG6L"];
  LINE["K1","QB7L"] = LINE["K1","QG7L"];
  LINE["K1","QA1L"] = LINE["K1","QH1L"];
  LINE["K1","QA2L"] = LINE["K1","QH2L"];
SAVE ALL;
USE LCELLDL;
   ins;
   calc;
   fit MARKD EX 0;
   fit MARKD EPX 0;
   free QD1L QD2L;
   go;
   fix QD*;
SAVE;
USE LCELLDL;
  ins;
  calc;
  nxnolh = 0.5 + nxnohn;
  nynolh = 0.5 + nynohn;
  fit MARKL AX 0;
  fit MARKL AY 0;
  fit MARKL EX 0;
  fit MARKL EPX 0;
  fit MARKL NX nxnolh;
  fit MARKL NY nynolh;
  fit QC4L BX 15;
  fit QC4L BY 15;
FitValue["QC4L","BX",dp_,vgoal_,vnow_]:=If[vnow<0,0,If[vnow>15,15,Null]];
FitValue["QC4L","BY",dp_,vgoal_,vnow_]:=If[vnow<0,0,If[vnow>15,15,Null]];
  free QD1L QD2L QC1L QC2L QC3L QC4L QC5L QC6L QC7L;
  go;
  fix Q*;
  {nxnomd, nynomd}=Twiss[{"NX","NY"},"MARKD"]/2/Pi;
  Print[nxnohn,",",nynohn,",",nxnomd,",",nynomd,",",nxnolh,",",nynolh];
  S* 0;
  SD 0;
SAVE;
USE LCELLD;
  LINE["K1","QE1L"] = LINE["K1","QC1L"];
  LINE["K1","QE2L"] = LINE["K1","QC2L"];
  LINE["K1","QE3L"] = LINE["K1","QC3L"];
  LINE["K1","QE4L"] = LINE["K1","QC4L"];
  LINE["K1","QE5L"] = LINE["K1","QC5L"];
  LINE["K1","QE6L"] = LINE["K1","QC6L"];
  LINE["K1","QE7L"] = LINE["K1","QC7L"];
  LINE["K1","QF1L"] = LINE["K1","QD1L"];
  LINE["K1","QF2L"] = LINE["K1","QD2L"];
SAVE ALL;
USE SCELLH;
  ins;
  calc;
  nxnolh = 0.5 + nxnohn;
  nynolh = 0.25 + nynohn;

  fit MARKL AX 0;
  fit MARKL AY 0;
  fit MARKL NX nxnolh;
  fit MARKL NY nynolh;
  fit MARKL EPX 0;
  free QJ* QK*;
  go;
  fix Q*;
  {nxnomd, nynomd}=Twiss[{"NX","NY"},"MARKD"]/2/Pi;
  Print[nxnohn,",",nynohn,",",nxnomd,",",nynomd,",",nxnolh,",",nynolh];
  SF 0;
  SD 0;
SAVE ALL;

USE RING;
  cell;
  calc;
  fix;
  {nx0, ny0}=Twiss[{"NX","NY"},"***"]/2/Pi;
  FIT;
  NX nx0 2;         ! set the offmomentum tunes for 5 points
  NY ny0 2;         ! in -DP < dp/p0 < DP
  DP=0.0001;
  FREE SF SD;
  GO;
  FITP 1;           ! set the off-momentum points to 1 (on-momentum only).
SAVE ALL;
until;

USE RING;
   cell calc emit fix;
   alphax = Twiss["AX",1];
   betax  = Twiss["BX",1];
   alphay = Twiss["AY",1];
   betay  = Twiss["BY",1];
   etax   = Twiss["EX",1];
   etapx  = Twiss["EPX",1];
   gammax = (1 + alphax * alphax)/betax;
   gammay = (1 + alphay * alphay)/betay;
   w     = EMITX;
   wy    = EMITY;
   sigmax= Sqrt[w /gammax];
   sigmay= Sqrt[w /gammay];
   LINE["ANGLE","B2IL"] = 0;
   LINE["ANGLE","B1L"] = 0;
   LINE["ANGLE","B2L"] = 0;
   LINE["ANGLE","B2FL"] = 0;
   cell calc;

  np = 51;

  j = 1;
  Do[
     x[j]  = 1.0;
     px[j] = 1.0;
     y[j]  = 1.0;
     py[j] = 1.0;
     z[j]  = 1.0;
     pz[j] = 1.0;
     n[j]  = 1;
     sha[j]= 1.0;
    ,{j, np}];
   x0  = Table[x[j]  ,{j,np}];
   nx0 = Table[nx[j] ,{j,np}];
   px0 = Table[px[j] ,{j,np}];
   y0  = Table[y[j]  ,{j,np}];
   py0 = Table[py[j] ,{j,np}];
   z0  = Table[z[j]  ,{j,np}];
   pz0 = Table[pz[j] ,{j,np}];
   n0  = Table[n[j]  ,{j,np}];
   shakes= Table[sha[j],{j,np}];

 result  = {1,{x0,px0,y0,py0,z0,pz0,n0}};

 i = -5 - 0.5;
Do[
  i      = i + 0.5;
  Do[
     result[2,1,j] = sigmax;
     result[2,2,j] = -alphax/betax*sigmax;
     result[2,3,j] = sigmay * (j-1)* 4;
     result[2,4,j] = -alphay/betay*sigmay * (j-1)* 4;
     result[2,5,j] = 0;
     result[2,6,j] = i / 100;
     result[2,7,j] = 1;
     shakes[j]= 0;
    ,{j, np}];
  nturn = 1000;
idnok  = 2*Pi/0.046;
turns = 0;
Do[
turns = turns + 1;
L = 0.26956 * 2;
   result = TrackParticles[result, 296];
   Do[
     If[result[2,7,m] == 1,
       Do[
          If[res[2,3,m] > 0.1,
               result[2,7,m]=0;
               Break[];
            ];
            result[2,3,m] = result[2,3,m] + result[2,4,m] * L / 2;
!            result[2,4,m] = (-L/(2*loo*loo))*result[2,3,m] + result[2,4,m];
            result[2,4,m] = (-L/(4*loo*loo*idnok))*Sinh[2*idnok*result[2,3,m]]+result[2,4,m];
            result[2,3,m] = result[2,3,m] + result[2,4,m] * L / 2;
            result[2,1,m] = result[2,1,m] + result[2,2,m] * L;
       ,{50}];
      ];
   ,{m,np}];
   result[1] = 1475;
   result = TrackParticles[result, 1];
  Do[
    shakes[l]  = shakes[l] + result[2,7,l];
   ,{l,np}];
  Print[turns,",",shakes];
  miles = 0;
  If[shakes[1] <turns, Break[]];
,{nturn}];
Print[i,",",shakes];
PageWidth = 3000;
  Write[com,",",i,",",shakes];
,{19}];
$LINE = 1;
until;
stop;
stop;
stop;

   Y方向のDAを計算するためのスクリプト。 Do 関数や If 関数を用いないと、メモリエラーが頻発する。最上階層のrepeat-until を Do で書ければ、XY同時に計算可能であるが、Do 関数の中では USE は使えないため、このようになった。挿入光源は要素番号にして 296 番から 1475 番までに入っている。線形を補正しておいて、非線形を入れてトラッキングする場合は、296 から 1475 まで手動で行うことになる。コメントアウトしてある行が線形式、使用する行が非線形式である。Sinh で floating point exception が出ることがあるが、よくわからない。線形効果の補正後、TrackParticles でまわすリストを作っておいて、それに初期値を入れ、トラッキングする。

Lattice File

!********************************************************************
!
!    Diffraction & IBS Limited Ring
!
!    v28_03          Friday,7,May,1999
!                      Like SPring8!
!                  Low Emittance Version
!
!********************************************************************

MOMENTUM=1.0 GEV
;
MARK
       MARKI  = ()
       MARKR  = ()

       MARKN  = ()
       MARKNE = ()

       MARKU  = ()
       MARKD  = ()
       MARKL  = ()
;
CAVI   CAVI=(VOLT=0.7 MV FREQ=500.1 MHZ)
;
BEND
       BH   =(L = 0.40 ANGLE = 7.5  DEG   E1 = 0.5   E2 = 0.5 )
       B    =(L = 0.80 ANGLE = 15.0  DEG  E1 = 0.5   E2 = 0.5 )
;
DRIFT
       D2   = (L = 0.2 )
       D3   = (L = 0.25 )
       D4   = (L = 0.2  )
       D5   = (L = 0.53  )

       DA1L = (L = 0.2 )
       DA2L = (L = 0.2 )
       DA3L = (L = 0.53 )

       DB1L    =(L =.2 )
       DB2L    =(L =.3 )
       DB3L    =(L =.2 )
       DB4L    =(L =2.0 )
       DB4LH   =(L =1.0 )
       DB4L2   =(L =0.3)
       DB5L    =(L =5.3)
       DB6L    =(L =.35 )
       DB7L    =(L =.35 )
       DBLL    =(L =14.5143541 )

       DBID    =(L = 1.03635 )
       DBID2   =(L = 8.64)

       DJ1L    =(L =.2 )
       DJ2L    =(L =.2 )
       DJ3L    =(L =.2 )
       DK1L    =(L =.2 )
       DK2L    =(L =.2 )
       DK3L    =(L =.7 )
       DK4L    =(L =.2 )
       DLL     =(L = 1 )
;
SEXT
        SF      =(L =.2   K2 =-7.868664731399 )
        SD      =(L =.2   K2 =4.075040373463 )
;
QUAD
        QB7L    =(L =.4   K1 =.3173535623083 )
        QB6L    =(L =.4   K1 =-.0531832239896 )
        QB5L    =(L =.4   K1 =-.3348547621751 )
        QB4L    =(L =.4   K1 =.1499222122905 )
        QB3L    =(L =.4   K1 =-.5272140045213 )
        QB2L    =(L =.4   K1 =1.3070186031267 )
        QB1L    =(L =.3   K1 =-.5629114312114 )
        QA2L    =(L =.2   K1 =-.5327032251746 )
        QA1L    =(L =.2   K1 =-.2597821023075 )

        QC7L    =(L =.4   K1 =.3173535623083 )
        QC6L    =(L =.4   K1 =-.0531832239896 )
        QC5L    =(L =.4   K1 =-.3348547621751 )
        QC4L    =(L =.4   K1 =.1499222122905 )
        QC3L    =(L =.4   K1 =-.5272140045213 )
        QC2L    =(L =.4   K1 =1.3070186031267 )
        QC1L    =(L =.3   K1 =-.5629114312114 )
        QD2L    =(L =.2   K1 =-.5327032251746 )
        QD1L    =(L =.2   K1 =-.2597821023075 )

        QE7L    =(L =.4   K1 =.3173535623083 )
        QE6L    =(L =.4   K1 =-.0531832239896 )
        QE5L    =(L =.4   K1 =-.3348547621751 )
        QE4L    =(L =.4   K1 =.1499222122905 )
        QE3L    =(L =.4   K1 =-.5272140045213 )
        QE2L    =(L =.4   K1 =1.3070186031267 )
        QE1L    =(L =.3   K1 =-.5629114312114 )
        QF2L    =(L =.2   K1 =-.5327032251746 )
        QF1L    =(L =.2   K1 =-.2597821023075 )

        QG7L    =(L =.4   K1 =.3173535623083 )
        QG6L    =(L =.4   K1 =-.0531832239896 )
        QG5L    =(L =.4   K1 =-.3348547621751 )
        QG4L    =(L =.4   K1 =.1499222122905 )
        QG3L    =(L =.4   K1 =-.5272140045213 )
        QG2L    =(L =.4   K1 =1.3070186031267 )
        QG1L    =(L =.3   K1 =-.5629114312114 )
        QH2L    =(L =.2   K1 =-.5327032251746 )
        QH1L    =(L =.2   K1 =-.2597821023075 )
 

        QD      =(L =.3   K1 =.6155766662881 )
        QF      =(L =.4   K1 =-.6335553941932 )
        QJ1L    =(L =.2   K1 =-.0992107226057 )
        QJ2L    =(L =.3   K1 =-1.0471801880134 )
        QK1L    =(L =.4   K1 =1.0791142517898 )
        QK2L    =(L =.35  K1 =1.1476310387532 )
        QK3L    =(L =.4   K1 =-1.5755267057375 )
        QK4L    =(L =.35  K1 =1.2308091154132 )
;

BEND
        B1   =(L=0.03  ANGLE=  0  E1=0.5 E2=0.5 )
        B2   =(L=0.03  ANGLE=  0  E1=0.5 E2=0.5 )
        B2I  =(L=0.015 ANGLE=  0  E1=0   E2=1.0 )
        B2F  =(L=0.015 ANGLE=  0  E1=1.0 E2=0   )

        B1L  =(L=0.023  ANGLE= 0  E1=0.5 E2=0.5 )
        B2L  =(L=0.023  ANGLE= 0  E1=0.5 E2=0.5 )
        B2IL =(L=0.023/2 ANGLE= 0  E1=0   E2=1.0 )
        B2FL =(L=0.023/2 ANGLE= 0  E1=1.0 E2=0   )
;

;
LINE
        RING24 = (MARKI 12*NCELL CAVI 12*NCELL MARKR)
        RING   = (MARKI -LCELLUL  5*NCELL SCELLH
                        -SCELLH   5*NCELL LCELLDR
                        -LCELLDL  5*NCELL SCELLH
                        -SCELLH   5*NCELL LCELLUR
                  MARKR)

        NCELL  = (MARKN
                        SD D2 QD D3 SF D4 QF D5
                        B
                        D5 QF D4 SF D3 QD D2 SD
                  MARKNE
                 )
        SCELL  = (SCELLH -SCELLH)
        LCELLU = (LCELLUL -LCELLUR )
        LCELLD = (LCELLDL -LCELLDR )
        POLE   = (B1 B2)
        UND    = (DBID B2I 80*POLE B1 B2F DBID2)
        PLU27L = (B1L B2L)
        U27LH  = (DBID B2IL 80*PLU27L 80*PLU27L 80*PLU27L 52*PLU27L B1L B2FL)

        LCELLUR= (MARKN SD D2 QD D3 SF DA1L QH1L
                        DA2L QH2L DA3L
                        BH
                  MARKD DB1L QG1L DB2L QG2L DB3L QG3L
                        DB4L DB4L2 QG4L DB5L QG5L DB6L QG6L
                        DB7L QG7L
                        DBLL
 !                       UND
                  MARKL
                 )
        LCELLUL= (MARKN SD D2 QD D3 SF DA1L QA1L
                        DA2L QA2L DA3L
                        BH
                  MARKD DB1L QB1L DB2L QB2L DB3L QB3L
                        DB4L DB4L2 QB4L DB5L QB5L DB6L QB6L
                        DB7L QB7L
                        DBLL
                  MARKL
                 )

        LCELLDL= (MARKN SD D2 QD D3 SF DA1L QD1L
                        DA2L QD2L DA3L
                        BH
                  MARKD DB1L QC1L DB2L QC2L DB3L QC3L
                        DB4LH CAVI DB4LH DB4L2 QC4L DB5L QC5L DB6L QC6L
                        DB7L QC7L
                        MARKU U27LH
                  MARKL
                 )
        LCELLDR= (MARKN SD D2 QD D3 SF DA1L QF1L
                        DA2L QF2L DA3L
                        BH
                  MARKD DB1L QE1L DB2L QE2L DB3L QE3L
                        DB4L DB4L2 QE4L DB5L QE5L DB6L QE6L
                        DB7L QE7L
                        MARKU U27LH
                  MARKL
                 )

        SCELLH = (MARKN SD D2 QD D3 SF DJ1L QJ1L
                        DJ2L QJ2L DJ3L
                        BH
                  MARKD DK1L QK1L DK2L QK2L DK3L QK3L
                        DK4L QK4L ! DK5L QK5L
                        DLL
                  MARKL
                 )

;