Set all tally estimators to collision in RR simulations - #4042

Open
nuclearkevin wants to merge 2 commits into
openmc-dev:developfrom
nuclearkevin:fix_rr_tally_map
Open

Set all tally estimators to collision in RR simulations#4042
nuclearkevin wants to merge 2 commits into
openmc-dev:developfrom
nuclearkevin:fix_rr_tally_map

Conversation

@nuclearkevin

Copy link
Copy Markdown
Member

Description

Obtaining results from a random ray simulation through the use of tallies in OpenMC relies of mapping each source region to a corresponding tally object. To facilitate this, source regions save the midpoint of the first ray that passes through them, which is then used to query tallies and find every tally object that maps spatially to the source region. In the vast majority of cases this works perfectly, however we run into issues when a tally is set to use a tracklength estimator. The filter matches run bins_crossed() using a position (r()) and previous position (r_last()) that are the same, which results in zero-lengths being returned. In most filters this still counts as a bin being hit, but in some cases (MOAB/XDG unstructured mesh tallies, and very rarely tallies with no filters applied) this will not be registered which leads to source regions missing tally objects.

This PR fixes this bug by silently setting all tallies to collision estimators before running a random ray simulation to ensure filter matches are obtained with r(). This has no impact on results as the random ray solver does not require the concept of estimators.

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 18) on any C++ source files (if applicable)
  • I have followed the style guidelines for Python source files (if applicable)
  • I have made corresponding changes to the documentation (if applicable)
  • I have added tests that prove my fix is effective or that my feature works (if applicable)

@GuyStenGuySten left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This feels a bit hacky.
Maybe it will be better to do something special in another place if we are in random ray mode.
Regardless, IMO you should add a test that now passes and used to fail without this change.

@GuyStenGuySten added the Bugs label Aug 3, 2026
@pshriwise

Copy link
Copy Markdown
Contributor

If we feel that the current behavior of the StructuredMesh::bins_crossed is correct (certainly is from the perspective of the random ray solver), then another option here would be to update the UnstructuredMesh::bins_crossed methods to call get_bin if the start and end position of a track are coincident and return that sole bin for consistency with the other mesh implementations.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@nuclearkevin@pshriwise@GuySten
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Set all tally estimators to collision in RR simulations - #4042

Open
nuclearkevin wants to merge 2 commits into
openmc-dev:developfrom
nuclearkevin:fix_rr_tally_map
Open

Set all tally estimators to collision in RR simulations#4042
nuclearkevin wants to merge 2 commits into
openmc-dev:developfrom
nuclearkevin:fix_rr_tally_map

Conversation

@nuclearkevin

Copy link
Copy Markdown
Member

Description

Obtaining results from a random ray simulation through the use of tallies in OpenMC relies of mapping each source region to a corresponding tally object. To facilitate this, source regions save the midpoint of the first ray that passes through them, which is then used to query tallies and find every tally object that maps spatially to the source region. In the vast majority of cases this works perfectly, however we run into issues when a tally is set to use a tracklength estimator. The filter matches run bins_crossed() using a position (r()) and previous position (r_last()) that are the same, which results in zero-lengths being returned. In most filters this still counts as a bin being hit, but in some cases (MOAB/XDG unstructured mesh tallies, and very rarely tallies with no filters applied) this will not be registered which leads to source regions missing tally objects.

This PR fixes this bug by silently setting all tallies to collision estimators before running a random ray simulation to ensure filter matches are obtained with r(). This has no impact on results as the random ray solver does not require the concept of estimators.

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 18) on any C++ source files (if applicable)
  • I have followed the style guidelines for Python source files (if applicable)
  • I have made corresponding changes to the documentation (if applicable)
  • I have added tests that prove my fix is effective or that my feature works (if applicable)

@GuyStenGuySten left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This feels a bit hacky.
Maybe it will be better to do something special in another place if we are in random ray mode.
Regardless, IMO you should add a test that now passes and used to fail without this change.

@GuyStenGuySten added the Bugs label Aug 3, 2026
@pshriwise

Copy link
Copy Markdown
Contributor

If we feel that the current behavior of the StructuredMesh::bins_crossed is correct (certainly is from the perspective of the random ray solver), then another option here would be to update the UnstructuredMesh::bins_crossed methods to call get_bin if the start and end position of a track are coincident and return that sole bin for consistency with the other mesh implementations.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@nuclearkevin@pshriwise@GuySten
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Set all tally estimators to collision in RR simulations - #4042

Open
nuclearkevin wants to merge 2 commits into
openmc-dev:developfrom
nuclearkevin:fix_rr_tally_map
Open

Set all tally estimators to collision in RR simulations#4042
nuclearkevin wants to merge 2 commits into
openmc-dev:developfrom
nuclearkevin:fix_rr_tally_map

Conversation

@nuclearkevin

Copy link
Copy Markdown
Member

Description

Obtaining results from a random ray simulation through the use of tallies in OpenMC relies of mapping each source region to a corresponding tally object. To facilitate this, source regions save the midpoint of the first ray that passes through them, which is then used to query tallies and find every tally object that maps spatially to the source region. In the vast majority of cases this works perfectly, however we run into issues when a tally is set to use a tracklength estimator. The filter matches run bins_crossed() using a position (r()) and previous position (r_last()) that are the same, which results in zero-lengths being returned. In most filters this still counts as a bin being hit, but in some cases (MOAB/XDG unstructured mesh tallies, and very rarely tallies with no filters applied) this will not be registered which leads to source regions missing tally objects.

This PR fixes this bug by silently setting all tallies to collision estimators before running a random ray simulation to ensure filter matches are obtained with r(). This has no impact on results as the random ray solver does not require the concept of estimators.

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 18) on any C++ source files (if applicable)
  • I have followed the style guidelines for Python source files (if applicable)
  • I have made corresponding changes to the documentation (if applicable)
  • I have added tests that prove my fix is effective or that my feature works (if applicable)

@GuyStenGuySten left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This feels a bit hacky.
Maybe it will be better to do something special in another place if we are in random ray mode.
Regardless, IMO you should add a test that now passes and used to fail without this change.

@GuyStenGuySten added the Bugs label Aug 3, 2026
@pshriwise

Copy link
Copy Markdown
Contributor

If we feel that the current behavior of the StructuredMesh::bins_crossed is correct (certainly is from the perspective of the random ray solver), then another option here would be to update the UnstructuredMesh::bins_crossed methods to call get_bin if the start and end position of a track are coincident and return that sole bin for consistency with the other mesh implementations.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@nuclearkevin@pshriwise@GuySten
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Set all tally estimators to collision in RR simulations - #4042

Open
nuclearkevin wants to merge 2 commits into
openmc-dev:developfrom
nuclearkevin:fix_rr_tally_map
Open

Set all tally estimators to collision in RR simulations#4042
nuclearkevin wants to merge 2 commits into
openmc-dev:developfrom
nuclearkevin:fix_rr_tally_map

Conversation

@nuclearkevin

Copy link
Copy Markdown
Member

Description

Obtaining results from a random ray simulation through the use of tallies in OpenMC relies of mapping each source region to a corresponding tally object. To facilitate this, source regions save the midpoint of the first ray that passes through them, which is then used to query tallies and find every tally object that maps spatially to the source region. In the vast majority of cases this works perfectly, however we run into issues when a tally is set to use a tracklength estimator. The filter matches run bins_crossed() using a position (r()) and previous position (r_last()) that are the same, which results in zero-lengths being returned. In most filters this still counts as a bin being hit, but in some cases (MOAB/XDG unstructured mesh tallies, and very rarely tallies with no filters applied) this will not be registered which leads to source regions missing tally objects.

This PR fixes this bug by silently setting all tallies to collision estimators before running a random ray simulation to ensure filter matches are obtained with r(). This has no impact on results as the random ray solver does not require the concept of estimators.

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 18) on any C++ source files (if applicable)
  • I have followed the style guidelines for Python source files (if applicable)
  • I have made corresponding changes to the documentation (if applicable)
  • I have added tests that prove my fix is effective or that my feature works (if applicable)

@GuyStenGuySten left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This feels a bit hacky.
Maybe it will be better to do something special in another place if we are in random ray mode.
Regardless, IMO you should add a test that now passes and used to fail without this change.

@GuyStenGuySten added the Bugs label Aug 3, 2026
@pshriwise

Copy link
Copy Markdown
Contributor

If we feel that the current behavior of the StructuredMesh::bins_crossed is correct (certainly is from the perspective of the random ray solver), then another option here would be to update the UnstructuredMesh::bins_crossed methods to call get_bin if the start and end position of a track are coincident and return that sole bin for consistency with the other mesh implementations.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@nuclearkevin@pshriwise@GuySten
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Set all tally estimators to collision in RR simulations - #4042

Open
nuclearkevin wants to merge 2 commits into
openmc-dev:developfrom
nuclearkevin:fix_rr_tally_map
Open

Set all tally estimators to collision in RR simulations#4042
nuclearkevin wants to merge 2 commits into
openmc-dev:developfrom
nuclearkevin:fix_rr_tally_map

Conversation

@nuclearkevin

Copy link
Copy Markdown
Member

Description

Obtaining results from a random ray simulation through the use of tallies in OpenMC relies of mapping each source region to a corresponding tally object. To facilitate this, source regions save the midpoint of the first ray that passes through them, which is then used to query tallies and find every tally object that maps spatially to the source region. In the vast majority of cases this works perfectly, however we run into issues when a tally is set to use a tracklength estimator. The filter matches run bins_crossed() using a position (r()) and previous position (r_last()) that are the same, which results in zero-lengths being returned. In most filters this still counts as a bin being hit, but in some cases (MOAB/XDG unstructured mesh tallies, and very rarely tallies with no filters applied) this will not be registered which leads to source regions missing tally objects.

This PR fixes this bug by silently setting all tallies to collision estimators before running a random ray simulation to ensure filter matches are obtained with r(). This has no impact on results as the random ray solver does not require the concept of estimators.

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 18) on any C++ source files (if applicable)
  • I have followed the style guidelines for Python source files (if applicable)
  • I have made corresponding changes to the documentation (if applicable)
  • I have added tests that prove my fix is effective or that my feature works (if applicable)

@GuyStenGuySten left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This feels a bit hacky.
Maybe it will be better to do something special in another place if we are in random ray mode.
Regardless, IMO you should add a test that now passes and used to fail without this change.

@GuyStenGuySten added the Bugs label Aug 3, 2026
@pshriwise

Copy link
Copy Markdown
Contributor

If we feel that the current behavior of the StructuredMesh::bins_crossed is correct (certainly is from the perspective of the random ray solver), then another option here would be to update the UnstructuredMesh::bins_crossed methods to call get_bin if the start and end position of a track are coincident and return that sole bin for consistency with the other mesh implementations.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@nuclearkevin@pshriwise@GuySten
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Set all tally estimators to collision in RR simulations - #4042

Open
nuclearkevin wants to merge 2 commits into
openmc-dev:developfrom
nuclearkevin:fix_rr_tally_map
Open

Set all tally estimators to collision in RR simulations#4042
nuclearkevin wants to merge 2 commits into
openmc-dev:developfrom
nuclearkevin:fix_rr_tally_map

Conversation

@nuclearkevin

Copy link
Copy Markdown
Member

Description

Obtaining results from a random ray simulation through the use of tallies in OpenMC relies of mapping each source region to a corresponding tally object. To facilitate this, source regions save the midpoint of the first ray that passes through them, which is then used to query tallies and find every tally object that maps spatially to the source region. In the vast majority of cases this works perfectly, however we run into issues when a tally is set to use a tracklength estimator. The filter matches run bins_crossed() using a position (r()) and previous position (r_last()) that are the same, which results in zero-lengths being returned. In most filters this still counts as a bin being hit, but in some cases (MOAB/XDG unstructured mesh tallies, and very rarely tallies with no filters applied) this will not be registered which leads to source regions missing tally objects.

This PR fixes this bug by silently setting all tallies to collision estimators before running a random ray simulation to ensure filter matches are obtained with r(). This has no impact on results as the random ray solver does not require the concept of estimators.

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 18) on any C++ source files (if applicable)
  • I have followed the style guidelines for Python source files (if applicable)
  • I have made corresponding changes to the documentation (if applicable)
  • I have added tests that prove my fix is effective or that my feature works (if applicable)

@GuyStenGuySten left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This feels a bit hacky.
Maybe it will be better to do something special in another place if we are in random ray mode.
Regardless, IMO you should add a test that now passes and used to fail without this change.

@GuyStenGuySten added the Bugs label Aug 3, 2026
@pshriwise

Copy link
Copy Markdown
Contributor

If we feel that the current behavior of the StructuredMesh::bins_crossed is correct (certainly is from the perspective of the random ray solver), then another option here would be to update the UnstructuredMesh::bins_crossed methods to call get_bin if the start and end position of a track are coincident and return that sole bin for consistency with the other mesh implementations.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@nuclearkevin@pshriwise@GuySten
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Set all tally estimators to collision in RR simulations - #4042

Open
nuclearkevin wants to merge 2 commits into
openmc-dev:developfrom
nuclearkevin:fix_rr_tally_map
Open

Set all tally estimators to collision in RR simulations#4042
nuclearkevin wants to merge 2 commits into
openmc-dev:developfrom
nuclearkevin:fix_rr_tally_map

Conversation

@nuclearkevin

Copy link
Copy Markdown
Member

Description

Obtaining results from a random ray simulation through the use of tallies in OpenMC relies of mapping each source region to a corresponding tally object. To facilitate this, source regions save the midpoint of the first ray that passes through them, which is then used to query tallies and find every tally object that maps spatially to the source region. In the vast majority of cases this works perfectly, however we run into issues when a tally is set to use a tracklength estimator. The filter matches run bins_crossed() using a position (r()) and previous position (r_last()) that are the same, which results in zero-lengths being returned. In most filters this still counts as a bin being hit, but in some cases (MOAB/XDG unstructured mesh tallies, and very rarely tallies with no filters applied) this will not be registered which leads to source regions missing tally objects.

This PR fixes this bug by silently setting all tallies to collision estimators before running a random ray simulation to ensure filter matches are obtained with r(). This has no impact on results as the random ray solver does not require the concept of estimators.

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 18) on any C++ source files (if applicable)
  • I have followed the style guidelines for Python source files (if applicable)
  • I have made corresponding changes to the documentation (if applicable)
  • I have added tests that prove my fix is effective or that my feature works (if applicable)

@GuyStenGuySten left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This feels a bit hacky.
Maybe it will be better to do something special in another place if we are in random ray mode.
Regardless, IMO you should add a test that now passes and used to fail without this change.

@GuyStenGuySten added the Bugs label Aug 3, 2026
@pshriwise

Copy link
Copy Markdown
Contributor

If we feel that the current behavior of the StructuredMesh::bins_crossed is correct (certainly is from the perspective of the random ray solver), then another option here would be to update the UnstructuredMesh::bins_crossed methods to call get_bin if the start and end position of a track are coincident and return that sole bin for consistency with the other mesh implementations.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@nuclearkevin@pshriwise@GuySten
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Set all tally estimators to collision in RR simulations - #4042

Open
nuclearkevin wants to merge 2 commits into
openmc-dev:developfrom
nuclearkevin:fix_rr_tally_map
Open

Set all tally estimators to collision in RR simulations#4042
nuclearkevin wants to merge 2 commits into
openmc-dev:developfrom
nuclearkevin:fix_rr_tally_map

Conversation

@nuclearkevin

Copy link
Copy Markdown
Member

Description

Obtaining results from a random ray simulation through the use of tallies in OpenMC relies of mapping each source region to a corresponding tally object. To facilitate this, source regions save the midpoint of the first ray that passes through them, which is then used to query tallies and find every tally object that maps spatially to the source region. In the vast majority of cases this works perfectly, however we run into issues when a tally is set to use a tracklength estimator. The filter matches run bins_crossed() using a position (r()) and previous position (r_last()) that are the same, which results in zero-lengths being returned. In most filters this still counts as a bin being hit, but in some cases (MOAB/XDG unstructured mesh tallies, and very rarely tallies with no filters applied) this will not be registered which leads to source regions missing tally objects.

This PR fixes this bug by silently setting all tallies to collision estimators before running a random ray simulation to ensure filter matches are obtained with r(). This has no impact on results as the random ray solver does not require the concept of estimators.

Checklist

  • I have performed a self-review of my own code
  • I have run clang-format (version 18) on any C++ source files (if applicable)
  • I have followed the style guidelines for Python source files (if applicable)
  • I have made corresponding changes to the documentation (if applicable)
  • I have added tests that prove my fix is effective or that my feature works (if applicable)

@GuyStenGuySten left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This feels a bit hacky.
Maybe it will be better to do something special in another place if we are in random ray mode.
Regardless, IMO you should add a test that now passes and used to fail without this change.

@GuyStenGuySten added the Bugs label Aug 3, 2026
@pshriwise

Copy link
Copy Markdown
Contributor

If we feel that the current behavior of the StructuredMesh::bins_crossed is correct (certainly is from the perspective of the random ray solver), then another option here would be to update the UnstructuredMesh::bins_crossed methods to call get_bin if the start and end position of a track are coincident and return that sole bin for consistency with the other mesh implementations.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@nuclearkevin@pshriwise@GuySten