SLIDE 33 An example of orbit correction
! Define a Class OrbitCorrection OrbitCorrection=Class[{},{},{seed=3,cor="S*",mon="Q*",al="Q*", ! Instance variables with some initial values circ,pc,pm,pa,gcut=4,nx0,ny0,mx,my,tol=1e-2,em}, Constructor[]:=( ! Constructor to be called when an instance is defined circ=LINE["S","$$$"]-LINE["S","^^^"]; ! ring circumference {pc,pm,pa}=LINE["POSITION",{cor,mon,al}]; ! positions of correctors, bpms, and misaligned componentss. LINE["DX",pa]*=0; ! clear misalignments and correctors. LINE["DX",pa]*=0; LINE["K0",pc]*=0; LINE["SK0",pc]*=0; FFS["CALC4D;NORADCOD;CELL;CALC"]; ! calculate the design optics & emittance em=Emittance[]; {nx0,ny0}=Twiss[{"NX","NY"},"$$$"]; ! design tune With[{nx0,ny0,alpha=MomentumCompaction/.em}, mx=Outer[(Sqrt[Twiss["BX",#2]]* Cos[Abs[Twiss["NX",#]-Twiss["NX",#2]]-nx0/2])&,pm,pc]* Sqrt[Twiss["BX",pm]]/2/Sin[nx0/2]- ! horizontal response matrix Outer[Times,Twiss["EX",pm],Twiss["EX",pc]]/alpha/circ; ! dispersion term AppendTo[mx,Twiss["EX",pc]]; ! circumference correction my=-Outer[(Sqrt[Twiss["BY",#2]]* ! vertical response matrix Cos[Abs[Twiss["NY",#]-Twiss["NY",#2]]-ny0/2])&,pm,pc]* Sqrt[Twiss["BY",pm]]/2/Sin[ny0/2]]); Misalign[{dx_,dy_}]:=( SeedRandom[seed]; GCUT=gcut; LINE["DX",pa]=dx*GaussRandom[Length[pa]]; ! set misalignments LINE["DY",pa]=dy*GaussRandom[Length[pa]]; FFS["CALC NOEXP;REF;"]); ! NOEXP is necessary for independent misalignments ! optics is stored as the Reference optics Correct[]:=Module[{{dx,dy}=Twiss[{"DX","DY"},pm],kx,ky}, kx=LinearSolve[mx,Append[dx,Twiss["DZ","$$$"]-Twiss["DZ","^^^"]], Tolerance->tol]; ! horizontal correction with circumference adjustment ky=LinearSolve[my,dy,Tolerance->tol]; !vertical correction LINE["K0",pc]=kx; LINE["SK0",pc]=ky; FFS["CALC6D;CALC NOEXP;"]; ! optics after correction ]; Plot[]:=(OpticsPlot[{{"RDX","DX"},{"RDY","DY"}},Lattice->False,Names->""]; Update[]); ];
- c=OrbitCorrection[]; ! Define an instance of OrbitCorrection
- c@Misalign[{1e-5,1e-5}]; ! call an instance function oc@Misalign
- c@Correct[]; ! call an instance function oc@Correct
- c@Plot[]; ! call an instance function oc@Plot
CPU[]; CPU time so far =6.177183151245117 sec susp;
24