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();