{"id": "line_smoother", "title": "Line-implicit smoothing on a wall-resolved mesh", "description": "The turbulent flat plate of the preset flat_plate_sa (Spalart-Allmaras, first cell 5e-5 high) solved with element-block Jacobi and with line Jacobi as the smoother, each on the p-multigrid levels 2-1-0 and on one level, and once more with line Jacobi whose blocks are assembled every second nonlinear step only. Line Jacobi inverts the block-tridiagonal system of every line of strongly coupled elements; the lines follow the thin direction of the cells and are found from the mesh. At the converged flow one forward and one transposed system with the same right-hand side are solved to a relative tolerance of 1e-10. The checks require that the answer does not depend on the preconditioner (drag coefficient, adjoint derivatives), that line Jacobi needs fewer than half the Krylov iterations of block Jacobi on three levels, and that it reaches the tolerance on one level. What block Jacobi does on one level is reported without a threshold, and so are all wall times.", "passed": true, "checks": [{"name": "flow solves converged with block Jacobi on three levels, with line Jacobi on three levels and on one, and with line Jacobi whose blocks are assembled every second step", "value": true, "expected": "true", "passed": true}, {"name": "lines found on the wall-resolved mesh (elements in lines)", "value": 131, "expected": "> 0", "passed": true}, {"name": "drag coefficient does not depend on the preconditioner (largest relative difference)", "value": 2.0626595211724445e-09, "expected": "< 1e-6", "passed": true}, {"name": "forward solve to 1e-10, three levels, both smoothers reaching the tolerance: Krylov iterations, line Jacobi / block Jacobi", "value": 0.2773109243697479, "expected": "< 0.5", "passed": true}, {"name": "transposed (adjoint) solve to 1e-10, three levels, both smoothers reaching the tolerance: Krylov iterations, line Jacobi / block Jacobi", "value": 0.2834008097165992, "expected": "< 0.5", "passed": true}, {"name": "one level, line Jacobi: forward and transposed solves reach the tolerance", "value": true, "expected": "true", "passed": true}, {"name": "adjoint derivatives of the drag (Mach, Reynolds, free-stream turbulence) from transposed solves that reached 1e-10: largest relative difference between the two smoothers", "value": 3.157214431275262e-09, "expected": "< 1e-6", "passed": true}], "charts": [{"id": "krylov_history", "type": "history", "title": "Flow solve: residual against accumulated Krylov iterations", "xlabel": "Krylov iterations (accumulated over the Newton steps)", "ylabel": "|Rw|", "xscale": "linear", "yscale": "log", "series": [{"name": "block Jacobi, levels 2-1-0", "x": [0, 2, 3, 4, 6, 8, 10, 13, 18, 24, 29, 36, 44, 53, 65, 82, 99, 116, 136, 156, 176, 196, 215, 234, 253, 271, 290, 308, 327, 347, 368, 396, 439, 485, 540], "y": [0.12462924237068283, 0.7797356913705222, 0.4250460661025202, 0.060872743291681485, 0.0723028065020046, 0.04890385703834413, 0.02609230269938372, 0.012506350733828426, 0.006226283675811973, 0.0043714512255937504, 0.0033617897651481593, 0.0029906008930942842, 0.0030507471020460976, 0.002317637410133783, 0.0019499444939035143, 0.0015795154075113327, 0.0011961723702585446, 0.0011027938664741584, 0.0010320276152320721, 0.001167860822448059, 0.0013457976623391327, 0.0015674352040690794, 0.0022550101040476156, 0.001988302836772138, 0.0020834576402126073, 0.0017171190726821104, 0.001967502411591602, 0.0013068227028804394, 0.0006440798539309166, 0.00023862297044761159, 3.750746589703825e-05, 1.5332959104885245e-06, 2.6696400167530016e-08, 3.2410522361391217e-10, 2.87531348478926e-12]}, {"name": "line Jacobi, levels 2-1-0", "x": [0, 2, 3, 4, 6, 8, 10, 12, 15, 18, 20, 22, 25, 28, 33, 41, 50, 60, 71, 82, 93, 104, 115, 126, 137, 147, 157, 167, 177, 188, 200, 212, 227, 247, 267], "y": [0.12462924237068283, 0.7797351801682179, 0.42487296616791437, 0.0608065448687041, 0.07226993523517347, 0.04887427151665302, 0.02606621613542726, 0.012483537804729888, 0.00622117908480146, 0.0043735292444862855, 0.0033628885003858535, 0.0029881994544827973, 0.0030521817332404694, 0.002316996770952061, 0.0019571349391990273, 0.0015801111261932784, 0.0011980829027745075, 0.0011083093815094308, 0.0010344422777879701, 0.0011738874645178432, 0.0013466979147972815, 0.0015673387561995972, 0.0022519124884513592, 0.0019862979712376772, 0.00207889329707303, 0.001715643788152429, 0.001977537609654146, 0.0013129180322055964, 0.0006437169482005764, 0.00023865794119666737, 3.700430218395618e-05, 1.4891969004405525e-06, 2.478060434511089e-08, 2.6186631943657957e-10, 1.9058270557643483e-12]}, {"name": "block Jacobi, one level", "x": [0, 2, 4, 7, 16, 26, 41, 64, 99, 139, 176, 220, 275, 333, 402, 498, 618, 738, 858, 978, 1098, 1218, 1338, 1458, 1578, 1698, 1818, 1938, 2058, 2178, 2298, 2418, 2538, 2658, 2778, 2898, 3018, 3138, 3258, 3378, 3498], "y": [0.12462924237068283, 0.780012035156885, 0.42479117663889526, 0.060713373375014625, 0.07243539155765866, 0.048840533787068145, 0.026124522201033572, 0.012515071338889808, 0.006238363075264876, 0.004370804622264555, 0.0033587600492467856, 0.0029886494756159424, 0.0030484415180206783, 0.002325123861031693, 0.0022167944662614134, 0.0015586042315818586, 0.0012438127943549154, 0.0011009314923473576, 0.0010502897306534703, 0.0011813423106284554, 0.0013445672778747706, 0.0015930352134653262, 0.0022862432978124187, 0.0020249950990435294, 0.0021410737338222424, 0.0017534818638943943, 0.0020165726946480304, 0.001335572877907055, 0.0006422970511904078, 0.00022450527549800574, 3.024903283467647e-05, 3.1724460225731637e-06, 7.833245076374263e-07, 2.8510294272488085e-07, 9.978781924975952e-08, 3.311869604374781e-08, 9.301470174960074e-09, 2.4657377583412495e-09, 6.718545778367431e-10, 1.7882151985953582e-10, 4.246225584715953e-11]}, {"name": "line Jacobi, one level", "x": [0, 1, 2, 3, 7, 12, 18, 28, 45, 64, 81, 97, 119, 143, 173, 223, 281, 350, 426, 505, 586, 669, 751, 836, 921, 1004, 1089, 1175, 1265, 1361, 1460, 1563, 1681, 1801, 1914], "y": [0.12462924237068283, 0.779733520080021, 0.42359799408427834, 0.06012001411881293, 0.07222774192349739, 0.04878144735596036, 0.025991962730935653, 0.012441727096323154, 0.006209973732286466, 0.004368096851758592, 0.003359820189196307, 0.0029897831354668536, 0.003053844155233801, 0.0023057195005385, 0.0018293678400660258, 0.0014870804159223547, 0.0014485665484083384, 0.0012345040725958102, 0.0010812577634591908, 0.001130555406048256, 0.0012535534063474081, 0.001499914199376371, 0.002206268500950451, 0.0020781093699183766, 0.002063068928438148, 0.001661178467289518, 0.0018378300789691742, 0.00122033094301583, 0.0006088942830976326, 0.0002252819133055175, 3.560012276362401e-05, 1.474609867435087e-06, 2.461034848828105e-08, 6.083615646265751e-10, 5.956551797108174e-12]}, {"name": "line Jacobi, levels 2-1-0, blocks every 2nd step", "x": [0, 2, 4, 5, 8, 10, 12, 14, 17, 20, 22, 24, 27, 30, 35, 43, 53, 63, 74, 85, 96, 107, 118, 129, 139, 149, 159, 169, 179, 190, 202, 214, 228, 248, 268], "y": [0.12462924237068283, 0.7797351801682179, 0.42342988870416676, 0.06041235333827201, 0.07235228096873576, 0.04877291911543683, 0.025990816030230266, 0.012429839078628751, 0.006197792505955789, 0.004362928528147208, 0.0033573062144709545, 0.00298214340605914, 0.003055579684196558, 0.002300668870753608, 0.0018161982332709613, 0.0014871375890253534, 0.0013429727443237467, 0.0011802200836022508, 0.001059661707295898, 0.0011207156532447192, 0.0012587356485838036, 0.0015089912346188904, 0.0022088212077530913, 0.002087929459126255, 0.002044489288293548, 0.0016475099100661038, 0.0018193708839065528, 0.0012089566635289607, 0.0006056999959808484, 0.00022356005312623495, 3.535263513264751e-05, 1.4646357114188902e-06, 2.5668571202038562e-08, 2.6692422637293153e-10, 2.0002448842493365e-12]}]}], "tables": [{"id": "linear", "title": "Linear solves at the converged flow (tolerance 1e-10)", "columns": ["preconditioner", "system", "Krylov iterations", "residual reduction", "tolerance reached", "wall time of the Krylov solve, compiled, preconditioner assembled before [s]"], "rows": [["block Jacobi, levels 2-1-0", "forward", 238, 8.980394901119612e-11, true, 6.184388160705566], ["block Jacobi, levels 2-1-0", "transposed (adjoint)", 247, 9.409654914707107e-11, true, 10.986230850219727], ["line Jacobi, levels 2-1-0", "forward", 66, 9.55949339643713e-11, true, 4.987179279327393], ["line Jacobi, levels 2-1-0", "transposed (adjoint)", 70, 9.482709238819494e-11, true, 7.341694116592407], ["block Jacobi, one level", "forward", 720, 0.00011247792261645105, false, 4.006680965423584], ["block Jacobi, one level", "transposed (adjoint)", 720, 0.0002870215336090914, false, 12.831947803497314], ["line Jacobi, one level", "forward", 441, 9.950521170024625e-11, true, 5.6220643520355225], ["line Jacobi, one level", "transposed (adjoint)", 465, 8.787026893046815e-11, true, 5.468218088150024]]}, {"id": "assembly", "title": "One assembly of the preconditioner at the converged flow", "columns": ["preconditioner", "wall time, compiled, fastest of five [s]"], "rows": [["block Jacobi, levels 2-1-0", 0.1873002052307129], ["line Jacobi, levels 2-1-0", 4.0407726764678955], ["block Jacobi, one level", 3.004859447479248], ["line Jacobi, one level", 4.08774471282959]]}, {"id": "flow", "title": "Flow solve from the free stream", "columns": ["preconditioner", "nonlinear steps", "Krylov iterations", "converged", "drag coefficient", "wall time, first solve [s]", "wall time, repeated solve (compiled) [s]", "repeated solve converged"], "rows": [["block Jacobi, levels 2-1-0", 34, 540, true, 0.005753647480878753, 86.60057425498962, 33.142175912857056, true], ["line Jacobi, levels 2-1-0", 34, 267, true, 0.005753647479387662, 159.25749731063843, 233.6183660030365, true], ["block Jacobi, one level", 40, 3498, true, 0.005753647491255478, 136.8502700328827, 113.28317642211914, true], ["line Jacobi, one level", 34, 1914, true, 0.005753647480382046, 245.51880884170532, 392.49213576316833, true], ["line Jacobi, levels 2-1-0, blocks every 2nd step", 34, 268, true, 0.005753647479397704, 189.42434740066528, 147.93995904922485, true]]}, {"id": "derivatives", "title": "Adjoint derivatives of the drag coefficient, levels 2-1-0", "columns": ["input", "block Jacobi", "line Jacobi", "relative difference"], "rows": [["mach", -0.04987358405407849, -0.04987358421154009, 3.157214431275262e-09], ["re", -3.065146894917246e-10, -3.0651468943492585e-10, 1.8530521472052774e-10], ["chi_inf", 3.6050184512478185e-06, 3.605018457147233e-06, 1.6364450632640427e-09]]}, {"id": "lines", "title": "Lines of the mesh", "columns": ["lines", "elements in lines", "elements", "longest line", "colours", "stored line slots"], "rows": [[18, 131, 150, 12, 3, 152]]}], "provenance": {"version": "0.4.0", "commit": "39979fcf902ad6116eb550b881b4278d4599c8e2", "dirty": false, "describe": "39979fcf90", "device": {"platform": "cpu", "device": "cpu:0", "device_kind": "cpu", "jax": "0.11.2", "x64": true}, "timestamp": "2026-11-12T10:58:43-0500"}, "wall_time": 2159.53, "notes": "The mesh has 18 lines holding 131 of its 150 elements (the longest 12 elements, 3 colours). On three levels the transposed solve took 70 Krylov iterations with line Jacobi against 247 with block Jacobi (ratio 0.28; wall time of the compiled solve, ratio 0.67); the forward solve 66 against 238. One assembly of the preconditioner on three levels took 4.04 s with line Jacobi against 0.19 s with block Jacobi (the coupling blocks of the line elements are assembled as well, one batch of derivatives per colour). With one level and a tolerance of 1e-10 on the transposed system, block Jacobi reduced the residual by 2.9e-04 in 720 iterations and stopped at the iteration limit; line Jacobi reached the tolerance in 465 iterations. A flow solve assembles the preconditioner at every nonlinear step; the last row of the flow table assembles it every second step only (the repeated solves took 33.1 s (block Jacobi, levels 2-1-0), 233.6 s (line Jacobi, levels 2-1-0), 113.3 s (block Jacobi, one level), 392.5 s (line Jacobi, one level), 147.9 s (line Jacobi, levels 2-1-0, blocks every 2nd step)). Wall times: the column of the linear table is the Krylov solve alone, with a preconditioner that is already assembled; one assembly is timed separately (table 'assembly'). The first flow solve of a configuration includes the one-off compilation. The suite runs its studies in parallel lanes, so other studies were running while these times were taken; they are measurements of small cases on a machine that was not idle, reported without a threshold. Machine load while the study ran: The timings were taken on a busy machine (other processes used 45 % of the capacity of the 8 CPUs while the study ran).", "level": "quick"}