Skip to content

Comments

Fix mv read loop hardcoding 4 instead of nnode#1190

Open
sbryngelson wants to merge 3 commits intoMFlowCode:masterfrom
sbryngelson:fix/mv-loop-nnode
Open

Fix mv read loop hardcoding 4 instead of nnode#1190
sbryngelson wants to merge 3 commits intoMFlowCode:masterfrom
sbryngelson:fix/mv-loop-nnode

Conversation

@sbryngelson
Copy link
Member

@sbryngelson sbryngelson commented Feb 21, 2026

User description

Summary

Severity: HIGH — mv data file loop uses wrong bounds and offsets when nnode != 4.

File: src/pre_process/m_start_up.fpp, lines 479-482

The pb (pressure) read loop just above correctly uses nnode for both the loop bound and file number offset calculation. The mv (mass/velocity) read loop immediately below hardcodes 4 instead.

Before

! pb loop (correct)
do r = 1, nnode
    write (file_num, '(I0)') sys_size + r + (i - 1)*nnode
    file_loc = ... '/pb' ...

! mv loop (wrong)
do r = 1, 4                                              ! should be nnode
    write (file_num, '(I0)') sys_size + r + (i - 1)*4    ! should be nnode
    file_loc = ... '/mv' ...

After

do r = 1, nnode
    write (file_num, '(I0)') sys_size + r + (i - 1)*nnode

Why this went undetected

nnode is 4 in the most common configuration, so the hardcoded value happens to be correct.

Test plan

  • Run bubble restart with non-default nnode value
  • Verify all mv data files are read correctly

🤖 Generated with Claude Code

Fixes #1210

Summary by CodeRabbit

  • Bug Fixes
    • Fixed MPI communication, packing/unpacking, I/O allocation and file indexing so bubble-related data now scale with the actual number of MPI nodes (nnode) instead of a fixed factor, correcting subarray views, buffer addressing, serial I/O ordering, and memory sizing for parallel and GPU-accelerated paths.

CodeAnt-AI Description

Use configured nnode for QBMM I/O and MPI buffers instead of hardcoded 4

What Changed

  • All places that previously assumed 4 QBMM quadrature nodes now use the configured nnode when sizing MPI I/O views, communication buffers, and reading mv/pb restart files.
  • Restart file reading now computes mv file numbers and MPI file offsets using nnode, so mv data is read correctly when nnode != 4.
  • MPI pack/unpack and buffer allocations/loop bounds were updated to match nnode, ensuring correct data layout during inter-process communication.

Impact

✅ Fewer restart failures with non-default nnode
✅ Correct mv mass/velocity data on restart when nnode != 4
✅ Correct MPI I/O and communication sizing for QBMM runs

💡 Usage Guide

Checking Your Pull Request

Every time you make a pull request, our system automatically looks through it. We check for security issues, mistakes in how you're setting up your infrastructure, and common code problems. We do this to make sure your changes are solid and won't cause any trouble later.

Talking to CodeAnt AI

Got a question or need a hand with something in your pull request? You can easily get in touch with CodeAnt AI right here. Just type the following in a comment on your pull request, and replace "Your question here" with whatever you want to ask:

@codeant-ai ask: Your question here

This lets you have a chat with CodeAnt AI about your pull request, making it easier to understand and improve your code.

Example

@codeant-ai ask: Can you suggest a safer alternative to storing this secret?

Preserve Org Learnings with CodeAnt

You can record team preferences so CodeAnt AI applies them in future reviews. Reply directly to the specific CodeAnt AI suggestion (in the same thread) and replace "Your feedback here" with your input:

@codeant-ai: Your feedback here

This helps CodeAnt AI learn and adapt to your team's coding style and standards.

Example

@codeant-ai: Do not flag unused imports.

Retrigger review

Ask CodeAnt AI to review the PR again, by typing:

@codeant-ai: review

Check Your Repository Health

To analyze the health of your code repository, visit our dashboard at https://app.codeant.ai. This tool helps you identify potential issues and areas for improvement in your codebase, ensuring your repository maintains high standards of code health.

Copilot AI review requested due to automatic review settings February 21, 2026 03:23
@codeant-ai
Copy link
Contributor

codeant-ai bot commented Feb 21, 2026

CodeAnt AI is reviewing your PR.


Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 21, 2026

Warning

Rate limit exceeded

@sbryngelson has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 29 minutes and 47 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between c4aa202 and cfca1b2.

📒 Files selected for processing (4)
  • src/common/m_mpi_common.fpp
  • src/pre_process/m_global_parameters.fpp
  • src/pre_process/m_start_up.fpp
  • src/simulation/m_global_parameters.fpp
📝 Walkthrough

Walkthrough

Replaced hardcoded multiplier 4 with the dynamic nnode across MPI communication buffers, MPI I/O allocations, file-indexing for qbmm bubble data reads, and related buffer indexing and loop bounds, making data layout and addressing depend on the number of nodes.

Changes

Cohort / File(s) Summary
MPI communication & buffers
src/common/m_mpi_common.fpp
Replaced nb*4 with nb*nnode across v_size, MPI subarray definitions, buffer indexing, packing/unpacking, and GPU parallel paths guarded by qbmm_comm.
Pre-process I/O & startup
src/pre_process/m_global_parameters.fpp, src/pre_process/m_start_up.fpp
Adjusted MPI I/O allocation ranges from sys_size + 2*nb*4 to sys_size + 2*nb*nnode; updated loop bounds and file-index calculations from (i-1)*4/loops to (i-1)*nnode/loops for qbmm (non-polytropic) bubble reads.
Simulation I/O initialization
src/simulation/m_global_parameters.fpp
Changed MPI I/O allocation and per-entry allocation upper bounds from sys_size + 2*nb*4 to sys_size + 2*nb*nnode for bubble-related entries.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Suggested labels

Review effort 3/5

Poem

🐰 Once four hops fit every trail,
Now nnode counts each bounding tail,
Buffers stretch and indices sway,
Nodes in chorus lead the way,
A rabbit cheers the new-scale tale 🥕

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning Linked issue #1210 addresses uninitialized time_real in Lagrangian bubble output, but the PR changes only replace hardcoded 4 with nnode and do not address the uninitialized variable bug. The PR does not fix the time_real uninitialized variable bug described in #1210. Either fix that bug or unlink the issue if this PR targets only the nnode parameterization.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main fix (mv loop hardcoding 4 instead of nnode), matching the primary change shown in src/pre_process/m_start_up.fpp.
Description check ✅ Passed The description comprehensively covers the bug, root cause, fix, and test plan. Both user and CodeAnt sections explain the issue clearly.
Out of Scope Changes check ✅ Passed All changes consistently replace hardcoded 4 with nnode across multiple files for QBMM parameter consistency, staying within the scope of fixing the hardcoded node count issue.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@codeant-ai codeant-ai bot added the size:XS This PR changes 0-9 lines, ignoring generated files label Feb 21, 2026
@codeant-ai
Copy link
Contributor

codeant-ai bot commented Feb 21, 2026

Nitpicks 🔍

🔒 No security issues identified
⚡ Recommended areas for review

  • Parallel I/O inconsistency
    The serial mv loop was updated to use nnode, but the parallel ic-reading loop still uses a hardcoded 4 in the bound sys_size + 2*nb*4. This is an inconsistency: parallel I/O ranges should be updated to use nnode as well (or otherwise validated) so serialized and parallel read logic match.

  • File-number string width
    file_num is allocated with length based only on sys_size digits. When computing filenames with indices like sys_size + r + (i-1)*nnode (and the pb/mv ranges), the printed numeric value may require more digits than computed. This can lead to truncated filenames or incorrect file names when nnode, nb, or sys_size grows. Ensure file_num can hold the maximum index used.

  • Serial mv loop update
    The serial mv file-read loop was changed to iterate r=1..nnode and to compute the file number using nnode (sys_size + r + (i-1)*nnode). Verify this matches the intended file-numbering scheme for all nb and nnode combinations and is consistent with the pb loop. Validate with non-default nnode to ensure expected files are opened and read.

@codeant-ai
Copy link
Contributor

codeant-ai bot commented Feb 21, 2026

CodeAnt AI finished reviewing your PR.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR fixes a bug in the bubble restart file reading logic where the mv data file loop was hardcoded to iterate 4 times instead of using the nnode variable, which could cause incorrect file reads when nnode != 4.

Changes:

  • Updated the mv data file loop to use nnode instead of the hardcoded value 4
  • Corrected the file number offset calculation to use nnode for proper indexing

cubic-dev-ai[bot]

This comment was marked as off-topic.

@codecov
Copy link

codecov bot commented Feb 21, 2026

Codecov Report

❌ Patch coverage is 10.00000% with 18 lines in your changes missing coverage. Please review.
✅ Project coverage is 44.05%. Comparing base (df28255) to head (5e704f7).
⚠️ Report is 10 commits behind head on master.

Files with missing lines Patch % Lines
src/common/m_mpi_common.fpp 7.14% 13 Missing ⚠️
src/pre_process/m_start_up.fpp 0.00% 3 Missing ⚠️
src/pre_process/m_global_parameters.fpp 33.33% 2 Missing ⚠️
Additional details and impacted files
@@           Coverage Diff           @@
##           master    #1190   +/-   ##
=======================================
  Coverage   44.05%   44.05%           
=======================================
  Files          70       70           
  Lines       20496    20496           
  Branches     1989     1989           
=======================================
  Hits         9030     9030           
  Misses      10328    10328           
  Partials     1138     1138           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@codeant-ai
Copy link
Contributor

codeant-ai bot commented Feb 22, 2026

CodeAnt AI is running Incremental review


Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

@codeant-ai codeant-ai bot added size:M This PR changes 30-99 lines, ignoring generated files and removed size:XS This PR changes 0-9 lines, ignoring generated files labels Feb 22, 2026
@codeant-ai
Copy link
Contributor

codeant-ai bot commented Feb 22, 2026

CodeAnt AI Incremental review completed.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/pre_process/m_start_up.fpp (1)

417-420: ⚠️ Potential issue | 🟡 Minor

file_num buffer may be too short for sys_size + nb*nnode when nnode is large.

The buffer is sized for the digit count of sys_size alone, but numbers written during pb/mv reads go up to sys_size + nb*nnode. For the current default (nnode = 4) this is benign because sys_size already incorporates nb*nmom (which exceeds nb*4). However, for larger nnode values — which this PR explicitly enables — the number of digits can increase, causing Fortran to fill file_num with '*' characters and silently failing to find the data file.

🐛 Proposed fix
-character(LEN= &
-          int(floor(log10(real(sys_size, wp)))) + 1) :: file_num
+character(LEN= &
+          int(floor(log10(real(sys_size + 2*nb*nnode, wp)))) + 1) :: file_num
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pre_process/m_start_up.fpp` around lines 417 - 420, The declaration for
file_num is too short because it only uses digits of sys_size; change the sizing
to compute the maximum possible index (e.g. max_index = sys_size + nb*nnode) and
use int(floor(log10(real(max_index, wp))) + 1) for the character(LEN=...) length
so file_num can hold numbers up to sys_size + nb*nnode; update any related
initializations that assume the old length and keep the symbol names file_num,
sys_size, nb, nnode, and wp to locate and modify the declaration and any
dependent code.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@src/pre_process/m_start_up.fpp`:
- Around line 417-420: The declaration for file_num is too short because it only
uses digits of sys_size; change the sizing to compute the maximum possible index
(e.g. max_index = sys_size + nb*nnode) and use int(floor(log10(real(max_index,
wp))) + 1) for the character(LEN=...) length so file_num can hold numbers up to
sys_size + nb*nnode; update any related initializations that assume the old
length and keep the symbol names file_num, sys_size, nb, nnode, and wp to locate
and modify the declaration and any dependent code.

@codeant-ai
Copy link
Contributor

codeant-ai bot commented Feb 23, 2026

CodeAnt AI is running Incremental review


Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

@codeant-ai codeant-ai bot added size:M This PR changes 30-99 lines, ignoring generated files and removed size:M This PR changes 30-99 lines, ignoring generated files labels Feb 23, 2026
@codeant-ai
Copy link
Contributor

codeant-ai bot commented Feb 23, 2026

CodeAnt AI Incremental review completed.

@codeant-ai
Copy link
Contributor

codeant-ai bot commented Feb 23, 2026

CodeAnt AI is running Incremental review


Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

@codeant-ai codeant-ai bot added size:M This PR changes 30-99 lines, ignoring generated files and removed size:M This PR changes 30-99 lines, ignoring generated files labels Feb 23, 2026
@codeant-ai
Copy link
Contributor

codeant-ai bot commented Feb 23, 2026

CodeAnt AI Incremental review completed.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
src/common/m_mpi_common.fpp (1)

742-757: collapse=4 with a 5-loop body — consider bumping to collapse=5 for GPU parallelism consistency.

The direction-1 qbmm_comm pb-pack loop has 5 levels (l, k, j, i, q) but uses collapse=4, leaving q sequential inside each thread. Every other qbmm direction pack/unpack loop (including the adjacent mv-pack on Line 759 and the direction-1 pb-unpack on Line 951) uses collapse=5. There is no data dependency preventing collapse=5 here; writes to buff_send(r) are unique per (l, k, j, i, q) combination.

♻️ Suggested fix
-                    $:GPU_PARALLEL_LOOP(collapse=4,private='[r]')
+                    $:GPU_PARALLEL_LOOP(collapse=5,private='[r]')
                     do l = 0, p
                         do k = 0, n
                             do j = 0, buff_size - 1
                                 do i = nVar + 1, nVar + nnode
                                     do q = 1, nb

Based on learnings: "When modifying MPI pack/unpack logic in one sweep direction, update all directions" — the same parallelism level should be consistent across the symmetric pack/unpack loops for correctness and maintainability.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/common/m_mpi_common.fpp` around lines 742 - 757, The GPU parallel loop
for the qbmm_comm pb-pack currently uses
$:GPU_PARALLEL_LOOP(collapse=4,private='[r]') but the loop body has five nested
loops (l,k,j,i,q), so change collapse=4 to collapse=5 to allow all five loops to
be collapsed for GPU parallelism; locate the qbmm_comm pack block that writes
buff_send(r) (the nested loops with r = ... and buff_send(r) = real(pb_in(...),
kind=wp)) and update the pragma to collapse=5 to match the adjacent mv-pack and
pb-unpack loops for consistency.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@src/common/m_mpi_common.fpp`:
- Around line 742-757: The GPU parallel loop for the qbmm_comm pb-pack currently
uses $:GPU_PARALLEL_LOOP(collapse=4,private='[r]') but the loop body has five
nested loops (l,k,j,i,q), so change collapse=4 to collapse=5 to allow all five
loops to be collapsed for GPU parallelism; locate the qbmm_comm pack block that
writes buff_send(r) (the nested loops with r = ... and buff_send(r) =
real(pb_in(...), kind=wp)) and update the pragma to collapse=5 to match the
adjacent mv-pack and pb-unpack loops for consistency.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9a63b88 and c4aa202.

📒 Files selected for processing (4)
  • src/common/m_mpi_common.fpp
  • src/pre_process/m_global_parameters.fpp
  • src/pre_process/m_start_up.fpp
  • src/simulation/m_global_parameters.fpp
🚧 Files skipped from review as they are similar to previous changes (3)
  • src/pre_process/m_global_parameters.fpp
  • src/simulation/m_global_parameters.fpp
  • src/pre_process/m_start_up.fpp

@MFlowCode MFlowCode deleted a comment from github-actions bot Feb 23, 2026
The pb loop just above correctly uses nnode for both the loop bound
and file number offset. The mv loop should match.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
sbryngelson and others added 2 commits February 23, 2026 21:22
…ommon

Fix all remaining instances of the literal integer 4 representing the
QBMM quadrature node count (nnode) across simulation and common modules,
completing the nnode parameterization started in the PR.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Fix remaining instances of the literal 4 representing QBMM quadrature
node count in pre_process/m_global_parameters.fpp and m_start_up.fpp,
consistent with the fixes already applied to common and simulation.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M This PR changes 30-99 lines, ignoring generated files

Development

Successfully merging this pull request may close these issues.

time_real used uninitialized in Lagrangian bubble output

1 participant