Skip to content

Conversation

@RemiLehe
Copy link
Member

@RemiLehe RemiLehe commented Jul 12, 2022

The formula p_star_sq (which should always be a positive number) could occasionally return small negative numbers, due to machine-precision errors. (in the case where energy in the center-of-mass frame is very close to the mass energy of the two particles, i.e. when the particles have negligible kinetic energy in the center-of-mass frame). This is a problem because we later take the square root of p_star_sq in the code.

Therefore, this PR refactors this formula, so as to write it as the sum of 2 intrinsically positive numbers:

image

@RemiLehe RemiLehe marked this pull request as ready for review July 12, 2022 12:47
@RemiLehe RemiLehe closed this Jul 12, 2022
@RemiLehe RemiLehe reopened this Jul 12, 2022
@RemiLehe RemiLehe requested a review from NeilZaim July 12, 2022 12:49
Copy link
Contributor

@NeilZaim NeilZaim left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this PR. The formula looks good to me (note that there is a square missing at the end of the last parenthesis in the image).

I'm not yet 100% sure that the number can never be negative (see comment below), what do you think?

Also, be aware that the old formula is also currently used here: https://github.com/ECP-WarpX/WarpX/blob/32a5989d1765853a9bdac38d93c1c863790c65cc/Source/Particles/Collision/BinaryCollision/NuclearFusion/TwoProductFusionUtil.H#L109-L114

pow3(c_sq) * inv_four_pr * pow2(m1_sq - m2_sq) / E_star_sq;
// The expression below is specifically written in a form that avoids returning
// small negative numbers due to machine precision errors, for low-energy particles
const amrex::ParticleReal E_ratio = E_star/((m1 + m2)*c_sq);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we have a complete guarantee that this number will never be strictly smaller than 1? E.g. if all the momenta are 0, this corresponds to the ratio between sqrt(E_rest**2) and E_rest so it's not obvious which of the two numbers will be smaller within machine precision.

Copy link
Member Author

@RemiLehe RemiLehe Jul 12, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed. This could in principle be negative.

However, I introduced this formula also in this PR #3153, where it did suppress an earlier failure due to invalid values.
(See this failure: https://dev.azure.com/ECP-WarpX/WarpX/_build/results?buildId=9168&view=logs&jobId=fc138a38-7e4f-5d28-e3f1-923e4d419807&j=fc138a38-7e4f-5d28-e3f1-923e4d419807&t=7e91da1c-aa6d-5e37-9c36-add2c6c921e8)

So my (very incomplete) understanding at this point is that the effect that you describe is maybe possible, but is maybe not as common as the previous failure.

If we encounter issues in the future with this new formula, we could certainly reconsider its expression. As an alternative, we could also intentionally enforce that E_star is larger than (m1 + m2)*c_sq, in the code, by e.g. setting E_star = max( E_star, (m1 + m2)*c_sq ). What do you think?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That definitely makes sense to me.
I think I'm fine with both leaving it as it is (and reconsider if we encounter issues in the future) and with anticipating possible future issues by adding a line like E_star = max( E_star, (m1 + m2)*c_sq ).

Feel free to do what you think is best, I'll approve the PR in the meantime.

@RemiLehe
Copy link
Member Author

Thanks for checking the formula. I just updated it in the PR description.

@RemiLehe
Copy link
Member Author

RemiLehe commented Jul 12, 2022

Also: thanks for pointing out the other part of the code where this is used. I updated the formula accordingly.

@RemiLehe RemiLehe requested a review from NeilZaim July 12, 2022 14:18
@ax3l ax3l added the component: collisions Anything related to particle collisions label Jul 12, 2022
Copy link
Contributor

@NeilZaim NeilZaim left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks a lot for this PR! That's good to me!

@RemiLehe RemiLehe enabled auto-merge (squash) July 13, 2022 12:44
@RemiLehe RemiLehe requested a review from EZoni July 13, 2022 13:04
@RemiLehe RemiLehe merged commit a69b7a2 into BLAST-WarpX:development Jul 13, 2022
dpgrote pushed a commit to RemiLehe/WarpX that referenced this pull request Jul 30, 2022
…ST-WarpX#3229)

* Refactor code in fusion module to avoid machine-precision issues

* Update formula
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

component: collisions Anything related to particle collisions

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants