Accumulableしたい(G4VAccumulable

G4VAccumulableは、マルチスレッド環境で スレッドセーフなデータ収集するための抽象基底クラスです。 Geant4では、この機能を使って スレッドごとに独立してデータを蓄積し、 ラン終了時にマスタースレッドで統合(accumulate)できます。

この機能は、G4VAccumulableを継承した G4AccValue<T>や、 G4AccArray<T, N> といったテンプレートクラスとして実装されていて、 G4AccumulablelManagerを通じて登録、初期化、集約、リセットできます。

詳細はAccumulablesを参照してください。

ヒント

アキュムレーター は並列処理における一般的な概念のようです。 スレッドごとに安全に隔離した変数を保持し、 マスタースレッドで最終的に合算するという仕組みです。

Geant4ではG4VAccumulableクラスとして組み込み、 実際にはG4AccValue<T>などのテンプレートクラスで実装されています。

変数したい(G4AccValue

1G4Accumulable<> 変数名;

注釈

Geant4 11.3.0で、テンプレートクラス名が G4AccumlableからG4AccValueに変更になりました。 新しくアプリを作成する場合は G4AccValueを使う方がよさそうです。

 1// RunAction.hhのプライベート変数で定義
 2G4AccValue<G4double> energyEdeposit = 0;
 3
 4// RunAction::RunAction()
 5// コンストラクタでAccumulableManagerを作成
 6auto* am = G4AccumulableManager::Instance()
 7am->Register(energyDeposit);
 8
 9// RunAction::EndOfRunAction
10// ランの終了時にデータをマージ
11am->Merge();