Incorrect machine constant checks for Legendre recursion relations #106
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.
Summary
Previous version of the code used the minimum floating number not the minimum
epsilonsuch that1+epsilon != 1, which it should have used.Fix
Use additive machine constants from C++
limitsto set epsilon in Legendre functions on CPU and GPU. The assumption here is that both are use IEEE 754 standard for FP arithmetic. On the GPU side, the constant is set to float or double based on the value ofcuREALincudaUtil.cuH.Details
The gaff was discovered in positional quiet starts that happened to have
|cos(\theta)| = 1. This resulted ininffor Legendre function derivatives owing to divide by zero rather than cancellation. This has been rechecked with the fix enabled on the same previously failing ICs.