QBnd: sample the boundary texture with POINT filtering#344
Conversation
760b0cb to
d4311d7
Compare
The boundary QTex was sampled with cudaFilterModeLinear, blending ~0.4% from the adjacent (categorically distinct) material/surface row on large (>5000-row) bnd tables, corrupting every per-photon material/surface lookup. Switch to POINT filtering (QBND_FILTER_POINT; run with =1). POINT also makes the wavelength axis nearest-bin, so qbnd::boundary_lookup recovers G4-style per-wavelength linear interpolation via a manual 2-tap lerp (material axis stays POINT). The two go together -- nearest-bin wavelength sampling alone is ~2.3% low on the dRICH count.
d4311d7 to
1961ad1
Compare
1961ad1 to
3f7e400
Compare
plexoos
left a comment
There was a problem hiding this comment.
I agree that boundary_lookup likely needs a correction here. As described, cudaFilterModeLinear appears to introduce cross-row blending on sufficiently large boundary textures, and that is a correctness issue because the y axis indexes categorical material/surface rows.
A few follow-ups would make the change easier to review:
- Please expand the PR description in plain English. It would help to explain that the boundary table is packed into a 2D texture,
xis wavelength,yis the material/surface row, why linear filtering was attractive originally, and why cross-row blending is a problem here. - Please add a reproducer that demonstrates the impact at the physics level if possible, for example wavelength distribution, hit counts, or another observable using one of the existing test geometries. At minimum, a focused regression test showing the cross-row contamination on a tall
bndtable would help. - Please route the toggle through the existing
Configmachinery rather than introducing a raw env var as the primary interface. An env var override is fine, but the default should preserve the current behavior for now. - If this remains configurable, the configuration should gate the full lookup strategy consistently. Right now the manual interpolation path changes in
qbnd.h, while the texture filter mode only changes when the env var is set.
The y-axis of the boundary texture indexes categorical material/surface rows. cudaFilterModeLinear blends adjacent rows on tall textures, corrupting lookups. POINT filtering with manual wavelength-axis interpolation is the correct approach — no toggle needed.
…clamp CPU-only mock-texture test verifying row isolation (no cross-row blending), wavelength-axis linear interpolation, and domain-edge clamping. The test caught a below-domain extrapolation bug: when nm < nm0, the interpolation weights went negative instead of clamping to bin 0. Fixed by clamping fx_idx before flooring.
…laration alignment)
Thanks for the review. Pushed three follow-up commits addressing all four points.
Note on test scope: the mock texture system ( |
cudaFilterModeLinear blends ~0.4% from the adjacent (categorically distinct) material/surface row on large (>5000-row) bnd tables, corrupting every per-photon material/surface lookup. Add a POINT-mode path selected by QBND_FILTER_POINT (run with QBND_FILTER_POINT=1).