Repository navigation
Fix numerical instability in D3 reference-weight derivatives - #8103
Merged
Merged
Conversation
ZhouXY-PKU
reviewed
Oct 9, 2026
ZhouXY-PKU
left a comment
Collaborator
There was a problem hiding this comment.
Maybe we can link an issue with wrong results of Mg slabs?
16 tasks
mohanchen
approved these changes
Oct 11, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #8106.
The current D3 implementation calculates the derivatives of normalized reference weights as follows:
double derivative = raw_derivative * normalization - raw[reference] * normalization_derivative * normalization * normalization;This expression is mathematically correct. However, when the coordination number (CN) is much higher than the reference values, the raw weights become extremely small. Floating-point underflow and cancellation can then produce incorrect derivatives, leading to unphysically large forces. This issue can be reproduced with an Mg slab (CN ≈ 12).
This PR replaces the calculation with log-sum-exp normalization and a numerically stable analytical derivative. By subtracting the maximum exponent before evaluating the weights, at least one scaled weight is exactly 1, preventing the normalization sum from underflowing. The derivative is then expressed directly in terms of normalized weights and the weighted average reference CN, avoiding the subtraction of large intermediate terms that should mathematically cancel. This ensures numerically stable derivatives even when the actual CN is far beyond the reference range. A regression test for high-CN Mg is also added.