Weight Window Birth Scaling (#3459)

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Paul Romano <paul.k.romano@gmail.com>
This commit is contained in:
John Tramm 2025-06-23 15:53:27 -05:00 committed by GitHub
parent 3d16d4b100
commit eaef13b9bc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 25 additions and 0 deletions

View file

@ -435,6 +435,7 @@ private:
double wgt_ {1.0};
double wgt_born_ {1.0};
double wgt_ww_born_ {-1.0};
double mu_;
double time_ {0.0};
double time_last_ {0.0};
@ -545,6 +546,10 @@ public:
double& wgt_born() { return wgt_born_; }
double wgt_born() const { return wgt_born_; }
// Weight window value at birth
double& wgt_ww_born() { return wgt_ww_born_; }
const double& wgt_ww_born() const { return wgt_ww_born_; }
// Statistic weight of particle at last collision
double& wgt_last() { return wgt_last_; }
const double& wgt_last() const { return wgt_last_; }

View file

@ -614,6 +614,10 @@ void initialize_history(Particle& p, int64_t index_source)
// Set particle track.
p.write_track() = check_track_criteria(p);
// Set the particle's initial weight window value.
p.wgt_ww_born() = -1.0;
apply_weight_windows(p);
// Display message if high verbosity or trace is on
if (settings::verbosity >= 9 || p.trace()) {
write_message("Simulating Particle {}", p.id());

View file

@ -73,10 +73,26 @@ void apply_weight_windows(Particle& p)
if (weight_window.is_valid())
break;
}
// If particle has not yet had its birth weight window value set, set it to
// the current weight window (or 1.0 if not born in a weight window).
if (p.wgt_ww_born() == -1.0) {
if (weight_window.is_valid()) {
p.wgt_ww_born() =
(weight_window.lower_weight + weight_window.upper_weight) / 2;
} else {
p.wgt_ww_born() = 1.0;
}
}
// particle is not in any of the ww domains, do nothing
if (!weight_window.is_valid())
return;
// Normalize weight windows based on particle's starting weight
// and the value of the weight window the particle was born in.
weight_window.scale(p.wgt_born() / p.wgt_ww_born());
// get the paramters
double weight = p.wgt();