Skip to content

Conversation

@DimAdam-01
Copy link
Contributor

@DimAdam-01 DimAdam-01 commented Jan 14, 2026

User description

User description

Description

Please include a summary of the changes and the related issue(s) if they exist.
Please also include relevant motivation and context.

IC Extrusion: The workflow for extending Initial Conditions to higher dimensions has been simplified. The updated methodology is now more robust and user-friendly.
Documentation & Examples: To assist users with this new methodology, three new reference examples have been uploaded to the repository (one 1D case and two 2D cases).

Fixes #(issue) [optional]

Type of change

Please delete options that are not relevant.

  • A current methodology being more user-friendly

Scope

  • This PR comprises a set of related changes with a common goal

How Has This Been Tested?

Please describe the tests that you ran to verify your changes.
Provide instructions so we can reproduce.
Please also list any relevant details for your test configuration

  • Test 1D Flamelet
  • Test 2D Premixed Flame interacting with 2 vortices (From pyro paper)
Flame_Vortex_Interaction.mp4
  • Test 2D Premixed Flame with perturbed flame front
Flame_Insta.mp4
  • What computers and compilers did you use to test this:

Checklist

  • I have added comments for the new code
  • I added Doxygen docstrings to the new code
  • I have made corresponding changes to the documentation (docs/)
  • I have added regression tests to the test suite so that people can verify in the future that the feature is behaving as expected
  • I have added example cases in examples/ that demonstrate my new feature performing as expected.
    They run to completion and demonstrate "interesting physics"
  • I ran ./mfc.sh format before committing my code
  • New and existing tests pass locally with my changes, including with GPU capability enabled (both NVIDIA hardware with NVHPC compilers and AMD hardware with CRAY compilers) and disabled
  • This PR does not introduce any repeated code (it follows the DRY principle)
  • I cannot think of a way to condense this code and reduce any introduced additional line count

If your code changes any code source files (anything in src/simulation)

To make sure the code is performing as expected on GPU devices, I have:

  • Checked that the code compiles using NVHPC compilers
  • Checked that the code compiles using CRAY compilers
  • Ran the code on either V100, A100, or H100 GPUs and ensured the new feature performed as expected (the GPU results match the CPU results)
  • Ran the code on MI200+ GPUs and ensure the new features performed as expected (the GPU results match the CPU results)
  • Enclosed the new feature via nvtx ranges so that they can be identified in profiles
  • Ran a Nsight Systems profile using ./mfc.sh run XXXX --gpu -t simulation --nsys, and have attached the output file (.nsys-rep) and plain text results to this PR
  • Ran a Rocprof Systems profile using ./mfc.sh run XXXX --gpu -t simulation --rsys --hip-trace, and have attached the output file and plain text results to this PR.
  • Ran my code using various numbers of different GPUs (1, 2, and 8, for example) in parallel and made sure that the results scale similarly to what happens if you run without the new code/feature

PR Type

Enhancement, Tests


Description

  • Simplified IC extrusion workflow with configurable file paths and extensions

  • Added two new 2D premixed flame chemistry examples with vortex and Landau instability

  • Implemented hardcoded IC cases 271 and 272 for flame-vortex interaction and perturbed flame front

  • Added 1D flamelet chemistry example with San Diego reaction mechanism

  • Updated global parameters to support flexible IC file directory configuration


Diagram Walkthrough

flowchart LR
  A["User Configuration<br/>files_dir & file_extension"] --> B["Global Parameters<br/>m_global_parameters.fpp"]
  B --> C["MPI Broadcast<br/>m_mpi_proxy.fpp"]
  C --> D["Extrusion Module<br/>ExtrusionHardcodedIC.fpp"]
  D --> E["2D Hardcoded IC<br/>2dHardcodedIC.fpp"]
  E --> F["Initialized Domain<br/>Case 271/272"]
  G["Example Cases<br/>1D_flamelet<br/>2D_premixed_flame_vortex<br/>2D_premixed_landau_insta"] --> H["Test Suite<br/>cases.py"]
  H --> I["Validation Results"]
Loading

File Walkthrough

Relevant files
Enhancement
3 files
2dHardcodedIC.fpp
Added hardcoded IC cases for flame-vortex and perturbed flame
[link]   
ExtrusionHardcodedIC.fpp
Refactored extrusion to use configurable file paths and extensions
[link]   
m_global_parameters.fpp
Added global parameters for IC file directory and extension
[link]   
Configuration changes
3 files
m_start_up.fpp
Added file directory and extension parameters to startup routine
[link]   
m_mpi_proxy.fpp
Added MPI broadcast for file directory and extension parameters
[link]   
case_dicts.py
Added file directory and extension parameter type definitions
[link]   
Tests
6 files
case.py
New 2D premixed flame with vortex interaction example case
+92/-0   
case.py
New 2D premixed flame with Landau instability example case
[link]   
case.py
New 1D flamelet chemistry example case configuration         
+72/-0   
sandiego.yaml
San Diego hydrogen-oxygen reaction mechanism for flamelet case
+304/-0 
cases.py
Added new chemistry example cases to test suite                   
[link]   
golden-metadata.txt
Test metadata for extrusion feature validation                     
[link]   
Documentation
1 files
case.md
Updated IC extrusion documentation with new parameter names
+2/-2     
Additional files
1 files
golden.txt [link]   

Summary by CodeRabbit

  • New Features

    • Added 1D flamelet example case with integrated Cantera gas-phase mechanism configuration.
  • Documentation

    • Updated case setup documentation with new file directory and extension pattern specifications.
    • Added usage notes describing perturbation-based approaches for flow instability studies.
  • Chores

    • Updated .gitignore to include IC data files under examples paths.

✏️ Tip: You can customize this high-level summary in your review settings.


CodeAnt-AI Description

Simplify and extend initial-condition extrusion and add chemistry example cases

What Changed

  • New configurable IC extrusion inputs: users can point to a folder of prim.* files and set a file-extension token (files_dir and file_extension) instead of editing hardcoded paths.
  • Added two 2D extrusion behaviors: a premixed-flame with two vortices (hcid 271) that adds vortex velocity perturbations, and a mapped wavy-front extrusion (hcid 272) that shifts 1D profiles across y to create Landau-type instabilities.
  • Included runnable example cases (1D flamelet, 2D premixed flame vortex, 2D premixed Landau instability) and associated chemistry data to demonstrate the new extrusion workflows.
  • Documentation updated to describe the files_dir/file_extension setup and where example IC files live.

Impact

✅ Clearer IC file configuration for extrusion
✅ Shorter setup to run 1D->2D/2D->2D extrusion cases
✅ Reproducible premixed-flame instability examples added

💡 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.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 14, 2026

📝 Walkthrough

Walkthrough

This PR introduces a new 1D flamelet example case using Cantera, demonstrating pre-built patch initial conditions with a files_dir and file_extension pattern. Changes include .gitignore updates to untrack example IC data files, documentation revisions explaining the new scheme, and new configuration files for the flamelet case.

Changes

Cohort / File(s) Summary
Gitignore Configuration
.gitignore
Added exception rule !examples/**/IC/*.dat to preserve example IC .dat files; formatting adjustment around .supercode/ entry with no functional change to ignore behavior.
Documentation Updates
docs/documentation/case.md
Replaced zeros_default/init_dir setup explanation with files_dir and file_extension pattern description; updated implementation reference from ExtrusionHardcodedIC.fpp to case.py; added Usage note on perturbations for flow instability studies.
New Flamelet Example
examples/1D_flamelet/case.py, examples/1D_flamelet/sandiego.yaml
Added new 1D flamelet case configuration script (72 lines) constructing a Cantera-based case dictionary with domain, time stepping, chemistry, and boundary condition parameters; paired with static Cantera YAML mechanism file (304 lines) defining gas-phase species, thermodynamics, transport, and reaction kinetics.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Suggested labels

Review effort 3/5, size:L

Suggested reviewers

  • sbryngelson

Poem

🐰 A flamelet ignites with care so new,
Cantera's chemistry shines bright and true,
With IC files and patches in place,
Our examples now show the flamelet's face! 🔥

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the main changes: simplification of Initial Condition extrusion workflow and addition of chemistry examples.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description check ✅ Passed The PR description provides a clear summary of changes, identifies the scope as related improvements, documents testing with example videos, and completes most checklist items appropriately.

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

✨ Finishing touches
  • 📝 Generate docstrings

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.

@codecov
Copy link

codecov bot commented Jan 14, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 43.04%. Comparing base (31c938f) to head (0918651).
⚠️ Report is 6 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #1109      +/-   ##
==========================================
- Coverage   44.00%   43.04%   -0.96%     
==========================================
  Files          71       71              
  Lines       20293    20730     +437     
  Branches     1982     2002      +20     
==========================================
- Hits         8929     8923       -6     
- Misses      10227    10580     +353     
- Partials     1137     1227      +90     

☔ 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.

Dimitrios Adam added 2 commits January 16, 2026 12:46
@DimAdam-01 DimAdam-01 marked this pull request as ready for review January 28, 2026 18:23
@qodo-code-review
Copy link
Contributor

PR Reviewer Guide 🔍

Here are some key observations to aid the review process:

⏱️ Estimated effort to review: 4 🔵🔵🔵🔵⚪
🧪 PR contains tests
🔒 No security concerns identified
⚡ Recommended focus areas for review

Possible Issue

The new interpolation path in hardcoded IC case (272) assumes x_coords is strictly monotonic and that x_coords(idx_hi) - x_coords(idx_lo) is non-zero. If x_coords contains duplicates, is not sorted, or has xRows < 2, the binary search and weight computation can lead to incorrect mapping or division-by-zero. Consider adding explicit guards/validation for these assumptions and defining expected behavior if violated.

case (271) ! Premixed Flame Vortices interctiom

    @: HardcodedReadValues()
    x1c = 0.0027_wp
    y1c = 0.005_wp
    x2c = 0.0027_wp
    y2c = 0.003_wp
    r1c = (x_cc(i) - x1c)**(2.0_wp) + (y_cc(j) - y1c)**(2.0_wp)
    r2c = (x_cc(i) - x2c)**(2.0_wp) + (y_cc(j) - y2c)**(2.0_wp)
    rvortex = 0.0005_wp
    cvortex = 6000.0_wp

    u1c = -cvortex*((y_cc(j) - y1c))*exp(-r1c/(2.0_wp*rvortex**2.0_wp))
    v1c = cvortex*((x_cc(i) - x1c))*exp(-r1c/(2.0_wp*rvortex**2.0_wp))

    u2c = cvortex*((y_cc(j) - y2c))*exp(-r2c/(2.0_wp*rvortex**2.0_wp))
    v2c = -cvortex*((x_cc(i) - x2c))*exp(-r2c/(2.0_wp*rvortex**2.0_wp))
    q_prim_vf(2)%sf(i, j, 0) = q_prim_vf(2)%sf(i, j, 0) + u1c + u2c
    q_prim_vf(3)%sf(i, j, 0) = v1c + v2c

case (272)

    @: HardcodedReadValues()

    y_center = y0_ref
    y_dist = y_cc(j) - y_center
    wave_phase = 2.0_wp*pi*Nwaves*(y_dist/Ly_param)
    front_shift = A_param*sin(wave_phase)

    x_mapped = x_cc(i) - front_shift

    if (x_mapped <= x_coords(1)) then
        do v = 1, sys_size - 1
            q_prim_vf(v + merge(1, 0, v >= momxe))%sf(i, j, 0) = stored_values(1, 1, v)
        end do
        q_prim_vf(momxe)%sf(i, j, 0) = 0.0_wp

    else if (x_mapped >= x_coords(xRows)) then
        do v = 1, sys_size - 1
            q_prim_vf(v + merge(1, 0, v >= momxe))%sf(i, j, 0) = stored_values(xRows, 1, v)
        end do
        q_prim_vf(momxe)%sf(i, j, 0) = 0.0_wp

    else
        idx_lo = 1; idx_hi = xRows
        do while (idx_hi - idx_lo > 1)
            idx_mid = (idx_lo + idx_hi)/2
            if (x_coords(idx_mid) <= x_mapped) then
                idx_lo = idx_mid
            else
                idx_hi = idx_mid
            end if
        end do

        interp_wt = (x_mapped - x_coords(idx_lo))/(x_coords(idx_hi) - x_coords(idx_lo))   ! weight in [0,1)

        do v = 1, sys_size - 1
            q_prim_vf(v + merge(1, 0, v >= momxe))%sf(i, j, 0) = (1.0_wp - interp_wt)*stored_values(idx_lo, 1, v) &
                                                                 + interp_wt*stored_values(idx_hi, 1, v)
        end do
        q_prim_vf(momxe)%sf(i, j, 0) = 0.0_wp
    end if
Momentum Reset

In case (272), after mapping/interpolating all primitive variables, only q_prim_vf(momxe) is explicitly zeroed. If this is a 2D configuration, leaving the other momentum component as interpolated (or stale) may be inconsistent with the intention of “no initial velocity” after perturbing the front. Please confirm whether momye (and possibly momze) should also be set to zero for this case.

case (272)

    @: HardcodedReadValues()

    y_center = y0_ref
    y_dist = y_cc(j) - y_center
    wave_phase = 2.0_wp*pi*Nwaves*(y_dist/Ly_param)
    front_shift = A_param*sin(wave_phase)

    x_mapped = x_cc(i) - front_shift

    if (x_mapped <= x_coords(1)) then
        do v = 1, sys_size - 1
            q_prim_vf(v + merge(1, 0, v >= momxe))%sf(i, j, 0) = stored_values(1, 1, v)
        end do
        q_prim_vf(momxe)%sf(i, j, 0) = 0.0_wp

    else if (x_mapped >= x_coords(xRows)) then
        do v = 1, sys_size - 1
            q_prim_vf(v + merge(1, 0, v >= momxe))%sf(i, j, 0) = stored_values(xRows, 1, v)
        end do
        q_prim_vf(momxe)%sf(i, j, 0) = 0.0_wp

    else
        idx_lo = 1; idx_hi = xRows
        do while (idx_hi - idx_lo > 1)
            idx_mid = (idx_lo + idx_hi)/2
            if (x_coords(idx_mid) <= x_mapped) then
                idx_lo = idx_mid
            else
                idx_hi = idx_mid
            end if
        end do

        interp_wt = (x_mapped - x_coords(idx_lo))/(x_coords(idx_hi) - x_coords(idx_lo))   ! weight in [0,1)

        do v = 1, sys_size - 1
            q_prim_vf(v + merge(1, 0, v >= momxe))%sf(i, j, 0) = (1.0_wp - interp_wt)*stored_values(idx_lo, 1, v) &
                                                                 + interp_wt*stored_values(idx_hi, 1, v)
        end do
        q_prim_vf(momxe)%sf(i, j, 0) = 0.0_wp
    end if
Offset Logic

The updated delta_x computation changes the 1D branch by removing the previous + x_step/2 shift. This can change global_offset_x (via nint(abs(delta_x)/x_step)) and potentially shift indexing by one cell depending on grid alignment and rounding. Please verify this against existing extrusion cases (especially 1D->2D) to ensure it doesn’t introduce silent off-by-one mapping or misalignment at domain boundaries.

if (.not. files_loaded) then
    max_files = merge(sys_size, sys_size - 1, num_dims == 1)

    do f = 1, max_files
        write (file_num_str, '(I0)') f
        fileNames(f) = trim(files_dir)//"/"//"prim."//trim(file_num_str)//".00."//trim(file_extension)//".dat"
    end do

    ! Common file reading setup
    open (newunit=unit2, file=trim(fileNames(1)), status='old', action='read', iostat=ios2)
    if (ios2 /= 0) call s_mpi_abort("Error opening file: "//trim(fileNames(1)))

    select case (num_dims)
    case (1, 2)  ! 1D and 2D cases are similar
        ! Count lines
        line_count = 0
        do
            read (unit2, *, iostat=ios2) dummy_x, dummy_y
            if (ios2 /= 0) exit
            line_count = line_count + 1
        end do
        close (unit2)

        xRows = line_count
        yRows = 1
        index_x = 0
        if (num_dims == 2) index_x = i
        @:ALLOCATE (x_coords(xRows), stored_values(xRows, 1, sys_size))

        ! Read data from all files
        do f = 1, max_files
            open (newunit=unit, file=trim(fileNames(f)), status='old', action='read', iostat=ios)
            if (ios /= 0) call s_mpi_abort("Error opening file: "//trim(fileNames(f)))

            do iter = 1, xRows
                read (unit, *, iostat=ios) x_coords(iter), stored_values(iter, 1, f)
                if (ios /= 0) call s_mpi_abort("Error reading file: "//trim(fileNames(f)))
            end do
            close (unit)
        end do

        ! Calculate offsets
        domain_xstart = x_coords(1)
        x_step = x_cc(1) - x_cc(0)
        delta_x = merge(x_cc(0) - domain_xstart, &
                        x_cc(index_x) - domain_xstart + x_step/2.0, num_dims == 1)
        global_offset_x = nint(abs(delta_x)/x_step)

Comment on lines +228 to +229
q_prim_vf(2)%sf(i, j, 0) = q_prim_vf(2)%sf(i, j, 0) + u1c + u2c
q_prim_vf(3)%sf(i, j, 0) = v1c + v2c
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggestion: Use symbolic momentum indices momxe and momye instead of hardcoded values, and correct the v component update to be additive. [general, importance: 7]

Suggested change
q_prim_vf(2)%sf(i, j, 0) = q_prim_vf(2)%sf(i, j, 0) + u1c + u2c
q_prim_vf(3)%sf(i, j, 0) = v1c + v2c
q_prim_vf(momxe)%sf(i, j, 0) = q_prim_vf(momxe)%sf(i, j, 0) + u1c + u2c
q_prim_vf(momye)%sf(i, j, 0) = q_prim_vf(momye)%sf(i, j, 0) + v1c + v2c


Setup: Only requires specifying `init_dir` and filename pattern via `zeros_default`. Grid dimensions are automatically detected from the data files.
Implementation: All variables and file handling are managed in `src/pre_process/include/ExtrusionHardcodedIC.fpp` with no manual grid configuration needed.
Setup: Only requires specifying `files_dir` and filename pattern via `file_extension`. The files are located, for example, at `examples/2D_case/IC`, and their format is `prim.XX.YY.files_extension.dat`.
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggestion: Clarify the example filename format in the documentation to show a concrete example, such as prim.XX.YY.dat, instead of using file_extension as a literal part of the name. [general, importance: 4]

Suggested change
Setup: Only requires specifying `files_dir` and filename pattern via `file_extension`. The files are located, for example, at `examples/2D_case/IC`, and their format is `prim.XX.YY.files_extension.dat`.
Setup: Only requires specifying `files_dir` and filename pattern via `file_extension`. The files are located, for example, at `examples/2D_case/IC`, and their format is `prim.XX.YY.dat` (assuming `file_extension` is set to `.dat`).

Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

2 issues found across 57 files

Prompt for AI agents (all issues)

Check if these issues are valid — if so, understand the root cause of each and fix them.


<file name="docs/documentation/case.md">

<violation number="1" location="docs/documentation/case.md:254">
P3: The filename example uses `files_extension` while the text defines the key as `file_extension`. This mismatch is likely a typo and could mislead users about the required filename pattern.</violation>
</file>

<file name="examples/1D_flamelet/sandiego.yaml">

<violation number="1" location="examples/1D_flamelet/sandiego.yaml:14">
P1: The phase element list omits carbon even though carbon-containing species are defined (CO/CO2/HCO). Add `C` to the elements list so the mechanism is valid.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.


Setup: Only requires specifying `init_dir` and filename pattern via `zeros_default`. Grid dimensions are automatically detected from the data files.
Implementation: All variables and file handling are managed in `src/pre_process/include/ExtrusionHardcodedIC.fpp` with no manual grid configuration needed.
Setup: Only requires specifying `files_dir` and filename pattern via `file_extension`. The files are located, for example, at `examples/2D_case/IC`, and their format is `prim.XX.YY.files_extension.dat`.
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Jan 28, 2026

Choose a reason for hiding this comment

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

P3: The filename example uses files_extension while the text defines the key as file_extension. This mismatch is likely a typo and could mislead users about the required filename pattern.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At docs/documentation/case.md, line 254:

<comment>The filename example uses `files_extension` while the text defines the key as `file_extension`. This mismatch is likely a typo and could mislead users about the required filename pattern.</comment>

<file context>
@@ -251,8 +251,8 @@ The code provides three pre-built patches for dimensional extrusion of initial c
 
-Setup: Only requires specifying `init_dir` and filename pattern via `zeros_default`. Grid dimensions are automatically detected from the data files.
-Implementation: All variables and file handling are managed in `src/pre_process/include/ExtrusionHardcodedIC.fpp` with no manual grid configuration needed.
+Setup: Only requires specifying `files_dir` and filename pattern via `file_extension`. The files are located, for example, at `examples/2D_case/IC`, and their format is `prim.XX.YY.files_extension.dat`.
+Implementation: All variables and file handling are managed in the `case.py` file of the simulation.
 Usage: Ideal for initializing simulations from lower-dimensional solutions, enabling users to add perturbations or modifications to the base extruded fields for flow instability studies.
</file context>
Suggested change
Setup: Only requires specifying `files_dir` and filename pattern via `file_extension`. The files are located, for example, at `examples/2D_case/IC`, and their format is `prim.XX.YY.files_extension.dat`.
Setup: Only requires specifying `files_dir` and filename pattern via `file_extension`. The files are located, for example, at `examples/2D_case/IC`, and their format is `prim.XX.YY.file_extension.dat`.
Fix with Cubic

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.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In @.gitignore:
- Line 26: The negation pattern "!examples/**/IC/*.dat" is placed before the
broader ignore "examples/**/*.dat" so it is ineffective; relocate the line
containing "!examples/**/IC/*.dat" to after the broader ignore pattern
"examples/**/*.dat" (or after the block of similar negations) and remove the
original occurrence so the IC .dat files are actually un-ignored.
🧹 Nitpick comments (5)
examples/1D_flamelet/sandiego.yaml (1)

14-15: Unused species definitions present in the file.

The phase declares elements: [H, O, N] and species list contains only H/O/N compounds, but the file also defines CO, CO2, and HCO (lines 160-211) which require element C. These species are not in the phase's species list and will be ignored by Cantera.

This appears to be residual content from the original San Diego mechanism. Consider removing the unused CO, CO2, and HCO species definitions (lines 160-211) for clarity, or add element C and include these species if they're needed.

examples/1D_flamelet/case.py (4)

3-4: Remove unused imports.

argparse and math are imported but never used in this file.

Suggested fix
 #!/usr/bin/env python3
 import json
-import argparse
-import math
 import os
 import cantera as ct

10-11: Cantera solution sol_L is created but never used.

The Cantera Solution object is instantiated and configured with temperature, pressure, and composition, but it's not used to derive any values for the case dictionary. If this is intentional scaffolding for future use, consider adding a comment. Otherwise, these lines can be removed.

Suggested fix if not needed
 current_dir = os.path.dirname(os.path.abspath(__file__))
 ctfile = "sandiego.yaml"
-sol_L = ct.Solution(ctfile)
-sol_L.TPX = 300, 8000, "O2:2,N2:2,H2O:5"
 L = 0.016

18-18: Unused variable SAVE_COUNT.

SAVE_COUNT = 1000 is defined but never referenced. NS (line 19) is used for t_step_save instead.

Suggested fix
 NT = int(Tend / dt)
-SAVE_COUNT = 1000
 NS = 1000

63-66: String values for numeric parameters may cause issues.

vel(1) and alpha_rho(1) are set as string "0" and "1" respectively. While this may work for analytical definitions (as per docs), these appear to be simple constant values. Consider using numeric literals for consistency with other numeric parameters in the case dictionary.

Suggested fix
-    "patch_icpp(1)%vel(1)": "0",
+    "patch_icpp(1)%vel(1)": 0,
     "patch_icpp(1)%pres": 1.01325e5,
     "patch_icpp(1)%alpha(1)": 1,
-    "patch_icpp(1)%alpha_rho(1)": "1",
+    "patch_icpp(1)%alpha_rho(1)": 1,


.DS_Store

!examples/**/IC/*.dat
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Gitignore negation pattern is in wrong position and will be ineffective.

The negation !examples/**/IC/*.dat on line 26 appears before the broader ignore pattern examples/**/*.dat on line 47. In .gitignore, later patterns override earlier ones, so IC .dat files will still be ignored.

Move this line after line 47 (or after line 64 where similar negations exist) to ensure IC data files are properly tracked.

Suggested fix

Move line 26 to after line 64, grouping it with similar negation patterns:

 examples/**/*.f90
 !examples/3D_lag_bubbles_shbubcollapse/input/lag_bubbles.dat
 !examples/3D_lag_bubbles_bubblescreen/input/lag_bubbles.dat
+!examples/**/IC/*.dat
 workloads/

And remove the current line 26.

🤖 Prompt for AI Agents
In @.gitignore at line 26, The negation pattern "!examples/**/IC/*.dat" is
placed before the broader ignore "examples/**/*.dat" so it is ineffective;
relocate the line containing "!examples/**/IC/*.dat" to after the broader ignore
pattern "examples/**/*.dat" (or after the block of similar negations) and remove
the original occurrence so the IC .dat files are actually un-ignored.

@codeant-ai
Copy link
Contributor

codeant-ai bot commented Jan 29, 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

@codeant-ai codeant-ai bot added the size:XL This PR changes 500-999 lines, ignoring generated files label Jan 29, 2026
@codeant-ai
Copy link
Contributor

codeant-ai bot commented Jan 29, 2026

Nitpicks 🔍

🔒 No security issues identified
⚡ Recommended areas for review

  • Offset calculation
    The change to the delta_x calculation for the 1D/2D branch removes the half-cell shift that was previously present for the first merge argument. This can cause an off-by-half-cell global offset (global_offset_x) for some domain mappings and num_dims==1, leading to incorrect indexing into stored_values and wrong initial-condition placement on the mesh. Verify intended alignment logic and restore consistent half-cell handling if required.

  • MPI ordering / robustness
    MPI_BCAST calls must be executed in the exact same order on all ranks. Adding new broadcasts increases coupling: verify that every process follows the same sequence and that the variables being broadcast are properly initialized on the root and have sufficient storage on receivers. Also consider checking ierr after critical broadcasts and handling/reporting errors.

  • Magic indices / inconsistent update
    The new vortex patch (case 271) writes into q_prim_vf(2) and q_prim_vf(3) directly and updates the first component by adding to the existing value while the second component is assigned (overwritten). Other code uses symbolic momentum indices (e.g. momxb, momxe). Hard-coded numeric indices risk incorrect mapping on different builds/configurations and the inconsistent additive vs. assignment semantics is likely a bug (it will overwrite preexisting v-component values). Prefer using the established momentum index symbols and consistent update strategy.

  • Potential deallocation error
    In the deallocation macro HardcodedDellacation, x_coords is deallocated inside the if (allocated(stored_values)) block without checking whether x_coords itself is allocated. If stored_values is allocated but x_coords is not, the unconditional DEALLOCATE(x_coords) will raise an error. Confirm deallocation guards for each allocatable.

  • Interpolation edge cases
    In the 1D->2D extrusion (case 272) the code computes interp_wt with a plain division by x_coords(idx_hi) - x_coords(idx_lo) and assumes it is non-zero and in [0,1). If the two x-coordinates are equal (or nearly equal) this causes division by zero or extreme weights; additionally numerical round-off could produce weights outside [0,1]. This should be guarded and clamped to maintain stability and avoid NaNs/Infs.

Comment on lines +63 to +66
"patch_icpp(1)%vel(1)": "0",
"patch_icpp(1)%pres": 1.01325e5,
"patch_icpp(1)%alpha(1)": 1,
"patch_icpp(1)%alpha_rho(1)": "1",
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggestion: Several fields in the case dict that represent numeric configuration values are provided as strings (for example patch_icpp(1)%vel(1) and patch_icpp(1)%alpha_rho(1)), which can cause downstream config parsers to treat them as strings and fail numeric operations; make these entries numeric (remove the quotes). [type error]

Severity Level: Major ⚠️
- ❌ Simulation config fields parsed as wrong types.
- ⚠️ Downstream numeric operations may misbehave.
Suggested change
"patch_icpp(1)%vel(1)": "0",
"patch_icpp(1)%pres": 1.01325e5,
"patch_icpp(1)%alpha(1)": 1,
"patch_icpp(1)%alpha_rho(1)": "1",
"patch_icpp(1)%vel(1)": 0,
"patch_icpp(1)%alpha_rho(1)": 1,
Steps of Reproduction ✅
1. Run the example script to emit JSON: `python examples/1D_flamelet/case.py`; the script
prints the `case` dict as JSON.

2. Parse the output JSON (e.g., `json.loads(...)`) and inspect keys "patch_icpp(1)%vel(1)"
and "patch_icpp(1)%alpha_rho(1)" defined at lines 63 and 66; both values are strings ("0"
and "1").

3. If a downstream consumer expects numeric types (e.g., performing arithmetic on these
config entries), it will receive strings and either convert them or raise a type-related
error in the consumer.

4. Observed result: mis-typed configuration values in produced JSON; behavior depends on
downstream code but can lead to incorrect numeric operations.
Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** examples/1D_flamelet/case.py
**Line:** 63:66
**Comment:**
	*Type Error: Several fields in the `case` dict that represent numeric configuration values are provided as strings (for example `patch_icpp(1)%vel(1)` and `patch_icpp(1)%alpha_rho(1)`), which can cause downstream config parsers to treat them as strings and fail numeric operations; make these entries numeric (remove the quotes).

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.

Comment on lines +10 to +12
ctfile = "h2o2.yaml"
sol_L = ct.Solution(ctfile)
sol_L.TPX = 300, 101325, "H:1"
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggestion: Creating the Cantera Solution at module import time will raise an exception (and perform heavy initialization) if the Cantera input file is missing or inaccessible and also prevents importing this module in contexts that only need metadata; defer construction of the Solution and use an explicit factory function (or handle errors) so imports don't fail and initialization is explicit. [possible bug]

Severity Level: Major ⚠️
- ❌ Example script fails when cantera file missing.
- ⚠️ Importing examples breaks docs/tests requiring introspection.
- ⚠️ CI that imports examples can error during import.
Suggested change
ctfile = "h2o2.yaml"
sol_L = ct.Solution(ctfile)
sol_L.TPX = 300, 101325, "H:1"
ctfile = os.path.join(current_dir, "h2o2.yaml")
def make_solution():
# Create and return a Cantera Solution when actually needed;
# avoid side effects at import time and surface file errors at call site.
sol = ct.Solution(ctfile)
sol.TPX = (300, 101325, "H:1")
return sol
Steps of Reproduction ✅
1. Run the example script directly: execute `python
examples/2D_premixed_landau_insta/case.py`. The interpreter runs top-level code starting
at `examples/2D_premixed_landau_insta/case.py:9` which sets `current_dir` and `ctfile`,
then calls `ct.Solution(ctfile)` at `.../case.py:11`.

2. If `examples/2D_premixed_landau_insta/h2o2.yaml` is missing or unreadable,
`ct.Solution(ctfile)` at `.../case.py:11` raises a Cantera/FileNotFound or parsing
exception immediately during import/run.

3. Import the module from another script (for metadata only): `from
examples.2D_premixed_landau_insta import case` triggers the same execution path and raises
at `.../case.py:11`, preventing simple introspection or documentation builds that import
example modules.

4. Observed behavior: import/run fails with an exception from Cantera at the call site
(`case.py:11`), and no lazy construction allows callers to handle or skip Cantera
initialization.
Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** examples/2D_premixed_landau_insta/case.py
**Line:** 10:12
**Comment:**
	*Possible Bug: Creating the Cantera Solution at module import time will raise an exception (and perform heavy initialization) if the Cantera input file is missing or inaccessible and also prevents importing this module in contexts that only need metadata; defer construction of the Solution and use an explicit factory function (or handle errors) so imports don't fail and initialization is explicit.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.

u2c = cvortex*((y_cc(j) - y2c))*exp(-r2c/(2.0_wp*rvortex**2.0_wp))
v2c = -cvortex*((x_cc(i) - x2c))*exp(-r2c/(2.0_wp*rvortex**2.0_wp))
q_prim_vf(2)%sf(i, j, 0) = q_prim_vf(2)%sf(i, j, 0) + u1c + u2c
q_prim_vf(3)%sf(i, j, 0) = v1c + v2c
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggestion: The v-component assignment overwrites any previously-initialized momentum instead of adding the vortex contribution; this will drop prior velocity values for that component. Change the assignment to add to the existing field value (consistent with the u-component update). [logic error]

Severity Level: Critical 🚨
- ❌ case 271 initial v-velocity overwritten on initialization.
- ⚠️ Premixed flame vortices example yields wrong initial flow.
- ⚠️ Regression for tests referencing 2-vortex example.
Suggested change
q_prim_vf(3)%sf(i, j, 0) = v1c + v2c
q_prim_vf(3)%sf(i, j, 0) = q_prim_vf(3)%sf(i, j, 0) + v1c + v2c
Steps of Reproduction ✅
1. Set up a simulation that uses hard-coded IC case 271: in the code path where select
case (patch_icpp(patch_id)%hcid) is evaluated in src/common/include/2dHardcodedIC.fpp,
ensure patch_icpp(patch_id)%hcid == 271 so execution enters the case block beginning at
line 211–216 (case (271), HardcodedReadValues() call at line 213).

2. HardcodedReadValues() (called at line 213) populates baseline q_prim_vf fields for the
patch; immediately after, the vortex contribution is computed at lines 223–227
(u1c,v1c,u2c,v2c). These lines exist in src/common/include/2dHardcodedIC.fpp:223–227.

3. The code writes the u-component by adding into the existing field (line 228), but
writes the v-component with a direct assignment (line 229). Run initialization and inspect
q_prim_vf(3)%sf(i,j,0) after initialization: it will equal v1c+v2c, overwriting any
pre-existing value set by HardcodedReadValues() or other initializations.

4. Expected outcome: prior v-momentum populated by HardcodedReadValues() is lost. To
verify, place a breakpoint or print after line 229 and confirm q_prim_vf(3)%sf differs
from the pre-call value. This demonstrates the overwrite at
src/common/include/2dHardcodedIC.fpp:229.
Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** src/common/include/2dHardcodedIC.fpp
**Line:** 229:229
**Comment:**
	*Logic Error: The v-component assignment overwrites any previously-initialized momentum instead of adding the vortex contribution; this will drop prior velocity values for that component. Change the assignment to add to the existing field value (consistent with the u-component update).

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.

real(wp) :: x_len, x_step, y_len, y_step
real(wp) :: dummy_x, dummy_y, dummy_z, x0, y0
integer :: global_offset_x, global_offset_y ! MPI subdomain offset
real(wp) :: delta_x, delta_y
character(len=100), dimension(sys_size) :: fileNames ! Arrays to store all data from files
character(len=150), dimension(sys_size) :: fileNames ! Arrays to store all data from files
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggestion: Elements of fileNames are declared with fixed length 150 and the code constructs full path strings by concatenating directory, filename, timestep and extension; long files_dir or file_extension values can cause truncation of the constructed filename leading to failed opens. Increase the per-element length to a safe value (or make the array allocatable with appropriate lengths) to avoid silent truncation. [possible bug]

Severity Level: Major ⚠️
- ❌ File open fails aborting initialization.
- ⚠️ Initial condition extrusion file reading.
- ⚠️ CI/test runs using long paths.
Suggested change
character(len=150), dimension(sys_size) :: fileNames ! Arrays to store all data from files
character(len=512), dimension(sys_size) :: fileNames ! Arrays to store all data from files
Steps of Reproduction ✅
1. Inspect the constructor of file path strings in the same macro: at the file-naming loop
(do f = 1, max_files) the code assigns fileNames(f) with
trim(files_dir)//"/"//"prim."//... (this assignment appears in the macro body where
fileNames is used to open files).

2. Set up a test case where files_dir or file_extension are long (for example a deeply
nested init directory or long timestep extension). Build and run the program that calls
HardcodedReadValues() so the macro executes the do f = 1, max_files loop and constructs
fileNames(f).

3. The assignment at that line will silently truncate to 150 characters if the
concatenated path exceeds length 150; afterwards the code calls open(newunit=unit2,
file=trim(fileNames(1)), ...) and open will fail because the truncated path is not a real
file path, leading to the s_mpi_abort("Error opening file: "//trim(fileNames(1))) path in
the macro.

4. Observe immediate program abort during initial-condition file reads caused by truncated
fileNames entries. This is reproducible by providing long directory or extension strings
and running any input that exercises HardcodedReadValues().
Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** src/common/include/ExtrusionHardcodedIC.fpp
**Line:** 45:45
**Comment:**
	*Possible Bug: Elements of `fileNames` are declared with fixed length 150 and the code constructs full path strings by concatenating directory, filename, timestep and extension; long `files_dir` or `file_extension` values can cause truncation of the constructed filename leading to failed opens. Increase the per-element length to a safe value (or make the array allocatable with appropriate lengths) to avoid silent truncation.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.

Comment on lines +43 to +44
call MPI_BCAST(files_dir, len(files_dir), MPI_CHARACTER, 0, MPI_COMM_WORLD, ierr)
call MPI_BCAST(file_extension, len(file_extension), MPI_CHARACTER, 0, MPI_COMM_WORLD, ierr)
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggestion: Using LEN(...) will broadcast the entire fixed-length character buffer including trailing spaces which can introduce unexpected padding in receivers and break subsequent string comparisons; use LEN_TRIM(...) to send only the meaningful characters. [logic error]

Severity Level: Major ⚠️
- ❌ Pre-processing file path and extension matching fails.
- ⚠️ Model/file I/O may silently use incorrect names.
Suggested change
call MPI_BCAST(files_dir, len(files_dir), MPI_CHARACTER, 0, MPI_COMM_WORLD, ierr)
call MPI_BCAST(file_extension, len(file_extension), MPI_CHARACTER, 0, MPI_COMM_WORLD, ierr)
call MPI_BCAST(files_dir, len_trim(files_dir), MPI_CHARACTER, 0, MPI_COMM_WORLD, ierr)
call MPI_BCAST(file_extension, len_trim(file_extension), MPI_CHARACTER, 0, MPI_COMM_WORLD, ierr)
Steps of Reproduction ✅
1. Run the code under MPI so the pre-processing phase executes (module m_mpi_proxy,
subroutine s_mpi_bcast_user_inputs) — see file src/pre_process/m_mpi_proxy.fpp around
lines 41-44. The MPI_BCAST calls for case_dir, files_dir, file_extension are executed at
lines 42-44.

2. On rank 0 provide a files_dir and file_extension that are shorter than their declared
fixed length (e.g. 'data/' and '.chem'). These are set by the input reader before
s_mpi_bcast_user_inputs is called.

3. When the two MPI_BCAST calls at lines 43 and 44 run they currently use len(...) and
will transmit the full declared character length including trailing spaces to all ranks.

4. On receiver ranks the received strings contain trailing spaces; any subsequent exact
string comparisons or filename concatenation in the pre-processing/path resolution will
observe mismatches (e.g. extension checks or file-open path lookups will fail or
misroute).
Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** src/pre_process/m_mpi_proxy.fpp
**Line:** 43:44
**Comment:**
	*Logic Error: Using LEN(...) will broadcast the entire fixed-length character buffer including trailing spaces which can introduce unexpected padding in receivers and break subsequent string comparisons; use LEN_TRIM(...) to send only the meaningful characters.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.

@@ -153,7 +153,8 @@ contains
viscous, bubbles_lagrange, bc_x, bc_y, bc_z, num_bc_patches, &
patch_bc, Bx0, relativity, cont_damage, igr, igr_order, &
down_sample, recon_type, muscl_order, &
simplex_perturb, simplex_params, fft_wrt
simplex_perturb, simplex_params, fft_wrt, &
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggestion: The identifier fft_wrt looks like a probable typo (perhaps intended fft_write or fft_wrt_mode) — a misspelled namelist name will not match the declaration in the parameter module and will trigger a namelist read error. Rename the namelist entry to the exact variable name used in m_global_parameters (or correct the variable name in the parameters module) so the namelist variable matches the declaration. [possible bug]

Severity Level: Major ⚠️
- ❌ Namelist read failing aborts all pre-process runs.
- ⚠️ Input parsing fragile to naming mismatches.
Suggested change
simplex_perturb, simplex_params, fft_wrt, &
simplex_perturb, simplex_params, fft_write, &
Steps of Reproduction ✅
1. On proc_rank == 0, s_initialize_mpi_domain calls s_read_input_file
(src/pre_process/m_start_up.fpp), which contains the namelist block at lines 153-157 that
includes the identifier fft_wrt (line 156).

2. If the variable in m_global_parameters is actually named fft_write (or another
different spelling), the read (1, NML=user_inputs, iostat=iostatus) will not map the
namelist record to a declared variable and may result in iostat /= 0.

3. After the read, the code checks iostat and, when non-zero, prints 'Invalid line in
namelist' and triggers s_mpi_abort, terminating the pre-process (this path is executed for
any run that reads pre_process.inp).

4. Reproducing: run the usual pre-process start (the initialization path that invokes
s_read_input_file) with a pre_process.inp that contains values; observe immediate abort
when the namelist contains an entry that doesn't match the declared variable name in
m_global_parameters.
Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** src/pre_process/m_start_up.fpp
**Line:** 156:156
**Comment:**
	*Possible Bug: The identifier `fft_wrt` looks like a probable typo (perhaps intended `fft_write` or `fft_wrt_mode`) — a misspelled namelist name will not match the declaration in the parameter module and will trigger a namelist read error. Rename the namelist entry to the exact variable name used in `m_global_parameters` (or correct the variable name in the parameters module) so the namelist variable matches the declaration.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.

Comment on lines +1088 to +1092
f'1D -> Chemistry -> Flamelet','examples/1D_flamelet/case.py',
mods={
**common_mods
},
override_tol= 10**(-10)
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggestion: The new Flamelet test is a 1D chemistry example but the call to define_case_f does not pass any CLI/ndim arguments like other nD chemistry cases; if the example's case.py expects an explicit --ndim argument it may default to the wrong dimensionality. Pass ['--ndim','1'] (or the expected CLI arguments) as the third positional parameter to ensure it runs as 1D. [logic error]

Severity Level: Major ⚠️
- ❌ Chemistry Flamelet example may run wrong dimension.
- ⚠️ CI chemistry tests may be invalidated.
- ⚠️ Example regression/validation confusing developers.
Suggested change
f'1D -> Chemistry -> Flamelet','examples/1D_flamelet/case.py',
mods={
**common_mods
},
override_tol= 10**(-10)
f'1D -> Chemistry -> Flamelet','examples/1D_flamelet/case.py', ['--ndim','1'],
mods={
**common_mods
},
override_tol= 1e-10
Steps of Reproduction ✅
1. Inspect chemistry_cases() in toolchain/mfc/test/cases.py: the earlier nD chemistry
examples pass ['--ndim', str(ndim)] (see the Perfect Reactor loop in the same function),
but the new Flamelet entry at toolchain/mfc/test/cases.py:1087-1093 omits CLI args.

2. Run list_cases() (entrypoint in the same file) so chemistry_cases() is executed and the
define_case_f call for Flamelet is appended to cases.

3. When the test harness later executes this example, the example's case.py
(examples/1D_flamelet/case.py) will receive no explicit --ndim value from define_case_f;
if that case.py expects an --ndim argument (pattern used by other nD examples), it will
fall back to its own default or internal detection and may run at a different
dimensionality.

4. Reproduce: compare behavior of examples/nD_perfect_reactor/case.py calls (which pass
['--ndim', str(ndim)]) against examples/1D_flamelet/case.py run created by the current
define_case_f entry; observe mismatched dimensional configuration or different runtime
parameters reported by the example.
Prompt for AI Agent 🤖
This is a comment left during a code review.

**Path:** toolchain/mfc/test/cases.py
**Line:** 1088:1092
**Comment:**
	*Logic Error: The new Flamelet test is a 1D chemistry example but the call to `define_case_f` does not pass any CLI/ndim arguments like other nD chemistry cases; if the example's `case.py` expects an explicit `--ndim` argument it may default to the wrong dimensionality. Pass ['--ndim','1'] (or the expected CLI arguments) as the third positional parameter to ensure it runs as 1D.

Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.

@codeant-ai
Copy link
Contributor

codeant-ai bot commented Jan 29, 2026

CodeAnt AI finished reviewing your PR.

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

Labels

Review effort 4/5 size:XL This PR changes 500-999 lines, ignoring generated files

Development

Successfully merging this pull request may close these issues.

1 participant