荷電粒子軌道計算ソフトウェア SIMION の簡単な使い方の覚書です.
基本的な使い方から,コイルによる外部磁場中の軌道の計算方法までのメモです.
Ver.8.1を使用しています.
間違いが多々あると思いますので御注意下さい.
全体の目次:
1. SIMIONとは
2. この説明で扱う事
3. 使用例と操作手順
4. 磁場について
1. SIMIONとは
SIMIONは,電磁場中での荷電粒子の軌道計算ソフトウェアです.
与えた境界条件に対して有限要素法で電場を計算し,4次のRunge Kutta法で相対論的運動方程式を解いて,荷電粒子やビームの軌道計算を行います.磁場を計算する機能は電場程には充実していませんが,適当な外部コードで計算した磁場の数値データを取り込んで,電場と合わせて軌道計算が可能です.対称な2Dに加えて3Dの計算が出来ますので,軸対称でない電極や磁場配位の実験系にも適用可能です.
2. この説明で扱う事
基本的に,初めてSIMIONを使用して3Dのstaticな電磁場中で軌道計算を走らせるまでの使い方のメモです.磁場は,外部コードで計算した磁場データをSIMIONに取り込みます.電場は,非軸対称な電極等の形状と電位を境界条件として指定して,後はSIMION側で電場計算と軌道計算を行います.
3. 使用例と操作手順
test1:
電極を与えて電場を計算し,粒子を飛ばす
1.静電ポテンシャルのアレイを作る
Potential Arrays (PA)のNewをクリック.
Potential type: Electric Potentials にチェック.
Coordinates/symmetry: Planar, mirroringは全て外す.
Dimensionはx,y,zとも21, Length of grid unit は1.
OKする
2.電極を作る
MarksでIncludeのマークを入れ,BoxやCircle等で電極にする部分を選択(黒い線の部分).
Excludeにマークを入れると,除外する部分を選ぶ事も出来ます(赤い線の部分).
この状態で,Point Info -> Type で Electrode を選択して Potential を1と入力.
Functions on MarksのReplaceを押します.
ここまでは,z方向に一様な形状を作るケース(長い円筒など).
z方向に短い部品を作る場合は,XZなど切り替えながら形状を決める.
電極作成が終わったら,OKを押す.
3.Save testEle1.PA# として保存する
複数の電極を含んでいる事を伝えるために,拡張子.pa#で保存
Refine -> Refine
4.粒子を飛ばす
View/Load Workbench
Define particleで適当に定義して,Run Control Fly'mで飛ぶ
(電極電圧はPAsのFast Adjust Voltagesで調整可能)
5.workbenchでsave
test1':
もう少し複雑な電極の例
MarksでIncludeのマークを入れ,BoxやCircle等で電極にする部分を選択します(黒い線の部分).
Excludeにマークを入れると,除外する部分を選ぶ事も出来ます(赤い線の部分).
この状態で,Point Info -> Type で Electrode を選択して Potential を1と入力し,Functions on MarksのReplaceを押します.
同様の手順で,ただしPotentialだけは2にして,内側の円筒を作ります.
Non-Electrodeを選択して,Replaceにより切れ目を入れます.
分割した電極それぞれに別々の番号(Potential)を振ります.
まず,番号を変えたい電極を含む領域をBoxで選択し,Point InfoでPotentialを2にして,Findにチェックボタンを入れます.
この状態でReplaceを押すと新しい番号を聞かれるので,3と入力します.
同様の手順で,分割した電極すべてに2,3,4,5という新しい番号を与えました.
OKを押し,複数の電極を含んでいる事を伝えるために,拡張子.pa#で保存します.
Refine -> Refine
test2:
test1の電場に加え,一様な磁場を与える
1.test1のフォルダ全体をtest2としてコピーして作業を続行
2.磁場のアレイを作る(これをしないと磁場が反映されません)
Potential Arrays (PA)のNewをクリック.
Potential type: Magnetic Potentials にチェック.
Coordinates/symmetry: Planar, mirroringは全て外す.
Dimensionはx,y,zとも21, Length of grid unit は1.
3.磁場を与える
Particles -> User Program yes
ユーザープログラムの内容はは以下の通り.
simion.workbench_program()
adjustable bx = 0 -- gauss
adjustable by = 0 -- gauss
adjustable bz = 50 -- gauss
function segment.mfield_adjust()
ion_bfieldx_gu = bx
ion_bfieldy_gu = by
ion_bfieldz_gu = bz
end
4.粒子を飛ばす
View/Load Workbench
Define particleで適当に定義して,Run Control Fly'mで飛ぶ
(電極電圧はPAsのFast Adjust Voltagesで調整可能)
test3:
外部コードで計算した磁場を与える
1.磁場のアレイを作るところまでは前回と同じ
2.ユーザープログラムは以下の通り.
simion.workbench_program()
-- ### Apply magnetic field; start ###
-- ### 外部ファイルから磁場を与える手順 ###
-- Load field interpolation support.
local FieldArray = require "simionx.FieldArray"
-- Load magnetic field data file.
local field = FieldArray("mag.dat")
-- Apply magnetic field at each point
function segment.mfield_adjust()
ion_bfieldx_gu, ion_bfieldy_gu, ion_bfieldz_gu =
field:get(ion_px_mm, ion_py_mm, ion_pz_mm)
end
3.mag.datという名前の磁場ファイルを作る
各行に Bx, By, Bz を,磁場アレイで定義した次元に応じて書き込む.
数値データの冒頭に以下を書き込む編集が必要.
fieldx,fieldy,fieldz,"field_array{nx=21,ny=21,nz=21,symmetry='planar',mirror='',dx_mm=1,dy_mm=1,dz_mm=1,potential_type='magnetic',rt=0,el=0,az=0,scale=1,x=0,y=0,z=0}"
test4:
一定の計算時間が経過したら計算を止める
test3に以下を追加
local t_max = 0.1 -- maximum calculation time (us)
function segment.other_actions()
-- ### Stop when; start ###
-- ### 特定の条件(時間経過等)で計算終了 ###
-- if ion_px_mm >= 50 then --
if ion_time_of_flight >= t_max then -- time in microseconds
print ("Ion_Time_of_Flight1: ", Ion_Time_of_Flight)
ion_splat = 1
-- ### Stop when; end ###
end
end
test5
軌道を保存
4.磁場について
上述の通り,磁場を取り込む方法は複数あります.
-1. 簡単な一様磁場を与える手順
電場のpaファイルとグリッドサイズが同じカラのmag.pa0ファイルを用意します.
User Program の .luaファイルに以下のように記入します.
-- プログラムここから --
simion.workbench_program()
adjustable bx = 0 -- gauss
adjustable by = 0 -- gauss
adjustable bz = 50 -- gauss
function segment.mfield_adjust()
ion_bfieldx_gu = bx
ion_bfieldy_gu = by
ion_bfieldz_gu = bz
end
-- プログラムここまで --
-2.外部プログラムで計算した磁場ファイルを使用する
以下のような形式の磁場のテキストファイルを用意します.
磁場の単位はdxが1mmの場合はガウスです.
-- ファイル例ここから --
fieldx,fieldy,fieldz,"field_array{nx=51,ny=51,nz=51,symmetry='planar',mirror='',dx_mm=1,dy_mm=1,dz_mm=1,potential_type='magnetic',rt=0,el=0,az=0,scale=1,x=0,y=0,z=0}"
72.58667, 72.55230, -3.76978
74.55218, 77.61993, -2.06074
76.37051, 82.96824, -0.18205...
-- ファイル例ここまで --
上記のファイルをbsim.csvとして,SIMIONプログラム類と同じフォルダに置きます.
-- プログラムここから --
simion.workbench_program()
-- Load field interpolation support.
local FieldArray = require "simionx.FieldArray"
-- Load magnetic field data file.
local field = FieldArray("bsim.csv")
-- Apply magnetic field at each point
function segment.mfield_adjust()
ion_bfieldx_gu, ion_bfieldy_gu, ion_bfieldz_gu =
field:get(ion_px_mm, ion_py_mm, ion_pz_mm)
end
-- プログラムここまで --
-3. SL Tools
その他に,外部磁場を取り込む方法として,SL Toolsを使用して,磁場データのテキストファイルをPAに変換する事が出来ます.注意点として,どんな磁場配位からも一見動作可能なPAファイルが出来てしまいますが,スカラーポテンシャルで表せる磁場にしか対応していません(ver.8.1の情報).従って,磁場コイルを使用するような,計算領域に電流を含む状況に適用すると正しい結果が得られません.SIMIONのドキュメントImporting a solenoid magnetic field into SIMION by multiple methodsに,ソレノイド磁場の数値データを取り込む例が記載されていますが,scalar potentialが一意的に決まるconservativeな領域(ソレノイド内部)でのみ正しい磁場になると書かれています.