|Message: Re: Saving partial results||Not Logged In (login)|
Click on the Forum title, e.g. on the "Forums by Category" page, to read a sequence of postings to the Forum and its threads all in one page. If you are only interested in one thread or the thread following a specific posting, click the thread or the posting, which takes you to a smaller page, which contains only the part you are interested in and may be easier to navigate.
Messages are "chained" if there are only replies at the first level, i.e. 1/1.html, 1/1/1.html etc. In case of "chained" messages the message number is replaced by the icon and there is no indentation.
Inline: Display the subject line only or also the text of the posting(s); for the choice "All" the "Outline" choices are switched off.
|1||0||1||no text / full text of posting|
|2||1||All||text for level 1 only / text for All postings|
Outline: Choose the depth of the posting thread, successive toggle controls provide increasing detail.
|1||2||1||2 levels / 1 level (original posting)|
|2||3||2||3 levels / 2 levels|
|3||3||All||3 levels / all levels (all postings)|
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 � 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 >