{"id": "example_polar", "title": "Example: lift polar with adjoint slopes", "description": "A warm-started sweep of the angle of attack for a NACA 2412 at Mach 0.4 in one solver process. At every point one adjoint solve gives the lift-curve slope, drawn as a tangent; the checks compare the slopes with a small-step central difference and with differences of neighbouring points.", "passed": true, "checks": [{"name": "all points converged", "value": true, "expected": "true", "passed": true}, {"name": "positive lift at zero incidence (camber)", "value": 0.28205254612792363, "expected": "> 0.15", "passed": true}, {"name": "adjoint slope vs small-step central difference at 4 deg (rel.)", "value": 9.857282204197082e-07, "expected": "< 1e-5", "passed": true}, {"name": "adjoint slope vs two-degree secants of the polar (worst, rel.)", "value": 0.012703133089844153, "expected": "< 0.03", "passed": true}, {"name": "warm starts: Newton steps after the first point (max)", "value": 6, "expected": "< 14", "passed": true}], "charts": [{"id": "cl_alpha", "type": "line", "title": "Lift polar and adjoint tangents", "xlabel": "\u03b1 [deg]", "ylabel": "cl", "xscale": "linear", "yscale": "linear", "series": [{"name": "cl", "x": [-2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0], "y": [0.01857115812463717, 0.14867134319008327, 0.28205254612792363, 0.4154403347615645, 0.5444524672937703, 0.6660283129641972, 0.773825002851762]}, {"name": "adjoint tangents", "x": [-2.35, -1.65, null, -1.35, -0.65, null, -0.35, 0.35, null, 0.65, 1.35, null, 1.65, 2.35, null, 2.65, 3.35, null, 3.65, 4.35, null], "y": [-0.02682685722740499, 0.06396917347667933, null, 0.10269732453021138, 0.19464536184995515, null, 0.23487310560067354, 0.3292319866551737, null, 0.36943468230110194, 0.46144598722202707, null, 0.5003465437783017, 0.5885583908092389, null, 0.6253716522697585, 0.7066849736586358, null, 0.7342917009577573, 0.8133583047457668, null]}]}, {"id": "newton_steps", "type": "bar", "title": "Nonlinear iterations per point", "xlabel": "\u03b1 [deg]", "ylabel": "Newton steps", "xscale": "category", "yscale": "linear", "series": [{"name": "steps", "x": ["-2.0", "-1.0", "0.0", "1.0", "2.0", "3.0", "4.0"], "y": [14, 6, 6, 6, 6, 6, 6]}], "note": "The first point starts from the free stream; the others are warm starts."}], "tables": [{"id": "polar", "title": "Polar", "columns": ["\u03b1 [deg]", "cl", "cd", "cm", "dcl/d\u03b1 [1/rad]", "dcl/d\u03b1 [1/deg]", "Newton steps", "converged"], "rows": [[-2.0, 0.01857115812463717, 0.0010094432900035555, -0.057234437358547156, 7.431756222691812, 0.12970861529154903, 14, true], [-1.0, 0.14867134319008327, 0.0008919887957252182, -0.058383726668060174, 7.52604924704672, 0.1313543390282054, 6, true], [0.0, 0.28205254612792363, 0.0009290440787728532, -0.060119348310168394, 7.72337949142829, 0.1347984015064288, 6, true], [1.0, 0.4154403347615645, 0.0010228663134825393, -0.06182840819855186, 7.531227770657587, 0.13144472131560728, 6, true], [2.0, 0.5444524672937703, 0.0011754622857523857, -0.06260115679352192, 7.220237911323327, 0.1260169243299104, 6, true], [3.0, 0.6660283129641972, 0.0014227569272825674, -0.06166395725867248, 6.655585905390734, 0.11616188769839614, 6, true], [4.0, 0.773825002851762, 0.0018047173158052612, -0.05751594383792587, 6.471689567837183, 0.11295229112572777, 6, true]]}], "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-12T11:58:34-0500"}, "wall_time": 686.1, "level": "quick"}