入力
電磁場取り込み
SUPERFISH
User elemetns
Python
|
GPT電磁場取り込み SUPERFISHSUPERFISH の電磁場を取り込みトラッキング計算SUPERFISHで計算した電磁場を含め,GPTを用いたビームトラッキング計算を行う方法を示します.「SUPERFISHの電磁場をGPTファイルで,どのように取り扱うのか?」が最も重要なテーマとなります. 目次はじめにここでは,SUPERFISHで計算された電磁場をGPTに取り込んで,ビームトラッキングを行う方法を示します.そのためには,SUPERFISHの計算結果をGPTに取り込めるファイル形式に変換しなくてはなりません.そして,そのファイルをGPTで適切に読み込む必要があります.このWEBページでは,これらの一連の作業について,詳しく説明します. 作業の詳細については次節以降に示しますが,その前に,読者の理解を助けるために,予め作業のだいたいの流れを示した方がよいでしょう.
計算モデルRFの空洞を使った加速器のモデルとして,プリバンチャーでのビームの挙動の計算を例題に取り上げます.ここで計算するモデルを図1に示します.プリバンチャー空洞はz=100[mm]の位置し,それにより100[KeV]のビームがエネルギー変調(速度変調)を受けます.そして,ドリフとすーペースを進むうちに,ビームはバンチングします. プリバンチャーの運転周波数は 2856[MHz]とし,入射のRF電力は 1[KW]とします.空洞のマッチングは「β=1」の完全なマッチングを仮定し,反射電力はないものとします. また,プリバンチャーに入射される電子ビームの長さは,287[mm]とします.これは,2856[MHz]の5周期です.この電子ビームの空間電荷効果は無視します.したがって,シミュレーションではビームの電流値は意味を持ちません.ビームはエミッタンスゼロの平行ビームとし,直径は5[mm]です. このモデルの計算を行う場合,プリバンチャーの電磁場をきちんと,GPTのトラッキングに反映すること—が重要です.
SUPERFISHの計算軸対称構造のTM0モードの電磁場の計算には,SUPERFISHが適しています.加速器の世界で,長年にわたって使われてきました.ここでは,それを用いてプリバンチャーの電磁場を計算します. プリバンチャーの形状とSUPERFISH入力データ計算するプリバンチャーの形状を,図2に示します.この空洞の共振周波数を2856[MHz]にするために,空洞の直径(69.5664[mm])が中途半端な値になっています. このプリバンチャーのRF特性を計算するためのSUPERFISHの入力データを以下に示します.ここでは,このデータの内容については説明しません. このデータを「PB.af」という名前のテキストファイルで保存します.ファイル名にはそれほどの制約はありませんが,アルファベットとアンダースコアのみで構成することを勧めます.拡張子は,「af」とする必要があります. SUPERFISHがきちんとインストールされていれば,このデータファイル「PB.af」をダブルクリックするか,コマンド「autofish PB.af」をタイプすることにより,SUPERFISHによる計算が実行されます.計算が完了すると様々な,計算結果のファイルが出来上がります. 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 $
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 さらに,計算結果の「PB.T35」ファイルをダブルクリックすると,図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でSF7GUIはお手軽ですが,バッチ処理などの自動化ができないので不便な方法です.次の手順で,フィールドマップのファイル「OUTSF7.TXT」を作成します.
以上の操作により,フィールドマップが書かれたテキストファイル「OUTSF7.TXT」が作成されます.テキストファイルなので,確認のために,一度,その内容を見ることを勧めます.
CUIでSF7次に,コマンドをタイプする CUI での方法を示します.今では,コマンドが苦手な読者も多いと思いますが,慣れると大変便利です.この方法ではバッチ処理が可能で,簡単なプログラムを記述するだけで,様々な自動化ができます.
001 rect noscreen 002 -35.00 0.00 35.00 7.50 003 700 75 004 end 以上の操作により,フィールドマップが書かれたテキストファイル「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でしょう.
GPTでのビームトラッキングここでは,前節で作成したgdfフォーマットのSUPERFISHの結果をGPTでビームトラッキングする具体的な方法を示します. GPTのインプットファイルフィールドマップのGDFファイルをGPTに取り込むコマンドは, map25D_TM(ECS, mapfile.gdf, r, z, Er, Ez, Bphi, 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行)を理解してください. 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)を書くためのコマンドです. 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のビームトラッキングにより得られた結果のプロットです.プリバンチャーに電子ビームがバンチングされたことが分かるでしょう.
計算結果の確認ここでの一連の作業,(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)がほとんど一致していることが分かります.したがって,ここでの計算は正しいと結論できます.
わずかではありますが,なぜ,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個のパラメーターで,空洞の形状を表します.
自動計算には,プログラムのインプットとなる空洞形状を表したパラメーターのファイルが必要です.ここでは,次のようなファイル(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 このプログラムは,次のように動作します.
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 } ページ作成情報参考資料
更新履歴
|