Garfield++ 2014/9/25 京大理 髙田淳史 Garfield++の出番。 Elmerで計算した電場を読み込んで ガス検出器のシミュレーション C++で記述 compile時にROOTと Garfield++のライブラリをLink ⇒ makefileを作っておくと便利 計算には時間がそれなりにかかります Makefile例 Source codeの流れ Magboltz ガスの定義 (組成・温度・圧力…) ComponentElmer geometry, 電場構造, 比誘電率の読み込み Sensor simulationするarea・電極の定義 AvalancheMicroscopic 増幅過程のシミュレーション Magboltz部分 MediumMagboltz *gas = new MediumMagboltz(); gas->SetComposition("ar", 90., "c2h6", 10); 組成の定義 (6種まで) gas->SetTemperature(293.15); 温度の定義 gas->SetPressure(760.); 圧力の定義 gas->EnablePenningTransfer(0.31, 0, "ar"); Penning効果の定義 gas->SetMaxElectronEnergy(200.); gas->EnableDrift(); Cross section tableの最大値 電子のdrift領域として定義 gas->Initialise(); gas->LoadIonMobility(“file名”) イオンのmobility 定義されているGas Garfield++のUser Guide Appendix Bにも記載 CF4, Ar, He, He-3, Ne, Kr, Xe, CH4, C2H6, C3H8, iC4H10, CO2, neoC5H12, H2O, O2, N2, NO, N2O, C2H4, C2H2, H2, D2, CO, Methylal, DME, Reid-Step, Maxwell-Model, C2F6, SF6, NH3, C3H6, cC3H6, CH3OH, C2H5OH, C3H7OH, Cs, F2, CS2, COS, CD4, BF3, C2HF5, C2H2F4, TMA, CHF3, CF3Br, C3F8, O3, Hg, H2S, nC4H10, nC5H12, N2 (Phelps), GeH4, SiH4 Penning effect 混合気体で起こる 励起状態の分子が、低いイオン化電位を もつ第二の気体分子に衝突して,イオン 化を起こし、自分は基底状態に戻る ガス増幅率の絶対値を計算したい場合は 必須 O. Sahin+, JINST (2010) S. Dildick氏Slideより Ar 90% + Ethane 10% r : Penning Transfer Rate □:No.10 2004/5/13 15:00 2004/5/13 23:40 ▲:No.16 2005/10/11 21:00 ■:イオンの数 ●:電子の数 • • Avalanche Sizeの 平均値をplot Penning Transfer Rateの文献値は 0.31±0.01 (JINST 2010 P05002) Ion Mobility 信号波形のシミュレーションには必須 Garfield++のSource Code内に Ar中のAr+ Ne中のNe+ CO2中のCO2+ のデータは存在 ComponentElmer部分 ComponentElmer *elm = new ComponentElmer(“gemcell/mesh.header”, “gemcell/mesh.elements”, “gemcell/mesh.nodes”, “gemcell/dielectrics.dat”, “gemcell/gemcel.result”, “cm"); elm->EnablePeriodicityX(); elm->EnableMirrorPeriodicityY(); elm->SetMedium(0, gas); MediumMagboltzの情報とリンク elm->SetWeightingField(“gemcell/gemcell_Wtlel.result”, “wtlel”); 重み付電場の読み込み 比誘電率data fileの作成 各物質の比誘電率をGarfield++に与える必要がある 金属に対しては”非常に大きな値”を入れることで近似 物質の数 物質のID 物質の比誘電率 重み付電場 信号を読み出す電極の電位を1 Vに それ以外の電極の電位を0 Vに設定し Elmerで電場を計算させる ⇒ 重み付電場 電荷qの荷電粒子が速度vで動くとき 読み出し電極に生じる電流は 𝑑𝑄 = 𝑞𝑣𝐸𝑤 𝐸𝑤 : 重み付電場 𝑑𝑡 Gemcellのsampleでは gemcell_Wtlel.sif で計算 Sensor部分 Sensor *sensor = new Sensor(); sensor->AddComponent(elm); sensor->SetArea(-axis_x, -axis_y, -axis_z, axis_x, axis_y, axis_z); Simulationするareaの範囲の定義 sensor->AddElectrode(elm, “wtlel”); 信号読み出し電極 sensor->SetTimeWindow(0, tEnd/nsBins, nsBins); 開始時刻 bin幅 bin数 増幅時の電子をトレース AvalancheMicroscopic部分 AvalancheMicroscopic *aval = new AvalancheMicroscopic(); aval->SetSensor(sensor) aval->AvalancheElectron( x, y, z, vx, vy, vz); int ne, ni; Seed電子の初期位置 aval->GetAvalancheSize(ne, ni); Seed電子の初速 増幅で生じた電子とイオンの数 int nd = aval->GetNumberOfElectronEndpoints(); for (int i=0; i<nd; i++) { double x0, y0, z0, t0, e0, x1, y1, z1, t1, e1; int status; 電子の初期位置・時刻・エネルギー aval->GetElectronEndpopint(i, x0, y0, z0, t0, e0, x1, y1, z1, t1, e1, status); } 電子の終着位置・時刻・エネルギー イオンの方は… AvalancheMC *ion = new AvalancheMC(); ion->SetSensor(sensor); ion->SetDistanceSteps(2e-4); int nd = aval->GetNumberOfElectronEndpoints(); for (int i=0; i<nd; i++) { double x0, y0, z0, t0, e0, x1, y1, z1, t1, e1; int status; aval->GetElectronEndpopint(i, x0, y0, z0, t0, e0, x1, y1, z1, t1, e1, status); ion->DriftIon(x0, y0, z0, t0); } なだれ電子の発生点にイオンを作って 個々に追尾する 信号波形 gas->LoadIonMobility(“file名”); elm->SetWeightingField(“file名”, “名前”); sensor->AddElectrode(elm, “名前”); sensor->SetTimeWindow(start, w_bin, n_bin); aval->EnableSignalCalculation(); ion->EnableSignalCalculation(); for( ; ; ){ sensor->ClearSignal(); for(int j=0; j<n_bin; j++) double w = sensor->GetSignal(“名前”, j); } イオン成分: GetIonSignal(“名前”, j) 電子成分: GetElectronSiganl(“名前”, j);
© Copyright 2025 ExpyDoc