物理の駅 by onsanai

Physics-station 研究で日々感じたことを忘れないための備忘録

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

Overview | geant4.web.cern.ch

WindowsでGeant4を入れたお話。

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

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

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

Geant4の入手

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

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

「compiled using Visual Studio 2017 (version 15.9.3) on Windows 7, 32 bits, executable installer」と書いてありますが、Windows10でも動きます。

コンパイル済みのライブラリは C:\Program Files (x86)\Geant4 10.5 にインストールしたとします。初期設定でそうなっていると思います。 変更する点は次の絵のPATHを通すところ。とりあえず下記のようにしておこう。

f:id:onsanai:20190412153006p:plain:w300
Geant4 Windows10 Install Options

ソースファイルの入手

インストールした先の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.5\include\Geant4
  • ライブラリファイル: プロパティ→構成プロパティ→リンカー→入力→追加の依存ファイル C:\Program Files (x86)\Geant4 10.5\lib\*.lib

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

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

G4LIB_BUILD_DLL
WIN32
_CRT_SECURE_NO_WARNINGS

を設定してください。

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

環境変数

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

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

G4ENSDFSTATEDATA=C:\G4ENSDFSTATE2.2
G4LEDATA=C:\G4EMLOW7.7
G4LEVELGAMMADATA=C:\PhotonEvaporation5.3
G4SAIDXSDATA=C:\G4SAIDDATA2.0
G4PARTICLEXSDATA=C:\G4PARTICLEXS1.1

以前は G4NEUTRONXSDATA=C:\G4NEUTRONXS1.4 が必要だったが、G4PARTICLEXSDATAに統合された?

コードの修正

下記のようなエラーが出ると思います。

Geant4\Geometry.cc(43): error C2039: 'Invisible': 'G4VisAttributes' のメンバーではありません。
Geant4\G4VisAttributes.hh(68): note: 'G4VisAttributes' の宣言を確認してください
Geant4\Geometry.cc(43): error C2065: 'Invisible': 定義されていない識別子です。

Geometry.cc の43行目を下記のように修正してください。

   logVol_World->SetVisAttributes (G4VisAttributes::GetInvisible());

動かしてみる

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

**************************************************************
 Geant4 version Name: geant4-10-05    (7-December-2018)
                       Copyright : Geant4 Collaboration
                      References : NIM A 506 (2003), 250-303
                                 : IEEE-TNS 53 (2006), 270-278
                                 : NIM A 835 (2016), 186-225
                             WWW : http://geant4.org/
**************************************************************

<<< 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 を使っても動きます。

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