RunManagerしたい(G4RunManagerFactory

1#include "G4RunManagerFactory.hh"
2auto rm = G4RunManagerFactory::CreateRunManager();
3
4// デフォルト:マルチスレッド処理
5// auto rm = G4RunManagerFactory::CreateRunManager(G4RunManagerType::Default);
6
7// シングルスレッド
8// auto rm = G4RunManagerFactory::CreateRunManager(G4RunManagerType::Serial);

G4RunManagerはGeant4シミュレーション全体を統括する中核的なシングルトンです。 ジオメトリ構築(G4VUserDetectorConstruction)、 物理プロセスの定義(G4VUserPhysicsList)、および ユーザーアクション(G4UserRunActionなど)を登録し、 初期化、実行、終了までの一連の流れを管理します。

G4RunManagerはクラス名の通り「実験責任者」の役割を担っており、 ユーザーはmain()関数からこのインスタンスに話しかけて実験(シミュレーション)を指示します。

注釈

以前はG4RunManagerクラスを使っていました。 Geant4.11でマルチスレッド対応が追加されたため、 G4RunManagerFactoryを通じて、インスタンスを作成するのがよいみたいです。

実験を開始したい(G4RunManager::Initialize

1auto rm = new G4RunManager();
2rm->SetUserInitialization(new MyGeometry{});
3rm->SetUserInitialization(new MyPhysics{});
4rm->SetUserInitialization(new MyAction{});
5rm->Initialize();

ユーザーは、メインとなるファイルの中でG4RunManagerクラスを 明示的にnewで生成し、各種の設定をした後に、Initialize()BeamOn()を呼び出します。 また、シミューレーション実行中は、測定器の構造や相互作用などが 途中で変更されないように管理してくれます。

粒子を入射したい(G4RunManager::BeamOn

1G4int n_events = 100;
2rm->BeamOn(n_events);

BeamOnで粒子を入射(発生)できます。 引数にイベント数を設定して、1回のランで複数回のイベントを実行できます。

マクロで操作したい(/run/

/run/numberOfThreads 8
/run/initialize
/run/beamOn 100

/run/コマンドでマクロ操作できます。 マルチスレッドモードのアプリの場合、使用するスレッドの数もマクロから変更できます。

シングルスレッドしたい(G4RunManagerType::Serial

1#include "G4RunManagerFactory.hh"
2
3auto* rm = G4RunManagerFactory::CreateRunManager(G4RunManagerType::Serial);

G4RunManagerType::Serialで、 シングルスレッドモードに変更できます。

ヒント

Geant4.11からマルチスレッドに対応しましたが、 マルチスレッド処理できることと、 その出力結果が正しいかどうかは別物です。

Geant4はあくまでシミュレーションをするためのツールキットであるため、その出力結果の妥当性はユーザーが確認&判断する必要があります。

Geant4講習会2024に参加し、エキスパートたちに聞いたところ、 マルチスレッドのアプリはデバッグが超大変だよと言ってました。 まず、シングルスレッドで十分テスト&デバッグしてから、 マルチスレッド化にトライするのがよいそうです。

マルチスレッドしたい(G4RunManagerType::Default

1#include "G4RunManagerFactory.hh"
2
3auto rm = G4RunManagerFactory::CreateRunManager(G4RunManagerType::Default);
4rm->SetNumberOfThreads(8);

マルチスレッド機能を有効にしてビルドしていると、 デフォルトでマルチスレッドモードになります。 SetNumberOfThreadsでスレッド数を変更できます。

このクラスは、Geant4本体をビルドした環境に応じたランマネージャーを作成します。 具体的には、マルチスレッド機能が有効な場合はG4MTRunManager、 無効な場合はG4RunManagerのインスタンスを作成します。

ランマネージャーを取得したい(GetRunManager

1auto* rm = G4RunManager::GetRunManager();
2auto* rm = G4RunManagerFactory::GetMasterRunManager();

作成済みのランマネージャーへのポインターを取得できます。