Skip to content

Fix MLMG boundary coefficients and improve PFMG stability#237

Merged
jameslehoux merged 2 commits intoworkingfrom
claude/fix-gpu-wheels-build-yptxM
Apr 1, 2026
Merged

Fix MLMG boundary coefficients and improve PFMG stability#237
jameslehoux merged 2 commits intoworkingfrom
claude/fix-gpu-wheels-build-yptxM

Conversation

@jameslehoux
Copy link
Copy Markdown

MLMG: The B-coefficients (face diffusivities) were computed via
harmonic mean of adjacent cell-centred values, but physical boundary
ghost cells had D=0 (default). This made boundary face B=0, preventing
Dirichlet BCs from being enforced. Fix: extrapolate D into boundary
ghost cells before computing face coefficients.

PFMG: Increase pre/post relaxation sweeps from 1 to 2 and set
relaxation type to weighted Jacobi (type 2) for better stability on
uniform/homogeneous problems where the default red-black Gauss-Seidel
can produce NaN residuals.

Benchmark: restore PFMG and MLMG to the solver list, add BiCGSTAB
and GMRES for broader coverage.

James Le Houx added 2 commits April 1, 2026 10:31
PFMG (geometric multigrid) produces NaN on the uniform block test
case and MLMG doesn't converge accurately. Replace with BiCGSTAB
and GMRES which are proper Krylov solvers supported by HYPRE.

https://claude.ai/code/session_01RKnn97qiD7sbCeABHH3eQk
MLMG: The B-coefficients (face diffusivities) were computed via
harmonic mean of adjacent cell-centred values, but physical boundary
ghost cells had D=0 (default). This made boundary face B=0, preventing
Dirichlet BCs from being enforced. Fix: extrapolate D into boundary
ghost cells before computing face coefficients.

PFMG: Increase pre/post relaxation sweeps from 1 to 2 and set
relaxation type to weighted Jacobi (type 2) for better stability on
uniform/homogeneous problems where the default red-black Gauss-Seidel
can produce NaN residuals.

Benchmark: restore PFMG and MLMG to the solver list, add BiCGSTAB
and GMRES for broader coverage.

https://claude.ai/code/session_01RKnn97qiD7sbCeABHH3eQk
@jameslehoux jameslehoux merged commit 8e98bb2 into working Apr 1, 2026
5 of 6 checks passed
@jameslehoux jameslehoux deleted the claude/fix-gpu-wheels-build-yptxM branch April 1, 2026 10:37
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 1, 2026

Performance Benchmark Results

Size Solver Wall Time (s) Tortuosity Expected Rel. Error Iters Status
64³ pcg 0.6180 0.984375 0.984375 0.00e+00 1 PASS
64³ flexgmres 0.3816 0.984375 0.984375 0.00e+00 N/A PASS
64³ bicgstab 0.3851 0.984375 0.984375 0.00e+00 N/A PASS
64³ gmres 0.3732 0.984375 0.984375 0.00e+00 N/A PASS
64³ pfmg N/A N/A 0.984375 N/A N/A FAIL
64³ mlmg 0.2653 1.000000 0.984375 1.59e-02 7 WARN
128³ pcg 7.7518 0.992188 0.992188 0.00e+00 1 PASS
128³ flexgmres 5.3755 0.992188 0.992188 0.00e+00 N/A PASS
128³ bicgstab 5.1408 0.992188 0.992188 0.00e+00 N/A PASS
128³ gmres 5.2195 0.992188 0.992188 0.00e+00 N/A PASS
128³ pfmg N/A N/A 0.992188 N/A N/A FAIL
128³ mlmg 4.1322 1.000000 0.992188 7.87e-03 7 WARN

Fastest solver: mlmg at 64³ (0.2653s)
Warning: Some solvers failed to converge.
Warning: Some results exceed expected error tolerance (>1e-4).

Benchmark: uniform block (analytical τ = (N-1)/N)

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 1, 2026

Code Coverage Report

------------------------------------------------------------------------------
                           GCC Code Coverage Report
Directory: .
------------------------------------------------------------------------------
File                                       Lines     Exec  Cover   Missing
------------------------------------------------------------------------------
src/io/CathodeWrite.cpp                       95       83    87%   40-41,97-100,115-116,182-185
src/io/CathodeWrite.H                          1        1   100%
src/io/DatReader.cpp                         135      105    77%   26-27,30,35,92-93,99-100,107-109,135-137,141,144-148,152-155,162,164,208-209,242,245
src/io/DatReader.H                             1        1   100%
src/io/HDF5Reader.cpp                        344       84    24%   40-41,43-44,46-49,52,54-56,58-59,62,64-66,68-74,92-93,126-128,144-145,154-157,174-180,182-187,204,213-215,217,219-228,230-233,236-238,240-251,253-258,266,266,266,266,266,266,266,270,270,270,270,270,270,270,274,276,278,280,282,288,290,297,297,297,297,297,297,297,301,301,301,301,301,301,301,305,305,305,305,305,305,305-306,306,306,306,306,306,306,309,309,309,309,309,309,309-310,310,310,310,310,310,310-311,311,311,311,311,311,311,313,313,313,313,313,313,313-314,314,314,314,314,314,314-315,315,315,315,315,315,315,319,319,319,319,319,319,319,324,324,324,324,324,324,324-325,325,325,325,325,325,325-326,326,326,326,326,326,326-327,327,327,327,327,327,327,332,332,332,332,332,332,332,337,337,337,337,337,337,337-338,338,338,338,338,338,338,343,343,343,343,343,343,343,350,350,350,350,350,350,350,357-358,432-435,437-440
src/io/HDF5Reader.H                            3        3   100%
src/io/ImageLoader.cpp                        61       42    68%   25,38,48,60-62,64-70,72,77,89-90,92,94
src/io/RawReader.cpp                         266      135    50%   49-50,89-90,111-112,115-117,120-121,140-142,155-157,166-168,174-177,185-186,192-196,200-204,209-212,219-224,231-237,271,273-274,276,283-284,301,312,314,318,325,327,331-334,338,346-347,353-355,361-363,365-366,369,372,374,377-380,382-384,386,388-389,391,393-394,396,398-399,401,403-404,406,410-411,413,417-418,420,425,465,471-472,521-524,538,540-542,544,546-548,558,562-564,566,588
src/io/RawReader.H                             1        1   100%
src/io/TiffReader.cpp                        384      130    33%   59-65,67-69,71-73,75-77,79-80,82-84,86-88,90-92,94-96,98-99,101-103,106-108,111-112,114-117,119,122,124-127,143-144,148-150,152-158,160,186,210,217,226,228-231,240,242-245,248,255,288-293,306,309-317,319-320,323-327,331-335,338-342,344-348,351-357,359-363,367,369,375-377,379-393,396,398-402,404-409,413-418,420-425,428-429,432-434,555-575,577-578,581-588,590,593-609,612-614,670,673-674,677-683,685,689-700,702-703
src/io/TiffReader.H                            5        5   100%
src/props/BoundaryCondition.H                131       74    56%   63,68,70,216,224-229,233-236,238-244,247-249,252-253,255,258-261,264-265,271-272,274-279,285-287,290-296,299,303,365-366,371,373
src/props/ConnectedComponents.cpp             69       67    97%   94-95
src/props/ConnectedComponents.H                4        4   100%
src/props/DeffTensor.cpp                      62       59    95%   122,128-129
src/props/Diffusion.cpp                      510      378    74%   93-94,97-98,103-104,106-116,118,123-132,134-141,144-150,153-157,159-163,165,168-173,175-177,179,182-184,186-187,190-191,193,195-198,200,202-203,288-289,297-298,300,349,359-360,368-371,373-375,404-413,415,453,461,465-467,526-527,533,535,539,547,581,610,638,646,735-736,739-740,757-760,771-772,774,824
src/props/EffDiffFillMtx.H                   120      106    88%   58,216-217,221-225,229,231-235
src/props/EffectiveDiffusivityHypre.cpp      389      347    89%   189-191,193-197,305,367-370,479,612-615,617-619,621-624,633-636,643,672,684-687,689-691,693,705,716,718
src/props/EffectiveDiffusivityHypre.H          7        7   100%
src/props/FloodFill.cpp                       84       81    96%   94-95,203
src/props/HypreStructSolver.cpp              344      210    61%   87-88,121,133-134,145,299,309,311,314,346,356,358,361,367-370,372-376,378-379,381-385,388-389,391-392,394,397-398,401-402,404-407,409-413,415-416,418-422,425-426,428-429,431,434-435,438-439,441-443,445-451,453-457,460-461,463-464,466,469-470,473,475-477,479-486,488-492,495-496,498-499,501,504-505,508,510-512,514-517,519-523,526-527,529-530,532,535-536,539,542-543,556
src/props/HypreStructSolver.H                  6        6   100%
src/props/MacroGeometry.H                     17       17   100%
src/props/ParticleSizeDistribution.cpp        11       11   100%
src/props/ParticleSizeDistribution.H           6        6   100%
src/props/PercolationCheck.cpp                53       46    86%   32-33,49-51,68,73
src/props/PercolationCheck.H                   4        4   100%
src/props/PhysicsConfig.H                     90       89    98%   150
src/props/ResultsJSON.H                      225      222    98%   242,395,416
src/props/REVStudy.cpp                       151      128    84%   72,83-91,159,170-173,175,183-186,188-190
src/props/SolverConfig.H                      32       20    62%   30,32,37-44,75-76
src/props/SpecificSurfaceArea.cpp             56       55    98%   59
src/props/SpecificSurfaceArea.H                6        6   100%
src/props/ThroughThicknessProfile.cpp         38       38   100%
src/props/ThroughThicknessProfile.H            5        5   100%
src/props/Tortuosity.H                         2        2   100%
src/props/TortuosityDirect.cpp               219      191    87%   81-83,86,100-106,113-114,125,134,140,202-209,226,394,424,433
src/props/TortuosityDirect.H                   5        5   100%
src/props/TortuosityHypre.cpp                784      563    71%   148-149,154-155,239-242,245-247,310,334-336,339-340,342,352-354,357-359,389-392,572,596,600,621,637-638,640-642,644-653,655,658-662,666-668,671-678,680-684,688-690,692-694,696-705,707-711,713-724,726-729,731,741,747-750,752-754,763-766,768-770,786,789-790,813-818,829-832,834,871,876-879,882-884,888-891,893,895-898,900,905-907,909,958,967,972,975-980,996-999,1013-1017,1022-1027,1037-1041,1046-1051,1056-1060,1063-1066,1073-1076,1087,1096,1098,1102,1104,1126,1157-1158,1244-1246,1372-1375
src/props/TortuosityHypre.H                   15       15   100%
src/props/TortuosityHypreFill.H              127       98    77%   85,203,205-212,237-239,241-245,247-248,250,252,255-256,258-262
src/props/TortuosityKernels.H                 97       53    54%   52,56-60,62-65,69-74,76-80,84-85,90,129,143,157,243,245-248,250-253,257-260,262-265
src/props/TortuosityMLMG.cpp                 110      102    92%   196,217-219,221-222,229,242
src/props/TortuosityMLMG.H                     1        1   100%
src/props/TortuositySolverBase.cpp           301      237    78%   70-72,74-75,94-101,104,106,142-145,200,203,205,255,280,298,327,391,394-396,398,406-409,411-417,422,427-429,435-436,438-440,454,460,464-465,467,478,492,496-498,500,502,506
src/props/TortuositySolverBase.H              13       13   100%
src/props/VolumeFraction.cpp                  25       25   100%
src/props/VolumeFraction.H                     4        4   100%
------------------------------------------------------------------------------
TOTAL                                       5419     3885    71%
------------------------------------------------------------------------------


Generated by CI — coverage data from gcovr

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 1, 2026

Codecov Report

❌ Patch coverage is 82.35294% with 3 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/props/HypreStructSolver.cpp 0.00% 3 Missing ⚠️

📢 Thoughts on this report? Let us know!

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant