Windows10とVisual Studio 2017でGeant4を動かした

Geant4: A toolkit for the simulation of the passage of particles through matter

WindowsでGeant4を入れたお話。

皆さん誤解しているかもしれませんが、WindowsでGeant4は動きます。GUIや、他のLinuxにしか対応していないツールや、マルチスレッド関連を除けば、ちゃんと動きます。 深いことをやろうとすると動かなくなることがありますが、とりあえず構造を作って粒子を打ち込むのであればできる。

と思っていたわけだ。こんなに苦労するとは思わなかった(8時間ほど)。詰まったのは G4LIB_BUILD_DLLプリプロセッサに追加するところだった。一通り導入方法を書きます。質問があればコメントでどうぞ。

Geant4のWindows + Visual Studioでの導入方法

Geant4の入手

まず、ダウンロードページからデータファイルとコンパイル済みのライブラリを入手しましょう。

http://geant4.web.cern.ch/geant4/support/download.shtml

「compiled using VC++ 14.0 on Windows 7」と書いてありますが、VC++15は14と互換性があるので問題ないし、Windows10でも動きます。

コンパイル済みのライブラリは C:\Program Files (x86)\Geant4 10.3 にインストールしたとします。初期設定でそうなっていると思います。

ソースファイルの入手

インストールした先のexamplesにサンプルコードはありますが、分かりにくいです。全然ベーシックじゃねぇです。KEKのGean4初心者講習の実習用ソースコードの方が分かりやすいです。KEK万歳です。 Geant4Tutorial20171129\TutorialMaterials\P01_FirstStep\source にあります。 直下にある *.cc と、srcにある *.cc includeにある *.hh を使います。

KEK wiki https://wiki.kek.jp/display/geant4/Geant4+Japanese+Tutorial+for+Detector+Simulation+2017

ソリューション、プロジェクトを作る

Visual Studio 2017で、適当な名前を付けて作ってください。

先ほどの *.cc *.hh を全部コピーして、ソースファイルとヘッダーファイルに突っ込みます。正しい流儀ではありませんが、気にしたら負けです。

プロジェクトの設定

Visual Studio内で、インクルードパスを設定し、ライブラリファイルを設定します。

  • インクルードパス: プロパティ→構成プロパティ→VC++ディレクトリ→インクルードディレクトC:\Program Files (x86)\Geant4 10.3\include\Geant4
  • ライブラリファイル: プロパティ→構成プロパティ→リンカー→入力→追加の依存ファイル C:\Program Files (x86)\Geant4 10.3\lib\*.lib

適宜インストール先に置きかえてください。

いくつかのプリプロセッサを設定する必要があります。プリプロセッサは プロパティ→構成プロパティ→C/C++プリプロセッサプリプロセッサの定義に、

G4LIB_BUILD_DLL
WIN32
_CRT_SECURE_NO_WARNINGS

を設定してください。

上から、DLLを呼び出す(dllimport を使う)設定、Windowsのヘッダにするための設定、古いCの関数でエラーを出さないための設定です。

環境変数

環境変数のpathに C:\Program Files (x86)\Geant4 10.3\bin を追加しましょう。

データファイルの環境変数は適宜下記のものを設定してください。使う物理リストによっては他の変数を要求されることもあります。

G4ENSDFSTATEDATA=C:\G4ENSDFSTATE2.2
G4LEDATA=C:\G4EMLOW7.3
G4LEVELGAMMADATA=C:\PhotonEvaporation5.2
G4NEUTRONXSDATA=C:\G4NEUTRONXS1.4
G4SAIDXSDATA=C:\G4SAIDDATA1.1

動かしてみる

P1というサンプルコードを動かすと、次のようにコンソールに表示されて止まります。ここにコマンドを入れていくと、粒子を買えたりビームを打ったりすることができます。warningが出ていますが、とりあえず気にしません。なぜ出るのかエラい人教えてください。

*************************************************************
 Geant4 version Name: geant4-10-03-patch-03    (20-October-2017)
                      Copyright : Geant4 Collaboration
                      Reference : NIM A 506 (2003), 250-303
                            WWW : http://cern.ch/geant4
*************************************************************

<<< Geant4 Physics List simulation engine: FTFP_BERT 2.0


 FTFP_BERT : new threshold between BERT and FTFP is over the interval
 for pions :   3 to 12 GeV
 for kaons :   3 to 12 GeV
 for proton :  3 to 12 GeV
 for neutron : 3 to 12 GeV

### Adding tracking cuts for neutron  TimeCut(ns)= 10000  KinEnergyCut(MeV)= 0
Available UI session types: [ Win32, GAG, csh ]

-------- WWWW ------- G4Exception-START -------- WWWW -------
*** G4Exception : UI0002
      issued by : G4UIExecutive::G4UIExecutive()
Specified session type is not build in your system,
or no session type is specified.
A fallback session type is used.
*** This is just a warning message. ***
-------- WWWW -------- G4Exception-END --------- WWWW -------

Idle>

講義資料に使い方が載っています。やってみましょう。とりあえず色々動かしてみましょう。

https://wiki.kek.jp/display/geant4/Geant4+Japanese+Tutorial+for+Detector+Simulation+2017

ソースコードを書く

好きにソースコードを書きましょう。例えば、Geant4でHello World!を書くには次のようにするそうです。

#include <G4coutDestination.hh>

int main() {
    G4cout << "Hello world!" << G4endl;
}

IO部分はとりあえずの実装で良いなら、 std::coutstd::ofstream を使っても動きます。

では、良いシュミレーションライフを。