Yamamoto's Laboratory
 
 
入力
 
電磁場取り込み
  SUPERFISH
 
User elemetns
 
 
Python
 
 
 
 
 
 
 
 
研究内容 加速器 GPT 電磁場取り込み  SUPERFISH

GPT電磁場取り込み  SUPERFISHSUPERFISH の電磁場を取り込みトラッキング計算

SUPERFISHで計算した電磁場を含め,GPTを用いたビームトラッキング計算を行う方法を示します.「SUPERFISHの電磁場をGPTファイルで,どのように取り扱うのか?」が最も重要なテーマとなります.

目次


はじめに

ここでは,SUPERFISHで計算された電磁場をGPTに取り込んで,ビームトラッキングを行う方法を示します.そのためには,SUPERFISHの計算結果をGPTに取り込めるファイル形式に変換しなくてはなりません.そして,そのファイルをGPTで適切に読み込む必要があります.このWEBページでは,これらの一連の作業について,詳しく説明します.

作業の詳細については次節以降に示しますが,その前に,読者の理解を助けるために,予め作業のだいたいの流れを示した方がよいでしょう.

  1. SUPERFISHの「autofish」を使い,空洞の電磁場を計算します.
  2. SUPERFISHの「SF7」を使い,電磁場のマップファイル(テキスト)を作成します.
  3. GPTのコマンド「fish2gdf」を使い,このテキストで書かれたマップファイルをGDFファイルに変換します.
  4. GPTのエレメント「map25D_TM」を使い,変換したGDFファイルを読み込みビームトラッキングを行います.

計算モデル

RFの空洞を使った加速器のモデルとして,プリバンチャーでのビームの挙動の計算を例題に取り上げます.ここで計算するモデルを図1に示します.プリバンチャー空洞はz=100[mm]の位置し,それにより100[KeV]のビームがエネルギー変調(速度変調)を受けます.そして,ドリフとすーペースを進むうちに,ビームはバンチングします.

プリバンチャーの運転周波数は 2856[MHz]とし,入射のRF電力は 1[KW]とします.空洞のマッチングは「β=1」の完全なマッチングを仮定し,反射電力はないものとします.

また,プリバンチャーに入射される電子ビームの長さは,287[mm]とします.これは,2856[MHz]の5周期です.この電子ビームの空間電荷効果は無視します.したがって,シミュレーションではビームの電流値は意味を持ちません.ビームはエミッタンスゼロの平行ビームとし,直径は5[mm]です.

このモデルの計算を行う場合,プリバンチャーの電磁場をきちんと,GPTのトラッキングに反映すること—が重要です.

図1 計算モデル.電子ビームがプリバンチャーにより速度変調を受け,バンチングする.

SUPERFISHの計算

軸対称構造のTM0モードの電磁場の計算には,SUPERFISHが適しています.加速器の世界で,長年にわたって使われてきました.ここでは,それを用いてプリバンチャーの電磁場を計算します.

プリバンチャーの形状とSUPERFISH入力データ

計算するプリバンチャーの形状を,図2に示します.この空洞の共振周波数を2856[MHz]にするために,空洞の直径(69.5664[mm])が中途半端な値になっています.

このプリバンチャーのRF特性を計算するためのSUPERFISHの入力データを以下に示します.ここでは,このデータの内容については説明しません.

このデータを「PB.af」という名前のテキストファイルで保存します.ファイル名にはそれほどの制約はありませんが,アルファベットとアンダースコアのみで構成することを勧めます.拡張子は,「af」とする必要があります.

SUPERFISHがきちんとインストールされていれば,このデータファイル「PB.af」をダブルクリックするか,コマンド「autofish PB.af」をタイプすることにより,SUPERFISHによる計算が実行されます.計算が完了すると様々な,計算結果のファイルが出来上がります.

プリバンチャーの電磁場を計算するときのSUPERFISHの入力データ(PB.af).先頭の3桁の数字は行数を表しているので入力しない.

001   S-Band Prebuncher for GPT test
002    $reg kprob=1, dx=0.2, conv=0.1, kprob=1,
003    xdri=0, ydri=34.43535315,
004    nbsup=1, nbslo=0, nbslf=1, nbsrt=1
005    freq=2856.000000,
006    kmethod=1,
007    beta=0.548221$
008   !--- PB cell (left half)  ---
009    $po x=0.000000, y=0.000000 $
010    $po x=-35.000000, y=0.000000 $
011    $po x=-35.000000, y=7.500000 $
012    $po x=-11.000000, y=7.500000 $
013    $po nt=2, r=2.500000, theta=0, x0=-11.000000, y0=10.000000 $
014    $po nt=2, r=2.500000, theta=90, x0=-11.000000, y0=10.000000 $
015    $po x=-12.500000, y=12.500000 $
016    $po nt=2, r=2.500000, theta=180, x0=-12.500000, y0=15.000000 $
017    $po x=-15.000000, y=32.283185 $
018    $po nt=2, r=2.500000, theta=90, x0=-12.500000, y0=32.283185 $
019    $po x=0.000000, y=34.783185 $
020   !--- PB cell (right half)  ---
021    $po x=12.500000, y=34.783185 $
022    $po nt=2, r=2.500000, theta=0, x0=12.500000, y0=32.283185 $
023    $po x=15.000000, y=15.000000 $
024    $po nt=2, r=2.500000, theta=270, x0=12.500000, y0=15.000000 $
025    $po x=11.000000, y=12.500000 $
026    $po nt=2, r=2.500000, theta=180, x0=11.000000, y0=10.000000 $
027    $po nt=2, r=2.500000, theta=270, x0=11.000000, y0=10.000000 $
028    $po x=35.000000, y=7.500000 $
029    $po x=35.000000, y=0.000000 $
030    $po x=0.000000, y=0.000000 $
図2 プリバンチャーの形状.

SUPERFISHの計算結果(プリバンチャー)

SUPERFISHで計算した結果のサマリーを以下に示します.これは,計算により作成されるファイル「PB.SFO」の後半部分で,SUPERFISHでの計算のフィールドの強度とプリバンチャーの電力の関係を計算するときに用います.

All calculated values below refer to the mesh geometry only.
Field normalization (NORM = 0):     EZERO =      1.00000 MV/m
Frequency                                 =   2855.99998 MHz
Particle rest mass energy                 =   938.272029 MeV
Beta =  0.5482210          Kinetic energy =      183.615 MeV
Normalization factor for E0 =  1.000 MV/m =    13350.251
Transit-time factor                       =    0.6942982
Stored energy                             =    0.0010478 Joules
Using standard room-temperature copper.
Surface resistance                        =     13.94249 milliOhm
Normal-conductor resistivity              =      1.72410 microOhm-cm
Operating temperature                     =      20.0000 C
Power dissipation                         =    1554.8128 W
Q    =   12093.3          Shunt impedance =       45.021 MOhm/m
Rs*Q =   168.610 Ohm                Z*T*T =       21.703 MOhm/m
r/Q  =   125.622 Ohm  Wake loss parameter =      0.56357 V/pC
Average magnetic field on the outer wall  =      3519.73 A/m, 8.63635 W/cm^2
Maximum H (at Z,R = -13.2547,12.6166)     =      5779.49 A/m, 23.2857 W/cm^2
Maximum E (at Z,R = 8.55001,10.4976)      =      6.59782 MV/m, 0.144211 Kilp.
Ratio of peak fields Bmax/Emax            =       1.1008 mT/(MV/m)
Peak-to-average ratio Emax/E0             =       6.5978

この中で,重要なパラメーターは空洞の蓄積エネルギー(U)の「Stored energy」とQ0「Q」,シャントインピーダンス(Rs)「ZTT」です.それぞれについては,

という関係があります.ここで,Vは100[keV]の等速で移動する電子が感じる最大の電圧です.もっと正確に言うと,複素電圧の絶対値の二乗,VV*です.Pは,空洞の壁損失を表し,カップリングが1の場合には,投入電力と等しくなります.もちろん,ωは角振動数です.これらの関係から,入射RF電力や空洞電圧などの計算ができます.

さらに,計算結果の「PB.T35」ファイルをダブルクリックすると,図3のように空洞の形状と電磁場のようすを見ることができます.

図3 プリバンチャーの計算結果.

フィールドマップファイルの作成

SUPERFISHの電磁場のマップをGPTで読み込むためには,それを GPTの標準フォーマットである General Data format (GDF)に変換する必要があります.そのためには,(1)Interpolate(SF7)を使いフィールドのマップファイル(テキスト)を作成し,(2)fish2gdfを使い それを GDF に返還する手続きが必要です.前者はSUPERFISHのコマンド,後者はGPTのコマンドです.

ここでは,これら二つのコマンドの使いかたを説明します.

テキストファイルの作成(SF7)

二通りの方法で,SUPERFISHのSF7を使いフィールドマップ(テキストファイル)の作成ができます.(1)主にマウスを使うGUI,(2)コマンドをタイプするCUIを使う方法です.いずれの方法でも,実行結果はOUTSF7.TXTというファイルが作成されます.

GUIでSF7

GUIはお手軽ですが,バッチ処理などの自動化ができないので不便な方法です.次の手順で,フィールドマップのファイル「OUTSF7.TXT」を作成します.

  1. SUPERFISHの計算結果のファイル(*.T35),ここでは「PB.T35」を右クリックし,「Interpolate (SF7)」を選択します(図4).
  2. すると,設定のダイアログ「Poisson Superfish Field Interpolator」が現れますので,次のように設定します(図5).設定後は,[Run]ボタンを押します.[注意] SF7の設定ファイル(*.in7)があると,この設定ダイアログは現れず,ファイルの記述が優先されます.
    • Selectのラジオボタンを「Grid」にします.
    • 取り込む電磁場のマップの矩形領域の左下(X1, Y1)と右上(X2, Y2)の座標を指定します.
    • フィールドマップのX方向(X steps)とY方向(Y steps)のステップ数を指定します.

以上の操作により,フィールドマップが書かれたテキストファイル「OUTSF7.TXT」が作成されます.テキストファイルなので,確認のために,一度,その内容を見ることを勧めます.

図4 SF7の起動

図5 SF7の設定

CUIでSF7

次に,コマンドをタイプする CUI での方法を示します.今では,コマンドが苦手な読者も多いと思いますが,慣れると大変便利です.この方法ではバッチ処理が可能で,簡単なプログラムを記述するだけで,様々な自動化ができます.

  1. まずはじめに,以下に示すSF7の設定ファイルを作成し,プリバンチャーを計算したディレクトリー(フォルダー)に保存します.ファイル名は,「PB.in7」のようにします.ファイル名はこれまでの計算と同一にして,拡張子のみ変更します.
    • 1行目は,何も考えずにこの通りにします.「rect」と書くことで,長方形のフィールドマップを作成します.
    • 2行目は,長方形のフィールドマップの左下と右上の座標を指定しています.順に,「X(左下), Y(左下), X(右上),Y(右上)」となります.
    • 3行目は,フィールドマップのステップ数です.最初の 700 はX方向,次の 75 はY方向のステップ数を表しています.すなわち,X, Y方向とも0.1[mm]のメッシュ間隔です.
    • 4行目は,「end」と書きます.

    SF7の設定ファイル(PB.in7)

    001   rect noscreen
    002   -35.00  0.00    35.00   7.50
    003   700 75
    004   end
  2. つぎに,Windowsのコマンドプロンプトを起動し,プリバンチャー空洞を計算したファイルのあるディレクトリー(フォルダー)に移動します.そして,以下のコマンドをタイプします.ただし,先頭の「>」は,コマンド入力を促す記号なので,タイプしません.
    > sf7 PB

以上の操作により,フィールドマップが書かれたテキストファイル「OUTSF7.TXT」が作成されます.テキストファイルなので,確認のために,一度,その内容を見ることを勧めます.

gdfファイルの作成(fish2gdf)

前節で作成したSUPERFISHのフィールドマップのテキストファイル「OUTSF7.TXT」を,GPTの標準フォーマットである General Data format (GDF)に変換しなくてはなりません.そのためのコマンドは,「fish2gdf -o 出力ファイル.gdf OUTSF7.TXT」です.具体的には,Windowsのコマンドプロンプトを起動した後,「OUTSF7.TXT」が保存されているディレクトリーに移動して,以下のコマンドをタイプします.ただし,先頭の「>」は,コマンド入力を促す記号なので,タイプしません.

> fish2gdf -o PB.gdf OUTSF7.TXT

すると,GPTで読み込めるファイル「PB.gdf」がつくられます.

作成されたGDFファイル(pb.gdf)を確認します.ファイルをダブルクリックすることによりGPTが起動され,「x軸:Z, y軸:Ez」を選択すると,次プロットが得られます.電場のプロットでOKでしょう.

図6 GPTでプロットしたプリバンチャーのZ方向電場.

GPTでのビームトラッキング

ここでは,前節で作成したgdfフォーマットのSUPERFISHの結果をGPTでビームトラッキングする具体的な方法を示します.

GPTのインプットファイル

フィールドマップのGDFファイルをGPTに取り込むコマンドは,

map25D_TM(ECS, mapfile.gdf, r, z, Er, Ez, Bphi, ffac, k, phi, w)

です.引数は,次のとおりです.

map25D_TMの引数.SUPERFISHのマップファイルとは,「OUTSF7.TXT」です.
ECS エレメントの座標システム
mapfile 電磁場のマップファイル
r SUPERFISHのマップファイルのr座標の名前
z SUPERFISHのマップファイルのz座標の名前
Er SUPERFISHのマップファイルの半径方向の電場の名前
Ez SUPERFISHのマップファイルの軸方向電場の名前
Bphi SUPERFISHのマップファイルの周方向磁場の名前
ffac 電磁場を強さを変える場合の定数
k 軸方向の波数.通常はゼロ.
phi 初期位相
w 電磁場の角振動数

ここで,もっとも分かりにくいのは,最初の引数の「ECS」です.ほとんどの場合,これは「"wcs", "z", z方向オフセット量[m]」と書きます.z方向オフセット量というのは,GPTの座標系でのSUPERFISHの座標系の移動量のことです.詳しくは,次の具体的なGPTインプットファイルで理解してください.次に分かりにくい引数は,SUPERFISHのマップファイル「OUTSF7.TXT」と関係する(r,z,Er,Ez,Bphi)です.これを理解するためには,「OUTSF7.TXT」を覗く必要があります.このファイルには,電磁場の値がテーブル状に書かれています.この引数は,テーブルの列名を表します.残りの引数については,説明するまでもないでしょう.

筆者は,ここでの計算では「map25D_TM("wcs", "z", 100*mm, "PB.gdf", "R", "Z", "Er", "Ez", "H", pb_fac, 0, 0, omega);」としました.以下に示しているGPTのインプットファイルとあわせて,引数の与え方(034行)を理解してください.

GPTのインプットファイル(linac_PB.in).先頭の3桁の数字は行数を表しているので入力しない.

001   mm = 1e-3;
002   MHz = 1e6;
003   
004   #========================================================
005   #  difinition: initial condition of electorn beam
006   #========================================================
007   Energy=100e+3;         # beam energy [MeV]
008   
009   G=1-qe*Energy/(me*c^2);
010   
011   setparticles("beam",10000,me,qe,-1e-9);
012   setrxydist("beam","u", 1.25*mm, 2.5*mm);
013   setphidist("beam","u", 0, 2*pi);
014   setzdist("beam","u", -287*mm/2, 287*mm);
015   setGBrxydist("beam","u",0, 0);
016   setGBphidist("beam","u",0, 0);
017   setGdist("beam","u",G, 0);
018   
019   
020   #========================================================
021   #  difinition: prebuncher
022   #========================================================
023   
024   facc   = 2856*MHz;                      # Operating freq. [Hz]
025   pb_pwr = 1e3;                           # PB power [w]
026   omega = 2*pi*facc;
027   # --- from SUPERFISH results --------------
028   pb_U    = 0.0010478;            # Stored energy output of SF [Joules]
029   pb_Q    = 12093.3;          # Q value in SF
030   pb_sf_pwr = omega*pb_U/pb_Q;
031   pb_fac  = sqrt(pb_pwr/pb_sf_pwr);
032   pp("pb_fac:", pb_fac);
033   
034   map25D_TM("wcs", "z", 100*mm, "PB.gdf", "R", "Z", "Er", "Ez", "H", pb_fac, 0, 0, omega);
035   
036   #========================================================
037   # beam control
038   #========================================================
039   tout(0, 8/facc, 1/(6*facc));

このSUPERFISHでの電磁場の取り込みのほかのGPTのインプットファイルについては,ここでは説明しません.このGPTのインプットファイルを使い,図1のビームトラッキング計算を行いました.

GPTの実行

前節のインプットファイルをGPTで実行するためには,バッチファイルが必要です.ここでは,次のようなバッチファイルを使いました.トラッキング計算のみであれば,第一行のみ記述します.第二行は,ヒストグラム(図8)を書くためのコマンドです.

GPTで計算するためのバッチファイル(run.bat)

001   gpt -o linac_PB.gdf linac_PB.in
002   gdf2his -l -o zhist.gdf linac_PB.gdf z 1e-3 

このバッチファイルでは,トラッキング計算の直後に,z方向の粒子の数にヒストグラム(密度分布)のGDFファイルが得られます.このヒストグラムを眺めると,プリバンチャーでのバンチング様子がよく理解できます.

図7と図8は,GPTのビームトラッキングにより得られた結果のプロットです.プリバンチャーに電子ビームがバンチングされたことが分かるでしょう.

図7 r vs z のプロット

図8 z方向の粒子数のヒストグラム

計算結果の確認

ここでの一連の作業,(1)SUPERFISHの計算,(2)電磁場マップファイル(PB.gdf)の作成,(3)GPTのインプットファイル(linac_PB.in)とその実行に間違いは無かったのだろうか?—という当然の疑問が湧くことでしょう.そこで,計算結果の検証を行い,正し手続きでシミュレーションが行われたことを確認します.

まずは「(1)SUPERFISHの計算」ですが,これまでの筆者の経験や測定結果から,正しいといわざるを得ません.ここでは,これの検証不可能なので,正しいとしましょう.

次に「(2)電磁場マップファイル(PB.gdf)の作成」と「(3)GPTのインプットファイル(linac_PB.in)とその実行」は,「SUPERFISHの計算は正しい」という仮定の元,検証は可能です.SUPERFISHのシャントインピーダンスの計算がから求められる空洞電圧と,GPTから計算されるビームの変調電圧を比較します.両者が一致すれば,(2)と(3)が検証できたことになります.

SUPERFISHで計算された100keVの電子に対するプリバンチャーのシャントインピーダンスは,ZTT=21.703[MΩ/m]です.このプリバンチャーの全長は70[mm]であるため,トータルのシャントインピーダンスは1.519[MΩ]となります.この空洞に,1[kW]のRF電力を投入すると,38.977[kV]の電圧が発生します.すなわち,このプリバンチャーにより,39[kV]程度のエネルギー変調がビームに与えられます.図9から,GPTの計算で得られたエネルギー変調(+41.185kV,-37.4506kV) と,SUPERFISHのシャントインピーダンスからの電圧(38.977kV)がほとんど一致していることが分かります.したがって,ここでの計算は正しいと結論できます.

図9 ビームエネルギーのプロット

わずかではありますが,なぜ,SUPERFISHのシャントインピーダンスから計算した電圧とGPTでのエネルギー変調が異なっていたのでしょうか?

GPTではギャップ付近での電子の速度の変化を計算していますが,SUPERFISHのシャントインピーダンスの計算では空洞中での電子の速度の変化は計算していません.この速度の違いが,両者のほんのわずかな電圧の違いになります.GPTの計算では,加速される粒子は速度が速くなるためトランジットタイムファクターが大きくなり,その電圧は,シャントインピーダンスの計算よりもわずかに大きくなります.減速の場合は,その反対です.

したがって,プリバンチャーで速度が変化しないくらい高エネルギーの粒子で,シャントインピーダンスから計算される電圧とGPTでの変調電圧を比べれば,もう少し精度の良い検証ができます.たとえば,10[MeV]の電子で比べましょう.この電子の速度は,β=0.998817です.SUPERFISHのインプットデータのbetaの値をこれにして,シャントインピーダンスを計算すると,ZTT=36.159[MΩ/m]となります.全長70[mm]のこの空洞に1[kW]のRF電力を投入すると,電圧はV=50.3103[kV]となります.次にGPTで10[MeV]の電子が受ける電圧変調を先ほどと同じように計算すると,V=±50.3104[kV]となります.両者の差は,わずかに2×10-6です.この結果から,正しい手順で計算が行われている—と確信がもてます.

おまけ (SUPERFISH 自動計算)

GPTの計算に必要なGDFファイルをちまちまと手作業で行うのはかなり面倒です.とくに,周波数を運転周波数に合わせるための,SUPERFISHのインプットファイル(*.af)の修正に時間がかかります.そのため,私はPerlのスクリプトで,GDFファイルの作成まで自動化しています.参考に,その方法を示します.

プログラムを使った自動計算では,空洞の形状を複数のパラメーターで表現する必要があります.ここでは,図10のように10個のパラメーターで,空洞の形状を表します.

図10 空洞形状とパラメーター

自動計算には,プログラムのインプットとなる空洞形状を表したパラメーターのファイルが必要です.ここでは,次のようなファイル(PB.dat)を作成しました.「#」はコメントマークで行末まで,無視されます.

インプットデータ(PB.dat)

001   #2a       2b      D       r       gap     addL
002   15.000000   69.000000   30.000000   2.500000    17.000000   20.000000
003   15.000000   69.566369   30.000000   2.500000    17.000000   20.000000
004   15.000000   69.566369   30.000000   2.500000    17.000000   20.000000
005   15.000000   69.566369   30.000000   2.500000    17.000000   20.000000

Perlで書かれた自動計算のプログラム(PB_tune.pl)を以下に示します.このプログラの実行コマンドは,次の通りです.

> perl PB_tune PB

このプログラムは,次のように動作します.

  1. インプットファイル(PB.dat)を読み込んで,それを元にSUPERFISHの入力データ(PB.af)を作成する.読み込む,形状パラメーターはインプットファイルのコメント行を除いた第一行目のみである.
  2. SUPERFISHで,空洞の電磁場と共振周波数を計算する.
  3. 共振周波数が2856[MHz]と異なる場合,空洞の直径(2b)を変化させて,インプットファイルを作り直して,電磁場と共振周波数を計算する.
  4. 共振周波数が2856[MHz]になるまで,この計算を繰り返す.
  5. 共振数は数が2856[MHz]になると,そのときの空洞形状パラメーターをインプットファイルの最終行に書き加える.

一連の作業を自動的に計算するPerlのプログラム(PB_tune.pl)

001   print "SUPERFISH has been started.\n";
002   
003   $file=@ARGV[0];
004   
005   $file_af   = $file.".af";
006   $file_T35  = $file.".T35";
007   $file_in7  = $file.".in7";
008   $file_SFO  = $file.".SFO";
009   $file_cell = $file.".dat";
010   $file_sf7  = "OUTSF7.TXT";
011   $file_gdf  = $file.".gdf";
012   
013   $file_name=$current_dir.$file_af;
014   
015   $it_max=10;
016   $error=1e-6;
017   
018   #------- cell shape parameter -----------
019   $title="S-Band Prebuncher for GPT test";
020   $mm=1;
021   $m=1e+3*$mm;
022   $sec=1;
023   $MHz=1e+6;
024   
025   $conv = 0.1;
026   $dx   = 0.2;
027   $freq = 2856;
028   $beta = 0.54822088;
029   
030   $pi=atan2(1,1)*4.0;
031   $light=2.99792458e+8*$m/$sec;
032   $lambda=$light/($freq*$MHz);
033   
034   
035   &read_cell_data;       # read cell data form input cell geometory file
036   &tune_b_acc;           # Tune b which is acc structure
037   &write_result;         # write result cell geometory
038   &make_gdf;             # make a gdf file
039   
040   
041   #====================================================
042   #        tunning the accelerating cavity radius
043   #====================================================
044   sub tune_b_acc{
045   
046       printf "\n";
047       @tune_b_acc[1]=$b2;
048       for($i=1; $i<=$it_max; $i++){
049       
050       write_sf_data(1, 1, $tune_b_acc[$i]);
051       
052       system "autofish $file_af";
053       @sf_frequency[$i]=&read_fr($file_SFO);
054       printf "\t%d\t%f\t%f\n",$i,@tune_b_acc[$i],@sf_frequency[$i];
055       if(abs((@sf_frequency[$i]-$freq)/$freq)<$error){last};
056       
057       
058       if($i==1){
059           @tune_b_acc[2]=@sf_frequency[1]*@tune_b_acc[1]/$freq;
060       }else{
061           @tune_b_acc[$i+1]=
062           (@tune_b_acc[$i]-@tune_b_acc[$i-1])
063           /(@sf_frequency[$i]-@sf_frequency[$i-1])
064           *($freq-@sf_frequency[$i])
065           +@tune_b_acc[$i];
066       }
067       }    
068   }
069   
070   #====================================================
071   #        read data
072   #====================================================
073   sub read_cell_data{
074   
075       open(CELL_DATA,"<$file_cell") or die "open: $!";
076   
077       while(<CELL_DATA>){
078       chomp;
079       if(/^#/){
080           next;
081       }
082   
083       @oneline = split(/\s+/,$_);
084   
085       $a2   = @oneline[0];
086       $b2   = @oneline[1];
087       $D    = @oneline[2];
088       $r    = @oneline[3];
089       $gap  = @oneline[4];
090       $addL = @oneline[5];
091       last;   
092       }
093   
094       close(CELL_DATA);
095   
096       &check_data;
097   
098   }
099   
100   #====================================================
101   #        check data
102   #====================================================
103   sub check_data{
104   
105       printf "2a    = %f\n",$a2;
106       printf "2b    = %f\n",$b2;
107       printf "D     = %f\n",$D;
108       printf "gap   = %f\n",$gap;
109       printf "addL  = %f\n",$addL;
110   }
111   
112   
113   #====================================================
114   #        write result
115   #====================================================
116   sub write_result{
117       open(CELL_DATA,">>$file_cell") or die "open: $!";
118   
119       printf CELL_DATA "\n%f\t%f\t%f\t%f\t%f\t%f",
120       $a2, $b2, $D, $r, $gap, $addL;
121   
122       close(CELL_DATA);
123   
124       printf "\n%f\t%f\t%f\t%f\t%f\t%f",
125       $a2, $b2, $D, $r, $gap, $addL;
126   }
127   
128   #====================================================
129   #        write superfish data
130   #====================================================
131   sub write_sf_data {
132       local($nbslf, $nbsrt);
133   
134       $nbslf = $_[0];
135       $nbsrt = $_[1];
136       $b2    = $_[2];
137       $a     = $a2/2.0;
138       $b     = $b2/2.0;
139       $xdri  = 0.0;
140       $ydri  = 0.99*$b;
141   
142       open(SF_DATA,">$file_af") or die "open: $!";
143   
144       printf SF_DATA "$title\n";
145       printf SF_DATA " \$reg kprob=1, dx=$dx, conv=$conv, kprob=1,\n";
146       printf SF_DATA " xdri=$xdri, ydri=$ydri,\n";
147       printf SF_DATA " nbsup=1, nbslo=0, nbslf=$nbslf, nbsrt=$nbsrt\n";
148       printf SF_DATA " freq=%f,\n",$freq;
149       printf SF_DATA " kmethod=1,\n";
150       printf SF_DATA " beta=%f\$\n",$beta;
151   
152       # ------ PB cell (lefr half)  -----------
153       printf SF_DATA "!--- PB cell (left half)  ---\n";
154       printf SF_DATA " \$po x=%f, y=%f \$\n", 0.0, 0.0;
155       printf SF_DATA " \$po x=%f, y=%f \$\n", -($D/2+$addL), 0.0;
156       printf SF_DATA " \$po x=%f, y=%f \$\n", -($D/2+$addL), $a;
157       printf SF_DATA " \$po x=%f, y=%f \$\n", -($gap/2+$r),  $a;
158       printf SF_DATA
159       " \$po nt=2, r=%f, theta=0, x0=%f, y0=%f \$\n",
160       $r,  -($gap/2+$r),  $a+$r;
161       printf SF_DATA
162       " \$po nt=2, r=%f, theta=90, x0=%f, y0=%f \$\n",
163       $r,  -($gap/2+$r),  $a+$r;
164       printf SF_DATA " \$po x=%f, y=%f \$\n", -$D/2+$r, $a+2*$r;
165       printf SF_DATA
166       " \$po nt=2, r=%f, theta=180, x0=%f, y0=%f \$\n",
167       $r, -$D/2+$r, $a+3*$r;
168       printf SF_DATA " \$po x=%f, y=%f \$\n", -$D/2, $b-$r;
169       printf SF_DATA
170       " \$po nt=2, r=%f, theta=90, x0=%f, y0=%f \$\n",
171       $r, -$D/2+$r, $b-$r;
172       printf SF_DATA " \$po x=%f, y=%f \$\n", 0.0, $b;
173   
174       # ------PB cell (right half)  -----------
175       printf SF_DATA "!--- PB cell (right half)  ---\n";
176       printf SF_DATA " \$po x=%f, y=%f \$\n", $D/2-$r, $b;
177       printf SF_DATA
178       " \$po nt=2, r=%f, theta=0, x0=%f, y0=%f \$\n",
179       $r, $D/2-$r, $b-$r;
180       printf SF_DATA " \$po x=%f, y=%f \$\n", $D/2, $a+3*$r;
181       printf SF_DATA
182       " \$po nt=2, r=%f, theta=270, x0=%f, y0=%f \$\n",
183       $r, $D/2-$r, $a+3*$r;
184       printf SF_DATA " \$po x=%f, y=%f \$\n", 0.5*$gap+$r, $a+2*$r;
185       printf SF_DATA
186       " \$po nt=2, r=%f, theta=180, x0=%f, y0=%f \$\n",
187       $r,  $gap/2+$r,  $a+$r;
188       printf SF_DATA
189       " \$po nt=2, r=%f, theta=270, x0=%f, y0=%f \$\n",
190       $r,  $gap/2+$r,  $a+$r;
191       printf SF_DATA " \$po x=%f, y=%f \$\n", 0.5*$D+$addL, $a;
192       printf SF_DATA " \$po x=%f, y=%f \$\n", 0.5*$D+$addL, 0.0;
193       printf SF_DATA " \$po x=%f, y=%f \$\n", 0.0, 0.0;
194       close SF_DATA;
195   
196   }
197   
198   #====================================================
199   #        READ frequency (***.SFO)
200   #====================================================
201   sub read_fr{
202   
203       local($file, $resonance_fr);
204       $file=$_[0];
205       
206       open(sfout,"<$file") or die "open:$file  $!";;
207       while(<sfout>){
208       chomp;
209       
210       if(/^Frequency\s+=/){
211           @oneline=split(/\s+/,$_);
212           $resonance_fr=@oneline[2];
213           next;
214       }
215       }
216   
217       close sfout;
218       return $resonance_fr;
219   }
220   
221   #====================================================
222   #        READ frequency and Rs etc (***.SFO)
223   #====================================================
224   sub read_SFO{
225   
226       my($file);
227       my($f, $U, $Q, $r, $r_ov_Q);
228   
229       $file   = $_[0];
230       $f      = 0;
231       $U      = 0;
232       $Q      = 0;
233       $r      = 0;
234       $r_ov_Q = 0;
235       
236       open(sfout,"<$file") or die "open:$file  $!";
237   
238       while(<sfout>){
239       chomp;
240       
241       if(/^All calculated values below refer to the mesh geometry only./){
242           last;
243       }
244       }
245   
246       while(<sfout>){
247       chomp;
248       
249       if(/^Frequency\s+=/){
250           @oneline=split(/\s+/,$_);
251           $f=@oneline[2];
252       }
253   
254       if(/^Stored\s+energy/){
255           @oneline=split(/\s+/,$_);
256           $U=@oneline[3];
257       }
258   
259   
260       if(/^Q\s+=/){
261           @oneline=split(/\s+/,$_);
262           $Q=@oneline[2];
263       }
264   
265       if(/Z\*T\*T/){
266           @oneline=split(/\s+/,$_);
267           $r=@oneline[6];
268       }
269   
270       if(/r\/Q/){
271           @oneline=split(/\s+/,$_);
272           $r_ov_Q=@oneline[2];
273       }
274   
275       if(/^Wall segments:/){last;}
276       }
277   
278       close sfout;
279       return ($f, $U, $Q, $r_ov_Q, $r);
280   }
281   
282   #====================================================
283   #    make a gdf file
284   #====================================================
285   sub make_gdf{
286       my($NZP, $NZM);
287       my($d, $max_r);
288       
289       $d=0.1;
290       $min_r = 0;
291       $max_r = $a2/2;
292       $min_z = -$D/2-$add_L;
293       $max_z =  $D/2+$add_L;
294   
295       open(IN7,">$file_in7") or die "open: $!";
296   
297       printf IN7 "rect noscreen\n";
298       printf IN7 "%.2f\t%.2f\t%.2f\t%.2f\n", $min_z, $min_r ,$max_z, $max_r;
299       printf IN7 "%d\t%d\n", ($max_z-$min_z)/0.1, ($max_r-$min_r)/0.1;
300       printf IN7 "end";
301   
302       close(IN7);
303   
304       system "sf7";
305       system "fish2gdf -o $file_gdf $file_sf7";
306   
307       
308   }

ページ作成情報

参考資料

  1. Gneral Particle Tracer — Programmer's Reference Version 2.80 —

更新履歴

2010年頃 ページの新規作成
2015年11月23日 フォーマット修正


no counter