Message: Re: Saving partial results Not Logged In (login)
 Next-in-Thread Next-in-Thread
 Next-in-Forum Next-in-Forum

Warning Re: Saving partial results 

Forum: Multithreading
Re: None Saving partial results
Re: None Re: Saving partial results
Date: 26 Aug, 2015
From: Andrea Dotti <Andrea Dotti>

Hello again,

On Thu, 20 Aug 2015 14:38:48 GMT, herr_apa wrote:

> Hi again,
> I've worked some more on this problem, and now I have a different
> question: In multithreaded mode, how can I prompt a call to
> G4VUserActionInitialization::Build after having already called beamOn
> once?

You cannot. This is a kernel function being called by RunManager when thread need initialization (once and only once). Consider using setters/getters to add the functionality that you need. If you need to change something between runs, you can for example use a Setter method called by your RunAction.

> And here's some context if that helps. Let's go back to the 1000 events
> that I wanted to split up into 50-event slices. What I do now is loop
> over beamOn and execute twenty runs &#65533; 50 events each. The position of
> the initial particle is calculated by a dedicated class called
> ParticlePosition, that defines x(t). I added two new variables to this
> class: The total number of events to be simulated, Nsim (1000 in this
> example), and the number of events completed by previous runs, Noffset.
> Time then becomes t = (Noffset + N)/Nsim where N is the event number of
> the current event (i.e. a number between 0 and 49 in this example).
> Before each call to beamOn, I update Noffset. And this is where I run
> into trouble.
> The program is structured such that an ActionInitialization is created
> in the main function. This ActionInitialization has a ParticlePosition
> variable. In ActionInitialization::Build a PrimaryGeneratorAction is
> created, and the ParticlePosition is passed to its constructor.
> Everything works fine the first time beamOn is called. For each
> subsequent turn in the loop, I update the Noffset in the
> ParticlePosition owned by the ActionInitialization and call
> runManager->SetUserInitialization(actionInitialization) before the next
> call to beamOn. Had it been a single-threaded G4RunManager, Build would
> have been invoked. But because it is a G4MTRunManager, only
> BuildForMaster is invoked. No new PrimaryGeneratorAction object is
> created, because that happens in Build. How can I relay the updated
> ParticlePosition to my PrimaryGeneratorAction? Is there a way to destroy
> the worker threads and then re-create them (which would invoke Build)?

What you are doing is not a good idea. You should never call SetUserInitialization methods more than once. Again it is better that you add functionality to your derived user-action classes to modify internal parameters as you need. Also, currently, threads are a static pool and cannot be re-created.

I may be misinterpreting something here, but I think all your needs can be taken into account creating different user-actions. The goal of user-actions is to allow for changing the behavior of your application while keeping a clean and correct design.


> Thanks in advance!
> // Anders

 Add Message Add Message
to: "Re: Saving partial results"

 Subscribe Subscribe

This site runs SLAC HyperNews version 1.11-slac-98, derived from the original HyperNews